User: dsundstrom
  Date: 01/06/23 20:23:15

  Added:       src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge
                        JDBCCMP1xFieldBridge.java JDBCCMP2xFieldBridge.java
                        JDBCCMPFieldBridge.java JDBCCMRFieldBridge.java
                        JDBCEntityBridge.java JDBCSelectorBridge.java
  Log:
  Initial revision of EJB 2.0 CMP.
  
  Revision  Changes    Path
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMP1xFieldBridge.java
  
  Index: JDBCCMP1xFieldBridge.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
   
  package org.jboss.ejb.plugins.cmp.jdbc.bridge;
  
  import java.lang.reflect.Field;
  
  import java.util.Map;
  
  import javax.ejb.EJBException;
  
  import org.jboss.ejb.DeploymentException;
  import org.jboss.ejb.EntityEnterpriseContext;
  
  import org.jboss.ejb.plugins.cmp.CMPStoreManager;
  import org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager;
  import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCCMPFieldMetaData;
  
  import org.jboss.logging.Log;
  
  /**
   * JDBCCMP1xFieldBridge is a concrete implementation of JDBCCMPFieldBridge for 
   * CMP version 1.x. Getting and setting of instance fields set the 
   * corresponding field in bean instance.  Dirty checking is performed by 
   * storing the current value in the entity persistence context when ever
   * setClean is called, and comparing current value to the original value.
   *
   * Life-cycle:
   *            Tied to the EntityBridge.
   *
   * Multiplicity:      
   *            One for each entity bean cmp field.             
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
   * @version $Revision: 1.1 $
   */                            
  public class JDBCCMP1xFieldBridge extends JDBCCMPFieldBridge {
        protected Field field;
        
        public JDBCCMP1xFieldBridge(JDBCStoreManager manager, JDBCCMPFieldMetaData 
metadata, Log log) throws DeploymentException {
                super(manager, metadata, log);
  
                try {
                        field = 
metadata.getJDBCEntity().getEntityClass().getField(getFieldName());
                } catch(NoSuchFieldException e) {
                        // Non recoverable internal exception
                        throw new DeploymentException("No field named '" + 
getFieldName() + "' found in entity class.");
                }
        }
  
        public Object getInstanceValue(EntityEnterpriseContext ctx) {
                try {
                        return field.get(ctx.getInstance());
                } catch(Exception e) {
                        // Non recoverable internal exception
                        throw new EJBException("Internal error getting instance field 
" + getFieldName() + ": " + e);
                }
        }
        
     public void setInstanceValue(EntityEnterpriseContext ctx, Object value) {
                try {
                        field.set(ctx.getInstance(), value);
                } catch(Exception e) {
                        // Non recoverable internal exception
                        throw new EJBException("Internal error setting instance field 
" + getFieldName() + ": " + e);
                }
        }
        
    /**
        * Has the value of this field changes since the last time clean was called.
        */
        public boolean isDirty(EntityEnterpriseContext ctx) {
                // read only and primary key fields are never dirty
                if(isReadOnly() || isPrimaryKeyMember()) {
                        return false; 
                }
  
                // has the value changes since setClean
                return changed(getInstanceValue(ctx), 
getFieldState(ctx).originalValue);
        }
        
        /**
        * Mark this field as clean.
        * Saves the current state in context, so it can be compared when isDirty is 
called.
        */
        public void setClean(EntityEnterpriseContext ctx) {
                FieldState fieldState = getFieldState(ctx);
                fieldState.originalValue = getInstanceValue(ctx);
  
                // update last read time
                if(isReadOnly()) {
                        fieldState.lastRead = System.currentTimeMillis();
                }
        }
  
        public boolean isReadTimedOut(EntityEnterpriseContext ctx) {
                if(isReadOnly()) {
                        long readInterval = System.currentTimeMillis() - 
getFieldState(ctx).lastRead; 
                        return readInterval > metadata.getReadTimeOut();
                }
                
                // if we are read/write then we are always timed out
                return true;
        }
        
        public void resetPersistenceContext(EntityEnterpriseContext ctx) {
                if(isReadTimedOut(ctx)) {
                        Map fieldStates = 
((CMPStoreManager.PersistenceContext)ctx.getPersistenceContext()).fieldState;
                        fieldStates.put(this, new FieldState());
                }
        }
  
        private FieldState getFieldState(EntityEnterpriseContext ctx) {
                Map fieldStates = 
((CMPStoreManager.PersistenceContext)ctx.getPersistenceContext()).fieldState;
        FieldState fieldState = (FieldState)fieldStates.get(this);
                if(fieldState == null) {
                        fieldState = new FieldState();
                        fieldStates.put(this, fieldState);
                }
                return fieldState;
        }
  
        private static class FieldState {
                Object originalValue;
                long lastRead = -1;
        }               
  }
  
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMP2xFieldBridge.java
  
  Index: JDBCCMP2xFieldBridge.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
   
  package org.jboss.ejb.plugins.cmp.jdbc.bridge;
  
  import java.util.Map;
  
  import javax.ejb.EJBException;
  
  import org.jboss.ejb.DeploymentException;
  import org.jboss.ejb.EntityEnterpriseContext;
  
  import org.jboss.ejb.plugins.cmp.CMPStoreManager;
  import org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager;
  import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCCMPFieldMetaData;
  
  import org.jboss.logging.Log;
  
  /**
   * JDBCCMP2xFieldBridge is a concrete implementation of JDBCCMPFieldBridge for 
   * CMP version 2.x. Instance data is stored in the entity persistence context.
   * When every a field is changed it is compared to the current value and sets
   * a dirty flag if the value has changed.
   *
   * Life-cycle:
   *            Tied to the EntityBridge.
   *
   * Multiplicity:      
   *            One for each entity bean cmp field.             
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
   * @version $Revision: 1.1 $
   */                            
  public class JDBCCMP2xFieldBridge extends JDBCCMPFieldBridge {
        public JDBCCMP2xFieldBridge(JDBCStoreManager manager, JDBCCMPFieldMetaData 
metadata, Log log) throws DeploymentException {
                super(manager, metadata, log);
        }
  
        public Object getInstanceValue(EntityEnterpriseContext ctx) {
                FieldState fieldState = getFieldState(ctx);
                if(!fieldState.isLoaded) {
                        manager.loadField(this, ctx);
                        if(!fieldState.isLoaded) {
                                throw new EJBException("Could not load field value: " 
+ getFieldName());
                        }
                }
                return fieldState.value;
        }
        
     public void setInstanceValue(EntityEnterpriseContext ctx, Object value) {
                FieldState fieldState = getFieldState(ctx);
  
                // short-circuit to avoid repetive comparisons
                // if it is not currently loaded or it is already dirty or if it has 
changed
                fieldState.isDirty = !fieldState.isLoaded || fieldState.isDirty || 
changed(fieldState.value, value);
                
                // we are loading the field right now so it isLoaded 
                fieldState.isLoaded = true;
                
                // update current value
                fieldState.value = value;
        }
        
    /**
        * Has the value of this field changes since the last time clean was called.
        */
        public boolean isDirty(EntityEnterpriseContext ctx) {
                // read only and primary key fields are never dirty
                if(isReadOnly() || isPrimaryKeyMember()) {
                        return false; 
                }
                
                return getFieldState(ctx).isDirty;
        }
        
        /**
        * Mark this field as clean.
        * Saves the current state in context, so it can be compared when isDirty is 
called.
        */
        public void setClean(EntityEnterpriseContext ctx) {
                FieldState fieldState = getFieldState(ctx);
                fieldState.isDirty = false;
  
                // update last read time
                if(isReadOnly()) {
                        fieldState.lastRead = System.currentTimeMillis();
                }
        }
        
        public void resetPersistenceContext(EntityEnterpriseContext ctx) {
                if(isReadTimedOut(ctx)) {
                        Map fieldStates = 
((CMPStoreManager.PersistenceContext)ctx.getPersistenceContext()).fieldState;
                        fieldStates.put(this, new FieldState());
                }
        }
        
        public boolean isReadTimedOut(EntityEnterpriseContext ctx) {
                if(isReadOnly()) {
                        long readInterval = System.currentTimeMillis() - 
getFieldState(ctx).lastRead; 
                        return readInterval > metadata.getReadTimeOut();
                }
                
                // if we are read/write then we are always timed out
                return true;
        }
  
        private FieldState getFieldState(EntityEnterpriseContext ctx) {
                Map fieldStates = 
((CMPStoreManager.PersistenceContext)ctx.getPersistenceContext()).fieldState;
        FieldState fieldState = (FieldState)fieldStates.get(this);
                if(fieldState == null) {
                        fieldState = new FieldState();
                        fieldStates.put(this, fieldState);
                }
                return fieldState;
        }
  
        private static class FieldState {
                Object value;
                boolean isLoaded = false;
                boolean isDirty = false;
                long lastRead = -1;
        }
  }
  
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMPFieldBridge.java
  
  Index: JDBCCMPFieldBridge.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
   
  package org.jboss.ejb.plugins.cmp.jdbc.bridge;
  
  import java.lang.reflect.Field;
  
  import java.sql.PreparedStatement;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  
  import javax.ejb.EJBException;
  
  import org.jboss.ejb.DeploymentException;
  import org.jboss.ejb.EntityEnterpriseContext;
  
  import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCCMPFieldMetaData;
  
  import org.jboss.ejb.plugins.cmp.bridge.CMPFieldBridge;
  import org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager;
  import org.jboss.ejb.plugins.cmp.jdbc.JDBCType;
  import org.jboss.ejb.plugins.cmp.jdbc.JDBCUtil;
  
  import org.jboss.logging.Log;
  
  /**
   * JDBCCMPFieldBridge represents one CMP field. This class handles setting 
   * statement parameters and loading results for instance values and primary
   * keys. Most of the heavy lifting of this command is handled by JDBCUtil.
   * It is left to subclasses to implement the logic for getting and setting 
   * instance values and dirty checking, as this is dependent on the CMP 
   * version used.
   *
   * Life-cycle:
   *            Tied to the EntityBridge.
   *
   * Multiplicity:      
   *            One for each entity bean cmp field.             
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
   * @version $Revision: 1.1 $
   */                            
  public abstract class JDBCCMPFieldBridge implements CMPFieldBridge {
        protected JDBCStoreManager manager;
     protected JDBCCMPFieldMetaData metadata;
        protected JDBCType jdbcType;
        protected Log log;
        
        public JDBCCMPFieldBridge(JDBCStoreManager manager, JDBCCMPFieldMetaData 
metadata, Log log) throws DeploymentException {
                this.manager = manager;
                this.metadata = metadata;
                this.log = log;
                
                jdbcType =  manager.getJDBCTypeFactory().getFieldJDBCType(metadata);
        }
  
     public JDBCCMPFieldMetaData getMetaData() {
                return metadata;
        }
  
        public String getFieldName() {
                return metadata.getFieldName();
        }
        
        public Class getFieldType() {
                return metadata.getFieldType();
        }
  
        public boolean isReadOnly() {
                return metadata.isReadOnly();
        }
  
        public abstract boolean isReadTimedOut(EntityEnterpriseContext ctx);
        
        public boolean isPrimaryKeyMember() {
                return metadata.isPrimaryKeyMember();
        }
  
        public Object getPrimaryKeyValue(Object primaryKey) throws 
IllegalArgumentException {
                if(!isPrimaryKeyMember()) {
                        throw new IllegalArgumentException(getFieldName() + " is not a 
member of the primary key.");
                }
                
                try {
                        if(metadata.getPrimaryKeyField() != null) {
                                // Extract this field's value from the primary key.
                                return metadata.getPrimaryKeyField().get(primaryKey);
                        } else {
                                // This field is the primary key, so no extraction is 
necessary.
                                return primaryKey;
                        }
                } catch(Exception e) {
                        // Non recoverable internal exception
                        throw new EJBException("Internal error getting primary key 
field member " + getFieldName() + ": " + e);
                }
        }
  
        public Object setPrimaryKeyValue(Object primaryKey, Object value) throws 
IllegalArgumentException {
                if(!isPrimaryKeyMember()) {
                        throw new IllegalArgumentException(getFieldName() + " is not a 
member of the primary key.");
                }
                
                try {
                        if(metadata.getPrimaryKeyField() != null) {
                                // Extract this field's value from the primary key.
                                metadata.getPrimaryKeyField().set(primaryKey, value);
                                return primaryKey;
                        } else {
                                // This field is the primary key, so no extraction is 
necessary.
                                return value;
                        }
                } catch(Exception e) {
                        // Non recoverable internal exception
                        throw new EJBException("Internal error setting instance field 
" + getFieldName() + ": " + e);
                }
        }
  
        public abstract void resetPersistenceContext(EntityEnterpriseContext ctx);
        
        /**
        * Set CMPFieldValue to Java default value (i.e., 0 or null).
        */
        public void initInstance(EntityEnterpriseContext ctx) {
                if(!isReadOnly()) {
                        Object value;
                        if(getFieldType().equals(boolean.class))  {
                                value = Boolean.FALSE;
                        } else if(getFieldType().equals(byte.class))  {
                                value = new Byte((byte)0);
                        } else if (getFieldType().equals(int.class))  {
                                value = new Integer(0);
                        } else if (getFieldType().equals(long.class))  {
                                value = new Long(0L);
                        } else if (getFieldType().equals(short.class))  {
                                value = new Short((short)0);
                        } else if (getFieldType().equals(char.class))  {
                                value = new Character('\u0000');
                        } else if (getFieldType().equals(double.class))  {
                                value = new Double(0d); 
                        } else if (getFieldType().equals(float.class))  {
                                value = new Float(0f);
                        } else  {
                                value = null;
                        }
        
                        setInstanceValue(ctx, value);
                }
        }               
  
        public JDBCType getJDBCType() {
                return jdbcType;
        }
  
        public int setInstanceParameters(PreparedStatement ps, int parameterIndex, 
EntityEnterpriseContext ctx) {
                Object instanceValue = getInstanceValue(ctx);
                return setArgumentParameters(ps, parameterIndex, instanceValue);
        }       
  
        public int setPrimaryKeyParameters(PreparedStatement ps, int parameterIndex, 
Object primaryKey) throws IllegalArgumentException {
                if(!isPrimaryKeyMember()) {
                        throw new IllegalArgumentException(getFieldName() + " is not a 
member of the primary key.");
                }
                Object primaryKeyValue = getPrimaryKeyValue(primaryKey);
                return setArgumentParameters(ps, parameterIndex, primaryKeyValue);
        }
        
        public int setArgumentParameters(PreparedStatement ps, int parameterIndex, 
Object arg) {
                try {
                        int[] jdbcTypes = getJDBCType().getJDBCTypes();
                        for(int i=0; i<jdbcTypes.length; i++) {
                                Object columnValue = getJDBCType().getColumnValue(i, 
arg);
                                JDBCUtil.setParameter(log, ps, parameterIndex++, 
jdbcTypes[i], columnValue);
                        }
                        return parameterIndex;
                } catch(SQLException e) {
                        // Non recoverable internal exception
                        throw new EJBException("Internal error setting parameters for 
field " + getFieldName() + ": " + e);
                }
        }       
  
        public int loadInstanceResults(ResultSet rs, int parameterIndex, 
EntityEnterpriseContext ctx) {
                try {
                        Object value = getFieldType().newInstance();
                        Class[] javaTypes = getJDBCType().getJavaTypes();
                        for(int i=0; i<javaTypes.length; i++) {
                                Object columnValue = JDBCUtil.getResult(log, rs, 
parameterIndex++, javaTypes[i]);
                                value = getJDBCType().setColumnValue(i, value, 
columnValue);
                        }
                        setInstanceValue(ctx, value);
                        return parameterIndex;
                } catch(EJBException e) {
                        // to avoid double wrap of EJBExceptions
                        throw e;
                } catch(Exception e) {
                        // Non recoverable internal exception
                        throw new EJBException("Internal error getting results for 
field " + getFieldName() + ": " + e);
                }
        }               
        
        public int loadPrimaryKeyResults(ResultSet rs, int parameterIndex, Object[] 
pkRef) throws IllegalArgumentException {
                if(!isPrimaryKeyMember()) {
                        throw new IllegalArgumentException(getFieldName() + " is not a 
member of the primary key.");
                }
  
                try {
                        // get this field's value object from the pk
                        Object value = this.getPrimaryKeyValue(pkRef[0]);
                        
                        // update the value from the result set
                        Class[] javaTypes = getJDBCType().getJavaTypes();
                        for(int i=0; i<javaTypes.length; i++) {
                                Object columnValue = JDBCUtil.getResult(log, rs, 
parameterIndex++, javaTypes[i]);
                                value = getJDBCType().setColumnValue(i, value, 
columnValue);
                        }
                        
                        // set the value back into the pk
                        pkRef[0] = setPrimaryKeyValue(pkRef[0], value); 
                        return parameterIndex;
                } catch(SQLException e) {
                        // Non recoverable internal exception
                        throw new EJBException("Internal error getting results for 
primary key field member " + getFieldName() + ": " + e);
                }
        }               
  
        protected final boolean changed(Object current, Object old) {
                return  
                        (current == null && old != null) ||   // TRUE if I am null and 
I wasn't before   
                (current != null &&                   // TRUE if I was null and now 
I'm not
                                ( old == null || (!current.equals(old)) ) // TRUE if 
i'm not equal to my oldstate 
                        );                                           //   tied to last 
check to assure that current is not null
                                
        }
  }
                                           
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCCMRFieldBridge.java
  
  Index: JDBCCMRFieldBridge.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
   
  package org.jboss.ejb.plugins.cmp.jdbc.bridge;
  
  import java.util.HashSet;
  
  import org.jboss.ejb.plugins.cmp.bridge.CMRFieldBridge;
  import org.jboss.ejb.EntityEnterpriseContext;
  
  /**
   * JDBCCMRFieldBridge a bean relationship. 
   *
   * Life-cycle:
   *            Haven't decided yet.
   *
   * Multiplicity:      
   *            Haven't decided yet. Will be either one per bean relationship role, or
   * one per relationship (shared between two beans).           
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
   * @version $Revision: 1.1 $
   */                            
  public class JDBCCMRFieldBridge implements CMRFieldBridge {
        protected String fieldName;
        protected Class fieldType;
        
        public String getFieldName() {
                return fieldName;
        }
        
        public Class getFieldType() {
                return fieldType;
        }
                
        public Object getValue(EntityEnterpriseContext ctx) {
                return new HashSet(0);
        }
        
     public void setValue(EntityEnterpriseContext ctx, Object value) {
        }
  }
  
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCEntityBridge.java
  
  Index: JDBCEntityBridge.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
   
  package org.jboss.ejb.plugins.cmp.jdbc.bridge;
  
  import java.sql.PreparedStatement;
  import java.sql.ResultSet;
  import java.sql.SQLException;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.Map;
  
  import javax.ejb.EJBException;
  
  import org.jboss.ejb.DeploymentException;
  import org.jboss.ejb.EntityEnterpriseContext;
  
  import org.jboss.ejb.plugins.cmp.CMPStoreManager;
  
  import org.jboss.ejb.plugins.cmp.jdbc.JDBCStoreManager;
  
  import org.jboss.ejb.plugins.cmp.bridge.EntityBridge;
  import org.jboss.ejb.plugins.cmp.bridge.EntityBridgeInvocationHandler;
  import org.jboss.ejb.plugins.cmp.bridge.CMPFieldBridge;
  import org.jboss.ejb.plugins.cmp.bridge.CMRFieldBridge;
  import org.jboss.ejb.plugins.cmp.bridge.SelectorBridge;
  
  import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCEntityMetaData;
  import org.jboss.ejb.plugins.cmp.jdbc.metadata.JDBCCMPFieldMetaData;
  
  
  import org.jboss.proxy.Proxies;
  import org.jboss.proxy.InvocationHandler;
  
  import org.jboss.logging.Log;
  
  /**
   * JDBCEntityBridge follows the Bridge pattern [Gamma et. al, 1995].
   * The main job of this class is to construct the bridge from entity meta data.
   *
   * Life-cycle:
   *            Undefined. Should be tied to CMPStoreManager.
   *
   * Multiplicity:      
   *            One per cmp entity bean type.           
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
   * @version $Revision: 1.1 $
   */                            
  public class JDBCEntityBridge implements EntityBridge {
     protected JDBCEntityMetaData metadata;
        protected JDBCStoreManager manager;
        
        protected JDBCCMPFieldBridge[] cmpFields;
        protected Map cmpFieldsByName;
        protected JDBCCMPFieldBridge[] primaryKeyFields;        
  
        protected JDBCCMRFieldBridge[] cmrFields;
        protected JDBCSelectorBridge[] selectors;
        
        protected JDBCCMPFieldBridge[] eagerLoadFields;
        protected ArrayList lazyLoadGroups;
        
        protected Log log;
  
        public JDBCEntityBridge(JDBCEntityMetaData metadata, Log log, JDBCStoreManager 
manager) throws DeploymentException {
                this.metadata = metadata;                  
                this.log = log;
                this.manager = manager;
                                
                loadCMPFields(metadata);
                loadEagerLoadFields(metadata);
                loadLazyLoadGroups(metadata);
                
                loadCMRFields(metadata);
                loadSelectors(metadata);
        }
  
        protected void loadCMPFields(JDBCEntityMetaData metadata) throws 
DeploymentException {
                // map between field names and field objects
                cmpFieldsByName = new HashMap(metadata.getCMPFieldCount());
                // non primary key cmp fields
                ArrayList cmpFieldList = new ArrayList(metadata.getCMPFieldCount());
                // primary key cmp fields
                ArrayList pkFieldList = new ArrayList(metadata.getCMPFieldCount());
                                        
        // create each field    
                Iterator iter = metadata.getCMPFields();
                while(iter.hasNext()) {
                        JDBCCMPFieldMetaData cmpFieldMetaData = 
(JDBCCMPFieldMetaData)iter.next();
                        JDBCCMPFieldBridge cmpField = createCMPField(metadata, 
cmpFieldMetaData);
                        cmpFieldsByName.put(cmpField.getFieldName(), cmpField);
                        
                        if(cmpField.isPrimaryKeyMember()) {
                                pkFieldList.add(cmpField);
                        } else {
                                cmpFieldList.add(cmpField);
                        }
                
                }
                
                // save the pk fields in the pk field array
                primaryKeyFields = new JDBCCMPFieldBridge[pkFieldList.size()];
                primaryKeyFields = 
(JDBCCMPFieldBridge[])pkFieldList.toArray(primaryKeyFields);         
                
                // add the pk fields to the front of the cmp list, per guarantee above
        cmpFieldList.addAll(0, pkFieldList);
                
                // save the cmp fields in the cmp field array
                cmpFields = new JDBCCMPFieldBridge[cmpFieldList.size()];
                cmpFields = (JDBCCMPFieldBridge[])cmpFieldList.toArray(cmpFields);
        }
  
        protected void loadEagerLoadFields(JDBCEntityMetaData metadata) throws 
DeploymentException {
                ArrayList fields = new ArrayList(metadata.getCMPFieldCount());
                Iterator iter = metadata.getEagerLoadFields();
                while(iter.hasNext()) {
                        JDBCCMPFieldMetaData field = (JDBCCMPFieldMetaData)iter.next();
                        fields.add(getExistingCMPFieldByName(field.getFieldName()));
                }
                eagerLoadFields = new JDBCCMPFieldBridge[fields.size()];
                eagerLoadFields = 
(JDBCCMPFieldBridge[])fields.toArray(eagerLoadFields);
        }
  
        protected void loadLazyLoadGroups(JDBCEntityMetaData metadata) throws 
DeploymentException {
                lazyLoadGroups = new ArrayList();
                
                Iterator groups = metadata.getLazyLoadGroups();
                while(groups.hasNext()) {
                        ArrayList group = new ArrayList();
  
                        Iterator fields = ((ArrayList)groups.next()).iterator();
                        while(fields.hasNext()) {
                                JDBCCMPFieldMetaData field = 
(JDBCCMPFieldMetaData)fields.next();
                                
group.add(getExistingCMPFieldByName(field.getFieldName()));
                        }
                        lazyLoadGroups.add(group);
                }
        }
  
        protected JDBCCMPFieldBridge createCMPField(JDBCEntityMetaData metadata, 
JDBCCMPFieldMetaData cmpFieldMetaData) 
                        throws DeploymentException {
                if(metadata.isCMP1x()) {
                        return new JDBCCMP1xFieldBridge(manager, cmpFieldMetaData, 
log);
                } else {
                        return new JDBCCMP2xFieldBridge(manager, cmpFieldMetaData, 
log);
                }
        }
        
        protected void loadCMRFields(JDBCEntityMetaData metadata) {
                cmrFields = new JDBCCMRFieldBridge[0];
        }
  
        protected void loadSelectors(JDBCEntityMetaData metadata) {
                selectors = new JDBCSelectorBridge[0];
        }
        
        public String getEntityName() {
                return metadata.getName();;
        }
  
        public JDBCEntityMetaData getMetaData() {
                return metadata;
        }
        
        public Class getPrimaryKeyClass() {
                return metadata.getPrimaryKeyClass();
        }
        
        public CMPFieldBridge[] getPrimaryKeyFields() {
                return primaryKeyFields;
        }
        
        public JDBCCMPFieldBridge[] getJDBCPrimaryKeyFields() {
                return primaryKeyFields;
        }
        
        public CMPFieldBridge[] getCMPFields() {
                return cmpFields;
        }
  
        public JDBCCMPFieldBridge[] getEagerLoadFields() {
                return eagerLoadFields;
        }
  
        public Iterator getLazyLoadGroups() {
                return lazyLoadGroups.iterator();
        }
  
        public JDBCCMPFieldBridge[] getJDBCCMPFields() {
                return cmpFields;
        }
  
        public JDBCCMPFieldBridge getCMPFieldByName(String name) {
                return (JDBCCMPFieldBridge)cmpFieldsByName.get(name);
        }
        
        protected JDBCCMPFieldBridge getExistingCMPFieldByName(String name) throws 
DeploymentException {
                JDBCCMPFieldBridge cmpField = getCMPFieldByName(name);
                if(cmpField == null) {
                        throw new DeploymentException("cmpField not found: " + name);
                }
                return cmpField;
        }
        
        public CMRFieldBridge[] getCMRFields() {
                return cmrFields;
        }
        
        public JDBCCMRFieldBridge[] getJDBCCMRFields() {
                return cmrFields;
        }
        
        public SelectorBridge[] getSelectors() {
                return selectors;
        }
  
        public JDBCSelectorBridge[] getJDBCSelectors() {
                return selectors;
        }
  
        public void initInstance(EntityEnterpriseContext ctx) {
                for(int i=0; i<cmpFields.length; i++) {
                        cmpFields[i].initInstance(ctx);
                }
        }
  
        public void setClean(EntityEnterpriseContext ctx) {
                for(int i=0; i<cmpFields.length; i++) {
                        cmpFields[i].setClean(ctx);
                }
        }
  
        public CMPFieldBridge[] getDirtyFields(EntityEnterpriseContext ctx) {
                ArrayList dirtyFields = new ArrayList(cmpFields.length);
                for(int i=0; i<cmpFields.length; i++) {
                        if(cmpFields[i].isDirty(ctx)) {
                                dirtyFields.add(cmpFields[i]);
                        }
                }
                JDBCCMPFieldBridge[] dirtyFieldArray = new 
JDBCCMPFieldBridge[dirtyFields.size()];
                return (JDBCCMPFieldBridge[])dirtyFields.toArray(dirtyFieldArray);
        }
        
        public void initPersistenceContext(EntityEnterpriseContext ctx) {
                log.debug("Initializing persistence context id="+ctx.getId());
                
                // If we have an EJB 2.0 dynaymic proxy,
                // notify the handler of the assigned context.
                Object instance = ctx.getInstance();
                if(instance instanceof Proxies.ProxyTarget) {
                        InvocationHandler handler = 
((Proxies.ProxyTarget)instance).getInvocationHandler();
                        if(handler instanceof EntityBridgeInvocationHandler) {
                                
((EntityBridgeInvocationHandler)handler).setContext(ctx);
                        }
                }
  
                ctx.setPersistenceContext(new CMPStoreManager.PersistenceContext());
        }
  
        /**
        * This is only called in commit option B
        */
        public void resetPersistenceContext(EntityEnterpriseContext ctx) {
                log.debug("Reseting persistence context id="+ctx.getId());
  
                for(int i=0; i<cmpFields.length; i++) {
                        cmpFields[i].resetPersistenceContext(ctx);
                }
        }
        
  
        public void destroyPersistenceContext(EntityEnterpriseContext ctx) {
                log.debug("Destroying persistence context id="+ctx.getId());
                
                // If we have an EJB 2.0 dynaymic proxy,
                // notify the handler of the assigned context.
                Object instance = ctx.getInstance();
                if(instance instanceof Proxies.ProxyTarget) {
                        InvocationHandler handler = 
((Proxies.ProxyTarget)instance).getInvocationHandler();
                        if(handler instanceof EntityBridgeInvocationHandler) {
                                
((EntityBridgeInvocationHandler)handler).setContext(null);
                        }
                }
  
                ctx.setPersistenceContext(null);
        }
  
        public CMPStoreManager.PersistenceContext 
getPersistenceContext(EntityEnterpriseContext ctx) {
                return (CMPStoreManager.PersistenceContext)ctx.getPersistenceContext();
        }
  
        // JDBC Specific Information
        
        public int setInstanceParameters(PreparedStatement ps, int parameterIndex, 
EntityEnterpriseContext ctx)  {
        return setInstanceParameters(ps, parameterIndex, ctx, cmpFields);
     }
  
        public int setInstanceParameters(PreparedStatement ps, int parameterIndex, 
EntityEnterpriseContext ctx, JDBCCMPFieldBridge[] fields) {
                for(int i=0; i<fields.length; i++) {
                        parameterIndex = fields[i].setInstanceParameters(ps, 
parameterIndex, ctx);
                }
                return parameterIndex;
     }
  
        public int setPrimaryKeyParameters(PreparedStatement ps, int parameterIndex, 
Object primaryKey) {               
                for(int i=0; i<primaryKeyFields.length; i++) {
                        parameterIndex = 
primaryKeyFields[i].setPrimaryKeyParameters(ps, parameterIndex, primaryKey);
                }
                return parameterIndex;
     }
  
        public int loadInstanceResults(ResultSet rs, int parameterIndex, 
EntityEnterpriseContext ctx) {
                for(int i=0; i<cmpFields.length; i++) {
                        parameterIndex = cmpFields[i].loadInstanceResults(rs, 
parameterIndex, ctx);
                }
                return parameterIndex;
        }
              
        public int loadNonPrimaryKeyResults(ResultSet rs, int parameterIndex, 
EntityEnterpriseContext ctx) {
                for(int i=primaryKeyFields.length; i<cmpFields.length; i++) {
                        parameterIndex = cmpFields[i].loadInstanceResults(rs, 
parameterIndex, ctx);
                }
                return parameterIndex;
        }
              
        public int loadPrimaryKeyResults(ResultSet rs, int parameterIndex, Object[] 
pkRef) {
                for(int i=0; i<primaryKeyFields.length; i++) {
                        parameterIndex = primaryKeyFields[i].loadPrimaryKeyResults(rs, 
parameterIndex, pkRef);
                }
                return parameterIndex;
        }
              
        public Object extractPrimaryKeyFromInstance(EntityEnterpriseContext ctx) {
                try {
                        Object pk = getPrimaryKeyClass().newInstance();
                        for(int i=0; i<primaryKeyFields.length; i++) {
                                Object fieldValue = 
primaryKeyFields[i].getInstanceValue(ctx);
                                
                                // updated pk object with return form set primary key 
value to
                                // handle single valued non-composit pks and more 
complicated behivors.
                                pk = primaryKeyFields[i].setPrimaryKeyValue(pk, 
fieldValue);
                        }
                        return pk;
                } catch(EJBException e) {
                        // to avoid double wrap of EJBExceptions
                        throw e;
                } catch(Exception e) {
                        // Non recoverable internal exception
                        throw new EJBException("Internal error extracting primary key 
from instance: " + e);
                }
        }
  
        public void injectPrimaryKeyIntoInstance(EntityEnterpriseContext ctx, Object 
pk) {
                for(int i=0; i<primaryKeyFields.length; i++) {
                        Object fieldValue = primaryKeyFields[i].getPrimaryKeyValue(pk);
                        primaryKeyFields[i].setInstanceValue(ctx, fieldValue);
                }
        }
  }
  
  
  
  1.1                  
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/bridge/JDBCSelectorBridge.java
  
  Index: JDBCSelectorBridge.java
  ===================================================================
  /*
   * JBoss, the OpenSource EJB server
   *
   * Distributable under LGPL license.
   * See terms of license at gnu.org.
   */
   
  package org.jboss.ejb.plugins.cmp.jdbc.bridge;
  
  /**
   * JDBCSelectorBridge represents one ejbSelect method. 
   *
   * Life-cycle:
   *            Tied to the EntityBridge.
   *
   * Multiplicity:      
   *            One for each entity bean ejbSelect method.              
   *
   * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
   * @version $Revision: 1.1 $
   */                            
  import org.jboss.ejb.plugins.cmp.bridge.SelectorBridge;
  
  public class JDBCSelectorBridge implements SelectorBridge {
        protected String selectorName;
        protected Class returnType;
        
        public String getSelectorName() {
                return selectorName;
        }
        
        public Class getReturnType() {
                return returnType;
        }
                
        public Object execute(Object[] args) {
                return null;
        }
  }
  
  
  

_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
http://lists.sourceforge.net/lists/listinfo/jboss-development

Reply via email to