⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wcscapabilitiesparser.java

📁 esri的ArcGIS Server超级学习模板程序(for java)
💻 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 + -