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 Diff line number Diff line change
Expand Up @@ -401,6 +401,7 @@ Request init(Request request) throws ServiceException, IOException {

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

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.ServiceInfo;
import org.geoserver.ows.URLMangler;
import org.geoserver.ows.util.ResponseUtils;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.wfs.WFSInfo;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
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> {

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

public AbstractHTMLMessageConverter(
Class binding,
Class<? extends ServiceInfo> serviceClass,
GeoServerResourceLoader loader,
GeoServer geoServer) {
Class binding, GeoServerResourceLoader loader, GeoServer geoServer) {
super(MediaType.TEXT_HTML);
this.binding = binding;
this.geoServer = geoServer;
this.serviceClass = serviceClass;
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");
}

@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:
*
Expand All @@ -105,11 +80,18 @@ protected HashMap<String, Object> setupModel(Object value) {
model.put("contact", geoServer.getGlobal().getSettings().getContact());
final String baseURL = getBaseURL();
model.put("baseURL", baseURL);
addServiceLinkFunctions(value, baseURL, model);
addLinkFunctions(baseURL, 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(
"serviceLink",
(TemplateMethodModel)
Expand Down Expand Up @@ -139,27 +121,16 @@ static void addServiceLinkFunctions(Object value, String baseURL, Map<String, Ob
URLMangler.URLType.EXTERNAL));
}

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

/**
* Returns the template name to be used for the object to be encoded
*
* @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);
/** Purges iterators that might have been used when walking over GeoTools features */
protected void purgeIterators() {
FreemarkerTemplateSupport.FC_FACTORY.purge();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import java.io.IOException;
import org.geoserver.catalog.ResourceInfo;
import org.geoserver.catalog.WorkspaceInfo;
import org.geoserver.ows.DispatcherCallback;
import org.geoserver.ows.LocalWorkspace;
import org.geoserver.platform.GeoServerResourceLoader;
import org.geoserver.template.DirectTemplateFeatureCollectionFactory;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public boolean canRead(Class<?> clazz, MediaType mediaType) {

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

package org.geoserver.api;

import org.geoserver.catalog.ResourceInfo;
import org.geoserver.config.GeoServer;
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 Class serviceClass;

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

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

@Override
protected ResourceInfo getResource(Object value) {
return null;
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);
}
}
}

0 comments on commit 80fbc3c

Please sign in to comment.