Author: ashish
Date: Sat Dec 6 09:22:23 2014 New Revision: 1643510 URL: http://svn.apache.org/r1643510 Log: Applied patch from jira issue - OFBIZ-5898 - Tenant should run with specified domain name. Front store should support multi tenant feature. Thanks so much Arun for the contribution. Modified: ofbiz/trunk/build.xml ofbiz/trunk/framework/common/src/org/ofbiz/common/UrlServletHelper.java ofbiz/trunk/framework/entity/entitydef/entitygroup.xml ofbiz/trunk/framework/entity/entitydef/entitymodel.xml ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Derby.xml ofbiz/trunk/framework/resources/templates/AdminNewTenantData-MySQL.xml ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Oracle.xml ofbiz/trunk/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/ContextFilter.java ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java Modified: ofbiz/trunk/build.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/build.xml?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/build.xml (original) +++ ofbiz/trunk/build.xml Sat Dec 6 09:22:23 2014 @@ -924,6 +924,7 @@ under the License. <target name="get-tenant-data"> <input addproperty="tenantId" message="Enter Id for the tenant: "/> <input addproperty="tenantName" message="Enter name for tenant: "/> + <input addproperty="domainName" message="Enter domain name for tenant (Optional): "/> <input addproperty="data-readers" message="Enter data to install. Choices are e.g. seed,seed-initial,ext,demo. Multipe datasets must be separated with a comma: "/> @@ -955,6 +956,7 @@ under the License. <filterset> <filter token="tenantId" value="${tenantId}"/> <filter token="tenantName" value="${tenantName}"/> + <filter token="domainName" value="${domainName}"/> </filterset> </copy> <antcall target="load-file"> @@ -975,6 +977,7 @@ under the License. <filterset> <filter token="tenantId" value="${tenantId}"/> <filter token="tenantName" value="${tenantName}"/> + <filter token="domainName" value="${domainName}"/> <filter token="db-IP" value="${db-IP}"/> <filter token="db-User" value="${db-User}"/> <filter token="db-Password" value="${db-Password}"/> @@ -998,6 +1001,7 @@ under the License. <filterset> <filter token="tenantId" value="${tenantId}"/> <filter token="tenantName" value="${tenantName}"/> + <filter token="domainName" value="${domainName}"/> <filter token="db-IP" value="${db-IP}"/> <filter token="db-User" value="${db-User}"/> <filter token="db-Password" value="${db-Password}"/> @@ -1021,6 +1025,7 @@ under the License. <filterset> <filter token="tenantId" value="${tenantId}"/> <filter token="tenantName" value="${tenantName}"/> + <filter token="domainName" value="${domainName}"/> <filter token="db-IP" value="${db-IP}"/> <filter token="db-User" value="${db-User}"/> <filter token="db-Password" value="${db-Password}"/> @@ -1041,6 +1046,7 @@ under the License. <echo>------------------------------------</echo> <echo message="tenantId = ${tenantId}"/> <echo>tenantName = ${tenantName}</echo> + <echo>domainName = ${domainName}</echo> <echo>db-Platform = ${db-Platform}</echo> <echo>db-IP = ${db-IP}</echo> <echo>db-User = ${db-User}</echo> Modified: ofbiz/trunk/framework/common/src/org/ofbiz/common/UrlServletHelper.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/common/src/org/ofbiz/common/UrlServletHelper.java?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/framework/common/src/org/ofbiz/common/UrlServletHelper.java (original) +++ ofbiz/trunk/framework/common/src/org/ofbiz/common/UrlServletHelper.java Sat Dec 6 09:22:23 2014 @@ -57,15 +57,17 @@ public class UrlServletHelper extends Co try { // if tenant was specified, replace delegator with the new per-tenant delegator and set tenantId to session attribute delegator = getDelegator(servletContext); - List<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", serverName), null, UtilMisc.toList("-createdStamp"), null, false); - if (UtilValidate.isNotEmpty(tenants)) { - GenericValue tenant = EntityUtil.getFirst(tenants); - String tenantId = tenant.getString("tenantId"); - + + //Use base delegator for fetching data from entity of entityGroup org.ofbiz.tenant + Delegator baseDelegator = DelegatorFactory.getDelegator(delegator.getDelegatorBaseName()); + GenericValue tenantDomainName = baseDelegator.findOne("TenantDomainName", UtilMisc.toMap("domainName", serverName), false); + + if (UtilValidate.isNotEmpty(tenantDomainName)) { + String tenantId = tenantDomainName.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); servletContext.setAttribute("delegator", delegator); Modified: ofbiz/trunk/framework/entity/entitydef/entitygroup.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/entitydef/entitygroup.xml?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/entitydef/entitygroup.xml (original) +++ ofbiz/trunk/framework/entity/entitydef/entitygroup.xml Sat Dec 6 09:22:23 2014 @@ -29,4 +29,5 @@ under the License. <!-- <entity-group group="org.ofbiz.tenant" entity="TenantUserLogin"/> --> <entity-group group="org.ofbiz.tenant" entity="Component"/> <entity-group group="org.ofbiz.tenant" entity="TenantComponent"/> + <entity-group group="org.ofbiz.tenant" entity="TenantDomainName"/> </entitygroup> Modified: ofbiz/trunk/framework/entity/entitydef/entitymodel.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/entitydef/entitymodel.xml?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/framework/entity/entitydef/entitymodel.xml (original) +++ ofbiz/trunk/framework/entity/entitydef/entitymodel.xml Sat Dec 6 09:22:23 2014 @@ -66,7 +66,6 @@ under the License. <entity entity-name="Tenant" package-name="org.ofbiz.entity.tenant"> <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"/> @@ -153,4 +152,13 @@ under the License. <key-map field-name="componentName"/> </relation> </entity> + <entity entity-name="TenantDomainName" package-name="org.ofbiz.entity.tenant" + title="Tenant and its Domain Name"> + <field name="tenantId" type="id-ne"></field> + <field name="domainName" type="long-varchar"></field> + <prim-key field="domainName"/> + <relation type="one" fk-name="TNNT_DMNAM" rel-entity-name="Tenant"> + <key-map field-name="tenantId"/> + </relation> + </entity> </entitymodel> Modified: ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Derby.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Derby.xml?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Derby.xml (original) +++ ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Derby.xml Sat Dec 6 09:22:23 2014 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <entity-engine-xml> <Tenant tenantId="@tenantId@" tenantName="@tenantName@" /> + <TenantDomainName tenantId="@tenantId@" domainName="@domainName@" /> <TenantDataSource tenantId="@tenantId@" entityGroupName="org.ofbiz" jdbcUri="jdbc:derby:ofbiz_@tenantId@;create=true" jdbcUsername="ofbiz" jdbcPassword="ofbiz"/> <TenantDataSource tenantId="@tenantId@" entityGroupName="org.ofbiz.olap" Modified: ofbiz/trunk/framework/resources/templates/AdminNewTenantData-MySQL.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/resources/templates/AdminNewTenantData-MySQL.xml?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/framework/resources/templates/AdminNewTenantData-MySQL.xml (original) +++ ofbiz/trunk/framework/resources/templates/AdminNewTenantData-MySQL.xml Sat Dec 6 09:22:23 2014 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <entity-engine-xml> <Tenant tenantId="@tenantId@" tenantName="@tenantName@"/> + <TenantDomainName tenantId="@tenantId@" domainName="@domainName@" /> <TenantDataSource tenantId="@tenantId@" entityGroupName="org.ofbiz" jdbcUri="jdbc:mysql://@db-IP@/ofbiz_@tenantId@" jdbcUsername="@db-User@" jdbcPassword="@db-Password@"/> <TenantDataSource tenantId="@tenantId@" entityGroupName="org.ofbiz.olap" Modified: ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Oracle.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Oracle.xml?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Oracle.xml (original) +++ ofbiz/trunk/framework/resources/templates/AdminNewTenantData-Oracle.xml Sat Dec 6 09:22:23 2014 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <entity-engine-xml> <Tenant tenantId="@tenantId@" tenantName="@tenantName@"/> + <TenantDomainName tenantId="@tenantId@" domainName="@domainName@" /> <TenantDataSource tenantId="@tenantId@" entityGroupName="org.ofbiz" jdbcUri="jdbc:oracle:thin:@@db-IP@:ofbiz_@tenantId@" jdbcUsername="@db-User@" jdbcPassword="@db-Password@"/> <TenantDataSource tenantId="@tenantId@" entityGroupName="org.ofbiz.olap" Modified: ofbiz/trunk/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml (original) +++ ofbiz/trunk/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml Sat Dec 6 09:22:23 2014 @@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <entity-engine-xml> <Tenant tenantId="@tenantId@" tenantName="@tenantName@"/> + <TenantDomainName tenantId="@tenantId@" domainName="@domainName@" /> <TenantDataSource tenantId="@tenantId@" entityGroupName="org.ofbiz" jdbcUri="jdbc:postgresql://@db-IP@/ofbiz_@tenantId@" jdbcUsername="@db-User@" jdbcPassword="@db-Password@"/> <TenantDataSource tenantId="@tenantId@" entityGroupName="org.ofbiz.olap" 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=1643510&r1=1643509&r2=1643510&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 Sat Dec 6 09:22:23 2014 @@ -255,13 +255,17 @@ public class ContextFilter implements Fi 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<GenericValue> tenants = delegator.findList("Tenant", EntityCondition.makeCondition("domainName", serverName), null, UtilMisc.toList("-createdStamp"), null, false); - if (UtilValidate.isNotEmpty(tenants)) { - GenericValue tenant = EntityUtil.getFirst(tenants); - String tenantId = tenant.getString("tenantId"); + + //Use base delegator for fetching data from entity of entityGroup org.ofbiz.tenant + Delegator baseDelegator = DelegatorFactory.getDelegator(delegator.getDelegatorBaseName()); + GenericValue tenantDomainName = baseDelegator.findOne("TenantDomainName", UtilMisc.toMap("domainName", serverName), false); + + if (UtilValidate.isNotEmpty(tenantDomainName)) { + String tenantId = tenantDomainName.getString("tenantId"); // if the request path is a root mount then redirect to the initial path if (UtilValidate.isNotEmpty(requestPath) && requestPath.equals(contextUri)) { + GenericValue tenant = baseDelegator.findOne("Tenant", UtilMisc.toMap("tenantId", tenantId), false); String initialPath = tenant.getString("initialPath"); if (UtilValidate.isNotEmpty(initialPath) && !"/".equals(initialPath)) { ((HttpServletResponse)response).sendRedirect(initialPath); @@ -291,6 +295,30 @@ public class ContextFilter implements Fi request.setAttribute("security", security); request.setAttribute("tenantId", tenantId); + } else if (delegator.getDelegatorBaseName() != delegator.getDelegatorName()) { + + // Set default delegator + Debug.logInfo("No tenant found for requested domain name " + serverName, module); + Debug.logInfo("Setting default delegator and dispatcher", module); + String delegatorName = delegator.getDelegatorBaseName(); + httpRequest.getSession().setAttribute("delegatorName", delegatorName); + + // after this line the delegator is replaced with the new per-tenant delegator + delegator = DelegatorFactory.getDelegator(delegatorName); + config.getServletContext().setAttribute("delegator", delegator); + + // clear web context objects + config.getServletContext().setAttribute("security", null); + config.getServletContext().setAttribute("dispatcher", null); + + // initialize security + Security security = getSecurity(); + // initialize the services dispatcher + LocalDispatcher dispatcher = getDispatcher(config.getServletContext()); + + // set web context objects + request.setAttribute("dispatcher", dispatcher); + request.setAttribute("security", security); } // NOTE DEJ20101130: do NOT always put the delegator name in the user's session because the user may Modified: ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java?rev=1643510&r1=1643509&r2=1643510&view=diff ============================================================================== --- ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (original) +++ ofbiz/trunk/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java Sat Dec 6 09:22:23 2014 @@ -394,9 +394,13 @@ public class LoginWorker { LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); Delegator delegator = (Delegator) request.getAttribute("delegator"); + ServletContext servletContext = session.getServletContext(); // if a tenantId was passed in, see if the userLoginId is associated with that tenantId (can use any delegator for this, entity is not tenant-specific) String tenantId = request.getParameter("tenantId"); + if (UtilValidate.isEmpty(tenantId)) { + tenantId = (String) request.getAttribute("tenantId"); + } if (UtilValidate.isNotEmpty(tenantId)) { // see if we need to activate a tenant delegator, only do if the current delegatorName has a hash symbol in it, and if the passed in tenantId doesn't match the one in the delegatorName String oldDelegatorName = delegator.getDelegatorName(); @@ -438,7 +442,6 @@ public class LoginWorker { } */ - ServletContext servletContext = session.getServletContext(); // make that tenant active, setup a new delegator and a new dispatcher String delegatorName = delegator.getDelegatorBaseName() + "#" + tenantId; @@ -458,6 +461,22 @@ public class LoginWorker { // NOTE: these will be local for now and set in the request and session later, after we've verified that the user setupNewDelegatorEtc = true; } + } else { + // Set default delegator + Debug.logInfo("Setting default delegator", module); + String delegatorName = delegator.getDelegatorBaseName(); + try { + // after this line the delegator is replaced with default delegator + delegator = DelegatorFactory.getDelegator(delegatorName); + dispatcher = ContextFilter.makeWebappDispatcher(servletContext, delegator); + } catch (NullPointerException e) { + Debug.logError(e, "Error getting default delegator", module); + Map<String, String> messageMap = UtilMisc.toMap("errorMessage", "Error getting default delegator"); + String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.following_error_occurred_during_login", messageMap, UtilHttp.getLocale(request)); + request.setAttribute("_ERROR_MESSAGE_", errMsg); + return "error"; + } + setupNewDelegatorEtc = true; } Map<String, Object> result = null; @@ -514,7 +533,6 @@ public class LoginWorker { } } } - if (setupNewDelegatorEtc) { // now set the delegator and dispatcher in a bunch of places just in case they were changed setWebContextObjects(request, response, delegator, dispatcher); @@ -696,10 +714,11 @@ public class LoginWorker { if (currCatalog != null) session.setAttribute("CURRENT_CATALOG_ID", currCatalog); if (delegatorName != null) { + //Commented it as multi tenancy support is now available for front-store application as well. // if there is a tenantId in the delegatorName remove it now so that tenant selection doesn't last beyond logout - if (delegatorName.indexOf('#') > 0) { + /*if (delegatorName.indexOf('#') > 0) { delegatorName = delegatorName.substring(0, delegatorName.indexOf('#')); - } + }*/ session.setAttribute("delegatorName", delegatorName); delegator = DelegatorFactory.getDelegator(delegatorName); |
Free forum by Nabble | Edit this page |