You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by ha...@apache.org on 2002/08/11 19:47:55 UTC
cvs commit: xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular DatabaseQueryAction.java DatabaseAction.java DatabaseUpdateAction.java DatabaseSelectAction.java DatabaseDeleteAction.java DatabaseAddAction.java TestAction.java
haul 2002/08/11 10:47:55
Modified: src/scratchpad/src/org/apache/cocoon/acting/modular Tag:
cocoon_2_0_3_branch DatabaseAction.java
DatabaseUpdateAction.java DatabaseSelectAction.java
DatabaseDeleteAction.java DatabaseAddAction.java
TestAction.java
Added: src/scratchpad/src/org/apache/cocoon/acting/modular Tag:
cocoon_2_0_3_branch DatabaseQueryAction.java
Log:
<action dev="CH" type="update">
Sync modules and related components with HEAD.
</action>
Revision Changes Path
No revision
No revision
1.1.2.2 +320 -357 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseAction.java
Index: DatabaseAction.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseAction.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- DatabaseAction.java 28 Apr 2002 19:59:52 -0000 1.1.2.1
+++ DatabaseAction.java 11 Aug 2002 17:47:55 -0000 1.1.2.2
@@ -77,6 +77,7 @@
import org.apache.avalon.framework.activity.Disposable;
import org.apache.avalon.framework.component.Component;
import org.apache.avalon.framework.component.ComponentException;
+import org.apache.avalon.framework.component.ComponentManager;
import org.apache.avalon.framework.component.ComponentSelector;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
@@ -92,20 +93,19 @@
import org.apache.avalon.excalibur.component.DefaultRoleManager;
import org.apache.avalon.excalibur.datasource.DataSourceComponent;
+
import org.apache.cocoon.Constants;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.components.classloader.RepositoryClassLoader;
-import org.apache.cocoon.components.url.URLFactory;
-import org.apache.cocoon.environment.ObjectModelHelper;
-import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.Redirector;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.generation.ImageDirectoryGenerator;
import org.apache.cocoon.util.ClassUtils;
import org.apache.cocoon.util.HashMap;
+import org.apache.cocoon.util.JDBCTypeConversions;
import org.apache.cocoon.selection.Selector;
-import org.apache.cocoon.acting.AbstractDatabaseAction;
+import org.apache.cocoon.acting.AbstractComplementaryConfigurableAction;
import org.apache.cocoon.components.modules.database.AutoIncrementModule;
import org.apache.cocoon.components.modules.input.InputModule;
import org.apache.cocoon.components.modules.output.OutputModule;
@@ -117,8 +117,7 @@
* and writing parameters. In addition the descriptor format has
* changed to accomodate the new features.
*
- * <p>This action is heavily based upon the original DatabaseAddAction
- * and relies on the AbstractDatabaseAction.</p>
+ * <p>This action is heavily based upon the original DatabaseAddActions.</p>
*
* <p>Modes have to be configured in cocoon.xconf. Mode names from
* descriptor.xml file are looked up in the component service. Default
@@ -143,12 +142,11 @@
*
* @author <a href="mailto:haul@apache.org">Christian Haul</a>
* @version CVS $Id$
- * @see org.apache.cocoon.modules.input
- * @see org.apache.cocoon.modules.output
- * @see org.apache.cocoon.modules.database
+ * @see org.apache.cocoon.components.modules.input
+ * @see org.apache.cocoon.components.modules.output
+ * @see org.apache.cocoon.components.modules.database
*/
-public abstract class DatabaseAction extends AbstractDatabaseAction {
-
+public abstract class DatabaseAction extends AbstractComplementaryConfigurableAction implements Configurable, Disposable {
// ========================================================================
// constants
@@ -174,7 +172,8 @@
// instance vars
// ========================================================================
- protected HashMap defaultModeNames = new HashMap( 3 );
+ protected ComponentSelector dbselector;
+ protected Map defaultModeNames = new HashMap( 3 );
protected final HashMap cachedQueryData = new HashMap();
@@ -244,7 +243,7 @@
- // set up default modes
+ // set up default modes
// <input/>
// <output/>
// <autoincrement/>
@@ -261,20 +260,41 @@
}
// ========================================================================
+ // Avalon methods
+ // ========================================================================
+
+ /**
+ * Compose the Actions so that we can select our databases.
+ */
+ public void compose(ComponentManager manager) throws ComponentException {
+ this.dbselector = (ComponentSelector) manager.lookup(DataSourceComponent.ROLE + "Selector");
+
+ super.compose(manager);
+ }
+
+
+ /**
+ * dispose
+ */
+ public void dispose() {
+ this.manager.release(dbselector);
+ }
+
+
+ // ========================================================================
// protected utility methods
// ========================================================================
/**
- * override super's method since we prefer to get the datasource
- * from defaults first or from sitemap parameters rather than from
- * descriptor file.
+ * Get the Datasource we need.
*/
protected DataSourceComponent getDataSource( Configuration conf, Parameters parameters )
throws ComponentException {
String sourceName = parameters.getParameter( "connection", (String) settings.get( "connection" ) );
if ( sourceName == null ) {
- return getDataSource( conf );
+ Configuration dsn = conf.getChild("connection");
+ return (DataSourceComponent) this.dbselector.select(dsn.getValue(""));
} else {
if (getLogger().isDebugEnabled())
getLogger().debug("Using datasource: "+sourceName);
@@ -282,25 +302,31 @@
}
}
+ /**
+ * Return whether a type is a Large Object (BLOB/CLOB).
+ */
+ protected final boolean isLargeObject (String type) {
+ if ("ascii".equals(type)) return true;
+ if ("binary".equals(type)) return true;
+ if ("image".equals(type)) return true;
+
+ return false;
+ }
/**
- * Store a key/value pair in the request attributes. We prefix the key
+ * Store a key/value pair in the output attributes. We prefix the key
* with the name of this class to prevent potential name collisions.
- * This method overrides super class' method to allow an OutputModule
- * to take care of what to do with the values.
*/
- protected void setRequestAttribute(Request request, String key, Object value) {
+ protected void setOutputAttribute(Map objectModel, String outputMode, String key, Object value) {
ComponentSelector outputSelector = null;
OutputModule output = null;
- String outputMode = null;
try {
- outputSelector=(ComponentSelector) this.manager.lookup(OUTPUT_MODULE_SELECTOR);
- outputMode = (String) request.getAttribute(ATTRIBUTE_KEY);
+ outputSelector=(ComponentSelector) this.manager.lookup(OUTPUT_MODULE_SELECTOR);
if (outputMode != null && outputSelector != null && outputSelector.hasComponent(outputMode)){
output = (OutputModule) outputSelector.select(outputMode);
}
- output.setAttribute( null, request, key, value );
+ output.setAttribute( null, objectModel, key, value );
} catch (Exception e) {
if (getLogger().isWarnEnabled())
getLogger()
@@ -309,7 +335,7 @@
+ ":" + e.getMessage() );
} finally {
if (outputSelector != null) {
- if (output != null)
+ if (output != null)
outputSelector.release(output);
this.manager.release(outputSelector);
}
@@ -317,238 +343,6 @@
}
- /**
- * Retrieve a value from the request attributes.
- * This method overrides super class' method to allow an OutputModule
- * to take care of where to get the values.
- */
- // FIXME: OutputModule doesn't provide getAttribute anymore
- protected Object getRequestAttribute(Request request, String key) {
-
- if (getLogger().isErrorEnabled())
- getLogger()
- .error("getRequestAttribute not supported");
- return null;
- }
-
-
- // ========================================================================
- // main method
- // ========================================================================
-
-
- /**
- * Add a record to the database. This action assumes that
- * the file referenced by the "descriptor" parameter conforms
- * to the AbstractDatabaseAction specifications.
- */
- public Map act( Redirector redirector, SourceResolver resolver, Map objectModel,
- String source, Parameters param ) throws Exception {
-
- DataSourceComponent datasource = null;
- Connection conn = null;
- Map results = new HashMap();
- int rows = 0;
-
- // read global parameter settings
- boolean reloadable = Constants.DESCRIPTOR_RELOADABLE_DEFAULT;
- Request request = ObjectModelHelper.getRequest(objectModel);
-
- // call specific default modes apart from output mode are not supported
- // set request attribute
- String outputMode = param.getParameter("output", (String) defaultModeNames.get(MODE_OUTPUT));
- request.setAttribute(ATTRIBUTE_KEY, outputMode);
-
- if (this.settings.containsKey("reloadable"))
- reloadable = Boolean.getBoolean((String) this.settings.get("reloadable"));
-
- // read local parameter settings
- try {
- Configuration conf =
- this.getConfiguration(param.getParameter("descriptor", (String) this.settings.get("descriptor")),
- resolver,
- param.getParameterAsBoolean("reloadable",reloadable));
-
- // get database connection and try to turn off autocommit
- datasource = this.getDataSource(conf, param);
- conn = datasource.getConnection();
- if (conn.getAutoCommit() == true) {
- try {
- conn.setAutoCommit(false);
- } catch (Exception ex) {
- String tmp = param.getParameter("use-transactions",(String) this.settings.get("use-transactions",null));
- if (tmp != null && (tmp.equalsIgnoreCase("no") || tmp.equalsIgnoreCase("false") || tmp.equalsIgnoreCase("0"))) {
- if (getLogger().isErrorEnabled())
- getLogger().error("This DB connection does not support transactions. If you want to risk your data's integrity by continuing nonetheless set parameter \"use-transactions\" to \"no\".");
- throw ex;
- }
- }
- }
-
- // find tables to work with
- Configuration[] tables = conf.getChildren("table");
- String tablesetname = param.getParameter("table-set", (String) this.settings.get("table-set"));
- Map set_tables = null; // default to old behaviour
-
- HashMap modeTypes = null;
-
- if (tablesetname != null) {
- // new set based behaviour
- Configuration[] tablesets = conf.getChildren("table-set");
- String setname = null;
- boolean found = false;
-
- // find tables contained in tableset
- int j = 0;
- for (j=0; j<tablesets.length; j++) {
- setname = tablesets[j].getAttribute ("name", "");
- if (tablesetname.trim().equals (setname.trim ())) {
- found = true;
- break;
- }
- }
- if (!found) {
- throw new IOException(" given set " + tablesetname + " does not exists in a description file.");
- }
-
- Configuration[] set = tablesets[j].getChildren("table");
-
- // construct a Map that contains the names of the tables
- // contained in the requested tableset
- set_tables = new HashMap(set.length);
- for (int i=0; i<set.length; i++) {
- // look for alternative mode types
- modeTypes = new HashMap(2);
- modeTypes.put( MODE_AUTOINCR, set[i].getAttribute( "autoincr-mode", "autoincr" ) );
- modeTypes.put( MODE_OTHERS, set[i].getAttribute( "others-mode", "others" ) );
- set_tables.put(set[i].getAttribute("name",""), modeTypes);
- }
- } else {
- modeTypes = new HashMap(2);
- modeTypes.put( MODE_AUTOINCR, "autoincr" );
- modeTypes.put( MODE_OTHERS, "others" );
- };
-
- for (int i=0; i<tables.length; i++) {
- if (set_tables == null ||
- set_tables.containsKey( tables[i].getAttribute( "name" ) ) ||
- ( tables[i].getAttribute( "alias", null ) != null && set_tables.containsKey( tables[i].getAttribute( "alias" ) ) )
- ) {
- if (tablesetname != null) {
- if (tables[i].getAttribute("alias", null) != null && set_tables.containsKey(tables[i].getAttribute("alias"))){
- modeTypes = (HashMap) set_tables.get(tables[i].getAttribute("alias"));
- set_tables.remove(tables[i].getAttribute("alias"));
- } else {
- modeTypes = (HashMap) set_tables.get(tables[i].getAttribute("name"));
- set_tables.remove(tables[i].getAttribute("name"));
- }
- }
- rows += processTable( tables[i], conn, request, results, modeTypes );
- }
- }
-
- if (conn.getAutoCommit()==false)
- conn.commit();
-
- // obtain output mode module and rollback output
- ComponentSelector outputSelector = null;
- OutputModule output = null;
- try {
- outputSelector=(ComponentSelector) this.manager.lookup(OUTPUT_MODULE_SELECTOR);
- if (outputMode != null && outputSelector != null && outputSelector.hasComponent(outputMode)){
- output = (OutputModule) outputSelector.select(outputMode);
- }
- output.commit( null, request );
- } catch (Exception e) {
- if (getLogger().isWarnEnabled())
- getLogger()
- .warn( "Could not select output mode "
- + (String) outputMode
- + ":" + e.getMessage() );
- } finally {
- if (outputSelector != null) {
- if (output != null)
- outputSelector.release(output);
- this.manager.release(outputSelector);
- }
- }
-
- } catch (Exception e) {
- if ( conn != null ) {
- try {
- if (getLogger().isDebugEnabled())
- getLogger().debug( "Rolling back transaction. Caused by " + e.getMessage() );
- conn.rollback();
- results = null;
-
- // obtain output mode module and commit output
- ComponentSelector outputSelector = null;
- OutputModule output = null;
- try {
- outputSelector=(ComponentSelector) this.manager.lookup(OUTPUT_MODULE_SELECTOR);
- if (outputMode != null && outputSelector != null && outputSelector.hasComponent(outputMode)){
- output = (OutputModule) outputSelector.select(outputMode);
- }
- output.rollback( null, request, e);
- } catch (Exception e2) {
- if (getLogger().isWarnEnabled())
- getLogger()
- .warn( "Could not select output mode "
- + (String) outputMode
- + ":" + e2.getMessage() );
- } finally {
- if (outputSelector != null) {
- if (output != null)
- outputSelector.release(output);
- this.manager.release(outputSelector);
- }
- }
-
- } catch (SQLException se) {
- if (getLogger().isDebugEnabled())
- getLogger().debug("There was an error rolling back the transaction", se);
- }
- }
-
- //throw new ProcessingException("Could not add record :position = " + currentIndex, e);
-
- // don't throw an exception, an error has been signalled, that should suffice
-
- String throwException = (String) this.settings.get( "throw-exception",
- param.getParameter( "throw-exception", null ) );
- if ( throwException != null &&
- ( throwException.equalsIgnoreCase( "true" ) || throwException.equalsIgnoreCase( "yes" ) ) ) {
- throw new ProcessingException("Could not add record",e);
- }
- } finally {
- if (conn != null) {
- try {
- conn.close();
- } catch (SQLException sqe) {
- getLogger().warn("There was an error closing the datasource", sqe);
- }
- }
-
- if (datasource != null)
- this.dbselector.release(datasource);
- }
- if (results != null) {
- if (rows>0) {
- results.put("row-count",new Integer(rows));
- } else {
- results = null;
- }
- } else {
- if (rows>0) {
- results = new HashMap(1);
- results.put("row-count",new Integer(rows));
- }
- }
-
- return (results == null? results : Collections.unmodifiableMap(results));
- }
-
-
/**
* Inserts a row or a set of rows into the given table based on the
@@ -556,10 +350,10 @@
*
* @param table the table's configuration
* @param conn the database connection
- * @param request the request
+ * @param objectModel the objectModel
*/
- protected int processTable( Configuration table, Connection conn, Request request,
- Map results, HashMap modeTypes )
+ protected int processTable( Configuration table, Connection conn, Map objectModel,
+ Map results, Map modeTypes )
throws SQLException, ConfigurationException, Exception {
PreparedStatement statement = null;
@@ -567,8 +361,9 @@
try {
LookUpKey luk = new LookUpKey(table, modeTypes);
CacheHelper queryData = null;
-
- getLogger().debug("modeTypes : "+ modeTypes);
+
+ if (getLogger().isDebugEnabled())
+ getLogger().debug("modeTypes : "+ modeTypes);
// get cached data
// synchronize complete block since we don't want 100s of threads
@@ -586,7 +381,7 @@
getLogger().debug("query: "+queryData.queryString);
statement = conn.prepareStatement(queryData.queryString);
- Object[][] columnValues = this.getColumnValues( table, queryData, request );
+ Object[][] columnValues = this.getColumnValues( table, queryData, objectModel );
int setLength = 1;
if ( queryData.isSet ) {
@@ -600,7 +395,7 @@
for ( int rowIndex = 0; rowIndex < setLength; rowIndex++ ) {
if (getLogger().isDebugEnabled())
getLogger().debug( "====> row no. " + rowIndex );
- rows += processRow( request, conn, statement, table, queryData, columnValues, rowIndex, results );
+ rows += processRow( objectModel, conn, statement, (String) modeTypes.get(MODE_OUTPUT), table, queryData, columnValues, rowIndex, results );
}
} finally {
@@ -647,8 +442,7 @@
/**
* compose name for output a long the lines of "table.column"
*/
- protected String getOutputName ( Configuration tableConf, Configuration columnConf )
- throws ConfigurationException {
+ protected String getOutputName ( Configuration tableConf, Configuration columnConf ) {
return getOutputName( tableConf, columnConf, -1 );
}
@@ -658,11 +452,10 @@
* compose name for output a long the lines of "table.column[row]" or
* "table.column" if rowIndex is -1.
*/
- protected String getOutputName ( Configuration tableConf, Configuration columnConf, int rowIndex )
- throws ConfigurationException {
+ protected String getOutputName ( Configuration tableConf, Configuration columnConf, int rowIndex ) {
- return ( tableConf.getAttribute("alias", tableConf.getAttribute("name") )
- + "." + columnConf.getAttribute("name")
+ return ( tableConf.getAttribute("alias", tableConf.getAttribute("name", null) )
+ + "." + columnConf.getAttribute("name",null)
+ ( rowIndex == -1 ? "" : "[" + rowIndex + "]" ) );
}
@@ -676,7 +469,7 @@
* a set.
*
*/
- protected Object[] getColumnValue( Configuration tableConf, Column column, Request request )
+ protected Object[] getColumnValue( Configuration tableConf, Column column, Map objectModel )
throws ConfigurationException, ComponentException {
if ( column.isAutoIncrement ) {
@@ -684,25 +477,25 @@
} else {
Object[] values;
String cname = getOutputName( tableConf, column.columnConf );
-
+
// obtain input module and read values
ComponentSelector inputSelector = null;
InputModule input = null;
try {
- inputSelector=(ComponentSelector) this.manager.lookup(INPUT_MODULE_SELECTOR);
+ inputSelector=(ComponentSelector) this.manager.lookup(INPUT_MODULE_SELECTOR);
if (column.mode != null && inputSelector != null && inputSelector.hasComponent(column.mode)){
input = (InputModule) inputSelector.select(column.mode);
}
if ( column.isSet ){
if (getLogger().isDebugEnabled())
- getLogger().debug( "Trying to set column " + cname +" using getAttributeValues method");
- values = input.getAttributeValues( cname, column.modeConf, request );
+ getLogger().debug( "Trying to set column " + cname +" from "+column.mode+" using getAttributeValues method");
+ values = input.getAttributeValues( cname, column.modeConf, objectModel );
} else {
if (getLogger().isDebugEnabled())
- getLogger().debug( "Trying to set column " + cname +" using getAttribute method");
+ getLogger().debug( "Trying to set column " + cname +" from "+column.mode+" using getAttribute method");
values = new Object[1];
- values[0] = input.getAttribute( cname, column.modeConf, request );
+ values[0] = input.getAttribute( cname, column.modeConf, objectModel );
}
if ( values != null ) {
@@ -714,12 +507,12 @@
} finally {
if (inputSelector != null) {
- if (input != null)
+ if (input != null)
inputSelector.release(input);
this.manager.release(inputSelector);
}
}
-
+
return values;
}
}
@@ -728,8 +521,8 @@
/**
* Setup parsed attribute configuration object
*/
- protected void fillModes ( Configuration[] conf, boolean isKey, HashMap defaultModeNames,
- HashMap modeTypes, CacheHelper set )
+ protected void fillModes ( Configuration[] conf, boolean isKey, Map defaultModeNames,
+ Map modeTypes, CacheHelper set )
throws ConfigurationException {
String setMode = null;
@@ -773,98 +566,268 @@
}
}
+ /**
+ * create a unique name using the getOutputName method and write
+ * the value to the output module and the results map if present.
+ *
+ */
+ protected void setOutput( Map objectModel, String outputMode, Map results,
+ Configuration table, Configuration column, int rowIndex, Object value ) {
+ String param = this.getOutputName( table, column, rowIndex );
+ if (getLogger().isDebugEnabled())
+ getLogger().debug( "Setting column " + param + " to " + value );
+ this.setOutputAttribute(objectModel, outputMode, param, value);
+ if (results != null)
+ results.put( param, String.valueOf( value ) );
+ }
/**
- * Put key values into request attributes.
+ * set a column in a statement using the appropriate JDBC setXXX method.
+ *
*/
- protected void storeKeyValue( Configuration tableConf, Column key, int rowIndex, Connection conn,
- Statement statement, Request request, Map results )
- throws SQLException, ConfigurationException, ComponentException {
-
- ComponentSelector autoincrSelector = null;
- AutoIncrementModule autoincr = null;
- try {
- autoincrSelector=(ComponentSelector) this.manager.lookup(DATABASE_MODULE_SELECTOR);
- if (key.mode != null && autoincrSelector != null && autoincrSelector.hasComponent(key.mode)){
- autoincr = (AutoIncrementModule) autoincrSelector.select(key.mode);
- }
-
- if (!autoincr.includeAsValue()) {
- String keyname = getOutputName( tableConf, key.columnConf, rowIndex );
- Object value = autoincr.getPostValue( tableConf, key.columnConf, key.modeConf, conn, statement, request );
- if (getLogger().isDebugEnabled())
- getLogger().debug( "Retrieving autoincrement for " + keyname + "as " + value );
- setRequestAttribute( request, keyname, value );
- results.put( keyname, String.valueOf( value ) );
- }
+ protected void setColumn ( PreparedStatement statement, int position, Configuration entry, Object value ) throws Exception {
- } finally {
- if (autoincrSelector != null) {
- if (autoincr != null)
- autoincrSelector.release(autoincr);
- this.manager.release(autoincrSelector);
- }
- }
-
+ JDBCTypeConversions.setColumn(statement, position, value, (Integer) JDBCTypeConversions.typeConstants.get(entry.getAttribute("type")));
}
/**
- * Sets the key value on the prepared statement for an autoincrement type.
+ * set a column in a statement using the appropriate JDBC setXXX
+ * method and propagate the value to the output module and results
+ * map if present. Effectively combines calls to setColumn and
+ * setOutput.
*
- * @param table the table's configuration object
- * @param column the key's configuration object
- * @param currentIndex the position of the key column
- * @param rowIndex the position in the current row set
- * @param conn the database connection
- * @param statement the insert statement
- * @param request the request object
- * @param result sitemap result object
- * @return the number of columns by which to increment the currentIndex
- */
- protected int setKeyAuto ( Configuration table, Column column, int currentIndex, int rowIndex,
- Connection conn, PreparedStatement statement, Request request, Map results )
- throws ConfigurationException, SQLException, ComponentException, Exception {
-
- int columnCount = 0;
-
-
- ComponentSelector autoincrSelector = null;
- AutoIncrementModule autoincr = null;
+ */
+ protected void setColumn ( Map objectModel, String outputMode, Map results,
+ Configuration table, Configuration column, int rowIndex,
+ Object value, PreparedStatement statement, int position ) throws Exception {
+
+ if (results!=null) this.setOutput( objectModel, outputMode, results, table, column, rowIndex, value );
+ this.setColumn( statement, position, column, value );
+ }
+
+
+ // ========================================================================
+ // main method
+ // ========================================================================
+
+
+ /**
+ * Add a record to the database. This action assumes that
+ * the file referenced by the "descriptor" parameter conforms
+ * to the AbstractDatabaseAction specifications.
+ */
+ public Map act( Redirector redirector, SourceResolver resolver, Map objectModel,
+ String source, Parameters param ) throws Exception {
+
+ DataSourceComponent datasource = null;
+ Connection conn = null;
+ Map results = new HashMap();
+ int rows = 0;
+
+ // read global parameter settings
+ boolean reloadable = Constants.DESCRIPTOR_RELOADABLE_DEFAULT;
+
+ // call specific default modes apart from output mode are not supported
+ // set request attribute
+ String outputMode = param.getParameter("output", (String) defaultModeNames.get(MODE_OUTPUT));
+
+ if (this.settings.containsKey("reloadable"))
+ reloadable = Boolean.getBoolean((String) this.settings.get("reloadable"));
+
+ // read local parameter settings
try {
- autoincrSelector=(ComponentSelector) this.manager.lookup(DATABASE_MODULE_SELECTOR);
- if (column.mode != null && autoincrSelector != null && autoincrSelector.hasComponent(column.mode)){
- autoincr = (AutoIncrementModule) autoincrSelector.select(column.mode);
+ Configuration conf =
+ this.getConfiguration(param.getParameter("descriptor", (String) this.settings.get("descriptor")),
+ resolver,
+ param.getParameterAsBoolean("reloadable",reloadable));
+
+ // get database connection and try to turn off autocommit
+ datasource = this.getDataSource(conf, param);
+ conn = datasource.getConnection();
+ if (conn.getAutoCommit() == true) {
+ try {
+ conn.setAutoCommit(false);
+ } catch (Exception ex) {
+ String tmp = param.getParameter("use-transactions",(String) this.settings.get("use-transactions",null));
+ if (tmp != null && (tmp.equalsIgnoreCase("no") || tmp.equalsIgnoreCase("false") || tmp.equalsIgnoreCase("0"))) {
+ if (getLogger().isErrorEnabled())
+ getLogger().error("This DB connection does not support transactions. If you want to risk your data's integrity by continuing nonetheless set parameter \"use-transactions\" to \"no\".");
+ throw ex;
+ }
+ }
}
- if ( autoincr.includeInQuery() ) {
- if ( autoincr.includeAsValue() ) {
- Object value = autoincr.getPreValue( table, column.columnConf, column.modeConf, conn, request );
- String keyname = this.getOutputName( table, column.columnConf, rowIndex );
- if (getLogger().isDebugEnabled())
- getLogger().debug( "Setting key " + keyname + " to " + value );
- statement.setObject( currentIndex, value );
- setRequestAttribute( request, keyname, value );
- results.put( keyname, String.valueOf( value ) );
- columnCount = 1;
+ // find tables to work with
+ Configuration[] tables = conf.getChildren("table");
+ String tablesetname = param.getParameter("table-set", (String) this.settings.get("table-set"));
+ Map set_tables = null; // default to old behaviour
+
+ Map modeTypes = null;
+
+ if (tablesetname == null) {
+ modeTypes = new HashMap(6);
+ modeTypes.put( MODE_AUTOINCR, "autoincr" );
+ modeTypes.put( MODE_OTHERS, "others" );
+ modeTypes.put( MODE_OUTPUT, outputMode );
+ for (int i=0; i<tables.length; i++) {
+ rows += processTable( tables[i], conn, objectModel, results, modeTypes );
}
} else {
- if (getLogger().isDebugEnabled())
- getLogger().debug( "Automatically setting key" );
+ // new set based behaviour
+
+ // create index for table names / aliases
+ Map tableIndex = new HashMap(2*tables.length);
+ String tableName = null;
+ Object result = null;
+ for (int i=0; i<tables.length; i++) {
+ tableName = tables[i].getAttribute("alias",tables[i].getAttribute("name",""));
+ result = tableIndex.put(tableName,new Integer(i));
+ if (result != null) {
+ throw new IOException("Duplicate table entry for "+tableName+" at positions "+result+" and "+i);
+ }
+ }
+
+ Configuration[] tablesets = conf.getChildren("table-set");
+ String setname = null;
+ boolean found = false;
+
+ // find tables contained in tableset
+ int j = 0;
+ for (j=0; j<tablesets.length; j++) {
+ setname = tablesets[j].getAttribute ("name", "");
+ if (tablesetname.trim().equals (setname.trim ())) {
+ found = true;
+ break;
+ }
+ }
+ if (!found) {
+ throw new IOException(" given set " + tablesetname + " does not exists in a description file.");
+ }
+
+ Configuration[] set = tablesets[j].getChildren("table");
+
+ for (int i=0; i<set.length; i++) {
+ // look for alternative mode types
+ modeTypes = new HashMap(6);
+ modeTypes.put( MODE_AUTOINCR, set[i].getAttribute( "autoincr-mode", "autoincr" ) );
+ modeTypes.put( MODE_OTHERS, set[i].getAttribute( "others-mode", "others" ) );
+ modeTypes.put( MODE_OUTPUT, outputMode );
+ tableName=set[i].getAttribute("name","");
+ if (tableIndex.containsKey(tableName)) {
+ j = ((Integer)tableIndex.get(tableName)).intValue();
+ rows += processTable( tables[j], conn, objectModel, results, modeTypes );
+ } else {
+ throw new IOException(" given table " + tableName + " does not exists in a description file.");
+ }
+ }
+ }
+
+ if (conn.getAutoCommit()==false)
+ conn.commit();
+
+ // obtain output mode module and rollback output
+ ComponentSelector outputSelector = null;
+ OutputModule output = null;
+ try {
+ outputSelector=(ComponentSelector) this.manager.lookup(OUTPUT_MODULE_SELECTOR);
+ if (outputMode != null && outputSelector != null && outputSelector.hasComponent(outputMode)){
+ output = (OutputModule) outputSelector.select(outputMode);
+ }
+ output.commit( null, objectModel );
+ } catch (Exception e) {
+ if (getLogger().isWarnEnabled())
+ getLogger()
+ .warn( "Could not select output mode "
+ + (String) outputMode
+ + ":" + e.getMessage() );
+ } finally {
+ if (outputSelector != null) {
+ if (output != null)
+ outputSelector.release(output);
+ this.manager.release(outputSelector);
+ }
+ }
+
+ } catch (Exception e) {
+ if ( conn != null ) {
+ try {
+ if (getLogger().isDebugEnabled()) {
+ getLogger().debug( "Rolling back transaction. Caused by " + e.getMessage() );
+ }
+ conn.rollback();
+ results = null;
+
+ // obtain output mode module and commit output
+ ComponentSelector outputSelector = null;
+ OutputModule output = null;
+ try {
+ outputSelector=(ComponentSelector) this.manager.lookup(OUTPUT_MODULE_SELECTOR);
+ if (outputMode != null && outputSelector != null && outputSelector.hasComponent(outputMode)){
+ output = (OutputModule) outputSelector.select(outputMode);
+ }
+ output.rollback( null, objectModel, e);
+ } catch (Exception e2) {
+ if (getLogger().isWarnEnabled())
+ getLogger()
+ .warn( "Could not select output mode "
+ + (String) outputMode
+ + ":" + e2.getMessage() );
+ } finally {
+ if (outputSelector != null) {
+ if (output != null)
+ outputSelector.release(output);
+ this.manager.release(outputSelector);
+ }
+ }
+
+ } catch (SQLException se) {
+ if (getLogger().isDebugEnabled())
+ getLogger().debug("There was an error rolling back the transaction", se);
+ }
}
+ //throw new ProcessingException("Could not add record :position = " + currentIndex, e);
+
+ // don't throw an exception, an error has been signalled, that should suffice
+
+ String throwException = (String) this.settings.get( "throw-exception",
+ param.getParameter( "throw-exception", null ) );
+ if ( throwException != null &&
+ ( throwException.equalsIgnoreCase( "true" ) || throwException.equalsIgnoreCase( "yes" ) ) ) {
+ throw new ProcessingException("Could not add record",e);
+ }
} finally {
- if (autoincrSelector != null) {
- if (autoincr != null)
- autoincrSelector.release(autoincr);
- this.manager.release(autoincrSelector);
+ if (conn != null) {
+ try {
+ conn.close();
+ } catch (SQLException sqe) {
+ getLogger().warn("There was an error closing the datasource", sqe);
+ }
}
- }
- return columnCount;
+ if (datasource != null)
+ this.dbselector.release(datasource);
+ }
+ if (results != null) {
+ if (rows>0) {
+ results.put("row-count",new Integer(rows));
+ } else {
+ results = null;
+ }
+ } else {
+ if (rows>0) {
+ results = new HashMap(1);
+ results.put("row-count",new Integer(rows));
+ }
+ }
+
+ return (results == null? results : Collections.unmodifiableMap(results));
}
+
+
// ========================================================================
// abstract methods
// ========================================================================
@@ -877,7 +840,7 @@
* This method is intended to be overridden by classes that
* implement other operations e.g. delete
*/
- protected abstract int processRow( Request request, Connection conn, PreparedStatement statement,
+ protected abstract int processRow( Map objectModel, Connection conn, PreparedStatement statement, String outputMode,
Configuration table, CacheHelper queryData, Object[][] columnValues,
int rowIndex, Map results )
throws SQLException, ConfigurationException, Exception;
@@ -888,7 +851,7 @@
* This method is intended to be overridden by classes that
* implement other operations e.g. delete
*/
- protected abstract String selectMode( boolean isAutoIncrement, HashMap modes );
+ protected abstract String selectMode( boolean isAutoIncrement, Map modes );
/**
@@ -908,7 +871,7 @@
* This method is intended to be overridden by classes that
* implement other operations e.g. delete
*/
- abstract Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData, Request request )
+ abstract Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData, Map objectModel )
throws ConfigurationException, ComponentException;
/**
@@ -922,7 +885,7 @@
* @param table the table's configuration object
* @return the insert query as a string
*/
- protected abstract CacheHelper getQuery( Configuration table, HashMap modeTypes, HashMap defaultModeNames )
+ protected abstract CacheHelper getQuery( Configuration table, Map modeTypes, Map defaultModeNames )
throws ConfigurationException, ComponentException;
}
1.1.2.2 +15 -22 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseUpdateAction.java
Index: DatabaseUpdateAction.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseUpdateAction.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- DatabaseUpdateAction.java 28 Apr 2002 19:59:52 -0000 1.1.2.1
+++ DatabaseUpdateAction.java 11 Aug 2002 17:47:55 -0000 1.1.2.2
@@ -61,13 +61,9 @@
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.cocoon.environment.Request;
-
/**
* Updates a record in a database. The action can update one or more
- * tables, and can update more than one row to a table at a time. The
- * form descriptor semantics for this are still in a bit of a state of
- * flux.
+ * tables, and can update more than one row to a table at a time.
*
* @author <a href="mailto:haul@apache.org">Christian Haul</a>
* @version CVS $Id$
@@ -79,7 +75,7 @@
* here: UPDATE
* highly specific to operation INSERT / UPDATE / DELETE / SELECT
*/
- protected String selectMode ( boolean isAutoIncrement, HashMap modes ) {
+ protected String selectMode ( boolean isAutoIncrement, Map modes ) {
return (String) modes.get( MODE_OTHERS );
}
@@ -96,12 +92,12 @@
* Fetch all values for all columns that are needed to do the
* database operation.
*/
- protected Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData, Request request )
+ protected Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData, Map objectModel )
throws ConfigurationException, ComponentException {
Object[][] columnValues = new Object[ queryData.columns.length ][];
for ( int i = 0; i < queryData.columns.length; i++ ){
- columnValues[i] = this.getColumnValue( tableConf, queryData.columns[i], request );
+ columnValues[i] = this.getColumnValue( tableConf, queryData.columns[i], objectModel );
}
return columnValues;
}
@@ -115,7 +111,7 @@
* @param table the table's configuration object
* @return the insert query as a string
*/
- protected CacheHelper getQuery( Configuration table, HashMap modeTypes, HashMap defaultModeNames )
+ protected CacheHelper getQuery( Configuration table, Map modeTypes, Map defaultModeNames )
throws ConfigurationException, ComponentException {
LookUpKey lookUpKey = new LookUpKey( table, modeTypes );
@@ -171,8 +167,9 @@
/**
* set all necessary ?s and execute the query
*/
- protected int processRow ( Request request, Connection conn, PreparedStatement statement, Configuration table,
- CacheHelper queryData, Object[][] columnValues, int rowIndex, Map results )
+ protected int processRow ( Map objectModel, Connection conn, PreparedStatement statement, String outputMode,
+ Configuration table, CacheHelper queryData, Object[][] columnValues,
+ int rowIndex, Map results )
throws SQLException, ConfigurationException, Exception {
@@ -182,25 +179,21 @@
for (int i = 0; i < queryData.columns.length; i++) {
Column col = queryData.columns[i];
if ( !col.isKey ) {
- this.setColumn( statement, currentIndex, request, col.columnConf,
- getOutputName( table, col.columnConf, rowIndex ),
- columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ],
- rowIndex);
+ this.setColumn( objectModel, outputMode, results, table, col.columnConf, rowIndex,
+ columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ], statement, currentIndex );
currentIndex++;
}
}
for (int i = 0; i < queryData.columns.length; i++) {
Column col = queryData.columns[i];
if ( col.isKey ) {
- this.setColumn( statement, currentIndex, request, col.columnConf,
- getOutputName( table, col.columnConf, rowIndex ),
- columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ],
- rowIndex);
+ this.setColumn( objectModel, outputMode, results, table, col.columnConf, rowIndex,
+ columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ], statement, currentIndex );
currentIndex++;
}
}
- int rowCount = statement.executeUpdate();
- return rowCount;
+ int rowCount = statement.executeUpdate();
+ return rowCount;
}
}
1.1.2.2 +15 -103 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseSelectAction.java
Index: DatabaseSelectAction.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseSelectAction.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- DatabaseSelectAction.java 28 Apr 2002 19:59:52 -0000 1.1.2.1
+++ DatabaseSelectAction.java 11 Aug 2002 17:47:55 -0000 1.1.2.2
@@ -69,15 +69,12 @@
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.cocoon.environment.Request;
-
-import org.apache.cocoon.acting.AbstractDatabaseAction;
+import org.apache.cocoon.util.JDBCTypeConversions;
/**
* Selects a record from a database. The action can select one or more
* tables, and can select from more than one row of a table at a
- * time. The form descriptor semantics for this are still in a bit of
- * a state of flux.
+ * time.
*
* @author <a href="mailto:haul@apache.org">Christian Haul</a>
* @version CVS $Id$
@@ -89,7 +86,7 @@
* here: SELECT
* highly specific to operation INSERT / UPDATE / DELETE / SELECT
*/
- protected String selectMode ( boolean isAutoIncrement, HashMap modes ) {
+ protected String selectMode ( boolean isAutoIncrement, Map modes ) {
return (String) modes.get( MODE_OTHERS );
}
@@ -110,7 +107,7 @@
* @param table the table's configuration object
* @return the insert query as a string
*/
- protected CacheHelper getQuery( Configuration table, HashMap modeTypes, HashMap defaultModeNames )
+ protected CacheHelper getQuery( Configuration table, Map modeTypes, Map defaultModeNames )
throws ConfigurationException, ComponentException {
LookUpKey lookUpKey = new LookUpKey( table, modeTypes );
@@ -168,13 +165,13 @@
* Fetch all values for all key columns that are needed to do the
* database operation.
*/
- protected Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData, Request request )
+ protected Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData, Map objectModel )
throws ConfigurationException, ComponentException {
Object[][] columnValues = new Object[ queryData.columns.length ][];
for ( int i = 0; i < queryData.columns.length; i++ ){
if ( queryData.columns[i].isKey ) {
- columnValues[i] = this.getColumnValue( tableConf, queryData.columns[i], request );
+ columnValues[i] = this.getColumnValue( tableConf, queryData.columns[i], objectModel );
} else {
// columnValues[i] = new Object[1]; // this should not be needed
}
@@ -186,8 +183,9 @@
/**
* set all necessary ?s and execute the query
*/
- protected int processRow ( Request request, Connection conn, PreparedStatement statement, Configuration table,
- CacheHelper queryData, Object[][] columnValues, int rowIndex, Map results )
+ protected int processRow ( Map objectModel, Connection conn, PreparedStatement statement, String outputMode,
+ Configuration table, CacheHelper queryData, Object[][] columnValues,
+ int rowIndex, Map results )
throws SQLException, ConfigurationException, Exception {
int currentIndex = 1;
@@ -196,10 +194,8 @@
for (int i = 0; i < queryData.columns.length; i++) {
Column col = queryData.columns[i];
if ( col.isKey ) {
- this.setColumn( statement, currentIndex, request, col.columnConf,
- getOutputName( table, col.columnConf, rowIndex ),
- columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ],
- rowIndex);
+ this.setColumn(objectModel, outputMode, null, table, col.columnConf, rowIndex,
+ columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ], statement, currentIndex );
currentIndex++;
}
}
@@ -208,99 +204,15 @@
ResultSet resultset = statement.getResultSet();
rowIndex = 0;
while ( resultset.next() ){
- //if ( ! ( rowIndex == -1 && resultset.isLast() ) ) {
- rowIndex++;
- //}
for (int i = 0; i < queryData.columns.length; i++) {
if ( !queryData.columns[i].isKey ) {
- Object value = this.getColumn( resultset, queryData.columns[i].columnConf );
- String param = getOutputName( table, queryData.columns[i].columnConf, rowIndex );
- this.setRequestAttribute( request, param, value );
- results.put(param,value);
+ Object value = JDBCTypeConversions.getColumn( resultset, queryData.columns[i].columnConf );
+ this.setOutput(objectModel, outputMode, results, table, queryData.columns[i].columnConf, rowIndex, value);
}
}
+ rowIndex++;
}
return rowIndex;
- }
-
-
- /**
- * Get the Statement column so that the results are mapped correctly.
- * (this has been copied from AbstractDatabaseAction and modified slightly)
- */
- protected Object getColumn(ResultSet set, Configuration column ) throws Exception {
-
- Integer type = (Integer) AbstractDatabaseAction.typeConstants.get(column.getAttribute("type"));
- String dbcol = column.getAttribute("name");
- Object value = null;
-
- switch (type.intValue()) {
- case Types.CLOB:
- Clob dbClob = set.getClob(dbcol);
- int length = (int) dbClob.length();
- InputStream asciiStream = new BufferedInputStream(dbClob.getAsciiStream());
- byte[] buffer = new byte[length];
- asciiStream.read(buffer);
- String str = new String(buffer);
- asciiStream.close();
- value = str;
- break;
- case Types.BIGINT:
- value = set.getBigDecimal(dbcol);
- break;
- case Types.TINYINT:
- value = new Byte(set.getByte(dbcol));
- break;
- case Types.VARCHAR:
- value = set.getString(dbcol);
- break;
- case Types.DATE:
- value = set.getDate(dbcol);
- break;
- case Types.DOUBLE:
- value = new Double(set.getDouble(dbcol));
- break;
- case Types.FLOAT:
- value = new Float(set.getFloat(dbcol));
- break;
- case Types.INTEGER:
- value = new Integer(set.getInt(dbcol));
- break;
- case Types.NUMERIC:
- value = new Long(set.getLong(dbcol));
- break;
- case Types.SMALLINT:
- value = new Short(set.getShort(dbcol));
- break;
- case Types.TIME:
- value = set.getTime(dbcol);
- break;
- case Types.TIMESTAMP:
- value = set.getTimestamp(dbcol);
- break;
- case Types.ARRAY:
- value = set.getArray(dbcol); // new Integer(set.getInt(dbcol));
- break;
- case Types.BIT:
- value = new Integer(set.getInt(dbcol));
- break;
- case Types.CHAR:
- value = new Integer(set.getInt(dbcol));
- break;
- case Types.STRUCT:
- value = (Struct) set.getObject(dbcol);
- break;
- case Types.OTHER:
- value = set.getObject(dbcol);
- break;
-
- default:
- // The blob types have to be requested separately, via a Reader.
- value = "";
- break;
- }
-
- return value;
}
1.1.2.2 +10 -15 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseDeleteAction.java
Index: DatabaseDeleteAction.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseDeleteAction.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- DatabaseDeleteAction.java 28 Apr 2002 19:59:52 -0000 1.1.2.1
+++ DatabaseDeleteAction.java 11 Aug 2002 17:47:55 -0000 1.1.2.2
@@ -61,13 +61,9 @@
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.cocoon.environment.Request;
-
/**
* Updates a record in a database. The action can update one or more
- * tables, and can update more than one row to a table at a time. The
- * form descriptor semantics for this are still in a bit of a state of
- * flux.
+ * tables, and can update more than one row to a table at a time.
*
* @author <a href="mailto:haul@apache.org">Christian Haul</a>
* @version CVS $Id$
@@ -79,7 +75,7 @@
* here: DELETE
* highly specific to operation INSERT / UPDATE / DELETE / SELECT
*/
- protected String selectMode ( boolean isAutoIncrement, HashMap modes ) {
+ protected String selectMode ( boolean isAutoIncrement, Map modes ) {
return (String) modes.get( MODE_OTHERS );
}
@@ -96,13 +92,13 @@
* Fetch all values for all key columns that are needed to do the
* database operation.
*/
- protected Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData, Request request )
+ protected Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData, Map objectModel )
throws ConfigurationException, ComponentException {
Object[][] columnValues = new Object[ queryData.columns.length ][];
for ( int i = 0; i < queryData.columns.length; i++ ){
if ( queryData.columns[i].isKey ) {
- columnValues[i] = this.getColumnValue( tableConf, queryData.columns[i], request );
+ columnValues[i] = this.getColumnValue( tableConf, queryData.columns[i], objectModel );
} else {
// columnValues[i] = new Object[1]; // this should not be needed
}
@@ -120,7 +116,7 @@
* @param table the table's configuration object
* @return the insert query as a string
*/
- protected CacheHelper getQuery( Configuration table, HashMap modeTypes, HashMap defaultModeNames )
+ protected CacheHelper getQuery( Configuration table, Map modeTypes, Map defaultModeNames )
throws ConfigurationException, ComponentException {
LookUpKey lookUpKey = new LookUpKey( table, modeTypes );
@@ -158,7 +154,7 @@
/**
* set all necessary ?s and execute the query
*/
- protected int processRow ( Request request, Connection conn, PreparedStatement statement,
+ protected int processRow ( Map objectModel, Connection conn, PreparedStatement statement, String outputMode,
Configuration table, CacheHelper queryData, Object[][] columnValues,
int rowIndex, Map results )
throws SQLException, ConfigurationException, Exception {
@@ -169,10 +165,9 @@
for (int i = 0; i < queryData.columns.length; i++) {
Column col = queryData.columns[i];
if ( col.isKey ) {
- this.setColumn( statement, currentIndex, request, col.columnConf,
- getOutputName( table, col.columnConf, rowIndex ),
- columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ],
- rowIndex);
+ this.setColumn( objectModel, outputMode, results, table, col.columnConf, rowIndex,
+ columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ],
+ statement, currentIndex );
currentIndex++;
}
}
1.1.2.2 +98 -15 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseAddAction.java
Index: DatabaseAddAction.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseAddAction.java,v
retrieving revision 1.1.2.1
retrieving revision 1.1.2.2
diff -u -r1.1.2.1 -r1.1.2.2
--- DatabaseAddAction.java 28 Apr 2002 19:59:52 -0000 1.1.2.1
+++ DatabaseAddAction.java 11 Aug 2002 17:47:55 -0000 1.1.2.2
@@ -53,6 +53,7 @@
import java.util.Map;
import java.sql.Connection;
+import java.sql.Statement;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.apache.cocoon.util.HashMap;
@@ -62,14 +63,12 @@
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
-import org.apache.cocoon.environment.Request;
-
import org.apache.cocoon.components.modules.database.AutoIncrementModule;
/**
* Adds record in a database. The action can update one or more
* tables, and can add more than one row to a table at a time. See
- * {@see DatabaseAction} for details.
+ * {@link DatabaseAction} for details.
*
* @author <a href="mailto:haul@apache.org">Christian Haul</a>
* @version CVS $Id$
@@ -80,7 +79,7 @@
/**
* set all necessary ?s and execute the query
*/
- protected int processRow ( Request request, Connection conn, PreparedStatement statement,
+ protected int processRow ( Map objectModel, Connection conn, PreparedStatement statement, String outputMode,
Configuration table, CacheHelper queryData, Object[][] columnValues,
int rowIndex, Map results )
throws SQLException, ConfigurationException, Exception {
@@ -90,12 +89,12 @@
Column col = queryData.columns[i];
if ( col.isAutoIncrement && col.isKey ) {
currentIndex += setKeyAuto( table, col, currentIndex, rowIndex,
- conn, statement, request, results );
+ conn, statement, objectModel, outputMode, results );
} else {
- this.setColumn( statement, currentIndex, request, col.columnConf,
- getOutputName( table, col.columnConf, rowIndex ),
- columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ],
- rowIndex);
+ this.setOutput( objectModel, outputMode, results, table, col.columnConf, rowIndex,
+ columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ]);
+ this.setColumn( statement, currentIndex, col.columnConf,
+ columnValues[ i ][ ( col.isSet ? rowIndex : 0 ) ]);
currentIndex++;
}
}
@@ -104,7 +103,7 @@
for (int i = 0; i < queryData.columns.length; i++) {
if ( queryData.columns[i].isAutoIncrement && queryData.columns[i].isKey ) {
storeKeyValue( table, queryData.columns[i], rowIndex,
- conn, statement, request, results );
+ conn, statement, objectModel, outputMode, results );
}
}
return rowCount;
@@ -112,11 +111,95 @@
/**
+ * Sets the key value on the prepared statement for an autoincrement type.
+ *
+ * @param table the table's configuration object
+ * @param column the key's configuration object
+ * @param currentIndex the position of the key column
+ * @param rowIndex the position in the current row set
+ * @param conn the database connection
+ * @param statement the insert statement
+ * @param objectModel the objectModel object
+ * @param outputMode name of the requested output module
+ * @param result sitemap result object
+ * @return the number of columns by which to increment the currentIndex
+ */
+ protected int setKeyAuto ( Configuration table, Column column, int currentIndex, int rowIndex,
+ Connection conn, PreparedStatement statement, Map objectModel, String outputMode, Map results )
+ throws ConfigurationException, SQLException, ComponentException, Exception {
+
+ int columnCount = 0;
+ ComponentSelector autoincrSelector = null;
+ AutoIncrementModule autoincr = null;
+ try {
+ autoincrSelector=(ComponentSelector) this.manager.lookup(DATABASE_MODULE_SELECTOR);
+ if (column.mode != null && autoincrSelector != null && autoincrSelector.hasComponent(column.mode)){
+ autoincr = (AutoIncrementModule) autoincrSelector.select(column.mode);
+ }
+
+ if ( autoincr.includeInQuery() ) {
+ if ( autoincr.includeAsValue() ) {
+ Object value = autoincr.getPreValue( table, column.columnConf, column.modeConf, conn, objectModel );
+ this.setColumn(objectModel, outputMode, results, table, column.columnConf, rowIndex, value, statement, currentIndex);
+ columnCount = 1;
+ }
+ } else {
+ if (getLogger().isDebugEnabled())
+ getLogger().debug( "Automatically setting key" );
+ }
+
+ } finally {
+ if (autoincrSelector != null) {
+ if (autoincr != null)
+ autoincrSelector.release(autoincr);
+ this.manager.release(autoincrSelector);
+ }
+ }
+
+ return columnCount;
+ }
+
+
+
+ /**
+ * Put key values into request attributes. Checks whether the
+ * value needs to be retrieved from the database module first.
+ *
+ */
+ protected void storeKeyValue( Configuration tableConf, Column key, int rowIndex, Connection conn,
+ Statement statement, Map objectModel, String outputMode, Map results )
+ throws SQLException, ConfigurationException, ComponentException {
+
+ ComponentSelector autoincrSelector = null;
+ AutoIncrementModule autoincr = null;
+ try {
+ autoincrSelector=(ComponentSelector) this.manager.lookup(DATABASE_MODULE_SELECTOR);
+ if (key.mode != null && autoincrSelector != null && autoincrSelector.hasComponent(key.mode)){
+ autoincr = (AutoIncrementModule) autoincrSelector.select(key.mode);
+ }
+
+ if (!autoincr.includeAsValue()) {
+ Object value = autoincr.getPostValue( tableConf, key.columnConf, key.modeConf, conn, statement, objectModel );
+ this.setOutput(objectModel, outputMode, results, tableConf, key.columnConf, rowIndex, value);
+ }
+
+ } finally {
+ if (autoincrSelector != null) {
+ if (autoincr != null)
+ autoincrSelector.release(autoincr);
+ this.manager.release(autoincrSelector);
+ }
+ }
+
+ }
+
+
+ /**
* determine which mode to use as default mode
* here: INSERT
* highly specific to operation INSERT / UPDATE / DELETE / SELECT
*/
- protected String selectMode ( boolean isAutoIncrement, HashMap modes ) {
+ protected String selectMode ( boolean isAutoIncrement, Map modes ) {
if ( isAutoIncrement )
return (String) modes.get( MODE_AUTOINCR );
@@ -137,12 +220,12 @@
* database operation.
*/
protected Object[][] getColumnValues( Configuration tableConf, CacheHelper queryData,
- Request request )
+ Map objectModel )
throws ConfigurationException, ComponentException {
Object[][] columnValues = new Object[ queryData.columns.length ][];
for ( int i = 0; i < queryData.columns.length; i++ ){
- columnValues[i] = this.getColumnValue( tableConf, queryData.columns[i], request );
+ columnValues[i] = this.getColumnValue( tableConf, queryData.columns[i], objectModel );
}
return columnValues;
}
@@ -155,7 +238,7 @@
* @param table the table's configuration object
* @return the insert query as a string
*/
- protected CacheHelper getQuery( Configuration table, HashMap modeTypes, HashMap defaultModeNames )
+ protected CacheHelper getQuery( Configuration table, Map modeTypes, Map defaultModeNames )
throws ConfigurationException, ComponentException {
LookUpKey lookUpKey = new LookUpKey( table, modeTypes );
1.1.2.3 +19 -19 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/TestAction.java
Index: TestAction.java
===================================================================
RCS file: /home/cvs/xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/TestAction.java,v
retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -r1.1.2.2 -r1.1.2.3
--- TestAction.java 11 Jun 2002 23:54:53 -0000 1.1.2.2
+++ TestAction.java 11 Aug 2002 17:47:55 -0000 1.1.2.3
@@ -51,23 +51,28 @@
package org.apache.cocoon.acting.modular;
-import org.apache.avalon.framework.component.ComponentSelector;
+import org.apache.avalon.framework.activity.Initializable;
import org.apache.avalon.framework.configuration.Configurable;
import org.apache.avalon.framework.configuration.Configuration;
import org.apache.avalon.framework.configuration.ConfigurationException;
+import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.thread.ThreadSafe;
+import org.apache.avalon.framework.component.ComponentSelector;
+import org.apache.cocoon.Constants;
import org.apache.cocoon.acting.ComposerAction;
-import org.apache.cocoon.components.modules.input.InputModule;
-import org.apache.cocoon.components.modules.output.OutputModule;
-import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Redirector;
import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.Session;
import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.components.modules.input.InputModule;
+import org.apache.cocoon.components.modules.output.OutputModule;
+
import java.util.Enumeration;
import java.util.Map;
+import java.util.HashMap;
/** Demo action that uses componentized input / output layer. In order
* to stop combinatorial explosion of actions, matchers, and selectors
@@ -103,9 +108,9 @@
public void configure(Configuration config) throws ConfigurationException {
this.inputConf = config.getChild("input-module");
- this.inputName = this.inputConf.getAttribute("name");
+ this.inputName = this.inputConf.getAttribute("name", this.inputHint);
this.outputConf = config.getChild("output-module");
- this.outputName = this.outputConf.getAttribute("name");
+ this.outputName = this.outputConf.getAttribute("name", this.outputHint);
this.defaultParameterName = config.getChild("parameter-name").getValue(null);
this.useGetValues = config.getChild("use-getValues").getValueAsBoolean(this.useGetValues);
}
@@ -116,11 +121,6 @@
String source, Parameters param ) throws Exception {
// general setup
- Request request = ObjectModelHelper.getRequest(objectModel);
- if (request == null) {
- getLogger().error("no request object!");
- return(null);
- }
String parameterName = param.getParameter("parameter-name",this.defaultParameterName);
boolean useGetValues = param.getParameterAsBoolean("use-getValues",this.useGetValues);
InputModule input = null;
@@ -149,11 +149,11 @@
if (getLogger().isDebugEnabled()) getLogger().debug("reading all parameter values");
// for a test, read all parameters from input and write them to outout
// get names first, then (one) value per name
- Enumeration enum = input.getAttributeNames(this.inputConf,request);
+ Enumeration enum = input.getAttributeNames(this.inputConf,objectModel);
while (enum.hasMoreElements()) {
parameterName = (String) enum.nextElement();
- Object value = input.getAttribute(parameterName, this.inputConf, request);
- output.setAttribute(this.outputConf, request, parameterName, value);
+ Object value = input.getAttribute(parameterName, this.inputConf, objectModel);
+ output.setAttribute(this.outputConf, objectModel, parameterName, value);
if (getLogger().isDebugEnabled())
getLogger().debug("["+parameterName+"] = ["+value+"]");
@@ -163,8 +163,8 @@
if (useGetValues) {
// get all existing values
- Object[] value = input.getAttributeValues(parameterName, this.inputConf, request);
- output.setAttribute(this.outputConf, request, parameterName, value);
+ Object[] value = input.getAttributeValues(parameterName, this.inputConf, objectModel);
+ output.setAttribute(this.outputConf, objectModel, parameterName, value);
if (getLogger().isDebugEnabled())
for (int i=0; i<value.length; i++)
@@ -176,14 +176,14 @@
if (getLogger().isDebugEnabled())
getLogger().debug("reading parameter values for "+parameterName);
- Object value = input.getAttribute(parameterName, this.inputConf, request);
- output.setAttribute(this.outputConf, request, parameterName, value);
+ Object value = input.getAttribute(parameterName, this.inputConf, objectModel);
+ output.setAttribute(this.outputConf, objectModel, parameterName, value);
if (getLogger().isDebugEnabled()) getLogger().debug("["+parameterName+"] = ["+value+"]");
// ------------------------------------------------------------------------
}
}
- output.commit(this.outputConf,request);
+ output.commit(this.outputConf,objectModel);
if (getLogger().isDebugEnabled()) getLogger().debug("done commit");
// done
}
No revision
No revision
1.1.2.1 +235 -0 xml-cocoon2/src/scratchpad/src/org/apache/cocoon/acting/modular/Attic/DatabaseQueryAction.java
----------------------------------------------------------------------
In case of troubles, e-mail: webmaster@xml.apache.org
To unsubscribe, e-mail: cocoon-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: cocoon-cvs-help@xml.apache.org