User: danch Date: 01/05/26 17:49:16 Modified: src/main/org/jboss/ejb/plugins/jaws/jdbc JDBCCommandFactory.java JDBCFindAllCommand.java JDBCFindEntitiesCommand.java JDBCFindEntityCommand.java JDBCFinderCommand.java JDBCLoadEntityCommand.java Added: src/main/org/jboss/ejb/plugins/jaws/jdbc JDBCLoadEntitiesCommand.java Log: added 'read-ahead' option for finders in JAWS Revision Changes Path 1.7 +10 -4 jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCCommandFactory.java Index: JDBCCommandFactory.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCCommandFactory.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- JDBCCommandFactory.java 2001/03/26 15:19:36 1.6 +++ JDBCCommandFactory.java 2001/05/27 00:49:15 1.7 @@ -25,6 +25,7 @@ import org.jboss.ejb.plugins.jaws.JPMCreateEntityCommand; import org.jboss.ejb.plugins.jaws.JPMRemoveEntityCommand; import org.jboss.ejb.plugins.jaws.JPMLoadEntityCommand; +import org.jboss.ejb.plugins.jaws.JPMLoadEntitiesCommand; import org.jboss.ejb.plugins.jaws.JPMStoreEntityCommand; import org.jboss.ejb.plugins.jaws.JPMActivateEntityCommand; import org.jboss.ejb.plugins.jaws.JPMPassivateEntityCommand; @@ -42,7 +43,7 @@ * JAWSPersistenceManager JDBCCommandFactory * * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a> - * @version $Revision: 1.6 $ + * @version $Revision: 1.7 $ */ public class JDBCCommandFactory implements JPMCommandFactory { @@ -130,9 +131,9 @@ return beanExistsCommand; } - public JPMFindEntitiesCommand createFindAllCommand() + public JPMFindEntitiesCommand createFindAllCommand(FinderMetaData f) { - return new JDBCFindAllCommand(this); + return new JDBCFindAllCommand(this, f); } public JPMFindEntitiesCommand createDefinedFinderCommand(FinderMetaData f) @@ -140,7 +141,7 @@ return new JDBCDefinedFinderCommand(this, f); } - public JPMFindEntitiesCommand createFindByCommand(Method finderMethod) + public JPMFindEntitiesCommand createFindByCommand(Method finderMethod, FinderMetaData f) throws IllegalArgumentException { return new JDBCFindByCommand(this, finderMethod); @@ -204,6 +205,11 @@ public JPMLoadEntityCommand createLoadEntityCommand() { return new JDBCLoadEntityCommand(this); + } + + public JPMLoadEntitiesCommand createLoadEntitiesCommand() + { + return new JDBCLoadEntitiesCommand(this); } public JPMStoreEntityCommand createStoreEntityCommand() 1.4 +5 -3 jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindAllCommand.java Index: JDBCFindAllCommand.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindAllCommand.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- JDBCFindAllCommand.java 2000/12/07 15:44:36 1.3 +++ JDBCFindAllCommand.java 2001/05/27 00:49:15 1.4 @@ -7,6 +7,8 @@ package org.jboss.ejb.plugins.jaws.jdbc; +import org.jboss.ejb.plugins.jaws.metadata.FinderMetaData; + /** * JAWSPersistenceManager JDBCFindAllCommand * @@ -15,15 +17,15 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a> * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a> - * @version $Revision: 1.3 $ + * @version $Revision: 1.4 $ */ public class JDBCFindAllCommand extends JDBCFinderCommand { // Constructors -------------------------------------------------- - public JDBCFindAllCommand(JDBCCommandFactory factory) + public JDBCFindAllCommand(JDBCCommandFactory factory, FinderMetaData f) { - super(factory, "FindAll"); + super(factory, f); String sql = "SELECT " + getPkColumnList() + " FROM " + jawsEntity.getTableName(); 1.9 +15 -8 jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindEntitiesCommand.java Index: JDBCFindEntitiesCommand.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindEntitiesCommand.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- JDBCFindEntitiesCommand.java 2001/02/12 18:31:13 1.8 +++ JDBCFindEntitiesCommand.java 2001/05/27 00:49:15 1.9 @@ -22,6 +22,7 @@ import org.jboss.ejb.plugins.jaws.JPMFindEntitiesCommand; import org.jboss.ejb.plugins.jaws.metadata.FinderMetaData; import org.jboss.ejb.plugins.jaws.bmp.CustomFindByEntitiesCommand; +import org.jboss.util.FinderResults; /** * Keeps a map from finder name to specific finder command, and @@ -32,7 +33,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a> * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a> - * @version $Revision: 1.8 $ + * @version $Revision: 1.9 $ */ public class JDBCFindEntitiesCommand implements JPMFindEntitiesCommand { @@ -68,7 +69,7 @@ knownFinderCommands.put(remoteName, new CustomFindByEntitiesCommand(m)); factory.getLog().debug("Added custom finder " + remoteName +"."); } catch (IllegalArgumentException e) { - factory.getLog().debug("Could not create the custom finder " + remoteName+"."); + factory.getLog().error("Could not create the custom finder " + remoteName+"."); } } } @@ -85,8 +86,12 @@ if ( !knownFinderCommands.containsKey(f.getName()) ) { - JPMFindEntitiesCommand finderCommand = - factory.createDefinedFinderCommand(f); + JPMFindEntitiesCommand finderCommand = null; + if (f.getName().equals("findAll")) { + finderCommand = factory.createFindAllCommand(f); + } else { + finderCommand = factory.createDefinedFinderCommand(f); + } knownFinderCommands.put(f.getName(), finderCommand); } @@ -105,12 +110,14 @@ { if (name.equals("findAll")) { - knownFinderCommands.put(name, factory.createFindAllCommand()); + FinderMetaData f = new FinderMetaData("findAll"); + knownFinderCommands.put(name, factory.createFindAllCommand(f)); } else if (name.startsWith("findBy") && !name.equals("findByPrimaryKey")) { try { - knownFinderCommands.put(name, factory.createFindByCommand(m)); + FinderMetaData f = new FinderMetaData(name); + knownFinderCommands.put(name, factory.createFindByCommand(m, f)); } catch (IllegalArgumentException e) { factory.getLog().debug("Could not create the finder " + name + @@ -124,7 +131,7 @@ // JPMFindEntitiesCommand implementation ------------------------- - public Collection execute(Method finderMethod, + public FinderResults execute(Method finderMethod, Object[] args, EntityEnterpriseContext ctx) throws RemoteException, FinderException @@ -142,6 +149,6 @@ // JF: Shouldn't tolerate the "not found" case! return (finderCommand != null) ? - finderCommand.execute(finderMethod, args, ctx) : new ArrayList(); + finderCommand.execute(finderMethod, args, ctx) : new FinderResults(new ArrayList(),null,null,null); } } 1.6 +5 -4 jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindEntityCommand.java Index: JDBCFindEntityCommand.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFindEntityCommand.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- JDBCFindEntityCommand.java 2000/12/07 15:44:37 1.5 +++ JDBCFindEntityCommand.java 2001/05/27 00:49:15 1.6 @@ -29,7 +29,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a> * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a> - * @version $Revision: 1.5 $ + * @version $Revision: 1.6 $ */ public class JDBCFindEntityCommand implements JPMFindEntityCommand { @@ -60,15 +60,16 @@ } else { - ArrayList result = - (ArrayList)findEntitiesCommand.execute(finderMethod, args, ctx); + Collection result = + (Collection)findEntitiesCommand.execute(finderMethod, args, ctx); if (result.size() == 0) { throw new ObjectNotFoundException("No such entity!"); } else if (result.size() == 1) { - return result.get(0); + Object [] objects = result.toArray(); + return objects[0]; } else { throw new FinderException("More than one entity matches the finder criteria."); 1.10 +29 -6 jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFinderCommand.java Index: JDBCFinderCommand.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCFinderCommand.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- JDBCFinderCommand.java 2000/12/07 15:44:37 1.9 +++ JDBCFinderCommand.java 2001/05/27 00:49:15 1.10 @@ -23,7 +23,9 @@ import org.jboss.ejb.EntityEnterpriseContext; import org.jboss.ejb.plugins.jaws.JPMFindEntitiesCommand; +import org.jboss.ejb.plugins.jaws.metadata.FinderMetaData; import org.jboss.ejb.plugins.jaws.metadata.PkFieldMetaData; +import org.jboss.util.FinderResults; /** * Abstract superclass of finder commands that return collections. @@ -33,31 +35,52 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a> * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a> - * @version $Revision: 1.9 $ + * @version $Revision: 1.10 $ */ public abstract class JDBCFinderCommand extends JDBCQueryCommand implements JPMFindEntitiesCommand { + protected FinderMetaData finderMetaData = null; // Constructors -------------------------------------------------- - public JDBCFinderCommand(JDBCCommandFactory factory, String name) + public JDBCFinderCommand(JDBCCommandFactory factory, FinderMetaData f) { - super(factory, name); + super(factory, f.getName()); + + finderMetaData = f; } + + public FinderMetaData getFinderMetaData() { + return finderMetaData; + } // JPMFindEntitiesCommand implementation ------------------------- - public Collection execute(Method finderMethod, + public FinderResults execute(Method finderMethod, Object[] args, EntityEnterpriseContext ctx) throws RemoteException, FinderException { - Collection result = null; + FinderResults result = null; try { - result = (Collection)jdbcExecute(args); + Collection keys = (Collection)jdbcExecute(args); + /** @todo: remove this next bit and add 'getWhereClause' to FinderCommands */ + //look for 'where' and ditch everything before it + String sql = getSQL(args); + sql.toUpperCase(); + int pos = sql.indexOf("WHERE"); + String where = ""; + if (pos != -1) { + where = sql.substring(pos); + } + if (finderMetaData.hasReadAhead()) { + result = new FinderResults(keys, where, this, args); + } else { + result = new FinderResults(keys, null, null, null); + } } catch (Exception e) { log.debug(e); 1.9 +42 -15 jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCLoadEntityCommand.java Index: JDBCLoadEntityCommand.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCLoadEntityCommand.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- JDBCLoadEntityCommand.java 2001/03/26 15:55:43 1.8 +++ JDBCLoadEntityCommand.java 2001/05/27 00:49:15 1.9 @@ -11,6 +11,7 @@ import java.lang.reflect.Method; import java.util.Iterator; +import java.util.HashMap; import java.rmi.NoSuchObjectException; import java.rmi.RemoteException; @@ -23,6 +24,7 @@ import org.jboss.ejb.plugins.jaws.JAWSPersistenceManager; import org.jboss.ejb.plugins.jaws.JPMLoadEntityCommand; import org.jboss.ejb.plugins.jaws.metadata.CMPFieldMetaData; +import org.jboss.ejb.plugins.jaws.metadata.PkFieldMetaData; import org.jboss.ejb.plugins.jaws.metadata.JawsEntityMetaData; /** @@ -34,7 +36,7 @@ * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a> * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a> * @author <a href="mailto:[EMAIL PROTECTED]">Dirk Zimmermann</a> - * @version $Revision: 1.8 $ + * @version $Revision: 1.9 $ */ public class JDBCLoadEntityCommand extends JDBCQueryCommand @@ -46,30 +48,48 @@ { super(factory, "Load"); + String sql = createSelectClause() + " WHERE " + getPkColumnWhereList(); + if (jawsEntity.hasSelectForUpdate()) + { + sql += " FOR UPDATE"; + } + + setSQL(sql); + } + + protected String createSelectClause() { // Select SQL String sql = "SELECT "; - Iterator it = jawsEntity.getCMPFields(); + HashMap alreadyListed = new HashMap(); + // put the key fields in first + Iterator keyIt = jawsEntity.getPkFields(); boolean first = true; - - while (it.hasNext()) + while (keyIt.hasNext()) { - CMPFieldMetaData cmpField = (CMPFieldMetaData)it.next(); + PkFieldMetaData pkField = (PkFieldMetaData)keyIt.next(); sql += (first ? "" : ",") + - cmpField.getColumnName(); + pkField.getColumnName(); + alreadyListed.put(pkField.getColumnName().toUpperCase(), pkField); first = false; } - sql += " FROM " + jawsEntity.getTableName() + - " WHERE " + getPkColumnWhereList(); - if (jawsEntity.hasSelectForUpdate()) + Iterator it = jawsEntity.getCMPFields(); + + while (it.hasNext()) { - sql += " FOR UPDATE"; + CMPFieldMetaData cmpField = (CMPFieldMetaData)it.next(); + if (alreadyListed.get(cmpField.getColumnName().toUpperCase()) == null) { + sql += "," + cmpField.getColumnName(); + alreadyListed.put(cmpField.getColumnName().toUpperCase(), cmpField); + } } - - setSQL(sql); + + sql += " FROM " + jawsEntity.getTableName(); + + return sql; } - + // JPMLoadEntityCommand implementation --------------------------- public void execute(EntityEnterpriseContext ctx) @@ -107,6 +127,13 @@ } // Set values +System.out.print("!"); + loadOneEntity(rs, ctx); + + return null; + } + + protected void loadOneEntity(ResultSet rs, EntityEnterpriseContext ctx) throws Exception { int idx = 1; Iterator iter = jawsEntity.getCMPFields(); @@ -125,9 +152,9 @@ if (jawsEntity.isReadOnly()) pCtx.lastRead = System.currentTimeMillis(); pCtx.state = getState(ctx); - return null; - } + } + // Protected ----------------------------------------------------- protected boolean isTimedOut(EntityEnterpriseContext ctx) 1.1 jboss/src/main/org/jboss/ejb/plugins/jaws/jdbc/JDBCLoadEntitiesCommand.java Index: JDBCLoadEntitiesCommand.java =================================================================== /* * JBoss, the OpenSource EJB server * * Distributable under LGPL license. * See terms of license at gnu.org. */ package org.jboss.ejb.plugins.jaws.jdbc; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Map; import java.util.Iterator; import java.rmi.NoSuchObjectException; import java.rmi.RemoteException; import java.rmi.ServerException; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.jboss.ejb.EntityEnterpriseContext; import org.jboss.ejb.plugins.jaws.JAWSPersistenceManager; import org.jboss.ejb.plugins.jaws.JPMLoadEntitiesCommand; import org.jboss.ejb.plugins.jaws.metadata.CMPFieldMetaData; import org.jboss.ejb.plugins.jaws.metadata.FinderMetaData; import org.jboss.ejb.plugins.jaws.metadata.JawsEntityMetaData; import org.jboss.ejb.plugins.jaws.metadata.PkFieldMetaData; import org.jboss.util.FinderResults; /** * JAWSPersistenceManager JDBCLoadEntityCommand * * @see <related> * @author <a href="mailto:[EMAIL PROTECTED]">Rickard Öberg</a> * @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a> * @author <a href="mailto:[EMAIL PROTECTED]">Joe Shevland</a> * @author <a href="mailto:[EMAIL PROTECTED]">Justin Forder</a> * @author <a href="mailto:[EMAIL PROTECTED]">Dirk Zimmermann</a> * @author <a href="mailto:[EMAIL PROTECTED]">danch (Dan Christopherson)</a> * @version $Revision: 1.1 $ */ public class JDBCLoadEntitiesCommand extends JDBCLoadEntityCommand implements JPMLoadEntitiesCommand { String selectClause; // Constructors -------------------------------------------------- public JDBCLoadEntitiesCommand(JDBCCommandFactory factory) { super(factory); selectClause = super.createSelectClause(); } // JPMLoadEntitiesCommand implementation. public void execute(FinderResults keys) throws RemoteException { JDBCFinderCommand finder = (JDBCFinderCommand)keys.getFinder(); FinderMetaData metaData = null; if (finder != null) metaData = finder.getFinderMetaData(); if (metaData != null && metaData.hasReadAhead() && keys.getQueryData() != null) { try { Object[] args = {keys}; jdbcExecute(args); } catch (Exception e) { throw new ServerException("Load failed", e); } } } // JDBCQueryCommand overrides ------------------------------------ protected Object handleResult(ResultSet rs, Object argOrArgs) throws Exception { FinderResults keys = (FinderResults)((Object[])argOrArgs)[0]; Map instances = keys.getEntityMap(); while (rs.next()) { Object key = createKey(rs); //find the context EntityEnterpriseContext ctx = (EntityEnterpriseContext)instances.get(key); if (ctx != null) { //if the context says it's already valid, don't load it. if (!ctx.isValid()) { loadOneEntity(rs, ctx); ctx.setValid(true); } } else { //if ctx was null, the CMPPersistenceManager doesn't want us to try // to load it due to a transaction issue. } } return null; } protected void setParameters(PreparedStatement stmt, Object argOrArgs) throws Exception { FinderResults keys = (FinderResults)((Object[])argOrArgs)[0]; JDBCFinderCommand finder = (JDBCFinderCommand)keys.getFinder(); Object[] args = keys.getQueryArgs(); finder.setParameters(stmt, args); } // JDBCommand ovverrides ----------------------------------------- protected String getSQL(Object argOrArgs) throws Exception { FinderResults keys = (FinderResults)((Object[])argOrArgs)[0]; return selectClause + " " + keys.getQueryData().toString(); } // protected ----------------------------------------------------- protected Object createKey(ResultSet rs) throws Exception { if (jawsEntity.hasCompositeKey()) { // Compound key try { Object pk = jawsEntity.getPrimaryKeyClass().newInstance(); int i = 1; // parameter index Iterator it = jawsEntity.getPkFields(); while (it.hasNext()) { PkFieldMetaData pkFieldMetaData = (PkFieldMetaData)it.next(); Field pkField = pkFieldMetaData.getPkField(); String colName = pkFieldMetaData.getColumnName(); pkField.set(pk, getResultObject(rs, i++, pkField.getType())); } return pk; } catch (Exception e) { return null; } } else { // Primitive key Iterator it = jawsEntity.getPkFields(); PkFieldMetaData pkFieldMetaData = (PkFieldMetaData)it.next(); return getResultObject(rs, 1, pkFieldMetaData.getCMPField().getType()); } } } _______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] http://lists.sourceforge.net/lists/listinfo/jboss-development