christian@5022: package de.intevation.flys.mapserver; christian@5022: christian@5022: import de.intevation.artifacts.CallContext; christian@5022: import de.intevation.flys.artifacts.FLYSArtifact; christian@5022: import de.intevation.flys.artifacts.access.RiverAccess; christian@5022: import de.intevation.flys.artifacts.model.LayerInfo; christian@5022: import de.intevation.flys.artifacts.model.map.WMSDBLayerFacet; christian@5022: import de.intevation.flys.artifacts.model.map.WMSLayerFacet; christian@5022: import de.intevation.flys.artifacts.resources.Resources; christian@5022: import de.intevation.flys.utils.FLYSUtils; christian@5022: import de.intevation.flys.utils.GeometryUtils; christian@5022: christian@5022: import java.io.File; christian@5022: import java.io.FileNotFoundException; christian@5022: import java.io.IOException; christian@5023: import java.util.ArrayList; christian@5022: import java.util.List; christian@5022: christian@5022: import org.apache.log4j.Logger; christian@5022: import org.apache.velocity.Template; christian@5022: import org.geotools.data.shapefile.ShpFiles; christian@5022: import org.geotools.data.shapefile.shp.ShapefileHeader; christian@5022: import org.geotools.data.shapefile.shp.ShapefileReader; christian@5022: christian@5022: public class ArtifactMapfileGenerator extends MapfileGenerator { christian@5022: christian@5022: private static Logger logger = Logger.getLogger(ArtifactMapfileGenerator.class); christian@5022: christian@5022: @Override christian@5022: protected String getVelocityLogfile() { christian@5022: return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_VELOCITY_LOGFILE); christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getMapserverTemplatePath() { christian@5022: return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPSERVER_TEMPLATE_PATH); christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getMapserverUrl() { christian@5022: return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPSERVER_URL); christian@5022: } christian@5022: christian@5022: /** christian@5023: * Generates flys.map file that contains layers of all christian@5023: * projects and types (floodmap, user defined, barriers). christian@5022: */ christian@5175: public void generate(String style, CallContext context, FLYSArtifact flys) throws IOException christian@5022: { christian@5023: // Get all directories below "shapefiles/" christian@5023: File[] prjDirs = getProjectDirs(); christian@5022: christian@5023: // Look for appropriate shapefiles that we can use as layers christian@5023: List layerShapes = searchForLayerShapes(prjDirs); christian@5023: christian@5023: List layerSnippets = new ArrayList(); christian@5023: christian@5023: // Generate layer snippet for each shapefile christian@5023: for (File layerShape : layerShapes) { christian@5175: String fileName = layerShape.getName(); christian@5175: File layerFile = null; christian@5175: christian@5023: if (fileName.startsWith(MS_PREFIX_BARRIERS)) { christian@5023: christian@5023: } christian@5023: else if (fileName.startsWith(MS_PREFIX_USER)) { christian@5175: layerFile = createUserShapeLayer(layerShape); christian@5023: } christian@5175: else if (fileName.startsWith(MS_PREFIX_WSPLGEN) && christian@5175: style != null && context != null && flys != null) { christian@5175: layerFile = createFloodmapLayer(layerShape, style, context, flys); christian@5175: } christian@5023: christian@5175: if (layerFile != null) { christian@5175: layerSnippets.add(layerFile.getCanonicalPath()); christian@5023: } christian@5023: } christian@5023: christian@5023: writeMapfile(layerSnippets); christian@5022: } christian@5022: christian@5175: @Override christian@5175: public void generate() throws IOException { christian@5175: generate(null, null, null); christian@5175: } christian@5175: christian@5022: /** christian@5022: * Creates a layer file used for Mapserver's mapfile which represents the christian@5022: * floodmap. christian@5022: */ christian@5175: protected File createFloodmapLayer(File file, String style, CallContext context, FLYSArtifact flys) christian@5175: throws FileNotFoundException, IOException christian@5022: { christian@5175: String uuid = uuidFromPath(file.getAbsolutePath()); christian@5022: logger.debug("createUeskLayer"); christian@5022: christian@5022: LayerInfo layerinfo = new LayerInfo(); christian@5175: layerinfo.setName(MS_PREFIX_WSPLGEN + "-" + uuid); christian@5022: layerinfo.setType("POLYGON"); christian@5175: layerinfo.setDirectory(uuid); christian@5022: layerinfo.setData(WSPLGEN_RESULT_SHAPE); christian@5022: layerinfo.setTitle(Resources.getMsg(Resources.getLocale(context.getMeta()), christian@5022: "floodmap.uesk", christian@5022: "Floodmap")); christian@5022: layerinfo.setStyle(style); christian@5022: RiverAccess access = new RiverAccess(flys); christian@5022: String river = access.getRiver(); christian@5022: layerinfo.setSrid(FLYSUtils.getRiverDGMSrid(river)); christian@5022: christian@5175: String name = "floodmap.layer"; //MS_LAYER_PREFIX + wms.getName(); christian@5022: christian@5022: Template template = getTemplateByName(WSPLGEN_LAYER_TEMPLATE); christian@5022: if (template == null) { christian@5022: logger.warn("Template '" + WSPLGEN_LAYER_TEMPLATE + "' found."); christian@5175: return null; christian@5022: } christian@5022: christian@5022: try { christian@5175: File dir = new File(getShapefileBaseDir(), uuid); christian@5175: File layerFile = new File(dir, name); christian@5175: writeLayer(layerinfo, layerFile, template); christian@5175: return layerFile; christian@5022: } christian@5022: catch (FileNotFoundException fnfe) { christian@5022: logger.error(fnfe, fnfe); christian@5022: logger.warn("Unable to write layer: " + name); christian@5175: return null; christian@5022: } christian@5022: } christian@5022: christian@5022: christian@5022: /** christian@5022: * Creates a layer file used for Mapserver's mapfile which represents the christian@5022: * user defined barriers. christian@5022: * christian@5022: * @param flys The FLYSArtifact that owns wms. christian@5022: * @param wms The WMSLayerFacet that contains information for the layer. christian@5022: */ christian@5023: protected void createBarriersLayer(FLYSArtifact flys, WMSLayerFacet wms) christian@5022: throws FileNotFoundException, IOException christian@5022: { christian@5022: logger.debug("createBarriersLayer"); christian@5022: christian@5022: //String uuid = flys.identifier(); christian@5022: //File dir = new File(getShapefileBaseDir(), uuid); christian@5022: christian@5022: createBarriersLineLayer(flys, wms); christian@5022: createBarriersPolygonLayer(flys, wms); christian@5022: } christian@5022: christian@5022: christian@5022: protected void createBarriersLineLayer( christian@5022: FLYSArtifact flys, christian@5022: WMSLayerFacet wms christian@5022: ) christian@5022: throws FileNotFoundException, IOException christian@5022: { christian@5022: String uuid = flys.identifier(); christian@5076: String group = MS_PREFIX_BARRIERS + uuid; christian@5022: String groupTitle = "I18N_BARRIERS_TITLE"; christian@5022: christian@5022: File dir = new File(getShapefileBaseDir(), uuid); christian@5022: File test = new File(dir, WSPLGEN_LINES_SHAPE); christian@5022: christian@5022: if (!test.exists() || !test.canRead()) { christian@5022: logger.debug("No barrier line layer existing."); christian@5022: return; christian@5022: } christian@5022: christian@5022: LayerInfo lineInfo = new LayerInfo(); christian@5022: lineInfo.setName(MS_LINE_PREFIX + uuid); christian@5022: lineInfo.setType("LINE"); christian@5022: lineInfo.setDirectory(uuid); christian@5022: lineInfo.setData(WSPLGEN_LINES_SHAPE); christian@5022: lineInfo.setTitle("I18N_LINE_SHAPE"); christian@5022: lineInfo.setGroup(group); christian@5022: lineInfo.setGroupTitle(groupTitle); christian@5022: lineInfo.setSrid(wms.getSrid()); christian@5022: christian@5022: String nameLines = MS_LAYER_PREFIX + wms.getName() + "-lines"; christian@5022: christian@5022: Template tpl = getTemplateByName(SHP_LAYER_TEMPLATE); christian@5022: if (tpl == null) { christian@5022: logger.warn("Template '" + SHP_LAYER_TEMPLATE + "' found."); christian@5022: return; christian@5022: } christian@5022: christian@5022: try { christian@5022: writeLayer(lineInfo, new File(dir, nameLines), tpl); christian@5022: } christian@5022: catch (FileNotFoundException fnfe) { christian@5022: logger.error(fnfe, fnfe); christian@5022: logger.warn("Unable to write layer: " + nameLines); christian@5022: } christian@5022: } christian@5022: christian@5022: protected void createBarriersPolygonLayer( christian@5022: FLYSArtifact flys, christian@5022: WMSLayerFacet wms christian@5022: ) christian@5022: throws FileNotFoundException, IOException christian@5022: { christian@5022: String uuid = flys.identifier(); christian@5076: String group = uuid + MS_PREFIX_BARRIERS; christian@5022: String groupTitle = "I18N_BARRIERS_TITLE"; christian@5022: christian@5022: File dir = new File(getShapefileBaseDir(), uuid); christian@5022: File test = new File(dir, WSPLGEN_POLYGONS_SHAPE); christian@5022: christian@5022: if (!test.exists() || !test.canRead()) { christian@5022: logger.debug("No barrier line layer existing."); christian@5022: return; christian@5022: } christian@5022: christian@5022: LayerInfo polygonInfo = new LayerInfo(); christian@5022: polygonInfo.setName(MS_POLYGONS_PREFIX + uuid); christian@5022: polygonInfo.setType("POLYGON"); christian@5022: polygonInfo.setDirectory(uuid); christian@5022: polygonInfo.setData(WSPLGEN_POLYGONS_SHAPE); christian@5022: polygonInfo.setTitle("I18N_POLYGON_SHAPE"); christian@5022: polygonInfo.setGroup(group); christian@5022: polygonInfo.setGroupTitle(groupTitle); christian@5022: polygonInfo.setSrid(wms.getSrid()); christian@5022: christian@5022: String namePolygons = MS_LAYER_PREFIX + wms.getName() + "-polygons"; christian@5022: christian@5022: Template tpl = getTemplateByName(SHP_LAYER_TEMPLATE); christian@5022: if (tpl == null) { christian@5022: logger.warn("Template '" + SHP_LAYER_TEMPLATE + "' found."); christian@5022: return; christian@5022: } christian@5022: christian@5022: try { christian@5022: writeLayer(polygonInfo, new File(dir, namePolygons), tpl); christian@5022: } christian@5022: catch (FileNotFoundException fnfe) { christian@5022: logger.error(fnfe, fnfe); christian@5022: logger.warn("Unable to write layer: " + namePolygons); christian@5022: } christian@5022: } christian@5022: christian@5076: protected String uuidFromPath(String path) { christian@5076: logger.debug("uuidFromPath(" + path + ")"); christian@5076: int i1 = 0; christian@5076: int i2 = 0; christian@5076: christian@5076: for(;;) { christian@5076: int i = path.indexOf('/', i2 + 1); christian@5076: if (i == -1) { christian@5076: return path.substring(i1 + 1, i2); christian@5076: } christian@5076: else { christian@5076: i1 = i2; christian@5076: i2 = i; christian@5076: } christian@5076: } christian@5076: } christian@5022: christian@5022: /** christian@5022: * Creates a layer file used for Mapserver's mapfile which represents the christian@5022: * shape files uploaded by the user. christian@5022: */ christian@5087: protected File createUserShapeLayer(File file) christian@5022: throws FileNotFoundException, IOException christian@5022: { christian@5076: String uuid = uuidFromPath(file.getAbsolutePath()); christian@5076: logger.debug("createUserShapeLayer(): uuid=" + uuid); christian@5022: christian@5022: File dir = new File(getShapefileBaseDir(), uuid); christian@5022: File test = new File(dir, WSPLGEN_USER_SHAPE); christian@5022: christian@5022: if (!test.exists() || !test.canRead()) { christian@5022: logger.debug("No user layer existing."); christian@5087: return null; christian@5022: } christian@5022: christian@5022: File userShape = new File(dir, WSPLGEN_USER_SHAPE); christian@5022: ShpFiles sf = new ShpFiles(userShape); christian@5022: ShapefileReader sfr = new ShapefileReader(sf, true, false, null); christian@5022: ShapefileHeader sfh = sfr.getHeader(); christian@5022: christian@5076: String group = uuid + MS_PREFIX_USER; christian@5022: String groupTitle = "I18N_USER_SHAPE_TITLE"; christian@5022: christian@5022: LayerInfo info = new LayerInfo(); christian@5076: info.setName(MS_PREFIX_USER + uuid); christian@5022: if (sfh.getShapeType().isLineType()) { christian@5022: info.setType("LINE"); christian@5022: } christian@5022: else if (sfh.getShapeType().isPolygonType()) { christian@5022: info.setType("POLYGON"); christian@5022: } christian@5022: else { christian@5087: logger.debug("createUserShapeLayer(): unexpected geometry type"); christian@5087: return null; christian@5022: } christian@5022: info.setDirectory(uuid); christian@5022: info.setData(WSPLGEN_USER_SHAPE); christian@5022: info.setTitle("I18N_USER_SHAPE"); christian@5022: info.setGroup(group); christian@5022: info.setGroupTitle(groupTitle); christian@5076: //info.setSrid(wms.getSrid()); // FIXME: Required? christian@5022: christian@5076: String nameUser = "user.layer"; //MS_LAYER_PREFIX + wms.getName(); christian@5022: christian@5022: Template tpl = getTemplateByName(SHP_LAYER_TEMPLATE); christian@5022: if (tpl == null) { christian@5022: logger.warn("Template '" + SHP_LAYER_TEMPLATE + "' found."); christian@5087: return null; christian@5022: } christian@5022: christian@5087: File layerFile = new File(dir, nameUser); christian@5087: christian@5022: try { christian@5087: writeLayer(info, layerFile, tpl); christian@5022: } christian@5022: catch (FileNotFoundException fnfe) { christian@5022: logger.error(fnfe, fnfe); christian@5022: logger.warn("Unable to write layer: " + nameUser); christian@5022: } christian@5087: return layerFile; christian@5022: } christian@5022: christian@5022: christian@5022: /** christian@5022: * Creates a layer file used for Mapserver's mapfile which represents christian@5022: * geometries from database. christian@5022: * christian@5022: * @param flys The FLYSArtifact that owns wms. christian@5022: * @param wms The WMSLayerFacet that contains information for the layer. christian@5022: */ christian@5023: protected void createDatabaseLayer( christian@5022: FLYSArtifact flys, christian@5022: WMSDBLayerFacet wms, christian@5022: String style christian@5022: ) christian@5022: throws FileNotFoundException, IOException christian@5022: { christian@5022: logger.debug("createDatabaseLayer"); christian@5022: christian@5022: LayerInfo layerinfo = new LayerInfo(); christian@5022: layerinfo.setName(wms.getName() + "-" + flys.identifier()); christian@5022: layerinfo.setType(wms.getGeometryType()); christian@5022: layerinfo.setFilter(wms.getFilter()); christian@5022: layerinfo.setData(wms.getData()); christian@5022: layerinfo.setTitle(wms.getDescription()); christian@5022: layerinfo.setStyle(style); christian@5022: if(wms.getExtent() != null) { christian@5022: layerinfo.setExtent(GeometryUtils.jtsBoundsToOLBounds(wms.getExtent())); christian@5022: } christian@5022: layerinfo.setConnection(wms.getConnection()); christian@5022: layerinfo.setConnectionType(wms.getConnectionType()); christian@5022: layerinfo.setLabelItem(wms.getLabelItem()); christian@5022: layerinfo.setSrid(wms.getSrid()); christian@5022: christian@5022: String name = MS_LAYER_PREFIX + wms.getName(); christian@5022: christian@5022: Template template = getTemplateByName(DB_LAYER_TEMPLATE); christian@5022: if (template == null) { christian@5022: logger.warn("Template '" + DB_LAYER_TEMPLATE + "' found."); christian@5022: return; christian@5022: } christian@5022: christian@5022: try { christian@5022: File dir = new File(getShapefileBaseDir(), flys.identifier()); christian@5022: writeLayer(layerinfo, new File(dir, name), template); christian@5022: } christian@5022: catch (FileNotFoundException fnfe) { christian@5022: logger.error(fnfe, fnfe); christian@5022: logger.warn("Unable to write layer: " + name); christian@5022: } christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getMapfilePath() { christian@5022: return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPFILE_PATH); christian@5022: } christian@5022: christian@5022: @Override christian@5022: protected String getMapfileTemplate() { christian@5022: return FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_MAPFILE_TEMPLATE); christian@5022: } christian@5022: christian@5022: }