// Copyright 2010 Google Inc. All Rights Reseved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package com.google.testing.testify.risk.frontend.server.util; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import com.google.testing.testify.risk.frontend.model.DataRequest; import com.google.testing.testify.risk.frontend.model.DataRequestOption; import org.w3c.dom.Document; import org.w3c.dom.Element; import java.io.StringWriter; import java.util.Collection; import java.util.List; 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.dom.DOMSource; import javax.xml.transform.stream.StreamResult; /** * Generates an XML document for external data collectors. * * @author chrsmith@google.com (Chris Smith) */ public class DataRequestDocumentGenerator { private DataRequestDocumentGenerator() {} // COV_NF_LINE /** * Returns an XML document describing the data requests. */ public static String generateDocument(List<DataRequest> allDataRequests) { try { DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); Document document = docBuilder.newDocument(); Element documentRoot = document.createElement("TestAnalytics"); document.appendChild(documentRoot); // Group all requests by their parent project. Multimap<Long, DataRequest> requestsByProject = getRequestsByProject(allDataRequests); for (Long projectId : requestsByProject.keySet()) { Element projectElement = document.createElement("DataRequests"); projectElement.setAttribute("ProjectID", Long.toString(projectId)); documentRoot.appendChild(projectElement); // Group project requests by data source. Collection<DataRequest> projectRequests = requestsByProject.get(projectId); Multimap<String, DataRequest> requestsBySource = getRequestsByDataSource(projectRequests); for (String sourceName : requestsBySource.keySet()) { Element dataSourceElement = document.createElement("DataRequest"); dataSourceElement.setAttribute("Type", sourceName); projectElement.appendChild(dataSourceElement); // Write out the configuration parameter strings for the data source. for (DataRequest request : requestsBySource.get(sourceName)) { for (DataRequestOption option : request.getDataRequestOptions()) { Element dataSourceParameter = document.createElement("Parameter"); dataSourceParameter.setAttribute("Name", option.getName()); dataSourceParameter.appendChild(document.createTextNode(option.getValue())); dataSourceElement.appendChild(dataSourceParameter); } } } } // Now dump the document in memory to a string. Transformer transformer = TransformerFactory.newInstance().newTransformer(); DOMSource source = new DOMSource(document); StreamResult result = new javax.xml.transform.stream.StreamResult(new StringWriter()); transformer.transform(source, result); return result.getWriter().toString(); // COV_NF_START } catch (TransformerConfigurationException tce) { return "Error in transformer configuration."; } catch (TransformerException te) { return "Error transforming document."; } catch (ParserConfigurationException pce) { return "Error in parser configuration."; } // COV_NF_END } private static Multimap<Long, DataRequest> getRequestsByProject( Collection<DataRequest> requests) { Multimap<Long, DataRequest> requestsByProject = HashMultimap.create(); for (DataRequest request : requests) { requestsByProject.put(request.getParentProjectId(), request); } return requestsByProject; } private static Multimap<String, DataRequest> getRequestsByDataSource( Collection<DataRequest> requests) { Multimap<String, DataRequest> requestsBySource = HashMultimap.create(); for (DataRequest request : requests) { requestsBySource.put(request.getDataSourceName(), request); } return requestsBySource; } }