# HG changeset patch # User Sascha L. Teichmann # 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 Ingo Weinzierl - */ -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 Ingo Weinzierl - */ -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 Ingo Weinzierl - */ -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 Ingo Weinzierl - */ -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 Ingo Weinzierl - */ -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 = - new ThreadLocal() { - @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 creator. 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> accepted = - new ArrayList>(); - - Language lang = Language.valueOf(localeString); - - if (lang != null) { - if (logger.isDebugEnabled()) { - logger.debug( - "Set locale of the request object: " + lang.toString()); - } - - Preference pref = new Preference(); - 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 handler. - */ - 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 actionDoc. - * - * @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 handler. - */ - 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 out 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 Ingo Weinzierl - */ -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 Ingo Weinzierl - */ -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 Ingo Weinzierl - */ -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 Ingo Weinzierl - */ -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 ArtifactObject representing an artifact. - * - * @author Ingo Weinzierl - * - */ -public class Artifact { - - /** - * The uuid of this Artifact which must be used to identify - * the artifact at the ArtifactDatabase. - */ - private String uuid = null; - - /** - * The hash of the artifact which was send be the ArtifactDatabase. - */ - private String hash = null; - - /** - * Constructor - * @param uuid the uuid of this Artifact which must be used to identify - * the artifact at the ArtifactDatabase - * @param hash the hash of the artifact which was send be the - * ArtifactDatabase - */ - 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 - * Artifact. - * - * @author Ingo Weinzierl - */ -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 Artifact. - */ - 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 Sascha L. Teichmann - */ -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 NamespaceContext - */ - 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 entry: - ((Map)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 Ingo Weinzierl - */ -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 Ingo Weinzierl - */ -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 Ingo Weinzierl - * @author Sascha L. Teichmann - */ -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 Sascha L. Teichmann - * - */ - 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 XPath-expression - * @return the new XPath-expression - */ - public static XPath newXPath() { - return newXPath(null); - } - - /** - * Creates a new XPath-expression - * @param namespaceContext the namespacecontext that should be used. - * @return the new XPath-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 ArtifactNamespaceContext - * @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 ArtifactNamespaceContext - * @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 InputStream - * @param inputStream the InputStream 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 OutputStream - * @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 Ingo Weinzierl + */ +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 Ingo Weinzierl + */ +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 Ingo Weinzierl + */ +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 Ingo Weinzierl + */ +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 Ingo Weinzierl + */ +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 = + new ThreadLocal() { + @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 creator. 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> accepted = + new ArrayList>(); + + Language lang = Language.valueOf(localeString); + + if (lang != null) { + if (logger.isDebugEnabled()) { + logger.debug( + "Set locale of the request object: " + lang.toString()); + } + + Preference pref = new Preference(); + 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 handler. + */ + 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 actionDoc. + * + * @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 handler. + */ + 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 out 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 Ingo Weinzierl + */ +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 Ingo Weinzierl + */ +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 Ingo Weinzierl + */ +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 Ingo Weinzierl + */ +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 ArtifactObject representing an artifact. + * + * @author Ingo Weinzierl + * + */ +public class Artifact { + + /** + * The uuid of this Artifact which must be used to identify + * the artifact at the ArtifactDatabase. + */ + private String uuid = null; + + /** + * The hash of the artifact which was send be the ArtifactDatabase. + */ + private String hash = null; + + /** + * Constructor + * @param uuid the uuid of this Artifact which must be used to identify + * the artifact at the ArtifactDatabase + * @param hash the hash of the artifact which was send be the + * ArtifactDatabase + */ + 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 + * Artifact. + * + * @author Ingo Weinzierl + */ +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 Artifact. + */ + 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 Sascha L. Teichmann + */ +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 NamespaceContext + */ + 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 entry: + ((Map)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 Ingo Weinzierl + */ +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 Ingo Weinzierl + */ +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 Ingo Weinzierl + * @author Sascha L. Teichmann + */ +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 Sascha L. Teichmann + * + */ + 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 XPath-expression + * @return the new XPath-expression + */ + public static XPath newXPath() { + return newXPath(null); + } + + /** + * Creates a new XPath-expression + * @param namespaceContext the namespacecontext that should be used. + * @return the new XPath-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 ArtifactNamespaceContext + * @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 ArtifactNamespaceContext + * @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 InputStream + * @param inputStream the InputStream 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 OutputStream + * @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 ); + } +}