User: dsundstrom
  Date: 01/11/01 15:10:09

  Modified:    src/main/org/jboss/ejb/plugins/cmp/jdbc JDBCTypeFactory.java
  Log:
  Major rewrite. A JDBCType object can now be obtained for any class.  This
  required for some raw-sql and dynamic-sql result set loading.
  
  Revision  Changes    Path
  1.6       +146 -63   
jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeFactory.java
  
  Index: JDBCTypeFactory.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/cmp/jdbc/JDBCTypeFactory.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- JDBCTypeFactory.java      2001/09/01 22:03:15     1.5
  +++ JDBCTypeFactory.java      2001/11/01 23:10:09     1.6
  @@ -29,36 +29,75 @@
    * this class is to flatten the JDBCValueClassMetaData into columns.
    * 
    * @author <a href="mailto:[EMAIL PROTECTED]";>Dain Sundstrom</a>
  - * @version $Revision: 1.5 $
  + * @version $Revision: 1.6 $
    */
   public class JDBCTypeFactory {
      // the type mapping to use with the specified database
      private JDBCTypeMappingMetaData typeMapping;
      
  -   // all the available dependent value classes (by javaType)
  -   private HashMap valueClasses = new HashMap();
  +   // all known complex types by java class type
  +   private HashMap complexTypes = new HashMap();
   
  -   public JDBCTypeFactory(JDBCTypeMappingMetaData typeMapping, Collection 
dependentValueClasses) {
  +   public JDBCTypeFactory(JDBCTypeMappingMetaData typeMapping,
  +         Collection valueClasses) {
  +
         this.typeMapping = typeMapping;
  -      for(Iterator i = dependentValueClasses.iterator(); i.hasNext(); ) {
  +
  +      HashMap valueClassesByType = new HashMap();
  +      for(Iterator i = valueClasses.iterator(); i.hasNext(); ) {
            JDBCValueClassMetaData valueClass = (JDBCValueClassMetaData)i.next();
  -         valueClasses.put(valueClass.getJavaType(), valueClass);
  +         valueClassesByType.put(valueClass.getJavaType(), valueClass);
         }
  +         
  +      
  +      // convert the value class meta data to a jdbc complex type
  +      for(Iterator i = valueClasses.iterator(); i.hasNext(); ) {
  +         JDBCValueClassMetaData valueClass = (JDBCValueClassMetaData)i.next();
  +         JDBCTypeComplex type = 
  +               createTypeComplex(valueClass, valueClassesByType);
  +         complexTypes.put(valueClass.getJavaType(), type);
  +      }
      }
      
  -   public JDBCType getFieldJDBCType(JDBCCMPFieldMetaData cmpField) {
  -      if(valueClasses.containsKey(cmpField.getFieldType())) {
  -         return createComplexType(cmpField);
  +   public JDBCType getJDBCType(Class javaType) {
  +      if(complexTypes.containsKey(javaType)) {
  +         return (JDBCTypeComplex)complexTypes.get(javaType);
  +      } else {
  +         String sqlType = typeMapping.getSqlTypeForJavaType(javaType);
  +         int jdbcType = typeMapping.getJdbcTypeForJavaType(javaType);
  +         return new JDBCTypeSimple(null, javaType, jdbcType, sqlType);
  +      }
  +   }
  +
  +   public JDBCType getJDBCType(JDBCCMPFieldMetaData cmpField) {
  +      if(complexTypes.containsKey(cmpField.getFieldType())) {
  +         return createTypeComplex(cmpField);
         } else {
  -         return createSimpleType(cmpField);
  +         return createTypeSimple(cmpField);
         }
      }
   
      public int getJDBCTypeForJavaType(Class clazz) {      
         return typeMapping.getJdbcTypeForJavaType(clazz);
      }
  +
  +   private JDBCTypeComplex createTypeComplex(
  +         JDBCValueClassMetaData valueClass,
  +         HashMap valueClassesByType) {
  +
  +      // get the properties
  +      ArrayList propertyList = createComplexProperties(valueClass,
  +            valueClassesByType, new PropertyStack());
  +      
  +      // transform properties into an array
  +      JDBCTypeComplexProperty[] properties = 
  +            new JDBCTypeComplexProperty[propertyList.size()];
  +      properties = (JDBCTypeComplexProperty[])propertyList.toArray(properties); 
  +      
  +      return new JDBCTypeComplex(properties, valueClass.getJavaType());      
  +   }
   
  -   private JDBCType createSimpleType(JDBCCMPFieldMetaData cmpField) {
  +   private JDBCTypeSimple createTypeSimple(JDBCCMPFieldMetaData cmpField) {
         String columnName = cmpField.getColumnName();
         Class javaType = cmpField.getFieldType();
         
  @@ -74,106 +113,144 @@
         return new JDBCTypeSimple(columnName, javaType, jdbcType, sqlType);
      }      
   
  -   private JDBCType createComplexType(JDBCCMPFieldMetaData cmpField) {
  -      JDBCValueClassMetaData valueClass = 
(JDBCValueClassMetaData)valueClasses.get(cmpField.getFieldType());
  +   private JDBCTypeComplex createTypeComplex(JDBCCMPFieldMetaData cmpField) {
  +      // get the default properties for a field of its type
  +      JDBCTypeComplex type = 
  +            (JDBCTypeComplex)complexTypes.get(cmpField.getFieldType());
  +      JDBCTypeComplexProperty[] defaultProperties = type.getProperties();
   
  -      // get the properties
  -      ArrayList propertyList = createComplexProperties(valueClass, new 
PropertyStack(cmpField));
  -      
  -      // transform properties into an array
  -      JDBCTypeComplexProperty[] properties = new 
JDBCTypeComplexProperty[propertyList.size()];
  -      properties = (JDBCTypeComplexProperty[])propertyList.toArray(properties); 
  -      
  -
  -      // create a map between propertyNames and the override
  +      // create a map of the overrides based on flat property name
         HashMap overrides = new HashMap();
         Iterator iterator = cmpField.getPropertyOverrides().iterator();
         while(iterator.hasNext()) {
  -         JDBCCMPFieldPropertyMetaData p = 
(JDBCCMPFieldPropertyMetaData)iterator.next();
  +         JDBCCMPFieldPropertyMetaData p = 
  +               (JDBCCMPFieldPropertyMetaData)iterator.next();
            overrides.put(p.getPropertyName(), p);
         }
  -            
  +
  +      // array that will hold the final properites after overrides
  +      JDBCTypeComplexProperty[] finalProperties = 
  +            new JDBCTypeComplexProperty[defaultProperties.length];
  +
         // override property default values
  -      JDBCCMPFieldPropertyMetaData override;
  -      for(int i=0; i<properties.length; i++) {
  +      for(int i=0; i<defaultProperties.length; i++) {
            
            // pop off the override, if present
  -         override = 
(JDBCCMPFieldPropertyMetaData)overrides.remove(properties[i].getPropertyName());
  +         JDBCCMPFieldPropertyMetaData override;
  +         override = (JDBCCMPFieldPropertyMetaData)overrides.remove(
  +               defaultProperties[i].getPropertyName());
            
  -         if(override != null) {   
  +         if(override == null) { 
  +            finalProperties[i] = defaultProperties[i];
  +         } else {
               // columnName
  -            if(override.getColumnName() != null) {
  -               properties[i].setColumnName(override.getColumnName());
  +            String columnName = override.getColumnName();
  +            if(columnName == null) {
  +               columnName = cmpField.getColumnName() + "_" + 
  +                     defaultProperties[i].getColumnName();
               }
               
               // sql and jdbc type
  -            if(override.getSQLType() != null) {
  -               properties[i].setSQLType(override.getSQLType());
  -               properties[i].setJDBCType(override.getJDBCType());
  +            String sqlType = override.getSQLType();
  +            int jdbcType;
  +            if(sqlType != null) {
  +               jdbcType = override.getJDBCType();
  +            } else {
  +               sqlType = defaultProperties[i].getSQLType();
  +               jdbcType = defaultProperties[i].getJDBCType();
               }
  +
  +            finalProperties[i] = new JDBCTypeComplexProperty(
  +                  defaultProperties[i],
  +                  columnName,
  +                  jdbcType,
  +                  sqlType);
            }   
         }
         
         // did we find all overriden properties
         if(overrides.size() > 0) {
            String propertyName = (String)overrides.keySet().iterator().next();
  -         throw new EJBException("Property " + propertyName + " in field " + 
cmpField.getFieldName() +
  -               " is not a property of value object " + 
cmpField.getFieldType().getName());
  +         throw new EJBException("Property " + propertyName + " in field " +
  +               cmpField.getFieldName() + " is not a property of value object " +
  +               cmpField.getFieldType().getName());
         }
         
         // return the new complex type
  -      return new JDBCTypeComplex(properties, cmpField.getFieldType());      
  +      return new JDBCTypeComplex(finalProperties, cmpField.getFieldType());      
      }
   
  -   protected ArrayList createComplexProperties(JDBCValueClassMetaData valueClass, 
PropertyStack propertyStack) {
  +   private ArrayList createComplexProperties(
  +         JDBCValueClassMetaData valueClass,
  +         HashMap valueClassesByType,
  +         PropertyStack propertyStack) {
  +
         ArrayList properties = new ArrayList();
         
  -      JDBCValuePropertyMetaData propertyMetaData;
  +      // add the properties each property to the list
         Iterator iterator = valueClass.getProperties().iterator();
         while(iterator.hasNext()) {
  -         propertyMetaData = (JDBCValuePropertyMetaData) iterator.next();
  -         properties.addAll(createComplexProperties(propertyMetaData, 
propertyStack));
  +         JDBCValuePropertyMetaData propertyMetaData = 
  +               (JDBCValuePropertyMetaData) iterator.next();
  +         properties.addAll(createComplexProperties(propertyMetaData,
  +               valueClassesByType, propertyStack));
         }
         return properties;
      }
   
  -   protected ArrayList createComplexProperties(JDBCValuePropertyMetaData 
propertyMetaData, PropertyStack propertyStack) {
  -      // push my data 
  +   private ArrayList createComplexProperties(
  +         JDBCValuePropertyMetaData propertyMetaData,
  +         HashMap valueClassesByType,
  +         PropertyStack propertyStack) {
  +      
  +      // push my data onto the stack
         propertyStack.pushPropertyMetaData(propertyMetaData);
   
         ArrayList properties = new ArrayList();
         
         Class javaType = propertyMetaData.getPropertyType();      
  -      if(!valueClasses.containsKey(javaType)) {
  +      if(!complexTypes.containsKey(javaType)) {
            
  -         // this is a simple property         
  -         JDBCTypeComplexProperty property = new JDBCTypeComplexProperty();
  -         property.setJavaType(javaType);
  -         property.setPropertyName(propertyStack.getPropertyName());
  -         property.setColumnName(propertyStack.getColumnName());
  -         property.setGetters(propertyStack.getGetters());
  -         property.setSetters(propertyStack.getSetters());
  -
  -         if(propertyMetaData.getSqlType() != null) {
  -            property.setSQLType(propertyMetaData.getSqlType());
  -            property.setJDBCType(propertyMetaData.getJDBCType());
  +         // this property is a simple type
  +         // which makes this the end of the line for recursion
  +         String propertyName  = propertyStack.getPropertyName();
  +         String columnName = propertyStack.getColumnName();
  +
  +         String sqlType = propertyMetaData.getSqlType();
  +         int jdbcType;
  +         if(sqlType != null) {
  +            jdbcType = propertyMetaData.getJDBCType();
            } else {
               // get jdbcType and sqlType from typeMapping
  -            property.setSQLType(typeMapping.getSqlTypeForJavaType(javaType));
  -            property.setJDBCType(typeMapping.getJdbcTypeForJavaType(javaType));
  +            sqlType = typeMapping.getSqlTypeForJavaType(javaType);
  +            jdbcType = typeMapping.getJdbcTypeForJavaType(javaType);
            }
         
  -         properties.add(property);
  +         Method[] getters = propertyStack.getGetters();
  +         Method[] setters = propertyStack.getSetters();
  +
  +         properties.add(new JDBCTypeComplexProperty(
  +                  propertyName,
  +                  columnName,
  +                  javaType,
  +                  jdbcType,
  +                  sqlType,
  +                  getters,
  +                  setters));
            
         } else {
            
  -         // this property is a value object recures
  -         JDBCValueClassMetaData valueClass = 
(JDBCValueClassMetaData)valueClasses.get(javaType);
  -         properties.addAll(createComplexProperties(valueClass, propertyStack));
  +         // this property is a value object, recurse
  +         JDBCValueClassMetaData valueClass = 
  +               (JDBCValueClassMetaData)valueClassesByType.get(javaType);
  +         properties.addAll(createComplexProperties(
  +                  valueClass,
  +                  valueClassesByType,
  +                  propertyStack));
            
         }
         
  -      // pop my data 
  +      // pop my data, back off 
         propertyStack.popPropertyMetaData();
         
         return properties;
  @@ -186,18 +263,24 @@
         ArrayList getters = new ArrayList();
         ArrayList setters = new ArrayList();
         
  +      public PropertyStack() {
  +      }
  +      
         public PropertyStack(JDBCCMPFieldMetaData cmpField) {
            columnNames.add(cmpField.getColumnName());
         }
      
  -      public void pushPropertyMetaData(JDBCValuePropertyMetaData propertyMetaData) {
  +      public void pushPropertyMetaData(
  +            JDBCValuePropertyMetaData propertyMetaData) {
  +
            propertyNames.add(propertyMetaData.getPropertyName());
            columnNames.add(propertyMetaData.getColumnName());
            getters.add(propertyMetaData.getGetter());
            setters.add(propertyMetaData.getSetter());
   
            if(properties.contains(propertyMetaData)) {
  -            throw new EJBException("Circular reference discoverd at property: " + 
getPropertyName());
  +            throw new EJBException("Circular reference discoverd at " +
  +                  "property: " + getPropertyName());
            }
            properties.add(propertyMetaData);
         }
  
  
  

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

Reply via email to