/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cismap.commons.wfs.capabilities.deegree;
import org.apache.log4j.Logger;
import org.deegree.ogcwebservices.getcapabilities.InvalidCapabilitiesException;
import org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilitiesDocument;
import org.deegree.ogcwebservices.wfs.capabilities.WFSFeatureType;
import org.xml.sax.SAXException;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import de.cismet.cismap.commons.capabilities.Service;
import de.cismet.cismap.commons.exceptions.BadHttpStatusCodeException;
import de.cismet.cismap.commons.exceptions.ParserException;
import de.cismet.cismap.commons.wfs.FeatureTypeDescription;
import de.cismet.cismap.commons.wfs.ResponseParserFactory;
import de.cismet.cismap.commons.wfs.WFSFacade;
import de.cismet.cismap.commons.wfs.capabilities.FeatureType;
import de.cismet.cismap.commons.wfs.capabilities.WFSCapabilities;
import de.cismet.cismap.commons.wfs.deegree.DeegreeFeatureTypeDescription;
import de.cismet.cismap.commons.wms.capabilities.FeatureTypeList;
import de.cismet.tools.CalculationCache;
import de.cismet.tools.Calculator;
/**
* Parses WFS Capabilities documents.
*
* @author therter
* @version $Revision$, $Date$
*/
public class DeegreeWFSCapabilities implements WFSCapabilities {
//~ Static fields/initializers ---------------------------------------------
private static final Logger logger = Logger.getLogger(DeegreeWFSCapabilities.class);
//~ Instance fields --------------------------------------------------------
private org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilities cap;
private CalculationCache<String, FeatureTypeList> cache = new CalculationCache<String, FeatureTypeList>(
new FeatureTypeListRetriever());
private URL url;
private Service service;
private WFSFacade facade;
//~ Constructors -----------------------------------------------------------
/**
* Creates a new DeegreeWFSCapabilities object.
*
* @param in DOCUMENT ME!
* @param link DOCUMENT ME!
*
* @throws InvalidCapabilitiesException DOCUMENT ME!
* @throws IOException DOCUMENT ME!
* @throws SAXException DOCUMENT ME!
*/
public DeegreeWFSCapabilities(final InputStream in, final String link) throws InvalidCapabilitiesException,
IOException,
SAXException {
String urlString = link;
final WFSCapabilitiesDocument parser = new WFSCapabilitiesDocument();
if (urlString.indexOf("?") != -1) {
urlString = urlString.substring(0, urlString.indexOf("?"));
}
this.url = new URL(urlString);
parser.load(in, link);
cap = (org.deegree.ogcwebservices.wfs.capabilities.WFSCapabilities)parser.parseCapabilities();
}
//~ Methods ----------------------------------------------------------------
@Override
public FeatureTypeList getFeatureTypeList() throws IOException, Exception {
// the String "id" is arbitrarily value that is only required to fulfil the
// requirement of the class CalculationCache
return cache.calcValue("id");
}
@Override
public Service getService() {
if (service == null) {
service = new DeegreeService(cap.getServiceProvider(), cap.getServiceIdentification());
}
return service;
}
@Override
public String getVersion() {
return cap.getVersion();
}
@Override
public URL getURL() {
return url;
}
@Override
public WFSFacade getServiceFacade() {
if (facade == null) {
facade = new WFSFacade(this, new DeegreeResponseParserFactory());
}
return facade;
}
//~ Inner Classes ----------------------------------------------------------
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class FeatureTypeListRetriever implements Calculator<String, FeatureTypeList> {
//~ Methods ------------------------------------------------------------
@Override
public FeatureTypeList calculate(final String input) throws Exception {
final FeatureTypeList list = new FeatureTypeList();
final org.deegree.ogcwebservices.wfs.capabilities.FeatureTypeList tmpList = cap.getFeatureTypeList();
for (final WFSFeatureType type : tmpList.getFeatureTypes()) {
if (type == null) {
logger.error("TEST feature type == null " + type);
}
final DeegreeFeatureType tmpType = new DeegreeFeatureType(type, DeegreeWFSCapabilities.this);
list.put(tmpType.getName(), tmpType);
}
return list;
}
}
/**
* DOCUMENT ME!
*
* @version $Revision$, $Date$
*/
private class DeegreeResponseParserFactory implements ResponseParserFactory {
//~ Methods ------------------------------------------------------------
@Override
public FeatureTypeDescription getFeatureTypeDescription(final String featureTypeDescription,
final FeatureType feature) throws ParserException {
return new DeegreeFeatureTypeDescription(featureTypeDescription, feature);
}
}
}