📄 wmscapstransformer.java
字号:
/* Copyright (c) 2001 - 2007 TOPP - www.openplans.org. All rights reserved.
* This code is licensed under the GPL 2.0 license, availible at the root
* application directory.
*/
package org.vfny.geoserver.wms.responses.helpers;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import org.apache.commons.collections.comparators.ReverseComparator;
import org.apache.xalan.transformer.TransformerIdentityImpl;
import org.geoserver.ows.util.RequestUtils;
import org.geoserver.platform.GeoServerExtensions;
import org.geotools.geometry.GeneralEnvelope;
import org.geotools.referencing.CRS;
import org.geotools.resources.CRSUtilities;
import org.geotools.styling.Style;
import org.geotools.xml.transform.TransformerBase;
import org.geotools.xml.transform.Translator;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import org.springframework.context.ApplicationContext;
import org.vfny.geoserver.global.CoverageInfo;
import org.vfny.geoserver.global.CoverageInfoLabelComparator;
import org.vfny.geoserver.global.Data;
import org.vfny.geoserver.global.FeatureTypeInfo;
import org.vfny.geoserver.global.FeatureTypeInfoTitleComparator;
import org.vfny.geoserver.global.GeoServer;
import org.vfny.geoserver.global.LegendURL;
import org.vfny.geoserver.global.MapLayerInfo;
import org.vfny.geoserver.global.MetaDataLink;
import org.vfny.geoserver.global.WMS;
import org.vfny.geoserver.util.requests.CapabilitiesRequest;
import org.vfny.geoserver.wms.requests.GetLegendGraphicRequest;
import org.vfny.geoserver.wms.responses.DescribeLayerResponse;
import org.vfny.geoserver.wms.responses.GetFeatureInfoResponse;
import org.vfny.geoserver.wms.responses.GetLegendGraphicResponse;
import org.xml.sax.ContentHandler;
import org.xml.sax.helpers.AttributesImpl;
import java.util.Collections;
import com.vividsolutions.jts.geom.Envelope;
/**
* Geotools xml framework based encoder for a Capabilities WMS 1.1.1 document.
*
* @author Gabriel Roldan, Axios Engineering
* @version $Id
*/
public class WMSCapsTransformer extends TransformerBase {
/** fixed MIME type for the returned capabilities document */
public static final String WMS_CAPS_MIME = "application/vnd.ogc.wms_xml";
/** DOCUMENT ME! */
private String baseUrl;
private Set formats;
private ApplicationContext applicationContext;
/**
* Creates a new WMSCapsTransformer object.
*
* @param baseUrl
* needed to get the schema base URL
* @param formats
* @param applicationContext
*
* @throws NullPointerException
* if <code>schemaBaseUrl</code> is null;
*/
public WMSCapsTransformer(String baseUrl, Set formats,
ApplicationContext applicationContext) {
super();
this.formats = formats;
if (baseUrl == null) {
throw new NullPointerException();
}
this.baseUrl = baseUrl;
this.setNamespaceDeclarationEnabled(false);
this.applicationContext = applicationContext;
}
/**
* DOCUMENT ME!
*
* @param handler
* DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public Translator createTranslator(ContentHandler handler) {
return new CapabilitiesTranslator(handler, formats, applicationContext);
}
/**
* Gets the <code>Transformer</code> created by the overriden method in
* the superclass and adds it the system DOCTYPE token pointing to the
* Capabilities DTD on this server instance.
*
* <p>
* The DTD is set at the fixed location given by the
* <code>schemaBaseUrl</code> passed to the constructor <code>+
* "wms/1.1.1/WMS_MS_Capabilities.dtd</code>.
* </p>
*
* @return a Transformer propoerly configured to produce DescribeLayer
* responses.
*
* @throws TransformerException
* if it is thrown by <code>super.createTransformer()</code>
*/
public Transformer createTransformer() throws TransformerException {
Transformer transformer = super.createTransformer();
GeoServer gs = (GeoServer)GeoServerExtensions.extensions(GeoServer.class, applicationContext).get(0);
String dtdUrl = RequestUtils.proxifiedBaseURL(this.baseUrl,gs.getProxyBaseUrl()) +
"schemas/wms/1.1.1/WMS_MS_Capabilities.dtd"; // DJB: fixed this to
// point to correct
// location
transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, dtdUrl);
return transformer;
}
/**
* DOCUMENT ME!
*
* @author Gabriel Roldan, Axios Engineering
* @version $Id
*/
private static class CapabilitiesTranslator extends TranslatorSupport {
/** DOCUMENT ME! */
private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger(CapabilitiesTranslator.class.getPackage()
.getName());
/** DOCUMENT ME! */
private static final String EPSG = "EPSG:";
/** DOCUMENT ME! */
private static AttributesImpl wmsVersion = new AttributesImpl();
/** DOCUMENT ME! */
private static final String XLINK_NS = "http://www.w3.org/1999/xlink";
static {
wmsVersion.addAttribute("", "version", "version", "", "1.1.1");
}
/**
* The request from wich all the information needed to produce the
* capabilities document can be obtained
*/
private CapabilitiesRequest request;
private Set formats;
private ApplicationContext applicationContext;
/**
* Creates a new CapabilitiesTranslator object.
*
* @param handler
* content handler to send sax events to.
*/
public CapabilitiesTranslator(ContentHandler handler, Set formats,
ApplicationContext applicationContext) {
super(handler, null, null);
this.formats = formats;
this.applicationContext = applicationContext;
}
/**
* DOCUMENT ME!
*
* @param o
* the <code>CapabilitiesRequest</code>
*
* @throws IllegalArgumentException
* DOCUMENT ME!
*/
public void encode(Object o) throws IllegalArgumentException {
if (!(o instanceof CapabilitiesRequest)) {
throw new IllegalArgumentException();
}
this.request = (CapabilitiesRequest) o;
if (LOGGER.isLoggable(Level.FINE)) {
LOGGER.fine(new StringBuffer("producing a capabilities document for ").append(
request).toString());
}
start("WMT_MS_Capabilities", wmsVersion);
handleService();
handleCapability();
end("WMT_MS_Capabilities");
}
/**
* Encodes the service metadata section of a WMS capabilities document.
*/
private void handleService() {
WMS wms = (WMS) request.getServiceRef().getServiceRef();
start("Service");
element("Name", "OGC:WMS");
element("Title", wms.getTitle());
element("Abstract", wms.getAbstract());
handleKeywordList(wms.getKeywords());
AttributesImpl orAtts = new AttributesImpl();
orAtts.addAttribute("", "xmlns:xlink", "xmlns:xlink", "", XLINK_NS);
orAtts.addAttribute(XLINK_NS, "xlink:type", "xlink:type", "", "simple");
orAtts.addAttribute("", "xlink:href", "xlink:href", "",
RequestUtils.proxifiedBaseURL(request.getBaseUrl(),wms.getGeoServer().getProxyBaseUrl()) + "wms");
element("OnlineResource", null, orAtts);
handleContactInfo(wms.getGeoServer());
element("Fees", wms.getFees());
element("AccessConstraints", wms.getAccessConstraints());
end("Service");
}
/**
* Encodes contact information in the WMS capabilities document
* @param geoServer
*/
public void handleContactInfo(GeoServer geoServer) {
start("ContactInformation");
start("ContactPersonPrimary");
element("ContactPerson", geoServer.getContactPerson());
element("ContactOrganization", geoServer.getContactOrganization());
end("ContactPersonPrimary");
element("ContactPosition", geoServer.getContactPosition());
start("ContactAddress");
element("AddressType", geoServer.getAddressType());
element("Address", geoServer.getAddress());
element("City", geoServer.getAddressCity());
element("StateOrProvince", geoServer.getAddressState());
element("PostCode", geoServer.getAddressPostalCode());
element("Country", geoServer.getAddressCountry());
end("ContactAddress");
element("ContactVoiceTelephone", geoServer.getContactVoice());
element("ContactFacsimileTelephone", geoServer.getContactFacsimile());
element("ContactElectronicMailAddress", geoServer.getContactEmail());
end("ContactInformation");
}
/**
* Turns the keyword list to XML
*
* @param keywords
*/
private void handleKeywordList(List keywords) {
start("KeywordList");
if (keywords != null) {
for (Iterator it = keywords.iterator(); it.hasNext();) {
element("Keyword", String.valueOf(it.next()));
}
}
end("KeywordList");
}
/**
* Turns the metadata URL list to XML
*
* @param keywords
*/
private void handleMetadataList(List metadataURLs) {
if (metadataURLs == null) {
return;
}
for (Iterator it = metadataURLs.iterator(); it.hasNext();) {
MetaDataLink link = (MetaDataLink) it.next();
AttributesImpl lnkAtts = new AttributesImpl();
lnkAtts.addAttribute("", "type", "type", "", link.getMetadataType());
start("MetadataURL", lnkAtts);
element("Format", link.getType());
AttributesImpl orAtts = new AttributesImpl();
orAtts.addAttribute("", "xmlns:xlink", "xmlns:xlink", "", XLINK_NS);
orAtts.addAttribute(XLINK_NS, "xlink:type", "xlink:type", "", "simple");
orAtts.addAttribute("", "xlink:href", "xlink:href", "", link.getContent());
element("OnlineResource", null, orAtts);
end("MetadataURL");
}
}
/**
* Encodes the capabilities metadata section of a WMS capabilities
* document
*/
private void handleCapability() {
start("Capability");
handleRequest();
handleException();
handleSLD();
handleLayers();
end("Capability");
}
/**
* DOCUMENT ME!
*/
private void handleRequest() {
start("Request");
start("GetCapabilities");
element("Format", WMS_CAPS_MIME);
String serviceUrl =
RequestUtils.proxifiedBaseURL(request.getBaseUrl(), request.getServiceRef().getGeoServer().getProxyBaseUrl()) +
"wms?SERVICE=WMS&";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -