tim@2: /** tim@2: * tim@2: */ tim@2: package de.intevation.gnv.artifactdatabase.client; tim@2: tim@2: import java.io.IOException; tim@2: import java.io.InputStream; tim@13: import java.io.OutputStream; tim@2: import java.util.ArrayList; tim@2: import java.util.Collection; tim@30: import java.util.HashMap; tim@2: import java.util.Iterator; tim@30: import java.util.Map; tim@2: tim@2: import org.apache.log4j.Logger; tim@2: import org.restlet.Client; tim@2: import org.restlet.data.Method; tim@2: import org.restlet.data.Protocol; tim@2: import org.restlet.data.Request; tim@2: import org.restlet.data.Response; tim@2: import org.restlet.representation.Representation; tim@7: import org.restlet.representation.StringRepresentation; tim@2: import org.w3c.dom.Document; tim@7: import org.w3c.dom.Element; tim@2: import org.w3c.dom.Node; tim@2: import org.w3c.dom.NodeList; tim@2: tim@2: import de.intevation.gnv.artifactdatabase.client.exception.ArtifactDatabaseClientException; tim@7: import de.intevation.gnv.artifactdatabase.objects.Artifact; tim@9: import de.intevation.gnv.artifactdatabase.objects.ArtifactDescription; tim@2: import de.intevation.gnv.artifactdatabase.objects.ArtifactFactory; tim@2: import de.intevation.gnv.artifactdatabase.objects.ArtifactObject; tim@32: import de.intevation.gnv.artifactdatabase.objects.ArtifactStatisticValue; tim@32: import de.intevation.gnv.artifactdatabase.objects.DefaultArtifactStatisticValue; tim@30: import de.intevation.gnv.artifactdatabase.objects.DefaultOutputMode; tim@30: import de.intevation.gnv.artifactdatabase.objects.DefaultOutputParameter; tim@12: import de.intevation.gnv.artifactdatabase.objects.InputParameter; tim@30: import de.intevation.gnv.artifactdatabase.objects.OutputMode; tim@30: import de.intevation.gnv.artifactdatabase.objects.OutputParameter; tim@23: import de.intevation.gnv.propertiesreader.PropertiesReader; tim@23: import de.intevation.gnv.propertiesreader.PropertiesReaderFactory; tim@2: import de.intevation.gnv.util.XMLUtils; tim@2: tim@2: /** tim@2: * @author Tim Englich tim@2: * tim@2: */ tim@2: public class DefaultArtifactDatabaseClient implements ArtifactDatabaseClient { tim@2: /** tim@7: * The URI of the namespace of the artifacts. tim@7: */ tim@7: public final static String NAMESPACE_URI = "http://www.intevation.de/2009/artifacts"; tim@7: tim@7: /** tim@7: * The XML prefix for the artifacts namespace. tim@7: */ tim@7: public final static String NAMESPACE_PREFIX = "art"; tim@7: tim@7: /** tim@2: * the logger, used to log exceptions and additonaly information tim@2: */ tim@2: private static Logger log = Logger.getLogger(DefaultArtifactDatabaseClient.class); tim@2: tim@25: /** tim@25: * The Databases which could be used tim@25: */ tim@25: private static Collection artifactDatabases = null; tim@2: tim@25: /** tim@25: * Is the Class initialized? tim@25: */ tim@2: private static boolean initialized = false; tim@2: tim@2: /** tim@2: * Constructor tim@2: */ tim@2: public DefaultArtifactDatabaseClient() { tim@2: super(); tim@2: } tim@2: tim@2: /** tim@2: * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getArtifactFactories() tim@2: */ tim@2: public Collection getArtifactFactories() throws ArtifactDatabaseClientException { tim@2: Collection resultValues = null; tim@2: if (!initialized){ tim@2: this.initialize(); tim@2: } tim@2: try { tim@2: log.debug("DefaultArtifactDatabaseClient.getArtifactFactories"); tim@25: Iterator it = artifactDatabases.iterator(); tim@2: while (it.hasNext()){ tim@2: String server = it.next(); tim@2: String url = server+ "/factories"; tim@9: Document document = this.doGetRequest(url); tim@2: if (resultValues == null){ tim@2: resultValues = this.getArtifactFactories(document,server); tim@2: }else{ tim@2: resultValues.addAll(this.getArtifactFactories(document,server)); tim@2: } tim@2: } tim@2: } catch (IOException e) { tim@2: log.error(e,e); tim@2: } tim@2: return resultValues; tim@2: } tim@2: tim@2: private Collection getArtifactFactories(Document document, String server){ tim@2: XMLUtils xmlUtils = new XMLUtils(); tim@2: NodeList artifactFactories = xmlUtils.getNodeSetXPath(document, "/result/factories/factory"); tim@2: Collection resultValues = new ArrayList(artifactFactories.getLength()); tim@2: if (artifactFactories != null){ tim@2: for (int i = 0; i < artifactFactories.getLength(); i++){ tim@2: Node artifactFactoryNode = artifactFactories.item(i); tim@2: String name = xmlUtils.getStringXPath(artifactFactoryNode, "@name"); tim@2: String description = xmlUtils.getStringXPath(artifactFactoryNode, "@description"); tim@2: ArtifactFactory artifactFactory = new ArtifactFactory(name, description, server); tim@2: resultValues.add(artifactFactory); tim@2: } tim@2: } tim@2: return resultValues; tim@2: } tim@2: tim@2: /** tim@2: * @throws IOException tim@2: */ tim@25: private Document doGetRequest(String requestUrl) throws IOException, ArtifactDatabaseClientException { tim@13: return this.doGetRequest(requestUrl, null); tim@13: } tim@2: tim@7: /** tim@7: * @throws IOException tim@7: */ tim@25: private Document doGetRequest(String requestUrl, Document requestBody) throws IOException, ArtifactDatabaseClientException { tim@25: XMLUtils xmlUtils = new XMLUtils(); tim@13: Representation output = doGetRequestInternal(requestUrl, requestBody); tim@25: Document document = xmlUtils.readDocument(output.getStream()); tim@25: this.check4ExceptionReport(document); tim@25: return document; tim@13: } tim@13: tim@13: /** tim@13: * @param requestUrl tim@13: * @param requestBody tim@13: * @return tim@13: */ tim@13: private Representation doGetRequestInternal(String requestUrl, tim@13: Document requestBody) { tim@13: Client client = new Client(Protocol.HTTP); tim@13: Request request = new Request(Method.GET, requestUrl); tim@13: if (requestBody != null){ tim@13: String documentBody = new XMLUtils().writeDocument2String(requestBody); tim@13: Representation representation = new StringRepresentation(documentBody); tim@13: request.setEntity(representation); tim@13: } tim@13: Response response = client.handle(request); tim@25: // TODO RESPONSESTATUS AUSWERTEN. tim@13: Representation output = response.getEntity(); tim@13: return output; tim@13: } tim@13: tim@13: /** tim@13: * @throws IOException tim@13: */ tim@7: private InputStream doPostRequest(String requestUrl, Document requestBody) throws IOException { tim@34: log.debug("##################################################"); tim@34: log.debug(new XMLUtils().writeDocument2String(requestBody)); tim@34: log.debug("##################################################"); tim@7: Client client = new Client(Protocol.HTTP); tim@7: Request request = new Request(Method.POST, requestUrl); tim@7: String documentBody = new XMLUtils().writeDocument2String(requestBody); tim@7: Representation representation = new StringRepresentation(documentBody); tim@7: request.setEntity(representation); tim@7: Response response = client.handle(request); tim@25: // TODO RESPONSESTATUS AUSWERTEN. tim@7: Representation output = response.getEntity(); tim@7: return output.getStream(); tim@7: } tim@7: tim@2: private synchronized void initialize(){ tim@2: if (!initialized){ tim@23: PropertiesReader pr = PropertiesReaderFactory.getInstance().getPropertiesReader(); tim@23: int count = Integer.parseInt(pr.getPropertieValue(ARTIFACTDATABASE_COUNT_ID, "0")); tim@25: artifactDatabases = new ArrayList(count); tim@23: for (int i = 0; i < count ; i++){ tim@25: artifactDatabases.add(pr.getPropertieValue(ARTIFACTDATABASE_URL_ID+"."+(i+1), "N/N")); tim@23: } tim@2: initialized = true; tim@2: } tim@2: tim@2: } tim@7: tim@7: /** tim@7: * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#createNewArtifact(de.intevation.gnv.artifactdatabase.objects.ArtifactObject) tim@7: */ tim@7: public ArtifactObject createNewArtifact(ArtifactObject artifactFactory) tim@7: throws ArtifactDatabaseClientException { tim@7: tim@7: try { tim@7: Document request = this.createCreateRequestBody(artifactFactory.getId()); tim@9: Document result = doPostRequest(artifactFactory, request, "create"); tim@7: return this.getArtifact(result); tim@7: } catch (IOException e) { tim@7: log.error(e,e); tim@7: throw new ArtifactDatabaseClientException(e); tim@7: } tim@7: } tim@2: tim@7: tim@7: private ArtifactObject getArtifact(Document document){ tim@7: XMLUtils xmlUtils = new XMLUtils(); tim@7: String uuid = xmlUtils.getStringXPath(document, "/result/uuid/@value"); tim@7: String hash = xmlUtils.getStringXPath(document, "/result/hash/@value"); tim@7: log.info("NEW Artifact: "+uuid+" / "+hash); tim@7: return new Artifact(uuid, hash); tim@7: } tim@7: tim@7: tim@7: tim@7: tim@7: private Document createCreateRequestBody(String artifactFactoryName){ tim@7: Document document = new XMLUtils().newDocument(); tim@7: Node rootNode = this.createRootNode(document); tim@7: Element typeNode = this.createArtifactElement(document, "type"); tim@7: typeNode.setAttribute("name", "create"); tim@7: rootNode.appendChild(typeNode); tim@7: tim@7: Element factoyNode = this.createArtifactElement(document, "factory"); tim@7: factoyNode.setAttribute("name", artifactFactoryName); tim@7: rootNode.appendChild(factoyNode); tim@7: tim@7: return document; tim@7: } tim@7: tim@7: private Element createRootNode(Document document){ tim@7: Element rootNode = this.createArtifactElement(document,"action"); tim@7: document.appendChild(rootNode); tim@7: return rootNode; tim@7: } tim@7: tim@7: /** tim@7: * @param document tim@7: * @return tim@7: */ tim@7: private Element createArtifactElement(Document document, String name) { tim@7: Element node = document.createElementNS(NAMESPACE_URI, name); tim@7: node.setPrefix(NAMESPACE_PREFIX); tim@7: return node; tim@7: } tim@9: tim@25: /** tim@25: * @param artifactFactory tim@25: * @param xmlUtils tim@25: * @param request tim@25: * @throws IOException tim@25: */ tim@25: private Document doPostRequest(ArtifactObject artifactFactory, tim@25: Document request, String suburl) throws IOException, ArtifactDatabaseClientException { tim@25: XMLUtils xmlUtils = new XMLUtils(); tim@25: String url = ((ArtifactFactory)artifactFactory).getDataBaseUrl(); tim@25: InputStream is = this.doPostRequest(url+"/"+suburl, request); tim@25: Document result = xmlUtils.readDocument(is); tim@25: this.check4ExceptionReport(result); tim@25: return result; tim@25: } tim@9: tim@9: tim@9: /** tim@9: * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#getCurrentStepDescription(de.intevation.gnv.artifactdatabase.objects.ArtifactFactory, de.intevation.gnv.artifactdatabase.objects.ArtifactObject) tim@9: */ tim@9: public ArtifactDescription getCurrentStepDescription(ArtifactObject artifactFactory, tim@9: ArtifactObject currentArtifact) tim@9: throws ArtifactDatabaseClientException { tim@9: try { tim@12: String url = this.getArtifactUrl(artifactFactory, currentArtifact); tim@9: Document result = this.doGetRequest(url); tim@9: return this.readDescription(result,currentArtifact); tim@9: } catch (IOException e) { tim@9: log.error(e,e); tim@9: throw new ArtifactDatabaseClientException(e); tim@9: } tim@9: } tim@12: tim@12: /** tim@12: * @param artifactFactory tim@12: * @param currentArtifact tim@12: * @return tim@12: */ tim@12: private String getArtifactUrl(ArtifactObject artifactFactory, tim@12: ArtifactObject currentArtifact) { tim@12: String url = ((ArtifactFactory)artifactFactory).getDataBaseUrl()+"/artifact/"+ currentArtifact.getId(); tim@12: return url; tim@12: } tim@9: tim@9: private ArtifactDescription readDescription(Document document, ArtifactObject artifact) throws ArtifactDatabaseClientException{ tim@25: // Check if there was an Error or Exception reported from the ArtifactDatabase tim@25: this.check4ExceptionReport(document); tim@9: XMLUtils xmlUtils = new XMLUtils(); tim@9: if (artifact instanceof ArtifactDescription){ tim@9: ArtifactDescription ad = (ArtifactDescription)artifact; tim@9: Node uiNode = xmlUtils.getNodeXPath(document, "/result/ui"); tim@9: Node outputNode = xmlUtils.getNodeXPath(document, "/result/outputs"); tim@30: tim@30: Map outputModes = null; tim@30: if (outputNode != null){ tim@30: NodeList outputModesNodes = xmlUtils.getNodeSetXPath(outputNode, "output"); tim@30: if (outputModesNodes != null){ tim@30: outputModes = new HashMap(outputModesNodes.getLength()); tim@30: for (int i = 0; i < outputModesNodes.getLength(); i++){ tim@30: Node outputModeNode = outputModesNodes.item(i); tim@30: String name = xmlUtils.getStringXPath(outputModeNode, "@name"); tim@30: String mimeType = xmlUtils.getStringXPath(outputModeNode, "@mime-type"); tim@30: tim@30: NodeList parameterNodes = xmlUtils.getNodeSetXPath(outputModeNode, "parameter/parameter"); tim@30: Collection parameter = null; tim@30: if (parameterNodes != null){ tim@30: parameter = new ArrayList(parameterNodes.getLength()); tim@30: for (int j = 0; j < parameterNodes.getLength(); j++){ tim@30: Node outputParameterNode = parameterNodes.item(j); tim@30: parameter.add(new DefaultOutputParameter(xmlUtils.getStringXPath(outputParameterNode,"@name"),xmlUtils.getStringXPath(outputParameterNode,"@value"),xmlUtils.getStringXPath(outputParameterNode,"@name"),xmlUtils.getStringXPath(outputParameterNode,"@type"))); tim@30: } tim@30: } tim@30: outputModes.put(name,new DefaultOutputMode(name, mimeType, parameter)); tim@30: } tim@30: tim@30: } tim@30: } tim@30: tim@9: String currentState = xmlUtils.getStringXPath(document, "/result/state/@name"); tim@9: NodeList statesList = xmlUtils.getNodeSetXPath(document, "/result/reachable-states/state/@name"); tim@9: Collection reachableStates = new ArrayList(statesList.getLength()); tim@9: for (int i = 0; i < statesList.getLength(); i++){ tim@9: reachableStates.add(statesList.item(i).getNodeValue()); tim@9: } tim@9: tim@12: NodeList inputNodes = xmlUtils.getNodeSetXPath(document, "/result/model/input"); tim@12: if (inputNodes != null){ tim@12: Collection inputParameter = new ArrayList(inputNodes.getLength()); tim@12: for (int i = 0; i < inputNodes.getLength(); i++){ tim@12: Node inputNode = inputNodes.item(i); tim@12: String name = xmlUtils.getStringXPath(inputNode, "@name"); tim@12: inputParameter.add(name); tim@12: } tim@12: ad.setInputParameter(inputParameter); tim@12: } tim@12: tim@30: ad.setOutputModes(outputModes); tim@9: ad.setCurrentOut(outputNode); tim@9: ad.setCurrentUI(uiNode); tim@9: ad.setCurrentState(currentState); tim@9: ad.setReachableStates(reachableStates); tim@9: return ad; tim@9: }else{ tim@9: log.error("Artifact must be Instance of ArtifactDescription"); tim@9: throw new ArtifactDatabaseClientException("Artifact must be Instance of ArtifactDescription"); tim@9: } tim@9: tim@9: tim@9: } tim@12: tim@12: /** tim@12: * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doNextStep(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, de.intevation.gnv.artifactdatabase.objects.ArtifactObject, java.lang.String, java.util.Collection) tim@12: */ tim@12: public ArtifactDescription doNextStep(ArtifactObject artifactFactory, tim@12: ArtifactObject currentArtifact, String target, tim@12: Collection inputParameter) tim@12: throws ArtifactDatabaseClientException { tim@12: tim@12: try { tim@12: // 1 Feed tim@13: this.doFeed(artifactFactory, currentArtifact, inputParameter); tim@13: // 2 Advance tim@12: String url = this.getArtifactUrl(artifactFactory, currentArtifact); tim@12: Document advanceDocument = this.createAdvanceRequestBody(currentArtifact, target); tim@12: InputStream advanceResult = this.doPostRequest(url, advanceDocument); tim@25: this.check4ExceptionReport(new XMLUtils().readDocument(advanceResult)); tim@25: // 3 Describe tim@12: return this.getCurrentStepDescription(artifactFactory, currentArtifact); tim@12: } catch (IOException e) { tim@12: log.error(e,e); tim@12: throw new ArtifactDatabaseClientException(e); tim@12: } tim@12: } tim@9: tim@12: private Document createFeedRequestBody(ArtifactObject currentArtifact, tim@12: Collection inputParameter){ tim@12: Document document = new XMLUtils().newDocument(); tim@12: Node rootNode = this.createRootNode(document); tim@12: tim@12: Element typeNode = this.createArtifactElement(document, "type"); tim@12: typeNode.setAttribute("name", "feed"); tim@12: rootNode.appendChild(typeNode); tim@12: tim@12: Element uuidNode = this.createArtifactElement(document, "uuid"); tim@12: uuidNode.setAttribute("value", currentArtifact.getId()); tim@12: rootNode.appendChild(uuidNode); tim@12: tim@12: Element hashNode = this.createArtifactElement(document, "hash"); tim@12: hashNode.setAttribute("value", currentArtifact.getHash()); tim@12: rootNode.appendChild(hashNode); tim@12: tim@13: Node dataNode = this.createParameterNodes(inputParameter, document, "data"); tim@12: rootNode.appendChild(dataNode); tim@13: tim@13: return document; tim@13: } tim@13: tim@13: /** tim@13: * @param inputParameter tim@13: * @param document tim@13: * @param rootNode tim@13: */ tim@13: private Node createParameterNodes(Collection inputParameter, Document document, String nodeName) { tim@13: Element dataNode = this.createArtifactElement(document, nodeName); tim@13: tim@12: if (inputParameter != null){ tim@12: Iterator it = inputParameter.iterator(); tim@12: while(it.hasNext()){ tim@12: InputParameter ip = it.next(); tim@12: String name = ip.getName(); tim@12: String[] values = ip.getValues(); tim@12: if (values != null){ tim@12: for (int i = 0; i < values.length; i++){ tim@12: String value = values[i]; tim@12: Element inputNode = this.createArtifactElement(document, "input"); tim@12: inputNode.setAttribute("name", name); tim@12: inputNode.setAttribute("value", value); tim@12: dataNode.appendChild(inputNode); tim@12: } tim@12: } tim@12: } tim@12: } tim@13: return dataNode; tim@12: } tim@12: tim@12: private Document createAdvanceRequestBody(ArtifactObject currentArtifact, String target){ tim@12: Document document = new XMLUtils().newDocument(); tim@12: Node rootNode = this.createRootNode(document); tim@12: tim@12: Element typeNode = this.createArtifactElement(document, "type"); tim@12: typeNode.setAttribute("name", "advance"); tim@12: rootNode.appendChild(typeNode); tim@12: tim@12: Element uuidNode = this.createArtifactElement(document, "uuid"); tim@12: uuidNode.setAttribute("value", currentArtifact.getId()); tim@12: rootNode.appendChild(uuidNode); tim@12: tim@12: Element hashNode = this.createArtifactElement(document, "hash"); tim@12: hashNode.setAttribute("value", currentArtifact.getHash()); tim@12: rootNode.appendChild(hashNode); tim@12: Element targetNode = this.createArtifactElement(document, "target"); tim@12: targetNode.setAttribute("name", target); tim@12: rootNode.appendChild(targetNode); tim@12: return document; tim@12: } tim@13: tim@13: /** tim@13: * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doOutput(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, de.intevation.gnv.artifactdatabase.objects.ArtifactObject, java.io.OutputStream, java.lang.String, java.lang.String, java.util.Collection) tim@13: */ tim@13: public void doOutput(ArtifactObject artifactFactory, tim@13: ArtifactObject currentArtifact, OutputStream stream, tim@13: String targetName, String mimeType, tim@13: Collection inputParameter) tim@13: throws ArtifactDatabaseClientException { tim@13: try { tim@13: XMLUtils xmlUtils = new XMLUtils(); tim@13: Document requestBody = this.createOutRequestBody(currentArtifact, targetName, mimeType, inputParameter); tim@13: tim@13: String requestUrl = this.getArtifactUrl(artifactFactory, currentArtifact)+"/"+targetName; tim@13: InputStream is = this.doPostRequest( requestUrl, requestBody); tim@13: tim@13: byte[] b = new byte[4096]; tim@13: int i = -1 ; tim@13: while ((i = is.read(b)) > 0) tim@13: { tim@13: stream.write(b, 0, i); tim@13: } tim@13: } catch (IOException e) { tim@13: log.error(e,e); tim@13: throw new ArtifactDatabaseClientException(e); tim@13: } tim@13: } tim@13: tim@13: private Document createOutRequestBody(ArtifactObject currentArtifact, String target, String mimeType, Collection inputParameter){ tim@13: Document document = new XMLUtils().newDocument(); tim@13: Node rootNode = this.createRootNode(document); tim@13: tim@13: Element typeNode = this.createArtifactElement(document, "type"); tim@13: typeNode.setAttribute("name", "out"); tim@13: rootNode.appendChild(typeNode); tim@13: tim@13: Element uuidNode = this.createArtifactElement(document, "uuid"); tim@13: uuidNode.setAttribute("value", currentArtifact.getId()); tim@13: rootNode.appendChild(uuidNode); tim@13: tim@13: Element hashNode = this.createArtifactElement(document, "hash"); tim@13: hashNode.setAttribute("value", currentArtifact.getHash()); tim@13: rootNode.appendChild(hashNode); tim@13: tim@13: Element outNode = this.createArtifactElement(document, "out"); tim@13: outNode.setAttribute("name", target); tim@13: rootNode.appendChild(outNode); tim@13: tim@13: Element mimeTypeNode = this.createArtifactElement(document, "out"); tim@13: mimeTypeNode.setAttribute("value", mimeType); tim@13: outNode.appendChild(mimeTypeNode); tim@13: tim@13: Node parameterNode = this.createParameterNodes(inputParameter, document, "params"); tim@13: outNode.appendChild(parameterNode); tim@13: tim@13: return document; tim@2: } tim@13: tim@13: /** tim@13: * @see de.intevation.gnv.artifactdatabase.client.ArtifactDatabaseClient#doFeed(de.intevation.gnv.artifactdatabase.objects.ArtifactObject, de.intevation.gnv.artifactdatabase.objects.ArtifactObject, java.util.Collection) tim@13: */ tim@13: public void doFeed(ArtifactObject artifactFactory, tim@13: ArtifactObject currentArtifact, tim@13: Collection inputParameter) tim@13: throws ArtifactDatabaseClientException { tim@13: tim@13: try { tim@13: Document feedDocument = this.createFeedRequestBody(currentArtifact, inputParameter); tim@13: String url = this.getArtifactUrl(artifactFactory, currentArtifact); tim@13: InputStream feedResult = this.doPostRequest(url, feedDocument); tim@25: Document feedResultDocument = new XMLUtils().readDocument(feedResult); tim@25: this.check4ExceptionReport(feedResultDocument); tim@13: } catch (IOException e) { tim@13: log.error(e,e); tim@25: throw new ArtifactDatabaseClientException(e); tim@13: } tim@13: } tim@25: tim@25: private void check4ExceptionReport(Document document) throws ArtifactDatabaseClientException{ tim@25: tim@25: String message = new XMLUtils().getStringXPath(document,"/exceptionreport/exception"); tim@25: if (message != null){ tim@25: throw new ArtifactDatabaseClientException(message); tim@25: } tim@25: tim@25: } tim@32: tim@32: public Collection calculateStatistics( tim@32: ArtifactObject artifactFactory, ArtifactObject currentArtifact) throws ArtifactDatabaseClientException{ tim@32: log.debug("DefaultArtifactDatabaseClient.calculateStatistics") ; tim@32: Collection result; tim@32: try { tim@32: result = null; tim@32: String targetName = "statistics"; tim@32: String requestUrl = this.getArtifactUrl(artifactFactory, currentArtifact)+"/"+targetName; tim@32: Document requestBody = this.createOutRequestBody(currentArtifact, targetName, "text/xml", null); tim@32: XMLUtils xmlUtils = new XMLUtils(); tim@32: InputStream is = this.doPostRequest(requestUrl, requestBody); tim@32: Document resultDocument = xmlUtils.readDocument(is); tim@32: if (resultDocument != null){ tim@32: NodeList resultNodes = xmlUtils.getNodeSetXPath(resultDocument, "/statistic-values/statistic"); tim@32: if (resultNodes != null){ tim@32: result = new ArrayList(resultNodes.getLength()); tim@32: for (int i = 0; i < resultNodes.getLength(); i++){ tim@32: Node statisticNode = resultNodes.item(i); tim@32: String name = xmlUtils.getStringXPath(statisticNode, "@name"); tim@32: String value = xmlUtils.getStringXPath(statisticNode, "@value"); tim@32: result.add(new DefaultArtifactStatisticValue(name, value)); tim@32: } tim@32: } tim@32: } tim@32: } catch (IOException e) { tim@32: log.error(e,e); tim@32: throw new ArtifactDatabaseClientException(e); tim@32: } tim@32: tim@32: return result; tim@32: } tim@13: }