001 package com.khubla.pragmatach.plugin.mongodb.serializer;
002
003 import java.lang.reflect.Field;
004
005 import org.apache.commons.beanutils.BeanUtils;
006
007 import com.khubla.pragmatach.framework.api.PragmatachException;
008 import com.khubla.pragmatach.plugin.mongodb.MongoDBDAO;
009 import com.khubla.pragmatach.plugin.mongodb.util.ClassTypeUtils;
010 import com.mongodb.BasicDBObject;
011 import com.mongodb.DBObject;
012
013 /**
014 * @author tom
015 */
016 public class AtomicFieldSerializer implements FieldSerializer {
017 /**
018 * type utils
019 */
020 private final ClassTypeUtils classTypeUtils;
021 /**
022 * the type
023 */
024 private final Class<?> typeClazz;
025
026 /**
027 * ctor
028 */
029 public AtomicFieldSerializer(Class<?> typeClazz) {
030 this.typeClazz = typeClazz;
031 classTypeUtils = new ClassTypeUtils(this.typeClazz);
032 }
033
034 @Override
035 public void deserializeField(Object object, Field field, DBObject dbObject) throws PragmatachException {
036 try {
037 /*
038 * read all fields, treating id as special
039 */
040 if (field.getName().compareTo(classTypeUtils.getIdFieldName()) != 0) {
041 BeanUtils.setProperty(object, field.getName(), dbObject.get(field.getName()));
042 } else {
043 final String objectId = (String) dbObject.get(MongoDBDAO.ID);
044 if (null == objectId) {
045 throw new PragmatachException("Object '" + dbObject.toString() + "' has null id");
046 }
047 classTypeUtils.setId(object, objectId);
048 }
049 } catch (final Exception e) {
050 throw new PragmatachException("Exception in deserializeField", e);
051 }
052 }
053
054 @Override
055 public void serializeField(BasicDBObject parentDBObject, Object object, Field field) throws PragmatachException {
056 try {
057 /*
058 * persist all fields, treating id as special
059 */
060 if (field.getName().compareTo(classTypeUtils.getIdFieldName()) != 0) {
061 final String propertyValue = BeanUtils.getProperty(object, field.getName());
062 parentDBObject.append(field.getName(), propertyValue);
063 } else {
064 final String id = classTypeUtils.getId(object);
065 parentDBObject.append(MongoDBDAO.ID, id);
066 }
067 } catch (final Exception e) {
068 throw new PragmatachException("Exception in serializeField", e);
069 }
070 }
071 }