You are viewing a plain text version of this content. The canonical link for it is here.
Posted to ojb-dev@db.apache.org by ar...@apache.org on 2005/05/07 18:43:06 UTC

cvs commit: db-ojb/src/java/org/apache/ojb/broker/metadata ClassDescriptor.java RepositoryXmlHandler.java SuperReferenceDescriptor.java

arminw      2005/05/07 09:43:06

  Modified:    src/java/org/apache/ojb/broker/accesslayer/sql Tag:
                        OJB_1_0_RELEASE SqlSelectStatement.java
               src/java/org/apache/ojb/broker/accesslayer Tag:
                        OJB_1_0_RELEASE RowReaderDefaultImpl.java
                        StatementsForClassImpl.java
               src/java/org/apache/ojb/broker/core Tag: OJB_1_0_RELEASE
                        PersistenceBrokerImpl.java
               src/java/org/apache/ojb/broker/metadata Tag: OJB_1_0_RELEASE
                        ClassDescriptor.java RepositoryXmlHandler.java
                        SuperReferenceDescriptor.java
  Log:
  - add TODO comment for inchoate "extends" attribute in class-descriptor, this stuff is not working for a long time (years). Think we should discard the source code in classes.
  - update "super"-reference inheritance
  
  Revision  Changes    Path
  No                   revision
  No                   revision
  1.22.2.3  +10 -3     db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java
  
  Index: SqlSelectStatement.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/sql/SqlSelectStatement.java,v
  retrieving revision 1.22.2.2
  retrieving revision 1.22.2.3
  diff -u -r1.22.2.2 -r1.22.2.3
  --- SqlSelectStatement.java	22 Jan 2005 20:51:14 -0000	1.22.2.2
  +++ SqlSelectStatement.java	7 May 2005 16:43:05 -0000	1.22.2.3
  @@ -218,9 +218,12 @@
               
               orderByFields = query.getOrderBy();
               columnList = ensureColumns(orderByFields, columnList, stmt);
  -          
  +/*
  +arminw:
  +TODO: this feature doesn't work, so remove this in future
  +*/
               /**
  -             * treeder: going to map superclass tables here, 
  +             * treeder: going to map superclass tables here,
                * not sure about the columns, just using all columns for now
                */
               ClassDescriptor cld = super.getBaseClassDescriptor();
  @@ -250,6 +253,10 @@
           return stmt.toString();
       }
   
  +/*
  +arminw:
  +TODO: this feature doesn't work, so remove this in future
  +*/
       private void appendSuperClassJoin(ClassDescriptor cld, ClassDescriptor cldSuper, StringBuffer stmt, StringBuffer where)
       {
           stmt.append(",").append(cldSuper.getFullTableName());
  
  
  
  No                   revision
  No                   revision
  1.30.2.3  +5 -1      db-ojb/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java
  
  Index: RowReaderDefaultImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/RowReaderDefaultImpl.java,v
  retrieving revision 1.30.2.2
  retrieving revision 1.30.2.3
  diff -u -r1.30.2.2 -r1.30.2.3
  --- RowReaderDefaultImpl.java	12 Sep 2004 00:50:49 -0000	1.30.2.2
  +++ RowReaderDefaultImpl.java	7 May 2005 16:43:05 -0000	1.30.2.3
  @@ -163,6 +163,10 @@
       public void readObjectArrayFrom(ResultSet rs, Map row)
       {
           FieldDescriptor[] fields = null;
  +/*
  +arminw:
  +TODO: this feature doesn't work, so remove this in future
  +*/
           if (m_cld.getSuperClass() != null)
           {
               /**
  
  
  
  1.22.2.4  +6 -6      db-ojb/src/java/org/apache/ojb/broker/accesslayer/StatementsForClassImpl.java
  
  Index: StatementsForClassImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/accesslayer/StatementsForClassImpl.java,v
  retrieving revision 1.22.2.3
  retrieving revision 1.22.2.4
  diff -u -r1.22.2.3 -r1.22.2.4
  --- StatementsForClassImpl.java	26 Apr 2005 03:41:35 -0000	1.22.2.3
  +++ StatementsForClassImpl.java	7 May 2005 16:43:05 -0000	1.22.2.4
  @@ -119,7 +119,7 @@
           }
           catch (SQLException ex)
           {
  -            log.error(ex);
  +            log.error("Can't prepare delete statement: " + deleteSql, ex);
               throw ex;
           }
       }
  @@ -168,7 +168,7 @@
           }
           catch (SQLException ex)
           {
  -            log.error(ex);
  +            log.error("Can't prepare insert statement: " + insertSql, ex);
               throw ex;
           }
       }
  @@ -186,9 +186,9 @@
               stmt = prepareStatement(con, sql, scrollable,
                       createPreparedStatement, explicitFetchSizeHint);
           }
  -        catch (java.sql.SQLException ex)
  +        catch (SQLException ex)
           {
  -            log.error(ex);
  +            log.error("Can't prepare statement: " + sql, ex);
               throw new PersistenceBrokerSQLException(ex);
           }
           return stmt;
  @@ -238,7 +238,7 @@
           }
           catch (SQLException ex)
           {
  -            log.error(ex);
  +            log.error("Can't prepare update statement: " + updateSql, ex);
               throw ex;
           }
       }
  
  
  
  No                   revision
  No                   revision
  1.83.2.21 +5 -4      db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java
  
  Index: PersistenceBrokerImpl.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/core/PersistenceBrokerImpl.java,v
  retrieving revision 1.83.2.20
  retrieving revision 1.83.2.21
  diff -u -r1.83.2.20 -r1.83.2.21
  --- PersistenceBrokerImpl.java	28 Apr 2005 20:31:56 -0000	1.83.2.20
  +++ PersistenceBrokerImpl.java	7 May 2005 16:43:06 -0000	1.83.2.21
  @@ -890,7 +890,7 @@
           // get all members of obj that are references and store them
           Collection listRds = cld.getObjectReferenceDescriptors();
           // return if nothing to do
  -        if(listRds.size() == 0)
  +        if(listRds == null || listRds.size() == 0)
           {
               return;
           }
  @@ -920,9 +920,9 @@
           {
               if(rds.isSuperReferenceDescriptor())
               {
  -                ClassDescriptor superCld = getDescriptorRepository().getDescriptorFor(rds.getClassDescriptor().getBaseClass());
  -                Identity oid = serviceIdentity().buildIdentity(superCld, obj);
  -                storeToDb(obj, superCld, oid, insert);
  +                ClassDescriptor superCld = rds.getClassDescriptor().getSuperClassDescriptor();
  +                Identity oid = serviceIdentity().buildIdentity(superCld, ref);
  +                storeToDb(ref, superCld, oid, insert);
               }
               else store(ref);
           }
  @@ -1794,6 +1794,7 @@
           2. go down through heirarchy until current class
           3. todo: store to full extent?
   
  +// arminw: TODO: The extend-attribute feature dosn't work, should we remove this stuff?
           This if-clause will go up the inheritance heirarchy to store all the super classes.
           The id for the top most super class will be the id for all the subclasses too
            */
  
  
  
  No                   revision
  No                   revision
  1.88.2.15 +22 -4     db-ojb/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java
  
  Index: ClassDescriptor.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/ClassDescriptor.java,v
  retrieving revision 1.88.2.14
  retrieving revision 1.88.2.15
  diff -u -r1.88.2.14 -r1.88.2.15
  --- ClassDescriptor.java	22 Apr 2005 17:08:13 -0000	1.88.2.14
  +++ ClassDescriptor.java	7 May 2005 16:43:06 -0000	1.88.2.15
  @@ -168,6 +168,10 @@
        * the RowReader for this class
        */
       private RowReader m_rowReader = null;
  +/*
  +arminw:
  +TODO: this feature doesn't work, so remove/reuse this in future
  +*/
       /**
        * the class that this class extends
        */
  @@ -603,7 +607,15 @@
       {
           if (!m_superCldSet)
           {
  -            if(getBaseClass() != null) m_superCld = getRepository().getDescriptorFor(getBaseClass());
  +            if(getBaseClass() != null)
  +            {
  +                m_superCld = getRepository().getDescriptorFor(getBaseClass());
  +                if(m_superCld.isAbstract() || m_superCld.isInterface())
  +                {
  +                    throw new MetadataException("Super class mapping only work for real class, but declared super class" +
  +                            " is an interface or is abstract. Declared class: " + m_superCld.getClassNameOfObject());
  +                }
  +            }
               m_superCldSet = true;
           }
   
  @@ -846,7 +858,10 @@
       {
           return getFieldDescriptorForPath(aPath, new HashMap());
       }
  -
  +/*
  +arminw:
  +TODO: this feature doesn't work, so remove this in future
  +*/
       /**
        *
        * @return this classes FieldDescriptor's as well as it's parents and so on and so on
  @@ -1625,7 +1640,10 @@
                   }
           }
       }
  -
  +/*
  +arminw:
  +TODO: this feature doesn't work, so remove this in future
  +*/
       /**
        * Set name of the super class.
        */
  
  
  
  1.58.2.8  +2 -1      db-ojb/src/java/org/apache/ojb/broker/metadata/RepositoryXmlHandler.java
  
  Index: RepositoryXmlHandler.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/RepositoryXmlHandler.java,v
  retrieving revision 1.58.2.7
  retrieving revision 1.58.2.8
  diff -u -r1.58.2.7 -r1.58.2.8
  --- RepositoryXmlHandler.java	22 Apr 2005 17:08:13 -0000	1.58.2.7
  +++ RepositoryXmlHandler.java	7 May 2005 16:43:06 -0000	1.58.2.8
  @@ -265,6 +265,7 @@
                           }
   
                           // set if extends
  +// arminw: TODO: this feature doesn't work, remove this stuff?
                           String extendsAtt = atts.getValue(tags.getTagById(EXTENDS));
                           if (isDebug) logger.debug("     " + tags.getTagById(EXTENDS) + ": " + extendsAtt);
                           if (checkString(extendsAtt))
  
  
  
  1.1.2.2   +227 -128  db-ojb/src/java/org/apache/ojb/broker/metadata/Attic/SuperReferenceDescriptor.java
  
  Index: SuperReferenceDescriptor.java
  ===================================================================
  RCS file: /home/cvs/db-ojb/src/java/org/apache/ojb/broker/metadata/Attic/SuperReferenceDescriptor.java,v
  retrieving revision 1.1.2.1
  retrieving revision 1.1.2.2
  diff -u -r1.1.2.1 -r1.1.2.2
  --- SuperReferenceDescriptor.java	22 Apr 2005 17:08:14 -0000	1.1.2.1
  +++ SuperReferenceDescriptor.java	7 May 2005 16:43:06 -0000	1.1.2.2
  @@ -1,10 +1,14 @@
   package org.apache.ojb.broker.metadata;
   
   import java.util.List;
  +import java.util.Map;
  +import java.util.HashMap;
   
   import org.apache.commons.lang.SystemUtils;
   import org.apache.ojb.broker.metadata.fieldaccess.AnonymousPersistentField;
   import org.apache.ojb.broker.metadata.fieldaccess.PersistentField;
  +import org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldFactory;
  +import org.apache.ojb.broker.util.ClassHelper;
   import org.apache.ojb.broker.util.logging.Logger;
   import org.apache.ojb.broker.util.logging.LoggerFactory;
   
  @@ -32,15 +36,24 @@
    */
   public class SuperReferenceDescriptor extends ObjectReferenceDescriptor
   {
  +    private transient Logger log;
  +
       public static final String ANONYMOUS_NAME = null;
  +    static final String SUPER_FIELD_NAME = "super";
   
  -    private Boolean inheritedPK;
  +    private Boolean javaInheritance;
  +    private Map declaredInheritanceFields = new HashMap();
   
       public SuperReferenceDescriptor(ClassDescriptor descriptor)
       {
           super(descriptor);
           // most important call, create new specific field for inheritance
           super.setPersistentField(new SuperReferenceField(this));
  +        // needed immutable settings
  +        super.setLazy(false);
  +        super.setCascadeRetrieve(true);
  +        super.setCascadingStore(CASCADE_OBJECT);
  +        super.setCascadingDelete(CASCADE_OBJECT);
       }
   
       public boolean isSuperReferenceDescriptor()
  @@ -51,67 +64,12 @@
       public void setItemClass(Class c)
       {
           super.setItemClass(c);
  -        setCldBaseClass();
  -    }
  -
  -    private void setCldBaseClass()
  -    {
  -        String refClass = getItemClassName();
  -        Class actualClass = getClassDescriptor().getClassOfObject();
  -        String superClass = actualClass.getSuperclass().getName();
  -        if(superClass.equals(refClass))
  -        {
  -            if(getClassDescriptor().getBaseClass() != null)
  -            {
  -                throw new MetadataException("Multiple 'super reference descriptor' not authorized in "
  -                        + actualClass.getName() + ", the base class was already set (currentBaseClass="
  -                        + getClassDescriptor().getBaseClass() + ", tryToSet=" + superClass + ")");
  -            }
  -            getClassDescriptor().setBaseClass(superClass);
  -        }
  -        else
  -        {
  -            if(superClass.equalsIgnoreCase(refClass))
  -            {
  -                throw new MetadataException("Classes name are case sensitive: super class of '"
  -                        + actualClass.getName() + "' is '" + superClass + "' not '" + refClass + "'");
  -            }
  -            else
  -            {
  -                throw new MetadataException("Class '" + refClass + "' is not a superclass of class '"
  -                        + actualClass.getName() + "'");
  -            }
  -        }
  -    }
  -
  -    public boolean isInheritedViaPK()
  -    {
  -        if(inheritedPK == null)
  -        {
  -            // get the FK fields of main class to check which kind of
  -            // "table per subclass" inheritance is used
  -            FieldDescriptor[] flds = getForeignKeyFieldDescriptors(getClassDescriptor());
  -            
  -            for(int i = 0; i < flds.length; i++)
  -            {
  -                FieldDescriptor fld = flds[i];
  -                if(fld.isPrimaryKey())
  -                {
  -                    inheritedPK = Boolean.TRUE;
  -                    break;
  -                }
  -            }
  -            if(inheritedPK == null)
  -            {
  -                inheritedPK = Boolean.FALSE;
  -            }
  -        }
  -        return inheritedPK.booleanValue();
  +        getClassDescriptor().setBaseClass(c.getName());
       }
   
       /**
        * Noop, a specific {@link org.apache.ojb.broker.metadata.fieldaccess.PersistentField} is
  -     * used internal - {@link org.apache.ojb.broker.metadata.SuperReferenceDescriptor.SuperReferenceField}.
  +     * used internal - {@link org.apache.ojb.broker.metadata.SuperReferenceDescriptor_2.SuperReferenceField}.
        */
       public void setPersistentField(Class c, String fieldname)
       {
  @@ -120,18 +78,101 @@
   
       /**
        * Noop, a specific {@link org.apache.ojb.broker.metadata.fieldaccess.PersistentField} is
  -     * used internal - {@link org.apache.ojb.broker.metadata.SuperReferenceDescriptor.SuperReferenceField}.
  +     * used internal - {@link org.apache.ojb.broker.metadata.SuperReferenceDescriptor_2.SuperReferenceField}.
        */
       public void setPersistentField(PersistentField pf)
       {
           // noop
       }
   
  +    public void setLazy(boolean lazy)
  +    {
  +        getLog().info("Not allowed to change this property, will ignore setting");
  +    }
  +
  +    public void setCascadeRetrieve(boolean b)
  +    {
  +        getLog().info("Not allowed to change this property, will ignore setting");
  +    }
  +
  +    public void setCascadingStore(int cascade)
  +    {
  +        getLog().info("Not allowed to change this property, will ignore setting");
  +    }
  +
  +    public void setCascadingStore(String value)
  +    {
  +        getLog().info("Not allowed to change this property, will ignore setting");
  +    }
  +
  +    public void setCascadingDelete(int cascade)
  +    {
  +        getLog().info("Not allowed to change this property, will ignore setting");
  +    }
  +
  +    public void setCascadingDelete(String value)
  +    {
  +        getLog().info("Not allowed to change this property, will ignore setting");
  +    }
  +
  +    public void setCascadeStore(boolean cascade)
  +    {
  +        getLog().info("Not allowed to change this property, will ignore setting");
  +    }
  +
  +    public void setCascadeDelete(boolean cascade)
  +    {
  +        getLog().info("Not allowed to change this property, will ignore setting");
  +    }
  +
       public SuperReferenceField getInheritanceField()
       {
           return (SuperReferenceField) getPersistentField();
       }
   
  +    /**
  +     * If this method returns <em>true</em> the inheritance described by this object
  +     * is a <em>normal</em> JAVA inheritance. If <em>false</em> the inheritance is only declared
  +     * in the O/R mapping it's a <em>declarative inheritance</em>, the referenced "super class" in <strong>not</strong>
  +     * a JAVA super class of the main class.
  +     */
  +    public boolean isJavaInheritance()
  +    {
  +        if(javaInheritance == null)
  +        {
  +            javaInheritance = getClassDescriptor().getSuperClassDescriptor().getClassOfObject()
  +                    .isAssignableFrom(getClassDescriptor().getClassOfObject()) ? Boolean.TRUE : Boolean.FALSE;
  +        }
  +        return javaInheritance.booleanValue();
  +    }
  +
  +    synchronized PersistentField getDeclaredInheritanceField(Class target, String name)
  +    {
  +        Map fields = (HashMap) declaredInheritanceFields.get(target);
  +        if(fields == null)
  +        {
  +            fields = new HashMap();
  +            declaredInheritanceFields.put(target, fields);
  +        }
  +        PersistentField pf = (PersistentField) fields.get(name);
  +        if(pf == null)
  +        {
  +            pf = PersistentFieldFactory.createPersistentField(target, name);
  +            // System.out.println("## tmp field: " + target + ", name: " + name + ", field: " + pf);
  +            fields.put(name, pf);
  +        }
  +        return pf;
  +    }
  +
  +    private Logger getLog()
  +    {
  +        if(log == null)
  +        {
  +            log = LoggerFactory.getLogger(SuperReferenceField.class);
  +        }
  +        return log;
  +    }
  +
   
       //====================================================
       // inner class
  @@ -158,94 +199,152 @@
               return log;
           }
   
  -        void copySuperFields(Object target, Object source)
  +        /**
  +         * Field values of 'value' (base object) are copied to 'obj' (derived object)
  +         * then obj is saved in a map
  +         *
  +         * @param target - the base object instance
  +         * @param value  - the derived object instance
  +         * @throws MetadataException
  +         */
  +        public synchronized void set(Object target, Object value) throws MetadataException
           {
  -            if(getLog().isDebugEnabled())
  +            // System.out.println("target: " + target + " value: " + value);
  +            ClassDescriptor superCld = superRef.getClassDescriptor().getSuperClassDescriptor();
  +            if(superRef.isJavaInheritance())
               {
  -                String msg = ("Using descriptor " + superRef + ":" + SystemUtils.LINE_SEPARATOR
  -                        + "Copy fields from source object '" + source.getClass()
  -                        + "' to target object '" + target.getClass() + "'");
  -                getLog().debug(msg);
  +                copyFields(superCld, target, superCld, value, true, true);
               }
  -            ClassDescriptor superCld = superRef.getClassDescriptor().getSuperClassDescriptor();
  -            if(!source.getClass().isAssignableFrom(target.getClass()))
  +            else
  +            {
  +                copyFields(superRef.getClassDescriptor(), target, superCld, value, false, false);
  +            }
  +        }
  +
  +        /**
  +         * Field values of specified 'obj' (the derived object) are copied to
  +         * 'value' (base object) then value is returned as a referenced object.
  +         * If the base object is the super class of the specified 'obj', then
  +         * return the specified object.
  +         * Else a base class instance will be created at runtime and the field values
  +         * from the derived object are copied to the base class object.
  +         *
  +         * @param obj - the base object instance
  +         * @throws MetadataException
  +         */
  +        public synchronized Object get(Object obj) throws MetadataException
  +        {
  +            if(obj == null) return null;
  +            if(superRef.isJavaInheritance())
  +            {
  +                return obj;
  +            }
  +            else
  +            {
  +                return getObjectWithDeclaredSuperClass(obj);
  +            }
  +        }
  +
  +        private Object getObjectWithDeclaredSuperClass(Object obj)
  +        {
  +            Object value = getFromFieldCache(obj);
  +            if(value == null)
  +            {
  +                ClassDescriptor baseCld = null;
  +                try
  +                {
  +                    baseCld = superRef.getClassDescriptor().getSuperClassDescriptor();
  +                    value = ClassHelper.buildNewObjectInstance(baseCld);
  +                }
  +                catch(Exception e)
  +                {
  +                    throw new MetadataException("Can't create new base class object for '"
  +                            + (baseCld != null ? baseCld.getClassNameOfObject() : null) + "'", e);
  +                }
  +                copyFields(baseCld, value, superRef.getClassDescriptor(), obj, true, false);
  +                putToFieldCache(obj, value);
  +            }
  +            return value;
  +        }
  +
  +        void copyFields(ClassDescriptor targetCld, Object target, ClassDescriptor sourceCld, Object source, boolean targetIsSuper, boolean javaInheritance)
  +        {
  +            if(getLog().isDebugEnabled())
               {
  -                throw new MetadataException("Expect the 'super class' of target object class '"
  -                        + target.getClass() + ", but specified was class " + source.getClass());
  +                String msg = ("Copy fields from " + SystemUtils.LINE_SEPARATOR
  +                        + "source object '" + (source != null ? source.getClass().getName() : null) + "'" + SystemUtils.LINE_SEPARATOR
  +                        + "using source fields declared in '" + sourceCld.getClassNameOfObject() + "'" + SystemUtils.LINE_SEPARATOR
  +                        + "to target object '" + (target != null ? target.getClass().getName() : null) + "'" + SystemUtils.LINE_SEPARATOR
  +                        + "using target fields declared in '" + targetCld.getClassNameOfObject() + "'" + SystemUtils.LINE_SEPARATOR
  +                        + "the fields to copy are declared in '" + (targetIsSuper ? targetCld.getClassNameOfObject() : sourceCld.getClassNameOfObject()) + "' class" + SystemUtils.LINE_SEPARATOR
  +                        + "the used classes are associated by java inheritance: " + javaInheritance + SystemUtils.LINE_SEPARATOR);
  +                getLog().debug(msg);
               }
  -            FieldDescriptor[] fields = superCld.getNonPkRwFields();
  +            /*
  +            arminw:
  +            If the target object is a super object of the source object, iterate all target object fields.
  +            If the source object is a super object of the target object, iterate all source object fields
  +
  +            If java inheritance is used (target is super class of source or vice versa) we can use the same
  +            FieldDescriptor to copy the fields.
  +            If only a "declarative inheritance" is used (no class inheritance, only identical field names of the super class)
  +            we have to use the associated FieldDescriptor of target and source ClassDescriptor
  +            */
  +            FieldDescriptor[] fields = targetIsSuper ? targetCld.getFieldDescriptions() : sourceCld.getFieldDescriptions();
               for(int i = 0; i < fields.length; i++)
               {
                   FieldDescriptor field = fields[i];
  -                PersistentField pf = field.getPersistentField();
  -                if(getLog().isDebugEnabled()) getLog().debug("Set field '" + pf.getName() + "'");
  -                pf.set(target, pf.get(source));
  +                if(!field.isAnonymous())
  +                {
  +                    performFieldCopy(target,  targetCld, source, sourceCld,
  +                                field.getPersistentField(), targetIsSuper, javaInheritance);
  +                }
               }
  -            List refs = superCld.getCollectionDescriptors();
  +            List refs = targetIsSuper ? targetCld.getCollectionDescriptors() : sourceCld.getCollectionDescriptors();
               for(int i = 0; i < refs.size(); i++)
               {
                   CollectionDescriptor col = (CollectionDescriptor) refs.get(i);
                   PersistentField pf = col.getPersistentField();
  -                if(getLog().isDebugEnabled()) getLog().debug("Set field '" + pf.getName() + "'");
  -                pf.set(target, pf.get(source));
  +                performFieldCopy(target,  targetCld, source, sourceCld, pf, targetIsSuper, javaInheritance);
               }
  -            refs = superCld.getObjectReferenceDescriptors();
  +
  +            refs = targetIsSuper ? targetCld.getObjectReferenceDescriptors() : sourceCld.getObjectReferenceDescriptors();
               for(int i = 0; i < refs.size(); i++)
               {
  -                ObjectReferenceDescriptor col = (ObjectReferenceDescriptor) refs.get(i);
  -                PersistentField pf = col.getPersistentField();
  -                if(getLog().isDebugEnabled()) getLog().debug("Set field '" + pf.getName() + "'");
  -                pf.set(target, pf.get(source));
  +                ObjectReferenceDescriptor ord = (ObjectReferenceDescriptor) refs.get(i);
  +                PersistentField pf = ord.getPersistentField();
  +                performFieldCopy(target,  targetCld, source, sourceCld, pf, targetIsSuper, javaInheritance);
               }
           }
   
  -//        void XXXcopySuperFields(Object target, Object source)
  -//        {
  -//            System.out.println("## Set in " + target.getClass() + " fields of value class " + source.getClass());
  -//            AttributeDescriptorBase[] fields = superRef.getClassDescriptor().getPersistentSuperFields();
  -//            for(int i = 0; i < fields.length; i++)
  -//            {
  -//                AttributeDescriptorBase field = fields[i];
  -//                // if we found another declared super inheritance, perform value settings too
  -//                if(field instanceof ObjectReferenceDescriptor)
  -//                {
  -//                    if(((ObjectReferenceDescriptor) field).isSuperReferenceDescriptor())
  -//                    {
  -//                        ((SuperReferenceDescriptor) field).getInheritanceField().copySuperFields(target, source);
  -//                    }
  -//                }
  -//                else
  -//                {
  -//                    PersistentField pf = field.getPersistentField();
  -//                    System.out.println("Set in " + target.getClass() + " value " + pf.get(source));
  -//                    pf.set(target, pf.get(source));
  -//                }
  -//            }
  -//        }
  -
  -        /**
  -         * Field values of 'value' (base object) are copied to 'obj' (derived object)
  -         * then obj is saved in a map
  -         *
  -         * @param target - the base object instance
  -         * @param value  - the derived object instance
  -         * @throws MetadataException
  -         */
  -        public synchronized void set(Object target, Object value) throws MetadataException
  +        private void performFieldCopy(Object target, ClassDescriptor targetCld, Object source,
  +                                 ClassDescriptor sourceCld, PersistentField pf, boolean targetIsSuper, boolean javaInheritance)
           {
  -            copySuperFields(target, value);
  -        }
  -
  -        /**
  -         * Field values of 'obj' (derived object) are copied to 'value' (base object)
  -         * then value is returned as a referenced object.
  -         *
  -         * @param obj - the base object instance
  -         * @throws MetadataException
  -         */
  -        public synchronized Object get(Object obj) throws MetadataException
  -        {
  -            return obj;
  +            if(javaInheritance)
  +            {
  +                pf.set(target, pf.get(source));
  +            }
  +            else
  +            {
  +                if(targetIsSuper)
  +                {
  +                    if(pf instanceof SuperReferenceField)
  +                    {
  +                        log.error("Declared inheritance doesn't support nested super references, target '"
  +                                + targetCld.getClassNameOfObject() + "' has super reference");
  +                    }
  +                    else
  +                    {
  +                        PersistentField tmp = superRef.getDeclaredInheritanceField(sourceCld.getClassOfObject(), pf.getName());
  +                        pf.set(target, tmp.get(source));
  +                    }
  +                }
  +                else
  +                {
  +                    PersistentField tmp = superRef.getDeclaredInheritanceField(targetCld.getClassOfObject(), pf.getName());
  +                    tmp.set(target, pf.get(source));
  +                }
  +            }
           }
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org