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