|
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, [hidden email] 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); > + } > + } > +} > > |
|
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, [hidden email] 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); >> + } >> + } >> +} >> >> |
|
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, [hidden email] 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); >>> + } >>> + } >>> +} >>> >>> > |
|
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... > > have different domainnames for frontend and backend and/or want to operate more than a single domainname in a single tenant. |
|
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 |
| Free forum by Nabble | Edit this page |
