databasebrowseraction.java
来自「jetspeed源代码」· Java 代码 · 共 795 行 · 第 1/2 页
JAVA
795 行
/*
* Copyright 2000-2001,2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jetspeed.modules.actions.portlets.browser;
// velocity
import org.apache.velocity.context.Context;
// Java Stuff
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Types;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import java.util.Vector;
import java.util.StringTokenizer;
// turbine util
import org.apache.turbine.util.RunData;
import org.apache.turbine.util.StringUtils;
import org.apache.torque.Torque;
// jetspeed services
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.resources.JetspeedResources;
// jetspeed velocity
import org.apache.jetspeed.modules.actions.portlets.VelocityPortletAction;
import org.apache.jetspeed.modules.actions.portlets.browser.ActionParameter;
import org.apache.jetspeed.modules.actions.portlets.browser.BrowserQuery;
import org.apache.jetspeed.portal.portlets.VelocityPortlet;
import org.apache.jetspeed.portal.portlets.browser.DatabaseBrowserIterator;
import org.apache.jetspeed.portal.portlets.browser.BrowserIterator;
import org.apache.jetspeed.util.PortletSessionState;
import org.apache.jetspeed.util.PortletConfigState;
/**
* This action sets up the template context for retrieving paged data from the resultSet
* according to the quey speciified by the user.
*
* @author <a href="mailto:taylor@apache.org">David Sean Taylor</a>
* @version $Id: DatabaseBrowserAction.java,v 1.34 2004/02/23 02:51:19 jford Exp $
*/
public class DatabaseBrowserAction extends VelocityPortletAction implements BrowserQuery
{
protected static final String SQL = "sql";
protected static final String POOLNAME = "poolname";
protected static final String START = "start";
protected static final String CUSTOMIZE_TEMPLATE = "customizeTemplate";
protected static final String WINDOW_SIZE = "windowSize";
protected static final String USER_OBJECT_NAMES = "user-object-names";
protected static final String USER_OBJECT_TYPES = "user-object-types";
protected static final String USER_OBJECTS = "user-objects";
protected static final String SQL_PARAM_PREFIX = "sqlparam";
protected static final String LINKS_READ = "linksRead";
protected static final String ROW_LINK = "rowLinks";
protected static final String TABLE_LINK = "tableLinks";
protected static final String ROW_LINK_IDS = "row-link-ids";
protected static final String ROW_LINK_TYPES = "row-link-types";
protected static final String ROW_LINK_TARGETS = "row-link-targets";
protected static final String TABLE_LINK_IDS = "table-link-ids";
protected static final String TABLE_LINK_TYPES = "table-link-types";
protected static final String TABLE_LINK_TARGETS = "table-link-targets";
protected static final String BROWSER_TABLE_SIZE = "tableSize";
protected static final String DATABASE_BROWSER_ACTION_KEY = "database_browser_action_key";
protected static final String BROWSER_ITERATOR = "table";
protected static final String BROWSER_TITLE_ITERATOR = "title";
protected static final String NEXT = "next";
protected static final String PREVIOUS = "prev";
protected static final String VELOCITY_NULL_ENTRY = "-";
// portlet entry Id
protected static final String PEID = "js_peid";
protected static final String SORT_COLUMN_NAME = "js_dbcolumn";
protected List sqlParameters = new Vector();
/**
* Static initialization of the logger for this class
*/
private static final JetspeedLogger logger = JetspeedLogFactoryService.getLogger(DatabaseBrowserAction.class.getName());
/**
* Build the maximized state content for this portlet. (Same as normal state).
*
* @param portlet The velocity-based portlet that is being built.
* @param context The velocity context for this request.
* @param rundata The turbine rundata context for this request.
*/
protected void buildMaximizedContext( VelocityPortlet portlet,
Context context,
RunData rundata )
{
buildNormalContext( portlet, context, rundata);
}
/**
* Subclasses should override this method if they wish to
* provide their own customization behavior.
* Default is to use Portal base customizer action
*/
protected void buildConfigureContext( VelocityPortlet portlet,
Context context,
RunData rundata )
{
try
{
super.buildConfigureContext( portlet, context, rundata);
}
catch (Exception ex)
{
logger.error("Exception", ex);
}
context.put(SQL, getQueryString(portlet, rundata, context));
context.put(WINDOW_SIZE, getParameterUsingFallback(portlet, rundata, WINDOW_SIZE, null));
setTemplate(rundata, getParameterUsingFallback(portlet, rundata, CUSTOMIZE_TEMPLATE, null));
}
/**
* Build the normal state content for this portlet.
*
* @param portlet The velocity-based portlet that is being built.
* @param context The velocity context for this request.
* @param rundata The turbine rundata context for this request.
*/
protected void buildNormalContext( VelocityPortlet portlet,
Context context,
RunData rundata )
{
int resultSetSize, next, prev, windowSize;
BrowserIterator iterator = getDatabaseBrowserIterator(portlet, rundata);
String sortColName = getRequestParameter(portlet, rundata, SORT_COLUMN_NAME);
int start = getStartVariable(portlet, rundata, START, sortColName, iterator);
windowSize = Integer.parseInt((String)getParameterUsingFallback(portlet, rundata, WINDOW_SIZE, "10"));
next = start + windowSize;
prev = start - windowSize;
try
{
if(iterator == null || PortletSessionState.getPortletConfigChanged(portlet, rundata))
{
String sql = getQueryString(portlet, rundata, context);
//System.out.println("buildNormalContext SQL: "+sql);
if(sql != null )
{
readUserParameters(portlet,rundata,context);
getRows(portlet, rundata, sql, windowSize);
iterator = getDatabaseBrowserIterator(portlet, rundata);
}
else
{
logger.info("The sql query is null, hence not generating the result set.");
}
}
else
{
if(sortColName != null)
{
iterator.sort(sortColName);
}
iterator.setTop(start);
}
readLinkParameters(portlet, rundata, context);
if(iterator != null)
{
resultSetSize = iterator.getResultSetSize();
if(next < resultSetSize)
{
context.put(NEXT, String.valueOf(next));
}
if(prev <= resultSetSize && prev >=0 )
{
context.put(PREVIOUS, String.valueOf(prev));
}
context.put(BROWSER_ITERATOR, iterator);
context.put(BROWSER_TITLE_ITERATOR, iterator.getResultSetTitleList());
context.put(BROWSER_TABLE_SIZE, new Integer(resultSetSize));
/*
System.out.println("buildNormalContext Sort column name= "+sortColName);
System.out.println("buildNormalContext Iterator: "+iterator);
System.out.println("buildNormalContext Titles= "+iterator.getResultSetTitleList());
System.out.println("buildNormalContext windowSize="+windowSize+" prev="+prev+
" next="+next+" start="+start+" resultSetSize="+resultSetSize);
*/
}
}
catch (Exception e)
{
// log the error msg
logger.error("Exception", e);
rundata.setMessage("Error in Jetspeed Database Browser: " + e.toString());
rundata.setStackTrace(StringUtils.stackTrace(e), e);
rundata.setScreenTemplate(JetspeedResources.getString("template.error","Error"));
}
}
/**
* This method is called when the user configures any of the parameters.
* @param data The turbine rundata context for this request.
* @param context The velocity context for this request.
*/
public void doUpdate(RunData rundata, Context context)
{
VelocityPortlet portlet = (VelocityPortlet)context.get("portlet");
String sql = getRequestParameter(portlet, rundata, SQL);
String pageSize = getRequestParameter(portlet, rundata, WINDOW_SIZE);
if (sql!=null)
{
setParameterToPSML( portlet, rundata, SQL, sql);
context.put(SQL, sql);
clearDatabaseBrowserIterator(portlet, rundata);
}
if(pageSize!=null)
{
setParameterToPSML( portlet, rundata, WINDOW_SIZE, pageSize);
context.put(WINDOW_SIZE, pageSize);
}
/*
System.out.println("doUpdate SQL: "+sql+", Window Size: "+pageSize);
*/
buildNormalContext( portlet, context, rundata);
}
/**
* This method is called when the user hits refresh to refetch the result set.
* @param data The turbine rundata context for this request.
* @param context The velocity context for this request.
*/
public void doRefresh(RunData rundata, Context context)
{
VelocityPortlet portlet = (VelocityPortlet)context.get("portlet");
if(isMyRequest(portlet,rundata))
{
clearDatabaseBrowserIterator(portlet, rundata);
}
buildNormalContext(portlet, context, rundata);
}
/* (non-Javadoc)
* @see org.apache.jetspeed.modules.actions.portlets.browser.BrowserQuery#filter(java.util.List, RunData)
*/
public boolean filter(List row, RunData rundata)
{
return false;
}
/**
* Execute the sql statement as specified by the user or the default, and store the
* resultSet in a vector.
*
* @param sql The sql statement to be executed.
* @param data The turbine rundata context for this request.
*/
protected void getRows(VelocityPortlet portlet, RunData rundata, String sql,
int windowSize) throws Exception
{
List resultSetList = new ArrayList();
List resultSetTitleList = new ArrayList();
List resultSetTypeList = new ArrayList();
Connection con = null;
PreparedStatement selectStmt = null;
ResultSet rs = null;
try
{
String poolname = getParameterUsingFallback(portlet,rundata,POOLNAME,null);
if (poolname==null || poolname.length()==0)
{
con = Torque.getConnection();
}
else
{
con = Torque.getConnection(poolname);
}
selectStmt = con.prepareStatement(sql);
readSqlParameters(portlet, rundata);
Iterator it = sqlParameters.iterator();
int ix = 0;
while (it.hasNext())
{
ix++;
Object object = it.next();
selectStmt.setObject(ix, object);
}
rs = selectStmt.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnNum = rsmd.getColumnCount();
/*
get the user object types to be displayed and add them to the
title list as well as the result set list
*/
List userObjList = (List)getParameterFromTemp(portlet, rundata, USER_OBJECTS);
int userObjListSize = 0;
if (userObjList != null)
{
userObjListSize = userObjList.size();
}
//System.out.println("User List Size = "+ userObjListSize);
/*
the array columnDisplayed maintains a boolean value for each
column index. Only the columns that are set to true are added to
the resultSetList, resultSetTitleList and resultSetTypeList.
*/
boolean[] columnDisplayed = new boolean [columnNum + userObjListSize];
/*
this for loop constructs the columnDisplayed array as well as adds
to the resultSetTitleList and resultSetTypeList
*/
for(int i = 1; i <= columnNum; i++)
{
int type = rsmd.getColumnType(i);
if( !((type == Types.BLOB) || (type == Types.CLOB) ||
(type == Types.BINARY) || (type == Types.LONGVARBINARY) ||
(type == Types.VARBINARY)) )
{
resultSetTitleList.add(rsmd.getColumnName(i));
resultSetTypeList.add(String.valueOf(type));
columnDisplayed[i-1] = true;
}
else
{
columnDisplayed[i-1] = false;
}
}
for (int i = columnNum; i < columnNum + userObjListSize; i++)
{
ActionParameter usrObj = (ActionParameter)userObjList.get(i - columnNum);
resultSetTitleList.add(usrObj.getName());
resultSetTypeList.add(usrObj.getType());
columnDisplayed[i] = true;
//System.out.println("User List Name = "+ usrObj.getName()+" Type = "+usrObj.getType());
}
/*
this while loop adds each row to the resultSetList
*/
int index = 0;
while(rs.next())
{
List row = new ArrayList(columnNum);
for(int i = 1; i <= columnNum; i++)
{
if( columnDisplayed[i-1] )
{
Object obj = rs.getObject(i);
if (obj == null)
{
obj = VELOCITY_NULL_ENTRY;
}
row.add(obj);
}
}
for (int i = columnNum; i < columnNum + userObjListSize; i++)
{
ActionParameter usrObj = (ActionParameter)userObjList.get(i - columnNum);
if( columnDisplayed[i] )
{
Class c = Class.forName(usrObj.getType());
row.add(c.newInstance());
populate(index, i, row);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?