I apologize for stepping on your work - it wasn't intentional. I still have more commits around the URL generation stuff.

Adrian Crum
Sandglass Software
www.sandglass-software.com

On 10/24/2013 9:31 AM, jler...@apache.org wrote:
Author: jleroux
Date: Thu Oct 24 16:31:49 2013
New Revision: 1535432

URL: http://svn.apache.org/r1535432
Log:
Merge trunk head after Adrian's revert, resolving a conflict in 
RequestHandler.java

Modified:
     ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/   (props changed)
     
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/base/src/org/ofbiz/base/util/template/FreeMarkerWorker.java
     
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/common/src/org/ofbiz/common/email/NotificationServices.java
     
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/security/src/org/ofbiz/security/SecurityFactory.java
     
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/config/freemarkerTransforms.properties
     
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/OfbizUrlBuilder.java
     
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/WebAppUtil.java
     
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java
     
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java

Propchange: ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/
------------------------------------------------------------------------------
   Merged /ofbiz/trunk:r1535158-1535430

Modified: 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/base/src/org/ofbiz/base/util/template/FreeMarkerWorker.java
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/base/src/org/ofbiz/base/util/template/FreeMarkerWorker.java?rev=1535432&r1=1535431&r2=1535432&view=diff
==============================================================================
--- 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/base/src/org/ofbiz/base/util/template/FreeMarkerWorker.java
 (original)
+++ 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/base/src/org/ofbiz/base/util/template/FreeMarkerWorker.java
 Thu Oct 24 16:31:49 2013
@@ -450,7 +450,8 @@ public class FreeMarkerWorker {
          return returnObj;
      }

