hi atipon,

fyi there has been a discussion about subfields before
http://nagoya.apache.org/eyebrowse/ReadMsg?listName=ojb-dev@;jakarta.apache.o
rg&msgId=432969

hth
jakob

----- Original Message -----
From: "atipon pongpat" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Sunday, October 20, 2002 9:15 AM
Subject: Need PersistentField impl suggestion


>
> 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#getFieldRec
ursive(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


--
To unsubscribe, e-mail:   <mailto:ojb-user-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:ojb-user-help@;jakarta.apache.org>

Reply via email to