Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/utils/FLYSUtils.java @ 1797:5eec623db50a
Polygon2D: moved 2D vector operation to separate class.
flys-artifacts/trunk@3120 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 31 Oct 2011 10:03:32 +0000 |
parents | 49ad801076e4 |
children | 5e9696c32f04 |
line wrap: on
line source
package de.intevation.flys.utils; import org.apache.log4j.Logger; import java.text.NumberFormat; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.xml.xpath.XPathConstants; import org.w3c.dom.Document; import gnu.trove.TDoubleArrayList; import de.intevation.artifacts.Artifact; import de.intevation.artifacts.CallContext; import de.intevation.artifacts.common.utils.Config; import de.intevation.artifacts.common.utils.XMLUtils; import de.intevation.flys.artifacts.context.FLYSContext; import de.intevation.flys.artifacts.FLYSArtifact; import de.intevation.flys.artifacts.WINFOArtifact; import de.intevation.flys.artifacts.model.RiverFactory; import de.intevation.flys.model.Gauge; import de.intevation.flys.model.MainValue; import de.intevation.flys.model.River; public class FLYSUtils { /** The logger that is used in this utility. */ private static Logger logger = Logger.getLogger(FLYSUtils.class); public static enum KM_MODE { RANGE, LOCATIONS, NONE }; public static final String XPATH_RIVER_PROJECTION = "/artifact-database/floodmap/river[@name=$name]/srid/@value"; public static final String XPATH_SHAPEFILE_DIR = "/artifact-database/floodmap/shapefile-path/@value"; public static final String XPATH_VELOCITY_LOGFILE = "/artifact-database/floodmap/velocity/logfile/@path"; public static final String XPATH_MAPSERVER_URL = "/artifact-database/floodmap/mapserver/server/@path"; public static final String XPATH_MAPFILE_PATH = "/artifact-database/floodmap/mapserver/mapfile/@path"; public static final String XPATH_MAPFILE_TEMPLATE = "/artifact-database/floodmap/mapserver/map-template/@path"; public static final String XPATH_MAPSERVER_TEMPLATE_PATH = "/artifact-database/floodmap/mapserver/templates/@path"; private FLYSUtils() { } public static FLYSArtifact getArtifact(String uuid, CallContext context) { try { Artifact artifact = context.getDatabase().getRawArtifact(uuid); if (artifact == null) { logger.error("Artifact '" + uuid + "' does not exist."); return null; } if (!(artifact instanceof FLYSArtifact)) { logger.error("Artifact '" +uuid+ "' is no valid FLYSArtifact."); return null; } return (FLYSArtifact) artifact; } // TODO: catch more selective catch (Exception e) { logger.error("Cannot get FLYSArtifact " + uuid + " from database (" + e.getMessage() + ")."); return null; } } /** * Returns the FLYSContext from context object. * * @param context The CallContext or the FLYSContext. * * @return the FLYSContext. */ public static FLYSContext getFlysContext(Object context) { return context instanceof FLYSContext ? (FLYSContext) context : (FLYSContext) ((CallContext) context).globalContext(); } /** * Convinience function to retrieve an XPath as string with replaced config * directory. * * @param xpath The XPath expression. * * @return a string with replaced config directory. */ public static String getXPathString(String xpath) { String tmp = Config.getStringXPath(xpath); tmp = Config.replaceConfigDir(tmp); return tmp; } public static KM_MODE getKmRangeMode(FLYSArtifact flys) { String mode = flys.getDataAsString("ld_mode"); if (mode == null || mode.length() == 0) { return KM_MODE.NONE; } else if (mode.equals("distance")) { return KM_MODE.RANGE; } else if (mode.equals("locations")) { return KM_MODE.LOCATIONS; } else { return KM_MODE.NONE; } } public static double[] getKmRange(FLYSArtifact flys) { switch (getKmRangeMode(flys)) { case RANGE: { return getKmFromTo(flys); } case LOCATIONS: { double[] locs = getLocations(flys); return new double[] { locs[0], locs[locs.length-1] }; } case NONE: { double[] locs = getLocations(flys); if (locs != null) { return new double[] { locs[0], locs[locs.length-1] }; } else { return getKmFromTo(flys); } } } return new double[] { Double.NaN, Double.NaN }; } public static double[] getKmFromTo(FLYSArtifact flys) { String strFrom = flys.getDataAsString("ld_from"); String strTo = flys.getDataAsString("ld_to"); if (strFrom == null || strTo == null) { return null; } try { return new double[] { Double.parseDouble(strFrom), Double.parseDouble(strTo) }; } catch (NumberFormatException nfe) { return null; } } public static double[] getLocations(FLYSArtifact flys) { String locationStr = flys.getDataAsString("ld_locations"); if (locationStr == null || locationStr.length() == 0) { return null; } String[] tmp = locationStr.split(" "); TDoubleArrayList locations = new TDoubleArrayList(); for (String l: tmp) { try { locations.add(Double.parseDouble(l)); } catch (NumberFormatException nfe) { } } locations.sort(); return locations.toNativeArray(); } /** * Returns the selected River object based on the 'river' data that might * have been inserted by the user. * * @return the selected River or null if no river has been chosen yet. */ public static River getRiver(FLYSArtifact flys) { String sRiver = flys.getDataAsString("river"); return (sRiver != null) ? RiverFactory.getRiver(sRiver) : null; } /** * Extracts the SRID defined in the global configuration for the river * specified in <i>artifact</i>. * * @param artifact The FLYSArtifact that stores the name of the river. * * @return the SRID as string (e.g. "31466"). */ public static String getRiverSrid(FLYSArtifact artifact) { String river = artifact.getDataAsString("river"); if (river == null || river.length() == 0) { return null; } Map<String, String> variables = new HashMap<String, String>(1); variables.put("name", river); Document cfg = Config.getConfig(); return (String) XMLUtils.xpath( cfg, XPATH_RIVER_PROJECTION, XPathConstants.STRING, null, variables); } public static String createWspWTitle( WINFOArtifact winfo, CallContext cc, String name ) { String[] parts = name.split("="); NumberFormat nf = Formatter.getWaterlevelW(cc); String namedMainValue = null; boolean isQ = winfo.isQ(); boolean isFree = winfo.isFreeQ(); double v; try { v = Double.valueOf(parts[1]); namedMainValue = getNamedMainValue(winfo.getGauge(), v); } catch (NumberFormatException nfe) { logger.warn("Cannot parse Double of: '" + parts[1] + "'"); return name; } String prefix = null; if (isQ && !isFree && namedMainValue != null) { return "W (" + namedMainValue + ")"; } if (isQ) { prefix = "Q="; } return prefix == null ? "W(" + nf.format(v) + ")" : "W(" + prefix + nf.format(v) + ")"; } public static String createWspQTitle( WINFOArtifact winfo, CallContext cc, String name ) { String[] parts = name.split("="); NumberFormat nf = Formatter.getWaterlevelQ(cc); String namedMainValue = null; boolean isQ = winfo.isQ(); boolean isFree = winfo.isFreeQ(); double v; try { v = Double.valueOf(parts[1]); namedMainValue = getNamedMainValue(winfo.getGauge(), v); } catch (NumberFormatException nfe) { logger.warn("Cannot parse Double of: '" + parts[1] + "'"); return name; } String prefix = null; if (isQ && !isFree && namedMainValue != null) { return namedMainValue; } if (!isQ) { prefix = "W="; } return prefix == null ? "Q(" + nf.format(v) + ")" : "Q(" + prefix + nf.format(v) + ")"; } public static String getNamedMainValue(Gauge gauge, double value) { List<MainValue> mainValues = gauge.getMainValues(); logger.debug("Search named main value for: " + value); for (MainValue mv: mainValues) { if (mv.getValue().doubleValue() == value) { logger.debug("Found named main value: " + mv.getMainValue().getName()); return mv.getMainValue().getName(); } } logger.debug("Did not find a named main value for: " + value); return null; } /** * Returns the URL of user mapfile for the owner of Artifact * <i>artifactId</i>. * * @param artifactId The UUID of an artifact. * * @return the URL of the user wms. */ public static String getUserWMSUrl(String artifactId) { String url = getXPathString(XPATH_MAPSERVER_URL); url = url + "user-wms"; return url; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :