User: danch   
  Date: 02/02/25 09:17:39

  Modified:    src/main/org/jboss/ejb/plugins/jaws/metadata Tag: Branch_2_4
                        CMPFieldMetaData.java
  Log:
  made some log messages more informative
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.6.4.3   +523 -516  
jboss/src/main/org/jboss/ejb/plugins/jaws/metadata/CMPFieldMetaData.java
  
  Index: CMPFieldMetaData.java
  ===================================================================
  RCS file: 
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/jaws/metadata/CMPFieldMetaData.java,v
  retrieving revision 1.6.4.2
  retrieving revision 1.6.4.3
  diff -u -r1.6.4.2 -r1.6.4.3
  --- CMPFieldMetaData.java     20 Nov 2001 09:42:51 -0000      1.6.4.2
  +++ CMPFieldMetaData.java     25 Feb 2002 17:17:38 -0000      1.6.4.3
  @@ -1,516 +1,523 @@
  -/*
  - * JBoss, the OpenSource EJB server
  - *
  - * Distributable under LGPL license.
  - * See terms of license at gnu.org.
  - */
  -package org.jboss.ejb.plugins.jaws.metadata;
  -
  -import java.lang.reflect.Field;
  -import java.lang.reflect.InvocationTargetException;
  -import java.sql.Types;
  -import java.util.ArrayList;
  -import java.util.Iterator;
  -import java.util.StringTokenizer;
  -import org.w3c.dom.Element;
  -
  -import org.jboss.deployment.DeploymentException;
  -import org.jboss.metadata.XmlLoadable;
  -import org.jboss.metadata.MetaData;
  -import org.jboss.metadata.EjbRefMetaData;
  -
  -import org.jboss.logging.Logger;
  -
  -/**
  - *   This class holds all the information jaws needs to know about a CMP field
  - *  It loads its data from standardjaws.xml and jaws.xml
  - *
  - *   @see <related>
  - *   @author <a href="[EMAIL PROTECTED]">Sebastien Alborini</a>
  - *  @author <a href="mailto:[EMAIL PROTECTED]";>Dirk Zimmermann</a>
  - *  @author <a href="mailto:[EMAIL PROTECTED]";>Vincent Harcq</a>
  - *   @version $Revision: 1.6.4.2 $
  - */
  -public class CMPFieldMetaData extends MetaData implements XmlLoadable
  -{
  -   // Constants -----------------------------------------------------
  -   static Logger log = Logger.getLogger(CMPFieldMetaData.class);
  -   // Attributes ----------------------------------------------------
  -   
  -   // the entity this field belongs to
  -   private JawsEntityMetaData jawsEntity;
  -   
  -   // name of the field
  -   private String name;
  -   
  -   // the actual Field in the bean implementation
  -   private Field field;
  -   
  -   // the jdbc type (see java.sql.Types), used in PreparedStatement.setParameter
  -   private int jdbcType;
  -   // true if jdbcType has been initialized
  -   private boolean validJdbcType;
  -   
  -   // the sql type, used for table creation.
  -   private String sqlType;
  -   
  -   // the column name in the table
  -   private String columnName;
  -   
  -   private boolean isAPrimaryKeyField;
  -   
  -   
  -   /**
  -    * We need this for nested field retrieval.
  -    */
  -   private String ejbClassName;
  -   
  -   /**
  -    * We need this for nested fields. We could compute it from ejbClassName on the 
fly,
  -    * but it's faster to set it once and cache it.
  -    */
  -   private Class ejbClass;
  -   
  -   /**
  -    * Is true for fields like "data.categoryPK".
  -    */
  -   private boolean isNested;
  -   
  -   // Static --------------------------------------------------------
  -   
  -   // Constructors --------------------------------------------------
  -   public CMPFieldMetaData(String name, JawsEntityMetaData jawsEntity) throws 
DeploymentException
  -   {
  -      this.name = name;
  -      this.jawsEntity = jawsEntity;
  -      
  -      // save the class name for nested fields
  -      ejbClassName = jawsEntity.getEntity().getEjbClass();
  -      ejbClassName = jawsEntity.getEntity().getEjbClass();
  -      
  -      try
  -      {
  -         // save the class for nested fields
  -         ejbClass = 
jawsEntity.getJawsApplication().getClassLoader().loadClass(ejbClassName);
  -         field = ejbClass.getField(name);
  -      } catch (ClassNotFoundException e)
  -      {
  -         throw new DeploymentException("ejb class not found: " + ejbClassName);
  -      } catch (NoSuchFieldException e)
  -      {
  -         // we can't throw an Exception here, because we could have a nested field
  -         checkField();
  -      }
  -      
  -      // default, may be overridden by importXml
  -      columnName = getLastComponent(name);
  -      
  -      // cannot set defaults for jdbctype/sqltype, type mappings are not loaded yet.
  -   }
  -   
  -   
  -   // Public --------------------------------------------------------
  -   public String getName()
  -   { return name; }
  -   
  -   public Field getField()
  -   { return field; }
  -   
  -   public int getJDBCType()
  -   {
  -      if (! validJdbcType)
  -      {
  -         // set the default
  -         if (field!=null)
  -            jdbcType = 
jawsEntity.getJawsApplication().getTypeMapping().getJdbcTypeForJavaType(field.getType());
  -         else
  -         {
  -            try
  -            {
  -               jdbcType = 
jawsEntity.getJawsApplication().getTypeMapping().getJdbcTypeForJavaType(ValueObjectHelper.getNestedFieldType(ejbClass,name));
  -            } catch(NoSuchMethodException e)
  -            {
  -               log.warn("ERROR : Nested Field does not have a get method");
  -            }
  -         }
  -         validJdbcType = true;
  -      }
  -      return jdbcType;
  -   }
  -   
  -   public String getSQLType()
  -   {
  -      if (sqlType == null)
  -      {
  -         // set the default
  -         if (field!=null)
  -            sqlType = 
jawsEntity.getJawsApplication().getTypeMapping().getSqlTypeForJavaType(field.getType());
  -         else
  -         {
  -            try
  -            {
  -               sqlType = 
jawsEntity.getJawsApplication().getTypeMapping().getSqlTypeForJavaType(ValueObjectHelper.getNestedFieldType(ejbClass,name));
  -            } catch(NoSuchMethodException e)
  -            {
  -               log.warn("ERROR : Nested Field does not have a get method");
  -            }
  -         }
  -      }
  -      return sqlType;
  -   }
  -   
  -   public String getColumnName()
  -   { return columnName; }
  -   
  -   public boolean isEJBReference()
  -   { return jdbcType == Types.REF; }
  -   
  -   public boolean isAPrimaryKeyField()
  -   { return isAPrimaryKeyField; }
  -   
  -   public JawsEntityMetaData getJawsEntity()
  -   { return jawsEntity; }
  -   
  -   /**
  -    * Returns the last component of a composite fieldName. E.g., for 
"data.categoryPK" it
  -    * will return "categoryPK".
  -    */
  -   public static String getLastComponent(String name)
  -   {
  -      String fieldName = name;
  -      StringTokenizer st = new StringTokenizer(name, ".");
  -      while(st.hasMoreTokens())
  -      {
  -         fieldName = st.nextToken();
  -      }
  -      return fieldName;
  -   }
  -   
  -   /**
  -    * Returns the first component of a composite fieldName. E.g., for 
"data.categoryPK" it
  -    * will return "data".
  -    */
  -   public static String getFirstComponent(String name)
  -   {
  -      String fieldName;
  -      StringTokenizer st = new StringTokenizer(name, ".");
  -      if (st.hasMoreTokens())
  -      {
  -         fieldName = st.nextToken();
  -      }
  -      else
  -      {
  -         fieldName = null;
  -      }
  -      return fieldName;
  -   }
  -   
  -   /**
  -    * Detects the actual field of a nested field and sets field accordingly.
  -    * If field doesn't exist, throws a DeploymentException.
  -    */
  -   private void checkField() throws DeploymentException
  -   {
  -      try
  -      {
  -         field = verifyNestedField();
  -      }
  -      catch(DeploymentException e)
  -      {
  -         // try it again, but debug Class before :))
  -         debugClass(ejbClass);
  -         field = verifyNestedField();
  -         log.warn("!!! using buggy hotspot, try to upgrade ... !!!");
  -      }
  -   }
  -   
  -   /**
  -    * Traverses and verifies a nested field, so that every field given in jaws.xml
  -    * exists in the Bean.
  -    */
  -   private Field verifyNestedField() throws DeploymentException
  -   {
  -      String fieldName = null;
  -      Field tmpField = null;
  -      Class tmpClass = ejbClass;
  -      StringTokenizer st = new StringTokenizer(name, ".");
  -      
  -      if (st.countTokens() > 1)
  -      {
  -         isNested = true;
  -      }
  -      
  -      while(st.hasMoreTokens())
  -      {
  -         fieldName = st.nextToken();
  -         try
  -         {
  -            //debugClass(tmpClass);
  -            tmpField = tmpClass.getField(fieldName);
  -            tmpClass = tmpField.getType();
  -            log.debug("(Dependant Object) "+tmpField.getName());
  -         }
  -         catch (NoSuchFieldException e)
  -         {
  -            // we can have a private attribute, then we will use fieldName
  -            // to find the get/set methods, but still have to set jdbcType/SQLType
  -            // but can not yet do it sowe have to set field to null so that
  -            // getJDBCType will not use the parent Field to find the types
  -            field = null;
  -            return null;
  -         }
  -      }
  -      return tmpField;
  -   }
  -   
  -   /**
  -    * We don't rely on the field alone for getting the type since we support nested 
field
  -    * like 'data.categoryPK'.
  -    */
  -   public Class getFieldType()
  -   {
  -      if (field != null)
  -      {
  -         // The default case as it always was :)
  -         return field.getType();
  -      }
  -      
  -      // We obviously have a nested field (or an erroneous one)
  -      Field tmpField = null;
  -      Class tmpClass = ejbClass;
  -      String fieldName = null;
  -      StringTokenizer st = new StringTokenizer(name, ".");
  -      while(st.hasMoreTokens())
  -      {
  -         fieldName = st.nextToken();
  -         try
  -         {
  -            tmpField = tmpClass.getField(fieldName);
  -            tmpClass = tmpField.getType();
  -         }
  -         catch (NoSuchFieldException e)
  -         {
  -            // We have a nested Field
  -            try
  -            {
  -               return ValueObjectHelper.getNestedFieldType(ejbClass,name);
  -            }
  -            catch (NoSuchMethodException ne)
  -            {
  -               log.warn("Nested field "+fieldName+" does not have a get method on 
"+ejbClass.getName());
  -               return null;
  -            }
  -         }
  -      }
  -      return tmpField.getType();
  -   }
  -   
  -   /**
  -    * Is used mainly for nested fields. Sets the value of a nested field.
  -    */
  -   public void set(Object instance, Object value)
  -   {
  -      Field tmpField = null;
  -      String fieldName = null;
  -      Object currentObject = instance;
  -      Object oldObject;
  -      StringTokenizer st = new StringTokenizer(name, ".");
  -      //log.debug("set on cmp-field "+name+"="+value);
  -      // First we instanciate nested objects if they do not already exist
  -      int i=1;
  -      int tot=st.countTokens();
  -      while (st.hasMoreTokens() && (i < tot) )
  -      {
  -         i++;
  -         fieldName = st.nextToken();
  -         //log.debug("initialize "+fieldName+ " on "+currentObject.getClass());
  -         oldObject = currentObject;
  -         try
  -         {
  -            tmpField = currentObject.getClass().getField(fieldName);
  -            currentObject = tmpField.get(currentObject);
  -            // On our path, we have to instantiate every intermediate object
  -            if (currentObject == null)
  -            {
  -               currentObject = tmpField.getType().newInstance();
  -               tmpField.set(oldObject, currentObject);
  -            }
  -         }
  -         catch (NoSuchFieldException ne)
  -         {
  -            try
  -            {
  -               currentObject = ValueObjectHelper.getValue(currentObject,fieldName);
  -               if (currentObject == null)
  -               {
  -                  currentObject = 
ValueObjectHelper.getNestedFieldType(oldObject.getClass(),fieldName).newInstance();
  -                  ValueObjectHelper.setValue(oldObject,fieldName,currentObject);
  -               }
  -            }
  -            catch (NoSuchMethodException e)
  -            {
  -               log.warn("set method not found for " + fieldName + " on " + 
oldObject.getClass().getName());
  -            }
  -            catch (InvocationTargetException e)
  -            {
  -               log.warn("set method not invocable " + fieldName + " on " + 
currentObject.getClass().getName());
  -            }
  -            catch (IllegalAccessException e)
  -            {
  -               log.warn("!!! Deployment Failure !!!" + e);
  -            }
  -            catch (InstantiationException e)
  -            {
  -               log.warn("could not instantiate " + tmpField);
  -            }
  -         }
  -         catch (IllegalAccessException e)
  -         {
  -            log.warn("!!! Deployment Failure !!!" + e);
  -         }
  -         catch (InstantiationException e)
  -         {
  -            log.warn("could not instantiate " + tmpField);
  -         }
  -         catch (Exception e)
  -         {
  -            log.warn("Exception " + e);
  -         }
  -      }
  -      //log.debug("initialization of nested objects done for "+name);
  -      // Now we set the value of the last component into the created object
  -      try
  -      {
  -         try
  -         {
  -            Field dataField = 
currentObject.getClass().getField(getLastComponent(name));
  -            dataField.set(currentObject, value);
  -         }
  -         catch (NoSuchFieldException nse)
  -         {
  -            //log.debug("set on "+getLastComponent(name)+ " on 
"+currentObject.getClass()+ "="+value);
  -            ValueObjectHelper.setValue(currentObject,getLastComponent(name),value);
  -         }
  -      }
  -      catch (IllegalAccessException e)
  -      {
  -         log.warn("!!! Deployment Failure !!!" + e);
  -      }
  -      catch (InvocationTargetException e)
  -      {
  -         log.warn("set method not invocable " + getLastComponent(name) + " on " + 
currentObject.getClass().getName());
  -      }
  -      catch (NoSuchMethodException e)
  -      {
  -         log.warn("set method not found for " + getLastComponent(name) + " on " + 
currentObject.getClass().getName());
  -      }
  -   }
  -   
  -   /**
  -    * Returns the value of this field.
  -    */
  -   public Object getValue(Object instance)
  -   {
  -      String fieldName;
  -      Object currentObject = instance;
  -      Field currentField;
  -      //Object currentValue = null;
  -      
  -      try
  -      {
  -         if (!isNested())
  -         {
  -            return getField().get(instance);
  -         }
  -         else
  -         {
  -            StringTokenizer st = new StringTokenizer(name, ".");
  -            while(st.hasMoreTokens())
  -            {
  -               fieldName = st.nextToken();
  -               if (currentObject == null) return null;
  -               try
  -               {
  -                  currentField = currentObject.getClass().getField(fieldName);
  -                  currentObject = currentField.get(currentObject);
  -               }
  -               catch(NoSuchFieldException e)
  -               {
  -                  currentField = null;
  -                  currentObject = 
ValueObjectHelper.getValue(currentObject,fieldName);
  -               }
  -            }
  -            return currentObject;
  -         }
  -      }
  -      catch (IllegalAccessException e)
  -      {
  -         // We have already checked the presence of this field in the constructor,
  -         // so there is no need to throw an exception here.
  -         log.warn("!!! CMPFieldMetaData.getValue() ERROR !!! " + e);
  -      }
  -      catch (InvocationTargetException e)
  -      {
  -         log.warn("!!! CMPFieldMetaData.getValue() ERROR !!! " + e);
  -      }
  -      catch (NoSuchMethodException e)
  -      {
  -         log.warn("!!! CMPFieldMetaData.getValue() ERROR !!! " + e);
  -      }
  -      return null;
  -   }
  -   
  -   public boolean isNested()
  -   {
  -      return isNested;
  -   }
  -   
  -   // XmlLoadable implementation ------------------------------------
  -   public void importXml(Element element) throws DeploymentException
  -   {
  -      
  -      // column name
  -      String columnStr = getElementContent(getOptionalChild(element, 
"column-name"));
  -      // For Netsted Properties, we will have a column name blank which means
  -      // the CMPField need to be removed.  It will be reconstrcut and decompose
  -      // by Jaws when needed
  -      if (columnStr != null) columnName = columnStr;
  -      
  -      // jdbc type
  -      String jdbcStr = getElementContent(getOptionalChild(element, "jdbc-type"));
  -      
  -      if (jdbcStr != null)
  -      {
  -         jdbcType = MappingMetaData.getJdbcTypeFromName(jdbcStr);
  -         validJdbcType = true;
  -         
  -         sqlType = getElementContent(getUniqueChild(element, "sql-type"));
  -      }
  -      
  -   }
  -   
  -   
  -   // Package protected ---------------------------------------------
  -   void setPrimary()
  -   {
  -      isAPrimaryKeyField = true;
  -   }
  -   
  -   // Protected -----------------------------------------------------
  -   
  -   // Private -------------------------------------------------------
  -   
  -   /**
  -    * Workaround for certain Hotspot problems. Just traverse all the fields
  -    * in the Class, so Hotspot won't optimize to bad ...
  -    */
  -   private void debugClass(Class debugClass)
  -   {
  -      Field[] fields = debugClass.getFields();
  -      for (int i = 0; i < fields.length; ++i)
  -      {
  -      }
  -   }
  -   
  -   // Inner classes -------------------------------------------------
  -}
  +/*
  + * JBoss, the OpenSource EJB server
  + *
  + * Distributable under LGPL license.
  + * See terms of license at gnu.org.
  + */
  +package org.jboss.ejb.plugins.jaws.metadata;
  +
  +import java.lang.reflect.Field;
  +import java.lang.reflect.InvocationTargetException;
  +import java.sql.Types;
  +import java.util.ArrayList;
  +import java.util.Iterator;
  +import java.util.StringTokenizer;
  +import org.w3c.dom.Element;
  +
  +import org.jboss.deployment.DeploymentException;
  +import org.jboss.metadata.XmlLoadable;
  +import org.jboss.metadata.MetaData;
  +import org.jboss.metadata.EjbRefMetaData;
  +
  +import org.jboss.logging.Logger;
  +
  +/**
  + *   This class holds all the information jaws needs to know about a CMP field
  + *  It loads its data from standardjaws.xml and jaws.xml
  + *
  + *   @see <related>
  + *   @author <a href="[EMAIL PROTECTED]">Sebastien Alborini</a>
  + *  @author <a href="mailto:[EMAIL PROTECTED]";>Dirk Zimmermann</a>
  + *  @author <a href="mailto:[EMAIL PROTECTED]";>Vincent Harcq</a>
  + *   @version $Revision: 1.6.4.3 $
  + *
  + * <p><b>Revisions:</b>
  + * 
  + * <p><b>20020225 danch:</b>
  + * <ul>
  + * <li>Make 'does not have a get method' messages more informative</li>
  + * </ul>
  + */
  +public class CMPFieldMetaData extends MetaData implements XmlLoadable
  +{
  +   // Constants -----------------------------------------------------
  +   static Logger log = Logger.getLogger(CMPFieldMetaData.class);
  +   // Attributes ----------------------------------------------------
  +   
  +   // the entity this field belongs to
  +   private JawsEntityMetaData jawsEntity;
  +   
  +   // name of the field
  +   private String name;
  +   
  +   // the actual Field in the bean implementation
  +   private Field field;
  +   
  +   // the jdbc type (see java.sql.Types), used in PreparedStatement.setParameter
  +   private int jdbcType;
  +   // true if jdbcType has been initialized
  +   private boolean validJdbcType;
  +   
  +   // the sql type, used for table creation.
  +   private String sqlType;
  +   
  +   // the column name in the table
  +   private String columnName;
  +   
  +   private boolean isAPrimaryKeyField;
  +   
  +   
  +   /**
  +    * We need this for nested field retrieval.
  +    */
  +   private String ejbClassName;
  +   
  +   /**
  +    * We need this for nested fields. We could compute it from ejbClassName on the 
fly,
  +    * but it's faster to set it once and cache it.
  +    */
  +   private Class ejbClass;
  +   
  +   /**
  +    * Is true for fields like "data.categoryPK".
  +    */
  +   private boolean isNested;
  +   
  +   // Static --------------------------------------------------------
  +   
  +   // Constructors --------------------------------------------------
  +   public CMPFieldMetaData(String name, JawsEntityMetaData jawsEntity) throws 
DeploymentException
  +   {
  +      this.name = name;
  +      this.jawsEntity = jawsEntity;
  +      
  +      // save the class name for nested fields
  +      ejbClassName = jawsEntity.getEntity().getEjbClass();
  +      ejbClassName = jawsEntity.getEntity().getEjbClass();
  +      
  +      try
  +      {
  +         // save the class for nested fields
  +         ejbClass = 
jawsEntity.getJawsApplication().getClassLoader().loadClass(ejbClassName);
  +         field = ejbClass.getField(name);
  +      } catch (ClassNotFoundException e)
  +      {
  +         throw new DeploymentException("ejb class not found: " + ejbClassName);
  +      } catch (NoSuchFieldException e)
  +      {
  +         // we can't throw an Exception here, because we could have a nested field
  +         checkField();
  +      }
  +      
  +      // default, may be overridden by importXml
  +      columnName = getLastComponent(name);
  +      
  +      // cannot set defaults for jdbctype/sqltype, type mappings are not loaded yet.
  +   }
  +   
  +   
  +   // Public --------------------------------------------------------
  +   public String getName()
  +   { return name; }
  +   
  +   public Field getField()
  +   { return field; }
  +   
  +   public int getJDBCType()
  +   {
  +      if (! validJdbcType)
  +      {
  +         // set the default
  +         if (field!=null)
  +            jdbcType = 
jawsEntity.getJawsApplication().getTypeMapping().getJdbcTypeForJavaType(field.getType());
  +         else
  +         {
  +            try
  +            {
  +               jdbcType = 
jawsEntity.getJawsApplication().getTypeMapping().getJdbcTypeForJavaType(ValueObjectHelper.getNestedFieldType(ejbClass,name));
  +            } catch(NoSuchMethodException e)
  +            {
  +               log.warn("Nested Field "+name+" does not have a get method on 
"+ejbClassName);
  +            }
  +         }
  +         validJdbcType = true;
  +      }
  +      return jdbcType;
  +   }
  +   
  +   public String getSQLType()
  +   {
  +      if (sqlType == null)
  +      {
  +         // set the default
  +         if (field!=null)
  +            sqlType = 
jawsEntity.getJawsApplication().getTypeMapping().getSqlTypeForJavaType(field.getType());
  +         else
  +         {
  +            try
  +            {
  +               sqlType = 
jawsEntity.getJawsApplication().getTypeMapping().getSqlTypeForJavaType(ValueObjectHelper.getNestedFieldType(ejbClass,name));
  +            } catch(NoSuchMethodException e)
  +            {
  +               log.warn("Nested Field "+name+" does not have a get method on 
"+ejbClassName);
  +            }
  +         }
  +      }
  +      return sqlType;
  +   }
  +   
  +   public String getColumnName()
  +   { return columnName; }
  +   
  +   public boolean isEJBReference()
  +   { return jdbcType == Types.REF; }
  +   
  +   public boolean isAPrimaryKeyField()
  +   { return isAPrimaryKeyField; }
  +   
  +   public JawsEntityMetaData getJawsEntity()
  +   { return jawsEntity; }
  +   
  +   /**
  +    * Returns the last component of a composite fieldName. E.g., for 
"data.categoryPK" it
  +    * will return "categoryPK".
  +    */
  +   public static String getLastComponent(String name)
  +   {
  +      String fieldName = name;
  +      StringTokenizer st = new StringTokenizer(name, ".");
  +      while(st.hasMoreTokens())
  +      {
  +         fieldName = st.nextToken();
  +      }
  +      return fieldName;
  +   }
  +   
  +   /**
  +    * Returns the first component of a composite fieldName. E.g., for 
"data.categoryPK" it
  +    * will return "data".
  +    */
  +   public static String getFirstComponent(String name)
  +   {
  +      String fieldName;
  +      StringTokenizer st = new StringTokenizer(name, ".");
  +      if (st.hasMoreTokens())
  +      {
  +         fieldName = st.nextToken();
  +      }
  +      else
  +      {
  +         fieldName = null;
  +      }
  +      return fieldName;
  +   }
  +   
  +   /**
  +    * Detects the actual field of a nested field and sets field accordingly.
  +    * If field doesn't exist, throws a DeploymentException.
  +    */
  +   private void checkField() throws DeploymentException
  +   {
  +      try
  +      {
  +         field = verifyNestedField();
  +      }
  +      catch(DeploymentException e)
  +      {
  +         // try it again, but debug Class before :))
  +         debugClass(ejbClass);
  +         field = verifyNestedField();
  +         log.warn("!!! using buggy hotspot, try to upgrade ... !!!");
  +      }
  +   }
  +   
  +   /**
  +    * Traverses and verifies a nested field, so that every field given in jaws.xml
  +    * exists in the Bean.
  +    */
  +   private Field verifyNestedField() throws DeploymentException
  +   {
  +      String fieldName = null;
  +      Field tmpField = null;
  +      Class tmpClass = ejbClass;
  +      StringTokenizer st = new StringTokenizer(name, ".");
  +      
  +      if (st.countTokens() > 1)
  +      {
  +         isNested = true;
  +      }
  +      
  +      while(st.hasMoreTokens())
  +      {
  +         fieldName = st.nextToken();
  +         try
  +         {
  +            //debugClass(tmpClass);
  +            tmpField = tmpClass.getField(fieldName);
  +            tmpClass = tmpField.getType();
  +            log.debug("(Dependant Object) "+tmpField.getName());
  +         }
  +         catch (NoSuchFieldException e)
  +         {
  +            // we can have a private attribute, then we will use fieldName
  +            // to find the get/set methods, but still have to set jdbcType/SQLType
  +            // but can not yet do it sowe have to set field to null so that
  +            // getJDBCType will not use the parent Field to find the types
  +            field = null;
  +            return null;
  +         }
  +      }
  +      return tmpField;
  +   }
  +   
  +   /**
  +    * We don't rely on the field alone for getting the type since we support nested 
field
  +    * like 'data.categoryPK'.
  +    */
  +   public Class getFieldType()
  +   {
  +      if (field != null)
  +      {
  +         // The default case as it always was :)
  +         return field.getType();
  +      }
  +      
  +      // We obviously have a nested field (or an erroneous one)
  +      Field tmpField = null;
  +      Class tmpClass = ejbClass;
  +      String fieldName = null;
  +      StringTokenizer st = new StringTokenizer(name, ".");
  +      while(st.hasMoreTokens())
  +      {
  +         fieldName = st.nextToken();
  +         try
  +         {
  +            tmpField = tmpClass.getField(fieldName);
  +            tmpClass = tmpField.getType();
  +         }
  +         catch (NoSuchFieldException e)
  +         {
  +            // We have a nested Field
  +            try
  +            {
  +               return ValueObjectHelper.getNestedFieldType(ejbClass,name);
  +            }
  +            catch (NoSuchMethodException ne)
  +            {
  +               log.warn("Nested field "+fieldName+" does not have a get method on 
"+ejbClass.getName());
  +               return null;
  +            }
  +         }
  +      }
  +      return tmpField.getType();
  +   }
  +   
  +   /**
  +    * Is used mainly for nested fields. Sets the value of a nested field.
  +    */
  +   public void set(Object instance, Object value)
  +   {
  +      Field tmpField = null;
  +      String fieldName = null;
  +      Object currentObject = instance;
  +      Object oldObject;
  +      StringTokenizer st = new StringTokenizer(name, ".");
  +      //log.debug("set on cmp-field "+name+"="+value);
  +      // First we instanciate nested objects if they do not already exist
  +      int i=1;
  +      int tot=st.countTokens();
  +      while (st.hasMoreTokens() && (i < tot) )
  +      {
  +         i++;
  +         fieldName = st.nextToken();
  +         //log.debug("initialize "+fieldName+ " on "+currentObject.getClass());
  +         oldObject = currentObject;
  +         try
  +         {
  +            tmpField = currentObject.getClass().getField(fieldName);
  +            currentObject = tmpField.get(currentObject);
  +            // On our path, we have to instantiate every intermediate object
  +            if (currentObject == null)
  +            {
  +               currentObject = tmpField.getType().newInstance();
  +               tmpField.set(oldObject, currentObject);
  +            }
  +         }
  +         catch (NoSuchFieldException ne)
  +         {
  +            try
  +            {
  +               currentObject = ValueObjectHelper.getValue(currentObject,fieldName);
  +               if (currentObject == null)
  +               {
  +                  currentObject = 
ValueObjectHelper.getNestedFieldType(oldObject.getClass(),fieldName).newInstance();
  +                  ValueObjectHelper.setValue(oldObject,fieldName,currentObject);
  +               }
  +            }
  +            catch (NoSuchMethodException e)
  +            {
  +               log.warn("set method not found for " + fieldName + " on " + 
oldObject.getClass().getName());
  +            }
  +            catch (InvocationTargetException e)
  +            {
  +               log.warn("set method not invocable " + fieldName + " on " + 
currentObject.getClass().getName());
  +            }
  +            catch (IllegalAccessException e)
  +            {
  +               log.warn("!!! Deployment Failure !!!" + e);
  +            }
  +            catch (InstantiationException e)
  +            {
  +               log.warn("could not instantiate " + tmpField);
  +            }
  +         }
  +         catch (IllegalAccessException e)
  +         {
  +            log.warn("!!! Deployment Failure !!!" + e);
  +         }
  +         catch (InstantiationException e)
  +         {
  +            log.warn("could not instantiate " + tmpField);
  +         }
  +         catch (Exception e)
  +         {
  +            log.warn("Exception " + e);
  +         }
  +      }
  +      //log.debug("initialization of nested objects done for "+name);
  +      // Now we set the value of the last component into the created object
  +      try
  +      {
  +         try
  +         {
  +            Field dataField = 
currentObject.getClass().getField(getLastComponent(name));
  +            dataField.set(currentObject, value);
  +         }
  +         catch (NoSuchFieldException nse)
  +         {
  +            //log.debug("set on "+getLastComponent(name)+ " on 
"+currentObject.getClass()+ "="+value);
  +            ValueObjectHelper.setValue(currentObject,getLastComponent(name),value);
  +         }
  +      }
  +      catch (IllegalAccessException e)
  +      {
  +         log.warn("!!! Deployment Failure !!!" + e);
  +      }
  +      catch (InvocationTargetException e)
  +      {
  +         log.warn("set method not invocable " + getLastComponent(name) + " on " + 
currentObject.getClass().getName());
  +      }
  +      catch (NoSuchMethodException e)
  +      {
  +         log.warn("set method not found for " + getLastComponent(name) + " on " + 
currentObject.getClass().getName());
  +      }
  +   }
  +   
  +   /**
  +    * Returns the value of this field.
  +    */
  +   public Object getValue(Object instance)
  +   {
  +      String fieldName;
  +      Object currentObject = instance;
  +      Field currentField;
  +      //Object currentValue = null;
  +      
  +      try
  +      {
  +         if (!isNested())
  +         {
  +            return getField().get(instance);
  +         }
  +         else
  +         {
  +            StringTokenizer st = new StringTokenizer(name, ".");
  +            while(st.hasMoreTokens())
  +            {
  +               fieldName = st.nextToken();
  +               if (currentObject == null) return null;
  +               try
  +               {
  +                  currentField = currentObject.getClass().getField(fieldName);
  +                  currentObject = currentField.get(currentObject);
  +               }
  +               catch(NoSuchFieldException e)
  +               {
  +                  currentField = null;
  +                  currentObject = 
ValueObjectHelper.getValue(currentObject,fieldName);
  +               }
  +            }
  +            return currentObject;
  +         }
  +      }
  +      catch (IllegalAccessException e)
  +      {
  +         // We have already checked the presence of this field in the constructor,
  +         // so there is no need to throw an exception here.
  +         log.warn("!!! CMPFieldMetaData.getValue() ERROR !!! " + e);
  +      }
  +      catch (InvocationTargetException e)
  +      {
  +         log.warn("!!! CMPFieldMetaData.getValue() ERROR !!! " + e);
  +      }
  +      catch (NoSuchMethodException e)
  +      {
  +         log.warn("!!! CMPFieldMetaData.getValue() ERROR !!! " + e);
  +      }
  +      return null;
  +   }
  +   
  +   public boolean isNested()
  +   {
  +      return isNested;
  +   }
  +   
  +   // XmlLoadable implementation ------------------------------------
  +   public void importXml(Element element) throws DeploymentException
  +   {
  +      
  +      // column name
  +      String columnStr = getElementContent(getOptionalChild(element, 
"column-name"));
  +      // For Netsted Properties, we will have a column name blank which means
  +      // the CMPField need to be removed.  It will be reconstrcut and decompose
  +      // by Jaws when needed
  +      if (columnStr != null) columnName = columnStr;
  +      
  +      // jdbc type
  +      String jdbcStr = getElementContent(getOptionalChild(element, "jdbc-type"));
  +      
  +      if (jdbcStr != null)
  +      {
  +         jdbcType = MappingMetaData.getJdbcTypeFromName(jdbcStr);
  +         validJdbcType = true;
  +         
  +         sqlType = getElementContent(getUniqueChild(element, "sql-type"));
  +      }
  +      
  +   }
  +   
  +   
  +   // Package protected ---------------------------------------------
  +   void setPrimary()
  +   {
  +      isAPrimaryKeyField = true;
  +   }
  +   
  +   // Protected -----------------------------------------------------
  +   
  +   // Private -------------------------------------------------------
  +   
  +   /**
  +    * Workaround for certain Hotspot problems. Just traverse all the fields
  +    * in the Class, so Hotspot won't optimize to bad ...
  +    */
  +   private void debugClass(Class debugClass)
  +   {
  +      Field[] fields = debugClass.getFields();
  +      for (int i = 0; i < fields.length; ++i)
  +      {
  +      }
  +   }
  +   
  +   // Inner classes -------------------------------------------------
  +}
  
  
  

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

Reply via email to