Skip to content

Commit

Permalink
GetFeature working
Browse files Browse the repository at this point in the history
  • Loading branch information
aaime committed Jun 23, 2019
1 parent 2b9d9a6 commit 80fbc3c
Show file tree
Hide file tree
Showing 10 changed files with 420 additions and 100 deletions.
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -401,6 +401,7 @@ Request init(Request request) throws ServiceException, IOException {


if (kvp == null || kvp.isEmpty()) { if (kvp == null || kvp.isEmpty()) {
request.setKvp(new HashMap()); request.setKvp(new HashMap());
request.setRawKvp(new HashMap());
} else { } else {
// track parsed kvp and unparsd // track parsed kvp and unparsd
Map parsedKvp = KvpUtils.normalize(kvp); Map parsedKvp = KvpUtils.normalize(kvp);
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -13,43 +13,33 @@


package org.geoserver.api; package org.geoserver.api;


import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateMethodModel;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.config.GeoServer; import org.geoserver.config.GeoServer;
import org.geoserver.config.ServiceInfo;
import org.geoserver.ows.URLMangler; import org.geoserver.ows.URLMangler;
import org.geoserver.ows.util.ResponseUtils; import org.geoserver.ows.util.ResponseUtils;
import org.geoserver.platform.GeoServerResourceLoader; import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.wfs.WFSInfo; import org.geoserver.wfs.WFSInfo;
import org.springframework.http.HttpInputMessage; import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter; import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException; import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import freemarker.template.TemplateMethodModel;


public abstract class AbstractHTMLMessageConverter<T> extends AbstractHttpMessageConverter<T> { public abstract class AbstractHTMLMessageConverter<T> extends AbstractHttpMessageConverter<T> {


protected final Class binding; protected final Class binding;
protected final GeoServer geoServer; protected final GeoServer geoServer;
protected final Class<? extends ServiceInfo> serviceClass;
protected final FreemarkerTemplateSupport templateSupport; protected final FreemarkerTemplateSupport templateSupport;


public AbstractHTMLMessageConverter( public AbstractHTMLMessageConverter(
Class binding, Class binding, GeoServerResourceLoader loader, GeoServer geoServer) {
Class<? extends ServiceInfo> serviceClass,
GeoServerResourceLoader loader,
GeoServer geoServer) {
super(MediaType.TEXT_HTML); super(MediaType.TEXT_HTML);
this.binding = binding; this.binding = binding;
this.geoServer = geoServer; this.geoServer = geoServer;
this.serviceClass = serviceClass;
this.templateSupport = new FreemarkerTemplateSupport(loader); this.templateSupport = new FreemarkerTemplateSupport(loader);
} }


Expand All @@ -69,21 +59,6 @@ protected T readInternal(Class<? extends T> clazz, HttpInputMessage inputMessage
throw new UnsupportedOperationException("HTML message conveters can only write HTML"); throw new UnsupportedOperationException("HTML message conveters can only write HTML");
} }


@Override
protected void writeInternal(T value, HttpOutputMessage outputMessage)
throws IOException, HttpMessageNotWritableException {
final ResourceInfo ri = getResource(value);
final String templateName = getTemplateName(value);
Template template = templateSupport.getTemplate(ri, templateName, serviceClass);

try {
HashMap<String, Object> model = setupModel(value);
template.process(model, new OutputStreamWriter(outputMessage.getBody()));
} catch (TemplateException e) {
throw new IOException("Error occured processing HTML template " + templateName, e);
}
}

/** /**
* Prepares the model with the usual suspects: * Prepares the model with the usual suspects:
* *
Expand All @@ -105,11 +80,18 @@ protected HashMap<String, Object> setupModel(Object value) {
model.put("contact", geoServer.getGlobal().getSettings().getContact()); model.put("contact", geoServer.getGlobal().getSettings().getContact());
final String baseURL = getBaseURL(); final String baseURL = getBaseURL();
model.put("baseURL", baseURL); model.put("baseURL", baseURL);
addServiceLinkFunctions(value, baseURL, model); addLinkFunctions(baseURL, model);
return model; return model;
} }


static void addServiceLinkFunctions(Object value, String baseURL, Map<String, Object> model) { /**
* Adds the <code>serviceLink</code>, <code>serviceLink</code> and <code>externalLinks</code>
* functions to the model, for usage in the tempalte
*
* @param baseURL
* @param model
*/
public static void addLinkFunctions(String baseURL, Map<String, Object> model) {
model.put( model.put(
"serviceLink", "serviceLink",
(TemplateMethodModel) (TemplateMethodModel)
Expand Down Expand Up @@ -139,27 +121,16 @@ static void addServiceLinkFunctions(Object value, String baseURL, Map<String, Ob
URLMangler.URLType.EXTERNAL)); URLMangler.URLType.EXTERNAL));
} }


static String getBaseURL() { protected String getBaseURL() {
RequestInfo requestInfo = RequestInfo.get(); RequestInfo requestInfo = RequestInfo.get();
if (requestInfo == null) { if (requestInfo == null) {
throw new IllegalArgumentException("Cannot extract base URL, RequestInfo is not set"); throw new IllegalArgumentException("Cannot extract base URL, RequestInfo is not set");
} }
return requestInfo.getBaseURL(); return requestInfo.getBaseURL();
} }


/** /** Purges iterators that might have been used when walking over GeoTools features */
* Returns the template name to be used for the object to be encoded protected void purgeIterators() {
* FreemarkerTemplateSupport.FC_FACTORY.purge();
* @param value }
* @return
*/
protected abstract String getTemplateName(Object value);

/**
* Returns the eventual ResourceInfo associated with the
*
* @param value
* @return
*/
protected abstract ResourceInfo getResource(Object value);
} }
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.io.IOException; import java.io.IOException;
import org.geoserver.catalog.ResourceInfo; import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.WorkspaceInfo; import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.ows.DispatcherCallback;
import org.geoserver.ows.LocalWorkspace; import org.geoserver.ows.LocalWorkspace;
import org.geoserver.platform.GeoServerResourceLoader; import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.template.DirectTemplateFeatureCollectionFactory; import org.geoserver.template.DirectTemplateFeatureCollectionFactory;
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public boolean canRead(Class<?> clazz, MediaType mediaType) {


@Override @Override
public boolean canWrite(Class<?> aClass, MediaType mediaType) { public boolean canWrite(Class<?> aClass, MediaType mediaType) {
return valueClass.isAssignableFrom(aClass) && (mediaType == null || getResponse(mediaType) != null); return valueClass.isAssignableFrom(aClass) && (mediaType == null || getResponse(mediaType).isPresent());
} }


@Override @Override
Expand Down
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -2,36 +2,47 @@
* (c) 2019 Open Source Geospatial Foundation - all rights reserved * (c) 2019 Open Source Geospatial Foundation - all rights reserved
* This code is licensed under the GPL 2.0 license, available at the root * This code is licensed under the GPL 2.0 license, available at the root
* application directory. * application directory.
*
*/ */

package org.geoserver.api; package org.geoserver.api;


import org.geoserver.catalog.ResourceInfo;
import org.geoserver.config.GeoServer; import org.geoserver.config.GeoServer;
import org.geoserver.platform.GeoServerResourceLoader; import org.geoserver.platform.GeoServerResourceLoader;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.converter.HttpMessageNotWritableException;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;

import freemarker.template.Template;
import freemarker.template.TemplateException;


public class SimpleHTTPMessageConverter extends AbstractHTMLMessageConverter { public class SimpleHTTPMessageConverter<T> extends AbstractHTMLMessageConverter<T> {


private final String templateName; private final String templateName;
private final Class serviceClass;


public SimpleHTTPMessageConverter( public SimpleHTTPMessageConverter(
Class binding, Class binding,
Class serviceClass, Class serviceClass,
GeoServerResourceLoader loader, GeoServerResourceLoader loader,
GeoServer geoServer, GeoServer geoServer,
String templateName) { String templateName) {
super(binding, serviceClass, loader, geoServer); super(binding, loader, geoServer);
this.serviceClass = serviceClass;
this.templateName = templateName; this.templateName = templateName;
} }


@Override @Override
protected String getTemplateName(Object value) { protected void writeInternal(T value, HttpOutputMessage outputMessage)
return templateName; throws IOException, HttpMessageNotWritableException {
} Template template = templateSupport.getTemplate(null, templateName, serviceClass);


@Override try {
protected ResourceInfo getResource(Object value) { HashMap<String, Object> model = setupModel(value);
return null; template.process(model, new OutputStreamWriter(outputMessage.getBody()));
} catch (TemplateException e) {
throw new IOException("Error occured processing HTML template " + templateName, e);
}
} }
} }

0 comments on commit 80fbc3c

Please sign in to comment.