Author: byersa
Date: Thu Aug 16 10:14:18 2007
New Revision: 566781
URL: http://svn.apache.org/viewvc?view=rev&rev=566781
Log:
I am adding these GIS related files for safe keeping and to serve
notice that a GIS component will be forthcoming.
Actually, they work now, so it will be a matter of filling the out -
especially translating ogc filter constraints to simple method entity
expressions.
WFS is a standard in the GIS world for querying and returning metadata
(as opposed to the other two standards, WMS and WMC,
which deal with returning images from vector info or images as the
native format (coverages).
By putting a WFS server interface in OFBiz, it can be used to add
point-of-interest plotting to many business apps.
Added:
ofbiz/trunk/framework/webapp/config/wfs.properties
ofbiz/trunk/framework/webapp/script/
ofbiz/trunk/framework/webapp/script/org/
ofbiz/trunk/framework/webapp/script/org/ofbiz/
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/formatWfs.ftl
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/processWfs.ftl
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/WfsEventHandler.java
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/view/WfsViewHandler.java
Added: ofbiz/trunk/framework/webapp/config/wfs.properties
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/config/wfs.properties?view=auto&rev=566781
==============================================================================
--- ofbiz/trunk/framework/webapp/config/wfs.properties (added)
+++ ofbiz/trunk/framework/webapp/config/wfs.properties Thu Aug 16
10:14:18 2007
@@ -0,0 +1,2 @@
+input.template.path=component://webapp/script/org/ofbiz/webapp/event/processWfs.ftl
+format.template.path=component://webapp/script/org/ofbiz/webapp/event/formatWfs.ftl
\ No newline at end of file
Added:
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/formatWfs.ftl
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/formatWfs.ftl?view=auto&rev=566781
==============================================================================
---
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/formatWfs.ftl
(added)
+++
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/formatWfs.ftl
Thu Aug 16 10:14:18 2007
@@ -0,0 +1,36 @@
+<?xml version="1.0" ?>
+<wfs:FeatureCollection
+ xmlns="http://www.hotwaxmedia.com/granite"
+ xmlns:wfs="http://www.opengis.net/wfs"
+ xmlns:gml="http://www.opengis.net/gml"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ >
+
+<#list entityList as entity>
+ <gml:featureMember>
+ <#assign entityName=entity.getEntityName()/>
+ <${entityName} fid="E${entity_index}">
+ <#assign keyMap=entity.getAllFields()/>
+ <#assign keys=keyMap.keySet()/>
+ <#assign thisLongitude=""/>
+ <#assign thisLatitude=""/>
+ <#list keys as key>
+ <#assign val = (entity.get(key))?default("")/>
+ <#if key=="longitude"><#assign thisLongitude=val/></#if>
+ <#if key == "latitude"><#assign thisLatitude=val/></#if>
+ <#if key=="longitude" || key == "latitude">
+ <#if thisLongitude?has_content && thisLatitude?has_content>
+ <geoTemp>
+ <gml:Point srsName="4326">
+ <gml:pos>${thisLongitude} ${thisLatitude}</gml:pos>
+ </gml:Point>
+ </geoTemp>
+ </#if>
+ <#else>
+ <${key}>${val}</${key}>
+ </#if>
+ </#list>
+ </${entityName}>
+ </gml:featureMember>
+</#list>
+ </wfs:FeatureCollection>
\ No newline at end of file
Added:
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/processWfs.ftl
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/processWfs.ftl?view=auto&rev=566781
==============================================================================
---
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/processWfs.ftl
(added)
+++
ofbiz/trunk/framework/webapp/script/org/ofbiz/webapp/event/processWfs.ftl
Thu Aug 16 10:14:18 2007
@@ -0,0 +1,31 @@
+<#ftl ns_prefixes={"ogc":"http://ogc.org"}>
+ <simple-method method-name="processWfs"
short-description="Process a WFS request and return a simple method"
login-required="false">
+
+<#if doc?node_name == "Filter">
+ <#visit doc/>
+<#else>
+ <#recurse doc/>
+</#if>
+
+</simple-method>
+
+
+<#macro @element></#macro>
+
+
+<#macro "ogc:Filter">
+ <entity-condition list-name="entityList"
entity-name="${entityName}" filter-by-date="false" use-cache="false">
+ <#recurse .node>
+ </entity-condition>
+ <field-to-request field-name="entityList"/>
+</#macro>
+
+<#macro "ogc:PropertyIsEqualTo"><#assign
propName=.node["ogc:PropertyName"].@@text />
+ <condition-expr field-name="${propName}" value="<@getLiteral
nd=.node["ogc:Literal"] nm=propName/>"/>
+
+</#macro>
+
+<#macro "ogc:PropertyName"></#macro>
+<#macro "ogc:Literal"></#macro>
+<#macro getPropertyName nd>${nd.@@text}</#macro>
+<#macro getLiteral nd nm>${(paramMap.nm)?default(nd.@@text)}</#macro>
Added:
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/WfsEventHandler.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/WfsEventHandler.java?view=auto&rev=566781
==============================================================================
---
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/WfsEventHandler.java
(added)
+++
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/event/WfsEventHandler.java
Thu Aug 16 10:14:18 2007
@@ -0,0 +1,245 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * + * http://www.apache.org/licenses/LICENSE-2.0
+ * + * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
*******************************************************************************/
+package org.ofbiz.webapp.event ;
+
+import java.io.FileNotFoundException;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.io.Writer;
+import java.io.OutputStream;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.net.URI;
+import java.net.URL;
+import java.net.URISyntaxException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.ServletContext;
+import org.ofbiz.webapp.event.EventHandler;
+import org.ofbiz.webapp.event.EventHandlerException;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import javolution.util.FastList;
+
+import org.ofbiz.base.location.FlexibleLocation;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilMisc;
+import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.UtilFormatOut;
+import org.ofbiz.base.util.UtilProperties;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.entity.GenericDelegator;
+import org.ofbiz.minilang.method.MethodContext;
+import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.service.LocalDispatcher;
+import org.ofbiz.service.ModelService;
+import org.ofbiz.service.DispatchContext;
+import org.ofbiz.service.ServiceUtil;
+import org.ofbiz.webapp.control.RequestHandler;
+import org.ofbiz.minilang.SimpleMethod;
+
+import org.apache.xml.serialize.OutputFormat;
+import org.apache.xml.serialize.XMLSerializer;
+import org.w3c.dom.Document;
+import org.w3c.dom.DocumentFragment;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.DefaultHandler;
+
+import freemarker.ext.beans.BeansWrapper;
+import freemarker.ext.dom.NodeModel;
+import freemarker.template.Configuration;
+import freemarker.template.SimpleSequence;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+
+
+/**
+ * WfsEventHandler - WFS Event Handler implementation
+ */
+public class WfsEventHandler implements EventHandler {
+
+ public static final String module = WfsEventHandler.class.getName();
+ + public static final String InputTemplateUrl
="component://webapp/script/org/ofbiz/webapp/event/processWfs.ftl";
+
+ /**
+ * @see
org.ofbiz.webapp.event.EventHandler#init(javax.servlet.ServletContext)
+ */
+ public void init(ServletContext context) throws
EventHandlerException {
+ }
+ + /** Invoke the web event
+ [EMAIL PROTECTED] eventPath The path or location of this event
+ [EMAIL PROTECTED] eventMethod The method to invoke
+ [EMAIL PROTECTED] request The servlet request object
+ [EMAIL PROTECTED] response The servlet response object
+ [EMAIL PROTECTED] String Result code
+ [EMAIL PROTECTED] EventHandlerException
+ */
+ public String invoke(String eventPath, String eventMethod,
HttpServletRequest request, HttpServletResponse response) throws
EventHandlerException {
+ LocalDispatcher dispatcher = (LocalDispatcher)
request.getAttribute("dispatcher");
+ String typeName = null;
+ Element queryElem = null;
+
+ try {
+ Map paramMap = request.getParameterMap();
+ typeName = (String)request.getParameter("typename");
+ //determine if "get" or "post" and get "filter" param
accordingly
+ if (UtilValidate.isNotEmpty(typeName)) {
+ String queryFieldCoded =
(String)request.getParameter("filter");
+ String queryFieldDecoded =
UtilFormatOut.decodeQueryValue(queryFieldCoded);
+ Document doc =
UtilXml.readXmlDocument(queryFieldDecoded);
+ queryElem = doc.getDocumentElement();
+ } else {
+ Document doc =
UtilXml.readXmlDocument(request.getInputStream(), "WFS Request");
+ Element getFeatureElem = doc.getDocumentElement();
+ queryElem = UtilXml.firstChildElement(getFeatureElem,
"Query");
+ typeName = queryElem.getAttribute("typeName");
+ }
+ // Take "ogc:filter" element and transform it to a Simple
Method query script
+ String inputTmplUrl =
UtilProperties.getPropertyValue("wfs", "input.template.path",
WfsEventHandler.InputTemplateUrl);
+ String xmlScript = processWfsEntity(typeName, queryElem,
inputTmplUrl);
+ + // run simple method script to get a list of
entities
+ Document simpleDoc = UtilXml.readXmlDocument(xmlScript);
+ Element simpleElem = simpleDoc.getDocumentElement();
+ SimpleMethod meth = new SimpleMethod(simpleElem, null,
null);
+ MethodContext methodContext = new MethodContext(request,
response, null);
+ String retStr = meth.exec(methodContext); //Need to check
return string
+ List entityList = (List)request.getAttribute("entityList");
+ request.setAttribute("entityList", entityList);
+ + } catch (TemplateException ioe) {
+ sendError(response, "Problem handling event");
+ throw new EventHandlerException("Problem processing
template", ioe);
+ } catch (FileNotFoundException ioe) {
+ sendError(response, "Problem handling event");
+ throw new EventHandlerException("Cannot find file", ioe);
+ } catch (URISyntaxException ioe) {
+ sendError(response, "Problem handling event");
+ throw new EventHandlerException("Cannot read the input
stream", ioe);
+ } catch (SAXException ioe) {
+ sendError(response, "Problem handling event");
+ throw new EventHandlerException("Cannot read the input
stream", ioe);
+ } catch (ParserConfigurationException ioe) {
+ sendError(response, "Problem handling event");
+ throw new EventHandlerException("Cannot read the input
stream", ioe);
+ } catch (IOException ioe) {
+ sendError(response, "Problem handling event");
+ throw new EventHandlerException("Cannot read the input
stream", ioe);
+ }
+
+
+ return "success";
+ }
+
+ private void sendError(HttpServletResponse res, Object obj)
throws EventHandlerException {
+// Message msg = new Message(obj);
+
+ try {
+//
res.setContentType(msg.getContentType(Constants.DEFAULT_WFS_VERSION));
+//
res.setContentLength(Integer.parseInt(Long.toString(msg.getContentLength())));
+//
msg.writeTo(res.getOutputStream());
+// res.flushBuffer();
+ } catch (Exception e) {
+ throw new EventHandlerException(e.getMessage(), e);
+ }
+ }
+
+ private String getLocationURI(HttpServletRequest request) {
+ StringBuffer uri = new StringBuffer();
+// uri.append(request.getScheme());
+// uri.append("://");
+// uri.append(request.getServerName());
+// if (request.getServerPort() != 80 &&
request.getServerPort() != 443) {
+// uri.append(":");
+// uri.append(request.getServerPort());
+// }
+// uri.append(request.getContextPath());
+// uri.append(request.getServletPath());
+//
+// String reqInfo =
RequestHandler.getRequestUri(request.getPathInfo());
+// if (!reqInfo.startsWith("/")) {
+// reqInfo = "/" + reqInfo;
+// }
+//
+// uri.append(reqInfo);
+ return uri.toString();
+ }
+ + public static String processWfsEntity(String entityName,
Node domNode, String templatePath) throws TemplateException,
FileNotFoundException, IOException, URISyntaxException {
+ + String result = null;
+ + NodeModel nodeModel = NodeModel.wrap(domNode);
+ + Map ctx = new HashMap();
+ ctx.put("doc", nodeModel);
+ ctx.put("entityName", entityName);
+ StringWriter outWriter = new StringWriter();
+ Template template = getDocTemplate(templatePath);
+ template.process(ctx, outWriter);
+ outWriter.close();
+ result = outWriter.toString();
+
+ return result;
+ }
+ + + public static Template getDocTemplate(String fileUrl)
throws FileNotFoundException, IOException, TemplateException,
URISyntaxException { +
+ Template template = null;
+ + URL screenFileUrl =
FlexibleLocation.resolveLocation(fileUrl, null);
+ String urlStr = screenFileUrl.toString();
+ URI uri = new URI(urlStr);
+ File f = new File(uri);
+ + FileReader templateReader = new
FileReader(f);
+
+ Configuration conf = makeDefaultOfbizConfig();
+
+ template = new Template("FMImportFilter", templateReader,
conf);
+
+ return template;
+ }
+
+ public static Configuration makeDefaultOfbizConfig() throws
TemplateException, IOException {
+ Configuration config = new Configuration();
+ config.setObjectWrapper(BeansWrapper.getDefaultInstance());
+ config.setSetting("datetime_format", "yyyy-MM-dd HH:mm:ss.SSS");
+ Configuration defaultOfbizConfig = config;
+ return defaultOfbizConfig;
+ }
+}
Added:
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/view/WfsViewHandler.java
URL:
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/view/WfsViewHandler.java?view=auto&rev=566781
==============================================================================
---
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/view/WfsViewHandler.java
(added)
+++
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/view/WfsViewHandler.java
Thu Aug 16 10:14:18 2007
@@ -0,0 +1,124 @@
+/*******************************************************************************
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ * + * http://www.apache.org/licenses/LICENSE-2.0
+ * + * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+
*******************************************************************************/
+package org.ofbiz.webapp.view;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.StringWriter;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.List;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.ofbiz.base.location.FlexibleLocation;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.HttpClient;
+import org.ofbiz.base.util.HttpClientException;
+import org.ofbiz.webapp.view.ViewHandler;
+import org.ofbiz.webapp.view.ViewHandlerException;
+
+import freemarker.ext.beans.BeansWrapper;
+import freemarker.template.Configuration;
+import freemarker.template.SimpleSequence;
+import freemarker.template.Template;
+import freemarker.template.TemplateException;
+
+/**
+ * WfsViewHandler - View Handler + */
+public class WfsViewHandler implements ViewHandler {
+ + public static final String module =
WfsViewHandler.class.getName();
+ public static final String FormatTemplateUrl
="component://webapp/script/org/ofbiz/webapp/event/formatWfs.ftl";
+
+ protected ServletContext context;
+
+ public void init(ServletContext context) throws
ViewHandlerException {
+ this.context = context;
+ }
+
+ public void render(String name, String page, String info, String
contentType, String encoding, HttpServletRequest request,
HttpServletResponse response) throws ViewHandlerException {
+ // some containers call filters on EVERY request, even
forwarded ones,
+ // so let it know that it came from the control servlet
+
+ if (request == null)
+ throw new ViewHandlerException("Null HttpServletRequest
object");
+ if (page == null || page.length() == 0)
+ throw new ViewHandlerException("Null or empty source");
+
+ if (Debug.infoOn()) Debug.logInfo("Retreiving HTTP resource
at: " + page, module);
+ try {
+ String result = null;
+ + List entityList =
(List)request.getAttribute("entityList");
+ SimpleSequence simpleList = new SimpleSequence(entityList);
+ Map ctx = new HashMap();
+ ctx.put("entityList", simpleList);
+ StringWriter outWriter = new StringWriter();
+ Template template = getDocTemplate(page);
+ template.process(ctx, outWriter);
+ outWriter.close();
+ result = outWriter.toString();
+ Debug.logInfo(result, result);
+ response.getWriter().print(result);
+ } catch (FileNotFoundException e) {
+ throw new ViewHandlerException(e.getMessage(), e);
+ } catch (IOException e) {
+ throw new ViewHandlerException("IO Error in view", e);
+ } catch (URISyntaxException e) {
+ throw new ViewHandlerException(e.getMessage(), e);
+ } catch (TemplateException e) {
+ throw new ViewHandlerException(e.getMessage(), e);
+ }
+ }
+ + public static Template getDocTemplate(String fileUrl)
throws FileNotFoundException, IOException, TemplateException,
URISyntaxException { +
+ Template template = null;
+ + URL screenFileUrl =
FlexibleLocation.resolveLocation(fileUrl, null);
+ String urlStr = screenFileUrl.toString();
+ URI uri = new URI(urlStr);
+ File f = new File(uri);
+ + FileReader templateReader = new FileReader(f);
+
+ Configuration conf = makeDefaultOfbizConfig();
+
+ template = new Template("FMImportFilter", templateReader, conf);
+
+ return template;
+ }
+
+ public static Configuration makeDefaultOfbizConfig() throws
TemplateException, IOException {
+ Configuration config = new Configuration();
+ config.setObjectWrapper(BeansWrapper.getDefaultInstance());
+ config.setSetting("datetime_format", "yyyy-MM-dd HH:mm:ss.SSS");
+ Configuration defaultOfbizConfig = config;
+ return defaultOfbizConfig;
+ }
+}