/* 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.geoserver.wms.kvp;
import java.lang.reflect.Constructor;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.geoserver.config.GeoServer;
import org.geoserver.config.ServiceInfo;
import org.geoserver.config.impl.GeoServerImpl;
import org.geoserver.ows.HttpServletRequestAware;
import org.geoserver.ows.KvpRequestReader;
import org.geoserver.ows.adapters.KvpRequestReaderAdapter;
import org.geoserver.wms.WMS;
import org.geoserver.wms.WMSInfo;
/**
* Bridge towards the old the old kvp readers that injects the proper service info object in the
* superclass
*
* @author Andrea Aime
* @author Gabriel Roldan
*/
public class WMSKvpRequestReaderAdapter extends KvpRequestReader implements HttpServletRequestAware {
private org.vfny.geoserver.util.requests.readers.KvpRequestReader delegate;
Class<? extends org.vfny.geoserver.util.requests.readers.KvpRequestReader> delegateClass;
HttpServletRequest request;
private WMS wms;
public WMSKvpRequestReaderAdapter(final Class requestBean, final Class delegateClass,
final WMS wms) {
super(requestBean);
this.delegateClass = delegateClass;
this.wms = wms;
}
public void setHttpRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public Object createRequest() throws Exception {
// simulate the old kvp processin
Map kvp = new HashMap();
String paramName;
String paramValue;
for (Enumeration pnames = request.getParameterNames(); pnames.hasMoreElements();) {
paramName = (String) pnames.nextElement();
paramValue = request.getParameter(paramName);
kvp.put(paramName.toUpperCase(), paramValue);
}
// look for a constructor, may have to walk up teh class hierachy
Constructor constructor = findConstructor();
// create an instance of the delegate
this.delegate = (org.vfny.geoserver.util.requests.readers.KvpRequestReader) constructor
.newInstance(new Object[] { kvp, wms });
// create the request object
return delegate.getRequest(request);
}
@Override
public Object read(Object request, Map kvp, Map rawKvp) throws Exception {
Constructor constructor = findConstructor();
// create an instance of the delegate
this.delegate = (org.vfny.geoserver.util.requests.readers.KvpRequestReader) constructor
.newInstance(new Object[] { kvp, wms });
// create the request object
return delegate.getRequest(this.request);
}
private Constructor findConstructor() {
// look for a constructor, may have to walk up teh class hierachy
Class clazz = WMS.class;
Constructor constructor = null;
while (clazz != null && constructor == null) {
try {
constructor = delegateClass.getConstructor(new Class[] { Map.class, clazz });
} catch (NoSuchMethodException e) {
Class[] classes = clazz.getInterfaces();
for (Class c : classes) {
try {
constructor = delegateClass.getConstructor(new Class[] { Map.class, c });
} catch (NoSuchMethodException e2) {
// no harm done
}
}
clazz = clazz.getSuperclass();
}
}
if (constructor == null) {
throw new IllegalStateException("No appropriate constructor");
}
return constructor;
}
}