You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ofbiz.apache.org by Jacopo Cappellato <ja...@hotwaxmedia.com> on 2012/11/19 14:31:39 UTC

Re: svn commit: r1032472 - in /ofbiz/trunk/framework: birt/src/org/ofbiz/birt/ birt/src/org/ofbiz/birt/email/ birt/src/org/ofbiz/birt/report/servlet/ birt/src/org/ofbiz/birt/webapp/view/ catalina/src/org/ofbiz/catalina/container/ common/webcommon/ entity/e...

Hi Hans, Chattree,

I have a question about the changes to ContextFilter.java in this commit related to the selection of the Tenant record matching the domainname: does it mean that if a matching record is found then the tenant selected by the user at login is automatically overridden?
Is this the intended behavior?

Thanks,

Jacopo

On Nov 8, 2010, at 7:54 AM, hansbak@apache.org wrote:

> Author: hansbak
> Date: Mon Nov  8 06:54:17 2010
> New Revision: 1032472
> 
> URL: http://svn.apache.org/viewvc?rev=1032472&view=rev
> Log:
> next to setting of the tenent id, now also the initial mountpoint if entered also refactoring:
> - set delegator, dispatcher and security from session, servlet context or request's attribute to app context of birt engine before render and send email
> - add the initialPath field to Tenant entity
> - create the tenant context which as a default servlet using org.ofbiz.webapp.control.TenantServlet in the catalina container and check the multitenant property for initial the tenant context with root mount /
> - move the changing a multi tenant delegator statement from ControlServlet to ContextFilter that could apply to every servlets
> (implementation by Chattree Richard)
> 
> Added:
>    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java
> Modified:
>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java
>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java
>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java
>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java
>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java
>    ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>    ofbiz/trunk/framework/common/webcommon/login.ftl
>    ofbiz/trunk/framework/entity/entitydef/entitymodel.xml
>    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
>    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java
> 
> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java (original)
> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java Mon Nov  8 06:54:17 2010
> @@ -23,6 +23,11 @@ import java.sql.SQLException;
> import java.util.Locale;
> import java.util.Map;
> 
> +import javax.servlet.ServletContext;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +import javax.servlet.http.HttpSession;
> +
> import org.eclipse.birt.report.engine.api.EXCELRenderOption;
> import org.eclipse.birt.report.engine.api.EngineException;
> import org.eclipse.birt.report.engine.api.HTMLRenderOption;
> @@ -36,7 +41,11 @@ import org.eclipse.birt.report.engine.ap
> import org.ofbiz.base.util.Debug;
> import org.ofbiz.base.util.GeneralException;
> import org.ofbiz.base.util.UtilGenerics;
> +import org.ofbiz.base.util.UtilValidate;
> import org.ofbiz.birt.container.BirtContainer;
> +import org.ofbiz.entity.Delegator;
> +import org.ofbiz.security.Security;
> +import org.ofbiz.service.LocalDispatcher;
> 
> public class BirtWorker {
> 
> @@ -138,4 +147,45 @@ public class BirtWorker {
>         task.run();
>         task.close();
>     }
> +    
> +    public static void setWebContextObjects(IReportEngine engine, HttpServletRequest request, HttpServletResponse response) {
> +        HttpSession session = request.getSession();
> +        ServletContext servletContext = session.getServletContext();
> +        
> +        // set delegator
> +        Delegator delegator = (Delegator) session.getAttribute("delegator");
> +        if (UtilValidate.isEmpty(delegator)) {
> +            delegator = (Delegator) servletContext.getAttribute("delegator");
> +        }
> +        if (UtilValidate.isEmpty(delegator)) {
> +            delegator = (Delegator) request.getAttribute("delegator");
> +        }
> +        if (UtilValidate.isNotEmpty(delegator)) {
> +            engine.getConfig().getAppContext().put("delegator", delegator);
> +        }
> +
> +        // set delegator
> +        LocalDispatcher dispatcher = (LocalDispatcher) session.getAttribute("dispatcher");
> +        if (UtilValidate.isEmpty(dispatcher)) {
> +            dispatcher = (LocalDispatcher) servletContext.getAttribute("dispatcher");
> +        }
> +        if (UtilValidate.isEmpty(dispatcher)) {
> +            dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
> +        }
> +        if (UtilValidate.isNotEmpty(dispatcher)) {
> +            engine.getConfig().getAppContext().put("dispatcher", dispatcher);
> +        }
> +
> +        // set security
> +        Security security = (Security) session.getAttribute("security");
> +        if (UtilValidate.isEmpty(security)) {
> +            security = (Security) servletContext.getAttribute("security");
> +        }
> +        if (UtilValidate.isEmpty(security)) {
> +            security = (Security) request.getAttribute("security");
> +        }
> +        if (UtilValidate.isNotEmpty(security)) {
> +            engine.getConfig().getAppContext().put("security", dispatcher);
> +        }
> +    }
> }
> 
> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java (original)
> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java Mon Nov  8 06:54:17 2010
> @@ -46,6 +46,8 @@ import org.ofbiz.base.util.string.Flexib
> import org.ofbiz.birt.BirtWorker;
> import org.ofbiz.birt.container.BirtContainer;
> import org.ofbiz.common.email.NotificationServices;
> +import org.ofbiz.entity.Delegator;
> +import org.ofbiz.security.Security;
> import org.ofbiz.service.DispatchContext;
> import org.ofbiz.service.LocalDispatcher;
> import org.ofbiz.service.ServiceUtil;
> @@ -69,7 +71,10 @@ public class BirtEmailServices {
>      */
>     public static Map<String, Object> sendBirtMail(DispatchContext ctx, Map<String, ? extends Object> context) {
>         Map<String, Object> serviceContext = UtilMisc.makeMapWritable(context);
> +        Delegator delegator = ctx.getDelegator();
>         LocalDispatcher dispatcher = ctx.getDispatcher();
> +        Security security = ctx.getSecurity();
> +        
>         String webSiteId = (String) serviceContext.remove("webSiteId");
>         String bodyText = (String) serviceContext.remove("bodyText");
>         String bodyScreenUri = (String) serviceContext.remove("bodyScreenUri");
> @@ -153,11 +158,14 @@ public class BirtEmailServices {
>                     birtContentType = "application/pdf";
>                 }
>                 IReportEngine engine = BirtContainer.getReportEngine();
> +                engine.getConfig().getAppContext().put("delegator", delegator);
> +                engine.getConfig().getAppContext().put("dispatcher", dispatcher);
> +                engine.getConfig().getAppContext().put("security", security);
> +                
>                 InputStream reportInputStream = BirtFactory.getReportInputStreamFromLocation(birtReportLocation);
>                 IReportRunnable design = engine.openReportDesign(reportInputStream);
> -                     Debug.logInfo("Export report as content type:" + birtContentType, module);
> -                     BirtWorker.exportReport(design, context, birtContentType, baos);
> -                // and generate the PDF
> +                Debug.logInfo("Export report as content type:" + birtContentType, module);
> +                BirtWorker.exportReport(design, context, birtContentType, baos);
>                 baos.flush();
>                 baos.close();
> 
> 
> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java (original)
> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java Mon Nov  8 06:54:17 2010
> @@ -24,9 +24,12 @@ import javax.servlet.http.HttpServletRes
> 
> import org.eclipse.birt.core.exception.BirtException;
> import org.eclipse.birt.report.context.IContext;
> +import org.eclipse.birt.report.engine.api.IReportEngine;
> import org.eclipse.birt.report.presentation.aggregation.layout.EngineFragment;
> import org.eclipse.birt.report.presentation.aggregation.layout.RequesterFragment;
> import org.eclipse.birt.report.service.BirtReportServiceFactory;
> +import org.ofbiz.birt.BirtWorker;
> +import org.ofbiz.birt.container.BirtContainer;
> import org.ofbiz.birt.report.context.OFBizBirtContext;
> import org.ofbiz.birt.report.service.OFBizBirtViewerReportService;
> 
> @@ -52,6 +55,9 @@ public class BirtEngineServlet extends o
>     protected IContext __getContext( HttpServletRequest request,
>             HttpServletResponse response ) throws BirtException
>     {
> +        IReportEngine reportEngine = BirtContainer.getReportEngine();
> +        BirtWorker.setWebContextObjects(reportEngine, request, response);
> +        
>         BirtReportServiceFactory.getReportService( ).setContext(
>                 getServletContext( ), null );
>         return new OFBizBirtContext( request, response );
> 
> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java (original)
> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java Mon Nov  8 06:54:17 2010
> @@ -24,10 +24,13 @@ import javax.servlet.http.HttpServletRes
> 
> import org.eclipse.birt.core.exception.BirtException;
> import org.eclipse.birt.report.context.IContext;
> +import org.eclipse.birt.report.engine.api.IReportEngine;
> import org.eclipse.birt.report.presentation.aggregation.layout.FramesetFragment;
> import org.eclipse.birt.report.presentation.aggregation.layout.RunFragment;
> import org.eclipse.birt.report.service.BirtReportServiceFactory;
> import org.eclipse.birt.report.servlet.ViewerServlet;
> +import org.ofbiz.birt.BirtWorker;
> +import org.ofbiz.birt.container.BirtContainer;
> import org.ofbiz.birt.report.context.OFBizBirtContext;
> import org.ofbiz.birt.report.service.OFBizBirtViewerReportService;
> 
> @@ -56,6 +59,9 @@ public class BirtViewerServlet extends V
>     protected IContext __getContext( HttpServletRequest request,
>             HttpServletResponse response ) throws BirtException
>     {
> +        IReportEngine reportEngine = BirtContainer.getReportEngine();
> +        BirtWorker.setWebContextObjects(reportEngine, request, response);
> +        
>         BirtReportServiceFactory.getReportService( ).setContext(
>                 getServletContext( ), null );
>         return new OFBizBirtContext( request, response );
> 
> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java (original)
> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java Mon Nov  8 06:54:17 2010
> @@ -70,6 +70,7 @@ public class BirtViewHandler implements 
>     public void render(String name, String page, String info,
>             String contentType, String encoding, HttpServletRequest request,
>             HttpServletResponse response) throws ViewHandlerException {
> +        
>         try {
>             IReportEngine engine = BirtContainer.getReportEngine();
>             // open report design
> @@ -80,6 +81,8 @@ public class BirtViewHandler implements 
>             } else {
>                 design = engine.openReportDesign(servletContext.getRealPath(page));
>             }
> +            
> +            BirtWorker.setWebContextObjects(engine, request, response);
> 
>             Map<String, Object> context = FastMap.newInstance();
>             // set parameters from request
> 
> Modified: ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java (original)
> +++ ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java Mon Nov  8 06:54:17 2010
> @@ -67,6 +67,7 @@ import org.ofbiz.base.container.Containe
> import org.ofbiz.base.container.ContainerConfig.Container.Property;
> import org.ofbiz.base.util.Debug;
> import org.ofbiz.base.util.SSLUtil;
> +import org.ofbiz.base.util.UtilProperties;
> import org.ofbiz.base.util.UtilURL;
> import org.ofbiz.base.util.UtilValidate;
> import org.ofbiz.base.util.UtilXml;
> @@ -620,6 +621,43 @@ public class CatalinaContainer implement
>         return context;
>     }
> 
> +    protected Context createTenantContext() throws ContainerException {
> +        String server = "default-server";
> +        Engine engine = engines.get(server);
> +        if (engine == null) {
> +            Debug.logWarning("Server with name [" + server + "] not found;", module);
> +            return null;
> +        }
> +        
> +        // create the web application context
> +        StandardContext context = (StandardContext) embedded.createContext("/", System.getProperty("ofbiz.home"));
> +        context.setJ2EEApplication(J2EE_APP);
> +        context.setJ2EEServer(J2EE_SERVER);
> +        context.setLoader(embedded.createLoader(ClassLoaderContainer.getClassLoader()));
> +        context.setReloadable(contextReloadable);
> +        context.setDistributable(distribute);
> +        context.setCrossContext(crossContext);
> +
> +        
> +        // create the Default Servlet instance to mount
> +        StandardWrapper defaultServlet = new StandardWrapper();
> +        defaultServlet.setServletClass("org.ofbiz.webapp.control.TenantServlet");
> +        defaultServlet.setServletName("default");
> +        defaultServlet.setLoadOnStartup(1);
> +        defaultServlet.addInitParameter("debug", "0");
> +        defaultServlet.addInitParameter("listing", "true");
> +        defaultServlet.addMapping("/");
> +        context.addChild(defaultServlet);
> +        context.addServletMapping("/", "default");
> +
> +        Host host = hosts.get(engine.getName() + "._DEFAULT");
> +        context.setRealm(host.getRealm());
> +        host.addChild(context);
> +        context.getMapper().setDefaultHostName(host.getName());
> +
> +        return context;
> +    }
> +
>     protected void loadComponents() throws ContainerException {
>         if (embedded == null) {
>             throw new ContainerException("Cannot load web applications without Embedded instance!");
> @@ -641,6 +679,12 @@ public class CatalinaContainer implement
>                 }
>             }
>         }
> +
> +        // if the multitenant is enabled then create the tenant context
> +        String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
> +        if ("Y".equals(useMultitenant) && UtilValidate.isEmpty(delegator.getDelegatorTenantId())) {
> +            createTenantContext();
> +        }
>     }
> 
>     public void stop() throws ContainerException {
> 
> Modified: ofbiz/trunk/framework/common/webcommon/login.ftl
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/login.ftl?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/common/webcommon/login.ftl (original)
> +++ ofbiz/trunk/framework/common/webcommon/login.ftl Mon Nov  8 06:54:17 2010
> @@ -42,13 +42,15 @@ under the License.
>             <td class="label">${uiLabelMap.CommonPassword}</td>
>             <td><input type="password" name="PASSWORD" value="" size="20"/></td>
>           </tr>
> -          <#if ("Y" == useMultitenant && !sessionAttributes.tenantId?exists) >
> -            <tr>
> -              <td class="label">${uiLabelMap.CommonTenantId}</td>
> -              <td><input type="text" name="tenantId" value="${parameters.tenantId?if_exists}" size="20"/></td>
> -            </tr>
> -          <#elseif ("Y" == useMultitenant && sessionAttributes.tenantId?exists) >
> -              <input type="hidden" name="tenantId" value="${sessionAttributes.tenantId?if_exists}"/>
> +          <#if ("Y" == useMultitenant) >
> +              <#if !requestAttributes.tenantId?exists>
> +                  <tr>
> +                      <td class="label">${uiLabelMap.CommonTenantId}</td>
> +                      <td><input type="text" name="tenantId" value="${parameters.tenantId?if_exists}" size="20"/></td>
> +                  </tr>
> +              <#else>
> +                  <input type="hidden" name="tenantId" value="${requestAttributes.tenantId?if_exists}"/>
> +              </#if>
>           </#if>
>           <tr>
>             <td colspan="2" align="center">
> 
> Modified: ofbiz/trunk/framework/entity/entitydef/entitymodel.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/entitydef/entitymodel.xml?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/entity/entitydef/entitymodel.xml (original)
> +++ ofbiz/trunk/framework/entity/entitydef/entitymodel.xml Mon Nov  8 06:54:17 2010
> @@ -67,6 +67,7 @@ under the License.
>         <field name="tenantId" type="id-ne"/>
>         <field name="tenantName" type="name"/>
>         <field name="domainName" type="long-varchar"/>
> +        <field name="initialPath" type="value"/>
>         <field name="disabled" type="indicator"><description>Disabled if 'Y', defaults to 'N' (not disabled).</description></field>
>         <prim-key field="tenantId"/>
>     </entity>
> 
> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java (original)
> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java Mon Nov  8 06:54:17 2010
> @@ -50,10 +50,16 @@ import org.ofbiz.base.util.Debug;
> import org.ofbiz.base.util.StringUtil;
> import org.ofbiz.base.util.UtilGenerics;
> import org.ofbiz.base.util.UtilHttp;
> +import org.ofbiz.base.util.UtilMisc;
> import org.ofbiz.base.util.UtilObject;
> +import org.ofbiz.base.util.UtilProperties;
> import org.ofbiz.base.util.UtilValidate;
> import org.ofbiz.entity.Delegator;
> import org.ofbiz.entity.DelegatorFactory;
> +import org.ofbiz.entity.GenericEntityException;
> +import org.ofbiz.entity.GenericValue;
> +import org.ofbiz.entity.condition.EntityCondition;
> +import org.ofbiz.entity.util.EntityUtil;
> import org.ofbiz.security.Security;
> import org.ofbiz.security.SecurityConfigurationException;
> import org.ofbiz.security.SecurityFactory;
> @@ -266,6 +272,52 @@ public class ContextFilter implements Fi
>                 return;
>             }
>         }
> +        
> +        // check if multi tenant is enabled
> +        String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
> +        if ("Y".equals(useMultitenant)) {
> +            // get tenant delegator by domain name
> +            String serverName = request.getServerName();
> +            try {
> +                // if tenant was specified, replace delegator with the new per-tenant delegator and set tenantId to session attribute
> +                Delegator delegator = getDelegator(config.getServletContext());
> +                List<EntityCondition> conds = FastList.newInstance();
> +                conds.add(EntityCondition.makeCondition("domainName", serverName));
> +                List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition(conds), null, UtilMisc.toList("-createdStamp"), null, false);
> +                if (UtilValidate.isNotEmpty(tenants)) {
> +                    GenericValue tenant = EntityUtil.getFirst(tenants);
> +                    String tenantId = tenant.getString("tenantId");
> +                    
> +                    // make that tenant active, setup a new delegator and a new dispatcher
> +                    String tenantDelegatorName = delegator.getDelegatorBaseName() + "#" + tenantId;
> +                    httpRequest.getSession().setAttribute("delegatorName", tenantDelegatorName);
> +                
> +                    // after this line the delegator is replaced with the new per-tenant delegator
> +                    delegator = DelegatorFactory.getDelegator(tenantDelegatorName);
> +                    config.getServletContext().setAttribute("delegator", delegator);
> +                    
> +                    // clear web context objects
> +                    config.getServletContext().setAttribute("authorization", null);
> +                    config.getServletContext().setAttribute("security", null);
> +                    config.getServletContext().setAttribute("dispatcher", null);
> +                    
> +                    // initialize authorizer
> +                    getAuthz();
> +                    // initialize security
> +                    Security security = getSecurity();
> +                    // initialize the services dispatcher
> +                    LocalDispatcher dispatcher = getDispatcher(config.getServletContext());
> +                    
> +                    // set web context objects
> +                    httpRequest.getSession().setAttribute("dispatcher", dispatcher);
> +                    httpRequest.getSession().setAttribute("security", security);
> +                    
> +                    request.setAttribute("tenantId", tenantId);
> +                }
> +            } catch (GenericEntityException e) {
> +                Debug.logWarning(e, "Unable to get Tenant", module);
> +            }
> +        }
> 
>         // we're done checking; continue on
>         chain.doFilter(request, response);
> 
> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java (original)
> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java Mon Nov  8 06:54:17 2010
> @@ -226,39 +226,6 @@ public class ControlServlet extends Http
> 
>         String errorPage = null;
>         try {
> -            String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
> -            if ("Y".equals(useMultitenant) && UtilValidate.isEmpty(delegator.getDelegatorTenantId())) {
> -                // get tenant delegator by domain name
> -                try {
> -                    // if a domain name was specified for tenant, replace delegator with the new per-tenant delegator and set tenantId to session attribute
> -                    List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", request.getServerName()), null, UtilMisc.toList("-createdStamp"), null, false);
> -                    if (UtilValidate.isNotEmpty(tenants)) {
> -                        GenericValue tenant = EntityUtil.getFirst(tenants);
> -                        String tenantId = tenant.getString("tenantId");
> -                        
> -                        // make that tenant active, setup a new delegator and a new dispatcher
> -                        String tenantDelegatorName = delegator.getDelegatorBaseName() + "#" + tenantId;
> -                    
> -                        // after this line the delegator is replaced with the new per-tenant delegator
> -                        delegator = DelegatorFactory.getDelegator(tenantDelegatorName);
> -                        session.setAttribute("tenantId", tenantId);
> -                        session.setAttribute("delegatorName", tenantDelegatorName);
> -                    }
> -                } catch (GenericEntityException e) {
> -                    String errMsg = "Error getting tenant by domain name: " + request.getServerName();
> -                    Debug.logError(e, errMsg, module);
> -                    throw new RequestHandlerException(errMsg, e);
> -                }
> -            }
> -            if ("Y".equals(useMultitenant) && UtilValidate.isNotEmpty(delegator.getDelegatorTenantId())) {
> -                // re-make dispatcher from tenant delegator and change delegator of security to use tanent delegator
> -                dispatcher = ContextFilter.makeWebappDispatcher(session.getServletContext(), delegator);
> -                security.setDelegator(delegator);
> -                
> -                request.setAttribute("delegator", delegator);
> -                request.setAttribute("dispatcher", dispatcher);
> -            }
> -            
>             // the ServerHitBin call for the event is done inside the doRequest method
>             requestHandler.doRequest(request, response, null, userLogin, delegator);
>         } catch (RequestHandlerException e) {
> 
> Added: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java?rev=1032472&view=auto
> ==============================================================================
> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java (added)
> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java Mon Nov  8 06:54:17 2010
> @@ -0,0 +1,68 @@
> +/*******************************************************************************
> + * Licensed to the Apache Software Foundation (ASF) under one
> + * or more contributor license agreements.  See the NOTICE file
> + * distributed with this work for additional information
> + * regarding copyright ownership.  The ASF licenses this file
> + * to you under the Apache License, Version 2.0 (the
> + * "License"); you may not use this file except in compliance
> + * with the License.  You may obtain a copy of the License at
> + *
> + * http://www.apache.org/licenses/LICENSE-2.0
> + *
> + * Unless required by applicable law or agreed to in writing,
> + * software distributed under the License is distributed on an
> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> + * KIND, either express or implied.  See the License for the
> + * specific language governing permissions and limitations
> + * under the License.
> + *******************************************************************************/
> +package org.ofbiz.webapp.control;
> +
> +import java.io.IOException;
> +import java.util.List;
> +
> +import javax.servlet.ServletException;
> +import javax.servlet.http.HttpServlet;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +
> +import org.ofbiz.base.util.Debug;
> +import org.ofbiz.base.util.UtilMisc;
> +import org.ofbiz.base.util.UtilValidate;
> +import org.ofbiz.entity.Delegator;
> +import org.ofbiz.entity.DelegatorFactory;
> +import org.ofbiz.entity.GenericEntityException;
> +import org.ofbiz.entity.GenericValue;
> +import org.ofbiz.entity.condition.EntityCondition;
> +import org.ofbiz.entity.util.EntityUtil;
> +
> +
> +/**
> + * TenantServlet.java - Tenant servlet for the web application.
> + */
> +@SuppressWarnings("serial")
> +public class TenantServlet extends HttpServlet {
> +
> +    public static String module = TenantServlet.class.getName();
> +    
> +    @Override
> +    public void doGet(HttpServletRequest request, HttpServletResponse response)
> +            throws ServletException, IOException {
> +        
> +        // get default delegator
> +        Delegator delegator = DelegatorFactory.getDelegator("default");
> +        try {
> +            // if a domain name was specified for tenant, redirect to initial path
> +            List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", request.getServerName()), null, UtilMisc.toList("-createdStamp"), null, false);
> +            if (UtilValidate.isNotEmpty(tenants)) {
> +                GenericValue tenant = EntityUtil.getFirst(tenants);
> +                String initialPath = tenant.getString("initialPath");
> +                response.sendRedirect(initialPath);
> +            }
> +        } catch (GenericEntityException e) {
> +            String errMsg = "Error getting tenant by domain name: " + request.getServerName();
> +            Debug.logError(e, errMsg, module);
> +            throw new ServletException(errMsg, e);
> +        }
> +    }
> +}
> 
> 


Re: svn commit: r1032472 - in /ofbiz/trunk/framework: birt/src/org/ofbiz/birt/ birt/src/org/ofbiz/birt/email/ birt/src/org/ofbiz/birt/report/servlet/ birt/src/org/ofbiz/birt/webapp/view/ catalina/src/org/ofbiz/catalina/container/ common/webcommon/ entity/e...

Posted by Jacopo Cappellato <ja...@hotwaxmedia.com>.
On Nov 20, 2012, at 3:11 AM, Hans Bakker wrote:

> On 11/19/2012 09:53 PM, Jacopo Cappellato wrote:
>> Thank you Hans,
>> 
>> please see inline:
>> 
>> On Nov 19, 2012, at 3:22 PM, Hans Bakker wrote:
>> 
>> 
>> A problem here is that only a single domain name can be specified,
>> Do you mean a single domain per tenant, right? Otherwise I don't see how this feature could be of any use...
>> 
>> 
> yes only a single domain per tenant which is a problem if you want to have different domainnames for frontend and backend and/or want to operate more than a single domainname in a single tenant.

Ok, thank you: now I understand the feature (and its applicability/limitation).

Jacopo


Re: svn commit: r1032472 - in /ofbiz/trunk/framework: birt/src/org/ofbiz/birt/ birt/src/org/ofbiz/birt/email/ birt/src/org/ofbiz/birt/report/servlet/ birt/src/org/ofbiz/birt/webapp/view/ catalina/src/org/ofbiz/catalina/container/ common/webcommon/ entity/e...

Posted by Hans Bakker <ma...@antwebsystems.com>.
On 11/19/2012 09:53 PM, Jacopo Cappellato wrote:
> Thank you Hans,
>
> please see inline:
>
> On Nov 19, 2012, at 3:22 PM, Hans Bakker wrote:
>
>
> A problem here is that only a single domain name can be specified,
> Do you mean a single domain per tenant, right? Otherwise I don't see how this feature could be of any use...
>
>
yes only a single domain per tenant which is a problem if you want to 
have different domainnames for frontend and backend and/or want to 
operate more than a single domainname in a single tenant.

Re: svn commit: r1032472 - in /ofbiz/trunk/framework: birt/src/org/ofbiz/birt/ birt/src/org/ofbiz/birt/email/ birt/src/org/ofbiz/birt/report/servlet/ birt/src/org/ofbiz/birt/webapp/view/ catalina/src/org/ofbiz/catalina/container/ common/webcommon/ entity/e...

Posted by Jacopo Cappellato <ja...@hotwaxmedia.com>.
Thank you Hans,

please see inline:

On Nov 19, 2012, at 3:22 PM, Hans Bakker wrote:

> Hi Jacopo,
> 
> when a request for a certain domain name comes in the tenant is selected and the login screen without tenant input field is shown when login is required. Otherwise the login screen is skipped.

Ok, I think it is inline with my understanding after my review of the code; so we have two independent mechanisms to select a tenant for the logged in user:

* by domain name: the tenant is selected automatically based on the URL of the server
* selection by the user at login: the user selects a tenant entering its name in the login screen

> 
> A problem here is that only a single domain name can be specified,

Do you mean a single domain per tenant, right? Otherwise I don't see how this feature could be of any use...

Thanks,

Jacopo

> Here locally we already extended that and we should commit that...but it is an entity change which probably need a lot of discussion.....
> 
> Regards,
> Hans
> 
> On 11/19/2012 08:31 PM, Jacopo Cappellato wrote:
>> Hi Hans, Chattree,
>> 
>> I have a question about the changes to ContextFilter.java in this commit related to the selection of the Tenant record matching the domainname: does it mean that if a matching record is found then the tenant selected by the user at login is automatically overridden?
>> Is this the intended behavior?
>> 
>> Thanks,
>> 
>> Jacopo
>> 
>> On Nov 8, 2010, at 7:54 AM, hansbak@apache.org wrote:
>> 
>>> Author: hansbak
>>> Date: Mon Nov  8 06:54:17 2010
>>> New Revision: 1032472
>>> 
>>> URL: http://svn.apache.org/viewvc?rev=1032472&view=rev
>>> Log:
>>> next to setting of the tenent id, now also the initial mountpoint if entered also refactoring:
>>> - set delegator, dispatcher and security from session, servlet context or request's attribute to app context of birt engine before render and send email
>>> - add the initialPath field to Tenant entity
>>> - create the tenant context which as a default servlet using org.ofbiz.webapp.control.TenantServlet in the catalina container and check the multitenant property for initial the tenant context with root mount /
>>> - move the changing a multi tenant delegator statement from ControlServlet to ContextFilter that could apply to every servlets
>>> (implementation by Chattree Richard)
>>> 
>>> Added:
>>>    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java
>>> Modified:
>>>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java
>>>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java
>>>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java
>>>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java
>>>    ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java
>>>    ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>>>    ofbiz/trunk/framework/common/webcommon/login.ftl
>>>    ofbiz/trunk/framework/entity/entitydef/entitymodel.xml
>>>    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
>>>    ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java
>>> 
>>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java (original)
>>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java Mon Nov  8 06:54:17 2010
>>> @@ -23,6 +23,11 @@ import java.sql.SQLException;
>>> import java.util.Locale;
>>> import java.util.Map;
>>> 
>>> +import javax.servlet.ServletContext;
>>> +import javax.servlet.http.HttpServletRequest;
>>> +import javax.servlet.http.HttpServletResponse;
>>> +import javax.servlet.http.HttpSession;
>>> +
>>> import org.eclipse.birt.report.engine.api.EXCELRenderOption;
>>> import org.eclipse.birt.report.engine.api.EngineException;
>>> import org.eclipse.birt.report.engine.api.HTMLRenderOption;
>>> @@ -36,7 +41,11 @@ import org.eclipse.birt.report.engine.ap
>>> import org.ofbiz.base.util.Debug;
>>> import org.ofbiz.base.util.GeneralException;
>>> import org.ofbiz.base.util.UtilGenerics;
>>> +import org.ofbiz.base.util.UtilValidate;
>>> import org.ofbiz.birt.container.BirtContainer;
>>> +import org.ofbiz.entity.Delegator;
>>> +import org.ofbiz.security.Security;
>>> +import org.ofbiz.service.LocalDispatcher;
>>> 
>>> public class BirtWorker {
>>> 
>>> @@ -138,4 +147,45 @@ public class BirtWorker {
>>>         task.run();
>>>         task.close();
>>>     }
>>> +
>>> +    public static void setWebContextObjects(IReportEngine engine, HttpServletRequest request, HttpServletResponse response) {
>>> +        HttpSession session = request.getSession();
>>> +        ServletContext servletContext = session.getServletContext();
>>> +
>>> +        // set delegator
>>> +        Delegator delegator = (Delegator) session.getAttribute("delegator");
>>> +        if (UtilValidate.isEmpty(delegator)) {
>>> +            delegator = (Delegator) servletContext.getAttribute("delegator");
>>> +        }
>>> +        if (UtilValidate.isEmpty(delegator)) {
>>> +            delegator = (Delegator) request.getAttribute("delegator");
>>> +        }
>>> +        if (UtilValidate.isNotEmpty(delegator)) {
>>> +            engine.getConfig().getAppContext().put("delegator", delegator);
>>> +        }
>>> +
>>> +        // set delegator
>>> +        LocalDispatcher dispatcher = (LocalDispatcher) session.getAttribute("dispatcher");
>>> +        if (UtilValidate.isEmpty(dispatcher)) {
>>> +            dispatcher = (LocalDispatcher) servletContext.getAttribute("dispatcher");
>>> +        }
>>> +        if (UtilValidate.isEmpty(dispatcher)) {
>>> +            dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
>>> +        }
>>> +        if (UtilValidate.isNotEmpty(dispatcher)) {
>>> +            engine.getConfig().getAppContext().put("dispatcher", dispatcher);
>>> +        }
>>> +
>>> +        // set security
>>> +        Security security = (Security) session.getAttribute("security");
>>> +        if (UtilValidate.isEmpty(security)) {
>>> +            security = (Security) servletContext.getAttribute("security");
>>> +        }
>>> +        if (UtilValidate.isEmpty(security)) {
>>> +            security = (Security) request.getAttribute("security");
>>> +        }
>>> +        if (UtilValidate.isNotEmpty(security)) {
>>> +            engine.getConfig().getAppContext().put("security", dispatcher);
>>> +        }
>>> +    }
>>> }
>>> 
>>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java (original)
>>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java Mon Nov  8 06:54:17 2010
>>> @@ -46,6 +46,8 @@ import org.ofbiz.base.util.string.Flexib
>>> import org.ofbiz.birt.BirtWorker;
>>> import org.ofbiz.birt.container.BirtContainer;
>>> import org.ofbiz.common.email.NotificationServices;
>>> +import org.ofbiz.entity.Delegator;
>>> +import org.ofbiz.security.Security;
>>> import org.ofbiz.service.DispatchContext;
>>> import org.ofbiz.service.LocalDispatcher;
>>> import org.ofbiz.service.ServiceUtil;
>>> @@ -69,7 +71,10 @@ public class BirtEmailServices {
>>>      */
>>>     public static Map<String, Object> sendBirtMail(DispatchContext ctx, Map<String, ? extends Object> context) {
>>>         Map<String, Object> serviceContext = UtilMisc.makeMapWritable(context);
>>> +        Delegator delegator = ctx.getDelegator();
>>>         LocalDispatcher dispatcher = ctx.getDispatcher();
>>> +        Security security = ctx.getSecurity();
>>> +
>>>         String webSiteId = (String) serviceContext.remove("webSiteId");
>>>         String bodyText = (String) serviceContext.remove("bodyText");
>>>         String bodyScreenUri = (String) serviceContext.remove("bodyScreenUri");
>>> @@ -153,11 +158,14 @@ public class BirtEmailServices {
>>>                     birtContentType = "application/pdf";
>>>                 }
>>>                 IReportEngine engine = BirtContainer.getReportEngine();
>>> +                engine.getConfig().getAppContext().put("delegator", delegator);
>>> +                engine.getConfig().getAppContext().put("dispatcher", dispatcher);
>>> +                engine.getConfig().getAppContext().put("security", security);
>>> +
>>>                 InputStream reportInputStream = BirtFactory.getReportInputStreamFromLocation(birtReportLocation);
>>>                 IReportRunnable design = engine.openReportDesign(reportInputStream);
>>> -                     Debug.logInfo("Export report as content type:" + birtContentType, module);
>>> -                     BirtWorker.exportReport(design, context, birtContentType, baos);
>>> -                // and generate the PDF
>>> +                Debug.logInfo("Export report as content type:" + birtContentType, module);
>>> +                BirtWorker.exportReport(design, context, birtContentType, baos);
>>>                 baos.flush();
>>>                 baos.close();
>>> 
>>> 
>>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java (original)
>>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java Mon Nov  8 06:54:17 2010
>>> @@ -24,9 +24,12 @@ import javax.servlet.http.HttpServletRes
>>> 
>>> import org.eclipse.birt.core.exception.BirtException;
>>> import org.eclipse.birt.report.context.IContext;
>>> +import org.eclipse.birt.report.engine.api.IReportEngine;
>>> import org.eclipse.birt.report.presentation.aggregation.layout.EngineFragment;
>>> import org.eclipse.birt.report.presentation.aggregation.layout.RequesterFragment;
>>> import org.eclipse.birt.report.service.BirtReportServiceFactory;
>>> +import org.ofbiz.birt.BirtWorker;
>>> +import org.ofbiz.birt.container.BirtContainer;
>>> import org.ofbiz.birt.report.context.OFBizBirtContext;
>>> import org.ofbiz.birt.report.service.OFBizBirtViewerReportService;
>>> 
>>> @@ -52,6 +55,9 @@ public class BirtEngineServlet extends o
>>>     protected IContext __getContext( HttpServletRequest request,
>>>             HttpServletResponse response ) throws BirtException
>>>     {
>>> +        IReportEngine reportEngine = BirtContainer.getReportEngine();
>>> +        BirtWorker.setWebContextObjects(reportEngine, request, response);
>>> +
>>>         BirtReportServiceFactory.getReportService( ).setContext(
>>>                 getServletContext( ), null );
>>>         return new OFBizBirtContext( request, response );
>>> 
>>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java (original)
>>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java Mon Nov  8 06:54:17 2010
>>> @@ -24,10 +24,13 @@ import javax.servlet.http.HttpServletRes
>>> 
>>> import org.eclipse.birt.core.exception.BirtException;
>>> import org.eclipse.birt.report.context.IContext;
>>> +import org.eclipse.birt.report.engine.api.IReportEngine;
>>> import org.eclipse.birt.report.presentation.aggregation.layout.FramesetFragment;
>>> import org.eclipse.birt.report.presentation.aggregation.layout.RunFragment;
>>> import org.eclipse.birt.report.service.BirtReportServiceFactory;
>>> import org.eclipse.birt.report.servlet.ViewerServlet;
>>> +import org.ofbiz.birt.BirtWorker;
>>> +import org.ofbiz.birt.container.BirtContainer;
>>> import org.ofbiz.birt.report.context.OFBizBirtContext;
>>> import org.ofbiz.birt.report.service.OFBizBirtViewerReportService;
>>> 
>>> @@ -56,6 +59,9 @@ public class BirtViewerServlet extends V
>>>     protected IContext __getContext( HttpServletRequest request,
>>>             HttpServletResponse response ) throws BirtException
>>>     {
>>> +        IReportEngine reportEngine = BirtContainer.getReportEngine();
>>> +        BirtWorker.setWebContextObjects(reportEngine, request, response);
>>> +
>>>         BirtReportServiceFactory.getReportService( ).setContext(
>>>                 getServletContext( ), null );
>>>         return new OFBizBirtContext( request, response );
>>> 
>>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java (original)
>>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java Mon Nov  8 06:54:17 2010
>>> @@ -70,6 +70,7 @@ public class BirtViewHandler implements
>>>     public void render(String name, String page, String info,
>>>             String contentType, String encoding, HttpServletRequest request,
>>>             HttpServletResponse response) throws ViewHandlerException {
>>> +
>>>         try {
>>>             IReportEngine engine = BirtContainer.getReportEngine();
>>>             // open report design
>>> @@ -80,6 +81,8 @@ public class BirtViewHandler implements
>>>             } else {
>>>                 design = engine.openReportDesign(servletContext.getRealPath(page));
>>>             }
>>> +
>>> +            BirtWorker.setWebContextObjects(engine, request, response);
>>> 
>>>             Map<String, Object> context = FastMap.newInstance();
>>>             // set parameters from request
>>> 
>>> Modified: ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java (original)
>>> +++ ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java Mon Nov  8 06:54:17 2010
>>> @@ -67,6 +67,7 @@ import org.ofbiz.base.container.Containe
>>> import org.ofbiz.base.container.ContainerConfig.Container.Property;
>>> import org.ofbiz.base.util.Debug;
>>> import org.ofbiz.base.util.SSLUtil;
>>> +import org.ofbiz.base.util.UtilProperties;
>>> import org.ofbiz.base.util.UtilURL;
>>> import org.ofbiz.base.util.UtilValidate;
>>> import org.ofbiz.base.util.UtilXml;
>>> @@ -620,6 +621,43 @@ public class CatalinaContainer implement
>>>         return context;
>>>     }
>>> 
>>> +    protected Context createTenantContext() throws ContainerException {
>>> +        String server = "default-server";
>>> +        Engine engine = engines.get(server);
>>> +        if (engine == null) {
>>> +            Debug.logWarning("Server with name [" + server + "] not found;", module);
>>> +            return null;
>>> +        }
>>> +
>>> +        // create the web application context
>>> +        StandardContext context = (StandardContext) embedded.createContext("/", System.getProperty("ofbiz.home"));
>>> +        context.setJ2EEApplication(J2EE_APP);
>>> +        context.setJ2EEServer(J2EE_SERVER);
>>> +        context.setLoader(embedded.createLoader(ClassLoaderContainer.getClassLoader()));
>>> +        context.setReloadable(contextReloadable);
>>> +        context.setDistributable(distribute);
>>> +        context.setCrossContext(crossContext);
>>> +
>>> +
>>> +        // create the Default Servlet instance to mount
>>> +        StandardWrapper defaultServlet = new StandardWrapper();
>>> +        defaultServlet.setServletClass("org.ofbiz.webapp.control.TenantServlet");
>>> +        defaultServlet.setServletName("default");
>>> +        defaultServlet.setLoadOnStartup(1);
>>> +        defaultServlet.addInitParameter("debug", "0");
>>> +        defaultServlet.addInitParameter("listing", "true");
>>> +        defaultServlet.addMapping("/");
>>> +        context.addChild(defaultServlet);
>>> +        context.addServletMapping("/", "default");
>>> +
>>> +        Host host = hosts.get(engine.getName() + "._DEFAULT");
>>> +        context.setRealm(host.getRealm());
>>> +        host.addChild(context);
>>> +        context.getMapper().setDefaultHostName(host.getName());
>>> +
>>> +        return context;
>>> +    }
>>> +
>>>     protected void loadComponents() throws ContainerException {
>>>         if (embedded == null) {
>>>             throw new ContainerException("Cannot load web applications without Embedded instance!");
>>> @@ -641,6 +679,12 @@ public class CatalinaContainer implement
>>>                 }
>>>             }
>>>         }
>>> +
>>> +        // if the multitenant is enabled then create the tenant context
>>> +        String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
>>> +        if ("Y".equals(useMultitenant) && UtilValidate.isEmpty(delegator.getDelegatorTenantId())) {
>>> +            createTenantContext();
>>> +        }
>>>     }
>>> 
>>>     public void stop() throws ContainerException {
>>> 
>>> Modified: ofbiz/trunk/framework/common/webcommon/login.ftl
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/login.ftl?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/common/webcommon/login.ftl (original)
>>> +++ ofbiz/trunk/framework/common/webcommon/login.ftl Mon Nov  8 06:54:17 2010
>>> @@ -42,13 +42,15 @@ under the License.
>>>             <td class="label">${uiLabelMap.CommonPassword}</td>
>>>             <td><input type="password" name="PASSWORD" value="" size="20"/></td>
>>>           </tr>
>>> -          <#if ("Y" == useMultitenant && !sessionAttributes.tenantId?exists) >
>>> -            <tr>
>>> -              <td class="label">${uiLabelMap.CommonTenantId}</td>
>>> -              <td><input type="text" name="tenantId" value="${parameters.tenantId?if_exists}" size="20"/></td>
>>> -            </tr>
>>> -          <#elseif ("Y" == useMultitenant && sessionAttributes.tenantId?exists) >
>>> -              <input type="hidden" name="tenantId" value="${sessionAttributes.tenantId?if_exists}"/>
>>> +          <#if ("Y" == useMultitenant) >
>>> +              <#if !requestAttributes.tenantId?exists>
>>> +                  <tr>
>>> +                      <td class="label">${uiLabelMap.CommonTenantId}</td>
>>> +                      <td><input type="text" name="tenantId" value="${parameters.tenantId?if_exists}" size="20"/></td>
>>> +                  </tr>
>>> +              <#else>
>>> +                  <input type="hidden" name="tenantId" value="${requestAttributes.tenantId?if_exists}"/>
>>> +              </#if>
>>>           </#if>
>>>           <tr>
>>>             <td colspan="2" align="center">
>>> 
>>> Modified: ofbiz/trunk/framework/entity/entitydef/entitymodel.xml
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/entitydef/entitymodel.xml?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/entity/entitydef/entitymodel.xml (original)
>>> +++ ofbiz/trunk/framework/entity/entitydef/entitymodel.xml Mon Nov  8 06:54:17 2010
>>> @@ -67,6 +67,7 @@ under the License.
>>>         <field name="tenantId" type="id-ne"/>
>>>         <field name="tenantName" type="name"/>
>>>         <field name="domainName" type="long-varchar"/>
>>> +        <field name="initialPath" type="value"/>
>>>         <field name="disabled" type="indicator"><description>Disabled if 'Y', defaults to 'N' (not disabled).</description></field>
>>>         <prim-key field="tenantId"/>
>>>     </entity>
>>> 
>>> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java (original)
>>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java Mon Nov  8 06:54:17 2010
>>> @@ -50,10 +50,16 @@ import org.ofbiz.base.util.Debug;
>>> import org.ofbiz.base.util.StringUtil;
>>> import org.ofbiz.base.util.UtilGenerics;
>>> import org.ofbiz.base.util.UtilHttp;
>>> +import org.ofbiz.base.util.UtilMisc;
>>> import org.ofbiz.base.util.UtilObject;
>>> +import org.ofbiz.base.util.UtilProperties;
>>> import org.ofbiz.base.util.UtilValidate;
>>> import org.ofbiz.entity.Delegator;
>>> import org.ofbiz.entity.DelegatorFactory;
>>> +import org.ofbiz.entity.GenericEntityException;
>>> +import org.ofbiz.entity.GenericValue;
>>> +import org.ofbiz.entity.condition.EntityCondition;
>>> +import org.ofbiz.entity.util.EntityUtil;
>>> import org.ofbiz.security.Security;
>>> import org.ofbiz.security.SecurityConfigurationException;
>>> import org.ofbiz.security.SecurityFactory;
>>> @@ -266,6 +272,52 @@ public class ContextFilter implements Fi
>>>                 return;
>>>             }
>>>         }
>>> +
>>> +        // check if multi tenant is enabled
>>> +        String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
>>> +        if ("Y".equals(useMultitenant)) {
>>> +            // get tenant delegator by domain name
>>> +            String serverName = request.getServerName();
>>> +            try {
>>> +                // if tenant was specified, replace delegator with the new per-tenant delegator and set tenantId to session attribute
>>> +                Delegator delegator = getDelegator(config.getServletContext());
>>> +                List<EntityCondition> conds = FastList.newInstance();
>>> +                conds.add(EntityCondition.makeCondition("domainName", serverName));
>>> +                List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition(conds), null, UtilMisc.toList("-createdStamp"), null, false);
>>> +                if (UtilValidate.isNotEmpty(tenants)) {
>>> +                    GenericValue tenant = EntityUtil.getFirst(tenants);
>>> +                    String tenantId = tenant.getString("tenantId");
>>> +
>>> +                    // make that tenant active, setup a new delegator and a new dispatcher
>>> +                    String tenantDelegatorName = delegator.getDelegatorBaseName() + "#" + tenantId;
>>> +                    httpRequest.getSession().setAttribute("delegatorName", tenantDelegatorName);
>>> +
>>> +                    // after this line the delegator is replaced with the new per-tenant delegator
>>> +                    delegator = DelegatorFactory.getDelegator(tenantDelegatorName);
>>> +                    config.getServletContext().setAttribute("delegator", delegator);
>>> +
>>> +                    // clear web context objects
>>> +                    config.getServletContext().setAttribute("authorization", null);
>>> +                    config.getServletContext().setAttribute("security", null);
>>> +                    config.getServletContext().setAttribute("dispatcher", null);
>>> +
>>> +                    // initialize authorizer
>>> +                    getAuthz();
>>> +                    // initialize security
>>> +                    Security security = getSecurity();
>>> +                    // initialize the services dispatcher
>>> +                    LocalDispatcher dispatcher = getDispatcher(config.getServletContext());
>>> +
>>> +                    // set web context objects
>>> +                    httpRequest.getSession().setAttribute("dispatcher", dispatcher);
>>> +                    httpRequest.getSession().setAttribute("security", security);
>>> +
>>> +                    request.setAttribute("tenantId", tenantId);
>>> +                }
>>> +            } catch (GenericEntityException e) {
>>> +                Debug.logWarning(e, "Unable to get Tenant", module);
>>> +            }
>>> +        }
>>> 
>>>         // we're done checking; continue on
>>>         chain.doFilter(request, response);
>>> 
>>> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java (original)
>>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java Mon Nov  8 06:54:17 2010
>>> @@ -226,39 +226,6 @@ public class ControlServlet extends Http
>>> 
>>>         String errorPage = null;
>>>         try {
>>> -            String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
>>> -            if ("Y".equals(useMultitenant) && UtilValidate.isEmpty(delegator.getDelegatorTenantId())) {
>>> -                // get tenant delegator by domain name
>>> -                try {
>>> -                    // if a domain name was specified for tenant, replace delegator with the new per-tenant delegator and set tenantId to session attribute
>>> -                    List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", request.getServerName()), null, UtilMisc.toList("-createdStamp"), null, false);
>>> -                    if (UtilValidate.isNotEmpty(tenants)) {
>>> -                        GenericValue tenant = EntityUtil.getFirst(tenants);
>>> -                        String tenantId = tenant.getString("tenantId");
>>> -
>>> -                        // make that tenant active, setup a new delegator and a new dispatcher
>>> -                        String tenantDelegatorName = delegator.getDelegatorBaseName() + "#" + tenantId;
>>> -
>>> -                        // after this line the delegator is replaced with the new per-tenant delegator
>>> -                        delegator = DelegatorFactory.getDelegator(tenantDelegatorName);
>>> -                        session.setAttribute("tenantId", tenantId);
>>> -                        session.setAttribute("delegatorName", tenantDelegatorName);
>>> -                    }
>>> -                } catch (GenericEntityException e) {
>>> -                    String errMsg = "Error getting tenant by domain name: " + request.getServerName();
>>> -                    Debug.logError(e, errMsg, module);
>>> -                    throw new RequestHandlerException(errMsg, e);
>>> -                }
>>> -            }
>>> -            if ("Y".equals(useMultitenant) && UtilValidate.isNotEmpty(delegator.getDelegatorTenantId())) {
>>> -                // re-make dispatcher from tenant delegator and change delegator of security to use tanent delegator
>>> -                dispatcher = ContextFilter.makeWebappDispatcher(session.getServletContext(), delegator);
>>> -                security.setDelegator(delegator);
>>> -
>>> -                request.setAttribute("delegator", delegator);
>>> -                request.setAttribute("dispatcher", dispatcher);
>>> -            }
>>> -
>>>             // the ServerHitBin call for the event is done inside the doRequest method
>>>             requestHandler.doRequest(request, response, null, userLogin, delegator);
>>>         } catch (RequestHandlerException e) {
>>> 
>>> Added: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java
>>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java?rev=1032472&view=auto
>>> ==============================================================================
>>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java (added)
>>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java Mon Nov  8 06:54:17 2010
>>> @@ -0,0 +1,68 @@
>>> +/*******************************************************************************
>>> + * Licensed to the Apache Software Foundation (ASF) under one
>>> + * or more contributor license agreements.  See the NOTICE file
>>> + * distributed with this work for additional information
>>> + * regarding copyright ownership.  The ASF licenses this file
>>> + * to you under the Apache License, Version 2.0 (the
>>> + * "License"); you may not use this file except in compliance
>>> + * with the License.  You may obtain a copy of the License at
>>> + *
>>> + * http://www.apache.org/licenses/LICENSE-2.0
>>> + *
>>> + * Unless required by applicable law or agreed to in writing,
>>> + * software distributed under the License is distributed on an
>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>>> + * KIND, either express or implied.  See the License for the
>>> + * specific language governing permissions and limitations
>>> + * under the License.
>>> + *******************************************************************************/
>>> +package org.ofbiz.webapp.control;
>>> +
>>> +import java.io.IOException;
>>> +import java.util.List;
>>> +
>>> +import javax.servlet.ServletException;
>>> +import javax.servlet.http.HttpServlet;
>>> +import javax.servlet.http.HttpServletRequest;
>>> +import javax.servlet.http.HttpServletResponse;
>>> +
>>> +import org.ofbiz.base.util.Debug;
>>> +import org.ofbiz.base.util.UtilMisc;
>>> +import org.ofbiz.base.util.UtilValidate;
>>> +import org.ofbiz.entity.Delegator;
>>> +import org.ofbiz.entity.DelegatorFactory;
>>> +import org.ofbiz.entity.GenericEntityException;
>>> +import org.ofbiz.entity.GenericValue;
>>> +import org.ofbiz.entity.condition.EntityCondition;
>>> +import org.ofbiz.entity.util.EntityUtil;
>>> +
>>> +
>>> +/**
>>> + * TenantServlet.java - Tenant servlet for the web application.
>>> + */
>>> +@SuppressWarnings("serial")
>>> +public class TenantServlet extends HttpServlet {
>>> +
>>> +    public static String module = TenantServlet.class.getName();
>>> +
>>> +    @Override
>>> +    public void doGet(HttpServletRequest request, HttpServletResponse response)
>>> +            throws ServletException, IOException {
>>> +
>>> +        // get default delegator
>>> +        Delegator delegator = DelegatorFactory.getDelegator("default");
>>> +        try {
>>> +            // if a domain name was specified for tenant, redirect to initial path
>>> +            List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", request.getServerName()), null, UtilMisc.toList("-createdStamp"), null, false);
>>> +            if (UtilValidate.isNotEmpty(tenants)) {
>>> +                GenericValue tenant = EntityUtil.getFirst(tenants);
>>> +                String initialPath = tenant.getString("initialPath");
>>> +                response.sendRedirect(initialPath);
>>> +            }
>>> +        } catch (GenericEntityException e) {
>>> +            String errMsg = "Error getting tenant by domain name: " + request.getServerName();
>>> +            Debug.logError(e, errMsg, module);
>>> +            throw new ServletException(errMsg, e);
>>> +        }
>>> +    }
>>> +}
>>> 
>>> 
> 


Re: svn commit: r1032472 - in /ofbiz/trunk/framework: birt/src/org/ofbiz/birt/ birt/src/org/ofbiz/birt/email/ birt/src/org/ofbiz/birt/report/servlet/ birt/src/org/ofbiz/birt/webapp/view/ catalina/src/org/ofbiz/catalina/container/ common/webcommon/ entity/e...

Posted by Hans Bakker <ma...@antwebsystems.com>.
Hi Jacopo,

when a request for a certain domain name comes in the tenant is selected 
and the login screen without tenant input field is shown when login is 
required. Otherwise the login screen is skipped.

A problem here is that only a single domain name can be specified, Here 
locally we already extended that and we should commit that...but it is 
an entity change which probably need a lot of discussion.....

Regards,
Hans

On 11/19/2012 08:31 PM, Jacopo Cappellato wrote:
> Hi Hans, Chattree,
>
> I have a question about the changes to ContextFilter.java in this commit related to the selection of the Tenant record matching the domainname: does it mean that if a matching record is found then the tenant selected by the user at login is automatically overridden?
> Is this the intended behavior?
>
> Thanks,
>
> Jacopo
>
> On Nov 8, 2010, at 7:54 AM, hansbak@apache.org wrote:
>
>> Author: hansbak
>> Date: Mon Nov  8 06:54:17 2010
>> New Revision: 1032472
>>
>> URL: http://svn.apache.org/viewvc?rev=1032472&view=rev
>> Log:
>> next to setting of the tenent id, now also the initial mountpoint if entered also refactoring:
>> - set delegator, dispatcher and security from session, servlet context or request's attribute to app context of birt engine before render and send email
>> - add the initialPath field to Tenant entity
>> - create the tenant context which as a default servlet using org.ofbiz.webapp.control.TenantServlet in the catalina container and check the multitenant property for initial the tenant context with root mount /
>> - move the changing a multi tenant delegator statement from ControlServlet to ContextFilter that could apply to every servlets
>> (implementation by Chattree Richard)
>>
>> Added:
>>     ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java
>> Modified:
>>     ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java
>>     ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java
>>     ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java
>>     ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java
>>     ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java
>>     ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>>     ofbiz/trunk/framework/common/webcommon/login.ftl
>>     ofbiz/trunk/framework/entity/entitydef/entitymodel.xml
>>     ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
>>     ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java
>>
>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java (original)
>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/BirtWorker.java Mon Nov  8 06:54:17 2010
>> @@ -23,6 +23,11 @@ import java.sql.SQLException;
>> import java.util.Locale;
>> import java.util.Map;
>>
>> +import javax.servlet.ServletContext;
>> +import javax.servlet.http.HttpServletRequest;
>> +import javax.servlet.http.HttpServletResponse;
>> +import javax.servlet.http.HttpSession;
>> +
>> import org.eclipse.birt.report.engine.api.EXCELRenderOption;
>> import org.eclipse.birt.report.engine.api.EngineException;
>> import org.eclipse.birt.report.engine.api.HTMLRenderOption;
>> @@ -36,7 +41,11 @@ import org.eclipse.birt.report.engine.ap
>> import org.ofbiz.base.util.Debug;
>> import org.ofbiz.base.util.GeneralException;
>> import org.ofbiz.base.util.UtilGenerics;
>> +import org.ofbiz.base.util.UtilValidate;
>> import org.ofbiz.birt.container.BirtContainer;
>> +import org.ofbiz.entity.Delegator;
>> +import org.ofbiz.security.Security;
>> +import org.ofbiz.service.LocalDispatcher;
>>
>> public class BirtWorker {
>>
>> @@ -138,4 +147,45 @@ public class BirtWorker {
>>          task.run();
>>          task.close();
>>      }
>> +
>> +    public static void setWebContextObjects(IReportEngine engine, HttpServletRequest request, HttpServletResponse response) {
>> +        HttpSession session = request.getSession();
>> +        ServletContext servletContext = session.getServletContext();
>> +
>> +        // set delegator
>> +        Delegator delegator = (Delegator) session.getAttribute("delegator");
>> +        if (UtilValidate.isEmpty(delegator)) {
>> +            delegator = (Delegator) servletContext.getAttribute("delegator");
>> +        }
>> +        if (UtilValidate.isEmpty(delegator)) {
>> +            delegator = (Delegator) request.getAttribute("delegator");
>> +        }
>> +        if (UtilValidate.isNotEmpty(delegator)) {
>> +            engine.getConfig().getAppContext().put("delegator", delegator);
>> +        }
>> +
>> +        // set delegator
>> +        LocalDispatcher dispatcher = (LocalDispatcher) session.getAttribute("dispatcher");
>> +        if (UtilValidate.isEmpty(dispatcher)) {
>> +            dispatcher = (LocalDispatcher) servletContext.getAttribute("dispatcher");
>> +        }
>> +        if (UtilValidate.isEmpty(dispatcher)) {
>> +            dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
>> +        }
>> +        if (UtilValidate.isNotEmpty(dispatcher)) {
>> +            engine.getConfig().getAppContext().put("dispatcher", dispatcher);
>> +        }
>> +
>> +        // set security
>> +        Security security = (Security) session.getAttribute("security");
>> +        if (UtilValidate.isEmpty(security)) {
>> +            security = (Security) servletContext.getAttribute("security");
>> +        }
>> +        if (UtilValidate.isEmpty(security)) {
>> +            security = (Security) request.getAttribute("security");
>> +        }
>> +        if (UtilValidate.isNotEmpty(security)) {
>> +            engine.getConfig().getAppContext().put("security", dispatcher);
>> +        }
>> +    }
>> }
>>
>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java (original)
>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/email/BirtEmailServices.java Mon Nov  8 06:54:17 2010
>> @@ -46,6 +46,8 @@ import org.ofbiz.base.util.string.Flexib
>> import org.ofbiz.birt.BirtWorker;
>> import org.ofbiz.birt.container.BirtContainer;
>> import org.ofbiz.common.email.NotificationServices;
>> +import org.ofbiz.entity.Delegator;
>> +import org.ofbiz.security.Security;
>> import org.ofbiz.service.DispatchContext;
>> import org.ofbiz.service.LocalDispatcher;
>> import org.ofbiz.service.ServiceUtil;
>> @@ -69,7 +71,10 @@ public class BirtEmailServices {
>>       */
>>      public static Map<String, Object> sendBirtMail(DispatchContext ctx, Map<String, ? extends Object> context) {
>>          Map<String, Object> serviceContext = UtilMisc.makeMapWritable(context);
>> +        Delegator delegator = ctx.getDelegator();
>>          LocalDispatcher dispatcher = ctx.getDispatcher();
>> +        Security security = ctx.getSecurity();
>> +
>>          String webSiteId = (String) serviceContext.remove("webSiteId");
>>          String bodyText = (String) serviceContext.remove("bodyText");
>>          String bodyScreenUri = (String) serviceContext.remove("bodyScreenUri");
>> @@ -153,11 +158,14 @@ public class BirtEmailServices {
>>                      birtContentType = "application/pdf";
>>                  }
>>                  IReportEngine engine = BirtContainer.getReportEngine();
>> +                engine.getConfig().getAppContext().put("delegator", delegator);
>> +                engine.getConfig().getAppContext().put("dispatcher", dispatcher);
>> +                engine.getConfig().getAppContext().put("security", security);
>> +
>>                  InputStream reportInputStream = BirtFactory.getReportInputStreamFromLocation(birtReportLocation);
>>                  IReportRunnable design = engine.openReportDesign(reportInputStream);
>> -                     Debug.logInfo("Export report as content type:" + birtContentType, module);
>> -                     BirtWorker.exportReport(design, context, birtContentType, baos);
>> -                // and generate the PDF
>> +                Debug.logInfo("Export report as content type:" + birtContentType, module);
>> +                BirtWorker.exportReport(design, context, birtContentType, baos);
>>                  baos.flush();
>>                  baos.close();
>>
>>
>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java (original)
>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtEngineServlet.java Mon Nov  8 06:54:17 2010
>> @@ -24,9 +24,12 @@ import javax.servlet.http.HttpServletRes
>>
>> import org.eclipse.birt.core.exception.BirtException;
>> import org.eclipse.birt.report.context.IContext;
>> +import org.eclipse.birt.report.engine.api.IReportEngine;
>> import org.eclipse.birt.report.presentation.aggregation.layout.EngineFragment;
>> import org.eclipse.birt.report.presentation.aggregation.layout.RequesterFragment;
>> import org.eclipse.birt.report.service.BirtReportServiceFactory;
>> +import org.ofbiz.birt.BirtWorker;
>> +import org.ofbiz.birt.container.BirtContainer;
>> import org.ofbiz.birt.report.context.OFBizBirtContext;
>> import org.ofbiz.birt.report.service.OFBizBirtViewerReportService;
>>
>> @@ -52,6 +55,9 @@ public class BirtEngineServlet extends o
>>      protected IContext __getContext( HttpServletRequest request,
>>              HttpServletResponse response ) throws BirtException
>>      {
>> +        IReportEngine reportEngine = BirtContainer.getReportEngine();
>> +        BirtWorker.setWebContextObjects(reportEngine, request, response);
>> +
>>          BirtReportServiceFactory.getReportService( ).setContext(
>>                  getServletContext( ), null );
>>          return new OFBizBirtContext( request, response );
>>
>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java (original)
>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/report/servlet/BirtViewerServlet.java Mon Nov  8 06:54:17 2010
>> @@ -24,10 +24,13 @@ import javax.servlet.http.HttpServletRes
>>
>> import org.eclipse.birt.core.exception.BirtException;
>> import org.eclipse.birt.report.context.IContext;
>> +import org.eclipse.birt.report.engine.api.IReportEngine;
>> import org.eclipse.birt.report.presentation.aggregation.layout.FramesetFragment;
>> import org.eclipse.birt.report.presentation.aggregation.layout.RunFragment;
>> import org.eclipse.birt.report.service.BirtReportServiceFactory;
>> import org.eclipse.birt.report.servlet.ViewerServlet;
>> +import org.ofbiz.birt.BirtWorker;
>> +import org.ofbiz.birt.container.BirtContainer;
>> import org.ofbiz.birt.report.context.OFBizBirtContext;
>> import org.ofbiz.birt.report.service.OFBizBirtViewerReportService;
>>
>> @@ -56,6 +59,9 @@ public class BirtViewerServlet extends V
>>      protected IContext __getContext( HttpServletRequest request,
>>              HttpServletResponse response ) throws BirtException
>>      {
>> +        IReportEngine reportEngine = BirtContainer.getReportEngine();
>> +        BirtWorker.setWebContextObjects(reportEngine, request, response);
>> +
>>          BirtReportServiceFactory.getReportService( ).setContext(
>>                  getServletContext( ), null );
>>          return new OFBizBirtContext( request, response );
>>
>> Modified: ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java (original)
>> +++ ofbiz/trunk/framework/birt/src/org/ofbiz/birt/webapp/view/BirtViewHandler.java Mon Nov  8 06:54:17 2010
>> @@ -70,6 +70,7 @@ public class BirtViewHandler implements
>>      public void render(String name, String page, String info,
>>              String contentType, String encoding, HttpServletRequest request,
>>              HttpServletResponse response) throws ViewHandlerException {
>> +
>>          try {
>>              IReportEngine engine = BirtContainer.getReportEngine();
>>              // open report design
>> @@ -80,6 +81,8 @@ public class BirtViewHandler implements
>>              } else {
>>                  design = engine.openReportDesign(servletContext.getRealPath(page));
>>              }
>> +
>> +            BirtWorker.setWebContextObjects(engine, request, response);
>>
>>              Map<String, Object> context = FastMap.newInstance();
>>              // set parameters from request
>>
>> Modified: ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java (original)
>> +++ ofbiz/trunk/framework/catalina/src/org/ofbiz/catalina/container/CatalinaContainer.java Mon Nov  8 06:54:17 2010
>> @@ -67,6 +67,7 @@ import org.ofbiz.base.container.Containe
>> import org.ofbiz.base.container.ContainerConfig.Container.Property;
>> import org.ofbiz.base.util.Debug;
>> import org.ofbiz.base.util.SSLUtil;
>> +import org.ofbiz.base.util.UtilProperties;
>> import org.ofbiz.base.util.UtilURL;
>> import org.ofbiz.base.util.UtilValidate;
>> import org.ofbiz.base.util.UtilXml;
>> @@ -620,6 +621,43 @@ public class CatalinaContainer implement
>>          return context;
>>      }
>>
>> +    protected Context createTenantContext() throws ContainerException {
>> +        String server = "default-server";
>> +        Engine engine = engines.get(server);
>> +        if (engine == null) {
>> +            Debug.logWarning("Server with name [" + server + "] not found;", module);
>> +            return null;
>> +        }
>> +
>> +        // create the web application context
>> +        StandardContext context = (StandardContext) embedded.createContext("/", System.getProperty("ofbiz.home"));
>> +        context.setJ2EEApplication(J2EE_APP);
>> +        context.setJ2EEServer(J2EE_SERVER);
>> +        context.setLoader(embedded.createLoader(ClassLoaderContainer.getClassLoader()));
>> +        context.setReloadable(contextReloadable);
>> +        context.setDistributable(distribute);
>> +        context.setCrossContext(crossContext);
>> +
>> +
>> +        // create the Default Servlet instance to mount
>> +        StandardWrapper defaultServlet = new StandardWrapper();
>> +        defaultServlet.setServletClass("org.ofbiz.webapp.control.TenantServlet");
>> +        defaultServlet.setServletName("default");
>> +        defaultServlet.setLoadOnStartup(1);
>> +        defaultServlet.addInitParameter("debug", "0");
>> +        defaultServlet.addInitParameter("listing", "true");
>> +        defaultServlet.addMapping("/");
>> +        context.addChild(defaultServlet);
>> +        context.addServletMapping("/", "default");
>> +
>> +        Host host = hosts.get(engine.getName() + "._DEFAULT");
>> +        context.setRealm(host.getRealm());
>> +        host.addChild(context);
>> +        context.getMapper().setDefaultHostName(host.getName());
>> +
>> +        return context;
>> +    }
>> +
>>      protected void loadComponents() throws ContainerException {
>>          if (embedded == null) {
>>              throw new ContainerException("Cannot load web applications without Embedded instance!");
>> @@ -641,6 +679,12 @@ public class CatalinaContainer implement
>>                  }
>>              }
>>          }
>> +
>> +        // if the multitenant is enabled then create the tenant context
>> +        String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
>> +        if ("Y".equals(useMultitenant) && UtilValidate.isEmpty(delegator.getDelegatorTenantId())) {
>> +            createTenantContext();
>> +        }
>>      }
>>
>>      public void stop() throws ContainerException {
>>
>> Modified: ofbiz/trunk/framework/common/webcommon/login.ftl
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/webcommon/login.ftl?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/common/webcommon/login.ftl (original)
>> +++ ofbiz/trunk/framework/common/webcommon/login.ftl Mon Nov  8 06:54:17 2010
>> @@ -42,13 +42,15 @@ under the License.
>>              <td class="label">${uiLabelMap.CommonPassword}</td>
>>              <td><input type="password" name="PASSWORD" value="" size="20"/></td>
>>            </tr>
>> -          <#if ("Y" == useMultitenant && !sessionAttributes.tenantId?exists) >
>> -            <tr>
>> -              <td class="label">${uiLabelMap.CommonTenantId}</td>
>> -              <td><input type="text" name="tenantId" value="${parameters.tenantId?if_exists}" size="20"/></td>
>> -            </tr>
>> -          <#elseif ("Y" == useMultitenant && sessionAttributes.tenantId?exists) >
>> -              <input type="hidden" name="tenantId" value="${sessionAttributes.tenantId?if_exists}"/>
>> +          <#if ("Y" == useMultitenant) >
>> +              <#if !requestAttributes.tenantId?exists>
>> +                  <tr>
>> +                      <td class="label">${uiLabelMap.CommonTenantId}</td>
>> +                      <td><input type="text" name="tenantId" value="${parameters.tenantId?if_exists}" size="20"/></td>
>> +                  </tr>
>> +              <#else>
>> +                  <input type="hidden" name="tenantId" value="${requestAttributes.tenantId?if_exists}"/>
>> +              </#if>
>>            </#if>
>>            <tr>
>>              <td colspan="2" align="center">
>>
>> Modified: ofbiz/trunk/framework/entity/entitydef/entitymodel.xml
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/entitydef/entitymodel.xml?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/entity/entitydef/entitymodel.xml (original)
>> +++ ofbiz/trunk/framework/entity/entitydef/entitymodel.xml Mon Nov  8 06:54:17 2010
>> @@ -67,6 +67,7 @@ under the License.
>>          <field name="tenantId" type="id-ne"/>
>>          <field name="tenantName" type="name"/>
>>          <field name="domainName" type="long-varchar"/>
>> +        <field name="initialPath" type="value"/>
>>          <field name="disabled" type="indicator"><description>Disabled if 'Y', defaults to 'N' (not disabled).</description></field>
>>          <prim-key field="tenantId"/>
>>      </entity>
>>
>> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java (original)
>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java Mon Nov  8 06:54:17 2010
>> @@ -50,10 +50,16 @@ import org.ofbiz.base.util.Debug;
>> import org.ofbiz.base.util.StringUtil;
>> import org.ofbiz.base.util.UtilGenerics;
>> import org.ofbiz.base.util.UtilHttp;
>> +import org.ofbiz.base.util.UtilMisc;
>> import org.ofbiz.base.util.UtilObject;
>> +import org.ofbiz.base.util.UtilProperties;
>> import org.ofbiz.base.util.UtilValidate;
>> import org.ofbiz.entity.Delegator;
>> import org.ofbiz.entity.DelegatorFactory;
>> +import org.ofbiz.entity.GenericEntityException;
>> +import org.ofbiz.entity.GenericValue;
>> +import org.ofbiz.entity.condition.EntityCondition;
>> +import org.ofbiz.entity.util.EntityUtil;
>> import org.ofbiz.security.Security;
>> import org.ofbiz.security.SecurityConfigurationException;
>> import org.ofbiz.security.SecurityFactory;
>> @@ -266,6 +272,52 @@ public class ContextFilter implements Fi
>>                  return;
>>              }
>>          }
>> +
>> +        // check if multi tenant is enabled
>> +        String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
>> +        if ("Y".equals(useMultitenant)) {
>> +            // get tenant delegator by domain name
>> +            String serverName = request.getServerName();
>> +            try {
>> +                // if tenant was specified, replace delegator with the new per-tenant delegator and set tenantId to session attribute
>> +                Delegator delegator = getDelegator(config.getServletContext());
>> +                List<EntityCondition> conds = FastList.newInstance();
>> +                conds.add(EntityCondition.makeCondition("domainName", serverName));
>> +                List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition(conds), null, UtilMisc.toList("-createdStamp"), null, false);
>> +                if (UtilValidate.isNotEmpty(tenants)) {
>> +                    GenericValue tenant = EntityUtil.getFirst(tenants);
>> +                    String tenantId = tenant.getString("tenantId");
>> +
>> +                    // make that tenant active, setup a new delegator and a new dispatcher
>> +                    String tenantDelegatorName = delegator.getDelegatorBaseName() + "#" + tenantId;
>> +                    httpRequest.getSession().setAttribute("delegatorName", tenantDelegatorName);
>> +
>> +                    // after this line the delegator is replaced with the new per-tenant delegator
>> +                    delegator = DelegatorFactory.getDelegator(tenantDelegatorName);
>> +                    config.getServletContext().setAttribute("delegator", delegator);
>> +
>> +                    // clear web context objects
>> +                    config.getServletContext().setAttribute("authorization", null);
>> +                    config.getServletContext().setAttribute("security", null);
>> +                    config.getServletContext().setAttribute("dispatcher", null);
>> +
>> +                    // initialize authorizer
>> +                    getAuthz();
>> +                    // initialize security
>> +                    Security security = getSecurity();
>> +                    // initialize the services dispatcher
>> +                    LocalDispatcher dispatcher = getDispatcher(config.getServletContext());
>> +
>> +                    // set web context objects
>> +                    httpRequest.getSession().setAttribute("dispatcher", dispatcher);
>> +                    httpRequest.getSession().setAttribute("security", security);
>> +
>> +                    request.setAttribute("tenantId", tenantId);
>> +                }
>> +            } catch (GenericEntityException e) {
>> +                Debug.logWarning(e, "Unable to get Tenant", module);
>> +            }
>> +        }
>>
>>          // we're done checking; continue on
>>          chain.doFilter(request, response);
>>
>> Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java?rev=1032472&r1=1032471&r2=1032472&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java (original)
>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ControlServlet.java Mon Nov  8 06:54:17 2010
>> @@ -226,39 +226,6 @@ public class ControlServlet extends Http
>>
>>          String errorPage = null;
>>          try {
>> -            String useMultitenant = UtilProperties.getPropertyValue("general.properties", "multitenant");
>> -            if ("Y".equals(useMultitenant) && UtilValidate.isEmpty(delegator.getDelegatorTenantId())) {
>> -                // get tenant delegator by domain name
>> -                try {
>> -                    // if a domain name was specified for tenant, replace delegator with the new per-tenant delegator and set tenantId to session attribute
>> -                    List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", request.getServerName()), null, UtilMisc.toList("-createdStamp"), null, false);
>> -                    if (UtilValidate.isNotEmpty(tenants)) {
>> -                        GenericValue tenant = EntityUtil.getFirst(tenants);
>> -                        String tenantId = tenant.getString("tenantId");
>> -
>> -                        // make that tenant active, setup a new delegator and a new dispatcher
>> -                        String tenantDelegatorName = delegator.getDelegatorBaseName() + "#" + tenantId;
>> -
>> -                        // after this line the delegator is replaced with the new per-tenant delegator
>> -                        delegator = DelegatorFactory.getDelegator(tenantDelegatorName);
>> -                        session.setAttribute("tenantId", tenantId);
>> -                        session.setAttribute("delegatorName", tenantDelegatorName);
>> -                    }
>> -                } catch (GenericEntityException e) {
>> -                    String errMsg = "Error getting tenant by domain name: " + request.getServerName();
>> -                    Debug.logError(e, errMsg, module);
>> -                    throw new RequestHandlerException(errMsg, e);
>> -                }
>> -            }
>> -            if ("Y".equals(useMultitenant) && UtilValidate.isNotEmpty(delegator.getDelegatorTenantId())) {
>> -                // re-make dispatcher from tenant delegator and change delegator of security to use tanent delegator
>> -                dispatcher = ContextFilter.makeWebappDispatcher(session.getServletContext(), delegator);
>> -                security.setDelegator(delegator);
>> -
>> -                request.setAttribute("delegator", delegator);
>> -                request.setAttribute("dispatcher", dispatcher);
>> -            }
>> -
>>              // the ServerHitBin call for the event is done inside the doRequest method
>>              requestHandler.doRequest(request, response, null, userLogin, delegator);
>>          } catch (RequestHandlerException e) {
>>
>> Added: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java
>> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java?rev=1032472&view=auto
>> ==============================================================================
>> --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java (added)
>> +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/TenantServlet.java Mon Nov  8 06:54:17 2010
>> @@ -0,0 +1,68 @@
>> +/*******************************************************************************
>> + * Licensed to the Apache Software Foundation (ASF) under one
>> + * or more contributor license agreements.  See the NOTICE file
>> + * distributed with this work for additional information
>> + * regarding copyright ownership.  The ASF licenses this file
>> + * to you under the Apache License, Version 2.0 (the
>> + * "License"); you may not use this file except in compliance
>> + * with the License.  You may obtain a copy of the License at
>> + *
>> + * http://www.apache.org/licenses/LICENSE-2.0
>> + *
>> + * Unless required by applicable law or agreed to in writing,
>> + * software distributed under the License is distributed on an
>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
>> + * KIND, either express or implied.  See the License for the
>> + * specific language governing permissions and limitations
>> + * under the License.
>> + *******************************************************************************/
>> +package org.ofbiz.webapp.control;
>> +
>> +import java.io.IOException;
>> +import java.util.List;
>> +
>> +import javax.servlet.ServletException;
>> +import javax.servlet.http.HttpServlet;
>> +import javax.servlet.http.HttpServletRequest;
>> +import javax.servlet.http.HttpServletResponse;
>> +
>> +import org.ofbiz.base.util.Debug;
>> +import org.ofbiz.base.util.UtilMisc;
>> +import org.ofbiz.base.util.UtilValidate;
>> +import org.ofbiz.entity.Delegator;
>> +import org.ofbiz.entity.DelegatorFactory;
>> +import org.ofbiz.entity.GenericEntityException;
>> +import org.ofbiz.entity.GenericValue;
>> +import org.ofbiz.entity.condition.EntityCondition;
>> +import org.ofbiz.entity.util.EntityUtil;
>> +
>> +
>> +/**
>> + * TenantServlet.java - Tenant servlet for the web application.
>> + */
>> +@SuppressWarnings("serial")
>> +public class TenantServlet extends HttpServlet {
>> +
>> +    public static String module = TenantServlet.class.getName();
>> +
>> +    @Override
>> +    public void doGet(HttpServletRequest request, HttpServletResponse response)
>> +            throws ServletException, IOException {
>> +
>> +        // get default delegator
>> +        Delegator delegator = DelegatorFactory.getDelegator("default");
>> +        try {
>> +            // if a domain name was specified for tenant, redirect to initial path
>> +            List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", request.getServerName()), null, UtilMisc.toList("-createdStamp"), null, false);
>> +            if (UtilValidate.isNotEmpty(tenants)) {
>> +                GenericValue tenant = EntityUtil.getFirst(tenants);
>> +                String initialPath = tenant.getString("initialPath");
>> +                response.sendRedirect(initialPath);
>> +            }
>> +        } catch (GenericEntityException e) {
>> +            String errMsg = "Error getting tenant by domain name: " + request.getServerName();
>> +            Debug.logError(e, errMsg, module);
>> +            throw new ServletException(errMsg, e);
>> +        }
>> +    }
>> +}
>>
>>