package com.kdcloud.server.rest.resource; import org.restlet.data.Status; import org.restlet.representation.Representation; import org.restlet.resource.ResourceException; import com.kdcloud.lib.rest.api.MetadataResource; import com.kdcloud.lib.rest.ext.LinkRepresentation; import com.kdcloud.server.entity.Describable; import com.kdcloud.server.entity.Entity; import com.kdcloud.server.rest.application.UrlHelper; public abstract class BasicServerResource<T extends Entity> extends KDServerResource { /** * returns the stored resource identified, or null if it does not exist */ public abstract T find(); /** * create a new resource instance to be stored * @return the instance created */ public abstract T create(); /** * persists the resource * @param e the resource to be persistet */ public abstract void save(T e); /** * deletes a persistent resource */ public abstract void delete(T e); public abstract void update(T entity, Representation representation); public void createOrUpdate(Representation representation) { T resource = find(); if (resource == null) { resource = create(); setStatus(Status.SUCCESS_CREATED); } else { setStatus(Status.SUCCESS_NO_CONTENT); } update(resource, representation); save(resource); if (getStatus().equals(Status.SUCCESS_CREATED) && resource instanceof Describable) { String metadataUrl = getHostRef() + UrlHelper.replaceId(MetadataResource.URI, resource.getUUID()); getResponse().setEntity(new LinkRepresentation("metadata", metadataUrl)); } } public T read() { T resource = find(); if (resource == null) { throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND); } setStatus(Status.SUCCESS_OK); return resource; } public void remove() { T resource = find(); if (resource == null) { throw new ResourceException(Status.CLIENT_ERROR_NOT_FOUND); } else { delete(resource); setStatus(Status.SUCCESS_NO_CONTENT); } } }