001    package com.khubla.pragmatach.plugin.mongodb.serializer;
002    
003    import java.lang.reflect.Field;
004    
005    import org.bson.types.ObjectId;
006    
007    import com.khubla.pragmatach.framework.api.PragmatachException;
008    import com.khubla.pragmatach.plugin.mongodb.proxy.MongoProxyFactory;
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 BasicObjectSerializer implements ObjectSerializer {
017       /**
018        * the type
019        */
020       private final Class<?> typeClazz;
021       /**
022        * type utils
023        */
024       private final ClassTypeUtils typeUtils;
025    
026       /**
027        * ctor
028        */
029       public BasicObjectSerializer(Class<?> typeClazz) {
030          this.typeClazz = typeClazz;
031          typeUtils = new ClassTypeUtils(this.typeClazz);
032       }
033    
034       /**
035        * deserialize
036        */
037       @Override
038       public Object deserialize(DBObject dbObject) throws PragmatachException {
039          try {
040             /*
041              * instance
042              */
043             final Object object = MongoProxyFactory.getProxyObject(typeClazz);
044             /*
045              * walk the fields
046              */
047             for (final Field field : typeClazz.getDeclaredFields()) {
048                /*
049                 * filter the static ones
050                 */
051                if (false == java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
052                   final FieldSerializer fieldSerializer = FieldSerializerFactory.getFieldSerializer(typeClazz, field);
053                   fieldSerializer.deserializeField(object, field, dbObject);
054                }
055             }
056             /*
057              * done
058              */
059             return object;
060          } catch (final Exception e) {
061             throw new PragmatachException("Exception in deserialize", e);
062          }
063       }
064    
065       public Class<?> getTypeClazz() {
066          return typeClazz;
067       }
068    
069       /**
070        * serialize
071        */
072       @Override
073       public BasicDBObject serialize(Object object) throws PragmatachException {
074          try {
075             if (null != object) {
076                /*
077                 * id generation
078                 */
079                if (typeUtils.isGeneratedId()) {
080                   /*
081                    * check for an id
082                    */
083                   final String id = typeUtils.getId(object);
084                   if (null == id) {
085                      final ObjectId objectId = new ObjectId();
086                      typeUtils.setId(object, objectId.toString());
087                   }
088                }
089                /*
090                 * object node
091                 */
092                final BasicDBObject ret = new BasicDBObject();
093                /*
094                 * walk the fields
095                 */
096                for (final Field field : typeClazz.getDeclaredFields()) {
097                   /*
098                    * filter the static ones
099                    */
100                   if (false == java.lang.reflect.Modifier.isStatic(field.getModifiers())) {
101                      final FieldSerializer fieldSerializer = FieldSerializerFactory.getFieldSerializer(typeClazz, field);
102                      fieldSerializer.serializeField(ret, object, field);
103                   }
104                }
105                /*
106                 * done
107                 */
108                return ret;
109             } else {
110                throw new PragmatachException("Cannot serialize null object");
111             }
112          } catch (final Exception e) {
113             throw new PragmatachException("Exception in serialize", e);
114          }
115       }
116    }