📄 dispatcher.java
字号:
boolean found = false;
Version version = new Version(req.version);
for (Iterator s = loadServices().iterator(); s.hasNext();) {
Service service = (Service) s.next();
if (version.equals(service.getVersion())) {
found = true;
break;
}
}
if (!found) {
throw new ServiceException("Invalid version: " + req.version,
"InvalidParameterValue", "version");
}
}
if (req.service == null) {
//give up
throw new ServiceException("Could not determine service",
"MissingParameterValue", "service");
}
}
}
return new Operation(req.request, serviceDescriptor, operation, parameters);
}
String lookupRequestBeanProperty(Object requestBean, String property, boolean allowDefaultValues) {
if (requestBean instanceof EObject && EMFUtils.has((EObject) requestBean, property)) {
//special case hack for eObject, we should move
// this out into an extension ppint
EObject eObject = (EObject) requestBean;
if (allowDefaultValues || EMFUtils.isSet(eObject, property)) {
return normalize((String) EMFUtils.get(eObject, property));
}
} else {
//straight reflection
String version = (String) OwsUtils.property(requestBean, property, String.class);
if (version != null) {
return normalize(version);
}
}
return null;
}
Object execute(Request req, Operation opDescriptor)
throws Throwable {
Service serviceDescriptor = opDescriptor.getService();
Object serviceBean = serviceDescriptor.getService();
Method operation = opDescriptor.getMethod();
Object[] parameters = opDescriptor.getParameters();
//step 5: execute
Object result = null;
try {
if (securityInterceptor != null) {
result = securityInterceptor.invoke(opDescriptor, operation, serviceBean, parameters);
} else {
result = operation.invoke(serviceBean, parameters);
}
} catch (InvocationTargetException e) {
if (e.getTargetException() != null) {
throw e.getTargetException();
}
}
return result;
}
void response(Object result, Request req, Operation opDescriptor)
throws Throwable {
//step 6: write response
if (result != null) {
//look up respones
List responses = GeoServerExtensions.extensions(Response.class);
//first filter by binding, and canHandle
O: for (Iterator itr = responses.iterator(); itr.hasNext();) {
Response response = (Response) itr.next();
Class binding = response.getBinding();
if (!binding.isAssignableFrom(result.getClass())
|| !response.canHandle(opDescriptor)) {
itr.remove();
continue;
}
//filter by output format
Set outputFormats = response.getOutputFormats();
if ((req.outputFormat != null) && (!outputFormats.isEmpty())
&& !outputFormats.contains(req.outputFormat)) {
//must do a case insensitive check
for ( Iterator of = outputFormats.iterator(); of.hasNext(); ) {
String outputFormat = (String) of.next();
if( req.outputFormat.equalsIgnoreCase( outputFormat ) ) {
continue O;
}
}
itr.remove();
}
}
if (responses.isEmpty()) {
String msg = "No response: ( object = " + result.getClass();
if (req.outputFormat != null) {
msg += (", outputFormat = " + req.outputFormat);
}
msg += " )";
throw new RuntimeException(msg);
}
if (responses.size() > 1) {
//sort by class hierarchy
Collections.sort(responses,
new Comparator() {
public int compare(Object o1, Object o2) {
Class c1 = ((Response) o1).getBinding();
Class c2 = ((Response) o2).getBinding();
if (c1.equals(c2)) {
return 0;
}
if (c1.isAssignableFrom(c2)) {
return 1;
}
if (c2.isAssignableFrom(c1)) {
;
}
return -1;
}
});
//check first two and make sure bindings are not equal
Response r1 = (Response) responses.get(0);
Response r2 = (Response) responses.get(1);
if (r1.getBinding().equals(r2.getBinding())) {
String msg = "Multiple responses: (" + result.getClass() + ")";
throw new RuntimeException(msg);
}
}
Response response = (Response) responses.get(0);
//load the output strategy to be used
ServiceStrategy outputStrategy = findOutputStrategy(req.httpResponse);
if (outputStrategy == null) {
outputStrategy = new DefaultOutputStrategy();
}
//set the mime type
req.httpResponse.setContentType(response.getMimeType(result, opDescriptor));
//set any extra headers, other than the mime-type
if (response.getHeaders(result, opDescriptor) != null) {
String[][] headers = response.getHeaders(result, opDescriptor);
for (int i = 0; i < headers.length; i++) {
req.httpResponse.addHeader(headers[i][0], headers[i][1]);
}
}
//TODO: initialize any header params (gzip,deflate,etc...)
OutputStream output = outputStrategy.getDestination(req.httpResponse);
response.write(result, output, opDescriptor);
outputStrategy.flush(req.httpResponse);
//flush the underlying out stream for good meaure
req.httpResponse.getOutputStream().flush();
}
}
Collection loadServices() {
Collection services = GeoServerExtensions.extensions(Service.class);
if (!(new HashSet(services).size() == services.size())) {
String msg = "Two identical service descriptors found";
throw new IllegalStateException(msg);
}
return services;
}
Service findService(String id, String ver) throws ServiceException {
Version version = (ver != null) ? new Version(ver) : null;
Collection services = loadServices();
//first just match on service,request
List matches = new ArrayList();
for (Iterator itr = services.iterator(); itr.hasNext();) {
Service sBean = (Service) itr.next();
if (sBean.getId().equalsIgnoreCase(id)) {
matches.add(sBean);
}
}
if (matches.isEmpty()) {
String msg = "No service: ( " + id + " )";
throw new ServiceException(msg, "InvalidParameterValue", "service");
}
Service sBean = null;
//if multiple, use version to filter match
if (matches.size() > 1) {
List vmatches = new ArrayList(matches);
//match up the version
if (version != null) {
//version specified, look for a match
for (Iterator itr = vmatches.iterator(); itr.hasNext();) {
Service s = (Service) itr.next();
if (version.equals(s.getVersion())) {
continue;
}
itr.remove();
}
if (vmatches.isEmpty()) {
//no matching version found, drop out and next step
// will sort to return highest version
vmatches = new ArrayList(matches);
}
}
//multiple services found, sort by version
if (vmatches.size() > 1) {
//use highest version
Comparator comparator = new Comparator() {
public int compare(Object o1, Object o2) {
Service s1 = (Service) o1;
Service s2 = (Service) o2;
return s1.getVersion().compareTo(s2.getVersion());
}
};
Collections.sort(vmatches, comparator);
}
sBean = (Service) vmatches.get(vmatches.size() - 1);
} else {
//only a single match, that was easy
sBean = (Service) matches.get(0);
}
return sBean;
}
Collection loadKvpRequestReaders() {
Collection kvpReaders = GeoServerExtensions.extensions(KvpRequestReader.class);
if (!(new HashSet(kvpReaders).size() == kvpReaders.size())) {
String msg = "Two identical kvp readers found";
throw new IllegalStateException(msg);
}
return kvpReaders;
}
KvpRequestReader findKvpRequestReader(Class type) {
Collection kvpReaders = loadKvpRequestReaders();
List matches = new ArrayList();
for (Iterator itr = kvpReaders.iterator(); itr.hasNext();) {
KvpRequestReader kvpReader = (KvpRequestReader) itr.next();
if (kvpReader.getRequestBean().isAssignableFrom(type)) {
matches.add(kvpReader);
}
}
if (matches.isEmpty()) {
//try to instantiate one
String msg = "No kvp reader: ( " + type + " )";
throw new RuntimeException(msg);
}
if (matches.size() > 1) {
//sort by class hierarchy
Comparator comparator = new Comparator() {
public int compare(Object o1, Object o2) {
KvpRequestReader kvp1 = (KvpRequestReader) o1;
KvpRequestReader kvp2 = (KvpRequestReader) o2;
if (kvp2.getRequestBean().isAssignableFrom(kvp1.getRequestBean())) {
return -1;
}
return 1;
}
};
Collections.sort(matches, comparator);
}
return (KvpRequestReader) matches.get(0);
}
Collection loadXmlReaders() {
Collection xmlReaders = GeoServerExtensions.extensions(XmlRequestReader.class);
if (!(new HashSet(xmlReaders).size() == xmlReaders.size())) {
String msg = "Two identical xml readers found";
throw new IllegalStateException(msg);
}
return xmlReaders;
}
XmlRequestReader findXmlReader(String namespace, String element, /*String serviceId,*/ String ver) {
Collection xmlReaders = loadXmlReaders();
//first just match on namespace, element
List matches = new ArrayList();
for (Iterator itr = xmlReaders.iterator(); itr.hasNext();) {
XmlRequestReader xmlReader = (XmlRequestReader) itr.next();
QName xmlElement = xmlReader.getElement();
if (xmlElement.getLocalPart().equalsIgnoreCase(element)) {
if (xmlElement.getNamespaceURI().equalsIgnoreCase(namespace)) {
matches.add(xmlReader);
}
}
}
if (matches.isEmpty()) {
//do a more lax serach, search only on the element name if the
// namespace was unspecified
if ( namespace == null || namespace.equals( "" ) ) {
String msg = "No namespace specified in request, searching for "
+ " xml reader by element name only";
logger.info( msg );
for ( Iterator itr = xmlReaders.iterator(); itr.hasNext(); ) {
XmlRequestReader xmlReader = (XmlRequestReader) itr.next();
if ( xmlReader.getElement().getLocalPart().equals( element ) ) {
matches.add( xmlReader );
}
}
if ( !matches.isEmpty() ) {
//we found some matches, make sure they are all in the
// same namespace
Iterator itr = matches.iterator();
XmlRequestReader first = (XmlRequestReader) itr.next();
while( itr.hasNext() ) {
XmlRequestReader xmlReader = (XmlRequestReader ) itr.next();
if ( !first.getElement().equals( xmlReader.getElement() ) ) {
//abort
matches.clear();
break;
}
}
}
}
}
if ( matches.isEmpty() ) {
String msg = "No xml reader: (" + namespace + "," + element + ")";
logger.info(msg);
return null;
}
XmlRequestReader xmlReader = null;
//if multiple, use version to filter match
if (matches.size() > 1) {
List vmatches = new ArrayList(matches);
//match up the version and the service
if (ver != null) {
Version version = new Version(ver);
//version specified, look for a match
for (Iterator itr = vmatches.iterator(); itr.hasNext();) {
XmlRequestReader r = (XmlRequestReader) itr.next();
if (version.equals(r.getVersion())) {
continue;
}
itr.remove();
}
if (vmatches.isEmpty()) {
//no matching version found, drop out and next step
// will sort to return highest version
vmatches = new ArrayList(matches);
}
}
//multiple readers found, sort by version and by service match
if (vmatches.size() > 1) {
//use highest version
Comparator comparator = new Comparator() {
public int compare(Object o1, Object o2) {
XmlRequestReader r1 = (XmlRequestReader) o1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -