001 package com.khubla.pragmatach.plugin.mongodb.serializer;
002
003 import java.lang.reflect.Field;
004
005 import org.apache.commons.beanutils.PropertyUtils;
006
007 import com.khubla.pragmatach.framework.api.PragmatachException;
008 import com.khubla.pragmatach.plugin.mongodb.MongoDBObjectPersister;
009 import com.khubla.pragmatach.plugin.mongodb.proxy.MongoProxyFactory;
010 import com.khubla.pragmatach.plugin.mongodb.util.ClassTypeUtils;
011 import com.mongodb.BasicDBObject;
012 import com.mongodb.DBObject;
013
014 /**
015 * @author tom
016 */
017 public class EntityFieldSerializer implements FieldSerializer {
018 /**
019 * the type
020 */
021 private final Class<?> typeClazz;
022 /**
023 * type utils
024 */
025 private final ClassTypeUtils classTypeUtils;
026
027 /**
028 * ctor
029 */
030 public EntityFieldSerializer(Class<?> typeClazz) {
031 this.typeClazz = typeClazz;
032 classTypeUtils = new ClassTypeUtils(this.typeClazz);
033 }
034
035 @Override
036 public void deserializeField(Object object, Field field, DBObject dbObject) throws PragmatachException {
037 try {
038 /*
039 * get id
040 */
041 final String id = (String) dbObject.get(field.getName());
042 /*
043 * if it was null, we didn't save it, so move on
044 */
045 if (null != id) {
046 /*
047 * lazy load?
048 */
049 if (true == ClassTypeUtils.isLazyLoad(field)) {
050 /*
051 * create an empty object
052 */
053 Object o = MongoProxyFactory.getProxyObject(field.getType());
054 /*
055 * set the id and fetched properties
056 */
057 MongoProxyFactory.setID(o, id);
058 MongoProxyFactory.setFetched(o, false);
059 /*
060 * set
061 */
062 PropertyUtils.setProperty(object, field.getName(), o);
063 } else {
064 /*
065 * get object
066 */
067 final MongoDBObjectPersister mongoDBObjectPersister = new MongoDBObjectPersister(field.getType());
068 final DBObject containedObjectJSON = mongoDBObjectPersister.find(id);
069 /*
070 * load it
071 */
072 final Object o = mongoDBObjectPersister.load(containedObjectJSON);
073 /*
074 * set
075 */
076 PropertyUtils.setProperty(object, field.getName(), o);
077 }
078 }
079 } catch (final Exception e) {
080 throw new PragmatachException("Exception in deserializeField", e);
081 }
082 }
083
084 @Override
085 public void serializeField(BasicDBObject parentDBObject, Object object, Field field) throws PragmatachException {
086 try {
087 /*
088 * get the object
089 */
090 final Object oo = PropertyUtils.getProperty(object, field.getName());
091 /*
092 * if the object is null, don't store it
093 */
094 if (null != oo) {
095 /*
096 * save the object
097 */
098 final MongoDBObjectPersister mongoDBObjectPersister = new MongoDBObjectPersister(field.getType());
099 mongoDBObjectPersister.save(oo);
100 /*
101 * save the id
102 */
103 parentDBObject.append(field.getName(), classTypeUtils.getId(oo));
104 }
105 } catch (final Exception e) {
106 throw new PragmatachException("Exception in serializeField", e);
107 }
108 }
109 }