/*******************************************************************************
Copyright 2013 Johannes Mitlmeier
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 de.fub.agg2graph.agg.tiling;
import de.fub.agg2graph.agg.AggConnection;
import de.fub.agg2graph.agg.AggNode;
import java.io.File;
import java.util.Set;
import java.util.logging.Logger;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* Class for writing tiles to XML data format.
*
* @author Johannes Mitlmeier
*
*/
public class XMLSerializationWriter {
private static Logger logger = Logger.getLogger("agg2graph.tilecache.xml",
null);
private File path;
private Document doc;
private Element tileElement;
public XMLSerializationWriter(File path)
throws ParserConfigurationException {
logger.info("Opened XML writer @" + path.getAbsolutePath());
this.path = path;
DocumentBuilderFactory docFactory = DocumentBuilderFactory
.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
// root elements
doc = docBuilder.newDocument();
tileElement = doc.createElement("t"); // tile...
doc.appendChild(tileElement);
}
public void writeNode(AggNode node) {
logger.info("Writing node to XML " + node);
// node's properties first
Element nodeElem = doc.createElement("n"); // node...
tileElement.appendChild(nodeElem);
nodeElem.setAttribute("id", node.getID());
nodeElem.setAttribute("lat", String.valueOf(node.getLat()));
nodeElem.setAttribute("lon", String.valueOf(node.getLon()));
// outgoing connections deep
Set<AggConnection> out = node.getOut();
Element outElem = doc.createElement("o"); // outConnections...
nodeElem.appendChild(outElem);
for (AggConnection outConn : out) {
writeConnection(outConn, outElem, true);
}
// incoming connections shallow
Set<AggConnection> in = node.getIn();
Element inElem = doc.createElement("i"); // outConnections...
nodeElem.appendChild(inElem);
for (AggConnection inConn : in) {
writeConnection(inConn, inElem, false);
}
}
public void writeConnection(AggConnection conn, Element parent, boolean deep) {
logger.info("Writing connection to XML " + conn);
Element connElem = doc.createElement("c");
parent.appendChild(connElem);
if (deep) {
// outging conn
connElem.setAttribute("to", conn.getTo().getInternalID());
if (conn.getWeight() != 1) {
connElem.setAttribute("w", String.valueOf(conn.getWeight()));
connElem.setAttribute("d", String.valueOf(conn.getAvgDist()));
}
} else {
// incoming conn
connElem.setAttribute("from", conn.getFrom().getInternalID());
}
}
public void close() throws TransformerException {
logger.info("Writing XML file.");
TransformerFactory transformerFactory = TransformerFactory
.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult result;
if (logger.getLevel() != null
&& logger.getLevel().getName().equals("FINEST")) {
result = new StreamResult(System.out);
transformer.transform(source, result);
}
result = new StreamResult(path);
transformer.transform(source, result);
}
}