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);
>> + }
>> + }
>> +}
>>
>>