ingo@647: package de.intevation.gnv.utils; ingo@647: ingo@647: import de.intevation.artifacts.ArtifactNamespaceContext; ingo@647: import de.intevation.artifacts.CallContext; ingo@647: ingo@647: import de.intevation.artifactdatabase.XMLUtils; ingo@647: ingo@647: import de.intevation.gnv.artifacts.context.GNVArtifactContext; ingo@647: import de.intevation.gnv.wms.LayerInfo; 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; ingo@647: ingo@647: import org.apache.log4j.Logger; ingo@647: ingo@647: import org.w3c.dom.Document; ingo@647: import org.w3c.dom.Element; ingo@647: ingo@647: /** ingo@647: * @author Ingo Weinzierl (ingo.weinzierl@intevation.de) 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@647: ingo@647: public static final String META_FILE_NAME = "meta.xml"; ingo@647: public static final String ISOLINES_NAME = "isolines.shp"; ingo@647: public static final String POLYGON_NAME = "polygons.shp"; ingo@647: ingo@647: private MetaWriter() { ingo@647: } ingo@647: ingo@647: public static Document writeHorizontalcrosssectionMeta( ingo@647: CallContext context, ingo@647: String uuid, ingo@647: String path, ingo@647: String paramType) ingo@647: { 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@647: writeAbstractMeta(context, meta, root); ingo@647: writePolygonMeta(context, meta, root, uuid, path, paramType); ingo@647: writeIsolineMeta(context, meta, root, uuid, path, paramType); ingo@647: ingo@647: try { ingo@647: File metaFile = new File(path, META_FILE_NAME); ingo@647: ingo@647: if (!metaFile.createNewFile() || !metaFile.canWrite()) { ingo@647: logger.error("Error while writing meta file: "+metaFile.toString()); ingo@647: return null; 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: ingo@647: return success ? meta : null; ingo@647: } ingo@647: catch (FileNotFoundException fnfe) { ingo@647: logger.error(fnfe); ingo@647: } ingo@647: catch (IOException ioe) { ingo@647: logger.error(ioe, ioe); ingo@647: } ingo@647: ingo@647: return meta; ingo@647: } ingo@647: ingo@647: ingo@647: public static void writeAbstractMeta( ingo@647: CallContext callContext, ingo@647: Document document, ingo@647: Element meta ingo@647: ) { 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@647: logger.debug("MAPSERVER PATH: " + server); ingo@647: logger.debug("MAP PATH: " + map); 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@647: ingo@647: mapPath.setTextContent(map); ingo@647: serverPath.setTextContent(server); ingo@647: ingo@647: mapserver.appendChild(serverPath); ingo@647: mapserver.appendChild(mapPath); ingo@647: meta.appendChild(mapserver); ingo@647: } ingo@647: ingo@647: ingo@647: public static void writePolygonMeta( ingo@647: CallContext context, ingo@647: Document document, ingo@647: Element meta, ingo@647: String uuid, ingo@647: String path, ingo@647: String paramType ingo@647: ) { 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: Element layer = creator.create(LayerInfo.LAYER); ingo@647: Element model = creator.create(LayerInfo.LAYER_MODEL); ingo@647: Element name = creator.create(LayerInfo.LAYER_NAME); ingo@647: Element type = creator.create(LayerInfo.LAYER_TYPE); ingo@647: Element status = creator.create(LayerInfo.LAYER_STATUS); ingo@647: Element data = creator.create(LayerInfo.LAYER_DATA); ingo@647: ingo@647: model.setTextContent(paramType); ingo@647: name.setTextContent(uuid); ingo@647: type.setTextContent("POLYGON"); ingo@647: status.setTextContent("DEFAULT"); ingo@647: data.setTextContent(POLYGON_NAME); ingo@647: ingo@647: layer.appendChild(model); ingo@647: layer.appendChild(name); ingo@647: layer.appendChild(type); ingo@647: layer.appendChild(status); ingo@647: layer.appendChild(data); ingo@647: ingo@647: meta.appendChild(layer); ingo@647: } ingo@647: ingo@647: ingo@647: public static void writeIsolineMeta( ingo@647: CallContext context, ingo@647: Document document, ingo@647: Element meta, ingo@647: String uuid, ingo@647: String path, ingo@647: String paramType ingo@647: ) { 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: Element layer = creator.create(LayerInfo.LAYER); ingo@647: Element model = creator.create(LayerInfo.LAYER_MODEL); ingo@647: Element name = creator.create(LayerInfo.LAYER_NAME); ingo@647: Element type = creator.create(LayerInfo.LAYER_TYPE); ingo@647: Element status = creator.create(LayerInfo.LAYER_STATUS); ingo@647: Element data = creator.create(LayerInfo.LAYER_DATA); ingo@647: ingo@647: model.setTextContent(paramType+"_isolines"); ingo@647: name.setTextContent(uuid); ingo@647: type.setTextContent("LINE"); ingo@647: status.setTextContent("DEFAULT"); ingo@647: data.setTextContent(ISOLINES_NAME); ingo@647: ingo@647: layer.appendChild(model); ingo@647: layer.appendChild(name); ingo@647: layer.appendChild(type); ingo@647: layer.appendChild(status); ingo@647: layer.appendChild(data); ingo@647: ingo@647: meta.appendChild(layer); ingo@647: } ingo@647: } ingo@647: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :