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 2006/02/07 22:53:34 UTC
svn commit: r375730 -
/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/SuperReferenceDescriptor.java
Author: arminw
Date: Tue Feb 7 13:53:33 2006
New Revision: 375730
URL: http://svn.apache.org/viewcvs?rev=375730&view=rev
Log:
improve definiton of table-per-subclass inheritance, cleanup code, comment out experimental code
Modified:
db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/SuperReferenceDescriptor.java
Modified: db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/SuperReferenceDescriptor.java
URL: http://svn.apache.org/viewcvs/db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/SuperReferenceDescriptor.java?rev=375730&r1=375729&r2=375730&view=diff
==============================================================================
--- db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/SuperReferenceDescriptor.java (original)
+++ db/ojb/branches/OJB_1_0_RELEASE/src/java/org/apache/ojb/broker/metadata/SuperReferenceDescriptor.java Tue Feb 7 13:53:33 2006
@@ -15,15 +15,17 @@
* limitations under the License.
*/
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.HashMap;
+import java.util.Vector;
+import org.apache.commons.lang.ArrayUtils;
import org.apache.commons.lang.SystemUtils;
+import org.apache.commons.lang.builder.ToStringBuilder;
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;
@@ -66,6 +68,29 @@
getClassDescriptor().setBaseClass(c.getName());
}
+ public Vector getForeignKeyFields()
+ {
+ Vector result = super.getForeignKeyFields();
+ /*
+ if no FK field-ref is defined in metadata mapping
+ OJB simply use the PK fields as FK to the super-class
+ */
+ if(result == null || result.size() == 0)
+ {
+ FieldDescriptor[] pks = getClassDescriptor().getPkFields();
+ if(getLog().isDebugEnabled())
+ {
+ getLog().debug("Automatically assign FK's for this super-reference, used fields will be: " + ArrayUtils.toString(pks));
+ }
+ for(int i = 0; i < pks.length; i++)
+ {
+ FieldDescriptor pk = pks[i];
+ addForeignKeyField(pk.getPersistentField().getName());
+ }
+ }
+ return result;
+ }
+
/**
* Noop, a specific {@link org.apache.ojb.broker.metadata.fieldaccess.PersistentField} is
* used internal - {@link org.apache.ojb.broker.metadata.SuperReferenceDescriptor.SuperReferenceField}.
@@ -86,42 +111,42 @@
public void setLazy(boolean lazy)
{
- getLog().info("Not allowed to change this property, will ignore setting");
+ getLog().debug("Property 'lazy' is immutable, will ignore setting");
}
public void setCascadeRetrieve(boolean b)
{
- getLog().info("Not allowed to change this property, will ignore setting");
+ getLog().debug("Property 'CascadeRetrieve' is immutable, will ignore setting");
}
public void setCascadingStore(int cascade)
{
- getLog().info("Not allowed to change this property, will ignore setting");
+ getLog().debug("Property 'CascadingStore' is immutable, will ignore setting");
}
public void setCascadingStore(String value)
{
- getLog().info("Not allowed to change this property, will ignore setting");
+ getLog().debug("Property 'CascadingStore' is immutable, will ignore setting");
}
public void setCascadingDelete(int cascade)
{
- getLog().info("Not allowed to change this property, will ignore setting");
+ getLog().debug("Property 'CascadingDelete' is immutable, will ignore setting");
}
public void setCascadingDelete(String value)
{
- getLog().info("Not allowed to change this property, will ignore setting");
+ getLog().debug("Property 'CascadingDelete' is immutable, will ignore setting");
}
public void setCascadeStore(boolean cascade)
{
- getLog().info("Not allowed to change this property, will ignore setting");
+ getLog().debug("Property 'CascadeStore' is immutable, will ignore setting");
}
public void setCascadeDelete(boolean cascade)
{
- getLog().info("Not allowed to change this property, will ignore setting");
+ getLog().debug("Property 'CascadeDelete' is immutable, will ignore setting");
}
public SuperReferenceField getInheritanceField()
@@ -167,7 +192,7 @@
{
if(log == null)
{
- log = LoggerFactory.getLogger(SuperReferenceField.class);
+ log = LoggerFactory.getLogger(SuperReferenceDescriptor.class);
}
return log;
}
@@ -212,11 +237,13 @@
ClassDescriptor superCld = superRef.getClassDescriptor().getSuperClassDescriptor();
if(superRef.isJavaInheritance())
{
- copyFields(superCld, target, superCld, value, true, true);
+ copyFields(superCld, target, superCld, value);
}
else
{
- copyFields(superRef.getClassDescriptor(), target, superCld, value, false, false);
+ throw new MetadataException("Declared super class '" + superRef.getClassDescriptor()
+ + "'is not assignable from " + target.getClass() + ". Reference: " + toString());
+ // copyFields(superRef.getClassDescriptor(), target, superCld, value, false, false);
}
}
@@ -240,33 +267,14 @@
}
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);
+ throw new MetadataException("Declared super class '" + superRef.getClassDescriptor()
+ + "'is not assignable from " + obj.getClass() + ". Reference: " + toString());
+ // return getObjectWithDeclaredSuperClass(obj);
}
- return value;
}
- void copyFields(ClassDescriptor targetCld, Object target, ClassDescriptor sourceCld, Object source, boolean targetIsSuper, boolean javaInheritance)
+ void copyFields(final ClassDescriptor targetCld, final Object target, final ClassDescriptor sourceCld,
+ final Object source)
{
if(getLog().isDebugEnabled())
{
@@ -275,76 +283,164 @@
+ "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);
+ + "the fields to copy are declared in '" + targetCld.getClassNameOfObject());
getLog().debug(msg);
}
/*
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();
+ FieldDescriptor[] fields = targetCld.getFieldDescriptions();
for(int i = 0; i < fields.length; i++)
{
FieldDescriptor field = fields[i];
if(!field.isAnonymous())
{
- performFieldCopy(target, targetCld, source, sourceCld,
- field.getPersistentField(), targetIsSuper, javaInheritance);
+ performFieldCopy(target, source, field.getPersistentField());
}
}
- List refs = targetIsSuper ? targetCld.getCollectionDescriptors() : sourceCld.getCollectionDescriptors();
+ List refs = targetCld.getCollectionDescriptors();
for(int i = 0; i < refs.size(); i++)
{
CollectionDescriptor col = (CollectionDescriptor) refs.get(i);
PersistentField pf = col.getPersistentField();
- performFieldCopy(target, targetCld, source, sourceCld, pf, targetIsSuper, javaInheritance);
+ performFieldCopy(target, source, pf);
}
- refs = targetIsSuper ? targetCld.getObjectReferenceDescriptors() : sourceCld.getObjectReferenceDescriptors();
+ refs = targetCld.getObjectReferenceDescriptors();
for(int i = 0; i < refs.size(); i++)
{
ObjectReferenceDescriptor ord = (ObjectReferenceDescriptor) refs.get(i);
PersistentField pf = ord.getPersistentField();
- performFieldCopy(target, targetCld, source, sourceCld, pf, targetIsSuper, javaInheritance);
+ performFieldCopy(target, source, pf);
}
}
- private void performFieldCopy(Object target, ClassDescriptor targetCld, Object source,
- ClassDescriptor sourceCld, PersistentField pf, boolean targetIsSuper, boolean javaInheritance)
+ private void performFieldCopy(final Object target, final Object source, final PersistentField pf)
{
- 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));
- }
- }
+ pf.set(target, pf.get(source));
}
+
+ public String toString()
+ {
+ return new ToStringBuilder(this)
+ .append("name", getName())
+ .append("type", getType())
+ .append("super-reference", superRef)
+ .toString();
+ }
+
+// arminw: the code below is a first attempt to support "table-per-subclass"-inheritance
+// for objects without java-subclass inheritance. But it's only possible for simple single-level
+// inheritance of "declared" objects
+// void copyFields(final ClassDescriptor targetCld, final Object target, final ClassDescriptor sourceCld,
+// final Object source, final boolean targetIsSuper, final boolean javaInheritance)
+// {
+// if(getLog().isDebugEnabled())
+// {
+// 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);
+// }
+// /*
+// 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];
+// if(!field.isAnonymous())
+// {
+//// performFieldCopy(target, targetCld, source, sourceCld,
+//// field.getPersistentField(), targetIsSuper, javaInheritance);
+// performFieldCopy(target, source, field.getPersistentField());
+// }
+// }
+// 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();
+// //performFieldCopy(target, targetCld, source, sourceCld, pf, targetIsSuper, javaInheritance);
+// performFieldCopy(target, source, pf);
+// }
+//
+// refs = targetIsSuper ? targetCld.getObjectReferenceDescriptors() : sourceCld.getObjectReferenceDescriptors();
+// for(int i = 0; i < refs.size(); i++)
+// {
+// ObjectReferenceDescriptor ord = (ObjectReferenceDescriptor) refs.get(i);
+// PersistentField pf = ord.getPersistentField();
+// //performFieldCopy(target, targetCld, source, sourceCld, pf, targetIsSuper, javaInheritance);
+// performFieldCopy(target, source, pf);
+// }
+// }
+//
+//
+// private void performFieldCopy(Object target, ClassDescriptor targetCld, Object source,
+// ClassDescriptor sourceCld, PersistentField pf, boolean targetIsSuper, boolean javaInheritance)
+// {
+// 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));
+// }
+// }
+// }
+//
+// 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;
+// }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: ojb-dev-unsubscribe@db.apache.org
For additional commands, e-mail: ojb-dev-help@db.apache.org