Hi,
 My company currently uses Toplink for o/r mapping, so I want to write an ojb mapping 
without any modification to existing domain object. The problem arises when I try to 
map nested object on the same table of parent object. My first solution is rowreader + 
field conversion.(Thanks to Thomas Mahler for his response to my friend, Sumeth 
Chittaprawat) It works fine but I just don't want to write a rowreader for every class 
that has a nested object.
 I decided to extend ojb provided PersistentField impl to supports using of nested 
attribute. My repository looks something like this.
 <field-descriptor id="2"
  name="name"
  column="SUPP_NAME"
  jdbc-type="CHAR"
 />
 
 <field-descriptor id="3"
  name="audit.createdBy"
  column="CREATED_BY"
  jdbc-type="CHAR"   
 />
Is  there something I have to concern when I create my own PersistentField impl ? I'm 
afraid that it cannot be used with odmg or jdo api. 
 

Thanks in advance,
Atipon Pongpat

P.S. This my code. Any comments or suggestions are welcome.
package testojb;

import java.lang.reflect.Field;

import org.apache.ojb.broker.metadata.MetadataException;
import org.apache.ojb.broker.metadata.PersistentFieldMaxPerformanceImpl;
import org.apache.ojb.broker.util.logging.Logger;
import org.apache.ojb.broker.util.logging.LoggerFactory;

/**
 *
 * This class supports using of nested attribute.
 * @author Atipon Pongpat
 */
public class PersistentNestedFieldMaxPerformanceImpl
 extends PersistentFieldMaxPerformanceImpl {

 private String fieldName;

 private Logger logger = LoggerFactory.getLogger(this.getClass());

 public PersistentNestedFieldMaxPerformanceImpl(Field f) {
  super(f);
 }

 public PersistentNestedFieldMaxPerformanceImpl(Class c, String fieldname) {
  super(c, fieldname);
  this.fieldName = fieldname;
 }

 /**
  * @see 
org.apache.ojb.broker.metadata.PersistentFieldMaxPerformanceImpl#getFieldRecursive(Class,
 String)
  */
 protected Field getFieldRecursive(Class c, String fieldname)
  throws NoSuchFieldException {
  //thanks for the original implementation of PersistentFieldMaxPerformanceImpl
  try {
   Field f = null;
   int index = fieldname.indexOf(".");
   if (index >= 0) {
    String name = fieldname.substring(0, index);
    Field field = c.getDeclaredField(name);
    Class nestedClass = field.getType();
    //
    String nestedName = fieldname.substring(index + 1);
    f = getFieldRecursive(nestedClass, nestedName);
   } else {
    f = c.getDeclaredField(fieldname);
   }
   return f;
  } catch (NoSuchFieldException e) {
   // if field  could not be found in the inheritance hierarchy, signal error
   if (c == Object.class) {
    throw e;
   }
   // if field could not be found in class c try in superclass
   else {
    return getFieldRecursive(c.getSuperclass(), fieldname);
   }
  }
 }

 /**
  * @see org.apache.ojb.broker.metadata.PersistentField#get(Object)
  */
 public Object get(Object anObject) throws MetadataException {
  return getNestedObject(anObject, fieldName);
 }

 /**
  * @see org.apache.ojb.broker.metadata.PersistentField#set(Object, Object)
  */
 public void set(Object obj, Object value) throws MetadataException {
  setNestedObject(obj, fieldName, value);
 }

 
 /**
  * Set nested attribute with given value.
  * @param obj the object whose field should be modified
  * @param fieldName nested attribute name
  * @param value the new value for the field of obj being modified
  */
 protected void setNestedObject(Object obj, String fieldName, Object value) {

  int index = fieldName.indexOf(".");
  if (index >= 0) {
   String name = fieldName.substring(0, index);
   PersistentFieldMaxPerformanceImpl pField =
    new PersistentFieldMaxPerformanceImpl(obj.getClass(), name);
   Object attrib = pField.get(obj);

   if (attrib == null) {
    try {
     attrib = pField.getType().newInstance();
    } catch (InstantiationException e) {
     throw new MetadataException(
      "Error instantiate field:"
       + name
       + " in object:"
       + obj.getClass().getName(),
      e);
    } catch (IllegalAccessException e) {
     throw new MetadataException(
      "Error getting field:"
       + name
       + " in object:"
       + obj.getClass().getName(),
      e);
    }

    pField.set(obj, attrib);
   }
   //
   String nestedName = fieldName.substring(index + 1);

   setNestedObject(attrib, nestedName, value);
  } else {

   PersistentFieldMaxPerformanceImpl pField =
    new PersistentFieldMaxPerformanceImpl(
     obj.getClass(),
     fieldName);
   pField.set(obj, value);
  }

 }

 /**
  * Get nested attribute with given field name.
  * @param obj object from which the represented field's value is to be extracted
  * @param fieldName nested attribute name
  * @return Object the value of the represented field in object obj
  */
 protected Object getNestedObject(Object obj, String fieldName) {

  Object result = null;
  int index = fieldName.indexOf(".");
  if (index >= 0) {
   String name = fieldName.substring(0, index);
   PersistentFieldMaxPerformanceImpl pField =
    new PersistentFieldMaxPerformanceImpl(obj.getClass(), name);
   Object attrib = pField.get(obj);

   if (attrib != null) {
    //
    String nestedName = fieldName.substring(index + 1);
    result = getNestedObject(attrib, nestedName);
   }
  } else {

   PersistentFieldMaxPerformanceImpl pField =
    new PersistentFieldMaxPerformanceImpl(
     obj.getClass(),
     fieldName);
   result = pField.get(obj);
  }

  return result;
 }

}




---------------------------------
Do you Yahoo!?
Y! Web Hosting - Let the expert host your web site

Reply via email to