Search in sources :

Example 31 with Key

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

the class GaePersistenceManager method _updateManageMaps.

private int _updateManageMaps(HashMap<PersistenceType, List<Entity>> entitiesMap, HashMap<PersistenceType, List<Object>> objectsMap, HashMap<PersistenceType, List<Key>> keysMap) {
    int nb = 0;
    // saves the updated owned objects
    List<Object> objs = objectsMap.get(PersistenceType.SAVE);
    if (objs != null && !objs.isEmpty()) {
        nb += save(objs);
    }
    // saves the updated aggregated objects
    List<Entity> entities = entitiesMap.get(PersistenceType.INSERT);
    if (entities != null && !entities.isEmpty()) {
        List<Key> generatedKeys = ds.put(entities);
        int i = 0;
        for (Object elt : objectsMap.get(PersistenceType.INSERT)) {
            Class<?> clazz = elt.getClass();
            ClassInfo info = ClassInfo.getClassInfo(clazz);
            Field idField = info.getIdField();
            GaeMappingUtils.setIdFromKey(idField, elt, generatedKeys.get(i));
        }
        nb += generatedKeys.size();
    }
    // saves the updated aggregated objects
    entities = entitiesMap.get(PersistenceType.UPDATE);
    if (entities != null && !entities.isEmpty()) {
        ds.put(entitiesMap.get(PersistenceType.UPDATE));
        nb += entities.size();
    }
    // removes the deleted aggregated objects
    List<Key> keys = keysMap.get(PersistenceType.DELETE);
    if (keys != null && !keys.isEmpty()) {
        ds.delete(keys);
        nb += keys.size();
    }
    return nb;
}
Also used : Entity(com.google.appengine.api.datastore.Entity) Field(java.lang.reflect.Field) Key(com.google.appengine.api.datastore.Key) ClassInfo(siena.ClassInfo)

Example 32 with Key

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

the class GaePersistenceManager method getByKeys.

public <T> List<T> getByKeys(Class<T> clazz, Iterable<?> keys) {
    List<Key> gaeKeys = new ArrayList<Key>();
    ClassInfo info = ClassInfo.getClassInfo(clazz);
    for (Object key : keys) {
        gaeKeys.add(GaeMappingUtils.makeKeyFromId(clazz, key));
    }
    Map<Key, Entity> entityMap = ds.get(gaeKeys);
    List<T> models = new ArrayList<T>(entityMap.size());
    for (Object key : keys) {
        Entity entity = entityMap.get(GaeMappingUtils.makeKeyFromId(clazz, key));
        T obj = null;
        if (entity != null) {
            obj = GaeMappingUtils.mapEntity(entity, clazz);
            if (obj != null) {
                // related fields (Many<T> management mainly)
                if (!info.ownedFields.isEmpty()) {
                    mapOwned(obj);
                }
                // aggregated management
                if (!info.aggregatedFields.isEmpty()) {
                    mapAggregated(obj);
                }
                // join management
                if (!info.joinFields.isEmpty()) {
                    mapJoins(obj);
                }
            }
        }
        models.add(obj);
    }
    return models;
}
Also used : Entity(com.google.appengine.api.datastore.Entity) ArrayList(java.util.ArrayList) Key(com.google.appengine.api.datastore.Key) ClassInfo(siena.ClassInfo)

Example 33 with Key

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

the class GaePersistenceManagerAsync method mapJoins.

protected <T> T mapJoins(QueryAsync<T> query, T model) {
    try {
        // join queries
        Map<Field, ArrayList<Key>> fieldMap = GaeQueryUtils.buildJoinFieldKeysMap(query);
        // creates the list of joined entity keys to extract 
        for (Field field : fieldMap.keySet()) {
            Key key = GaeMappingUtils.getKey(field.get(model));
            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()) {
                Future<Map<Key, Entity>> entities = ds.get(fieldMap.get(field));
                // gets the future here because we need it!
                entityMap.put(field, entities.get());
            }
        } 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 (Field field : fieldMap.keySet()) {
            Object objVal = field.get(model);
            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 model;
    } 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) NotImplementedException(org.apache.commons.lang.NotImplementedException) Field(java.lang.reflect.Field) SienaException(siena.SienaException) HashMap(java.util.HashMap) Map(java.util.Map) Key(com.google.appengine.api.datastore.Key)

Example 34 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(Query<T> query, List<T> models) {
    try {
        // join queries
        Map<Field, ArrayList<Key>> fieldMap = GaeQueryUtils.buildJoinFieldKeysMap(query);
        // creates the list of joined entity keys to extract 
        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);
                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 35 with Key

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

the class GaePersistenceManager method get.

public <T> int get(Iterable<T> objects) {
    List<Key> keys = new ArrayList<Key>();
    for (Object obj : objects) {
        keys.add(GaeMappingUtils.getKey(obj));
    }
    Map<Key, Entity> entityMap = ds.get(keys);
    for (Object obj : objects) {
        Entity e = entityMap.get(GaeMappingUtils.getKey(obj));
        if (e != null) {
            GaeMappingUtils.fillModel(obj, e);
        }
    }
    return entityMap.size();
}
Also used : Entity(com.google.appengine.api.datastore.Entity) ArrayList(java.util.ArrayList) Key(com.google.appengine.api.datastore.Key)

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