Mercurial > dive4elements > river
view flys-artifacts/src/main/java/de/intevation/flys/artifacts/WMSDBArtifact.java @ 5416:4ee97d914501
Morpho-Importer: Do not mask database exceptions as broken files
author | Tom Gottfried <tom.gottfried@intevation.de> |
---|---|
date | Tue, 26 Mar 2013 09:39:34 +0100 |
parents | e1cd77ddcbc4 |
children |
line wrap: on
line source
package de.intevation.flys.artifacts; import com.vividsolutions.jts.geom.Envelope; import de.intevation.artifactdatabase.data.DefaultStateData; import de.intevation.artifactdatabase.state.Facet; import de.intevation.artifactdatabase.state.State; import de.intevation.artifacts.Artifact; import de.intevation.artifacts.ArtifactFactory; import de.intevation.artifacts.CallMeta; import de.intevation.artifacts.common.utils.FileTools; import de.intevation.flys.artifacts.model.map.WMSDBLayerFacet; import de.intevation.flys.artifacts.resources.Resources; import de.intevation.flys.artifacts.states.DefaultState; import de.intevation.flys.utils.FLYSUtils; import de.intevation.flys.utils.MapUtils; import java.io.File; import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; import org.w3c.dom.Document; public abstract class WMSDBArtifact extends StaticFLYSArtifact { private static final Logger logger = Logger.getLogger(WMSDBArtifact.class); @Override public void setup( String identifier, ArtifactFactory factory, Object context, CallMeta callMeta, Document data) { logger.debug("WMSDBArtifact.setup"); super.setup(identifier, factory, context, callMeta, data); String ids = getDatacageIDValue(data); if (ids != null && ids.length() > 0) { addData("ids", new DefaultStateData("ids", null, null, ids)); } else { throw new IllegalArgumentException("No attribute 'ids' found!"); } List<Facet> fs = new ArrayList<Facet>(); WMSDBState state = (WMSDBState) getCurrentState(context); state.computeInit(this, hash(), context, callMeta, fs); if (!fs.isEmpty()) { addFacets(getCurrentStateId(), fs); } } @Override protected void initialize( Artifact artifact, Object context, CallMeta callMeta) { // do nothing } @Override protected State getState(Object context, String stateID) { return getCurrentState(context); } /** * Get a list containing the one and only State. * @param context ignored. * @return list with one and only state. */ @Override protected List<State> getStates(Object context) { ArrayList<State> states = new ArrayList<State>(); states.add(getCurrentState(context)); return states; } public static abstract class WMSDBState extends DefaultState { private static final Logger logger = Logger.getLogger(WMSDBState.class); protected FLYSArtifact artifact; protected String name; protected int riverId; public WMSDBState() {} public WMSDBState(FLYSArtifact artifact) { this.artifact = artifact; this.name = null; this.riverId = 0; } @Override public Object computeInit( FLYSArtifact artifact, String hash, Object context, CallMeta meta, List<Facet> facets ) { logger.debug("WMSDBState.computeInit"); String type = getFacetType(); WMSDBLayerFacet facet = new WMSDBLayerFacet( 0, type, getTitle(meta), ComputeType.INIT, getID(), hash, getUrl()); facet.addLayer(getLayer()); facet.setExtent(getExtent()); facet.setOriginalExtent(getExtent(true)); facet.setSrid(getSrid()); facet.setData(getDataString()); facet.setFilter(getFilter()); facet.setGeometryType(getGeometryType()); facet.setConnection(MapUtils.getConnection()); facet.setConnectionType(MapUtils.getConnectionType()); facet.setLabelItem(getLabelItem()); facets.add(facet); return null; } protected String getLabelItem() { return null; } public int getRiverId() { if (riverId == 0) { String rid = getIdPart(0); try { riverId = Integer.parseInt(rid); } catch (NumberFormatException nfe) { logger.error("Cannot parse river id from '" + artifact.getDataAsString("ids") + "'"); } } return riverId; } protected String getLayer() { String type = getFacetType(); String name = type + "-" + artifact.identifier(); return name; } /** * Returns the name of the WMS layer. This method extracts the name * from 'ids' data string. It is expected, that the 'ids' string is * seperated by ';' and that the name is placed at index 1. * * @return the name of the WMS layer. */ public String getName() { if (name == null) { name = getIdPart(1); } return name; } /** * Returns a part of the ID string. This method splits the * 'ids' data string. It is expected, that the 'ids' string is * seperated by ';'. * * @param number the position of the id data string * * @return the part of the id string at position number. * Null if number was out of bounds. */ public String getIdPart(int number) { String ids = artifact.getDataAsString("ids"); String parts[] = ids != null ? ids.split(";") : null; if (parts != null && parts.length >= number + 1) { return parts[number]; } return null; } /** * Returns the name of the layer (returned by getName()) or the layer * type if the name is empty. The layer type is created by an i18n * string of getFacetType(). * * @param meta A CallMeta used for i18n. * * @return the name of the layer or its type if name is empty. */ protected String getTitle(CallMeta meta) { String name = getName(); return name != null && name.length() > 0 ? name : Resources.getMsg( meta, getFacetType(), getFacetType()); } @Override public void endOfLife(Artifact owner, Object context) { logger.info("Destroy WMSDBState: " + getID()); String p = FLYSUtils.getXPathString(FLYSUtils.XPATH_FLOODMAP_SHAPEFILE_DIR); File dir = new File(p, owner.identifier()); if (dir != null && dir.exists()) { logger.debug("Try to delete directory '" + dir + "'"); FileTools.deleteRecursive(dir); } } /** * This method returns the extent of a DB layer in the projection of the * database. * * @return the extent of the DB layer in the projection of the database. */ protected Envelope getExtent() { return getExtent(false); } protected abstract String getFacetType(); protected abstract String getUrl(); protected abstract String getSrid(); /** * This method returns the extent of the DB layer. The projection of the * extent depends on the <i>reproject</i> parameter. If reproject is set, * the extent is reprojected into the original projection which is * specified in the configuration. Otherwise, the projection of the * database is used. * * @param reproject True, to reproject the extent into the projection * specified in the configuration. * * @return the extent of the database layer. */ protected abstract Envelope getExtent(boolean reproject); protected abstract String getFilter(); protected abstract String getDataString(); protected abstract String getGeometryType(); } // end of WMSDBState } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :