sascha@27: package de.intevation.artifactdatabase.rest; sascha@27: sascha@27: import org.restlet.resource.Get; sascha@27: import org.restlet.resource.Post; sascha@27: import org.restlet.resource.ServerResource; sascha@27: sascha@27: import org.restlet.representation.Representation; sascha@27: import org.restlet.representation.EmptyRepresentation; sascha@27: sascha@27: import org.restlet.ext.xml.DomRepresentation; sascha@27: sascha@27: import de.intevation.artifacts.ArtifactDatabase; sascha@27: import de.intevation.artifacts.Artifact; sascha@27: sascha@27: import org.restlet.data.Request; sascha@27: import org.restlet.data.Response; sascha@27: import org.restlet.data.Status; sascha@27: sascha@27: import org.restlet.data.MediaType; sascha@27: sascha@27: import org.apache.log4j.Logger; sascha@27: sascha@27: import org.w3c.dom.Document; sascha@27: sascha@28: import java.io.IOException; sascha@28: sascha@28: import de.intevation.artifacts.ArtifactNamespaceContext; sascha@28: sascha@28: import de.intevation.artifactdatabase.XMLUtils; sascha@28: sascha@27: /** sascha@27: * @author Sascha L. Teichmann (sascha.teichmann@intevation) sascha@27: */ sascha@27: public class ArtifactResource sascha@27: extends ServerResource sascha@27: { sascha@27: private static Logger logger = Logger.getLogger(ArtifactResource.class); sascha@27: sascha@28: public static final String XPATH_ACTION = "/action/type/@name"; sascha@28: sascha@27: public static final String PATH = "/artifact/{uuid}"; sascha@27: sascha@28: public static final String NO_ACTION_MESSAGE = "no action given"; sascha@28: public static final String NO_SUCH_ACTION_MESSAGE = "no such action"; sascha@28: sascha@27: public static final String NO_ARTIFACT_FOUND = "Artifact not found"; sascha@27: sascha@28: public static final String ADVANCE = "advance"; sascha@28: public static final String FEED = "feed"; sascha@28: sascha@27: @Get sascha@27: public Representation represent() { sascha@27: sascha@27: Request request = getRequest(); sascha@27: sascha@27: String identifier = (String)request.getAttributes().get("uuid"); sascha@27: sascha@27: if (logger.isDebugEnabled()) { sascha@27: logger.debug("looking for artifact id '" + identifier + "'"); sascha@27: } sascha@27: sascha@27: ArtifactDatabase db = (ArtifactDatabase)getContext() sascha@27: .getAttributes().get("database"); sascha@27: sascha@27: Artifact artifact = db.getArtifact(identifier); sascha@27: sascha@27: if (artifact == null) { sascha@27: Response response = getResponse(); sascha@27: response.setStatus(Status.CLIENT_ERROR_NOT_FOUND, NO_ARTIFACT_FOUND); sascha@27: return new EmptyRepresentation(); sascha@27: } sascha@27: sascha@27: Document description = artifact.describe(db.getArtifactContext()); sascha@27: sascha@27: if (logger.isDebugEnabled()) { sascha@27: logger.debug("out document: " + description); sascha@27: } sascha@27: sascha@27: return new DomRepresentation( sascha@27: MediaType.APPLICATION_XML, description); sascha@27: } sascha@27: sascha@27: @Post sascha@27: public Representation representPost() { sascha@28: Request request = getRequest(); sascha@28: sascha@28: Representation requestRepr = request.getEntity(); sascha@28: sascha@28: Document inputDocument = null; sascha@28: try { sascha@28: DomRepresentation input = new DomRepresentation(requestRepr); sascha@28: inputDocument = input.getDocument(); sascha@28: } sascha@28: catch (IOException ioe) { sascha@28: logger.error(ioe.getMessage()); sascha@28: Response response = getResponse(); sascha@28: response.setStatus(Status.CLIENT_ERROR_BAD_REQUEST, ioe); sascha@28: return new EmptyRepresentation(); sascha@28: } sascha@28: sascha@28: String action = XMLUtils.xpathString( sascha@28: inputDocument, sascha@28: XPATH_ACTION, sascha@28: ArtifactNamespaceContext.INSTANCE); sascha@28: sascha@28: if (action == null || action.length() == 0) { sascha@28: Response response = getResponse(); sascha@28: response.setStatus(Status.CLIENT_ERROR_BAD_REQUEST, NO_ACTION_MESSAGE); sascha@28: return new EmptyRepresentation(); sascha@28: } sascha@28: sascha@28: int actionType = -1; sascha@28: sascha@28: if (FEED .equals(action)) actionType = 0; sascha@28: else if (ADVANCE.equals(action)) actionType = 1; sascha@28: else { sascha@28: Response response = getResponse(); sascha@28: response.setStatus(Status.CLIENT_ERROR_BAD_REQUEST, NO_SUCH_ACTION_MESSAGE); sascha@28: return new EmptyRepresentation(); sascha@28: } sascha@28: sascha@28: String identifier = (String)request.getAttributes().get("uuid"); sascha@28: sascha@28: if (logger.isDebugEnabled()) { sascha@28: logger.debug("looking for artifact id '" + identifier + "'"); sascha@28: } sascha@28: sascha@28: ArtifactDatabase db = (ArtifactDatabase)getContext() sascha@28: .getAttributes().get("database"); sascha@28: sascha@28: Artifact artifact = db.getArtifact(identifier); sascha@28: sascha@28: if (artifact == null) { sascha@28: Response response = getResponse(); sascha@28: response.setStatus(Status.CLIENT_ERROR_NOT_FOUND, NO_ARTIFACT_FOUND); sascha@28: return new EmptyRepresentation(); sascha@28: } sascha@28: sascha@28: Document document = null; sascha@28: sascha@28: switch (actionType) { sascha@28: case 0: sascha@28: document = artifact.feed(inputDocument, db.getArtifactContext()); sascha@28: break; sascha@28: case 1: sascha@28: document = artifact.advance(inputDocument, db.getArtifactContext()); sascha@28: break; sascha@28: default: sascha@28: // should not happen sascha@28: return new EmptyRepresentation(); sascha@28: } sascha@28: sascha@28: return new DomRepresentation(MediaType.APPLICATION_XML, document); sascha@27: } sascha@27: } sascha@27: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: