nt:unstructured allows any number of properties with any names. but with OCM,
we can only set predefined properties on a jcr node. It's not flexible
sometime. for example, a CmsObject may have some optional properties then user
can place owner information or something else. I have added a callback feature
in ObjectConverterImpl that allows some annotated method in an ocm object will
be callback during saving or retrieving the object, like this:
//ObjectConverterImpl.java
public void insert(Session session, Node parentNode, String nodeName,
Object object) {
...
simpleFieldsHelp.storeSimpleFields(session, object, classDescriptor,
objectNode);
insertBeanFields(session, object, classDescriptor, objectNode);
insertCollectionFields(session, object, classDescriptor, objectNode);
simpleFieldsHelp.refreshUuidPath(session, classDescriptor, objectNode,
object);
CallbackHelper.save(object,objectNode);
}
theh I create two new annotations:
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD })
public @interface Retrieve
{}
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.METHOD })
public @interface Save
{}
So in the ocm object, we can place following codes :
private Map<String, String> optionalProperties = new HashMap<String,
String>();
@Save
public void saveOptionalProperties(javax.jcr.Node node)
{
//...
}
@Retrieve
public void readOptionalProperties(javax.jcr.Node node)
{
//...
}
CallbackHelper is very simple:
public class CallbackHelper
{
public static void save(Object obj,Node node)
{
Method m = getMethod(obj,Save.class);
if(m!=null)
{
//invode the method
}
}
public static void retrieve(Object obj,Node node)
{
Method m = getMethod(obj,Retrieve.class);
if(m!=null)
{
//invoke the method
}
}
private static Method getMethod(Object object , Class annClass)
{
Method[] methods = object.getClass().getMethods();
for(Method m : methods)
{
if(m.getAnnotation(annClass)!=null) return m;
}
return null;
}
}
This solution helped me.
WDYT?
___________________________________________________________
雅虎邮箱,您的终生邮箱!
http://cn.mail.yahoo.com/