Search in sources :

Example 1 with EntityStoreException

use of org.qi4j.spi.entitystore.EntityStoreException in project qi4j-sdk by Qi4j.

the class JSONEntityState method cloneStateIfGlobalStateLoaded.

void cloneStateIfGlobalStateLoaded() {
    if (isStateNotCloned()) {
        return;
    }
    try {
        JSONObject newProperties = cloneJSON(state.getJSONObject(JSONKeys.PROPERTIES));
        JSONObject newAssoc = cloneJSON(state.getJSONObject(JSONKeys.ASSOCIATIONS));
        JSONObject newManyAssoc = cloneJSON(state.getJSONObject(JSONKeys.MANY_ASSOCIATIONS));
        JSONObject newNamedAssoc = cloneJSON(state.getJSONObject(JSONKeys.NAMED_ASSOCIATIONS));
        JSONObject stateClone = new JSONObject(state, CLONE_NAMES);
        stateClone.put(JSONKeys.PROPERTIES, newProperties);
        stateClone.put(JSONKeys.ASSOCIATIONS, newAssoc);
        stateClone.put(JSONKeys.MANY_ASSOCIATIONS, newManyAssoc);
        stateClone.put(JSONKeys.NAMED_ASSOCIATIONS, newNamedAssoc);
        state = stateClone;
    } catch (JSONException e) {
        throw new EntityStoreException(e);
    }
}
Also used : JSONObject(org.json.JSONObject) JSONException(org.json.JSONException) EntityStoreException(org.qi4j.spi.entitystore.EntityStoreException)

Example 2 with EntityStoreException

use of org.qi4j.spi.entitystore.EntityStoreException in project qi4j-sdk by Qi4j.

the class JSONManyAssociationState method add.

@Override
public boolean add(int idx, EntityReference entityReference) {
    try {
        if (indexOfReference(entityReference.identity()) != -1) {
            return false;
        }
        entityState.cloneStateIfGlobalStateLoaded();
        insertReference(idx, entityReference.identity());
        entityState.markUpdated();
        return true;
    } catch (JSONException e) {
        throw new EntityStoreException(e);
    }
}
Also used : JSONException(org.json.JSONException) EntityStoreException(org.qi4j.spi.entitystore.EntityStoreException)

Example 3 with EntityStoreException

use of org.qi4j.spi.entitystore.EntityStoreException in project qi4j-sdk by Qi4j.

the class JSONMapEntityStoreMixin method newEntityState.

// EntityStoreSPI
@Override
public EntityState newEntityState(EntityStoreUnitOfWork unitOfWork, EntityReference identity, EntityDescriptor entityDescriptor) {
    try {
        JSONObject state = new JSONObject();
        state.put(JSONKeys.IDENTITY, identity.identity());
        state.put(JSONKeys.APPLICATION_VERSION, application.version());
        state.put(JSONKeys.TYPE, first(entityDescriptor.types()).getName());
        state.put(JSONKeys.VERSION, unitOfWork.identity());
        state.put(JSONKeys.MODIFIED, unitOfWork.currentTime());
        state.put(JSONKeys.PROPERTIES, new JSONObject());
        state.put(JSONKeys.ASSOCIATIONS, new JSONObject());
        state.put(JSONKeys.MANY_ASSOCIATIONS, new JSONObject());
        state.put(JSONKeys.NAMED_ASSOCIATIONS, new JSONObject());
        return new JSONEntityState((DefaultEntityStoreUnitOfWork) unitOfWork, valueSerialization, identity, entityDescriptor, state);
    } catch (JSONException e) {
        throw new EntityStoreException(e);
    }
}
Also used : JSONObject(org.json.JSONObject) JSONException(org.json.JSONException) EntityStoreException(org.qi4j.spi.entitystore.EntityStoreException)

Example 4 with EntityStoreException

use of org.qi4j.spi.entitystore.EntityStoreException in project qi4j-sdk by Qi4j.

the class JSONNamedAssociationState method put.

