use of org.qi4j.spi.entitystore.EntityStoreUnitOfWork in project qi4j-sdk by Qi4j.
the class EntityResource method get.
@Override
protected Representation get(Variant variant) throws ResourceException {
EntityStoreUnitOfWork uow = entityStore.newUnitOfWork(UsecaseBuilder.newUsecase("Get entity"), module, System.currentTimeMillis());
try {
EntityState entityState = getEntityState(uow);
// Check modification date
Date lastModified = getRequest().getConditions().getModifiedSince();
if (lastModified != null) {
if (lastModified.getTime() / 1000 == entityState.lastModified() / 1000) {
throw new ResourceException(Status.REDIRECTION_NOT_MODIFIED);
}
}
// Generate the right representation according to its media type.
if (MediaType.APPLICATION_RDF_XML.equals(variant.getMediaType())) {
return entityHeaders(representRdfXml(entityState), entityState);
} else if (MediaType.TEXT_HTML.equals(variant.getMediaType())) {
return entityHeaders(representHtml(entityState), entityState);
} else if (MediaType.APPLICATION_JSON.equals(variant.getMediaType())) {
return entityHeaders(representJson(entityState), entityState);
}
} catch (ResourceException ex) {
uow.discard();
throw ex;
}
throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND);
}
use of org.qi4j.spi.entitystore.EntityStoreUnitOfWork in project qi4j-sdk by Qi4j.
the class UnitOfWorkInstance method get.
public <T> T get(EntityReference identity, ModuleUnitOfWork uow, Iterable<ModelModule<EntityModel>> potentialModels, Class<T> mixinType) throws EntityTypeNotFoundException, NoSuchEntityException {
checkOpen();
EntityInstance entityInstance = instanceCache.get(identity);
if (entityInstance == null) {
// Not yet in cache
// Check if this is a root UoW, or if no parent UoW knows about this entity
EntityState entityState = null;
EntityModel model = null;
ModuleInstance module = null;
// Figure out what EntityStore to use
for (ModelModule<EntityModel> potentialModel : potentialModels) {
EntityStore store = potentialModel.module().entityStore();
EntityStoreUnitOfWork storeUow = getEntityStoreUnitOfWork(store, potentialModel.module());
try {
entityState = storeUow.entityStateOf(identity);
} catch (EntityNotFoundException e) {
continue;
}
// Get the selected model
model = (EntityModel) entityState.entityDescriptor();
module = potentialModel.module();
}
// Check if model was found
if (model == null) {
// Check if state was found
if (entityState == null) {
throw new NoSuchEntityException(identity);
} else {
throw new EntityTypeNotFoundException(mixinType.getName());
}
}
// Create instance
entityInstance = new EntityInstance(uow, module, model, entityState);
instanceCache.put(identity, entityInstance);
} else {
// Check if it has been removed
if (entityInstance.status() == EntityStatus.REMOVED) {
throw new NoSuchEntityException(identity);
}
}
return entityInstance.proxy();
}
use of org.qi4j.spi.entitystore.EntityStoreUnitOfWork in project qi4j-sdk by Qi4j.
the class EntityResource method delete.
@Override
protected Representation delete(Variant variant) throws ResourceException {
Usecase usecase = UsecaseBuilder.newUsecase("Remove entity");
EntityStoreUnitOfWork uow = entityStore.newUnitOfWork(usecase, module, System.currentTimeMillis());
try {
EntityReference identityRef = EntityReference.parseEntityReference(identity);
uow.entityStateOf(identityRef).remove();
uow.applyChanges().commit();
getResponse().setStatus(Status.SUCCESS_NO_CONTENT);
} catch (EntityNotFoundException e) {
uow.discard();
getResponse().setStatus(Status.CLIENT_ERROR_NOT_FOUND);
}
return new EmptyRepresentation();
}
use of org.qi4j.spi.entitystore.EntityStoreUnitOfWork in project qi4j-sdk by Qi4j.
the class EntityResource method post.
@Override
public Representation post(Representation entityRepresentation, Variant variant) throws ResourceException {
Usecase usecase = UsecaseBuilder.newUsecase("Update entity");
EntityStoreUnitOfWork unitOfWork = entityStore.newUnitOfWork(usecase, module, System.currentTimeMillis());
EntityState entity = getEntityState(unitOfWork);
Form form = new Form(entityRepresentation);
try {
final EntityDescriptor descriptor = entity.entityDescriptor();
// Parse JSON into properties
for (PropertyDescriptor persistentProperty : descriptor.state().properties()) {
if (!persistentProperty.isImmutable()) {
String formValue = form.getFirstValue(persistentProperty.qualifiedName().name(), null);
if (formValue == null) {
entity.setPropertyValue(persistentProperty.qualifiedName(), null);
} else {
entity.setPropertyValue(persistentProperty.qualifiedName(), valueSerialization.deserialize(persistentProperty.valueType(), formValue));
}
}
}
for (AssociationDescriptor associationType : descriptor.state().associations()) {
String newStringAssociation = form.getFirstValue(associationType.qualifiedName().name());
if (newStringAssociation == null || newStringAssociation.equals("")) {
entity.setAssociationValue(associationType.qualifiedName(), null);
} else {
entity.setAssociationValue(associationType.qualifiedName(), EntityReference.parseEntityReference(newStringAssociation));
}
}
for (AssociationDescriptor associationType : descriptor.state().manyAssociations()) {
String newStringAssociation = form.getFirstValue(associationType.qualifiedName().name());
ManyAssociationState manyAssociation = entity.manyAssociationValueOf(associationType.qualifiedName());
if (newStringAssociation == null) {
// Remove "left-overs"
for (EntityReference entityReference : manyAssociation) {
manyAssociation.remove(entityReference);
}
continue;
}
BufferedReader bufferedReader = new BufferedReader(new StringReader(newStringAssociation));
String identity;
try {
// Synchronize old and new association
int index = 0;
while ((identity = bufferedReader.readLine()) != null) {
EntityReference reference = new EntityReference(identity);
if (manyAssociation.count() < index && manyAssociation.get(index).equals(reference)) {
continue;
}
try {
unitOfWork.entityStateOf(reference);
manyAssociation.remove(reference);
manyAssociation.add(index++, reference);
} catch (EntityNotFoundException e) {
// Ignore this entity - doesn't exist
}
}
// Remove "left-overs"
while (manyAssociation.count() > index) {
manyAssociation.remove(manyAssociation.get(index));
}
} catch (IOException e) {
// Ignore
}
}
} catch (ValueSerializationException e) {
throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e);
} catch (IllegalArgumentException e) {
throw new ResourceException(Status.SERVER_ERROR_INTERNAL, e);
}
try {
unitOfWork.applyChanges().commit();
} catch (ConcurrentEntityStateModificationException e) {
throw new ResourceException(Status.CLIENT_ERROR_CONFLICT);
} catch (EntityNotFoundException e) {
throw new ResourceException(Status.CLIENT_ERROR_GONE);
}
getResponse().setStatus(Status.SUCCESS_RESET_CONTENT);
return new EmptyRepresentation();
}
use of org.qi4j.spi.entitystore.EntityStoreUnitOfWork in project qi4j-sdk by Qi4j.
the class UnitOfWorkInstance method getEntityStoreUnitOfWork.
public EntityStoreUnitOfWork getEntityStoreUnitOfWork(EntityStore store, Module module) {
EntityStoreUnitOfWork uow = storeUnitOfWork.get(store);
if (uow == null) {
uow = store.newUnitOfWork(usecase, module, currentTime);
storeUnitOfWork.put(store, uow);
}
return uow;
}
Aggregations