[Dive4elements-commits] [PATCH 1 of 3] Moved directories to org.dive4elements
Wald Commits
scm-commit at wald.intevation.org
Thu Apr 25 11:16:29 CEST 2013
# HG changeset patch
# User Sascha L. Teichmann <teichmann at intevation.de>
# Date 1366881254 -7200
# Node ID a857866d162f54b1e881ab4e281c0bc5dab5a29b
# Parent da691e917f983f908a23ae3f5538573ee36cede3
Moved directories to org.dive4elements
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/ConsoleClient.java
--- a/src/main/java/de/intevation/artifacts/httpclient/ConsoleClient.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,354 +0,0 @@
-/*
- * 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;
-
-import java.io.IOException;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-
-import java.net.MalformedURLException;
-
-import java.util.Arrays;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.xml.xpath.XPathConstants;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.apache.log4j.Logger;
-import org.apache.log4j.PropertyConfigurator;
-
-import de.intevation.artifacts.httpclient.http.HttpClient;
-import de.intevation.artifacts.httpclient.http.HttpClientImpl;
-import de.intevation.artifacts.httpclient.http.response.DocumentResponseHandler;
-
-import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
-import de.intevation.artifacts.httpclient.exceptions.NoSuchOptionException;
-import de.intevation.artifacts.httpclient.objects.Artifact;
-import de.intevation.artifacts.httpclient.utils.ArtifactProtocolUtils;
-import de.intevation.artifacts.httpclient.utils.Configuration;
-import de.intevation.artifacts.httpclient.utils.XFormNamespaceContext;
-import de.intevation.artifacts.httpclient.utils.XMLUtils;
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public class ConsoleClient
-{
- /**
- * The logging is done via Log4j. To configure the logging
- * a file 'log4j.properties' is search in the configuration directory.
- */
- public static final String LOG4J_PROPERTIES = "log4j.properties";
-
-
- /**
- * The path of the configuration directory.
- */
- public static final String CONFIG_PATH = System.getProperty("config.dir",
- "conf");
-
- public static final String CONFIG = System.getProperty("config.file",
- "use_case1.conf");
-
-
- public static final String XPATH_DYNAMIC = "/art:result/art:ui/art:dynamic";
-
- /**
- * The logger used in this class.
- */
- private static Logger logger;
-
-
- static {
- configureLogging();
-
- logger = Logger.getLogger(ConsoleClient.class);
- }
-
-
- /**
- * Trys to load the Log4j configuration from ${config.dir}/log4j.properties.
- */
- public static final void configureLogging() {
- File configDir = new File(CONFIG_PATH);
- File propFile = new File(configDir, LOG4J_PROPERTIES);
-
- if (propFile.isFile() && propFile.canRead()) {
- try {
- PropertyConfigurator.configure(propFile.toURI().toURL());
- }
- catch (MalformedURLException mue) {
- mue.printStackTrace(System.err);
- }
- }
- }
-
-
- public static final Configuration readConfiguration() {
- File configDir = new File(CONFIG_PATH);
- File configFile = new File(configDir, CONFIG);
-
- logger.debug("Configuration file: " + configFile.getAbsolutePath());
-
- if (configFile.isFile() && configFile.canRead()) {
- try {
- Configuration conf = new Configuration(configFile);
- conf.initialize();
-
- return conf;
- }
- catch (IOException ioe) {
- logger.error("Error while reading configuration.");
- }
- }
-
- return null;
- }
-
-
- public static void main( String[] args )
- {
- logger.info("Starting console client.");
-
- Configuration conf = readConfiguration();
-
- String serverHost = (String) conf.getServerSettings("host");
- String serverPort = (String) conf.getServerSettings("port");
- HttpClient client = new HttpClientImpl(serverHost + ":" + serverPort);
-
- try {
- Document create = ArtifactProtocolUtils.createCreateDocument(
- (String) conf.getArtifactSettings("fis"));
- Artifact artifact = (Artifact) client.create(create, null);
-
- Map attr = new HashMap();
- String product = (String) conf.getArtifactSettings("product");
- String[] products = extractOptions(client, artifact, product);
- attr.put("product", products[0]);
-
- feedAndGo(client, artifact, attr, "timeSeries");
-
- attr.clear();
- String area = (String) conf.getArtifactSettings("areaid");
- String[] areas = extractOptions(client, artifact, area);
- attr.put("areaid", areas[0]);
- feedAndGo(client, artifact, attr, "timeseries_without_geom");
-
- attr.clear();
- String feature = (String) conf.getArtifactSettings("featureid");
- String[] features = extractOptions(client, artifact, feature);
- attr.put("featureid", features[0]);
- feedAndGo(client, artifact, attr, "timeseries_vector_scalar");
-
- attr.clear();
- String vector = (String) conf.getArtifactSettings("vectorscalar");
- String[] vectors = extractOptions(client, artifact, vector);
- attr.put("vectorscalar", vectors[0]);
- feedAndGo(client, artifact, attr, "timeseries_parameter");
-
- attr.clear();
- String parameter = (String) conf.getArtifactSettings("parameterid");
- String[] parameters = extractOptions(client, artifact, parameter);
- attr.put("parameterid", parameters);
- feedAndGo(client, artifact, attr, "timeseries_depth_height");
-
- attr.clear();
- String measure = (String) conf.getArtifactSettings("measurementid");
- String[] measures = extractMeasurements(client, artifact, measure);
- attr.put("measurementid", measures);
- feedAndGo(client, artifact, attr, "timeseries_interval");
-
- attr.clear();
- String min = (String) conf.getArtifactSettings("minvalue");
- String max = (String) conf.getArtifactSettings("maxvalue");
- attr.put("minvalue", min);
- attr.put("maxvalue", max);
- feedAndGo(client, artifact, attr, "timeseries_calculate_results");
-
- try {
- Map opts = new HashMap();
- opts.put("mime-type", conf.getOutputSettings("mime-type"));
- opts.put("width", conf.getOutputSettings("width"));
- opts.put("height", conf.getOutputSettings("height"));
- opts.put("points", conf.getOutputSettings("points"));
-
- Document chart =
- ArtifactProtocolUtils.createChartDocument(artifact, opts);
-
- String dir = (String) conf.getOutputSettings("directory");
-
- File outDir = new File(dir);
- File output = new File(outDir, "output.png");
- OutputStream os = new FileOutputStream(output);
-
- client.out(artifact, chart, "chart", os);
- }
- catch (IOException ioe) {
- logger.error(
- "IO error while writing the output: " + ioe.getMessage());
- }
-
- logger.debug("Finished console client.");
- }
- catch (ConnectionException ce) {
- logger.error(ce.getMessage());
- }
- catch (NoSuchOptionException nsoe) {
- logger.error(
- "No such option found: " + nsoe.getMessage());
- }
- }
-
-
- public static void feedAndGo(
- HttpClient client,
- Artifact artifact,
- Map attr,
- String target)
- throws ConnectionException
- {
- Document feed = ArtifactProtocolUtils.createFeedDocument(artifact, attr);
- client.feed(artifact, feed, new DocumentResponseHandler());
-
- Document advance = ArtifactProtocolUtils.createAdvanceDocument(
- artifact,
- target);
-
- client.advance(artifact, advance, new DocumentResponseHandler());
- }
-
-
- /**
- * XXX I think, this method should be implemented somewhere else to be able
- * to re-use this implementation. But this method needs more work to be more
- * abstract, so it needs to be reimplemented later, I think.
- */
- public static String[] extractOptions(
- HttpClient client,
- Artifact artifact,
- String text)
- throws NoSuchOptionException, ConnectionException
- {
- Document describe = ArtifactProtocolUtils.createDescribeDocument(
- artifact, true);
-
- Document description = (Document) client.describe(
- artifact, describe, new DocumentResponseHandler());
-
- List pieces = Arrays.asList(text.split(","));
- List options = new ArrayList(pieces.size());
-
- Node dynamic = XMLUtils.getNodeXPath(description, XPATH_DYNAMIC);
-
- // TODO We should handle these cases better!!
- NodeList items = (NodeList) XMLUtils.getXPath(
- dynamic, "xform:select1/xform:choices/xform:item",
- XPathConstants.NODESET, XFormNamespaceContext.INSTANCE);
-
- if (items == null || items.getLength() == 0) {
- items = (NodeList) XMLUtils.getXPath(
- dynamic, "xform:select/xform:choices/xform:item",
- XPathConstants.NODESET, XFormNamespaceContext.INSTANCE);
- }
-
- if (items == null || items.getLength() == 0) {
- items = (NodeList) XMLUtils.getXPath(
- dynamic, "xform:group/xform:select/xform:item",
- XPathConstants.NODESET, XFormNamespaceContext.INSTANCE);
- }
-
-
- for (int i = 0; i < items.getLength(); i++) {
- Node item = items.item(i);
- Node label = (Node) XMLUtils.getXPath(
- item, "xform:label", XPathConstants.NODE,
- XFormNamespaceContext.INSTANCE);
-
- Node value = (Node) XMLUtils.getXPath(
- item, "xform:value", XPathConstants.NODE,
- XFormNamespaceContext.INSTANCE);
-
- if (pieces.indexOf(label.getTextContent()) >= 0)
- options.add(value.getTextContent());
- }
-
- if (options.isEmpty())
- throw new NoSuchOptionException(text);
-
- return (String[]) options.toArray(new String[options.size()]);
- }
-
-
- /**
- * XXX This method extracts the measurement ids depending on the user
- * configuration from describe document. Currently, this is a special case
- * that should be handled the same way as all the other options in the
- * describe document.
- */
- public static String[] extractMeasurements(
- HttpClient client,
- Artifact artifact,
- String text)
- throws NoSuchOptionException, ConnectionException
- {
- Document describe = ArtifactProtocolUtils.createDescribeDocument(
- artifact, true);
-
- Document description = (Document) client.describe(
- artifact, describe, new DocumentResponseHandler());
-
- List pieces = Arrays.asList(text.split(","));
- List options = new ArrayList(pieces.size());
-
- Node dynamic = XMLUtils.getNodeXPath(description, XPATH_DYNAMIC);
-
- NodeList params = (NodeList) XMLUtils.getXPath(
- dynamic, "xform:group/xform:select",
- XPathConstants.NODESET, XFormNamespaceContext.INSTANCE);
-
- for (int i = 0; i < params.getLength(); i++) {
- Node param = params.item(i);
-
- NodeList items = (NodeList) XMLUtils.getXPath(
- param, "xform:item[@disabled='false']", XPathConstants.NODESET,
- XFormNamespaceContext.INSTANCE);
-
- for (int j = 0; j < items.getLength(); j++) {
- Node item = items.item(j);
-
- Node label = (Node) XMLUtils.getXPath(
- item, "xform:label", XPathConstants.NODE,
- XFormNamespaceContext.INSTANCE);
-
- if (pieces.indexOf(label.getTextContent()) < 0) {
- continue;
- }
-
- Node value = (Node) XMLUtils.getXPath(
- item, "xform:value", XPathConstants.NODE,
- XFormNamespaceContext.INSTANCE);
-
- options.add(value.getTextContent());
- }
- }
-
- if (options.isEmpty())
- throw new NoSuchOptionException(text);
-
- return (String[]) options.toArray(new String[options.size()]);
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/exceptions/ConnectionException.java
--- a/src/main/java/de/intevation/artifacts/httpclient/exceptions/ConnectionException.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,25 +0,0 @@
-/*
- * 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.exceptions;
-
-import java.io.IOException;
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public class ConnectionException extends IOException {
-
- public ConnectionException(String msg) {
- super(msg);
- }
-
- public ConnectionException(String msg, Throwable throwable) {
- super(msg, throwable);
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/exceptions/NoSuchOptionException.java
--- a/src/main/java/de/intevation/artifacts/httpclient/exceptions/NoSuchOptionException.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,19 +0,0 @@
-/*
- * 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.exceptions;
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public class NoSuchOptionException extends Exception {
-
- public NoSuchOptionException(String msg) {
- super(msg);
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/http/HttpClient.java
--- a/src/main/java/de/intevation/artifacts/httpclient/http/HttpClient.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-/*
- * 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.OutputStream;
-
-import org.w3c.dom.Document;
-
-import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
-import de.intevation.artifacts.httpclient.http.response.ResponseHandler;
-import de.intevation.artifacts.httpclient.objects.Artifact;
-import de.intevation.artifacts.httpclient.objects.ArtifactFactory;
-import de.intevation.artifacts.httpclient.utils.ArtifactCreator;
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public interface HttpClient {
-
- ArtifactFactory[] getArtifactFactories()
- throws ConnectionException;
-
- Object create(Document createDocument, ArtifactCreator creator)
- throws ConnectionException;
-
- Object describe(
- Artifact artifact,
- Document describeDocument,
- ResponseHandler handler)
- throws ConnectionException;
-
- Object feed(Artifact artifact, Document feedDocument, ResponseHandler handler)
- throws ConnectionException;
-
- Object advance(
- Artifact artifact,
- Document advanceDocument,
- ResponseHandler handler)
- throws ConnectionException;
-
- void out(
- Artifact artifact,
- Document outDocument,
- String target,
- OutputStream out)
- throws ConnectionException;
-
-
- /*******************************
- * Service API
- *******************************/
-
- Document callService(String url, String service, Document input)
- throws ConnectionException;
-
- Object callService(
- String url,
- String service,
- Document input,
- ResponseHandler handler)
- throws ConnectionException;
-
-
- /*******************************
- * Collections API
- *******************************/
-
- Object createCollection(
- Document createDocument,
- String ownerId,
- ResponseHandler handler)
- throws ConnectionException;
-
- Object doCollectionAction(
- Document actionDocument,
- String uuid,
- ResponseHandler handler)
- throws ConnectionException;
-
- void collectionOut(
- Document outDocument,
- String uuid,
- String type,
- OutputStream out)
- throws ConnectionException;
-
- InputStream collectionOut(
- Document doc,
- String uuid,
- String type)
- throws ConnectionException;
-
-
- /*******************************
- * Users API
- *******************************/
-
- Document listUsers()
- throws ConnectionException;
-
- Document listUserCollections(String userid)
- throws ConnectionException;
-
- Document createUser(Document doc)
- throws ConnectionException;
-
- Document findUser(Document doc)
- throws ConnectionException;
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/http/HttpClientImpl.java
--- a/src/main/java/de/intevation/artifacts/httpclient/http/HttpClientImpl.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,577 +0,0 @@
-/*
- * 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 java.util.ArrayList;
-import java.util.List;
-
-import org.apache.log4j.Logger;
-
-import org.restlet.Client;
-import org.restlet.Request;
-import org.restlet.Response;
-import org.restlet.data.ClientInfo;
-import org.restlet.data.Language;
-import org.restlet.data.MediaType;
-import org.restlet.data.Method;
-import org.restlet.data.Preference;
-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.ArtifactCreator;
-
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public class HttpClientImpl implements HttpClient {
-
- private static final Logger logger = Logger.getLogger(HttpClient.class);
-
- /** The URL part of the resource to list the existing users of the server.*/
- public static final String PATH_LIST_USERS = "/list-users";
-
- /** The URL part of the resource to list the Collections owned by a specific
- * user.*/
- public static final String PATH_USER_COLLECTIONS = "/list-collections";
-
- /** The URL part og the resource to create a new user on the server.*/
- public static final String PATH_CREATE_USER = "/create-user";
-
- /** The URL part og the resource to find an existing user on the server.*/
- public static final String PATH_FIND_USER = "/find-user";
-
- /** The URL part of the resource to call a specific service.*/
- public static final String PATH_SERVICE = "/service";
-
- /** The URL path of the resource to create new artifact collections.*/
- public static final String PATH_CREATE_COLLECTION = "/create-collection";
-
- /** The URL path of the resource to work with an artifact collections.*/
- public static final String PATH_ACTION_COLLECTION = "/collection";
-
- /** The URL path of the resource to work with an artifact collections.*/
- public static final String PATH_OUT_COLLECTION = "/collection";
-
- private String serverUrl;
-
- private String localeString;
-
- private static final ThreadLocal<Client> CLIENT =
- new ThreadLocal<Client>() {
- @Override
- protected Client initialValue() {
- logger.debug("create new HTTP client");
- return new Client(Protocol.HTTP);
- }
- };
-
- public HttpClientImpl(String serverUrl) {
- this.serverUrl = serverUrl;
- }
-
-
- /**
- * This constructor might be used to modify the request's locale manually.
- * E.g. the localization should not be based on the configured browser
- * locale, but site specific configuration - than you are able to set the
- * locale in this constructor.
- *
- * @param serverUrl The url that is used for the request.
- * @param localeString The string representation of the desired locale.
- */
- public HttpClientImpl(String serverUrl, String localeString) {
- this(serverUrl);
-
- this.localeString = localeString;
- }
-
-
- @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.");
- }
- }
-
-
- /**
- * This method creates a new artifact in the artifact server and returns
- * this artifact. The new artifact is created using <i>creator</i>. If no
- * {@link ArtifactCreator} is given (null), an {@link Artifact} is returned.
- *
- * @param doc The CREATE document.
- * @param creator The {@link ArtifactCreator} that is used to extract the
- * new artifact from response document of the server.
- *
- * @return the new artifact.
- */
- @Override
- public Object create(Document doc, ArtifactCreator creator)
- throws ConnectionException
- {
- ResponseHandler handler = new DocumentResponseHandler();
-
- try {
- String url = serverUrl + "/create";
- Document result = (Document) handler.handle(doPost(url, doc));
-
- return creator == null
- ? ArtifactProtocolUtils.extractArtifact(result)
- : creator.create(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));
- try {
- byte[] b = new byte[4096];
- int i;
- while ((i = stream.read(b)) >= 0) {
- out.write(b, 0, i);
- }
- }
- finally {
- stream.close();
- }
- }
- catch (IOException ioe) {
- throw new ConnectionException(
- "Connection to server failed: " + ioe.getMessage());
- }
- }
-
-
- //==============================
- // HTTP specific methods
- //==============================
-
- private Response doPost(String url, Document body) throws IOException {
- if (logger.isDebugEnabled()) {
- logger.debug("Start HTTP-POST request to: " + url);
- }
-
- Client client = getClient();
- Request request = prepareRequest(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 static Client getClient() {
- return CLIENT.get();
- }
-
-
- private Response doGet(String url) throws IOException {
- if (logger.isDebugEnabled()) {
- logger.debug("Start HTTP-POST request to: "+ url);
- }
-
- Client client = getClient();
- Request request = prepareRequest(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;
- }
-
-
- /**
- * This method prepares the request object.
- *
- * @param method The HTTP method (GET,POST).
- * @param url The URL used for the request.
- *
- * @return the request object.
- */
- private Request prepareRequest(Method method, String url) {
- Request request = new Request(method, url);
-
- ClientInfo info = request.getClientInfo();
-
- setLocale(info);
-
- request.setClientInfo(info);
-
- return request;
- }
-
-
- /**
- * This method is called to set the request's locale.
- *
- * @param info The ClientInfo that is used to provide request information.
- */
- private void setLocale(ClientInfo info) {
- if (localeString == null) {
- return;
- }
-
- List<Preference<Language>> accepted =
- new ArrayList<Preference<Language>>();
-
- Language lang = Language.valueOf(localeString);
-
- if (lang != null) {
- if (logger.isDebugEnabled()) {
- logger.debug(
- "Set locale of the request object: " + lang.toString());
- }
-
- Preference<Language> pref = new Preference<Language>();
- pref.setMetadata(lang);
- accepted.add(pref);
-
- info.setAcceptedLanguages(accepted);
- }
- }
-
-
- //==============================
- // Collection API
- //==============================
-
- /**
- * This method triggers the artifact servers resource to create a new
- * artifact collection.
- *
- * @param create The CREATE document for the collection.
- * @param ownerId The uuid of the creator.
- * @param handler The handler that is used to create the result object.
- *
- * @return a result object created by <i>handler</i>.
- */
- public Object createCollection(
- Document create,
- String ownerId,
- ResponseHandler handler)
- throws ConnectionException
- {
- String url = serverUrl + PATH_CREATE_COLLECTION + "/" + ownerId;
-
- try {
- return handler.handle(doPost(url, create));
- }
- catch (IOException ioe) {
- throw new ConnectionException(ioe.getMessage(), ioe);
- }
- }
-
-
- /**
- * This method might be used to trigger a collection specific action. The
- * action that is executed depends on the document <i>actionDoc</i>.
- *
- * @param actionDoc The document that describes the action to be executed.
- * @param uuid The uuid of the collection.
- * @param handler The handler that is used to create the result object.
- *
- * @return a result object created by <i>handler</i>.
- */
- public Object doCollectionAction(
- Document actionDoc,
- String uuid,
- ResponseHandler handler)
- throws ConnectionException
- {
- String url = serverUrl + PATH_ACTION_COLLECTION + "/" + uuid;
-
- try {
- return handler.handle(doPost(url, actionDoc));
- }
- catch (IOException ioe) {
- throw new ConnectionException(ioe.getMessage(), ioe);
- }
- }
-
-
- /**
- * This method triggers the out() operation of a Collection. The result of
- * this operation is written to <i>out</i> directly - there is no return
- * value.
- *
- * @param doc The request document for the out() operation.
- * @param uuid The identifier of the Collection.
- * @param type The name of the output type.
- * @param out The OutputStream.
- */
- public void collectionOut(
- Document doc,
- String uuid,
- String type,
- OutputStream out)
- throws ConnectionException
- {
- try {
- InputStream stream = collectionOut(doc, uuid, type);
-
- byte[] b = new byte[4096];
- try {
- int i;
- while ((i = stream.read(b)) >= 0) {
- out.write(b, 0, i);
- }
- }
- finally {
- stream.close();
- }
- }
- catch (IOException ioe) {
- throw new ConnectionException(ioe.getMessage(), ioe);
- }
- }
-
-
- /**
- * This method triggers the out() operation of a Collection. The result of
- * this operation is returned as an InputStream.
- *
- * @param doc The request document for the out() operation.
- * @param uuid The identifier of the Collection.
- * @param type The name of the output type.
- *
- * @return an InputStream.
- */
- public InputStream collectionOut(
- Document doc,
- String uuid,
- String type)
- throws ConnectionException
- {
- String url = serverUrl + PATH_OUT_COLLECTION + "/" + uuid + "/" + type;
-
- ResponseHandler handler = new StreamResponseHandler();
-
- try {
- return (InputStream) handler.handle(doPost(url, doc));
- }
- catch (IOException ioe) {
- throw new ConnectionException(ioe.getMessage(), ioe);
- }
- }
-
-
- /*******************************
- * Service API
- *******************************/
-
- public Document callService(String url, String service, Document input)
- throws ConnectionException
- {
- DocumentResponseHandler handler = new DocumentResponseHandler();
-
- return (Document) callService(url, service, input, handler);
- }
-
-
- public Object callService(
- String url,
- String service,
- Document input,
- ResponseHandler handler)
- throws ConnectionException {
- if (logger.isDebugEnabled()) {
- logger.debug("Start service call to '" + service + "'");
- }
-
- try {
- String serverUrl = url + PATH_SERVICE + "/" + service;
- return handler.handle(doPost(serverUrl, input));
- }
- catch (IOException ioe) {
- throw new ConnectionException(
- "Connection to server failed: " + ioe.getMessage());
- }
- }
-
-
- /*******************************
- * Users API
- *******************************/
-
- public Document listUsers()
- throws ConnectionException
- {
- ResponseHandler handler = new DocumentResponseHandler();
- String url = serverUrl + PATH_LIST_USERS;
-
- try {
- return (Document) handler.handle(doGet(url));
- }
- catch (IOException ioe) {
- throw new ConnectionException(ioe.getMessage(), ioe);
- }
- }
-
-
- public Document listUserCollections(String userid)
- throws ConnectionException
- {
- ResponseHandler handler = new DocumentResponseHandler();
-
- String url = serverUrl + PATH_USER_COLLECTIONS + "/" + userid;
-
- try {
- return (Document) handler.handle(doGet(url));
- }
- catch (IOException ioe) {
- throw new ConnectionException(ioe.getMessage(), ioe);
- }
- }
-
- @Override
- public Document createUser(Document doc)
- throws ConnectionException {
- ResponseHandler handler = new DocumentResponseHandler();
-
- String url = this.serverUrl + PATH_CREATE_USER;
-
- try {
- return (Document) handler.handle(doPost(url, doc));
- }
- catch (IOException ioe) {
- throw new ConnectionException(
- "Connection to server failed: " + ioe.getMessage());
- }
- }
-
- @Override
- public Document findUser(Document doc)
- throws ConnectionException {
- ResponseHandler handler = new DocumentResponseHandler();
-
- String url = this.serverUrl + PATH_FIND_USER;
-
- try {
- return (Document) handler.handle(doPost(url, doc));
- }
- catch (IOException ioe) {
- throw new ConnectionException(
- "Connection to server failed: " + ioe.getMessage());
- }
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/http/response/DocumentResponseHandler.java
--- a/src/main/java/de/intevation/artifacts/httpclient/http/response/DocumentResponseHandler.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * 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.response;
-
-import java.io.IOException;
-
-import org.restlet.Response;
-import org.restlet.representation.Representation;
-
-import de.intevation.artifacts.httpclient.utils.XMLUtils;
-
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public class DocumentResponseHandler implements ResponseHandler {
-
- public DocumentResponseHandler() {
- }
-
- @Override
- public Object handle(Response response) throws IOException {
- Representation output = response.getEntity();
- return XMLUtils.readDocument(output.getStream());
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/http/response/ResponseHandler.java
--- a/src/main/java/de/intevation/artifacts/httpclient/http/response/ResponseHandler.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,22 +0,0 @@
-/*
- * 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.response;
-
-import java.io.IOException;
-
-import org.restlet.Response;
-
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public interface ResponseHandler {
-
- Object handle(Response response) throws IOException;
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/http/response/StreamResponseHandler.java
--- a/src/main/java/de/intevation/artifacts/httpclient/http/response/StreamResponseHandler.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * 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.response;
-
-import java.io.IOException;
-
-import org.restlet.Response;
-import org.restlet.representation.Representation;
-
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public class StreamResponseHandler implements ResponseHandler {
-
- public StreamResponseHandler() {
- }
-
- @Override
- public Object handle(Response response) throws IOException {
- Representation output = response.getEntity();
- return output.getStream();
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/http/response/StringResponseHandler.java
--- a/src/main/java/de/intevation/artifacts/httpclient/http/response/StringResponseHandler.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,40 +0,0 @@
-/*
- * 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.response;
-
-import java.io.ByteArrayOutputStream;
-import java.io.InputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.restlet.Response;
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public class StringResponseHandler extends StreamResponseHandler {
-
- public StringResponseHandler() {
- }
-
- @Override
- public Object handle(Response response) throws IOException {
- InputStream in = (InputStream) super.handle(response);
- OutputStream out = new ByteArrayOutputStream();
-
- byte[] b = new byte[4096];
- int i = -1;
- while ((i = in.read(b)) > 0) {
- out.write(b, 0, i);
- }
- out.close();
-
- return out.toString();
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/objects/Artifact.java
--- a/src/main/java/de/intevation/artifacts/httpclient/objects/Artifact.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,50 +0,0 @@
-/*
- * 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.objects;
-
-/**
- * An <code>ArtifactObject</code> representing an artifact.
- *
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- *
- */
-public class Artifact {
-
- /**
- * The uuid of this Artifact which must be used to identify
- * the artifact at the <code>ArtifactDatabase</code>.
- */
- private String uuid = null;
-
- /**
- * The hash of the artifact which was send be the <code>ArtifactDatabase</code>.
- */
- private String hash = null;
-
- /**
- * Constructor
- * @param uuid the uuid of this Artifact which must be used to identify
- * the artifact at the <code>ArtifactDatabase</code>
- * @param hash the hash of the artifact which was send be the
- * <code>ArtifactDatabase</code>
- */
- public Artifact(String uuid, String hash) {
- this.uuid = uuid;
- this.hash = hash;
- }
-
- public String getHash() {
- return this.hash;
- }
-
- public String getUuid() {
- return this.uuid;
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/objects/ArtifactFactory.java
--- a/src/main/java/de/intevation/artifacts/httpclient/objects/ArtifactFactory.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-/*
- * 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.objects;
-
-
-public class ArtifactFactory {
-
- private String name;
- private String description;
-
- public ArtifactFactory(String name, String description) {
- this.name = name;
- this.description = description;
- }
-
-
- public String getName() {
- return name;
- }
-
-
- public String getDescription() {
- return description;
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/utils/ArtifactCreator.java
--- a/src/main/java/de/intevation/artifacts/httpclient/utils/ArtifactCreator.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,30 +0,0 @@
-/*
- * Copyright (c) 2011 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.utils;
-
-import org.w3c.dom.Document;
-
-
-/**
- * This interface is used to create new implementation dependend instances of an
- * <i>Artifact</i>.
- *
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public interface ArtifactCreator {
-
- /**
- * This method should return a new Artifact object.
- *
- * @param doc A document that describes the artifact.
- *
- * @return an implementation dependend instance of an <i>Artifact</i>.
- */
- public Object create(Document doc);
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/utils/ArtifactNamespaceContext.java
--- a/src/main/java/de/intevation/artifacts/httpclient/utils/ArtifactNamespaceContext.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,72 +0,0 @@
-/*
- * 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.utils;
-
-import java.util.Iterator;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.NamespaceContext;
-
-/**
- * The namespacecontext object used in xml documents retrieved by the artifact
- * server.
- *
- * @author <a href="mailto:sascha.teichmann at intevation">Sascha L. Teichmann</a>
- */
-public class ArtifactNamespaceContext
-implements NamespaceContext
-{
- /**
- * The URI of the namespace of the artifacts.
- */
- public final static String NAMESPACE_URI = "http://www.intevation.de/2009/artifacts";
-
- /**
- * The XML prefix for the artifacts namespace.
- */
- public final static String NAMESPACE_PREFIX = "art";
-
- /**
- * The singleton instance of this <code>NamespaceContext</code>
- */
- public static final ArtifactNamespaceContext INSTANCE =
- new ArtifactNamespaceContext();
-
- /**
- * Constructor
- */
- public ArtifactNamespaceContext() {
- }
-
- public String getNamespaceURI(String prefix) {
-
- if (prefix == null) {
- throw new NullPointerException("Null prefix");
- }
-
- if (NAMESPACE_PREFIX.equals(prefix)) {
- return NAMESPACE_URI;
- }
-
- if ("xml".equals(prefix)) {
- return XMLConstants.XML_NS_URI;
- }
-
- return XMLConstants.NULL_NS_URI;
- }
-
- public String getPrefix(String uri) {
- throw new UnsupportedOperationException();
- }
-
- public Iterator getPrefixes(String uri) {
- throw new UnsupportedOperationException();
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/utils/ArtifactProtocolUtils.java
--- a/src/main/java/de/intevation/artifacts/httpclient/utils/ArtifactProtocolUtils.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,277 +0,0 @@
-/*
- * 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.utils;
-
-import java.util.Map;
-
-import javax.xml.xpath.XPathConstants;
-
-import org.apache.log4j.Logger;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NodeList;
-
-import de.intevation.artifacts.httpclient.objects.Artifact;
-import de.intevation.artifacts.httpclient.objects.ArtifactFactory;
-
-public class ArtifactProtocolUtils {
-
- private static final Logger logger =
- Logger.getLogger(ArtifactProtocolUtils.class);
-
-
- public static ArtifactFactory[] extractArtifactFactories(Document doc) {
- NodeList elements = (NodeList) XMLUtils.getXPath(
- doc,
- "/art:result/art:factories/art:factory",
- XPathConstants.NODESET,
- ArtifactNamespaceContext.INSTANCE);
-
- if (elements == null || elements.getLength() == 0) {
- return null;
- }
-
- ArtifactFactory[] facs = new ArtifactFactory[elements.getLength()];
-
- String uri = ArtifactNamespaceContext.NAMESPACE_URI;
-
- for (int idx = 0; idx < facs.length; idx++) {
- Element factory = (Element)elements.item(idx);
- String desc = factory.getAttributeNS(uri, "description");
- String name = factory.getAttributeNS(uri, "name");
-
- if (name.length() != 0) {
- facs[idx] = new ArtifactFactory(name, desc);
- }
- }
-
- return facs;
- }
-
-
- public static Document createCreateDocument(String fis) {
- Document document = XMLUtils.newDocument();
-
- XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
- document,
- ArtifactNamespaceContext.NAMESPACE_URI,
- ArtifactNamespaceContext.NAMESPACE_PREFIX
- );
-
- Element action = creator.create("action");
-
- Element type = creator.create("type");
- type.setAttribute("name", "create");
-
- Element factory = creator.create("factory");
- factory.setAttribute("name", fis);
-
- action.appendChild(type);
- action.appendChild(factory);
- document.appendChild(action);
-
- return document;
- }
-
-
- /**
- * Returns a new artifact defined by uuid and hash values of the document
- * returned by the artifact server after creating a new artifact.
- *
- * @param document Contains information about the server-side created
- * artifact.
- * @return a new artifact object.
- */
- public static Artifact extractArtifact(Document document) {
- String uuid = XMLUtils.getStringXPath(
- document,
- "/art:result/art:uuid/@value");
-
- String hash = XMLUtils.getStringXPath(
- document,
- "/art:result/art:hash/@value");
-
- logger.info("NEW Artifact: " + uuid + " / " + hash);
- return new Artifact(uuid, hash);
- }
-
-
- private static Element createArtifactAction(
- XMLUtils.ElementCreator creator,
- Artifact artifact,
- String artifactAction)
- {
- Element action = creator.create("action");
-
- Element type = creator.create("type");
- type.setAttribute("name", artifactAction);
-
- Element uuid = creator.create("uuid");
- uuid.setAttribute("value", artifact.getUuid());
-
- Element hash = creator.create("hash");
- hash.setAttribute("value", artifact.getHash());
-
- action.appendChild(type);
- action.appendChild(uuid);
- action.appendChild(hash);
-
- return action;
- }
-
-
- public static Document createFeedDocument(Artifact artifact, Map attr) {
- Document document = XMLUtils.newDocument();
-
- XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
- document,
- ArtifactNamespaceContext.NAMESPACE_URI,
- ArtifactNamespaceContext.NAMESPACE_PREFIX
- );
-
- Element action = createArtifactAction(creator, artifact, "feed");
- Element data = creator.create("data");
-
- for (Map.Entry<String, Object> entry:
- ((Map<String, Object>)attr).entrySet()) {
-
- String key = entry.getKey();
- Object values = entry.getValue();
-
- if (values instanceof Object[]) {
- appendInputNodes(creator, data, key, (Object[]) values);
- }
- else {
- appendInputNodes(creator, data, key, values);
- }
- }
-
- action.appendChild(data);
- document.appendChild(action);
-
- return document;
- }
-
-
- private static void appendInputNodes(
- XMLUtils.ElementCreator creator,
- Element root,
- String key,
- Object value)
- {
- Element input = creator.create("input");
- input.setAttribute("name", key);
- input.setAttribute("value", (String) value);
- root.appendChild(input);
- }
-
-
- private static void appendInputNodes(
- XMLUtils.ElementCreator creator,
- Element root,
- String key,
- Object[] values)
- {
- for (Object value: values) {
- Element input = creator.create("input");
- input.setAttribute("name", key);
- input.setAttribute("value", (String) value);
- root.appendChild(input);
- }
- }
-
-
- public static Document createDescribeDocument(Artifact art, boolean ui) {
- Document document = XMLUtils.newDocument();
-
- XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
- document,
- ArtifactNamespaceContext.NAMESPACE_URI,
- ArtifactNamespaceContext.NAMESPACE_PREFIX
- );
-
- Element action = createArtifactAction(creator, art, "describe");
- Element includeUi = creator.create("include-ui");
- includeUi.setTextContent(String.valueOf(ui));
-
- action.appendChild(includeUi);
- document.appendChild(action);
-
- return document;
- }
-
-
- public static Document createAdvanceDocument(Artifact art, String target) {
- Document document = XMLUtils.newDocument();
-
- XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
- document,
- ArtifactNamespaceContext.NAMESPACE_URI,
- ArtifactNamespaceContext.NAMESPACE_PREFIX
- );
-
- Element action = createArtifactAction(creator, art, "advance");
- Element targetEle = creator.create("target");
- targetEle.setAttribute("name", target);
-
- action.appendChild(targetEle);
- document.appendChild(action);
-
- return document;
- }
-
-
- public static Document createChartDocument(Artifact artifact, Map opts) {
- Document document = XMLUtils.newDocument();
-
- XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
- document,
- ArtifactNamespaceContext.NAMESPACE_URI,
- ArtifactNamespaceContext.NAMESPACE_PREFIX
- );
-
- Element action = createArtifactAction(creator, artifact, "out");
- Element out = creator.create("out");
- out.setAttribute("name", "chart");
-
- Element export = creator.create("export");
- export.setAttribute("name", "img");
-
- Element mimetype = creator.create("mime-type");
- export.setAttribute("value", (String) opts.get("mime-type"));
-
- Element params = creator.create("params");
-
- Element width = creator.create("input");
- width.setAttribute("name", "width");
- width.setAttribute("value", (String) opts.get("width"));
-
- Element height = creator.create("input");
- height.setAttribute("name", "height");
- height.setAttribute("value", (String) opts.get("height"));
-
- Element points = creator.create("input");
- points.setAttribute("name", "points");
- points.setAttribute("value", (String) opts.get("points"));
-
- params.appendChild(width);
- params.appendChild(height);
- params.appendChild(points);
-
- out.appendChild(export);
- out.appendChild(mimetype);
- out.appendChild(params);
-
- action.appendChild(out);
- document.appendChild(action);
-
- return document;
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/utils/Configuration.java
--- a/src/main/java/de/intevation/artifacts/httpclient/utils/Configuration.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,130 +0,0 @@
-/*
- * 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.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.w3c.dom.Document;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-import org.apache.log4j.Logger;
-
-/**
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- */
-public class Configuration {
-
- private static final Logger logger = Logger.getLogger(Configuration.class);
-
- private File config;
-
- private Map serverSettings;
- private Map artifactSettings;
- private Map outputSettings;
-
- public static final String XPATH_SERVER = "/configuration/artifact-server";
- public static final String XPATH_ARTIFACT = "/configuration/artifact";
- public static final String XPATH_OUTPUT = "/configuration/output";
-
-
- public Configuration(File config) {
- this.config = config;
- serverSettings = new HashMap();
- artifactSettings = new HashMap();
- outputSettings = new HashMap();
- }
-
-
- public void initialize()
- throws IOException
- {
- Document conf = XMLUtils.readDocument(new FileInputStream(config));
-
- if (conf == null) {
- throw new IOException("Can't read config: " + config.getName());
- }
-
- readServerSettings(conf);
- readArtifactSettings(conf);
- readOutputSettings(conf);
- }
-
-
- private void readServerSettings(Document document)
- throws IOException
- {
- Node serverNode = XMLUtils.getNodeXPath(document, XPATH_SERVER);
-
- if (serverNode == null) {
- throw new IOException("No server configuration found.");
- }
-
- serverSettings = extractSettings(serverSettings, serverNode);
- }
-
-
- private void readArtifactSettings(Document document)
- throws IOException
- {
- Node artifactNode = XMLUtils.getNodeXPath(document, XPATH_ARTIFACT);
-
- if (artifactNode == null) {
- throw new IOException("No artifact configuration found.");
- }
-
- artifactSettings = extractSettings(artifactSettings, artifactNode);
- }
-
-
- private void readOutputSettings(Document document)
- throws IOException
- {
- Node outputNode = XMLUtils.getNodeXPath(document, XPATH_OUTPUT);
-
- if (outputNode == null) {
- throw new IOException("No output configuration found.");
- }
-
- outputSettings = extractSettings(outputSettings, outputNode);
- }
-
-
- private Map extractSettings(Map settings, Node node) {
- NodeList children = node.getChildNodes();
-
- for (int i = 0; i < children.getLength(); i++) {
- Node child = children.item(i);
- if (child.getNodeType() == Node.ELEMENT_NODE)
- logger.debug(child.getNodeName() + "|" + child.getTextContent());
- settings.put(child.getNodeName(), child.getTextContent());
- }
-
- return settings;
- }
-
-
- public Object getServerSettings(String key) {
- return serverSettings.get(key);
- }
-
-
- public Object getArtifactSettings(String key) {
- return artifactSettings.get(key);
- }
-
-
- public Object getOutputSettings(String key) {
- return outputSettings.get(key);
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/utils/XFormNamespaceContext.java
--- a/src/main/java/de/intevation/artifacts/httpclient/utils/XFormNamespaceContext.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,63 +0,0 @@
-/*
- * 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.utils;
-
-import java.util.Iterator;
-
-import javax.xml.XMLConstants;
-import javax.xml.namespace.NamespaceContext;
-
-/**
- * The namespacecontext object used in xml documents retrieved by the artifact
- * server.
- *
- * @author <a href="mailto:ingo.weinzierl at intevation">Ingo Weinzierl</a>
- */
-public class XFormNamespaceContext
-implements NamespaceContext
-{
- public final static String NAMESPACE_URI = "http://www.w3.org/2002/xforms";
-
- public final static String NAMESPACE_PREFIX = "xform";
-
- public static final XFormNamespaceContext INSTANCE =
- new XFormNamespaceContext();
-
- /**
- * Constructor
- */
- public XFormNamespaceContext() {
- }
-
- public String getNamespaceURI(String prefix) {
-
- if (prefix == null) {
- throw new NullPointerException("Null prefix");
- }
-
- if (NAMESPACE_PREFIX.equals(prefix)) {
- return NAMESPACE_URI;
- }
-
- if ("xml".equals(prefix)) {
- return XMLConstants.XML_NS_URI;
- }
-
- return XMLConstants.NULL_NS_URI;
- }
-
- public String getPrefix(String uri) {
- throw new UnsupportedOperationException();
- }
-
- public Iterator getPrefixes(String uri) {
- throw new UnsupportedOperationException();
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r da691e917f98 -r a857866d162f src/main/java/de/intevation/artifacts/httpclient/utils/XMLUtils.java
--- a/src/main/java/de/intevation/artifacts/httpclient/utils/XMLUtils.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,320 +0,0 @@
-/*
- * 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.utils;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-import javax.xml.namespace.NamespaceContext;
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.TransformerFactoryConfigurationError;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.apache.log4j.Logger;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * This class provides many helper-Methods for handling different kinds of
- * XML-stuff.
- * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
- * @author <a href="mailto:sascha.teichmann at intevation.de">Sascha L. Teichmann</a>
- */
-public class XMLUtils {
-
- /**
- * the logger, used to log exceptions and additonaly information
- */
- private static Logger logger = Logger.getLogger(XMLUtils.class);
-
- /**
- * Constructor
- */
- public XMLUtils() {
- }
-
- /**
- * Class which could be used to create XML-Elements
- * @author <a href="mailto:sascha.teichmann at intevation.de">Sascha L. Teichmann</a>
- *
- */
- public static class ElementCreator {
-
- /**
- * The document the elements should be placed in.
- */
- protected Document document;
-
- /**
- * The namespace that should be used.
- */
- protected String ns;
-
- /**
- * The prefix of the namespace that should be used.
- */
- protected String prefix;
-
- /**
- * Constructor
- * @param document the document the elements should be placed in
- * @param ns the namespace that should be used
- * @param prefix the prefix of the namespace that should be used
- */
- public ElementCreator(Document document, String ns, String prefix) {
- this.document = document;
- this.ns = ns;
- this.prefix = prefix;
- }
-
- /**
- * Creates a new element using the given name.
- * @param name the name of the new element.
- * @return the new element
- */
- public Element create(String name) {
- Element element = document.createElementNS(ns, name);
- element.setPrefix(prefix);
- return element;
- }
-
- /**
- * Adds a new attribute to the given element.
- * @param element the element where the attribute should be placed in.
- * @param name the name of the attribute
- * @param value the value of the attribute
- */
- public void addAttr(Element element, String name, String value) {
- Attr attr = document.createAttributeNS(ns, name);
- attr.setValue(value);
- attr.setPrefix(prefix);
- element.setAttributeNode(attr);
- }
- } // class ElementCreator
-
- /**
- * Creates a new document.
- * @return the new document
- */
- public static Document newDocument() {
- try {
- return DocumentBuilderFactory.newInstance().newDocumentBuilder()
- .newDocument();
- } catch (ParserConfigurationException pce) {
- logger.error(pce.getLocalizedMessage(), pce);
- }
- return null;
- }
-
- /**
- * Creates a new <code>XPath</code>-expression
- * @return the new <code>XPath</code>-expression
- */
- public static XPath newXPath() {
- return newXPath(null);
- }
-
- /**
- * Creates a new <code>XPath</code>-expression
- * @param namespaceContext the namespacecontext that should be used.
- * @return the new <code>XPath</code>-expression
- */
- public static XPath newXPath(NamespaceContext namespaceContext) {
- XPathFactory factory = XPathFactory.newInstance();
- XPath xpath = factory.newXPath();
- if (namespaceContext != null) {
- xpath.setNamespaceContext(namespaceContext);
- }
- return xpath;
- }
-
- /**
- * Fetch the value of an element or attribute from the given resource
- * using the query.
- * @param root the source where the value should be fetch from
- * @param query the query that should be used to fetch the value
- * @param namespaceContext the namespacecontext that must match to
- * fetch the value.
- * @return the value
- */
- public static final String xpathString(Object root, String query,
- NamespaceContext namespaceContext) {
- return (String) xpath(root, query, XPathConstants.STRING,
- namespaceContext);
- }
-
- /**
- * Fetch the object rom the given resource using the query.
- * @param root the source where the value should be fetch from
- * @param query the query that should be used to fetch the object
- * @param returnType the Type that must be used to return the object,
- * @param namespaceContext the namespacecontext that must match to
- * fetch the object.
- * @return the value
- */
- public static final Object xpath(Object root, String query,
- QName returnType,
- NamespaceContext namespaceContext) {
- if (root == null) {
- return null;
- }
- try {
- XPath xpath = XMLUtils.newXPath(namespaceContext);
- if (xpath != null) {
- return xpath.evaluate(query, root, returnType);
- }
- } catch (XPathExpressionException xpee) {
- logger.error(xpee.getLocalizedMessage(), xpee);
- }
- return null;
- }
-
- /**
- * Fetch the object rom the given resource using the query
- * and the default <code>ArtifactNamespaceContext</code>
- * @param root the source where the value should be fetch from
- * @param query the query that should be used to fetch the object
- * @param returnType the Type that must be used to return the object
- * @return the value
- */
- public static Object getXPath(Object root, String query, QName returnType) {
- return getXPath(root,query,returnType,ArtifactNamespaceContext.INSTANCE);
- }
-
- /**
- * Fetch the object rom the given resource using the query
- * and the default <code>ArtifactNamespaceContext</code>
- * @param root the source where the value should be fetch from
- * @param query the query that should be used to fetch the object
- * @param returnType the Type that must be used to return the object.
- * @param context the namespacecontext that must match to
- * fetch the object.
- * @return the value
- */
- public static Object getXPath(
- Object root, String query, QName returnType, NamespaceContext context
- ) {
- return xpath(root, query, returnType, context);
- }
-
- /**
- * Fetch a Nodeset value from a XML-Fragment or XML-Document using the
- * given query.
- * @param root the source where the String should be fetched from
- * @param query the query that should be used,
- * @return the Nodeset fetched from the source
- */
- public static NodeList getNodeSetXPath(Object root, String query) {
- return (NodeList) getXPath(root, query, XPathConstants.NODESET);
- }
-
- /**
- * Fetch a Node from a XML-Fragment or XML-Document using the
- * given query.
- * @param root the source where the Node should be fetched from
- * @param query the query that should be used,
- * @return the Node fetched from the source
- */
- public static Node getNodeXPath(Object root, String query) {
- return (Node) getXPath(root, query, XPathConstants.NODE);
- }
-
- /**
- * Fetch a String value from a XML-Fragment or XML-Document using the
- * given query.
- * @param root the source where the String should be fetched from
- * @param xpath the query that should be used,
- * @return the String fetched from the source
- */
- public static String getStringXPath(Object root, String xpath) {
- return getStringXPath(root, xpath, null);
- }
-
- /**
- * Fetch a String value from a XML-Fragment or XML-Document using the
- * given query.
- * @param root the source where the String should be fetched from
- * @param query the query that should be used,
- * @param def the default-value that will be returned id no value was found
- * @return the String fetched from the source
- */
- public static String getStringXPath(Object root, String query, String def) {
- String s = (String) getXPath(root, query, XPathConstants.STRING);
- return s == null || s.length() == 0 ? def : s;
- }
-
- /**
- * Reads an XML-document from a given <code>InputStream</code>
- * @param inputStream the <code>InputStream</code> where the document
- * should be read from
- * @return the document that could be read.
- */
- public static Document readDocument(InputStream inputStream) {
- Document returnValue = null;
- try {
- DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
- .newInstance();
- docBuilderFactory.setNamespaceAware(true);
- DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
- returnValue = docBuilder.parse(inputStream);
- } catch (ParserConfigurationException e) {
- logger.error(e, e);
- } catch (SAXException e) {
- logger.error(e, e);
- } catch (IOException e) {
- logger.error(e, e);
- }
- return returnValue;
- }
-
- /**
- * Writes a given Document to an <code>OutputStream</code>
- * @param document the document that should be written
- * @param out the stream where the document should be written to,
- * @return true if it was successful, false if not.
- */
- public static boolean toStream(Document document, OutputStream out) {
- try {
- Transformer transformer =
- TransformerFactory.newInstance().newTransformer();
- DOMSource source = new DOMSource(document);
- StreamResult result = new StreamResult(out);
- transformer.transform(source, result);
- return true;
- }
- catch (TransformerConfigurationException tce) {
- logger.error(tce.getLocalizedMessage(), tce);
- }
- catch (TransformerFactoryConfigurationError tfce) {
- logger.error(tfce.getLocalizedMessage(), tfce);
- }
- catch (TransformerException te) {
- logger.error(te.getLocalizedMessage(), te);
- }
- return false;
- }
-}
-// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/ConsoleClient.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/ConsoleClient.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,354 @@
+/*
+ * 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;
+
+import java.io.IOException;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+
+import java.net.MalformedURLException;
+
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.log4j.Logger;
+import org.apache.log4j.PropertyConfigurator;
+
+import de.intevation.artifacts.httpclient.http.HttpClient;
+import de.intevation.artifacts.httpclient.http.HttpClientImpl;
+import de.intevation.artifacts.httpclient.http.response.DocumentResponseHandler;
+
+import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
+import de.intevation.artifacts.httpclient.exceptions.NoSuchOptionException;
+import de.intevation.artifacts.httpclient.objects.Artifact;
+import de.intevation.artifacts.httpclient.utils.ArtifactProtocolUtils;
+import de.intevation.artifacts.httpclient.utils.Configuration;
+import de.intevation.artifacts.httpclient.utils.XFormNamespaceContext;
+import de.intevation.artifacts.httpclient.utils.XMLUtils;
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public class ConsoleClient
+{
+ /**
+ * The logging is done via Log4j. To configure the logging
+ * a file 'log4j.properties' is search in the configuration directory.
+ */
+ public static final String LOG4J_PROPERTIES = "log4j.properties";
+
+
+ /**
+ * The path of the configuration directory.
+ */
+ public static final String CONFIG_PATH = System.getProperty("config.dir",
+ "conf");
+
+ public static final String CONFIG = System.getProperty("config.file",
+ "use_case1.conf");
+
+
+ public static final String XPATH_DYNAMIC = "/art:result/art:ui/art:dynamic";
+
+ /**
+ * The logger used in this class.
+ */
+ private static Logger logger;
+
+
+ static {
+ configureLogging();
+
+ logger = Logger.getLogger(ConsoleClient.class);
+ }
+
+
+ /**
+ * Trys to load the Log4j configuration from ${config.dir}/log4j.properties.
+ */
+ public static final void configureLogging() {
+ File configDir = new File(CONFIG_PATH);
+ File propFile = new File(configDir, LOG4J_PROPERTIES);
+
+ if (propFile.isFile() && propFile.canRead()) {
+ try {
+ PropertyConfigurator.configure(propFile.toURI().toURL());
+ }
+ catch (MalformedURLException mue) {
+ mue.printStackTrace(System.err);
+ }
+ }
+ }
+
+
+ public static final Configuration readConfiguration() {
+ File configDir = new File(CONFIG_PATH);
+ File configFile = new File(configDir, CONFIG);
+
+ logger.debug("Configuration file: " + configFile.getAbsolutePath());
+
+ if (configFile.isFile() && configFile.canRead()) {
+ try {
+ Configuration conf = new Configuration(configFile);
+ conf.initialize();
+
+ return conf;
+ }
+ catch (IOException ioe) {
+ logger.error("Error while reading configuration.");
+ }
+ }
+
+ return null;
+ }
+
+
+ public static void main( String[] args )
+ {
+ logger.info("Starting console client.");
+
+ Configuration conf = readConfiguration();
+
+ String serverHost = (String) conf.getServerSettings("host");
+ String serverPort = (String) conf.getServerSettings("port");
+ HttpClient client = new HttpClientImpl(serverHost + ":" + serverPort);
+
+ try {
+ Document create = ArtifactProtocolUtils.createCreateDocument(
+ (String) conf.getArtifactSettings("fis"));
+ Artifact artifact = (Artifact) client.create(create, null);
+
+ Map attr = new HashMap();
+ String product = (String) conf.getArtifactSettings("product");
+ String[] products = extractOptions(client, artifact, product);
+ attr.put("product", products[0]);
+
+ feedAndGo(client, artifact, attr, "timeSeries");
+
+ attr.clear();
+ String area = (String) conf.getArtifactSettings("areaid");
+ String[] areas = extractOptions(client, artifact, area);
+ attr.put("areaid", areas[0]);
+ feedAndGo(client, artifact, attr, "timeseries_without_geom");
+
+ attr.clear();
+ String feature = (String) conf.getArtifactSettings("featureid");
+ String[] features = extractOptions(client, artifact, feature);
+ attr.put("featureid", features[0]);
+ feedAndGo(client, artifact, attr, "timeseries_vector_scalar");
+
+ attr.clear();
+ String vector = (String) conf.getArtifactSettings("vectorscalar");
+ String[] vectors = extractOptions(client, artifact, vector);
+ attr.put("vectorscalar", vectors[0]);
+ feedAndGo(client, artifact, attr, "timeseries_parameter");
+
+ attr.clear();
+ String parameter = (String) conf.getArtifactSettings("parameterid");
+ String[] parameters = extractOptions(client, artifact, parameter);
+ attr.put("parameterid", parameters);
+ feedAndGo(client, artifact, attr, "timeseries_depth_height");
+
+ attr.clear();
+ String measure = (String) conf.getArtifactSettings("measurementid");
+ String[] measures = extractMeasurements(client, artifact, measure);
+ attr.put("measurementid", measures);
+ feedAndGo(client, artifact, attr, "timeseries_interval");
+
+ attr.clear();
+ String min = (String) conf.getArtifactSettings("minvalue");
+ String max = (String) conf.getArtifactSettings("maxvalue");
+ attr.put("minvalue", min);
+ attr.put("maxvalue", max);
+ feedAndGo(client, artifact, attr, "timeseries_calculate_results");
+
+ try {
+ Map opts = new HashMap();
+ opts.put("mime-type", conf.getOutputSettings("mime-type"));
+ opts.put("width", conf.getOutputSettings("width"));
+ opts.put("height", conf.getOutputSettings("height"));
+ opts.put("points", conf.getOutputSettings("points"));
+
+ Document chart =
+ ArtifactProtocolUtils.createChartDocument(artifact, opts);
+
+ String dir = (String) conf.getOutputSettings("directory");
+
+ File outDir = new File(dir);
+ File output = new File(outDir, "output.png");
+ OutputStream os = new FileOutputStream(output);
+
+ client.out(artifact, chart, "chart", os);
+ }
+ catch (IOException ioe) {
+ logger.error(
+ "IO error while writing the output: " + ioe.getMessage());
+ }
+
+ logger.debug("Finished console client.");
+ }
+ catch (ConnectionException ce) {
+ logger.error(ce.getMessage());
+ }
+ catch (NoSuchOptionException nsoe) {
+ logger.error(
+ "No such option found: " + nsoe.getMessage());
+ }
+ }
+
+
+ public static void feedAndGo(
+ HttpClient client,
+ Artifact artifact,
+ Map attr,
+ String target)
+ throws ConnectionException
+ {
+ Document feed = ArtifactProtocolUtils.createFeedDocument(artifact, attr);
+ client.feed(artifact, feed, new DocumentResponseHandler());
+
+ Document advance = ArtifactProtocolUtils.createAdvanceDocument(
+ artifact,
+ target);
+
+ client.advance(artifact, advance, new DocumentResponseHandler());
+ }
+
+
+ /**
+ * XXX I think, this method should be implemented somewhere else to be able
+ * to re-use this implementation. But this method needs more work to be more
+ * abstract, so it needs to be reimplemented later, I think.
+ */
+ public static String[] extractOptions(
+ HttpClient client,
+ Artifact artifact,
+ String text)
+ throws NoSuchOptionException, ConnectionException
+ {
+ Document describe = ArtifactProtocolUtils.createDescribeDocument(
+ artifact, true);
+
+ Document description = (Document) client.describe(
+ artifact, describe, new DocumentResponseHandler());
+
+ List pieces = Arrays.asList(text.split(","));
+ List options = new ArrayList(pieces.size());
+
+ Node dynamic = XMLUtils.getNodeXPath(description, XPATH_DYNAMIC);
+
+ // TODO We should handle these cases better!!
+ NodeList items = (NodeList) XMLUtils.getXPath(
+ dynamic, "xform:select1/xform:choices/xform:item",
+ XPathConstants.NODESET, XFormNamespaceContext.INSTANCE);
+
+ if (items == null || items.getLength() == 0) {
+ items = (NodeList) XMLUtils.getXPath(
+ dynamic, "xform:select/xform:choices/xform:item",
+ XPathConstants.NODESET, XFormNamespaceContext.INSTANCE);
+ }
+
+ if (items == null || items.getLength() == 0) {
+ items = (NodeList) XMLUtils.getXPath(
+ dynamic, "xform:group/xform:select/xform:item",
+ XPathConstants.NODESET, XFormNamespaceContext.INSTANCE);
+ }
+
+
+ for (int i = 0; i < items.getLength(); i++) {
+ Node item = items.item(i);
+ Node label = (Node) XMLUtils.getXPath(
+ item, "xform:label", XPathConstants.NODE,
+ XFormNamespaceContext.INSTANCE);
+
+ Node value = (Node) XMLUtils.getXPath(
+ item, "xform:value", XPathConstants.NODE,
+ XFormNamespaceContext.INSTANCE);
+
+ if (pieces.indexOf(label.getTextContent()) >= 0)
+ options.add(value.getTextContent());
+ }
+
+ if (options.isEmpty())
+ throw new NoSuchOptionException(text);
+
+ return (String[]) options.toArray(new String[options.size()]);
+ }
+
+
+ /**
+ * XXX This method extracts the measurement ids depending on the user
+ * configuration from describe document. Currently, this is a special case
+ * that should be handled the same way as all the other options in the
+ * describe document.
+ */
+ public static String[] extractMeasurements(
+ HttpClient client,
+ Artifact artifact,
+ String text)
+ throws NoSuchOptionException, ConnectionException
+ {
+ Document describe = ArtifactProtocolUtils.createDescribeDocument(
+ artifact, true);
+
+ Document description = (Document) client.describe(
+ artifact, describe, new DocumentResponseHandler());
+
+ List pieces = Arrays.asList(text.split(","));
+ List options = new ArrayList(pieces.size());
+
+ Node dynamic = XMLUtils.getNodeXPath(description, XPATH_DYNAMIC);
+
+ NodeList params = (NodeList) XMLUtils.getXPath(
+ dynamic, "xform:group/xform:select",
+ XPathConstants.NODESET, XFormNamespaceContext.INSTANCE);
+
+ for (int i = 0; i < params.getLength(); i++) {
+ Node param = params.item(i);
+
+ NodeList items = (NodeList) XMLUtils.getXPath(
+ param, "xform:item[@disabled='false']", XPathConstants.NODESET,
+ XFormNamespaceContext.INSTANCE);
+
+ for (int j = 0; j < items.getLength(); j++) {
+ Node item = items.item(j);
+
+ Node label = (Node) XMLUtils.getXPath(
+ item, "xform:label", XPathConstants.NODE,
+ XFormNamespaceContext.INSTANCE);
+
+ if (pieces.indexOf(label.getTextContent()) < 0) {
+ continue;
+ }
+
+ Node value = (Node) XMLUtils.getXPath(
+ item, "xform:value", XPathConstants.NODE,
+ XFormNamespaceContext.INSTANCE);
+
+ options.add(value.getTextContent());
+ }
+ }
+
+ if (options.isEmpty())
+ throw new NoSuchOptionException(text);
+
+ return (String[]) options.toArray(new String[options.size()]);
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/exceptions/ConnectionException.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/exceptions/ConnectionException.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,25 @@
+/*
+ * 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.exceptions;
+
+import java.io.IOException;
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public class ConnectionException extends IOException {
+
+ public ConnectionException(String msg) {
+ super(msg);
+ }
+
+ public ConnectionException(String msg, Throwable throwable) {
+ super(msg, throwable);
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/exceptions/NoSuchOptionException.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/exceptions/NoSuchOptionException.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,19 @@
+/*
+ * 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.exceptions;
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public class NoSuchOptionException extends Exception {
+
+ public NoSuchOptionException(String msg) {
+ super(msg);
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/http/HttpClient.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/http/HttpClient.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,116 @@
+/*
+ * 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.OutputStream;
+
+import org.w3c.dom.Document;
+
+import de.intevation.artifacts.httpclient.exceptions.ConnectionException;
+import de.intevation.artifacts.httpclient.http.response.ResponseHandler;
+import de.intevation.artifacts.httpclient.objects.Artifact;
+import de.intevation.artifacts.httpclient.objects.ArtifactFactory;
+import de.intevation.artifacts.httpclient.utils.ArtifactCreator;
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public interface HttpClient {
+
+ ArtifactFactory[] getArtifactFactories()
+ throws ConnectionException;
+
+ Object create(Document createDocument, ArtifactCreator creator)
+ throws ConnectionException;
+
+ Object describe(
+ Artifact artifact,
+ Document describeDocument,
+ ResponseHandler handler)
+ throws ConnectionException;
+
+ Object feed(Artifact artifact, Document feedDocument, ResponseHandler handler)
+ throws ConnectionException;
+
+ Object advance(
+ Artifact artifact,
+ Document advanceDocument,
+ ResponseHandler handler)
+ throws ConnectionException;
+
+ void out(
+ Artifact artifact,
+ Document outDocument,
+ String target,
+ OutputStream out)
+ throws ConnectionException;
+
+
+ /*******************************
+ * Service API
+ *******************************/
+
+ Document callService(String url, String service, Document input)
+ throws ConnectionException;
+
+ Object callService(
+ String url,
+ String service,
+ Document input,
+ ResponseHandler handler)
+ throws ConnectionException;
+
+
+ /*******************************
+ * Collections API
+ *******************************/
+
+ Object createCollection(
+ Document createDocument,
+ String ownerId,
+ ResponseHandler handler)
+ throws ConnectionException;
+
+ Object doCollectionAction(
+ Document actionDocument,
+ String uuid,
+ ResponseHandler handler)
+ throws ConnectionException;
+
+ void collectionOut(
+ Document outDocument,
+ String uuid,
+ String type,
+ OutputStream out)
+ throws ConnectionException;
+
+ InputStream collectionOut(
+ Document doc,
+ String uuid,
+ String type)
+ throws ConnectionException;
+
+
+ /*******************************
+ * Users API
+ *******************************/
+
+ Document listUsers()
+ throws ConnectionException;
+
+ Document listUserCollections(String userid)
+ throws ConnectionException;
+
+ Document createUser(Document doc)
+ throws ConnectionException;
+
+ Document findUser(Document doc)
+ throws ConnectionException;
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/http/HttpClientImpl.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/http/HttpClientImpl.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,577 @@
+/*
+ * 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 java.util.ArrayList;
+import java.util.List;
+
+import org.apache.log4j.Logger;
+
+import org.restlet.Client;
+import org.restlet.Request;
+import org.restlet.Response;
+import org.restlet.data.ClientInfo;
+import org.restlet.data.Language;
+import org.restlet.data.MediaType;
+import org.restlet.data.Method;
+import org.restlet.data.Preference;
+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.ArtifactCreator;
+
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public class HttpClientImpl implements HttpClient {
+
+ private static final Logger logger = Logger.getLogger(HttpClient.class);
+
+ /** The URL part of the resource to list the existing users of the server.*/
+ public static final String PATH_LIST_USERS = "/list-users";
+
+ /** The URL part of the resource to list the Collections owned by a specific
+ * user.*/
+ public static final String PATH_USER_COLLECTIONS = "/list-collections";
+
+ /** The URL part og the resource to create a new user on the server.*/
+ public static final String PATH_CREATE_USER = "/create-user";
+
+ /** The URL part og the resource to find an existing user on the server.*/
+ public static final String PATH_FIND_USER = "/find-user";
+
+ /** The URL part of the resource to call a specific service.*/
+ public static final String PATH_SERVICE = "/service";
+
+ /** The URL path of the resource to create new artifact collections.*/
+ public static final String PATH_CREATE_COLLECTION = "/create-collection";
+
+ /** The URL path of the resource to work with an artifact collections.*/
+ public static final String PATH_ACTION_COLLECTION = "/collection";
+
+ /** The URL path of the resource to work with an artifact collections.*/
+ public static final String PATH_OUT_COLLECTION = "/collection";
+
+ private String serverUrl;
+
+ private String localeString;
+
+ private static final ThreadLocal<Client> CLIENT =
+ new ThreadLocal<Client>() {
+ @Override
+ protected Client initialValue() {
+ logger.debug("create new HTTP client");
+ return new Client(Protocol.HTTP);
+ }
+ };
+
+ public HttpClientImpl(String serverUrl) {
+ this.serverUrl = serverUrl;
+ }
+
+
+ /**
+ * This constructor might be used to modify the request's locale manually.
+ * E.g. the localization should not be based on the configured browser
+ * locale, but site specific configuration - than you are able to set the
+ * locale in this constructor.
+ *
+ * @param serverUrl The url that is used for the request.
+ * @param localeString The string representation of the desired locale.
+ */
+ public HttpClientImpl(String serverUrl, String localeString) {
+ this(serverUrl);
+
+ this.localeString = localeString;
+ }
+
+
+ @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.");
+ }
+ }
+
+
+ /**
+ * This method creates a new artifact in the artifact server and returns
+ * this artifact. The new artifact is created using <i>creator</i>. If no
+ * {@link ArtifactCreator} is given (null), an {@link Artifact} is returned.
+ *
+ * @param doc The CREATE document.
+ * @param creator The {@link ArtifactCreator} that is used to extract the
+ * new artifact from response document of the server.
+ *
+ * @return the new artifact.
+ */
+ @Override
+ public Object create(Document doc, ArtifactCreator creator)
+ throws ConnectionException
+ {
+ ResponseHandler handler = new DocumentResponseHandler();
+
+ try {
+ String url = serverUrl + "/create";
+ Document result = (Document) handler.handle(doPost(url, doc));
+
+ return creator == null
+ ? ArtifactProtocolUtils.extractArtifact(result)
+ : creator.create(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));
+ try {
+ byte[] b = new byte[4096];
+ int i;
+ while ((i = stream.read(b)) >= 0) {
+ out.write(b, 0, i);
+ }
+ }
+ finally {
+ stream.close();
+ }
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(
+ "Connection to server failed: " + ioe.getMessage());
+ }
+ }
+
+
+ //==============================
+ // HTTP specific methods
+ //==============================
+
+ private Response doPost(String url, Document body) throws IOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Start HTTP-POST request to: " + url);
+ }
+
+ Client client = getClient();
+ Request request = prepareRequest(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 static Client getClient() {
+ return CLIENT.get();
+ }
+
+
+ private Response doGet(String url) throws IOException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Start HTTP-POST request to: "+ url);
+ }
+
+ Client client = getClient();
+ Request request = prepareRequest(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;
+ }
+
+
+ /**
+ * This method prepares the request object.
+ *
+ * @param method The HTTP method (GET,POST).
+ * @param url The URL used for the request.
+ *
+ * @return the request object.
+ */
+ private Request prepareRequest(Method method, String url) {
+ Request request = new Request(method, url);
+
+ ClientInfo info = request.getClientInfo();
+
+ setLocale(info);
+
+ request.setClientInfo(info);
+
+ return request;
+ }
+
+
+ /**
+ * This method is called to set the request's locale.
+ *
+ * @param info The ClientInfo that is used to provide request information.
+ */
+ private void setLocale(ClientInfo info) {
+ if (localeString == null) {
+ return;
+ }
+
+ List<Preference<Language>> accepted =
+ new ArrayList<Preference<Language>>();
+
+ Language lang = Language.valueOf(localeString);
+
+ if (lang != null) {
+ if (logger.isDebugEnabled()) {
+ logger.debug(
+ "Set locale of the request object: " + lang.toString());
+ }
+
+ Preference<Language> pref = new Preference<Language>();
+ pref.setMetadata(lang);
+ accepted.add(pref);
+
+ info.setAcceptedLanguages(accepted);
+ }
+ }
+
+
+ //==============================
+ // Collection API
+ //==============================
+
+ /**
+ * This method triggers the artifact servers resource to create a new
+ * artifact collection.
+ *
+ * @param create The CREATE document for the collection.
+ * @param ownerId The uuid of the creator.
+ * @param handler The handler that is used to create the result object.
+ *
+ * @return a result object created by <i>handler</i>.
+ */
+ public Object createCollection(
+ Document create,
+ String ownerId,
+ ResponseHandler handler)
+ throws ConnectionException
+ {
+ String url = serverUrl + PATH_CREATE_COLLECTION + "/" + ownerId;
+
+ try {
+ return handler.handle(doPost(url, create));
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(ioe.getMessage(), ioe);
+ }
+ }
+
+
+ /**
+ * This method might be used to trigger a collection specific action. The
+ * action that is executed depends on the document <i>actionDoc</i>.
+ *
+ * @param actionDoc The document that describes the action to be executed.
+ * @param uuid The uuid of the collection.
+ * @param handler The handler that is used to create the result object.
+ *
+ * @return a result object created by <i>handler</i>.
+ */
+ public Object doCollectionAction(
+ Document actionDoc,
+ String uuid,
+ ResponseHandler handler)
+ throws ConnectionException
+ {
+ String url = serverUrl + PATH_ACTION_COLLECTION + "/" + uuid;
+
+ try {
+ return handler.handle(doPost(url, actionDoc));
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(ioe.getMessage(), ioe);
+ }
+ }
+
+
+ /**
+ * This method triggers the out() operation of a Collection. The result of
+ * this operation is written to <i>out</i> directly - there is no return
+ * value.
+ *
+ * @param doc The request document for the out() operation.
+ * @param uuid The identifier of the Collection.
+ * @param type The name of the output type.
+ * @param out The OutputStream.
+ */
+ public void collectionOut(
+ Document doc,
+ String uuid,
+ String type,
+ OutputStream out)
+ throws ConnectionException
+ {
+ try {
+ InputStream stream = collectionOut(doc, uuid, type);
+
+ byte[] b = new byte[4096];
+ try {
+ int i;
+ while ((i = stream.read(b)) >= 0) {
+ out.write(b, 0, i);
+ }
+ }
+ finally {
+ stream.close();
+ }
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(ioe.getMessage(), ioe);
+ }
+ }
+
+
+ /**
+ * This method triggers the out() operation of a Collection. The result of
+ * this operation is returned as an InputStream.
+ *
+ * @param doc The request document for the out() operation.
+ * @param uuid The identifier of the Collection.
+ * @param type The name of the output type.
+ *
+ * @return an InputStream.
+ */
+ public InputStream collectionOut(
+ Document doc,
+ String uuid,
+ String type)
+ throws ConnectionException
+ {
+ String url = serverUrl + PATH_OUT_COLLECTION + "/" + uuid + "/" + type;
+
+ ResponseHandler handler = new StreamResponseHandler();
+
+ try {
+ return (InputStream) handler.handle(doPost(url, doc));
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(ioe.getMessage(), ioe);
+ }
+ }
+
+
+ /*******************************
+ * Service API
+ *******************************/
+
+ public Document callService(String url, String service, Document input)
+ throws ConnectionException
+ {
+ DocumentResponseHandler handler = new DocumentResponseHandler();
+
+ return (Document) callService(url, service, input, handler);
+ }
+
+
+ public Object callService(
+ String url,
+ String service,
+ Document input,
+ ResponseHandler handler)
+ throws ConnectionException {
+ if (logger.isDebugEnabled()) {
+ logger.debug("Start service call to '" + service + "'");
+ }
+
+ try {
+ String serverUrl = url + PATH_SERVICE + "/" + service;
+ return handler.handle(doPost(serverUrl, input));
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(
+ "Connection to server failed: " + ioe.getMessage());
+ }
+ }
+
+
+ /*******************************
+ * Users API
+ *******************************/
+
+ public Document listUsers()
+ throws ConnectionException
+ {
+ ResponseHandler handler = new DocumentResponseHandler();
+ String url = serverUrl + PATH_LIST_USERS;
+
+ try {
+ return (Document) handler.handle(doGet(url));
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(ioe.getMessage(), ioe);
+ }
+ }
+
+
+ public Document listUserCollections(String userid)
+ throws ConnectionException
+ {
+ ResponseHandler handler = new DocumentResponseHandler();
+
+ String url = serverUrl + PATH_USER_COLLECTIONS + "/" + userid;
+
+ try {
+ return (Document) handler.handle(doGet(url));
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(ioe.getMessage(), ioe);
+ }
+ }
+
+ @Override
+ public Document createUser(Document doc)
+ throws ConnectionException {
+ ResponseHandler handler = new DocumentResponseHandler();
+
+ String url = this.serverUrl + PATH_CREATE_USER;
+
+ try {
+ return (Document) handler.handle(doPost(url, doc));
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(
+ "Connection to server failed: " + ioe.getMessage());
+ }
+ }
+
+ @Override
+ public Document findUser(Document doc)
+ throws ConnectionException {
+ ResponseHandler handler = new DocumentResponseHandler();
+
+ String url = this.serverUrl + PATH_FIND_USER;
+
+ try {
+ return (Document) handler.handle(doPost(url, doc));
+ }
+ catch (IOException ioe) {
+ throw new ConnectionException(
+ "Connection to server failed: " + ioe.getMessage());
+ }
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/http/response/DocumentResponseHandler.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/http/response/DocumentResponseHandler.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,32 @@
+/*
+ * 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.response;
+
+import java.io.IOException;
+
+import org.restlet.Response;
+import org.restlet.representation.Representation;
+
+import de.intevation.artifacts.httpclient.utils.XMLUtils;
+
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public class DocumentResponseHandler implements ResponseHandler {
+
+ public DocumentResponseHandler() {
+ }
+
+ @Override
+ public Object handle(Response response) throws IOException {
+ Representation output = response.getEntity();
+ return XMLUtils.readDocument(output.getStream());
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/http/response/ResponseHandler.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/http/response/ResponseHandler.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,22 @@
+/*
+ * 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.response;
+
+import java.io.IOException;
+
+import org.restlet.Response;
+
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public interface ResponseHandler {
+
+ Object handle(Response response) throws IOException;
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/http/response/StreamResponseHandler.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/http/response/StreamResponseHandler.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,30 @@
+/*
+ * 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.response;
+
+import java.io.IOException;
+
+import org.restlet.Response;
+import org.restlet.representation.Representation;
+
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public class StreamResponseHandler implements ResponseHandler {
+
+ public StreamResponseHandler() {
+ }
+
+ @Override
+ public Object handle(Response response) throws IOException {
+ Representation output = response.getEntity();
+ return output.getStream();
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/http/response/StringResponseHandler.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/http/response/StringResponseHandler.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,40 @@
+/*
+ * 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.response;
+
+import java.io.ByteArrayOutputStream;
+import java.io.InputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+import org.restlet.Response;
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public class StringResponseHandler extends StreamResponseHandler {
+
+ public StringResponseHandler() {
+ }
+
+ @Override
+ public Object handle(Response response) throws IOException {
+ InputStream in = (InputStream) super.handle(response);
+ OutputStream out = new ByteArrayOutputStream();
+
+ byte[] b = new byte[4096];
+ int i = -1;
+ while ((i = in.read(b)) > 0) {
+ out.write(b, 0, i);
+ }
+ out.close();
+
+ return out.toString();
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/objects/Artifact.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/objects/Artifact.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,50 @@
+/*
+ * 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.objects;
+
+/**
+ * An <code>ArtifactObject</code> representing an artifact.
+ *
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ *
+ */
+public class Artifact {
+
+ /**
+ * The uuid of this Artifact which must be used to identify
+ * the artifact at the <code>ArtifactDatabase</code>.
+ */
+ private String uuid = null;
+
+ /**
+ * The hash of the artifact which was send be the <code>ArtifactDatabase</code>.
+ */
+ private String hash = null;
+
+ /**
+ * Constructor
+ * @param uuid the uuid of this Artifact which must be used to identify
+ * the artifact at the <code>ArtifactDatabase</code>
+ * @param hash the hash of the artifact which was send be the
+ * <code>ArtifactDatabase</code>
+ */
+ public Artifact(String uuid, String hash) {
+ this.uuid = uuid;
+ this.hash = hash;
+ }
+
+ public String getHash() {
+ return this.hash;
+ }
+
+ public String getUuid() {
+ return this.uuid;
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf-8 :
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/objects/ArtifactFactory.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/objects/ArtifactFactory.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,32 @@
+/*
+ * 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.objects;
+
+
+public class ArtifactFactory {
+
+ private String name;
+ private String description;
+
+ public ArtifactFactory(String name, String description) {
+ this.name = name;
+ this.description = description;
+ }
+
+
+ public String getName() {
+ return name;
+ }
+
+
+ public String getDescription() {
+ return description;
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/utils/ArtifactCreator.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/utils/ArtifactCreator.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2011 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.utils;
+
+import org.w3c.dom.Document;
+
+
+/**
+ * This interface is used to create new implementation dependend instances of an
+ * <i>Artifact</i>.
+ *
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public interface ArtifactCreator {
+
+ /**
+ * This method should return a new Artifact object.
+ *
+ * @param doc A document that describes the artifact.
+ *
+ * @return an implementation dependend instance of an <i>Artifact</i>.
+ */
+ public Object create(Document doc);
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/utils/ArtifactNamespaceContext.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/utils/ArtifactNamespaceContext.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,72 @@
+/*
+ * 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.utils;
+
+import java.util.Iterator;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+
+/**
+ * The namespacecontext object used in xml documents retrieved by the artifact
+ * server.
+ *
+ * @author <a href="mailto:sascha.teichmann at intevation">Sascha L. Teichmann</a>
+ */
+public class ArtifactNamespaceContext
+implements NamespaceContext
+{
+ /**
+ * The URI of the namespace of the artifacts.
+ */
+ public final static String NAMESPACE_URI = "http://www.intevation.de/2009/artifacts";
+
+ /**
+ * The XML prefix for the artifacts namespace.
+ */
+ public final static String NAMESPACE_PREFIX = "art";
+
+ /**
+ * The singleton instance of this <code>NamespaceContext</code>
+ */
+ public static final ArtifactNamespaceContext INSTANCE =
+ new ArtifactNamespaceContext();
+
+ /**
+ * Constructor
+ */
+ public ArtifactNamespaceContext() {
+ }
+
+ public String getNamespaceURI(String prefix) {
+
+ if (prefix == null) {
+ throw new NullPointerException("Null prefix");
+ }
+
+ if (NAMESPACE_PREFIX.equals(prefix)) {
+ return NAMESPACE_URI;
+ }
+
+ if ("xml".equals(prefix)) {
+ return XMLConstants.XML_NS_URI;
+ }
+
+ return XMLConstants.NULL_NS_URI;
+ }
+
+ public String getPrefix(String uri) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Iterator getPrefixes(String uri) {
+ throw new UnsupportedOperationException();
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/utils/ArtifactProtocolUtils.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/utils/ArtifactProtocolUtils.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,277 @@
+/*
+ * 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.utils;
+
+import java.util.Map;
+
+import javax.xml.xpath.XPathConstants;
+
+import org.apache.log4j.Logger;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+
+import de.intevation.artifacts.httpclient.objects.Artifact;
+import de.intevation.artifacts.httpclient.objects.ArtifactFactory;
+
+public class ArtifactProtocolUtils {
+
+ private static final Logger logger =
+ Logger.getLogger(ArtifactProtocolUtils.class);
+
+
+ public static ArtifactFactory[] extractArtifactFactories(Document doc) {
+ NodeList elements = (NodeList) XMLUtils.getXPath(
+ doc,
+ "/art:result/art:factories/art:factory",
+ XPathConstants.NODESET,
+ ArtifactNamespaceContext.INSTANCE);
+
+ if (elements == null || elements.getLength() == 0) {
+ return null;
+ }
+
+ ArtifactFactory[] facs = new ArtifactFactory[elements.getLength()];
+
+ String uri = ArtifactNamespaceContext.NAMESPACE_URI;
+
+ for (int idx = 0; idx < facs.length; idx++) {
+ Element factory = (Element)elements.item(idx);
+ String desc = factory.getAttributeNS(uri, "description");
+ String name = factory.getAttributeNS(uri, "name");
+
+ if (name.length() != 0) {
+ facs[idx] = new ArtifactFactory(name, desc);
+ }
+ }
+
+ return facs;
+ }
+
+
+ public static Document createCreateDocument(String fis) {
+ Document document = XMLUtils.newDocument();
+
+ XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+ document,
+ ArtifactNamespaceContext.NAMESPACE_URI,
+ ArtifactNamespaceContext.NAMESPACE_PREFIX
+ );
+
+ Element action = creator.create("action");
+
+ Element type = creator.create("type");
+ type.setAttribute("name", "create");
+
+ Element factory = creator.create("factory");
+ factory.setAttribute("name", fis);
+
+ action.appendChild(type);
+ action.appendChild(factory);
+ document.appendChild(action);
+
+ return document;
+ }
+
+
+ /**
+ * Returns a new artifact defined by uuid and hash values of the document
+ * returned by the artifact server after creating a new artifact.
+ *
+ * @param document Contains information about the server-side created
+ * artifact.
+ * @return a new artifact object.
+ */
+ public static Artifact extractArtifact(Document document) {
+ String uuid = XMLUtils.getStringXPath(
+ document,
+ "/art:result/art:uuid/@value");
+
+ String hash = XMLUtils.getStringXPath(
+ document,
+ "/art:result/art:hash/@value");
+
+ logger.info("NEW Artifact: " + uuid + " / " + hash);
+ return new Artifact(uuid, hash);
+ }
+
+
+ private static Element createArtifactAction(
+ XMLUtils.ElementCreator creator,
+ Artifact artifact,
+ String artifactAction)
+ {
+ Element action = creator.create("action");
+
+ Element type = creator.create("type");
+ type.setAttribute("name", artifactAction);
+
+ Element uuid = creator.create("uuid");
+ uuid.setAttribute("value", artifact.getUuid());
+
+ Element hash = creator.create("hash");
+ hash.setAttribute("value", artifact.getHash());
+
+ action.appendChild(type);
+ action.appendChild(uuid);
+ action.appendChild(hash);
+
+ return action;
+ }
+
+
+ public static Document createFeedDocument(Artifact artifact, Map attr) {
+ Document document = XMLUtils.newDocument();
+
+ XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+ document,
+ ArtifactNamespaceContext.NAMESPACE_URI,
+ ArtifactNamespaceContext.NAMESPACE_PREFIX
+ );
+
+ Element action = createArtifactAction(creator, artifact, "feed");
+ Element data = creator.create("data");
+
+ for (Map.Entry<String, Object> entry:
+ ((Map<String, Object>)attr).entrySet()) {
+
+ String key = entry.getKey();
+ Object values = entry.getValue();
+
+ if (values instanceof Object[]) {
+ appendInputNodes(creator, data, key, (Object[]) values);
+ }
+ else {
+ appendInputNodes(creator, data, key, values);
+ }
+ }
+
+ action.appendChild(data);
+ document.appendChild(action);
+
+ return document;
+ }
+
+
+ private static void appendInputNodes(
+ XMLUtils.ElementCreator creator,
+ Element root,
+ String key,
+ Object value)
+ {
+ Element input = creator.create("input");
+ input.setAttribute("name", key);
+ input.setAttribute("value", (String) value);
+ root.appendChild(input);
+ }
+
+
+ private static void appendInputNodes(
+ XMLUtils.ElementCreator creator,
+ Element root,
+ String key,
+ Object[] values)
+ {
+ for (Object value: values) {
+ Element input = creator.create("input");
+ input.setAttribute("name", key);
+ input.setAttribute("value", (String) value);
+ root.appendChild(input);
+ }
+ }
+
+
+ public static Document createDescribeDocument(Artifact art, boolean ui) {
+ Document document = XMLUtils.newDocument();
+
+ XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+ document,
+ ArtifactNamespaceContext.NAMESPACE_URI,
+ ArtifactNamespaceContext.NAMESPACE_PREFIX
+ );
+
+ Element action = createArtifactAction(creator, art, "describe");
+ Element includeUi = creator.create("include-ui");
+ includeUi.setTextContent(String.valueOf(ui));
+
+ action.appendChild(includeUi);
+ document.appendChild(action);
+
+ return document;
+ }
+
+
+ public static Document createAdvanceDocument(Artifact art, String target) {
+ Document document = XMLUtils.newDocument();
+
+ XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+ document,
+ ArtifactNamespaceContext.NAMESPACE_URI,
+ ArtifactNamespaceContext.NAMESPACE_PREFIX
+ );
+
+ Element action = createArtifactAction(creator, art, "advance");
+ Element targetEle = creator.create("target");
+ targetEle.setAttribute("name", target);
+
+ action.appendChild(targetEle);
+ document.appendChild(action);
+
+ return document;
+ }
+
+
+ public static Document createChartDocument(Artifact artifact, Map opts) {
+ Document document = XMLUtils.newDocument();
+
+ XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
+ document,
+ ArtifactNamespaceContext.NAMESPACE_URI,
+ ArtifactNamespaceContext.NAMESPACE_PREFIX
+ );
+
+ Element action = createArtifactAction(creator, artifact, "out");
+ Element out = creator.create("out");
+ out.setAttribute("name", "chart");
+
+ Element export = creator.create("export");
+ export.setAttribute("name", "img");
+
+ Element mimetype = creator.create("mime-type");
+ export.setAttribute("value", (String) opts.get("mime-type"));
+
+ Element params = creator.create("params");
+
+ Element width = creator.create("input");
+ width.setAttribute("name", "width");
+ width.setAttribute("value", (String) opts.get("width"));
+
+ Element height = creator.create("input");
+ height.setAttribute("name", "height");
+ height.setAttribute("value", (String) opts.get("height"));
+
+ Element points = creator.create("input");
+ points.setAttribute("name", "points");
+ points.setAttribute("value", (String) opts.get("points"));
+
+ params.appendChild(width);
+ params.appendChild(height);
+ params.appendChild(points);
+
+ out.appendChild(export);
+ out.appendChild(mimetype);
+ out.appendChild(params);
+
+ action.appendChild(out);
+ document.appendChild(action);
+
+ return document;
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/utils/Configuration.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/utils/Configuration.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,130 @@
+/*
+ * 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.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import org.apache.log4j.Logger;
+
+/**
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ */
+public class Configuration {
+
+ private static final Logger logger = Logger.getLogger(Configuration.class);
+
+ private File config;
+
+ private Map serverSettings;
+ private Map artifactSettings;
+ private Map outputSettings;
+
+ public static final String XPATH_SERVER = "/configuration/artifact-server";
+ public static final String XPATH_ARTIFACT = "/configuration/artifact";
+ public static final String XPATH_OUTPUT = "/configuration/output";
+
+
+ public Configuration(File config) {
+ this.config = config;
+ serverSettings = new HashMap();
+ artifactSettings = new HashMap();
+ outputSettings = new HashMap();
+ }
+
+
+ public void initialize()
+ throws IOException
+ {
+ Document conf = XMLUtils.readDocument(new FileInputStream(config));
+
+ if (conf == null) {
+ throw new IOException("Can't read config: " + config.getName());
+ }
+
+ readServerSettings(conf);
+ readArtifactSettings(conf);
+ readOutputSettings(conf);
+ }
+
+
+ private void readServerSettings(Document document)
+ throws IOException
+ {
+ Node serverNode = XMLUtils.getNodeXPath(document, XPATH_SERVER);
+
+ if (serverNode == null) {
+ throw new IOException("No server configuration found.");
+ }
+
+ serverSettings = extractSettings(serverSettings, serverNode);
+ }
+
+
+ private void readArtifactSettings(Document document)
+ throws IOException
+ {
+ Node artifactNode = XMLUtils.getNodeXPath(document, XPATH_ARTIFACT);
+
+ if (artifactNode == null) {
+ throw new IOException("No artifact configuration found.");
+ }
+
+ artifactSettings = extractSettings(artifactSettings, artifactNode);
+ }
+
+
+ private void readOutputSettings(Document document)
+ throws IOException
+ {
+ Node outputNode = XMLUtils.getNodeXPath(document, XPATH_OUTPUT);
+
+ if (outputNode == null) {
+ throw new IOException("No output configuration found.");
+ }
+
+ outputSettings = extractSettings(outputSettings, outputNode);
+ }
+
+
+ private Map extractSettings(Map settings, Node node) {
+ NodeList children = node.getChildNodes();
+
+ for (int i = 0; i < children.getLength(); i++) {
+ Node child = children.item(i);
+ if (child.getNodeType() == Node.ELEMENT_NODE)
+ logger.debug(child.getNodeName() + "|" + child.getTextContent());
+ settings.put(child.getNodeName(), child.getTextContent());
+ }
+
+ return settings;
+ }
+
+
+ public Object getServerSettings(String key) {
+ return serverSettings.get(key);
+ }
+
+
+ public Object getArtifactSettings(String key) {
+ return artifactSettings.get(key);
+ }
+
+
+ public Object getOutputSettings(String key) {
+ return outputSettings.get(key);
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/utils/XFormNamespaceContext.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/utils/XFormNamespaceContext.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,63 @@
+/*
+ * 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.utils;
+
+import java.util.Iterator;
+
+import javax.xml.XMLConstants;
+import javax.xml.namespace.NamespaceContext;
+
+/**
+ * The namespacecontext object used in xml documents retrieved by the artifact
+ * server.
+ *
+ * @author <a href="mailto:ingo.weinzierl at intevation">Ingo Weinzierl</a>
+ */
+public class XFormNamespaceContext
+implements NamespaceContext
+{
+ public final static String NAMESPACE_URI = "http://www.w3.org/2002/xforms";
+
+ public final static String NAMESPACE_PREFIX = "xform";
+
+ public static final XFormNamespaceContext INSTANCE =
+ new XFormNamespaceContext();
+
+ /**
+ * Constructor
+ */
+ public XFormNamespaceContext() {
+ }
+
+ public String getNamespaceURI(String prefix) {
+
+ if (prefix == null) {
+ throw new NullPointerException("Null prefix");
+ }
+
+ if (NAMESPACE_PREFIX.equals(prefix)) {
+ return NAMESPACE_URI;
+ }
+
+ if ("xml".equals(prefix)) {
+ return XMLConstants.XML_NS_URI;
+ }
+
+ return XMLConstants.NULL_NS_URI;
+ }
+
+ public String getPrefix(String uri) {
+ throw new UnsupportedOperationException();
+ }
+
+ public Iterator getPrefixes(String uri) {
+ throw new UnsupportedOperationException();
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :
diff -r da691e917f98 -r a857866d162f src/main/java/org/dive4elements/artifacts/httpclient/utils/XMLUtils.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/main/java/org/dive4elements/artifacts/httpclient/utils/XMLUtils.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,320 @@
+/*
+ * 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.utils;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.xml.namespace.NamespaceContext;
+import javax.xml.namespace.QName;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpressionException;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.log4j.Logger;
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+/**
+ * This class provides many helper-Methods for handling different kinds of
+ * XML-stuff.
+ * @author <a href="mailto:ingo.weinzierl at intevation.de">Ingo Weinzierl</a>
+ * @author <a href="mailto:sascha.teichmann at intevation.de">Sascha L. Teichmann</a>
+ */
+public class XMLUtils {
+
+ /**
+ * the logger, used to log exceptions and additonaly information
+ */
+ private static Logger logger = Logger.getLogger(XMLUtils.class);
+
+ /**
+ * Constructor
+ */
+ public XMLUtils() {
+ }
+
+ /**
+ * Class which could be used to create XML-Elements
+ * @author <a href="mailto:sascha.teichmann at intevation.de">Sascha L. Teichmann</a>
+ *
+ */
+ public static class ElementCreator {
+
+ /**
+ * The document the elements should be placed in.
+ */
+ protected Document document;
+
+ /**
+ * The namespace that should be used.
+ */
+ protected String ns;
+
+ /**
+ * The prefix of the namespace that should be used.
+ */
+ protected String prefix;
+
+ /**
+ * Constructor
+ * @param document the document the elements should be placed in
+ * @param ns the namespace that should be used
+ * @param prefix the prefix of the namespace that should be used
+ */
+ public ElementCreator(Document document, String ns, String prefix) {
+ this.document = document;
+ this.ns = ns;
+ this.prefix = prefix;
+ }
+
+ /**
+ * Creates a new element using the given name.
+ * @param name the name of the new element.
+ * @return the new element
+ */
+ public Element create(String name) {
+ Element element = document.createElementNS(ns, name);
+ element.setPrefix(prefix);
+ return element;
+ }
+
+ /**
+ * Adds a new attribute to the given element.
+ * @param element the element where the attribute should be placed in.
+ * @param name the name of the attribute
+ * @param value the value of the attribute
+ */
+ public void addAttr(Element element, String name, String value) {
+ Attr attr = document.createAttributeNS(ns, name);
+ attr.setValue(value);
+ attr.setPrefix(prefix);
+ element.setAttributeNode(attr);
+ }
+ } // class ElementCreator
+
+ /**
+ * Creates a new document.
+ * @return the new document
+ */
+ public static Document newDocument() {
+ try {
+ return DocumentBuilderFactory.newInstance().newDocumentBuilder()
+ .newDocument();
+ } catch (ParserConfigurationException pce) {
+ logger.error(pce.getLocalizedMessage(), pce);
+ }
+ return null;
+ }
+
+ /**
+ * Creates a new <code>XPath</code>-expression
+ * @return the new <code>XPath</code>-expression
+ */
+ public static XPath newXPath() {
+ return newXPath(null);
+ }
+
+ /**
+ * Creates a new <code>XPath</code>-expression
+ * @param namespaceContext the namespacecontext that should be used.
+ * @return the new <code>XPath</code>-expression
+ */
+ public static XPath newXPath(NamespaceContext namespaceContext) {
+ XPathFactory factory = XPathFactory.newInstance();
+ XPath xpath = factory.newXPath();
+ if (namespaceContext != null) {
+ xpath.setNamespaceContext(namespaceContext);
+ }
+ return xpath;
+ }
+
+ /**
+ * Fetch the value of an element or attribute from the given resource
+ * using the query.
+ * @param root the source where the value should be fetch from
+ * @param query the query that should be used to fetch the value
+ * @param namespaceContext the namespacecontext that must match to
+ * fetch the value.
+ * @return the value
+ */
+ public static final String xpathString(Object root, String query,
+ NamespaceContext namespaceContext) {
+ return (String) xpath(root, query, XPathConstants.STRING,
+ namespaceContext);
+ }
+
+ /**
+ * Fetch the object rom the given resource using the query.
+ * @param root the source where the value should be fetch from
+ * @param query the query that should be used to fetch the object
+ * @param returnType the Type that must be used to return the object,
+ * @param namespaceContext the namespacecontext that must match to
+ * fetch the object.
+ * @return the value
+ */
+ public static final Object xpath(Object root, String query,
+ QName returnType,
+ NamespaceContext namespaceContext) {
+ if (root == null) {
+ return null;
+ }
+ try {
+ XPath xpath = XMLUtils.newXPath(namespaceContext);
+ if (xpath != null) {
+ return xpath.evaluate(query, root, returnType);
+ }
+ } catch (XPathExpressionException xpee) {
+ logger.error(xpee.getLocalizedMessage(), xpee);
+ }
+ return null;
+ }
+
+ /**
+ * Fetch the object rom the given resource using the query
+ * and the default <code>ArtifactNamespaceContext</code>
+ * @param root the source where the value should be fetch from
+ * @param query the query that should be used to fetch the object
+ * @param returnType the Type that must be used to return the object
+ * @return the value
+ */
+ public static Object getXPath(Object root, String query, QName returnType) {
+ return getXPath(root,query,returnType,ArtifactNamespaceContext.INSTANCE);
+ }
+
+ /**
+ * Fetch the object rom the given resource using the query
+ * and the default <code>ArtifactNamespaceContext</code>
+ * @param root the source where the value should be fetch from
+ * @param query the query that should be used to fetch the object
+ * @param returnType the Type that must be used to return the object.
+ * @param context the namespacecontext that must match to
+ * fetch the object.
+ * @return the value
+ */
+ public static Object getXPath(
+ Object root, String query, QName returnType, NamespaceContext context
+ ) {
+ return xpath(root, query, returnType, context);
+ }
+
+ /**
+ * Fetch a Nodeset value from a XML-Fragment or XML-Document using the
+ * given query.
+ * @param root the source where the String should be fetched from
+ * @param query the query that should be used,
+ * @return the Nodeset fetched from the source
+ */
+ public static NodeList getNodeSetXPath(Object root, String query) {
+ return (NodeList) getXPath(root, query, XPathConstants.NODESET);
+ }
+
+ /**
+ * Fetch a Node from a XML-Fragment or XML-Document using the
+ * given query.
+ * @param root the source where the Node should be fetched from
+ * @param query the query that should be used,
+ * @return the Node fetched from the source
+ */
+ public static Node getNodeXPath(Object root, String query) {
+ return (Node) getXPath(root, query, XPathConstants.NODE);
+ }
+
+ /**
+ * Fetch a String value from a XML-Fragment or XML-Document using the
+ * given query.
+ * @param root the source where the String should be fetched from
+ * @param xpath the query that should be used,
+ * @return the String fetched from the source
+ */
+ public static String getStringXPath(Object root, String xpath) {
+ return getStringXPath(root, xpath, null);
+ }
+
+ /**
+ * Fetch a String value from a XML-Fragment or XML-Document using the
+ * given query.
+ * @param root the source where the String should be fetched from
+ * @param query the query that should be used,
+ * @param def the default-value that will be returned id no value was found
+ * @return the String fetched from the source
+ */
+ public static String getStringXPath(Object root, String query, String def) {
+ String s = (String) getXPath(root, query, XPathConstants.STRING);
+ return s == null || s.length() == 0 ? def : s;
+ }
+
+ /**
+ * Reads an XML-document from a given <code>InputStream</code>
+ * @param inputStream the <code>InputStream</code> where the document
+ * should be read from
+ * @return the document that could be read.
+ */
+ public static Document readDocument(InputStream inputStream) {
+ Document returnValue = null;
+ try {
+ DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory
+ .newInstance();
+ docBuilderFactory.setNamespaceAware(true);
+ DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+ returnValue = docBuilder.parse(inputStream);
+ } catch (ParserConfigurationException e) {
+ logger.error(e, e);
+ } catch (SAXException e) {
+ logger.error(e, e);
+ } catch (IOException e) {
+ logger.error(e, e);
+ }
+ return returnValue;
+ }
+
+ /**
+ * Writes a given Document to an <code>OutputStream</code>
+ * @param document the document that should be written
+ * @param out the stream where the document should be written to,
+ * @return true if it was successful, false if not.
+ */
+ public static boolean toStream(Document document, OutputStream out) {
+ try {
+ Transformer transformer =
+ TransformerFactory.newInstance().newTransformer();
+ DOMSource source = new DOMSource(document);
+ StreamResult result = new StreamResult(out);
+ transformer.transform(source, result);
+ return true;
+ }
+ catch (TransformerConfigurationException tce) {
+ logger.error(tce.getLocalizedMessage(), tce);
+ }
+ catch (TransformerFactoryConfigurationError tfce) {
+ logger.error(tfce.getLocalizedMessage(), tfce);
+ }
+ catch (TransformerException te) {
+ logger.error(te.getLocalizedMessage(), te);
+ }
+ return false;
+ }
+}
+// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8:
diff -r da691e917f98 -r a857866d162f src/test/java/de/intevation/artifacts/httpclient/ConsoleClientTest.java
--- a/src/test/java/de/intevation/artifacts/httpclient/ConsoleClientTest.java Wed Apr 24 17:35:50 2013 +0200
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-/*
- * 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;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-/**
- * Unit test for simple ConsoleClient.
- */
-public class ConsoleClientTest
- extends TestCase
-{
- /**
- * Create the test case
- *
- * @param testName name of the test case
- */
- public ConsoleClientTest( String testName )
- {
- super( testName );
- }
-
- /**
- * @return the suite of tests being tested
- */
- public static Test suite()
- {
- return new TestSuite( ConsoleClientTest.class );
- }
-
- /**
- * Rigourous Test :-)
- */
- public void testConsoleClient()
- {
- assertTrue( true );
- }
-}
diff -r da691e917f98 -r a857866d162f src/test/java/org/dive4elements/artifacts/httpclient/ConsoleClientTest.java
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/test/java/org/dive4elements/artifacts/httpclient/ConsoleClientTest.java Thu Apr 25 11:14:14 2013 +0200
@@ -0,0 +1,45 @@
+/*
+ * 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;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple ConsoleClient.
+ */
+public class ConsoleClientTest
+ extends TestCase
+{
+ /**
+ * Create the test case
+ *
+ * @param testName name of the test case
+ */
+ public ConsoleClientTest( String testName )
+ {
+ super( testName );
+ }
+
+ /**
+ * @return the suite of tests being tested
+ */
+ public static Test suite()
+ {
+ return new TestSuite( ConsoleClientTest.class );
+ }
+
+ /**
+ * Rigourous Test :-)
+ */
+ public void testConsoleClient()
+ {
+ assertTrue( true );
+ }
+}
More information about the Dive4elements-commits
mailing list