Search in sources :

Example 11 with Key

use of com.google.appengine.api.datastore.Key in project siena by mandubian.

the class GaePersistenceManager method _insertPutEntities.

private <T> int _insertPutEntities(Iterable<Entity> entities, Iterable<T> objects) {
    List<Key> generatedKeys = ds.put(entities);
    int i = 0;
    Map<Key, Map<Field, List<Object>>> keyMap = new HashMap<Key, Map<Field, List<Object>>>();
    List<ClassInfo> infos = new ArrayList<ClassInfo>();
    List<Object> relObjects = new ArrayList<Object>();
    for (Object obj : objects) {
        Class<?> clazz = obj.getClass();
        ClassInfo info = ClassInfo.getClassInfo(clazz);
        Field idField = info.getIdField();
        GaeMappingUtils.setIdFromKey(idField, obj, generatedKeys.get(i));
        if (info.hasAggregatedFields) {
            infos.add(info);
            Map<Field, List<Object>> objectMap = new HashMap<Field, List<Object>>();
            keyMap.put(generatedKeys.get(i), objectMap);
            _populateAggregateFieldMap(objectMap, info, obj);
        }
        if (info.hasOwnedFields) {
            _populateOwnedList(relObjects, info, obj);
        }
        i++;
    }
    if (!keyMap.isEmpty()) {
        _insertMultipleMapFromParent(keyMap, infos);
    }
    if (!relObjects.isEmpty()) {
        // uses save because we don't know if the objects where already saved or not
        save(relObjects);
    }
    return generatedKeys.size();
}
Also used : HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Field(java.lang.reflect.Field) QueryResultList(com.google.appengine.api.datastore.QueryResultList) ArrayList(java.util.ArrayList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map) Key(com.google.appengine.api.datastore.Key) ClassInfo(siena.ClassInfo)

Example 12 with Key

use of com.google.appengine.api.datastore.Key in project siena by mandubian.

the class GaePersistenceManager method delete.

public void delete(Object obj) {
    List<Key> keys = new ArrayList<Key>();
    Class<?> clazz = obj.getClass();
    ClassInfo info = ClassInfo.getClassInfo(clazz);
    if (info.hasAggregator) {
        Relation rel = (Relation) Util.readField(obj, info.aggregator);
        if (rel != null && rel.mode == RelationMode.AGGREGATION) {
            ClassInfo parentInfo = ClassInfo.getClassInfo(rel.target.getClass());
            Key parentKey = GaeMappingUtils.makeKey(parentInfo, rel.target);
            _deleteSingle(obj, keys, parentKey, parentInfo, (Field) rel.discriminator);
        } else {
            _deleteSingle(obj, keys, null, null, null);
        }
    } else {
        _deleteSingle(obj, keys, null, null, null);
    }
    ds.delete(keys);
}
Also used : Relation(siena.core.Relation) ArrayList(java.util.ArrayList) Key(com.google.appengine.api.datastore.Key) ClassInfo(siena.ClassInfo)

Example 13 with Key

use of com.google.appengine.api.datastore.Key in project siena by mandubian.

the class GaePersistenceManager method mapJoins.

protected <T> List<T> mapJoins(List<T> models) {
    try {
        // join queries
        Map<Field, ArrayList<Key>> fieldMap = null;
        // creates the list of joined entity keys to extract 
        for (final T model : models) {
            // initializes fieldMap
            if (fieldMap == null) {
                fieldMap = GaeQueryUtils.buildJoinFieldKeysMap(model);
            }
            for (Field field : fieldMap.keySet()) {
                Object objVal = Util.readField(model, field);
                // our object is not linked to another object...so it doesn't have any key
                if (objVal == null) {
                    continue;
                }
                Key key = GaeMappingUtils.getKey(objVal);
                List<Key> keys = fieldMap.get(field);
                if (!keys.contains(key))
                    keys.add(key);
            }
        }
        Map<Field, Map<Key, Entity>> entityMap = new HashMap<Field, Map<Key, Entity>>();
        try {
            // retrieves all joined entities per field
            for (Field field : fieldMap.keySet()) {
                Map<Key, Entity> entities = ds.get(fieldMap.get(field));
                // gets the future here because we need it so we wait for it
                entityMap.put(field, entities);
            }
        } catch (Exception ex) {
            throw new SienaException(ex);
        }
        // associates linked models to their models
        // linkedModels is just a map to contain entities already mapped
        Map<Key, Object> linkedModels = new HashMap<Key, Object>();
        Object linkedObj;
        Entity entity;
        for (final T model : models) {
            for (Field field : fieldMap.keySet()) {
                Object objVal = Util.readField(model, field);
                // our object is not linked to another object...so it doesn't have any key
                if (objVal == null) {
                    continue;
                }
                Key key = GaeMappingUtils.getKey(objVal);
                linkedObj = linkedModels.get(key);
                if (linkedObj == null) {
                    entity = entityMap.get(field).get(key);
                    linkedObj = objVal;
                    GaeMappingUtils.fillModel(linkedObj, entity);
                    linkedModels.put(key, linkedObj);
                }
                field.set(model, linkedObj);
            }
        }
        return models;
    } catch (IllegalAccessException ex) {
        throw new SienaException(ex);
    }
}
Also used : Entity(com.google.appengine.api.datastore.Entity) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) SienaException(siena.SienaException) EntityNotFoundException(com.google.appengine.api.datastore.EntityNotFoundException) Field(java.lang.reflect.Field) SienaException(siena.SienaException) HashMap(java.util.HashMap) Map(java.util.Map) Key(com.google.appengine.api.datastore.Key)

