# HG changeset patch # User Sascha L. Teichmann # Date 1252597757 0 # Node ID 22b03d5c84c549f3862c35f2ec0d84640f1973d9 # Parent 019b9f02d5230bc87eae65f21113bc05b09bfacc Added REST out handler for artifacts reachable via HTTP GET '/artifact/{uuid}/{type}'. artifacts/trunk@69 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r 019b9f02d523 -r 22b03d5c84c5 Changelog --- a/Changelog Thu Sep 10 14:44:25 2009 +0000 +++ b/Changelog Thu Sep 10 15:49:17 2009 +0000 @@ -1,3 +1,17 @@ +2009-09-10 Sascha L. Teichmann + + * artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactOutResource.java: + New. Handler for 'out'. Reachable via HTTP GET '/artifact/{uuid}/{type}'. + + * artifact-database/src/main/java/de/intevation/artifactdatabase/rest/OutRepresentation.java: + New. Special representation for out. TODO: use streaming API. + + * artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactResource.java: + Regrouped imports. + + * artifact-database/src/main/java/de/intevation/artifactdatabase/rest/RestApp.java: Added + handler for 'out' to routing table. + 2009-09-10 Sascha L. Teichmann * artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactResource.java: diff -r 019b9f02d523 -r 22b03d5c84c5 artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactOutResource.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactOutResource.java Thu Sep 10 15:49:17 2009 +0000 @@ -0,0 +1,100 @@ +package de.intevation.artifactdatabase.rest; + +import org.apache.log4j.Logger; + +import org.restlet.resource.Get; +import org.restlet.resource.ServerResource; + +import org.restlet.data.Request; +import org.restlet.data.Response; +import org.restlet.data.Status; +import org.restlet.data.MediaType; + +import org.restlet.representation.Representation; +import org.restlet.representation.EmptyRepresentation; + +import org.restlet.ext.xml.DomRepresentation; + +import de.intevation.artifactdatabase.XMLUtils; + +import de.intevation.artifacts.ArtifactNamespaceContext; +import de.intevation.artifacts.ArtifactDatabase; +import de.intevation.artifacts.Artifact; + +import org.w3c.dom.Document; + +import java.io.IOException; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation) + */ +public class ArtifactOutResource +extends ServerResource +{ + public static final String PATH = "/artifact/{uuid}/{type}"; + + public static final String XPATH_MIME_TYPE = "/action/out/mime-type/@value"; + + public static final MediaType DEFAULT_MIME_TYPE = + MediaType.APPLICATION_OCTET_STREAM; + + private static Logger logger = Logger.getLogger(ArtifactOutResource.class); + + @Get + public Representation represent() { + + Request request = getRequest(); + + Representation requestRepr = request.getEntity(); + + Document inputDocument = null; + try { + DomRepresentation input = new DomRepresentation(requestRepr); + inputDocument = input.getDocument(); + } + catch (IOException ioe) { + logger.error(ioe.getMessage()); + Response response = getResponse(); + response.setStatus(Status.CLIENT_ERROR_BAD_REQUEST, ioe); + return new EmptyRepresentation(); + } + + ArtifactDatabase db = (ArtifactDatabase)getContext() + .getAttributes().get("database"); + + String identifier = (String)request.getAttributes().get("uuid"); + + if (logger.isDebugEnabled()) { + logger.debug("looking for artifact id '" + identifier + "'"); + } + + Artifact artifact = db.getArtifact(identifier); + + if (artifact == null) { + Response response = getResponse(); + response.setStatus( + Status.CLIENT_ERROR_NOT_FOUND, ArtifactResource.NO_ARTIFACT_FOUND); + return new EmptyRepresentation(); + } + + String mimeTypeString = XMLUtils.xpathString( + inputDocument, + XPATH_MIME_TYPE, + ArtifactNamespaceContext.INSTANCE); + + MediaType mimeType = DEFAULT_MIME_TYPE; + + if (mimeTypeString != null && mimeTypeString.length() != 0) { + try { + mimeType = MediaType.valueOf(mimeTypeString); + } + catch (Exception e) { + logger.error(e.getLocalizedMessage()); + } + } + + return new OutRepresentation( + mimeType, artifact, inputDocument, db.getArtifactContext()); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r 019b9f02d523 -r 22b03d5c84c5 artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactResource.java --- a/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactResource.java Thu Sep 10 14:44:25 2009 +0000 +++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/ArtifactResource.java Thu Sep 10 15:49:17 2009 +0000 @@ -11,11 +11,11 @@ import de.intevation.artifacts.ArtifactDatabase; import de.intevation.artifacts.Artifact; +import de.intevation.artifacts.ArtifactNamespaceContext; import org.restlet.data.Request; import org.restlet.data.Response; import org.restlet.data.Status; - import org.restlet.data.MediaType; import org.apache.log4j.Logger; @@ -24,8 +24,6 @@ import java.io.IOException; -import de.intevation.artifacts.ArtifactNamespaceContext; - import de.intevation.artifactdatabase.XMLUtils; /** diff -r 019b9f02d523 -r 22b03d5c84c5 artifact-database/src/main/java/de/intevation/artifactdatabase/rest/OutRepresentation.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/OutRepresentation.java Thu Sep 10 15:49:17 2009 +0000 @@ -0,0 +1,41 @@ +package de.intevation.artifactdatabase.rest; + +import org.restlet.representation.OutputRepresentation; + +import de.intevation.artifacts.Artifact; + +import org.restlet.data.MediaType; + +import java.io.OutputStream; +import java.io.IOException; + +import org.w3c.dom.Document; + +/** + * @author Sascha L. Teichmann (sascha.teichmann@intevation) + */ +public class OutRepresentation +extends OutputRepresentation +{ + protected Artifact artifact; + protected Document document; + protected Object context; + + public OutRepresentation( + MediaType mediaType, + Artifact artifact, + Document document, + Object context + ) { + super(mediaType); + this.artifact = artifact; + this.document = document; + this.context = context; + } + + public void write(OutputStream outputStream) throws IOException { + byte [] bytes = artifact.out(document, context); + outputStream.write(bytes); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8: diff -r 019b9f02d523 -r 22b03d5c84c5 artifact-database/src/main/java/de/intevation/artifactdatabase/rest/RestApp.java --- a/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/RestApp.java Thu Sep 10 14:44:25 2009 +0000 +++ b/artifact-database/src/main/java/de/intevation/artifactdatabase/rest/RestApp.java Thu Sep 10 15:49:17 2009 +0000 @@ -35,9 +35,10 @@ Router router = new Router(context); - router.attach(FactoriesResource.PATH, FactoriesResource.class); - router.attach(CreateResource.PATH, CreateResource.class); - router.attach(ArtifactResource.PATH, ArtifactResource.class); + router.attach(FactoriesResource.PATH, FactoriesResource.class); + router.attach(CreateResource.PATH, CreateResource.class); + router.attach(ArtifactResource.PATH, ArtifactResource.class); + router.attach(ArtifactOutResource.PATH, ArtifactOutResource.class); return router; }