/** * @param mf * @return */ public Map createMap(final MappedField mf) { final Class clazz = mf.getType(); if (clazz.isInterface() || Modifier.isAbstract(clazz.getModifiers())) { // there is no good way to find the clazz to use, yet, so delegate return injectMembers(this.delegate.createMap(mf)); } if (injectOnConstructor(clazz)) { return (Map) this.injector.getInstance(clazz); } return injectMembers(this.delegate.createMap(mf)); }
@Override public Object decode(Class targetClass, Object fromDBObject, final MappedField mf) throws MappingException { if (fromDBObject == null) return null; final Map values = mapr.getOptions().objectFactory.createMap(mf); new IterHelper<Object, Object>().loopMap((Object) fromDBObject, new MapIterCallback<Object, Object>() { @Override public void eval(Object key, Object val) { Object objKey = converters.decode(mf.getMapKeyClass(), key); values.put(objKey, converters.decode(mf.getSubClass(), val)); } }); return values; }
private void writeMap(final MappedField mf, final DBObject dbObject, String name, Object fieldValue, Mapper mapr) { Map<Object, Object> map = (Map<Object, Object>) fieldValue; if ((map != null)) { Map values = mapr.getOptions().objectFactory.createMap(mf); if (ProxyHelper.isProxy(map) && ProxyHelper.isUnFetched(map)) { ProxiedEntityReferenceMap proxy = (ProxiedEntityReferenceMap) map; Map<Object, Key<?>> refMap = proxy.__getReferenceMap(); for (Map.Entry<Object, Key<?>> entry : refMap.entrySet()) { Object strKey = entry.getKey(); values.put(strKey, mapr.keyToRef(entry.getValue())); } } else { for (Map.Entry<Object, Object> entry : map.entrySet()) { String strKey = mapr.getConverters().encode(entry.getKey()).toString(); values.put(strKey, mapr.keyToRef(getKey(entry.getValue(), mapr))); } } if (values.size() > 0 || mapr.getOptions().storeEmpties) { dbObject.put(name, values); } } }
private void readMap(final DBObject dbObject, final MappedField mf, final Object entity, final EntityCache cache, final Mapper mapr) { final Map map = mapr.getOptions().objectFactory.createMap(mf); DBObject dbObj = (DBObject) mf.getDbObjectValue(dbObject); new IterHelper<Object, Object>().loopMap((Object) dbObj, new MapIterCallback<Object, Object>() { @Override public void eval(Object key, Object val) { Object newEntity = null; //run converters if (val != null) { if (mapr.getConverters().hasSimpleValueConverter(mf) || mapr.getConverters().hasSimpleValueConverter(mf.getSubClass())) newEntity = mapr.getConverters().decode(mf.getSubClass(), val, mf); else { if (val instanceof DBObject) newEntity = readMapOrCollectionOrEntity((DBObject) val, mf, cache, mapr); else throw new MappingException("Embedded element isn't a DBObject! How can it be that is a " + val.getClass()); } } Object objKey = mapr.getConverters().decode(mf.getMapKeyClass(), key); map.put(objKey, newEntity); } }); if (map.size() > 0) { mf.setFieldValue(entity, map); } }
private void readMap(final DBObject dbObject, final MappedField mf, final Object entity, final Reference refAnn, final EntityCache cache, final Mapper mapr) { Class referenceObjClass = mf.getSubClass(); Map m = mapr.getOptions().objectFactory.createMap(mf); DBObject dbVal = (DBObject) mf.getDbObjectValue(dbObject); if (dbVal != null) { if (refAnn.lazy() && LazyFeatureDependencies.assertDependencyFullFilled()) { // replace map by proxy to it. m = mapr.getProxyFactory().createMapProxy(m, referenceObjClass, refAnn.ignoreMissing(), mapr.getDatastoreProvider()); } final Map map = m; new IterHelper<Object, Object>().loopMap(dbVal, new MapIterCallback<Object, Object>() { @Override public void eval(Object key, Object val) { DBRef dbRef = (DBRef) val; Object objKey = mapr.getConverters().decode(mf.getMapKeyClass(), key); if (refAnn.lazy() && LazyFeatureDependencies.assertDependencyFullFilled()) { ProxiedEntityReferenceMap proxiedMap = (ProxiedEntityReferenceMap) map; proxiedMap.__put(objKey, mapr.refToKey(dbRef)); } else { Object resolvedObject = resolveObject(dbRef, mf, cache, mapr); map.put(objKey, resolvedObject); } } }); } mf.setFieldValue(entity, m); }