Example 14 with Key

use of com.google.appengine.api.datastore.Key in project siena by mandubian.

the class GaePersistenceManager method _insertSingle.

private <T> void _insertSingle(T obj, final Key parentEntityKey, final Object parentObj, final ClassInfo parentInfo, final Field field) {
    Class<?> clazz = obj.getClass();
    ClassInfo info = ClassInfo.getClassInfo(clazz);
    Field idField = info.getIdField();
    final Entity entity;
    // first put the entity to have its ID at least!
    if (parentEntityKey == null) {
        entity = GaeMappingUtils.createEntityInstance(idField, info, obj);
        GaeMappingUtils.fillEntity(obj, entity);
        ds.put(entity);
        GaeMappingUtils.setIdFromKey(idField, obj, entity.getKey());
    } else {
        entity = GaeMappingUtils.createEntityInstanceFromParent(idField, info, obj, parentEntityKey, parentInfo, field);
        GaeMappingUtils.fillEntity(obj, entity);
        ds.put(entity);
        GaeMappingUtils.setIdFromKey(idField, obj, entity.getKey());
    }
    if (info.hasAggregatedFields) {
        Map<Key, Map<Field, List<Object>>> keyMap = new HashMap<Key, Map<Field, List<Object>>>();
        Map<Field, List<Object>> objectMap = new HashMap<Field, List<Object>>();
        keyMap.put(entity.getKey(), objectMap);
        _populateAggregateFieldMap(objectMap, info, obj);
        _insertMultipleMapFromParent(keyMap, Arrays.asList(info));
    }
    if (info.hasOwnedFields) {
        List<Object> relObjects = new ArrayList<Object>();
        _populateOwnedList(relObjects, info, obj);
        // uses save because we don't know if the objects where already saved or not
        save(relObjects);
    }
}
Also used : Entity(com.google.appengine.api.datastore.Entity) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Field(java.lang.reflect.Field) QueryResultList(com.google.appengine.api.datastore.QueryResultList) ArrayList(java.util.ArrayList) List(java.util.List) HashMap(java.util.HashMap) Map(java.util.Map) Key(com.google.appengine.api.datastore.Key) ClassInfo(siena.ClassInfo)

Example 15 with Key

use of com.google.appengine.api.datastore.Key in project siena by mandubian.

the class GaePersistenceManager method _updateBuildMaps.

