No pb Adrian, was not a big deal ;) Thanks to care
Jacques Adrian Crum wrote: > 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, [email protected] 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><@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); >> + } >> + }; >> } >> }
