diff src/main/java/de/intevation/artifacts/httpclient/http/HttpClientImpl.java @ 1:c9ac6642973c

Renamed GNVClient and GNVClientImpl to HttpClient and HttpClientImpl. http-client/trunk@1324 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 17 Feb 2011 10:51:37 +0000
parents
children 2fdfa20cfa63
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/de/intevation/artifacts/httpclient/http/HttpClientImpl.java	Thu Feb 17 10:51:37 2011 +0000
@@ -0,0 +1,212 @@
+/*
+ * Copyright (c) 2010 by Intevation GmbH
+ *
+ * This program is free software under the LGPL (>=v2.1)
+ * Read the file LGPL.txt coming with the software for details
+ * or visit http://www.gnu.org/licenses/ if it does not exist.
+ */
+package de.intevation.artifacts.httpclient.http;
+
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.apache.log4j.Logger;
+
+import org.restlet.Client;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.data.MediaType;
+import org.restlet.data.Method;
+import org.restlet.data.Protocol;
+import org.restlet.data.Status;
+import org.restlet.ext.xml.DomRepresentation;
+import org.restlet.representation.Representation;
+
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
+import de.intevation.artifacts.httpclient.http.response.DocumentResponseHandler;
+import de.intevation.artifacts.httpclient.http.response.ResponseHandler;
+import de.intevation.artifacts.httpclient.http.response.StreamResponseHandler;
+import de.intevation.artifacts.httpclient.objects.Artifact;
+import de.intevation.artifacts.httpclient.objects.ArtifactFactory;
+import de.intevation.artifacts.httpclient.utils.ArtifactProtocolUtils;
+import de.intevation.artifacts.httpclient.utils.XMLUtils;
+
+/**
+ * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
+ */
+public class HttpClientImpl implements HttpClient {
+
+    private static final Logger logger = Logger.getLogger(HttpClient.class);
+
+    private String serverUrl;
+
+
+    public HttpClientImpl(String serverUrl) {
+        this.serverUrl = serverUrl;
+    }
+
+
+    @Override
+    public ArtifactFactory[] getArtifactFactories()
+    throws ConnectionException
+    {
+        ResponseHandler handler = new DocumentResponseHandler();
+
+        try {
+            String    url   = serverUrl + "/factories";
+            Document result = (Document) handler.handle(doGet(url));
+
+            return ArtifactProtocolUtils.extractArtifactFactories(result);
+        }
+        catch (IOException ioe) {
+            throw new ConnectionException(
+                "Connection to server failed. No Factories recieved.");
+        }
+    }
+
+
+    @Override
+    public Artifact create(Document doc) throws ConnectionException {
+        ResponseHandler handler = new DocumentResponseHandler();
+
+        try {
+            String   url    = serverUrl + "/create";
+            Document result = (Document) handler.handle(doPost(url, doc));
+
+            return ArtifactProtocolUtils.extractArtifact(result);
+        }
+        catch (IOException ioe) {
+            throw new ConnectionException(
+                "Connection to server failed. No Artifact created.");
+        }
+    }
+
+
+    @Override
+    public Object describe(
+        Artifact        artifact,
+        Document        doc,
+        ResponseHandler handler)
+    throws ConnectionException
+    {
+        try {
+            String   url    = serverUrl + "/artifact/" + artifact.getUuid();
+            return handler.handle(doPost(url, doc));
+        }
+        catch (IOException ioe) {
+            throw new ConnectionException(
+                "Connection to server failed: " + ioe.getMessage());
+        }
+    }
+
+
+    @Override
+    public Object feed(Artifact artifact, Document doc, ResponseHandler handler)
+    throws ConnectionException
+    {
+        try {
+            String   url    = serverUrl + "/artifact/" + artifact.getUuid();
+            Document result = (Document) handler.handle(doPost(url, doc));
+
+            return result;
+        }
+        catch (IOException ioe) {
+            throw new ConnectionException(
+                "Connection to server failed: " + ioe.getMessage());
+        }
+    }
+
+
+    @Override
+    public Object advance(Artifact artifact, Document doc, ResponseHandler handler)
+    throws ConnectionException
+    {
+        try {
+            String   url    = serverUrl + "/artifact/" + artifact.getUuid();
+            Document result = (Document) handler.handle(doPost(url, doc));
+
+            return result;
+        }
+        catch (IOException ioe) {
+            throw new ConnectionException(
+                "Connection to server failed: " + ioe.getMessage());
+        }
+    }
+
+
+    @Override
+    public void out(
+        Artifact     artifact,
+        Document     doc,
+        String       target,
+        OutputStream out)
+    throws ConnectionException
+    {
+        try {
+            String url =
+                serverUrl
+                + "/artifact/"
+                + artifact.getUuid()
+                + "/" + target;
+
+            ResponseHandler handler = new StreamResponseHandler();
+
+            InputStream stream = (InputStream) handler.handle(doPost(url, doc));
+
+            byte[] b = new byte[4096];
+            int i = -1;
+            while ((i = stream.read(b)) > 0) {
+                out.write(b, 0, i);
+            }
+        }
+        catch (IOException ioe) {
+            throw new ConnectionException(
+                "Connection to server failed: " + ioe.getMessage());
+        }
+    }
+
+
+    private Response doPost(String url, Document body) throws IOException {
+        logger.info("Start HTTP-POST request to: "+ url);
+
+        Client client   = new Client(Protocol.HTTP);
+        Request request = new Request(Method.POST, url);
+
+        Representation representation = new DomRepresentation(
+            MediaType.APPLICATION_XML,
+            body);
+
+        request.setEntity(representation);
+        Response response = client.handle(request);
+
+        Status status = response.getStatus();
+        if (status.getCode() != 200) {
+            logger.error("Response status: " + status.getCode());
+            throw new IOException(status.getDescription());
+        }
+
+        return response;
+    }
+
+
+    private Response doGet(String url) throws IOException {
+        logger.info("Start HTTP-POST request to: "+ url);
+
+        Client client   = new Client(Protocol.HTTP);
+        Request request = new Request(Method.GET, url);
+
+        Response response = client.handle(request);
+
+        Status status = response.getStatus();
+        if (status.getCode() != 200) {
+            logger.error("Response status: " + status.getCode());
+            throw new IOException(status.getDescription());
+        }
+
+        return response;
+    }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:

http://dive4elements.wald.intevation.org