//$Header: /home/deegree/jail/deegreerepository/deegree/src/org/deegree/ogcwebservices/wmps/configuration/WMPSConfigurationDocument.java,v 1.34 2006/11/27 09:07:53 poth Exp $
/*---------------- FILE HEADER ------------------------------------------
This file is part of deegree.
Copyright (C) 2001-2006 by:
EXSE, Department of Geography, University of Bonn
http://www.giub.uni-bonn.de/deegree/
lat/lon GmbH
http://www.lat-lon.de
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Contact:
Andreas Poth
lat/lon GmbH
Aennchenstraße 19
53177 Bonn
Germany
E-Mail: poth@lat-lon.de
Prof. Dr. Klaus Greve
Department of Geography
University of Bonn
Meckenheimer Allee 166
53115 Bonn
Germany
E-Mail: greve@giub.uni-bonn.de
---------------------------------------------------------------------------*/
package org.deegree.ogcwebservices.wmps.configuration;
import java.awt.Color;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.transform.TransformerException;
import org.deegree.datatypes.QualifiedName;
import org.deegree.enterprise.Proxy;
import org.deegree.framework.log.ILogger;
import org.deegree.framework.log.LoggerFactory;
import org.deegree.framework.util.BootLogger;
import org.deegree.framework.util.IDGenerator;
import org.deegree.framework.util.KVP2Map;
import org.deegree.framework.util.StringTools;
import org.deegree.framework.xml.InvalidConfigurationException;
import org.deegree.framework.xml.XMLFragment;
import org.deegree.framework.xml.XMLParsingException;
import org.deegree.framework.xml.XMLTools;
import org.deegree.framework.xml.XSLTDocument;
import org.deegree.model.crs.UnknownCRSException;
import org.deegree.model.metadata.iso19115.OnlineResource;
import org.deegree.model.spatialschema.Envelope;
import org.deegree.model.spatialschema.GMLGeometryAdapter;
import org.deegree.model.spatialschema.Geometry;
import org.deegree.model.spatialschema.GeometryException;
import org.deegree.ogcbase.CommonNamespaces;
import org.deegree.ogcwebservices.OGCWebService;
import org.deegree.ogcwebservices.getcapabilities.MetadataURL;
import org.deegree.ogcwebservices.getcapabilities.OperationsMetadata;
import org.deegree.ogcwebservices.getcapabilities.ServiceIdentification;
import org.deegree.ogcwebservices.getcapabilities.ServiceProvider;
import org.deegree.ogcwebservices.wcs.WCService;
import org.deegree.ogcwebservices.wcs.configuration.WCSConfiguration;
import org.deegree.ogcwebservices.wcs.getcoverage.GetCoverage;
import org.deegree.ogcwebservices.wfs.WFServiceFactory;
import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilities;
import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilitiesDocument;
import org.deegree.ogcwebservices.wfs.configuration.WFSConfiguration;
import org.deegree.ogcwebservices.wfs.configuration.WFSConfigurationDocument;
import org.deegree.ogcwebservices.wfs.operation.Query;
import org.deegree.ogcwebservices.wmps.capabilities.WMPSCapabilitiesDocument;
import org.deegree.ogcwebservices.wms.RemoteWMService;
import org.deegree.ogcwebservices.wms.capabilities.Attribution;
import org.deegree.ogcwebservices.wms.capabilities.AuthorityURL;
import org.deegree.ogcwebservices.wms.capabilities.DataURL;
import org.deegree.ogcwebservices.wms.capabilities.Dimension;
import org.deegree.ogcwebservices.wms.capabilities.Extent;
import org.deegree.ogcwebservices.wms.capabilities.FeatureListURL;
import org.deegree.ogcwebservices.wms.capabilities.GazetteerParam;
import org.deegree.ogcwebservices.wms.capabilities.Identifier;
import org.deegree.ogcwebservices.wms.capabilities.Layer;
import org.deegree.ogcwebservices.wms.capabilities.LayerBoundingBox;
import org.deegree.ogcwebservices.wms.capabilities.LegendURL;
import org.deegree.ogcwebservices.wms.capabilities.ScaleHint;
import org.deegree.ogcwebservices.wms.capabilities.Style;
import org.deegree.ogcwebservices.wms.capabilities.StyleSheetURL;
import org.deegree.ogcwebservices.wms.capabilities.StyleURL;
import org.deegree.ogcwebservices.wms.capabilities.UserDefinedSymbolization;
import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilities;
import org.deegree.ogcwebservices.wms.capabilities.WMSCapabilitiesDocument;
import org.deegree.ogcwebservices.wms.configuration.AbstractDataSource;
import org.deegree.ogcwebservices.wms.configuration.LocalWCSDataSource;
import org.deegree.ogcwebservices.wms.configuration.LocalWFSDataSource;
import org.deegree.ogcwebservices.wms.configuration.RemoteWFSDataSource;
import org.deegree.ogcwebservices.wms.configuration.RemoteWMSDataSource;
import org.deegree.ogcwebservices.wms.operation.GetMap;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
/**
* Represents an XML configuration document for a deegree WMPS 1.0 instance, i.e. it consists of all
* sections common to an OGC WMS 1.1.1 capabilities document plus a deegree specific section named
* <code>deegreeParams</code> and... TODO
*
* @author <a href="mailto:deshmukh@lat-lon.de">Anup Deshmukh</a>
* @author last edited by: $Author: poth $
*
* @version 2.0, $Revision: 1.34 $, $Date: 2006/11/27 09:07:53 $
*/
public class WMPSConfigurationDocument extends WMPSCapabilitiesDocument {
private static final long serialVersionUID = -7940857863171829848L;
private static final ILogger LOG = LoggerFactory.getLogger( WMPSConfigurationDocument.class );
protected static final URI DEEGREEWPSNS = CommonNamespaces.DEEGREEWMPS;
private static final String XML_TEMPLATE = "WMPSConfigurationTemplate.xml";
private static final String XSLT_TEMPLATE_NAME = "WMPSConfigurationTransform.xsl";
private static XSLTDocument XSLT_TEMPLATE;
private static Map<URL, Object> capaCache = new HashMap<URL, Object>();
static {
XSLT_TEMPLATE = new XSLTDocument();
try {
XSLT_TEMPLATE.load( WMPSConfigurationDocument.class.getResource( XSLT_TEMPLATE_NAME ) );
} catch ( Exception e ) {
BootLogger.logError( "Error loading XSLT sheet in WMPSConfigurationDocument.", e );
}
}
/**
* Creates a skeleton capabilities document that contains the mandatory elements only.
*
* @throws IOException
* @throws SAXException
*/
@Override
public void createEmptyDocument()
throws IOException, SAXException {
URL url = WMPSConfigurationDocument.class.getResource( XML_TEMPLATE );
if ( url == null ) {
throw new IOException( "The resource '" + XML_TEMPLATE + " could not be found." );
}
load( url );
}
/**
* Creates a class representation of the document.
*
* @return class representation of the configuration document
* @throws InvalidConfigurationException
*/
public WMPSConfiguration parseConfiguration()
throws InvalidConfigurationException {
try {
// transform document to fill missing elements and attributes with default values
XMLFragment frag = XSLT_TEMPLATE.transform( this );
this.setRootElement( frag.getRootElement() );
} catch ( TransformerException e ) {
String msg = "Error transforming WMPS configuration document (in order to fill "
+ "in default value). " + e.getMessage();
LOG.logError( msg, e );
throw new InvalidConfigurationException( msg, e );
}
ServiceIdentification serviceIdentification = null;
ServiceProvider serviceProvider = null;
UserDefinedSymbolization uds = null;
OperationsMetadata metadata = null;
Layer layer = null;
WMPSDeegreeParams params = null;
String version = parseVersion();
try {
Node node = XMLTools.getRequiredNode( getRootElement(), "deegreewmps:DeegreeParam",
nsContext );
params = parseDeegreeParams( node );
serviceIdentification = parseServiceIdentification();
serviceProvider = parseServiceProvider();
uds = parseUserDefinedSymbolization();
metadata = parseOperationsMetadata();
Element layerElem = (Element) XMLTools.getRequiredNode( getRootElement(),
"./Capability/Layer", nsContext );
layer = parseLayers( layerElem, null );
} catch ( XMLParsingException e ) {
e.printStackTrace();
throw new InvalidConfigurationException( e.getMessage()
+ StringTools.stackTraceToString( e ) );
} catch ( MalformedURLException e ) {
throw new InvalidConfigurationException( e.getMessage() + " - "
+ StringTools.stackTraceToString( e ) );
} catch (UnknownCRSException e) {
throw new InvalidConfigurationException( getClass().getName(), e.getMessage() );
}
WMPSConfiguration wmpsConfiguration = new WMPSConfiguration( version,
serviceIdentification,
serviceProvider, uds,
metadata, layer, params,
getSystemId() );
return wmpsConfiguration;
}
/**
* Creates a class representation of the <code>deegreeParams</code>- section.
*
* @param root
* @return WMPSDeegreeParams
* @throws XMLParsingException
* @throws MalformedURLException
*/
public WMPSDeegreeParams parseDeegreeParams( Node root )
throws XMLParsingException, MalformedURLException {
String xPath = "./deegreewmps:DefaultOnlineResource";
Element elem = (Element) XMLTools.getRequiredNode( root, xPath, nsContext );
OnlineResource ol = parseOnLineResource( elem );
xPath = "./deegreewmps:CacheSize";
int cache = XMLTools.getNodeAsInt( root, xPath, nsContext, 100 );
xPath = "./deegreewmps:MaxLifeTime";
int maxLifeTime = XMLTools.getNodeAsInt( root, xPath, nsContext, 3600 );
xPath = "./deegreewmps:RequestTimeLimit";
int reqTimeLimit = XMLTools.getNodeAsInt( root, xPath, nsContext, 15 );
reqTimeLimit *= 1000;
xPath = "./deegreewmps:MapQuality";
double mapQuality = XMLTools.getNodeAsDouble( root, xPath, nsContext, 0.95 );
xPath = "./deegreewmps:MaxMapWidth";
int maxMapWidth = XMLTools.getNodeAsInt( root, xPath, nsContext, 1000 );
xPath = "./deegreewmps:MaxMapHeight";
int maxMapHeight = XMLTools.getNodeAsInt( root, xPath, nsContext, 1000 );
xPath = "./deegreewmps:FeatureInfoRadius";
int featureInfoRadius = XMLTools.getNodeAsInt( root, xPath, nsContext, 5 );
xPath = "./deegreewmps:Copyright";
String copyright = XMLTools.getNodeAsString( root, xPath, nsContext, "" );
URL dtdLocation = null;
xPath = "deegreewmps:DTDLocation";
if ( XMLTools.getNode( root, xPath, nsContext ) != null ) {
xPath = "./deegreewmps:DTDLocation/deegreewmps:OnlineResource";
elem = (Element) XMLTools.getRequiredNode( root, xPath, nsContext );
OnlineResource olr = parseOnLineResource( elem );
dtdLocation = olr.getLinkage().getHref();
} else {
dtdLocation = new URL( "http://schemas.opengis.net/wms/1.1.1/WMS_MS_Capabilities.dtd" );
}
xPath = "./deegreewmps:AntiAliased";
boolean antiAliased = XMLTools.getNodeAsBoolean( root, xPath, nsContext, true );
xPath = "./deegreewmps:GazetteerParameter";
elem = (Element) XMLTools.getNode( root, xPath, nsContext );
GazetteerParam gazetteer = null;
if ( elem != null ) {
gazetteer = parseGazetteerParameter( elem );
}
Proxy proxy = parseProxy( root );
List<String> synchList = parseSynchTemplates( root );
CacheDatabase cacheDatabase = parseCacheDatabase( root );
PrintMapParam printMapParam = parsePrintMapParam( root );
WMPSDeegreeParams deegreeParams =
new WMPSDeegreeParams( cache, maxLifeTime, reqTimeLimit, (float) mapQuality, ol,
maxMapWidth, maxMapHeight, antiAliased, featureInfoRadius,
copyright, gazetteer, null, dtdLocation, proxy, synchList,
cacheDatabase, printMapParam );
return deegreeParams;
}
/**
* Parse the cache database parameters used by the wmps to store the asynchronous requests.
*
* @param root
* @return CacheDatabase
* @throws XMLParsingException
*/
private CacheDatabase parseCacheDatabase( Node root ) throws XMLParsingException {
CacheDatabase cacheDatabase = null;
String xPath = "./deegreewmps:CacheDatabase";
Node cacheDb = XMLTools.getNode( root, xPath, nsContext );
if ( cacheDb != null ) {
xPath = "./deegreewmps:JDBCConnection";
Node jdbcConnection = XMLTools.getRequiredNode( cacheDb, xPath, nsContext );
String driver = XMLTools.getRequiredNodeAsString( jdbcConnection,
"./deegreewmps:Driver", nsContext );
String url = XMLTools.getRequiredNodeAsString( jdbcConnection, "./deegreewmps:Url",
nsContext );
String user = XMLTools.getRequiredNodeAsString( jdbcConnection, "./deegreewmps:User",
nsContext );
String password = XMLTools.getRequiredNodeAsString( jdbcConnection,
"./deegreewmps:Password", nsContext );
cacheDatabase = new CacheDatabase( driver, url, user, password );
LOG.logDebug( "Successfully parsed the deegree wmps cache database parameters." );
}
return cacheDatabase;
}
/**
* Parse the PrintMapParam node and retrieve the (jasper reports)template directory, the default
* template name if none is specified in the request. Also parse the output directory location
* and the location of the printed image output directory.
*
* @param root
* @return PrintMapParam
* @throws XMLParsingException
* @throws MalformedURLException
*/
private PrintMapParam parsePrintMapParam( Node root )
throws XMLParsingException, MalformedURLException {
Node printParam = XMLTools.getRequiredNode( root, "./deegreewmps:PrintMapParam", nsContext );
// set default as pdf
String format = XMLTools.getNodeAsString( printParam, "./deegreewmps:Format", nsContext,
"pdf" );
Node templ = XMLTools.getRequiredNode( printParam, "./deegreewmps:Template", nsContext );
String templateDirectory = XMLTools.getRequiredNodeAsString( templ,
"./deegreewmps:Directory",
nsContext );
templateDirectory = this.resolve( templateDirectory ).toExternalForm();
if ( !templateDirectory.endsWith( "/" ) ) {
templateDirectory = templateDirectory + '/';
}
String plotDirectory = XMLTools.getRequiredNodeAsString( printParam,
"./deegreewmps:PlotDirectory",
nsContext );
plotDirectory = this.resolve( plotDirectory ).toExternalForm();
String onlineResource = XMLTools.getRequiredNodeAsString( printParam,
"./deegreewmps:OnlineResource",
nsContext );
String plotImgDir = XMLTools.getRequiredNodeAsString( printParam,
"./deegreewmps:PlotImageDirectory",
nsContext );
plotImgDir = this.resolve( plotImgDir ).toExternalForm();
String adminMail = XMLTools.getRequiredNodeAsString( printParam,
"./deegreewmps:AdministratorEMailAddress",
nsContext );
String mailHost = XMLTools.getRequiredNodeAsString( printParam, "./deegreewmps:MailHost",
nsContext );
String mailTextTemplate = XMLTools.getNodeAsString( printParam, "./deegreewmps:MailTextTemplate",
nsContext, "You can access the printMap result at {1}" );
int targetRes = XMLTools.getNodeAsInt( printParam, "./deegreewmps:TargetResolution",
nsContext, 300 );
PrintMapParam printMapParam = new PrintMapParam( format, templateDirectory, onlineResource,
plotDirectory, plotImgDir, adminMail,
mailHost, mailTextTemplate, targetRes);
return printMapParam;
}
/**
* parses the list of templates that shall be handled synchronously
*
* @param root
* @return List
* @throws XMLParsingException
*/
private List<String> parseSynchTemplates( Node root )
throws XMLParsingException {
String xPath = "./deegreewmps:SynchronousTemplates/deegreewmps:Template";
String[] nodes = XMLTools.getNodesAsStrings( root, xPath, nsContext );
List<String> list = new ArrayList<String>( nodes.length );
for ( int i = 0; i < nodes.length; i++ ) {
list.add( nodes[i] );
}
return list;
}
/**
* @param root
* @return Proxy
* @throws XMLParsingException
*/
private Proxy parseProxy( Node root )
throws XMLParsingException {
Proxy proxy = null;
Node pro = XMLTools.getNode( root, "./deegreewmps:Proxy", nsContext );
if ( pro != null ) {
String proxyHost = XMLTools.getRequiredNodeAsString( pro, "./@proxyHost", nsContext );
String proxyPort = XMLTools.getRequiredNodeAsString( pro, "./@proxyPort", nsContext );
proxy = new Proxy( proxyHost, proxyPort );
}
return proxy;
}
/**
* creates an object that describes the access to a gazetteer if one have been defined at the
* <DeegreeParam>section of the capabilities/configuration
*
* @param element
* @return GazetteerParam
* @throws XMLParsingException
*/
private GazetteerParam parseGazetteerParameter( Element element )
throws XMLParsingException {
GazetteerParam gazetteer = null;
if ( element != null ) {
String xPath = "./deegreewmps:OnlineResource";
Element elem = (Element) XMLTools.getRequiredNode( element, xPath, nsContext );
OnlineResource olr = parseOnLineResource( elem );
URL onlineResource = olr.getLinkage().getHref();
// optional: <LocationRadius>, default: 10
double radius = XMLTools.getNodeAsDouble( element, "LocationRadius", nsContext, 10 );
gazetteer = new GazetteerParam( onlineResource, radius );
}
return gazetteer;
}
/**
* returns the layers offered by the WMS
*
* @param layerElem
* @param parent
* @return Layer
* @throws XMLParsingException
* @throws UnknownCRSException
*/
@Override
protected Layer parseLayers( Element layerElem, Layer parent )
throws XMLParsingException, UnknownCRSException {
boolean queryable = XMLTools.getNodeAsBoolean( layerElem, "./@queryable", nsContext, false );
int cascaded = XMLTools.getNodeAsInt( layerElem, "./@cascaded", nsContext, 0 );
boolean opaque = XMLTools.getNodeAsBoolean( layerElem, "./@opaque", nsContext, false );
boolean noSubsets = XMLTools.getNodeAsBoolean( layerElem, "./@noSubsets", nsContext, false );
int fixedWidth = XMLTools.getNodeAsInt( layerElem, "./@fixedWidth", nsContext, 0 );
int fixedHeight = XMLTools.getNodeAsInt( layerElem, "./@fixedHeight", nsContext, 0 );
String name = XMLTools.getNodeAsString( layerElem, "./Name", nsContext, null );
String title = XMLTools.getRequiredNodeAsString( layerElem, "./Title", nsContext );
String layerAbstract = XMLTools.getNodeAsString( layerElem, "./Abstract", nsContext, null );
String[] keywords = XMLTools.getNodesAsStrings( layerElem, "./KeywordList/Keyword",
nsContext );
String[] srs = XMLTools.getNodesAsStrings( layerElem, "./SRS", nsContext );
List nl = XMLTools.getNodes( layerElem, "./BoundingBox", nsContext );
// substitue with Envelope
LayerBoundingBox[] bboxes = null;
if ( nl.size() == 0 && parent != null ) {
// inherit BoundingBoxes from parent layer
bboxes = parent.getBoundingBoxes();
} else {
bboxes = parseLayerBoundingBoxes( nl );
}
Element llBox = (Element) XMLTools.getNode( layerElem, "./LatLonBoundingBox", nsContext );
Envelope llBoundingBox = null;
if ( llBox == null && parent != null ) {
// inherit LatLonBoundingBox parent layer
llBoundingBox = parent.getLatLonBoundingBox();
} else {
llBoundingBox = parseLatLonBoundingBox( llBox );
}
Dimension[] dimensions = parseDimensions( layerElem );
Extent[] extents = parseExtents( layerElem );
Attribution attribution = parseAttribution( layerElem );
AuthorityURL[] authorityURLs = parseAuthorityURLs( layerElem );
MetadataURL[] metadataURLs = parseMetadataURLs( layerElem );
DataURL[] dataURLs = parseDataURL( layerElem );
Identifier[] identifiers = parseIdentifiers( layerElem );
FeatureListURL[] featureListURLs = parseFeatureListURL( layerElem );
Style[] styles = parseStyles( layerElem );
ScaleHint scaleHint = parseScaleHint( layerElem );
AbstractDataSource[] ds = parseDataSources( layerElem, name );
Layer layer = new Layer( queryable, cascaded, opaque, noSubsets, fixedWidth, fixedHeight,
name, title, layerAbstract, llBoundingBox, attribution, scaleHint,
keywords, srs, bboxes, dimensions, extents, authorityURLs,
identifiers, metadataURLs, dataURLs, featureListURLs, styles,
null, ds, parent );
// get Child layers
nl = XMLTools.getNodes( layerElem, "./Layer", nsContext );
Layer[] layers = new Layer[nl.size()];
for ( int i = 0; i < layers.length; i++ ) {
layers[i] = parseLayers( (Element) nl.get( i ), layer );
}
// set child layers
layer.setLayer( layers );
return layer;
}
/**
* Parse the Datasources element
*
* @param layerElem
* @param layerName
* @return AbstractDataSource[]
* @throws XMLParsingException
*/
private AbstractDataSource[] parseDataSources( Element layerElem, String layerName )
throws XMLParsingException {
List nl = XMLTools.getNodes( layerElem, "./deegreewmps:DataSource", nsContext );
AbstractDataSource[] ds = new AbstractDataSource[nl.size()];
for ( int i = 0; i < ds.length; i++ ) {
boolean failOnEx = XMLTools.getNodeAsBoolean( (Node) nl.get( i ), "./@failOnException",
nsContext, true );
boolean queryable = XMLTools.getNodeAsBoolean( (Node) nl.get( i ), "./@queryable",
nsContext, false );
QualifiedName name =
XMLTools.getNodeAsQualifiedName( (Node) nl.get( i ), "./deegreewmps:Name/text()",
nsContext, new QualifiedName( layerName ) );
String stype = XMLTools.getRequiredNodeAsString( (Node) nl.get( i ),
"./deegreewmps:Type", nsContext );
String xPath = "./deegreewmps:OWSCapabilities/deegreewmps:OnlineResource";
Node node = XMLTools.getRequiredNode( (Node) nl.get( i ), xPath, nsContext );
URL url = parseOnLineResource( (Element) node ).getLinkage().getHref();
ScaleHint scaleHint = parseScaleHint( (Node) nl.get( i ) );
Geometry validArea = parseValidArea( (Node) nl.get( i ) );
try {
if ( "LOCALWFS".equals( stype ) ) {
ds[i] = createLocalWFSDataSource( (Node) nl.get( i ), failOnEx, queryable,
name, url, scaleHint, validArea, 60 );
} else if ( "LOCALWCS".equals( stype ) ) {
ds[i] = createLocalWCSDataSource( (Node) nl.get( i ), failOnEx, queryable,
name, url, scaleHint, validArea, 60 );
} else if ( "REMOTEWFS".equals( stype ) ) {
ds[i] = createRemoteWFSDataSource( (Node) nl.get( i ), failOnEx, queryable,
name, url, scaleHint, validArea, 60 );
} else if ( "REMOTEWCS".equals( stype ) ) {
// TODO
// int type = AbstractDataSource.REMOTEWCS;
// GetCoverage getCoverage = parseWCSFilterCondition( (Node) nl.get( i ) );
// Color[] colors = parseTransparentColors( (Node) nl.get( i ) );
throw new UnsupportedOperationException( "REMOTEWCS is not supported as yet!" );
} else if ( "REMOTEWMS".equals( stype ) ) {
ds[i] = createRemoteWMSDataSource( (Node) nl.get( i ), failOnEx, queryable,
name, url, scaleHint, validArea, 60 );
} else {
throw new XMLParsingException( "invalid DataSource type: " + stype
+ " defined in deegree WMS "
+ "configuration for DataSource: " + name );
}
} catch ( Exception e ) {
throw new XMLParsingException( "could not create service instance for "
+ "WMPS datasource: " + name, e );
}
}
return ds;
}
/**
* returns the area a data source is valid. If the optional element <ValidArea>is not defined in
* the configuration returns <code>null</code>.
*
* @param node
* @return Geometry
* @throws XMLParsingException
*/
private Geometry parseValidArea( Node node ) throws XMLParsingException {
Geometry geom = null;
List nl = XMLTools.getNodes( node, "./deegreewmps:ValidArea/*", nsContext );
if ( node != null ) {
try {
for ( int i = 0; i < nl.size(); i++ ) {
if ( ( (Node) nl.get( 0 ) ).getNamespaceURI().equals( GMLNS ) ) {
geom = GMLGeometryAdapter.wrap( (Element) nl.get( 0 ) );
break;
}
}
} catch ( GeometryException e ) {
throw new XMLParsingException( "couldn't parse/create valid area of a "
+ "datasource", e );
}
}
return geom;
}
/**
* Create a RemoteWMS datasource.
*
* @param node
* @param failOnEx
* @param queryable
* @param name
* @param url
* @param scaleHint
* @param validArea
* @param reqTimeLimit
* @return XMLParsingException
* @throws Exception
*/
private RemoteWMSDataSource createRemoteWMSDataSource( Node node, boolean failOnEx,
boolean queryable, QualifiedName name,
URL url, ScaleHint scaleHint,
Geometry validArea, int reqTimeLimit )
throws Exception {
int type = AbstractDataSource.REMOTEWMS;
String xPath = "./deegreewmps:FeatureInfoTransformation/deegreewmps:OnlineResource";
Node fitNode = XMLTools.getNode( node, xPath, nsContext );
URL fitURL = null;
if ( fitNode != null ) {
fitURL = parseOnLineResource( (Element) fitNode ).getLinkage().getHref();
}
GetMap getMap = parseWMSFilterCondition( node );
Color[] colors = parseTransparentColors( node );
WMSCapabilities wCapa = null;
try {
if ( capaCache.get( url ) != null ) {
wCapa = (WMSCapabilities) capaCache.get( url );
} else {
WMSCapabilitiesDocument doc = new WMSCapabilitiesDocument();
doc.load( url );
wCapa = (WMSCapabilities) doc.parseCapabilities();
capaCache.put( url, wCapa );
}
} catch ( Exception e ) {
LOG.logError( "could not connet: " + url, e );
}
OGCWebService ows = new RemoteWMService( wCapa );
return new RemoteWMSDataSource( queryable, failOnEx, name, type, ows, url, scaleHint,
validArea, getMap, colors, fitURL, reqTimeLimit );
}
/**
* Create a Remote WFS datasource.
*
* @param node
* @param failOnEx
* @param queryable
* @param name
* @param url
* @param scaleHint
* @param validArea
* @param reqTimeLimit
* @return RemoteWFSDataSource
* @throws Exception
*/
private RemoteWFSDataSource createRemoteWFSDataSource( Node node, boolean failOnEx,
boolean queryable, QualifiedName name,
URL url, ScaleHint scaleHint,
Geometry validArea, int reqTimeLimit )
throws Exception {
int type = AbstractDataSource.REMOTEWFS;
String xPath = "./deegreewmps:FeatureInfoTransformation/deegreewmps:OnlineResource";
Node fitNode = XMLTools.getNode( node, xPath, nsContext );
URL fitURL = null;
if ( fitNode != null ) {
fitURL = parseOnLineResource( (Element) fitNode ).getLinkage().getHref();
}
Query query = parseWFSFilterCondition( node );
WFSCapabilities wfsCapa = null;
if ( capaCache.get( url ) != null ) {
wfsCapa = (WFSCapabilities) capaCache.get( url );
} else {
WFSCapabilitiesDocument wfsDoc = new WFSCapabilitiesDocument();
wfsDoc.load( url );
wfsCapa = (WFSCapabilities) wfsDoc.parseCapabilities();
capaCache.put( url, wfsCapa );
}
// OGCWebService ows = new RemoteWFService( wfsCapa );
OGCWebService ows = null;
xPath = "./deegreewmps:GeometryProperty/text()";
QualifiedName geom = new QualifiedName( "app", "GEOM",
new URI( "http://www.deegree.org/app" ) );
QualifiedName geoProp = XMLTools.getNodeAsQualifiedName( node, xPath, nsContext, geom );
return new RemoteWFSDataSource( queryable, failOnEx, name, type, geoProp, ows, url,
scaleHint, validArea, query, fitURL, reqTimeLimit );
}
/**
* Create a Local WCS Datasource
*
* @param node
* @param failOnEx
* @param queryable
* @param name
* @param url
* @param scaleHint
* @param validArea
* @param reqTimeLimit
* @return RemoteWFSDataSource
* @throws Exception
*/
private LocalWCSDataSource createLocalWCSDataSource( Node node, boolean failOnEx,
boolean queryable, QualifiedName name,
URL url, ScaleHint scaleHint,
Geometry validArea, int reqTimeLimit )
throws Exception {
int type = AbstractDataSource.LOCALWCS;
GetCoverage getCoverage = parseWCSFilterCondition( node );
Color[] colors = parseTransparentColors( node );
WCSConfiguration configuration = null;
if ( capaCache.get( url ) != null ) {
configuration = (WCSConfiguration) capaCache.get( url );
} else {
configuration = WCSConfiguration.create( url );
capaCache.put( url, configuration );
}
OGCWebService ows = new WCService( configuration );
return new LocalWCSDataSource( queryable, failOnEx, name, type, ows, url, scaleHint,
validArea, getCoverage, colors, reqTimeLimit );
}
/**
* Create a Local WFS Datasource
*
* @param node
* @param failOnEx
* @param queryable
* @param name
* @param url
* @param scaleHint
* @param validArea
* @param reqTimeLimit
* @return LocalWFSDataSource
* @throws Exception
*/
private LocalWFSDataSource createLocalWFSDataSource( Node node, boolean failOnEx,
boolean queryable, QualifiedName name,
URL url, ScaleHint scaleHint,
Geometry validArea, int reqTimeLimit )
throws Exception {
int type = AbstractDataSource.LOCALWFS;
String xPath = null;
Query query = parseWFSFilterCondition( node );
WFSConfiguration wfsCapa = null;
if ( capaCache.get( url ) != null ) {
wfsCapa = (WFSConfiguration) capaCache.get( url );
} else {
WFSConfigurationDocument wfsDoc = new WFSConfigurationDocument();
wfsDoc.load( url );
wfsCapa = wfsDoc.getConfiguration();
capaCache.put( url, wfsCapa );
}
// OGCWebService ows = WFServiceFactory.getUncachedService( wfsCapa );
OGCWebService ows = WFServiceFactory.createInstance( wfsCapa );
QualifiedName geom = new QualifiedName( "app", "GEOM",
new URI( "http://www.deegree.org/app" ) );
xPath = "./deegreewmps:GeometryProperty/text()";
QualifiedName geoProp = XMLTools.getNodeAsQualifiedName( node, xPath, nsContext, geom );
return new LocalWFSDataSource( queryable, failOnEx, name, type, geoProp, ows, url,
scaleHint, validArea, query, null, reqTimeLimit );
}
/**
* Parse trasparent colors.
*
* @param node
* @return Color[]
* @throws XMLParsingException
*/
private Color[] parseTransparentColors( Node node )
throws XMLParsingException {
String xPath = "./deegreewmps:TransparentColors/deegreewmps:Color";
List clnl = XMLTools.getNodes( node, xPath, nsContext );
Color[] colors = new Color[clnl.size()];
for ( int i = 0; i < colors.length; i++ ) {
colors[i] = Color.decode( XMLTools.getStringValue( (Node) clnl.get( i ) ) );
}
return colors;
}
/**
* Parse Scale hint
*
* @param node
* @return ScaleHint
* @throws XMLParsingException
*/
private ScaleHint parseScaleHint( Node node )
throws XMLParsingException {
String xPath = "./deegreewmps:ScaleHint/@min";
double minScale = XMLTools.getNodeAsDouble( node, xPath, nsContext, 0 );
xPath = "./deegreewmps:ScaleHint/@max";
double maxScale = XMLTools.getNodeAsDouble( node, xPath, nsContext, Double.MAX_VALUE );
return new ScaleHint( minScale, maxScale );
}
/**
* Parse WFS Filter condition
*
* @param node
* @return Query
* @throws XMLParsingException
*/
private Query parseWFSFilterCondition( Node node )
throws XMLParsingException {
Query query = null;
String xPath = "./deegreewmps:FilterCondition/wfs:Query";
Node queryNode = XMLTools.getNode( node, xPath, nsContext );
if ( queryNode != null ) {
try {
query = Query.create( (Element) queryNode );
} catch ( Exception e ) {
throw new XMLParsingException( StringTools.stackTraceToString( e ) );
}
}
return query;
}
/**
* Parse WCS Filter Condition
*
* @param node
* @return GetCoverage
* @throws XMLParsingException
*/
private GetCoverage parseWCSFilterCondition( Node node )
throws XMLParsingException {
GetCoverage getCoverage = null;
String id = "" + IDGenerator.getInstance().generateUniqueID();
StringBuffer sd = new StringBuffer( 1000 );
sd.append( "version=1.0.0&Coverage=%default%&" );
sd.append( "CRS=EPSG:4326&BBOX=0,0,1,1&Width=1" );
sd.append( "&Height=1&Format=%default%&" );
String xPath = "./deegreewmps:FilterCondition/deegreewmps:WCSRequest";
String s = XMLTools.getNodeAsString( node, xPath, nsContext, "" );
sd.append( s );
try {
getCoverage = GetCoverage.create( id, sd.toString() );
} catch ( Exception e ) {
throw new XMLParsingException( "could not create GetCoverage from WMS "
+ "FilterCondition", e );
}
return getCoverage;
}
/**
* Returns a GetMap instance , parsing the WMS Filter condition
*
* @param node
* @return GetMap
* @throws XMLParsingException
*/
private GetMap parseWMSFilterCondition( Node node )
throws XMLParsingException {
GetMap getMap = null;
String id = "" + IDGenerator.getInstance().generateUniqueID();
StringBuffer sd = new StringBuffer( 1000 );
sd.append( "REQUEST=GetMap&LAYERS=%default%&" );
sd.append( "STYLES=&SRS=EPSG:4326&BBOX=0,0,1,1&WIDTH=1&" );
sd.append( "HEIGHT=1&FORMAT=%default%" );
Map<String, String> map1 = KVP2Map.toMap( sd.toString() );
String xPath = "./deegreewmps:FilterCondition/deegreewmps:WMSRequest";
String s = XMLTools.getRequiredNodeAsString( node, xPath, nsContext );
Map<String, String> map2 = KVP2Map.toMap( s );
if ( map2.get( "VERSION" ) == null && map2.get( "WMTVER" ) == null ) {
map2.put( "VERSION", "1.1.1" );
}
// if no service is set use WMS as default
if ( map2.get( "SERVICE" ) == null ) {
map2.put( "SERVICE", "WMS" );
}
map1.putAll( map2 );
try {
map1.put( "ID", id );
getMap = GetMap.create( map1 );
} catch ( Exception e ) {
throw new XMLParsingException( "could not create GetCoverage from WMS "
+ "FilterCondition", e );
}
return getMap;
}
/**
* Returns a list of Style elements, parsing the style element
*
* @param layerElem
* @return Style[]
* @throws XMLParsingException
*/
@Override
protected Style[] parseStyles( Element layerElem )
throws XMLParsingException {
List nl = XMLTools.getNodes( layerElem, "./Style", nsContext );
Style[] styles = new Style[nl.size()];
for ( int i = 0; i < styles.length; i++ ) {
String name = XMLTools.getRequiredNodeAsString( (Node) nl.get( i ), "./Name", nsContext );
String title = XMLTools.getNodeAsString( (Node) nl.get( i ), "./Title", nsContext, null );
String styleAbstract = XMLTools.getNodeAsString( (Node) nl.get( i ), "./Abstract",
nsContext, null );
LegendURL[] legendURLs = parseLegendURL( (Node) nl.get( i ) );
StyleURL styleURL = parseStyleURL( (Node) nl.get( i ) );
StyleSheetURL styleSheetURL = parseStyleSheetURL( (Node) nl.get( i ) );
String xPath = "deegreewmps:StyleResource";
String styleResource = XMLTools.getNodeAsString( (Node) nl.get( i ), xPath, nsContext,
"styles.xml" );
URL sr = null;
try {
sr = resolve( styleResource );
} catch ( MalformedURLException e ) {
throw new XMLParsingException( "could not parse style resource of " + "style: "
+ name, e );
}
styles[i] = new Style( name, title, styleAbstract, legendURLs, styleSheetURL, styleURL,
sr );
}
return styles;
}
}
/* *************************************************************************************************
Changes to this class. What the people have been up to:
$Log: WMPSConfigurationDocument.java,v $
Revision 1.34 2006/11/27 09:07:53 poth
JNI integration of proj4 has been removed. The CRS functionality now will be done by native deegree code.
Revision 1.33 2006/11/02 21:06:03 poth
bug fix - scale calculation
Revision 1.32 2006/10/02 06:30:35 poth
bug fixes
Revision 1.31 2006/09/22 12:51:01 mays
formatting
Revision 1.30 2006/09/13 07:37:58 deshmukh
removed excess debug statements.
Revision 1.29 2006/09/11 16:26:07 mays
use RemoteWMSDataSource from WMS instead of an own class in WMPS package
Revision 1.28 2006/08/24 06:42:17 poth
File header corrected
Revision 1.27 2006/08/10 07:11:35 deshmukh
WMPS has been modified to support the new configuration changes
and the excess code not needed has been replaced.
Revision 1.26 2006/08/01 14:20:10 deshmukh
The wmps configuration has been modified and extended. Also fixed the javadoc.
Revision 1.25 2006/08/01 13:41:47 deshmukh
The wmps configuration has been modified and extended. Also fixed the javadoc.
Revision 1.24 2006/07/31 11:21:36 deshmukh
wmps implemention...
Revision 1.23 2006/07/27 13:08:12 poth
adpation to enhancement of WMS datasource defintion (support for request time limit added)
Revision 1.22 2006/07/12 16:59:32 poth
required adaptions according to renaming of OnLineResource to OnlineResource
Revision 1.21 2006/06/12 09:34:53 deshmukh
extended the print map capabilites to support the get request and changed the db structure.
Revision 1.20 2006/06/07 12:37:51 deshmukh
Reset the changes made to the WMPS.
Revision 1.17 2006/05/18 14:06:38 poth
correction of file comment footer
************************************************************************************************ */