christian@4654: package de.intevation.flys.utils;
christian@4654: 
christian@4654: import de.intevation.artifacts.CallContext;
christian@4654: import de.intevation.flys.artifacts.FLYSArtifact;
christian@4654: import de.intevation.flys.artifacts.model.LayerInfo;
christian@4654: import de.intevation.flys.artifacts.model.map.WMSDBLayerFacet;
christian@4654: import de.intevation.flys.artifacts.model.map.WMSLayerFacet;
christian@4654: import de.intevation.flys.artifacts.model.map.WSPLGENLayerFacet;
christian@4654: import de.intevation.flys.artifacts.resources.Resources;
christian@4654: 
christian@4654: import java.io.File;
christian@4654: import java.io.FileNotFoundException;
christian@4654: import java.io.IOException;
christian@4654: import java.util.List;
christian@4654: 
christian@4654: import org.apache.log4j.Logger;
christian@4654: import org.apache.velocity.Template;
christian@4654: import org.geotools.data.shapefile.ShpFiles;
christian@4654: import org.geotools.data.shapefile.shp.ShapefileHeader;
christian@4654: import org.geotools.data.shapefile.shp.ShapefileReader;
christian@4654: 
christian@4654: public class ArtefactMapfileGenerator extends MapfileGenerator {
christian@4654: 
christian@4654:     private static Logger logger = Logger.getLogger(ArtefactMapfileGenerator.class);
christian@4654: 
christian@4656:     @Override
christian@4656:     protected String getVelocityLogfile() {
christian@4656:         return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_VELOCITY_LOGFILE);
christian@4656:     }
christian@4656: 
christian@4656:     @Override
christian@4656:     protected String getMapserverTemplatePath() {
christian@4656:         return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPSERVER_TEMPLATE_PATH);
christian@4656:     }
christian@4656: 
christian@4656:     @Override
christian@4656:     protected String getMapserverUrl() {
christian@4656:         return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPSERVER_URL);
christian@4656:     }
christian@4656: 
christian@4654:     /**
christian@4654:      * Method which starts searching for meta information file and mapfile
christian@4654:      * generation.
christian@4654:      */
christian@4654:     @Override
christian@4654:     public void generate() throws IOException
christian@4654:     {
christian@4654:         File[] userDirs = getUserDirs();
christian@4654:         List<String> layers = parseLayers(userDirs);
christian@4654:         logger.info("Found " + layers.size() + " layers for user mapfile.");
christian@4654: 
christian@4654:         writeMapfile(layers);
christian@4654:     }
christian@4654: 
christian@4654:     /**
christian@4654:      * Creates a layer file used for Mapserver's mapfile which represents the
christian@4654:      * floodmap.
christian@4654:      *
christian@4654:      * @param flys The FLYSArtifact that owns <i>wms</i>.
christian@4654:      * @param wms The WMSLayerFacet that contains information for the layer.
christian@4654:      */
christian@4654:     public void createUeskLayer(
christian@4654:         FLYSArtifact  flys,
christian@4654:         WSPLGENLayerFacet wms,
christian@4654:         String        style,
christian@4654:         CallContext context
christian@4654:     ) throws FileNotFoundException, IOException
christian@4654:     {
christian@4654:         logger.debug("createUeskLayer");
christian@4654: 
christian@4654:         LayerInfo layerinfo = new LayerInfo();
christian@4654:         layerinfo.setName(MS_WSPLGEN_PREFIX + flys.identifier());
christian@4654:         layerinfo.setType("POLYGON");
christian@4654:         layerinfo.setDirectory(flys.identifier());
christian@4654:         layerinfo.setData(WSPLGEN_RESULT_SHAPE);
christian@4654:         layerinfo.setTitle(Resources.getMsg(Resources.getLocale(context.getMeta()),
christian@4654:                                             "floodmap.uesk",
christian@4654:                                             "Floodmap"));
christian@4654:         layerinfo.setStyle(style);
christian@4654:         layerinfo.setSrid(wms.getSrid());
christian@4654: 
christian@4654:         String name = MS_LAYER_PREFIX + wms.getName();
christian@4654: 
christian@4654:         Template template = getTemplateByName(WSPLGEN_LAYER_TEMPLATE);
christian@4654:         if (template == null) {
christian@4654:             logger.warn("Template '" + WSPLGEN_LAYER_TEMPLATE + "' found.");
christian@4654:             return;
christian@4654:         }
christian@4654: 
christian@4654:         try {
christian@4654:             File dir = new File(getShapefileBaseDir(), flys.identifier());
christian@4656:             writeLayer(layerinfo, new File(dir, name), template);
christian@4654:         }
christian@4654:         catch (FileNotFoundException fnfe) {
christian@4654:             logger.error(fnfe, fnfe);
christian@4654:             logger.warn("Unable to write layer: " + name);
christian@4654:         }
christian@4654:     }
christian@4654: 
christian@4654: 
christian@4654:     /**
christian@4654:      * Creates a layer file used for Mapserver's mapfile which represents the
christian@4654:      * user defined barriers.
christian@4654:      *
christian@4654:      * @param flys The FLYSArtifact that owns <i>wms</i>.
christian@4654:      * @param wms The WMSLayerFacet that contains information for the layer.
christian@4654:      */
christian@4654:     public void createBarriersLayer(FLYSArtifact flys, WMSLayerFacet wms)
christian@4654:     throws FileNotFoundException, IOException
christian@4654:     {
christian@4654:         logger.debug("createBarriersLayer");
christian@4654: 
christian@4654:         //String uuid = flys.identifier();
christian@4654:         //File   dir  = new File(getShapefileBaseDir(), uuid);
christian@4654: 
christian@4654:         createBarriersLineLayer(flys, wms);
christian@4654:         createBarriersPolygonLayer(flys, wms);
christian@4654:     }
christian@4654: 
christian@4654: 
christian@4654:     protected void createBarriersLineLayer(
christian@4654:         FLYSArtifact  flys,
christian@4654:         WMSLayerFacet wms
christian@4654:     )
christian@4654:     throws FileNotFoundException, IOException
christian@4654:     {
christian@4654:         String uuid       = flys.identifier();
christian@4654:         String group      = MS_BARRIERS_PREFIX + uuid;
christian@4654:         String groupTitle = "I18N_BARRIERS_TITLE";
christian@4654: 
christian@4654:         File dir  = new File(getShapefileBaseDir(), uuid);
christian@4654:         File test = new File(dir, WSPLGEN_LINES_SHAPE);
christian@4654: 
christian@4654:         if (!test.exists() || !test.canRead()) {
christian@4654:             logger.debug("No barrier line layer existing.");
christian@4654:             return;
christian@4654:         }
christian@4654: 
christian@4654:         LayerInfo lineInfo = new LayerInfo();
christian@4654:         lineInfo.setName(MS_LINE_PREFIX + uuid);
christian@4654:         lineInfo.setType("LINE");
christian@4654:         lineInfo.setDirectory(uuid);
christian@4654:         lineInfo.setData(WSPLGEN_LINES_SHAPE);
christian@4654:         lineInfo.setTitle("I18N_LINE_SHAPE");
christian@4654:         lineInfo.setGroup(group);
christian@4654:         lineInfo.setGroupTitle(groupTitle);
christian@4654:         lineInfo.setSrid(wms.getSrid());
christian@4654: 
christian@4654:         String nameLines = MS_LAYER_PREFIX + wms.getName() + "-lines";
christian@4654: 
christian@4654:         Template tpl = getTemplateByName(SHP_LAYER_TEMPLATE);
christian@4654:         if (tpl == null) {
christian@4654:             logger.warn("Template '" + SHP_LAYER_TEMPLATE + "' found.");
christian@4654:             return;
christian@4654:         }
christian@4654: 
christian@4654:         try {
christian@4656:             writeLayer(lineInfo, new File(dir, nameLines), tpl);
christian@4654:         }
christian@4654:         catch (FileNotFoundException fnfe) {
christian@4654:             logger.error(fnfe, fnfe);
christian@4654:             logger.warn("Unable to write layer: " + nameLines);
christian@4654:         }
christian@4654:     }
christian@4654: 
christian@4654:     protected void createBarriersPolygonLayer(
christian@4654:             FLYSArtifact  flys,
christian@4654:             WMSLayerFacet wms
christian@4654:         )
christian@4654:         throws FileNotFoundException, IOException
christian@4654:         {
christian@4654:             String uuid       = flys.identifier();
christian@4654:             String group      = uuid + MS_BARRIERS_PREFIX;
christian@4654:             String groupTitle = "I18N_BARRIERS_TITLE";
christian@4654: 
christian@4654:             File dir  = new File(getShapefileBaseDir(), uuid);
christian@4654:             File test = new File(dir, WSPLGEN_POLYGONS_SHAPE);
christian@4654: 
christian@4654:             if (!test.exists() || !test.canRead()) {
christian@4654:                 logger.debug("No barrier line layer existing.");
christian@4654:                 return;
christian@4654:             }
christian@4654: 
christian@4654:             LayerInfo polygonInfo = new LayerInfo();
christian@4654:             polygonInfo.setName(MS_POLYGONS_PREFIX + uuid);
christian@4654:             polygonInfo.setType("POLYGON");
christian@4654:             polygonInfo.setDirectory(uuid);
christian@4654:             polygonInfo.setData(WSPLGEN_POLYGONS_SHAPE);
christian@4654:             polygonInfo.setTitle("I18N_POLYGON_SHAPE");
christian@4654:             polygonInfo.setGroup(group);
christian@4654:             polygonInfo.setGroupTitle(groupTitle);
christian@4654:             polygonInfo.setSrid(wms.getSrid());
christian@4654: 
christian@4654:             String namePolygons = MS_LAYER_PREFIX + wms.getName() + "-polygons";
christian@4654: 
christian@4654:             Template tpl = getTemplateByName(SHP_LAYER_TEMPLATE);
christian@4654:             if (tpl == null) {
christian@4654:                 logger.warn("Template '" + SHP_LAYER_TEMPLATE + "' found.");
christian@4654:                 return;
christian@4654:             }
christian@4654: 
christian@4654:             try {
christian@4656:                 writeLayer(polygonInfo, new File(dir, namePolygons), tpl);
christian@4654:             }
christian@4654:             catch (FileNotFoundException fnfe) {
christian@4654:                 logger.error(fnfe, fnfe);
christian@4654:                 logger.warn("Unable to write layer: " + namePolygons);
christian@4654:             }
christian@4654:         }
christian@4654: 
christian@4654: 
christian@4654:         /**
christian@4654:          * Creates a layer file used for Mapserver's mapfile which represents the
christian@4654:          * shape files uploaded by the user.
christian@4654:          *
christian@4654:          * @param flys The FLYSArtifact that owns <i>wms</i>.
christian@4654:          * @param wms The WMSLayerFacet that contains information for the layer.
christian@4654:          */
christian@4654:         public void createUserShapeLayer(FLYSArtifact flys, WMSLayerFacet wms)
christian@4654:         throws FileNotFoundException, IOException
christian@4654:         {
christian@4654:             logger.debug("createUserShapeLayer");
christian@4654: 
christian@4654:             String uuid = flys.identifier();
christian@4654:             File   dir  = new File(getShapefileBaseDir(), uuid);
christian@4654:             File   test = new File(dir, WSPLGEN_USER_SHAPE);
christian@4654: 
christian@4654:             if (!test.exists() || !test.canRead()) {
christian@4654:                 logger.debug("No user layer existing.");
christian@4654:                 return;
christian@4654:             }
christian@4654: 
christian@4654:             File userShape = new File(dir, WSPLGEN_USER_SHAPE);
christian@4654:             ShpFiles sf = new ShpFiles(userShape);
christian@4654:             ShapefileReader sfr = new ShapefileReader(sf, true, false, null);
christian@4654:             ShapefileHeader sfh = sfr.getHeader();
christian@4654: 
christian@4654:             String group      = uuid + MS_USERSHAPE_PREFIX;
christian@4654:             String groupTitle = "I18N_USER_SHAPE_TITLE";
christian@4654: 
christian@4654:             LayerInfo info = new LayerInfo();
christian@4654:             info.setName(MS_USERSHAPE_PREFIX + uuid);
christian@4654:             if (sfh.getShapeType().isLineType()) {
christian@4654:                 info.setType("LINE");
christian@4654:             }
christian@4654:             else if (sfh.getShapeType().isPolygonType()) {
christian@4654:                 info.setType("POLYGON");
christian@4654:             }
christian@4654:             else {
christian@4654:                 return;
christian@4654:             }
christian@4654:             info.setDirectory(uuid);
christian@4654:             info.setData(WSPLGEN_USER_SHAPE);
christian@4654:             info.setTitle("I18N_USER_SHAPE");
christian@4654:             info.setGroup(group);
christian@4654:             info.setGroupTitle(groupTitle);
christian@4654:             info.setSrid(wms.getSrid());
christian@4654: 
christian@4654:             String nameUser = MS_LAYER_PREFIX + wms.getName();
christian@4654: 
christian@4654:             Template tpl = getTemplateByName(SHP_LAYER_TEMPLATE);
christian@4654:             if (tpl == null) {
christian@4654:                 logger.warn("Template '" + SHP_LAYER_TEMPLATE + "' found.");
christian@4654:                 return;
christian@4654:             }
christian@4654: 
christian@4654:             try {
christian@4656:                 writeLayer(info, new File(dir, nameUser), tpl);
christian@4654:             }
christian@4654:             catch (FileNotFoundException fnfe) {
christian@4654:                 logger.error(fnfe, fnfe);
christian@4654:                 logger.warn("Unable to write layer: " + nameUser);
christian@4654:             }
christian@4654: 
christian@4654:         }
christian@4654: 
christian@4654: 
christian@4654:         /**
christian@4654:          * Creates a layer file used for Mapserver's mapfile which represents
christian@4654:          * geometries from database.
christian@4654:          *
christian@4654:          * @param flys The FLYSArtifact that owns <i>wms</i>.
christian@4654:          * @param wms The WMSLayerFacet that contains information for the layer.
christian@4654:          */
christian@4654:         public void createDatabaseLayer(
christian@4654:             FLYSArtifact    flys,
christian@4654:             WMSDBLayerFacet wms,
christian@4654:             String          style
christian@4654:         )
christian@4654:         throws FileNotFoundException, IOException
christian@4654:         {
christian@4654:             logger.debug("createDatabaseLayer");
christian@4654: 
christian@4654:             LayerInfo layerinfo = new LayerInfo();
christian@4654:             layerinfo.setName(wms.getName() + "-" + flys.identifier());
christian@4654:             layerinfo.setType(wms.getGeometryType());
christian@4654:             layerinfo.setFilter(wms.getFilter());
christian@4654:             layerinfo.setData(wms.getData());
christian@4654:             layerinfo.setTitle(wms.getDescription());
christian@4654:             layerinfo.setStyle(style);
christian@4654:             if(wms.getExtent() != null) {
christian@4654:                 layerinfo.setExtent(GeometryUtils.jtsBoundsToOLBounds(wms.getExtent()));
christian@4654:             }
christian@4654:             layerinfo.setConnection(wms.getConnection());
christian@4654:             layerinfo.setConnectionType(wms.getConnectionType());
christian@4654:             layerinfo.setLabelItem(wms.getLabelItem());
christian@4654:             layerinfo.setSrid(wms.getSrid());
christian@4654: 
christian@4654:             String name = MS_LAYER_PREFIX + wms.getName();
christian@4654: 
christian@4654:             Template template = getTemplateByName(DB_LAYER_TEMPLATE);
christian@4654:             if (template == null) {
christian@4654:                 logger.warn("Template '" + DB_LAYER_TEMPLATE + "' found.");
christian@4654:                 return;
christian@4654:             }
christian@4654: 
christian@4654:             try {
christian@4654:                 File dir = new File(getShapefileBaseDir(), flys.identifier());
christian@4656:                 writeLayer(layerinfo, new File(dir, name), template);
christian@4654:             }
christian@4654:             catch (FileNotFoundException fnfe) {
christian@4654:                 logger.error(fnfe, fnfe);
christian@4654:                 logger.warn("Unable to write layer: " + name);
christian@4654:             }
christian@4654:         }
christian@4654: 
christian@4656:         @Override
christian@4656:         protected String getMapfilePath() {
christian@4656:             return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPFILE_PATH);
christian@4656:         }
christian@4656: 
christian@4656:         @Override
christian@4656:         protected String getMapfileTemplate() {
christian@4656:             return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPFILE_TEMPLATE);
christian@4656:         }
christian@4656: 
christian@4654: }