Author: adrianc
Date: Thu Oct 24 00:45:51 2013
New Revision: 1535246

URL: http://svn.apache.org/r1535246
Log:
Code cleanup and JavaDocs in OfbizUrlTransform.java.

If a web site ID is specified, the transform does not require a 
HttpServletRequest object - so the transform will work in scheduled services.

Modified:
    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java

Modified: 
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java
URL: 
http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java?rev=1535246&r1=1535245&r2=1535246&view=diff
==============================================================================
--- 
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java 
(original)
+++ 
ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java 
Thu Oct 24 00:45:51 2013
@@ -18,67 +18,62 @@
  
*******************************************************************************/
 package org.ofbiz.webapp.ftl;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.Writer;
+import java.net.URLEncoder;
 import java.util.Map;
 
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import javax.xml.parsers.ParserConfigurationException;
 
 import org.ofbiz.base.component.ComponentConfig;
 import org.ofbiz.base.component.ComponentConfig.WebappInfo;
 import org.ofbiz.base.util.Debug;
-import org.ofbiz.base.util.UtilMisc;
-import org.ofbiz.base.util.UtilProperties;
-import org.ofbiz.base.util.UtilValidate;
-import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.template.FreeMarkerWorker;
 import org.ofbiz.entity.Delegator;
-import org.ofbiz.entity.GenericEntityException;
-import org.ofbiz.entity.GenericValue;
+import org.ofbiz.webapp.OfbizUrlBuilder;
+import org.ofbiz.webapp.WebAppUtil;
 import org.ofbiz.webapp.control.RequestHandler;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
 
 import freemarker.core.Environment;