//	private <T> int _updateComplexMultiple(Iterable<T> objs, Key parentKey, ClassInfo parentInfo, Field parentField){
//		HashMap<PersistenceType, List<Entity>> entitiesMap = new HashMap<PersistenceType, List<Entity>>(); 
//		HashMap<PersistenceType, List<Object>> objectsMap = new HashMap<PersistenceType, List<Object>>(); 
//		HashMap<PersistenceType, List<Key>> keysMap = new HashMap<PersistenceType, List<Key>>(); 
//
//		for(Object obj:objs){
//			_updateBuildMaps(entitiesMap, objectsMap, keysMap, obj, null, null, null);
//		}
//		
//		return _updateManageMaps(entitiesMap, objectsMap, keysMap);
//	}
//private void _buildUpdateList(List<Entity> entities2Insert, List<Object> objects2Insert, List<Entity> entities2Update, List<Key> entities2Remove, List<Object> objects2Save, Object obj, Key parentKey, ClassInfo parentInfo, Field parentField){
private static void _updateBuildMaps(HashMap<PersistenceType, List<Entity>> entitiesMap, HashMap<PersistenceType, List<Object>> objectsMap, HashMap<PersistenceType, List<Key>> keysMap, Object obj, Key parentKey, ClassInfo parentInfo, Field parentField) {
    Class<?> clazz = obj.getClass();
    ClassInfo info = ClassInfo.getClassInfo(clazz);
    Field idField = info.getIdField();
    Entity entity;
    Object idVal = Util.readField(obj, idField);
    // id with null value means insert
    if (idVal == null) {
        if (parentKey == null) {
            entity = GaeMappingUtils.createEntityInstance(idField, info, obj);
        } else {
            entity = GaeMappingUtils.createEntityInstanceFromParent(idField, info, obj, parentKey, parentInfo, parentField);
        }
        GaeMappingUtils.fillEntity(obj, entity);
        List<Entity> entities2Insert = entitiesMap.get(PersistenceType.INSERT);
        if (entities2Insert == null) {
            entities2Insert = new ArrayList<Entity>();
            entitiesMap.put(PersistenceType.INSERT, entities2Insert);
        }
        entities2Insert.add(entity);
        List<Object> objects2Insert = objectsMap.get(PersistenceType.INSERT);
        if (objects2Insert == null) {
            objects2Insert = new ArrayList<Object>();
            objectsMap.put(PersistenceType.INSERT, objects2Insert);
        }
        objects2Insert.add(obj);
    } else {
        if (parentKey == null) {
            entity = GaeMappingUtils.createEntityInstanceForUpdate(info, obj);
        } else {
            entity = GaeMappingUtils.createEntityInstanceForUpdateFromParent(info, obj, parentKey, parentInfo, parentField);
        }
        GaeMappingUtils.fillEntity(obj, entity);
        List<Entity> entities2Update = entitiesMap.get(PersistenceType.UPDATE);
        if (entities2Update == null) {
            entities2Update = new ArrayList<Entity>();
            entitiesMap.put(PersistenceType.UPDATE, entities2Update);
        }
        entities2Update.add(entity);
    }
    for (Field f : info.ownedFields) {
        // doesn't do anything with One<T>
        if (ClassInfo.isOne(f)) {
            // set the owner field in the child object using the content of the one
            One4PM<?> relObj = (One4PM<?>) Util.readField(obj, f);
            Map<FieldMapKeys, Object> m = info.oneFieldMap.get(f);
            if (m != null) {
                Field asField = (Field) m.get(FieldMapKeys.FIELD);
                if (relObj.isModified()) {
                    // unassociates previous object
                    Object prevObj = relObj.getPrev();
                    if (prevObj != null) {
                        Util.setField(prevObj, asField, null);
                    }
                    // resets modified flag
                    relObj.setModified(false);
                    List<Object> objects2Save = objectsMap.get(PersistenceType.SAVE);
                    if (objects2Save == null) {
                        objects2Save = new ArrayList<Object>();
                        objectsMap.put(PersistenceType.SAVE, objects2Save);
                    }
                    objects2Save.add(prevObj);
                    Object oneObj = relObj.get();
                    if (oneObj != null) {
                        Util.setField(oneObj, asField, obj);
                        objects2Save.add(oneObj);
                    }
                }
            }
        } else if (ClassInfo.isMany(f)) {
            Many4PM<?> lq = (Many4PM<?>) Util.readField(obj, f);
            // when you remove an element from a Many<T>, it just removes the link
            if (!lq.asList2Remove().isEmpty()) {
                Field asField = (Field) info.manyFieldMap.get(f).get(FieldMapKeys.FIELD);
                for (Object elt : lq.asList2Remove()) {
                    Util.setField(elt, asField, null);
                    List<Object> objects2Save = objectsMap.get(PersistenceType.SAVE);
                    if (objects2Save == null) {
                        objects2Save = new ArrayList<Object>();
                        objectsMap.put(PersistenceType.SAVE, objects2Save);
                    }
                    objects2Save.add(elt);
                }
                lq.asList2Remove().clear();
            }
            if (!lq.asList2Add().isEmpty()) {
                Field asField = (Field) info.manyFieldMap.get(f).get(FieldMapKeys.FIELD);
                for (Object elt : lq.asList2Add()) {
                    Util.setField(elt, asField, obj);
                    List<Object> objects2Save = objectsMap.get(PersistenceType.SAVE);
                    if (objects2Save == null) {
                        objects2Save = new ArrayList<Object>();
                        objectsMap.put(PersistenceType.SAVE, objects2Save);
                    }
                    objects2Save.add(elt);
                }
                lq.asList2Add().clear();
            }
        }
    }
    for (Field f : info.aggregatedFields) {
        if (ClassInfo.isOne(f)) {
            One4PM<?> one = (One4PM<?>) Util.readField(obj, f);
            if (one.isModified()) {
                // deletes previous object
                Object prevObj = one.getPrev();
                if (prevObj != null) {
                    Class<?> delClazz = prevObj.getClass();
                    ClassInfo delInfo = ClassInfo.getClassInfo(delClazz);
                    Key delKey = GaeMappingUtils.makeKeyFromParent(delInfo, prevObj, entity.getKey(), info, f);
                    List<Key> key2Remove = keysMap.get(PersistenceType.DELETE);
                    if (key2Remove == null) {
                        key2Remove = new ArrayList<Key>();
                        keysMap.put(PersistenceType.DELETE, key2Remove);
                    }
                    key2Remove.add(delKey);
                }
                // resets modified flag
                one.setModified(false);
                Object oneObj = one.get();
                if (oneObj != null) {
                    _updateBuildMaps(entitiesMap, objectsMap, keysMap, oneObj, entity.getKey(), info, f);
                }
            }
        } else if (ClassInfo.isMany(f)) {
            Many4PM<?> lq = (Many4PM<?>) Util.readField(obj, f);
            // add to entities2remove child entities that have been removed
            if (!lq.asList2Remove().isEmpty()) {
                Key delKey;
                for (Object elt : lq.asList2Remove()) {
                    Class<?> delClazz = elt.getClass();
                    ClassInfo delInfo = ClassInfo.getClassInfo(delClazz);
                    delKey = GaeMappingUtils.makeKeyFromParent(delInfo, elt, entity.getKey(), info, f);
                    List<Key> key2Remove = keysMap.get(PersistenceType.DELETE);
                    if (key2Remove == null) {
                        key2Remove = new ArrayList<Key>();
                        keysMap.put(PersistenceType.DELETE, key2Remove);
                    }
                    key2Remove.add(delKey);
                }
                lq.asList2Remove().clear();
            }
            if (!lq.asList2Add().isEmpty()) {
                for (Object elt : lq.asList2Add()) {
                    _updateBuildMaps(entitiesMap, objectsMap, keysMap, elt, entity.getKey(), info, f);
                }
                lq.asList2Add().clear();
            }
        }
    }
}
Also used : One4PM(siena.core.One4PM) Entity(com.google.appengine.api.datastore.Entity) ArrayList(java.util.ArrayList) Field(java.lang.reflect.Field) FieldMapKeys(siena.ClassInfo.FieldMapKeys) Many4PM(siena.core.Many4PM) QueryResultList(com.google.appengine.api.datastore.QueryResultList) ArrayList(java.util.ArrayList) List(java.util.List) Key(com.google.appengine.api.datastore.Key) ClassInfo(siena.ClassInfo)

Aggregations

Key (com.google.appengine.api.datastore.Key)47 Entity (com.google.appengine.api.datastore.Entity)34 ArrayList (java.util.ArrayList)24 ClassInfo (siena.ClassInfo)23 Field (java.lang.reflect.Field)22 SienaException (siena.SienaException)14 HashMap (java.util.HashMap)11 List (java.util.List)11 QueryResultList (com.google.appengine.api.datastore.QueryResultList)10 EntityNotFoundException (com.google.appengine.api.datastore.EntityNotFoundException)9 Map (java.util.Map)9 SienaFutureContainer (siena.core.async.SienaFutureContainer)9 SienaFutureWrapper (siena.core.async.SienaFutureWrapper)9 DatastoreService (com.google.appengine.api.datastore.DatastoreService)6 Relation (siena.core.Relation)5 SienaRestrictedApiException (siena.SienaRestrictedApiException)4 IOException (java.io.IOException)3 NotImplementedException (org.apache.commons.lang.NotImplementedException)3 Text (com.google.appengine.api.datastore.Text)2 AppRole (samples.gae.security.AppRole)2