📄 wcscapabilitiesparser.java
字号:
/**
*
*/
package com.esri.solutions.jitk.datasources.ogc.wcs.parsing.version100;
import java.io.InputStream;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import com.esri.solutions.jitk.datasources.exceptions.ResponseParsingException;
import com.esri.solutions.jitk.datasources.ogc.wcs.URLBuilder;
import com.esri.solutions.jitk.datasources.ogc.wcs.Val;
import com.esri.solutions.jitk.datasources.ogc.wcs.info.WCSCapabilities;
import com.esri.solutions.jitk.datasources.ogc.wcs.info.WCSCoverageInfoBrief;
import com.esri.solutions.jitk.datasources.ogc.wcs.info.WCSEnvelope;
import com.esri.solutions.jitk.datasources.ogc.wcs.parsing.IWCSCapabilitiesParser;
import com.esri.solutions.jitk.datasources.ogc.wcs.parsing.WCSParserBase;
/**
* @author vlad2928
*
*/
public class WCSCapabilitiesParser extends WCSParserBase implements IWCSCapabilitiesParser {
private boolean _doResponse;
private boolean _doCoverageOfferingBrief;
private boolean _doService;
private boolean _doKeywords;
private boolean _doCapability;
private boolean _doRequest;
private boolean _doException;
private boolean _doContentMetadata;
private String _version;
private StringBuffer _request;
private StringBuffer _lonLatEnvelope;
private WCSCoverageInfoBrief _coverageInfo;
private WCSCapabilities _capabilities;
public WCSCapabilitiesParser() {
this.version = "1.0.0";
}
/* (non-Javadoc)
* @see com.esri.solutions.jitk.datasources.ogc.wcs.xml.parsing.IWCSCapabilitiesParser#parse(java.lang.String)
*/
public WCSCapabilities parse(InputStream is) throws ResponseParsingException {
super.parse(is, this);
return _capabilities;
}
@Override
public void startDocument() throws SAXException {
_doResponse = _doService = _doKeywords = _doCapability = _doRequest = _doException = _doContentMetadata = _doCoverageOfferingBrief = false;
_version = "";
_request = null;
_lonLatEnvelope = null;
_coverageInfo = null;
_capabilities = null;
_characters = null;
}
@Override
public void startElement(String uri, String localName, String name, Attributes atts) throws SAXException {
if(_doResponse) {
doResponse(name, atts);
}
if(name.equalsIgnoreCase("WCS_Capabilities") || name.equalsIgnoreCase("wcs:Capabilities")) {
_version = Val.chkStr(atts.getValue("version"));
_doResponse = (_version.equals(this.getVersion()));
if(_doResponse) {
_capabilities = new WCSCapabilities();
_capabilities.setVersion(_version);
} else {
throw new SAXException(this.getClass().getName() + " can not parse WCS GetCapabilities response ver. " + _version + ". Incompatible version.");
}
}
}
private void doResponse(String name, Attributes atts) {
_characters = new StringBuffer();
if(_doService) {
doService(name, atts);
} else if(_doCapability) {
doCapability(name, atts);
} else if(_doContentMetadata) {
doContentMetadata(name, atts);
} else if(name.equalsIgnoreCase("Service")) {
_doService = true;
} else if(name.equalsIgnoreCase("Capability")) {
_doCapability = true;
} else if(name.equalsIgnoreCase("ContentMetadata")) {
_doContentMetadata = true;
}
}
private void doService(String name, Attributes atts) {
if(name.equalsIgnoreCase("keywords")) {
_doKeywords = true;
}
}
private void doCapability(String name, Attributes atts) {
if(_doRequest) {
if(name.equalsIgnoreCase("GetCapabilities") || name.equalsIgnoreCase("DescribeCoverage") || name.equalsIgnoreCase("GetCoverage")) {
_request = new StringBuffer();
} else if(name.equalsIgnoreCase("OnlineResource")) {
_request.append("*").append(Val.chkStr(atts.getValue("xlink:href"))).append("|");
} else {
_request.append("*").append(Val.chkStr(name));
}
} else if(name.equalsIgnoreCase("Request")) {
_doRequest = true;
} else if(name.equalsIgnoreCase("Exception")) {
_doException = true;
}
}
private void doContentMetadata(String name, Attributes atts) {
if(_doCoverageOfferingBrief) {
if(name.equalsIgnoreCase("lonLatEnvelope")) {
_lonLatEnvelope = new StringBuffer();
_lonLatEnvelope.append(Val.chkStr(atts.getValue("srsName")));
}
} else if(name.equalsIgnoreCase("CoverageOfferingBrief")) {
_coverageInfo = new WCSCoverageInfoBrief();
_doCoverageOfferingBrief = true;
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
if(_doService) {
if(_doKeywords) {
if(name.equalsIgnoreCase("keyword")) {
_capabilities.getKeywords().add(_characters.toString());
} else if(name.equalsIgnoreCase("keywords")) {
_doKeywords = false;
}
} else if(name.equalsIgnoreCase("name")) {
_capabilities.setName(_characters.toString());
} else if(name.equalsIgnoreCase("label")) {
_capabilities.setLabel(Val.escapeXmlForBrowser(_characters.toString()));
} else if(name.equalsIgnoreCase("description")) {
_capabilities.setDescription(Val.escapeXmlForBrowser(_characters.toString()));
} else if(name.equalsIgnoreCase("Service")) {
_doService = false;
}
} else if(_doCapability) {
if(_doRequest) {
if(name.equalsIgnoreCase("GetCapabilities")) {
_capabilities.setGetCapabilitiesURL(getRequestGetURL());
} else if(name.equalsIgnoreCase("DescribeCoverage")) {
_capabilities.setDescribeCoverageURL(getRequestGetURL());
} else if(name.equalsIgnoreCase("GetCoverage")) {
_capabilities.setGetCoverageURL(getRequestGetURL());
} else if(name.equalsIgnoreCase("Request")) {
_doRequest = false;
}
} else if(_doException) {
if(name.equalsIgnoreCase("Format")) {
_capabilities.setExceptionFormat(_characters.toString());
} else if(name.equalsIgnoreCase("Exception")) {
_doException = false;
}
} else if(name.equalsIgnoreCase("Capability")) {
_doCapability = false;
}
} else if(_doContentMetadata) {
if(_doCoverageOfferingBrief) {
if(name.equalsIgnoreCase("name")) {
_coverageInfo.setName(_characters.toString());
} else if(name.equalsIgnoreCase("label")) {
_coverageInfo.setLabel(Val.escapeXmlForBrowser(_characters.toString()));
} else if(name.equalsIgnoreCase("description")) {
_coverageInfo.setDescription(Val.escapeXmlForBrowser(_characters.toString()));
} else if(name.equalsIgnoreCase("gml:pos")) {
_lonLatEnvelope.append("|").append(_characters);
} else if(name.equalsIgnoreCase("lonLatEnvelope")) {
_coverageInfo.setLonLatEnvelope(new WCSEnvelope(_lonLatEnvelope.toString()));
_lonLatEnvelope = null;
} else if(name.equalsIgnoreCase("CoverageOfferingBrief")) {
_capabilities.getCoverageInfos().put(_coverageInfo.getName(), _coverageInfo);
_doCoverageOfferingBrief = false;
}
} else if(name.equalsIgnoreCase("ContentMetadata")) {
_doContentMetadata = false;
}
}
}
private String getRequestGetURL() {
if(_request != null) {
String[] DCPTypes = _request.toString().split("\\|");
for(int i=0; i < DCPTypes.length; i++) {
DCPType dcpType = new DCPType(DCPTypes[i]);
if(dcpType.isGet()) {
return dcpType.getUrl();
}
}
}
return "";
}
class DCPType {
// Distributed Computing Platform descriptor
String type;
String protocol;
String url;
public DCPType(String dcpType) {
if(dcpType != null) {
String[] dcpParams = dcpType.split("\\*");
for(int i=0; i < dcpParams.length; i++) {
if(dcpParams[i].equalsIgnoreCase("HTTP")) {
protocol = dcpParams[i];
} else if(dcpParams[i].equalsIgnoreCase("Get") || dcpParams[i].equalsIgnoreCase("Post")) {
type = dcpParams[i];
} else if(i == (dcpParams.length - 1) && new URLBuilder(dcpParams[i]).isValid()) {
url = dcpParams[i];
}
}
}
}
private boolean isValid() {
return (Val.chkStr(type).length() > 0 && Val.chkStr(protocol).length() > 0 && Val.chkStr(url).length() > 0);
}
public boolean isGet() {
return isValid() && type.equalsIgnoreCase("Get");
}
public boolean isPost() {
return isValid() && type.equalsIgnoreCase("Post");
}
public String getUrl() {
return this.url;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -