ingo@647: package de.intevation.gnv.utils;
ingo@647:
ingo@647: import java.io.File;
ingo@647: import java.io.FileNotFoundException;
ingo@647: import java.io.FileOutputStream;
ingo@647: import java.io.IOException;
ingo@647: import java.io.OutputStream;
tim@1070: import java.text.DecimalFormat;
ingo@772: import java.util.Date;
ingo@647:
ingo@1057: import javax.xml.xpath.XPathConstants;
ingo@1057:
ingo@647: import org.apache.log4j.Logger;
ingo@647: import org.w3c.dom.Document;
ingo@647: import org.w3c.dom.Element;
tim@859: import org.w3c.dom.Node;
ingo@647:
tim@1070: import com.vividsolutions.jts.geom.Envelope;
tim@1070:
tim@853: import de.intevation.artifactdatabase.XMLUtils;
tim@853: import de.intevation.artifacts.ArtifactNamespaceContext;
tim@853: import de.intevation.artifacts.CallContext;
tim@853: import de.intevation.gnv.artifacts.context.GNVArtifactContext;
tim@853: import de.intevation.gnv.wms.LayerInfo;
tim@853:
ingo@647: /**
ingo@806: * This class provides some methods to create files storing meta information
ingo@806: * about wms layers and a map service which serves these layers.
sascha@807: *
sascha@780: * @author Ingo Weinzierl
ingo@647: */
ingo@647: public class MetaWriter {
ingo@647:
ingo@647: private static Logger logger = Logger.getLogger(MetaWriter.class);
ingo@647:
ingo@647: public static final String NODE_MAPSERVER = "mapserver";
ingo@647: public static final String NODE_SERVER = "server";
ingo@647: public static final String NODE_MAP = "map";
ingo@772: public static final String NODE_TTL = "ttl";
ingo@647:
ingo@647: public static final String META_FILE_NAME = "meta.xml";
tim@853:
ingo@1057: public static final String XPATH_META = "/art:meta";
tim@1070: public static final String XPATH_MAPSERVER = "art:meta/art:"+NODE_MAPSERVER;
ingo@730:
ingo@806: /**
ingo@806: * Constructor.
ingo@806: */
ingo@647: private MetaWriter() {
ingo@647: }
sascha@778:
ingo@806:
ingo@806: /**
ingo@1057: * Just create a new document and insert the root node.
ingo@806: *
ingo@1057: * @return the meta document with necessary root node.
ingo@806: */
ingo@1057: public static Document initMeta() {
ingo@647: Document meta = XMLUtils.newDocument();
ingo@647: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
ingo@647: meta,
ingo@647: ArtifactNamespaceContext.NAMESPACE_URI,
ingo@647: ArtifactNamespaceContext.NAMESPACE_PREFIX);
ingo@647:
ingo@647: Element root = creator.create("meta");
ingo@647: meta.appendChild(root);
ingo@647:
ingo@1057: return meta;
ingo@1057: }
tim@655:
ingo@1057: public static boolean insertLayer(
ingo@1057: CallContext context,
ingo@1057: Document document,
ingo@1057: String name,
ingo@1057: String title,
ingo@1057: String data,
ingo@1057: String model,
ingo@1057: String type,
ingo@1057: String status
ingo@1057: ) {
ingo@1057: if (document == null) {
ingo@1057: document = initMeta();
tim@655: }
ingo@1057:
ingo@1057: Node meta = (Node) XMLUtils.xpath(
ingo@1057: document,
ingo@1057: XPATH_META,
ingo@1057: XPathConstants.NODE,
ingo@1057: ArtifactNamespaceContext.INSTANCE);
ingo@1057:
ingo@1057: if (meta == null) {
ingo@1057: logger.error("No meta node was found in the given document. "
ingo@1057: + "Cannot insert layer!");
ingo@1057: return false;
ingo@1057: }
ingo@1057:
ingo@1057: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
ingo@1057: document,
ingo@1057: ArtifactNamespaceContext.NAMESPACE_URI,
ingo@1057: ArtifactNamespaceContext.NAMESPACE_PREFIX);
ingo@1057:
ingo@1057: Element layerEl = creator.create(LayerInfo.LAYER);
ingo@1057: Element nameEl = creator.create(LayerInfo.LAYER_NAME);
ingo@1057: Element titleEl = creator.create(LayerInfo.LAYER_TITLE);
ingo@1057: Element dataEl = creator.create(LayerInfo.LAYER_DATA);
ingo@1057: Element modelEl = creator.create(LayerInfo.LAYER_MODEL);
ingo@1057: Element typeEl = creator.create(LayerInfo.LAYER_TYPE);
ingo@1057: Element statusEl = creator.create(LayerInfo.LAYER_STATUS);
ingo@1057:
ingo@1057: modelEl.setTextContent(model);
ingo@1057: nameEl.setTextContent(name);
ingo@1057: titleEl.setTextContent(title);
ingo@1057: typeEl.setTextContent(type);
ingo@1057: statusEl.setTextContent(status);
ingo@1057: dataEl.setTextContent(data);
ingo@1057:
ingo@1057: layerEl.appendChild(modelEl);
ingo@1057: layerEl.appendChild(nameEl);
ingo@1057: layerEl.appendChild(titleEl);
ingo@1057: layerEl.appendChild(dataEl);
ingo@1057: layerEl.appendChild(typeEl);
ingo@1057: layerEl.appendChild(statusEl);
ingo@1057:
ingo@1057: if (logger.isDebugEnabled()) {
ingo@1057: logger.debug("--------------- WMS LAYER PARAMS ---------------");
ingo@1057: logger.debug("Name : " + name);
ingo@1057: logger.debug("Title : " + title);
ingo@1057: logger.debug("Data : " + data);
ingo@1057: logger.debug("Type : " + type);
ingo@1057: logger.debug("Model : " + model);
ingo@1057: logger.debug("Status: " + status);
ingo@1057: }
ingo@1057:
ingo@1057: meta.appendChild(layerEl);
ingo@1057:
ingo@1057: return true;
tim@655: }
tim@655:
tim@1070: /**
tim@1070: * Method to write the meta document down to a file.
tim@1070: *
tim@1070: * @param path The destination of the file.
tim@1070: * @param meta The xml document storing the meta information.
tim@1070: */
tim@1070: public static boolean insertMbr(Envelope mbr, String srs, Document meta) {
tim@1070: Node mapserverNode = (Node) XMLUtils.xpath(
tim@1070: meta,
tim@1070: XPATH_MAPSERVER,
tim@1070: XPathConstants.NODE,
tim@1070: ArtifactNamespaceContext.INSTANCE);
tim@1070: if (mapserverNode != null){
tim@1070: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
tim@1070: meta,
tim@1070: ArtifactNamespaceContext.NAMESPACE_URI,
tim@1070: ArtifactNamespaceContext.NAMESPACE_PREFIX);
tim@1070: Element bboxNode = creator.create("Box");
tim@1070: bboxNode.setAttribute("srsName", srs);
tim@1070: Element coordinateNode = creator.create("coordinates");
ingo@1057:
tim@1070: DecimalFormat formatter = new DecimalFormat("###.############");
tim@1070: coordinateNode.setTextContent(formatter.format(mbr.getMinX()).replace(',', '.') +","+
tim@1070: formatter.format(mbr.getMinY()).replace(',', '.')+" "+
tim@1070: formatter.format(mbr.getMaxX()).replace(',', '.') +","+
tim@1070: formatter.format(mbr.getMaxY()).replace(',', '.'));
tim@1070: mapserverNode.appendChild(bboxNode);
tim@1070: bboxNode.appendChild(coordinateNode);
tim@1070: }
tim@1070: return true;
tim@1070: }
tim@655: /**
ingo@806: * Method to write the meta document down to a file.
ingo@806: *
ingo@806: * @param path The destination of the file.
ingo@806: * @param meta The xml document storing the meta information.
tim@655: */
tim@859: public static boolean writeMetaFile(String path, Document meta) {
ingo@647: try {
ingo@647: File metaFile = new File(path, META_FILE_NAME);
ingo@647:
ingo@730: if (metaFile.exists()) {
ingo@730: logger.info("Delete old meta information file.");
ingo@730: metaFile.delete();
ingo@730: }
ingo@730:
ingo@647: if (!metaFile.createNewFile() || !metaFile.canWrite()) {
ingo@647: logger.error("Error while writing meta file: "+metaFile.toString());
tim@655: return false;
ingo@647: }
ingo@647:
ingo@647: OutputStream out = null;
ingo@647: boolean success = false;
ingo@647: try {
ingo@647: out = new FileOutputStream(metaFile);
ingo@647: success = XMLUtils.toStream(meta, out);
ingo@647: }
ingo@647: finally {
ingo@647: if (out != null) {
ingo@647: try { out.close(); }
ingo@647: catch (IOException ioe) {}
ingo@647: }
ingo@647: }
ingo@647:
ingo@647: if (!success && metaFile.exists()) {
ingo@647: metaFile.delete();
ingo@647: }
ingo@647:
tim@655: return success;
ingo@647: }
ingo@647: catch (FileNotFoundException fnfe) {
ingo@647: logger.error(fnfe);
tim@655: return false;
ingo@647: }
ingo@647: catch (IOException ioe) {
ingo@647: logger.error(ioe, ioe);
tim@655: return false;
ingo@647: }
ingo@647: }
ingo@647:
ingo@647:
ingo@806: /**
ingo@806: * Append meta information about the mapservice itself.
ingo@806: *
ingo@806: * @param callContext The CallContext object.
ingo@806: * @param document The meta information document.
ingo@806: * @param meta The element where the new information need to be appended to.
ingo@806: */
ingo@1057: public static void insertAbstractMeta(
ingo@647: CallContext callContext,
ingo@1057: Document document
ingo@647: ) {
ingo@1057: if (document == null) {
ingo@1057: document = initMeta();
ingo@1057: }
ingo@1057:
ingo@1057: Node meta = (Node) XMLUtils.xpath(
ingo@1057: document,
ingo@1057: XPATH_META,
ingo@1057: XPathConstants.NODE,
ingo@1057: ArtifactNamespaceContext.INSTANCE);
ingo@1057:
ingo@647: XMLUtils.ElementCreator creator = new XMLUtils.ElementCreator(
ingo@647: document,
ingo@647: ArtifactNamespaceContext.NAMESPACE_URI,
ingo@647: ArtifactNamespaceContext.NAMESPACE_PREFIX);
ingo@647:
ingo@647: GNVArtifactContext context =
ingo@647: (GNVArtifactContext) callContext.globalContext();
ingo@647:
ingo@647: String server = (String)
ingo@647: context.get(GNVArtifactContext.MAPSERVER_SERVER_PATH_KEY);
ingo@647:
ingo@647: String map = (String)
ingo@647: context.get(GNVArtifactContext.MAPSERVER_MAP_PATH_KEY);
ingo@647:
ingo@1057: Long time = callContext.getTimeToLive();
ingo@1057: time = time != null ? time + new Date().getTime() : null;
ingo@1057: String ttl = time != null ? time.toString() : null;
ingo@1057:
ingo@772: if (logger.isDebugEnabled()) {
ingo@772: logger.debug("MAPSERVER PATH: " + server);
ingo@772: logger.debug("MAP PATH: " + map);
ingo@1057: logger.debug("TTL: " + ttl);
ingo@772: }
ingo@647:
ingo@647: Element mapserver = creator.create(NODE_MAPSERVER);
ingo@647: Element serverPath = creator.create(NODE_SERVER);
ingo@647: Element mapPath = creator.create(NODE_MAP);
ingo@1057: Element timetolive = creator.create(NODE_TTL);
ingo@647:
ingo@647: mapPath.setTextContent(map);
ingo@647: serverPath.setTextContent(server);
ingo@1057: timetolive.setTextContent(ttl);
ingo@647:
ingo@647: mapserver.appendChild(serverPath);
ingo@647: mapserver.appendChild(mapPath);
ingo@1057: mapserver.appendChild(timetolive);
ingo@647: meta.appendChild(mapserver);
ingo@647: }
ingo@647: }
ingo@647: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :