Please revert this commit. It breaks back-end multi-tenancy.

Regards,

Pierre Smits

*ORRTIZ.COM <http://www.orrtiz.com>*
Services & Solutions for Cloud-
Based Manufacturing, Professional
Services and Retail & Trade
http://www.orrtiz.com

On Sat, Dec 6, 2014 at 10:22 AM, <ash...@apache.org> wrote:

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

Reply via email to