-import freemarker.ext.beans.BeanModel;
 import freemarker.template.SimpleScalar;
 import freemarker.template.TemplateModelException;
 import freemarker.template.TemplateScalarModel;
 import freemarker.template.TemplateTransformModel;
 
 /**
- * OfbizUrlTransform - Freemarker Transform for URLs (links)
+ * Freemarker Transform for creating OFBiz URLs (links).
+ * <p>This transform accepts several arguments:<br>
+ * <ul>
+ * <li><b>fullPath</b> (true/false) - generate a full URL including scheme and 
host, defaults to false.</li>
+ * <li><b>secure</b> (true/false) - generate a secure (https) URL, defaults to 
false. Server settings will
+ * override this argument.</li>
+ * <li><b>encode</b> (true/false) - encode the URL, defaults to true. Encoding 
is UTF-8.</li>
+ * <li><b>webSiteId</b> - generate a full URL using the web site settings 
found in the WebSite entity.</li>
+ * </ul></p>
+ * <p>In addition, this transform accepts an environment variable - 
<b>urlPrefix</b>. If the variable
+ * exists, it is prepended to the contents of the transform (the part between
+ * <code>&lt;@ofbizUrl&gt;</code> and <code>&lt;/@ofbizUrl&gt;</code>), and 
all transform arguments are
+ * ignored.</p>
+ * 
  */
 public class OfbizUrlTransform implements TemplateTransformModel {
 
     public final static String module = OfbizUrlTransform.class.getName();
 
     @SuppressWarnings("rawtypes")
-    private static boolean checkArg(Map args, String key, boolean 
defaultValue) {
-        if (!args.containsKey(key)) {
-            return defaultValue;
-        } else {
-            Object o = args.get(key);
-            if (o instanceof SimpleScalar) {
-                SimpleScalar s = (SimpleScalar) o;
-                return "true".equalsIgnoreCase(s.getAsString());
-            }
-            return defaultValue;
+    private static boolean checkBooleanArg(Map args, String key, boolean 
defaultValue) {
+        Object o = args.get(key);
+        if (o instanceof SimpleScalar) {
+            SimpleScalar s = (SimpleScalar) o;
+            return "true".equalsIgnoreCase(s.getAsString());
         }
+        return defaultValue;
     }
 
-    @SuppressWarnings("rawtypes")
-    private static String getArg(Map args, String key) {
+    private static String convertToString(Object o) {
         String result = "";
-        Object o = args.get(key);
         if (o != null) {
             if (Debug.verboseOn())
                 Debug.logVerbose("Arg Object : " + o.getClass().getName(), 
module);
@@ -96,168 +91,72 @@ public class OfbizUrlTransform implement
         return result;
     }
 
-    private static String getTagValue(String sTag, Element eElement) {
-        String value = "";
-        try {
-            NodeList nlList = 
eElement.getElementsByTagName(sTag).item(0).getChildNodes();
-            Node nValue = nlList.item(0);
-            return value = nValue.getNodeValue();
-        } catch (Exception e) {
-            return value;
-        }
-    }
-
+    @Override
     @SuppressWarnings("rawtypes")
     public Writer getWriter(final Writer out, Map args) {
         final StringBuilder buf = new StringBuilder();
-        final boolean fullPath = checkArg(args, "fullPath", false);
-        final boolean secure = checkArg(args, "secure", false);
-        final boolean encode = checkArg(args, "encode", true);
-        final String webSiteId = getArg(args, "webSiteId");
+        final boolean fullPath = checkBooleanArg(args, "fullPath", false);
+        final boolean secure = checkBooleanArg(args, "secure", false);
+        final boolean encode = checkBooleanArg(args, "encode", true);
+        final String webSiteId = convertToString(args.get("webSiteId"));
 
         return new Writer(out) {
+
             @Override
             public void close() throws IOException {
                 try {
                     Environment env = Environment.getCurrentEnvironment();
-                    BeanModel req = (BeanModel) env.getVariable("request");
-                    BeanModel res = (BeanModel) env.getVariable("response");
-                    Object prefix = env.getVariable("urlPrefix");
-                    if (UtilValidate.isNotEmpty(webSiteId)) {
-                        HttpServletRequest request = (HttpServletRequest) 
req.getWrappedObject();
-                        Delegator delegator = (Delegator) 
request.getAttribute("delegator");
-                        String httpsPort = null;
-                        String httpsServer = null;
-                        String httpPort = null;
-                        String httpServer = null;
-                        Boolean enableHttps = null;
-                        StringBuilder newURL = new StringBuilder();
-                        // make prefix url
-                        try {
-                            GenericValue webSite = 
delegator.findOne("WebSite", UtilMisc.toMap("webSiteId", webSiteId), true);
-                            if (webSite != null) {
-                                httpsPort = webSite.getString("httpsPort");
-                                httpsServer = webSite.getString("httpsHost");
-                                httpPort = webSite.getString("httpPort");
-                                httpServer = webSite.getString("httpHost");
-                                enableHttps = 
webSite.getBoolean("enableHttps");
-                            }
-                        } catch (GenericEntityException e) {
-                            Debug.logWarning(e, "Problems with WebSite entity; 
using global defaults", module);
-                        }
-                        // fill in any missing properties with fields from the 
global file
-                        if (UtilValidate.isEmpty(httpsPort)) {
-                            httpsPort = 
UtilProperties.getPropertyValue("url.properties", "port.https", "443");
-                        }
-                        if (UtilValidate.isEmpty(httpsServer)) {
-                            httpsServer = 
UtilProperties.getPropertyValue("url.properties", "force.https.host");
-                        }
-                        if (UtilValidate.isEmpty(httpPort)) {
-                            httpPort = 
UtilProperties.getPropertyValue("url.properties", "port.http", "80");
+                    // Handle prefix.
+                    String prefixString = 
convertToString(env.getVariable("urlPrefix"));
+                    if (!prefixString.isEmpty()) {
+                        String bufString = buf.toString();
+                        boolean prefixSlash = prefixString.endsWith("/");
+                        boolean bufSlash = bufString.startsWith("/");
+                        if (prefixSlash && bufSlash) {
+                            bufString = bufString.substring(1);
+                        } else if (!prefixSlash && !bufSlash) {
+                            bufString = "/" + bufString;
                         }
-                        if (UtilValidate.isEmpty(httpServer)) {
-                            httpServer = 
UtilProperties.getPropertyValue("url.properties", "force.http.host");
-                        }
-                        if (enableHttps == null) {
-                            enableHttps = 
UtilProperties.propertyValueEqualsIgnoreCase("url.properties", 
"port.https.enabled", "Y");
-                        }
-                        if (secure && enableHttps) {
-                            String server = httpsServer;
-                            if (UtilValidate.isEmpty(server)) {
-                                server = request.getServerName();
-                            }
-                            newURL.append("https://";);
-                            newURL.append(httpsServer);
-                            newURL.append(":").append(httpsPort);
-                        } else {
-                            newURL.append("http://";);
-                            newURL.append(httpServer);
-                            if (!"80".equals(httpPort)) {
-                                newURL.append(":").append(httpPort);
-                            }
+                        out.write(prefixString + bufString);
+                        return;
+                    }
+                    HttpServletRequest request = 
FreeMarkerWorker.unwrap(env.getVariable("request"));
+                    Delegator delegator = 
FreeMarkerWorker.unwrap(env.getVariable("delegator"));
+                    if (request != null && delegator == null) {
+                        delegator = (Delegator) 
request.getAttribute("delegator");
+                    }
+                    // Handle web site ID.
+                    if (!webSiteId.isEmpty()) {
+                        if (delegator == null) {
+                            throw new IllegalStateException("Delegator not 
found");
                         }
-                        // make mount point
-                        String mountPoint = null;
                         for (WebappInfo webAppInfo : 
ComponentConfig.getAllWebappResourceInfos()) {
-                            File file = new File(webAppInfo.getLocation() + 
"/WEB-INF/web.xml");
-                            if (!file.exists()) {
-                                continue;
-                            }
-                            InputStream is = new FileInputStream(file);
-                            try {
-                                Document doc = UtilXml.readXmlDocument(is, 
true, null);
-                                NodeList nList = 
doc.getElementsByTagName("context-param");
-                                for (int temp = 0; temp < nList.getLength(); 
temp++) {
-                                    Node nNode = nList.item(temp);
-                                    if (nNode.getNodeType() == 
Node.ELEMENT_NODE) {
-                                        Element eElement = (Element) nNode;
-                                        String paramName = 
getTagValue("param-name", eElement);
-                                        String paramValue = 
getTagValue("param-value", eElement);
-                                        if ("webSiteId".equals(paramName) && 
webSiteId.equals(paramValue)) {
-                                            mountPoint = 
webAppInfo.getContextRoot();
-                                            break;
-                                        }
-                                    }
+                            if 
(webSiteId.equals(WebAppUtil.getWebSiteId(webAppInfo))) {
+                                StringBuilder newUrlBuff = new 
StringBuilder(250);
+                                OfbizUrlBuilder builder = 
OfbizUrlBuilder.from(webAppInfo, delegator);
+                                builder.buildFullUrl(newUrlBuff, 
buf.toString(), secure);
+                                String newUrl = newUrlBuff.toString();
+                                if (encode) {
+                                    newUrl = URLEncoder.encode(newUrl, 
"UTF-8");
                                 }
-                            } catch (SAXException e) {
-                                Debug.logWarning(e, e.getMessage(), module);
-                            } catch (ParserConfigurationException e) {
-                                Debug.logWarning(e, e.getMessage(), module);
+                                out.write(newUrl);
+                                return;
                             }
-                            if (UtilValidate.isNotEmpty(mountPoint)) {
-                                if (mountPoint.length() > 1)
-                                    newURL.append(mountPoint);
-                                break;
-                            }
-                        }
-                        // make the path the the control servlet
-                        String controlPath = (String) 
request.getAttribute("_CONTROL_PATH_");
-                        String[] patch = controlPath.split("/");
-                        String patchStr = null;
-                        if (patch.length > 0) {
-                            patchStr = patch[patch.length - 1];
                         }
-                        if (UtilValidate.isNotEmpty(patchStr)) {
-                            newURL.append("/");
-                            newURL.append(patchStr);
-                        }
-                        newURL.append("/");
-                        // make requestUrl
-                        String requestUrl = buf.toString();
-                        newURL.append(requestUrl);
-                        out.write(newURL.toString());
-                    } else if (req != null) {
-                        HttpServletRequest request = (HttpServletRequest) 
req.getWrappedObject();
+                        throw new IllegalArgumentException("Web site ID '" + 
webSiteId + "' not found.");
+                    }
+                    if (request != null) {
                         ServletContext ctx = (ServletContext) 
request.getAttribute("servletContext");
-                        HttpServletResponse response = null;
-                        if (res != null) {
-                            response = (HttpServletResponse) 
res.getWrappedObject();
-                        }
-
+                        HttpServletResponse response = 
FreeMarkerWorker.unwrap(env.getVariable("response"));
                         String requestUrl = buf.toString();
-
-                        // make the link
                         RequestHandler rh = (RequestHandler) 
ctx.getAttribute("_REQUEST_HANDLER_");
                         out.write(rh.makeLink(request, response, requestUrl, 
fullPath, secure, encode));
-                    } else if (prefix != null) {
-                        if (prefix instanceof TemplateScalarModel) {
-                            TemplateScalarModel s = (TemplateScalarModel) 
prefix;
-                            String prefixString = s.getAsString();
-                            String bufString = buf.toString();
-                            boolean prefixSlash = prefixString.endsWith("/");
-                            boolean bufSlash = bufString.startsWith("/");
-                            if (prefixSlash && bufSlash) {
-                                bufString = bufString.substring(1);
-                            } else if (!prefixSlash && !bufSlash) {
-                                bufString = "/" + bufString;
-                            }
-                            out.write(prefixString + bufString);
-                        }
                     } else {
                         out.write(buf.toString());
                     }
-                } catch (TemplateModelException e) {
-                    throw new IOException(e.getMessage());
+                } catch (Exception e) {
+                    Debug.logWarning(e, "Exception thrown while running 
ofbizUrl transform", module);
+                    throw new IOException(e);
                 }
             }
 


Reply via email to