@Override public IHistoryResource<T> newHistoryResourceFor(IResource resource, boolean deleted) { Resource mongoResource = checkInternalResource(resource); Document historyObject = new Document(mongoResource.getMongoDocument()); Document idObject = new Document(); idObject.put(ID_FIELD, new ObjectId(resource.getId())); idObject.put(VERSION_FIELD, resource.getVersion()); historyObject.put(ID_FIELD, idObject); if (deleted) { historyObject.put(DELETED_FIELD, true); } return new HistoryResource(historyObject); }
@Override public T read(String id, Integer version) throws IResourceStore.ResourceNotFoundException, IResourceStore.ResourceStoreException { RuntimeUtilities.checkNotNull(id, "id"); RuntimeUtilities.checkNotNull(version, "version"); IResourceStorage.IResource<T> current = resourceStorage.read(id, version); if (current == null) { IResourceStorage.IHistoryResource historyResource = resourceStorage.readHistory(id, version); if (historyResource == null || historyResource.isDeleted()) { throw createResourceNotFoundException(id, version); } current = historyResource; } try { return current.getData(); } catch (IOException e) { String message = "Unable to deserialize resource (id=%s, version=%s)"; message = String.format(message, id, version); throw new IResourceStore.ResourceStoreException(message, e); } }
@Override public Integer update(String id, Integer version, T content) throws IResourceStore.ResourceStoreException, IResourceStore.ResourceModifiedException, IResourceStore.ResourceNotFoundException { RuntimeUtilities.checkNotNull(id, "id"); RuntimeUtilities.checkNotNull(version, "version"); RuntimeUtilities.checkNotNull(content, "content"); IResourceStorage.IResource resource = resourceStorage.read(id, version); checkIfFoundAndLatest(id, version, resource); IResourceStorage.IHistoryResource history = resourceStorage.newHistoryResourceFor(resource, false); resourceStorage.store(history); try { Integer newVersion = resource.getVersion() + 1; IResourceStorage.IResource newResource = resourceStorage.newResource(resource.getId(), newVersion, content); resourceStorage.store(newResource); return newVersion; } catch (IOException e) { throw new IResourceStore.ResourceStoreException(e.getLocalizedMessage(), e); } }