-    public static Object unwrap(Object o) {
+    @SuppressWarnings("unchecked")
+    public static <T> T unwrap(Object o) {
          Object returnObj = null;

          if (o == TemplateModel.NOTHING) {
@@ -461,7 +462,7 @@ public class FreeMarkerWorker {
              returnObj = ((BeanModel) o).getWrappedObject();
          }

-        return returnObj;
+        return (T) returnObj;
      }

      public static void checkForLoop(String path, Map<String, Object> ctx) 
throws IOException {

Modified: 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/common/src/org/ofbiz/common/email/NotificationServices.java
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/common/src/org/ofbiz/common/email/NotificationServices.java?rev=1535432&r1=1535431&r2=1535432&view=diff
==============================================================================
--- 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/common/src/org/ofbiz/common/email/NotificationServices.java
 (original)
+++ 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/common/src/org/ofbiz/common/email/NotificationServices.java
 Thu Oct 24 16:31:49 2013
@@ -21,29 +21,26 @@ package org.ofbiz.common.email;
  import java.io.IOException;
  import java.io.StringWriter;
  import java.io.Writer;
-import java.net.InetAddress;
  import java.net.URL;
-import java.net.UnknownHostException;
  import java.util.Locale;
  import java.util.Map;

  import javolution.util.FastMap;

+import org.ofbiz.base.component.ComponentConfig.WebappInfo;
  import org.ofbiz.base.util.Debug;
  import org.ofbiz.base.util.UtilGenerics;
-import org.ofbiz.base.util.UtilMisc;
  import org.ofbiz.base.util.UtilProperties;
  import org.ofbiz.base.util.UtilURL;
-import org.ofbiz.base.util.UtilValidate;
  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.service.DispatchContext;
  import org.ofbiz.service.GenericServiceException;
  import org.ofbiz.service.LocalDispatcher;
  import org.ofbiz.service.ModelService;
  import org.ofbiz.service.ServiceUtil;
+import org.ofbiz.webapp.OfbizUrlBuilder;
+import org.ofbiz.webapp.WebAppUtil;

  import freemarker.template.TemplateException;

@@ -255,84 +252,17 @@ public class NotificationServices {
      public static void setBaseUrl(Delegator delegator, String webSiteId, 
Map<String, Object> context) {
          // If the baseUrl was not specified we can do a best effort instead
          if (!context.containsKey("baseUrl")) {
-            StringBuilder httpBase = null;
-            StringBuilder httpsBase = null;
-
-            String localServer = null;
-
-            String httpsPort = null;
-            String httpsServer = null;
-            String httpPort = null;
-            String httpServer = null;
-            Boolean enableHttps = null;
-
              try {
-                // using just the IP address of localhost if we don't have a 
defined server
-                InetAddress localHost = InetAddress.getLocalHost();
-                localServer = localHost.getHostAddress();
-            } catch (UnknownHostException hostException) {
-                Debug.logWarning(hostException, "Could not determine localhost, 
using '127.0.0.1'", module);
-                localServer = "127.0.0.1";
-            }
-
-            // load the properties from the website entity
-            GenericValue webSite = null;
-            if (webSiteId != null) {
-                try {
-                    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", localServer);
-            }
-            if (UtilValidate.isEmpty(httpPort)) {
-                httpPort = UtilProperties.getPropertyValue("url.properties", 
"port.http", "80");
-            }
-            if (UtilValidate.isEmpty(httpServer)) {
-                httpServer = UtilProperties.getPropertyValue("url.properties", 
"force.http.host", localServer);
-            }
-            if (UtilValidate.isEmpty(enableHttps)) {
-                enableHttps = (UtilProperties.propertyValueEqualsIgnoreCase("url.properties", 
"port.https.enabled", "Y")) ? Boolean.TRUE : Boolean.FALSE;
-            }
-
-            // prepare the (non-secure) URL
-            httpBase = new StringBuilder("http://";);
-            httpBase.append(httpServer);
-            if (!"80".equals(httpPort)) {
-                httpBase.append(":");
-                httpBase.append(httpPort);
-            }
-
-            // set the base (non-secure) URL for any messages requiring it
-            context.put("baseUrl", httpBase.toString());
-
-            if (enableHttps.booleanValue()) {
-                // prepare the (secure) URL
-                httpsBase = new StringBuilder("https://";);
-                httpsBase.append(httpsServer);
-                if (!"443".equals(httpsPort)) {
-                    httpsBase.append(":");
-                    httpsBase.append(httpsPort);
-                }
-
-                // set the base (secure) URL for any messages requiring it
-                context.put("baseSecureUrl", httpsBase.toString());
-            } else {
-                context.put("baseSecureUrl", httpBase.toString());
+                WebappInfo webAppInfo = 
WebAppUtil.getWebappInfoFromWebsiteId(webSiteId);
+                OfbizUrlBuilder builder = OfbizUrlBuilder.from(webAppInfo, 
delegator);
+                StringBuilder newURL = new StringBuilder();
+                builder.buildHostPart(newURL, "", false);
+                context.put("baseUrl", newURL.toString());
+                newURL = new StringBuilder();
+                builder.buildHostPart(newURL, "", true);
+                context.put("baseSecureUrl", newURL.toString());
+            } catch (Exception e) {
+                Debug.logWarning(e, "Exception thrown while adding baseUrl to 
context: ", module);
              }
          }
      }

Modified: 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/security/src/org/ofbiz/security/SecurityFactory.java
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/security/src/org/ofbiz/security/SecurityFactory.java?rev=1535432&r1=1535431&r2=1535432&view=diff
==============================================================================
--- 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/security/src/org/ofbiz/security/SecurityFactory.java
 (original)
+++ 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/security/src/org/ofbiz/security/SecurityFactory.java
 Thu Oct 24 16:31:49 2013
@@ -120,7 +120,7 @@ public final class SecurityFactory {

          @Override
          public boolean hasEntityPermission(String entity, String action, 
GenericValue userLogin) {
-            if (userLogin == null) return false;
+            if (userLogin == null || entity == null || action == null) return 
false;
              String permission = entity.concat(action);
              String adminPermission = entity.concat("_ADMIN");
              Iterator<GenericValue> iterator = 
findUserLoginSecurityGroupByUserLoginId(userLogin.getString("userLoginId"));

Modified: 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/config/freemarkerTransforms.properties
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/config/freemarkerTransforms.properties?rev=1535432&r1=1535431&r2=1535432&view=diff
==============================================================================
--- 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/config/freemarkerTransforms.properties
 (original)
+++ 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/config/freemarkerTransforms.properties
 Thu Oct 24 16:31:49 2013
@@ -21,7 +21,8 @@

  # entries are in the form: key=transform name, property=transform class name

-ofbizUrl=org.ofbiz.webapp.ftl.OfbizUrlTransform
+#ofbizUrl=org.ofbiz.webapp.ftl.OfbizUrlTransform
+ofbizUrl=org.ofbiz.product.category.ftl.UrlRegexpTransform
  ofbizContentUrl=org.ofbiz.webapp.ftl.OfbizContentTransform
  ofbizCurrency=org.ofbiz.webapp.ftl.OfbizCurrencyTransform
  ofbizAmount=org.ofbiz.webapp.ftl.OfbizAmountTransform

Modified: 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/OfbizUrlBuilder.java
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/OfbizUrlBuilder.java?rev=1535432&r1=1535431&r2=1535432&view=diff
==============================================================================
--- 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/OfbizUrlBuilder.java
 (original)
+++ 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/OfbizUrlBuilder.java
 Thu Oct 24 16:31:49 2013
@@ -166,9 +166,6 @@ public final class OfbizUrlBuilder {
                  buffer.append(":").append(webSiteProps.getHttpPort());
              }
          }
-        if (Debug.warningOn() && requestMap == null) {
-            Debug.logWarning("The request-map URI '" + requestMapUri + "' was not 
found in controller.xml", module);
-        }
          return makeSecure;
      }


Modified: 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/WebAppUtil.java
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/WebAppUtil.java?rev=1535432&r1=1535431&r2=1535432&view=diff
==============================================================================
--- 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/WebAppUtil.java
 (original)
+++ 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/WebAppUtil.java
 Thu Oct 24 16:31:49 2013
@@ -29,6 +29,7 @@ import org.apache.catalina.deploy.WebXml
  import org.apache.catalina.startup.DigesterFactory;
  import org.apache.catalina.startup.WebRuleSet;
  import org.apache.tomcat.util.digester.Digester;
+import org.ofbiz.base.component.ComponentConfig;
  import org.ofbiz.base.component.ComponentConfig.WebappInfo;
  import org.ofbiz.base.util.Assert;
  import org.ofbiz.base.util.Debug;
@@ -86,6 +87,24 @@ public final class WebAppUtil {
      }

      /**
+     * Returns the <code>WebappInfo</code> instance associated to the 
specified web site ID.
+     * Throws <code>IllegalArgumentException</code> if the web site ID was not 
found.
+     *
+     * @param webSiteId
+     * @throws IOException
+     * @throws SAXException
+     */
+    public static WebappInfo getWebappInfoFromWebsiteId(String webSiteId) 
throws IOException, SAXException {
+        Assert.notNull("webSiteId", webSiteId);
+        for (WebappInfo webAppInfo : 
ComponentConfig.getAllWebappResourceInfos()) {
+            if (webSiteId.equals(WebAppUtil.getWebSiteId(webAppInfo))) {
+                return webAppInfo;
+            }
+        }
+        throw new IllegalArgumentException("Web site ID '" + webSiteId + "' not 
found.");
+    }
+
+    /**
       * Returns the web site ID - as configured in the web application's 
<code>web.xml</code> file,
       * or <code>null</code> if no web site ID was found.
       *

Modified: 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java?rev=1535432&r1=1535431&r2=1535432&view=diff
==============================================================================
--- 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java
 (original)
+++ 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/control/RequestHandler.java
 Thu Oct 24 16:31:49 2013
@@ -20,7 +20,6 @@ package org.ofbiz.webapp.control;

  import static org.ofbiz.base.util.UtilGenerics.checkMap;

-import java.io.IOException;
  import java.io.Serializable;
  import java.io.UnsupportedEncodingException;
  import java.net.URL;
@@ -50,7 +49,6 @@ import org.ofbiz.base.util.UtilValidate;
  import org.ofbiz.entity.Delegator;
  import org.ofbiz.entity.GenericEntityException;
  import org.ofbiz.entity.GenericValue;
-import org.ofbiz.webapp.OfbizUrlBuilder;
  import org.ofbiz.webapp.event.EventFactory;
  import org.ofbiz.webapp.event.EventHandler;
  import org.ofbiz.webapp.event.EventHandlerException;
@@ -870,10 +868,11 @@ public class RequestHandler {
          // attempt to override the default view with a call back into the 
control servlet,
          // so just get the target view name and use that
          String servletName = req.getServletPath();
-        if (UtilValidate.isNotEmpty(servletName) && servletName.length() > 1) {
+        if (UtilValidate.isNotEmpty(servletName) && servletName.length() > 1
+                || servletName.startsWith("/")) {
              servletName = servletName.substring(1);
          }
-
+
          if (Debug.infoOn()) Debug.logInfo("Rendering View [" + view + "], 
sessionId=" + UtilHttp.getSessionId(req), module);
          if (view.startsWith(servletName + "/")) {
              view = view.substring(servletName.length() + 1);
@@ -1011,6 +1010,15 @@ public class RequestHandler {
          }
      }

+    /**
+     * Returns a URL String that contains only the scheme and host parts. This 
method
+     * should not be used because it ignores settings in the WebSite entity.
+     *
+     * @param request
+     * @param secure
+     * @deprecated Use OfbizUrlBuilder
+     */
+    @Deprecated
      public static String getDefaultServerRootUrl(HttpServletRequest request, 
boolean secure) {
          String httpsPort = UtilProperties.getPropertyValue("url.properties", 
"port.https", "443");
          String httpsServer = UtilProperties.getPropertyValue("url.properties", 
"force.https.host");
@@ -1117,40 +1125,55 @@ public class RequestHandler {
      }

      public String makeLink(HttpServletRequest request, HttpServletResponse 
response, String url, boolean fullPath, boolean secure, boolean encode) {
-        OfbizUrlBuilder builder = (OfbizUrlBuilder) 
request.getAttribute("_OFBIZ_URL_BUILDER_");
-        if (builder == null) {
+        WebSiteProperties webSiteProps = (WebSiteProperties) 
request.getAttribute("_WEBSITE_PROPS_");
+        if (webSiteProps == null) {
              try {
-                builder = OfbizUrlBuilder.from(request);
-                request.setAttribute("_OFBIZ_URL_BUILDER_", builder);
+                webSiteProps = WebSiteProperties.from(request);
+                request.setAttribute("_WEBSITE_PROPS_", webSiteProps);
              } catch (GenericEntityException e) {
                  // If the entity engine is throwing exceptions, then there is 
no point in continuing.
                  Debug.logError(e, "Exception thrown while getting web site 
properties: ", module);
                  return null;
+            }
+        }
+        String requestUri = RequestHandler.getRequestUri(url);
+        ConfigXMLReader.RequestMap requestMap = null;
+        if (requestUri != null) {
+            try {
+                requestMap = 
getControllerConfig().getRequestMapMap().get(requestUri);
              } catch (WebAppConfigurationException e) {
                  // If we can't read the controller.xml file, then there is no 
point in continuing.
                  Debug.logError(e, "Exception thrown while parsing controller.xml 
file: ", module);
                  return null;
              }
          }
+        StringBuilder newURL = new StringBuilder();
          boolean didFullSecure = false;
          boolean didFullStandard = false;
-        StringBuilder newURL = new StringBuilder(250);
-        if (fullPath) {
-            try {
-                boolean usesHttps = builder.buildHostPart(newURL, url, secure);
-                if (usesHttps) {
-                    didFullSecure = true;
-                } else {
-                    didFullStandard = true;
+        if (requestMap != null && (webSiteProps.getEnableHttps() || fullPath 
|| secure)) {
+            if (Debug.verboseOn()) Debug.logVerbose("In makeLink requestUri=" 
+ requestUri, module);
+            if (secure || (webSiteProps.getEnableHttps() && requestMap.securityHttps 
&& !request.isSecure())) {
+                String server = webSiteProps.getHttpsHost();
+                if (server.isEmpty()) {
+                    server = request.getServerName();
+                }
+                newURL.append("https://";);
+                newURL.append(server);
+                if (!webSiteProps.getHttpsPort().isEmpty()) {
+                    newURL.append(":").append(webSiteProps.getHttpsPort());
+                }
+                didFullSecure = true;
+            } else if (fullPath || (webSiteProps.getEnableHttps() && 
!requestMap.securityHttps && request.isSecure())) {
+                String server = webSiteProps.getHttpHost();
+                if (server.isEmpty()) {
+                    server = request.getServerName();
+                }
+                newURL.append("http://";);
+                newURL.append(server);
+                if (!webSiteProps.getHttpPort().isEmpty()) {
+                    newURL.append(":").append(webSiteProps.getHttpPort());
                  }
-            } catch (WebAppConfigurationException e) {
-                // If we can't read the controller.xml file, then there is no 
point in continuing.
-                Debug.logError(e, "Exception thrown while parsing controller.xml 
file: ", module);
-                return null;
-            } catch (IOException e) {
-                // If we can't write to the buffer, then there is no point in 
continuing.
-                Debug.logError(e, "Exception thrown while appending to 
StringBuilder: ", module);
-                return null;
+                didFullStandard = true;
              }
          }
          // create the path to the control servlet

Modified: 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java
URL: 
http://svn.apache.org/viewvc/ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java?rev=1535432&r1=1535431&r2=1535432&view=diff
==============================================================================
--- 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java
 (original)
+++ 
ofbiz/branches/OFBIZ-5312-ofbiz-ecommerce-seo-2013-10-23/framework/webapp/src/org/ofbiz/webapp/ftl/OfbizUrlTransform.java
 Thu Oct 24 16:31:49 2013
@@ -18,253 +18,153 @@
   
*******************************************************************************/
  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("unchecked")
-    public 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());
+    @SuppressWarnings("rawtypes")
+    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;
+    }
+
+    private static String convertToString(Object o) {
+        String result = "";
+        if (o != null) {
+            if (Debug.verboseOn())
+                Debug.logVerbose("Arg Object : " + o.getClass().getName(), 
module);
+            if (o instanceof TemplateScalarModel) {
+                TemplateScalarModel s = (TemplateScalarModel) o;
+                try {
+                    result = s.getAsString();
+                } catch (TemplateModelException e) {
+                    Debug.logError(e, "Template Exception", module);
+                }
+            } else {
+                result = o.toString();
              }
-            return defaultValue;
          }
+        return result;
      }

-    @SuppressWarnings("unchecked")
+    @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 write(char cbuf[], int off, int len) {
-                buf.append(cbuf, off, len);
-            }
-
-            @Override
-            public void flush() throws IOException {
-                out.flush();
-            }

              @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");
+                    // 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(httpPort)) {
-                            httpPort = UtilProperties.getPropertyValue("url.properties", 
"port.http", "80");
-                        }
-                        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);
-                            }
-                        }
-                        // 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;
-                                        }
-                                    }
-                                }
-                            } catch (SAXException e) {
-                                Debug.logWarning(e, e.getMessage(), module);
-                            } catch (ParserConfigurationException e) {
-                                Debug.logWarning(e, e.getMessage(), module);
-                            }
-                            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);
+                        out.write(prefixString + bufString);
+                        return;
+                    }
+                    HttpServletRequest request = 
FreeMarkerWorker.unwrap(env.getVariable("request"));
+                    // Handle web site ID.
+                    if (!webSiteId.isEmpty()) {
+                        Delegator delegator = 
FreeMarkerWorker.unwrap(env.getVariable("delegator"));
+                        if (request != null && delegator == null) {
+                            delegator = (Delegator) 
request.getAttribute("delegator");
+                        }
+                        if (delegator == null) {
+                            throw new IllegalStateException("Delegator not 
found");
+                        }
+                        WebappInfo webAppInfo = 
WebAppUtil.getWebappInfoFromWebsiteId(webSiteId);
+                        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");
                          }
-                        newURL.append("/");
-                        // make requestUrl
-                        String requestUrl = buf.toString();
-                        newURL.append(requestUrl);
-                        out.write(newURL.toString());
-                    } else if (req != null) {
-                        HttpServletRequest request = (HttpServletRequest) 
req.getWrappedObject();
+                        out.write(newUrl);
+                        return;
+                    }
+                    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);
                  }
              }
-        };
-    }
-    private static String getArg(Map args, String key) {
-        String  result = "";
-        Object o = args.get(key);
-        if (o != null) {
-            if (Debug.verboseOn()) Debug.logVerbose("Arg Object : " + 
o.getClass().getName(), module);
-            if (o instanceof TemplateScalarModel) {
-                TemplateScalarModel s = (TemplateScalarModel) o;
-                try {
-                    result = s.getAsString();
-                } catch (TemplateModelException e) {
-                    Debug.logError(e, "Template Exception", module);
-                }
-            } else {
-              result = o.toString();
+
+            @Override
+            public void flush() throws IOException {
+                out.flush();
              }
-        }
-        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
+            public void write(char cbuf[], int off, int len) {
+                buf.append(cbuf, off, len);
+            }
+        };
      }
  }


Reply via email to