@Override
public boolean put(String name, EntityReference entityReference) {
    try {
        if (references.has(name) && entityReference.identity().equals(references.getString(name))) {
            return false;
        }
        entityState.cloneStateIfGlobalStateLoaded();
        references.put(name, entityReference.identity());
        entityState.markUpdated();
        return true;
    } catch (JSONException ex) {
        throw new EntityStoreException(ex);
    }
}
Also used : JSONException(org.json.JSONException) EntityStoreException(org.qi4j.spi.entitystore.EntityStoreException)

Example 5 with EntityStoreException

use of org.qi4j.spi.entitystore.EntityStoreException in project qi4j-sdk by Qi4j.

the class MapEntityStoreMixin method readEntityState.

protected EntityState readEntityState(DefaultEntityStoreUnitOfWork unitOfWork, Reader entityState) throws EntityStoreException {
    try {
        Module module = unitOfWork.module();
        JSONObject jsonObject = new JSONObject(new JSONTokener(entityState));
        EntityStatus status = EntityStatus.LOADED;
        String version = jsonObject.getString(JSONKeys.VERSION);
        long modified = jsonObject.getLong(JSONKeys.MODIFIED);
        String identity = jsonObject.getString(JSONKeys.IDENTITY);
        // Check if version is correct
        String currentAppVersion = jsonObject.optString(JSONKeys.APPLICATION_VERSION, "0.0");
        if (!currentAppVersion.equals(application.version())) {
            if (migration != null) {
                migration.migrate(jsonObject, application.version(), this);
            } else {
                // Do nothing - set version to be correct
                jsonObject.put(JSONKeys.APPLICATION_VERSION, application.version());
            }
            LoggerFactory.getLogger(MapEntityStoreMixin.class).debug("Updated version nr on " + identity + " from " + currentAppVersion + " to " + application.version());
            // State changed
            status = EntityStatus.UPDATED;
        }
        String type = jsonObject.getString(JSONKeys.TYPE);
        EntityDescriptor entityDescriptor = module.entityDescriptor(type);
        if (entityDescriptor == null) {
            throw new EntityTypeNotFoundException(type);
        }
        Map<QualifiedName, Object> properties = new HashMap<>();
        JSONObject props = jsonObject.getJSONObject(JSONKeys.PROPERTIES);
        for (PropertyDescriptor propertyDescriptor : entityDescriptor.state().properties()) {
            Object jsonValue;
            try {
                jsonValue = props.get(propertyDescriptor.qualifiedName().name());
            } catch (JSONException e) {
                // Value not found, default it
                Object initialValue = propertyDescriptor.initialValue(module);
                properties.put(propertyDescriptor.qualifiedName(), initialValue);
                status = EntityStatus.UPDATED;
                continue;
            }
            if (JSONObject.NULL.equals(jsonValue)) {
                properties.put(propertyDescriptor.qualifiedName(), null);
            } else {
                Object value = valueSerialization.deserialize(propertyDescriptor.valueType(), jsonValue.toString());
                properties.put(propertyDescriptor.qualifiedName(), value);
            }
        }
        Map<QualifiedName, EntityReference> associations = new HashMap<>();
        JSONObject assocs = jsonObject.getJSONObject(JSONKeys.ASSOCIATIONS);
        for (AssociationDescriptor associationType : entityDescriptor.state().associations()) {
            try {
                Object jsonValue = assocs.get(associationType.qualifiedName().name());
                EntityReference value = jsonValue == JSONObject.NULL ? null : EntityReference.parseEntityReference((String) jsonValue);
                associations.put(associationType.qualifiedName(), value);
            } catch (JSONException e) {
                // Association not found, default it to null
                associations.put(associationType.qualifiedName(), null);
                status = EntityStatus.UPDATED;
            }
        }
        JSONObject manyAssocs = jsonObject.getJSONObject(JSONKeys.MANY_ASSOCIATIONS);
        Map<QualifiedName, List<EntityReference>> manyAssociations = new HashMap<>();
        for (AssociationDescriptor manyAssociationType : entityDescriptor.state().manyAssociations()) {
            List<EntityReference> references = new ArrayList<>();
            try {
                JSONArray jsonValues = manyAssocs.getJSONArray(manyAssociationType.qualifiedName().name());
                for (int i = 0; i < jsonValues.length(); i++) {
                    Object jsonValue = jsonValues.getString(i);
                    EntityReference value = jsonValue == JSONObject.NULL ? null : EntityReference.parseEntityReference((String) jsonValue);
                    references.add(value);
                }
                manyAssociations.put(manyAssociationType.qualifiedName(), references);
            } catch (JSONException e) {
                // ManyAssociation not found, default to empty one
                manyAssociations.put(manyAssociationType.qualifiedName(), references);
            }
        }
        JSONObject namedAssocs = jsonObject.getJSONObject(JSONKeys.NAMED_ASSOCIATIONS);
        Map<QualifiedName, Map<String, EntityReference>> namedAssociations = new HashMap<>();
        for (AssociationDescriptor namedAssociationType : entityDescriptor.state().namedAssociations()) {
            Map<String, EntityReference> references = new LinkedHashMap<>();
            try {
                JSONObject jsonValues = namedAssocs.getJSONObject(namedAssociationType.qualifiedName().name());
                JSONArray names = jsonValues.names();
                if (names != null) {
                    for (int idx = 0; idx < names.length(); idx++) {
                        String name = names.getString(idx);
                        Object value = jsonValues.get(name);
                        EntityReference ref = value == JSONObject.NULL ? null : EntityReference.parseEntityReference((String) value);
                        references.put(name, ref);
                    }
                }
                namedAssociations.put(namedAssociationType.qualifiedName(), references);
            } catch (JSONException e) {
                // NamedAssociation not found, default to empty one
                namedAssociations.put(namedAssociationType.qualifiedName(), references);
            }
        }
        return new DefaultEntityState(unitOfWork, version, modified, EntityReference.parseEntityReference(identity), status, entityDescriptor, properties, associations, manyAssociations, namedAssociations);
    } catch (JSONException e) {
        throw new EntityStoreException(e);
    }
}
Also used : EntityTypeNotFoundException(org.qi4j.api.unitofwork.EntityTypeNotFoundException) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap) ArrayList(java.util.ArrayList) AssociationDescriptor(org.qi4j.api.association.AssociationDescriptor) LinkedHashMap(java.util.LinkedHashMap) EntityReference(org.qi4j.api.entity.EntityReference) EntityStatus(org.qi4j.spi.entity.EntityStatus) List(java.util.List) ArrayList(java.util.ArrayList) EntityStoreException(org.qi4j.spi.entitystore.EntityStoreException) PropertyDescriptor(org.qi4j.api.property.PropertyDescriptor) QualifiedName(org.qi4j.api.common.QualifiedName) JSONArray(org.json.JSONArray) JSONException(org.json.JSONException) JSONTokener(org.json.JSONTokener) EntityDescriptor(org.qi4j.api.entity.EntityDescriptor) JSONObject(org.json.JSONObject) JSONObject(org.json.JSONObject) Module(org.qi4j.api.structure.Module) Map(java.util.Map) HashMap(java.util.HashMap) LinkedHashMap(java.util.LinkedHashMap)

Aggregations

EntityStoreException (org.qi4j.spi.entitystore.EntityStoreException)35 JSONException (org.json.JSONException)16 JSONObject (org.json.JSONObject)13 EntityReference (org.qi4j.api.entity.EntityReference)9 PropertyDescriptor (org.qi4j.api.property.PropertyDescriptor)9 EntityDescriptor (org.qi4j.api.entity.EntityDescriptor)8 EntityNotFoundException (org.qi4j.spi.entitystore.EntityNotFoundException)8 IOException (java.io.IOException)7 ArrayList (java.util.ArrayList)6 HashMap (java.util.HashMap)6 LinkedHashMap (java.util.LinkedHashMap)6 List (java.util.List)6 Map (java.util.Map)6 JSONArray (org.json.JSONArray)6 QualifiedName (org.qi4j.api.common.QualifiedName)6 ValueSerializationException (org.qi4j.api.value.ValueSerializationException)5 DefaultEntityState (org.qi4j.spi.entitystore.helpers.DefaultEntityState)5 StringReader (java.io.StringReader)4 Connection (java.sql.Connection)4 Module (org.qi4j.api.structure.Module)4