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><@ofbizUrl></code> and <code></@ofbizUrl></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); + } + }; } }