Mercurial > dive4elements > gnv-client
diff gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java @ 2:5e94403971af
infrastructur for Communicationg with the ArtifactDatabase added.
gnv/trunk@71 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Tim Englich <tim.englich@intevation.de> |
---|---|
date | Fri, 11 Sep 2009 15:17:38 +0000 |
parents | |
children | fe6a64545552 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gnv/src/main/java/de/intevation/gnv/artifactdatabase/client/DefaultArtifactDatabaseClient.java Fri Sep 11 15:17:38 2009 +0000 @@ -0,0 +1,132 @@ +/** + * + */ +package de.intevation.gnv.artifactdatabase.client; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +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 org.apache.log4j.Logger; +import org.restlet.Client; +import org.restlet.data.Method; +import org.restlet.data.Protocol; +import org.restlet.data.Request; +import org.restlet.data.Response; +import org.restlet.representation.Representation; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException; +import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory; +import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; +import de.intevation.gnv.util.XMLUtils; + +/** + * @author Tim Englich <tim.englich@intevation.de> + * + */ +public class DefaultArtifactDatabaseClient implements ArtifactDatabaseClient { + /** + * the logger, used to log exceptions and additonaly information + */ + private static Logger log = Logger.getLogger(DefaultArtifactDatabaseClient.class); + + // TODO Container for ArtifactDatabases should be used. + private static Map<String, String> artifactDatabases = null; + + private static boolean initialized = false; + + /** + * Constructor + */ + public DefaultArtifactDatabaseClient() { + super(); + } + + /** + * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getArtifactFactories() + */ + public Collection<ArtifactObject> getArtifactFactories() throws ArtifactDatabaseClientException { + Collection<ArtifactObject> resultValues = null; + if (!initialized){ + this.initialize(); + } + try { + XMLUtils xmlUtils = new XMLUtils(); + log.debug("DefaultArtifactDatabaseClient.getArtifactFactories"); + Iterator<String> it = artifactDatabases.values().iterator(); + while (it.hasNext()){ + String server = it.next(); + String url = server+ "/factories"; + InputStream inputStream = this.doGetRequest(url); + Document document = xmlUtils.readDocument(inputStream); + log.debug(xmlUtils.writeDocument2String(document)); + if (resultValues == null){ + resultValues = this.getArtifactFactories(document,server); + }else{ + resultValues.addAll(this.getArtifactFactories(document,server)); + } + } + } catch (IOException e) { + log.error(e,e); + } + return resultValues; + } + + private Collection<ArtifactObject> getArtifactFactories(Document document, String server){ + XMLUtils xmlUtils = new XMLUtils(); + NodeList artifactFactories = xmlUtils.getNodeSetXPath(document, "/result/factories/factory"); + Collection<ArtifactObject> resultValues = new ArrayList<ArtifactObject>(artifactFactories.getLength()); + if (artifactFactories != null){ + for (int i = 0; i < artifactFactories.getLength(); i++){ + Node artifactFactoryNode = artifactFactories.item(i); + String name = xmlUtils.getStringXPath(artifactFactoryNode, "@name"); + String description = xmlUtils.getStringXPath(artifactFactoryNode, "@description"); + ArtifactFactory artifactFactory = new ArtifactFactory(name, description, server); + resultValues.add(artifactFactory); + } + } + return resultValues; + } + + /** + * @throws IOException + */ + private InputStream doGetRequest(String requestUrl) throws IOException { + Client client = new Client(Protocol.HTTP); + Request request = new Request(Method.GET, requestUrl); + Response response = client.handle(request); + Representation output = response.getEntity(); + return output.getStream(); + } + + private synchronized void initialize(){ + if (!initialized){ + this.artifactDatabases = new HashMap<String, String>(); + this.artifactDatabases.put("test", "http://localhost:8181"); // TODO Read from Config + initialized = true; + } + + } + + +}