[jira] Created: (OFBIZ-2020) Using on Ofbiz instance with multiple databases

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
23 messages Options
12
Reply | Threaded
Open this post in threaded view
|

[jira] Created: (OFBIZ-2020) Using on Ofbiz instance with multiple databases

Nicolas Malin (Jira)
Using on Ofbiz instance with multiple databases
-----------------------------------------------

                 Key: OFBIZ-2020
                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
             Project: OFBiz
          Issue Type: New Feature
    Affects Versions: SVN trunk
            Reporter: youssef khaye
             Fix For: SVN trunk


I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
I will be open to discuss any suggestion for improving this issue.
Following is a patch for current ofbiz trunk version:
Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml

===================================================================

--- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (working copy)

@@ -2611,6 +2611,9 @@

     </extend-entity>

     <extend-entity entity-name="UserLogin">

         <field name="partyId" type="id"></field>

+        <!--Begin specific : field used to store the delegator name along  theuse session -->

+        <field name="delegator" type="id"></field>

+        <!-- End Specific  -->

         <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">

             <key-map field-name="partyId"/>

         </relation>

Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (working copy)

@@ -1617,6 +1617,23 @@

         <value xml:lang="zh_CN">十二月</value>

         <value xml:lang="zh">十二月</value>

     </property>

+    <property key="CommonCompany">

+        <value xml:lang="ar">المؤسسة</value>

+        <value xml:lang="en">Company</value>

+        <value xml:lang="fr">Entreprise</value>

+    </property>

     <property key="CommonDelete">

         <value xml:lang="ar">حذف</value>

         <value xml:lang="cs">Smazat</value>

Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (working copy)

@@ -90,7 +90,7 @@

         if (username == null) username = (String) context.get("username");

         String password = (String) context.get("login.password");

         if (password == null) password = (String) context.get("password");

-

+        String userDelegatorName = (String) context.get("userDelegatorName");

         // get the visitId for the history entity

         String visitId = (String) context.get("visitId");

 

@@ -193,7 +193,9 @@

                                 // successful login & no loggout flag, no need to change anything, so don't do the store

                                 doStore = false;

                             }

-

+                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                                userLogin.set("delegator", userDelegatorName);

+                            }

                             successfulLogin = "Y";

 

                             if (!isServiceAuth) {

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (working copy)

@@ -96,6 +96,7 @@

   </div>

   <div id="masthead">

     <ul>

+      <li> Delegator : ${delegator.getDelegatorName()}</li>

       <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">

         <li class="logo-area">

           <#if shortcutIcon?has_content>

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (working copy)

@@ -18,7 +18,7 @@

 -->

 

 <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>

-

+<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>

 <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>

 <#if previousParams?has_content>

   <#assign previousParams = "?" + previousParams>

@@ -46,6 +46,12 @@

             <td class="label">${uiLabelMap.CommonPassword}</td>

             <td><input type="password" name="PASSWORD" value="" size="20"/></td>

           </tr>

+          <#if multidelegator=="true">

+          <tr>

+           <td class="label">${uiLabelMap.CommonCompany}</td>

+           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>

+          </tr>

+          </#if>

           <tr>

             <td colspan="2" align="center">

               <input type="submit" value="${uiLabelMap.CommonLogin}"/>

Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (working copy)

@@ -53,6 +53,9 @@

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

     </delegator>

+    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">

+        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        

+    </delegator>

     <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

@@ -327,6 +330,33 @@

                 pool-maxsize="250"/>

         <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

     </datasource>

+    <datasource name="localpostgres1"

+            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

+            schema-name="public"

+            field-type-name="postgres"

+            check-on-start="true"

+            add-missing-on-start="true"

+            use-fk-initially-deferred="false"

+            alias-view-columns="false"

+            join-style="ansi"

+            use-binary-type-for-blob="true">

+            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later:

+                result-fetch-size="50"

+            -->

+        <read-data reader-name="seed"/>

+        <read-data reader-name="seed-initial"/>

+        <read-data reader-name="demo"/>

+        <read-data reader-name="ext"/>

+        <inline-jdbc

+                jdbc-driver="org.postgresql.Driver"

+                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"

+                jdbc-username="ofbiz"

+                jdbc-password="ofbiz"

+                isolation-level="ReadCommitted"

+                pool-minsize="2"

+                pool-maxsize="250"/>

+        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

+    </datasource>

 

     <datasource name="localpostgres"

             helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties

===================================================================

--- /home/youssef/workspace/ofbiz/framework/security/config/security.properties (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties (working copy)

@@ -77,3 +77,6 @@

 

 # -- Hours after which EmailAdressVerification should expire

 email_verification.expire.hours=48

+

+# -- are we using multi delegator

+multi.delegator=false

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (working copy)

@@ -182,7 +182,14 @@

     public GenericDelegator getDelegator() {

         return dispatcher.getDelegator();

     }

-  

+        

+    /**

+     * @see org.ofbiz.service.LocalDispatcher#setDelegator()

+     */

+    public void setDelegator(GenericDelegator delegator) {

+            dispatcher.setDelegator(delegator);

+    }

+

     /**

      * @see org.ofbiz.service.LocalDispatcher#getSecurity()

      */

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (working copy)

@@ -100,7 +100,9 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator=delegator;

+    }

     public synchronized List<Job> poll() {

         List<Job> poll = FastList.newInstance();

 

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (working copy)

@@ -317,7 +317,7 @@

      * @return GenericEntityDelegator associated with this dispatcher

      */

     public GenericDelegator getDelegator();

-

+    public void setDelegator(GenericDelegator delegator);

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (working copy)

@@ -789,7 +789,14 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    

+    /**

+     * Gets the GenericDelegator associated with this dispatcher

+     * @return GenericDelegator associated with this dispatcher

+     */

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator = delegator;

+    }

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (working copy)

@@ -271,6 +271,15 @@

         <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>

         <value xml:lang="zh">密码是空的,请重新输入。</value>

     </property>

+    <property key="loginevents.delegator_not_found_reenter">

+        <value xml:lang="de">Company not found, please re-enter.</value>

+        <value xml:lang="en">Company not found, please re-enter.</value>

+        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>

+        <value xml:lang="it">Company not found, please re-enter.</value>

+        <value xml:lang="ru">Company not found, please re-enter.</value>

+        <value xml:lang="th">Company not found, please re-enter.</value>

+        <value xml:lang="zh">Company not found, please re-enter.</value>

+    </property>

     <property key="loginevents.unable_to_login_this_application">

         <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>

         <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (working copy)

@@ -18,6 +18,8 @@

  *******************************************************************************/

 package org.ofbiz.webapp.control;

 

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.UnsupportedEncodingException;

 import java.math.BigInteger;

 import java.net.URLEncoder;

@@ -23,7 +25,6 @@

 import java.net.URLEncoder;

 import java.security.cert.X509Certificate;

 import java.util.Enumeration;

-import java.util.HashMap;

 import java.util.List;

 import java.util.Map;

 import java.util.regex.Matcher;

@@ -47,7 +48,6 @@

 import org.ofbiz.base.util.GeneralException;

 import org.ofbiz.base.util.KeyStoreUtil;

 import org.ofbiz.base.util.UtilFormatOut;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilMisc;

 import org.ofbiz.base.util.UtilProperties;

@@ -58,7 +58,6 @@

 import org.ofbiz.entity.GenericValue;

 import org.ofbiz.entity.condition.EntityCondition;

 import org.ofbiz.entity.condition.EntityConditionList;

-import org.ofbiz.entity.condition.EntityExpr;

 import org.ofbiz.entity.condition.EntityOperator;

 import org.ofbiz.entity.model.ModelEntity;

 import org.ofbiz.entity.transaction.GenericTransactionException;

@@ -68,6 +67,7 @@

 import org.ofbiz.service.LocalDispatcher;

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceUtil;

+import org.ofbiz.webapp.event.CoreEvents;

 import org.ofbiz.webapp.stats.VisitHandler;

 

 /**

@@ -192,6 +192,9 @@

                     Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);

                 } else {

                     userLogin.set("hasLoggedOut", "Y");

+                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                        userLogin.set("delegator", null);

+                    }

                     userLogin.store();

                 }

             } catch (GenericEntityException e) {

@@ -308,9 +311,11 @@

 

         String username = request.getParameter("USERNAME");

         String password = request.getParameter("PASSWORD");

-

+        String userDelegatorName = request.getParameter("DELEGATOR");

+        

         if (username == null) username = (String) session.getAttribute("USERNAME");

         if (password == null) password = (String) session.getAttribute("PASSWORD");

+        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");

         

         // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...

         if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {

@@ -319,6 +324,11 @@

         if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {

             password = (String) request.getAttribute("PASSWORD");

         }

+        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){

+            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {

+                userDelegatorName = (String) request.getAttribute("DELEGATOR");

+            }

+        }

 

         List<String> unpwErrMsgList = FastList.newInstance();

         if (UtilValidate.isEmpty(username)) {

@@ -339,7 +349,21 @@

         if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {

             password = password.toLowerCase();

         }

-

+        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {

+            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+            request.setAttribute("_ERROR_MESSAGE_", errMsg);

+            return "error";

+        }

+        GenericDelegator userDelegator=null;

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);

+            if (userDelegator==null){

+                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+                request.setAttribute("_ERROR_MESSAGE_", errMsg);

+                return "error";

+            }

+        }

+        

         String requirePasswordChange = request.getParameter("requirePasswordChange");

 

         // get the visit id to pass to the userLogin for history

@@ -373,6 +397,10 @@

         }

 

         try {

+            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+                dispatcher.setDelegator(userDelegator);

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+            }

             result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));

         } catch (GenericServiceException e) {

             Debug.logError(e, "Error calling userLogin service", module);

@@ -385,6 +413,18 @@

         if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {

             GenericValue userLogin = (GenericValue) result.get("userLogin");

             Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);

+          

+            try{

+                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                    userLogin.set("delegator", userDelegatorName);

+                }

+                userLogin.store();

+            }

+            catch(GenericEntityException e){

+                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");

+                return "error";

+            }

+

             if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {

                 return "requirePasswordChange";

             }

@@ -419,7 +459,15 @@

         if (userLoginSession != null) {

             session.setAttribute("userLoginSession", userLoginSession);

         }

-

+        

+            

+        

+        //Begin specific

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));

+        CoreEvents.changeDelegator(request, response);

+        }

+        //End specific        

         request.setAttribute("_LOGIN_PASSED_", "TRUE");

 

         // run the after-login events

@@ -499,6 +547,16 @@

         // set the logged out flag

         LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);

 

+        //Begin specific :come back to default delegator for next login

+        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");

+            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  

+            HttpServletResponse response=null;

+            CoreEvents.changeDelegator(request, response);

+        }

+        //End specific  

+

+

         // this is a setting we don't want to lose, although it would be good to have a more general solution here...

         String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");

         // also make sure the delegatorName is preserved, especially so that a new Visit can be created

@@ -778,8 +836,14 @@

             GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");

             if (currentUserLogin != null) {

                 if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {

-                    // is the same user, just carry on...

-                    return "success";

+                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");

+                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){

+                        // is the same user, just carry on...

+                        return "success";

+                    }

+                    else{

+                        return "success";

+                    }

                 }

 

                 // logout the current user and login the new user...

@@ -786,8 +850,19 @@

                 logout(request, response);

                 // ignore the return value; even if the operation failed we want to set the new UserLogin

             }

-

+            

             doBasicLogin(userLogin, request);

+            

+            //Begin specific

+            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                String userDelegatorName = userLogin.getString("delegator");

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+                request.setAttribute("delegatorName", userDelegatorName);

+                CoreEvents.changeDelegator(request, response);

+            }

+            //End specific

+

+            

         } else {

             Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);

         }

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (working copy)

@@ -18,6 +18,9 @@

  *******************************************************************************/

 package org.ofbiz.webapp.event;

 

+import static org.ofbiz.base.util.UtilGenerics.checkCollection;

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.File;

 import java.io.FileInputStream;

 import java.io.FileNotFoundException;

@@ -28,7 +31,6 @@

 import java.util.Iterator;

 import java.util.Locale;

 import java.util.Map;

-import java.util.Set;

 import java.util.TimeZone;

 

 import javax.servlet.http.HttpServletRequest;

@@ -38,8 +40,6 @@

 import javolution.util.FastMap;

 

 import org.ofbiz.base.util.Debug;

-import static org.ofbiz.base.util.UtilGenerics.checkCollection;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilProperties;

 import org.ofbiz.base.util.UtilValidate;

@@ -54,6 +54,7 @@

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceDispatcher;

 import org.ofbiz.service.calendar.RecurrenceRule;

+import org.ofbiz.webapp.control.LoginWorker;

 import org.ofbiz.webapp.control.RequestHandler;

 

 /**

@@ -104,12 +105,54 @@

         String delegatorName = request.getParameter("delegator");

         Security security = (Security) request.getAttribute("security");

         Locale locale = UtilHttp.getLocale(request);

+        GenericDelegator delegator=null;

+        //Begin multi-delegator Specific : search for delegatorName into session information

+        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);

+            if (externalKey != null) {

+                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);

+                if (userLogin != null && delegatorName==null) {

+                    delegatorName = userLogin.getString("delegator");

+                }

+            }

+

+            if(delegatorName==null){

+                delegatorName = (String) request.getSession().getAttribute("delegatorName");

+            }

+            if (delegatorName == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

 

-        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

+            delegator = GenericDelegator.getGenericDelegator(delegatorName);

+

+            if (delegator == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        //set the secruity delegator to precise the database against wich the user permissions are checked

+            security.setDelegator(delegator);

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        }

+        //End multi-delegator specific

+        else{

+

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+

+

+           delegator = GenericDelegator.getGenericDelegator(delegatorName);

         }

+

         if (delegatorName == null) {

             String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

@@ -115,15 +158,6 @@

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

             return "error";

         }

-

-        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);

-

-        if (delegator == null) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

-        }

-

         // now change the dispatcher to use this delegator

         LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");

         DispatchContext dctx = dispatcher.getDispatchContext();

@@ -144,7 +178,14 @@

 

         request.getSession().setAttribute("delegator", delegator);

         request.getSession().setAttribute("dispatcher", dispatcher);

-

+        dispatcher.getJobManager().setDelegator(delegator);

+        dispatcher.setDelegator(delegator);

+        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("delegator", delegator);

+        request.setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("dispatcher", dispatcher);

+        request.setAttribute("security", security);

+        

         return "success";

     }

 

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Updated: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

youssef khaye updated OFBIZ-2020:
---------------------------------

    Description:
I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
I will be open to discuss any suggestion for improving this issue.
Following is a patch for current ofbiz trunk version:
Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml

===================================================================

--- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (working copy)

@@ -2611,6 +2611,9 @@

     </extend-entity>

     <extend-entity entity-name="UserLogin">

         <field name="partyId" type="id"></field>

+        <!--Begin specific : field used to store the delegator name along  theuse session -->

+        <field name="delegator" type="id"></field>

+        <!-- End Specific  -->

         <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">

             <key-map field-name="partyId"/>

         </relation>

Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (working copy)

@@ -1617,6 +1617,23 @@

         <value xml:lang="zh_CN">十二月</value>

         <value xml:lang="zh">十二月</value>

     </property>

+    <property key="CommonCompany">

+        <value xml:lang="ar">المؤسسة</value>

+        <value xml:lang="en">Company</value>

+        <value xml:lang="fr">Entreprise</value>

+    </property>

     <property key="CommonDelete">

         <value xml:lang="ar">حذف</value>

         <value xml:lang="cs">Smazat</value>

Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (working copy)

@@ -90,7 +90,7 @@

         if (username == null) username = (String) context.get("username");

         String password = (String) context.get("login.password");

         if (password == null) password = (String) context.get("password");

-

+        String userDelegatorName = (String) context.get("userDelegatorName");

         // get the visitId for the history entity

         String visitId = (String) context.get("visitId");

 

@@ -193,7 +193,9 @@

                                 // successful login & no loggout flag, no need to change anything, so don't do the store

                                 doStore = false;

                             }

-

+                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                                userLogin.set("delegator", userDelegatorName);

+                            }

                             successfulLogin = "Y";

 

                             if (!isServiceAuth) {

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (working copy)

@@ -96,6 +96,7 @@

   </div>

   <div id="masthead">

     <ul>

+      <li> Delegator : ${delegator.getDelegatorName()}</li>

       <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">

         <li class="logo-area">

           <#if shortcutIcon?has_content>

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (working copy)

@@ -18,7 +18,7 @@

 -->

 

 <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>

-

+<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>

 <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>

 <#if previousParams?has_content>

   <#assign previousParams = "?" + previousParams>

@@ -46,6 +46,12 @@

             <td class="label">${uiLabelMap.CommonPassword}</td>

             <td><input type="password" name="PASSWORD" value="" size="20"/></td>

           </tr>

+          <#if multidelegator=="true">

+          <tr>

+           <td class="label">${uiLabelMap.CommonCompany}</td>

+           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>

+          </tr>

+          </#if>

           <tr>

             <td colspan="2" align="center">

               <input type="submit" value="${uiLabelMap.CommonLogin}"/>

Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (working copy)

@@ -53,6 +53,9 @@

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

     </delegator>

+    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">

+        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        

+    </delegator>

     <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

@@ -327,6 +330,33 @@

                 pool-maxsize="250"/>

         <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

     </datasource>

+    <datasource name="localpostgres1"

+            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

+            schema-name="public"

+            field-type-name="postgres"

+            check-on-start="true"

+            add-missing-on-start="true"

+            use-fk-initially-deferred="false"

+            alias-view-columns="false"

+            join-style="ansi"

+            use-binary-type-for-blob="true">

+            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later:

+                result-fetch-size="50"

+            -->

+        <read-data reader-name="seed"/>

+        <read-data reader-name="seed-initial"/>

+        <read-data reader-name="demo"/>

+        <read-data reader-name="ext"/>

+        <inline-jdbc

+                jdbc-driver="org.postgresql.Driver"

+                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"

+                jdbc-username="ofbiz"

+                jdbc-password="ofbiz"

+                isolation-level="ReadCommitted"

+                pool-minsize="2"

+                pool-maxsize="250"/>

+        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

+    </datasource>

 

     <datasource name="localpostgres"

             helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties

===================================================================

--- /home/youssef/workspace/ofbiz/framework/security/config/security.properties (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties (working copy)

@@ -77,3 +77,6 @@

 

 # -- Hours after which EmailAdressVerification should expire

 email_verification.expire.hours=48

+

+# -- are we using multi delegator

+multi.delegator=false

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (working copy)

@@ -182,7 +182,14 @@

     public GenericDelegator getDelegator() {

         return dispatcher.getDelegator();

     }

-  

+        

+    /**

+     * @see org.ofbiz.service.LocalDispatcher#setDelegator()

+     */

+    public void setDelegator(GenericDelegator delegator) {

+            dispatcher.setDelegator(delegator);

+    }

+

     /**

      * @see org.ofbiz.service.LocalDispatcher#getSecurity()

      */

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (working copy)

@@ -100,7 +100,9 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator=delegator;

+    }

     public synchronized List<Job> poll() {

         List<Job> poll = FastList.newInstance();

 

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (working copy)

@@ -317,7 +317,7 @@

      * @return GenericEntityDelegator associated with this dispatcher

      */

     public GenericDelegator getDelegator();

-

+    public void setDelegator(GenericDelegator delegator);

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (working copy)

@@ -789,7 +789,14 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    

+    /**

+     * Gets the GenericDelegator associated with this dispatcher

+     * @return GenericDelegator associated with this dispatcher

+     */

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator = delegator;

+    }

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (working copy)

@@ -271,6 +271,15 @@

         <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>

         <value xml:lang="zh">密码是空的,请重新输入。</value>

     </property>

+    <property key="loginevents.delegator_not_found_reenter">

+        <value xml:lang="de">Company not found, please re-enter.</value>

+        <value xml:lang="en">Company not found, please re-enter.</value>

+        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>

+        <value xml:lang="it">Company not found, please re-enter.</value>

+        <value xml:lang="ru">Company not found, please re-enter.</value>

+        <value xml:lang="th">Company not found, please re-enter.</value>

+        <value xml:lang="zh">Company not found, please re-enter.</value>

+    </property>

     <property key="loginevents.unable_to_login_this_application">

         <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>

         <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (working copy)

@@ -18,6 +18,8 @@

  *******************************************************************************/

 package org.ofbiz.webapp.control;

 

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.UnsupportedEncodingException;

 import java.math.BigInteger;

 import java.net.URLEncoder;

@@ -23,7 +25,6 @@

 import java.net.URLEncoder;

 import java.security.cert.X509Certificate;

 import java.util.Enumeration;

-import java.util.HashMap;

 import java.util.List;

 import java.util.Map;

 import java.util.regex.Matcher;

@@ -47,7 +48,6 @@

 import org.ofbiz.base.util.GeneralException;

 import org.ofbiz.base.util.KeyStoreUtil;

 import org.ofbiz.base.util.UtilFormatOut;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilMisc;

 import org.ofbiz.base.util.UtilProperties;

@@ -58,7 +58,6 @@

 import org.ofbiz.entity.GenericValue;

 import org.ofbiz.entity.condition.EntityCondition;

 import org.ofbiz.entity.condition.EntityConditionList;

-import org.ofbiz.entity.condition.EntityExpr;

 import org.ofbiz.entity.condition.EntityOperator;

 import org.ofbiz.entity.model.ModelEntity;

 import org.ofbiz.entity.transaction.GenericTransactionException;

@@ -68,6 +67,7 @@

 import org.ofbiz.service.LocalDispatcher;

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceUtil;

+import org.ofbiz.webapp.event.CoreEvents;

 import org.ofbiz.webapp.stats.VisitHandler;

 

 /**

@@ -192,6 +192,9 @@

                     Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);

                 } else {

                     userLogin.set("hasLoggedOut", "Y");

+                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                        userLogin.set("delegator", null);

+                    }

                     userLogin.store();

                 }

             } catch (GenericEntityException e) {

@@ -308,9 +311,11 @@

 

         String username = request.getParameter("USERNAME");

         String password = request.getParameter("PASSWORD");

-

+        String userDelegatorName = request.getParameter("DELEGATOR");

+        

         if (username == null) username = (String) session.getAttribute("USERNAME");

         if (password == null) password = (String) session.getAttribute("PASSWORD");

+        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");

         

         // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...

         if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {

@@ -319,6 +324,11 @@

         if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {

             password = (String) request.getAttribute("PASSWORD");

         }

+        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){

+            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {

+                userDelegatorName = (String) request.getAttribute("DELEGATOR");

+            }

+        }

 

         List<String> unpwErrMsgList = FastList.newInstance();

         if (UtilValidate.isEmpty(username)) {

@@ -339,7 +349,21 @@

         if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {

             password = password.toLowerCase();

         }

-

+        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {

+            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+            request.setAttribute("_ERROR_MESSAGE_", errMsg);

+            return "error";

+        }

+        GenericDelegator userDelegator=null;

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);

+            if (userDelegator==null){

+                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+                request.setAttribute("_ERROR_MESSAGE_", errMsg);

+                return "error";

+            }

+        }

+        

         String requirePasswordChange = request.getParameter("requirePasswordChange");

 

         // get the visit id to pass to the userLogin for history

@@ -373,6 +397,10 @@

         }

 

         try {

+            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+                dispatcher.setDelegator(userDelegator);

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+            }

             result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));

         } catch (GenericServiceException e) {

             Debug.logError(e, "Error calling userLogin service", module);

@@ -385,6 +413,18 @@

         if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {

             GenericValue userLogin = (GenericValue) result.get("userLogin");

             Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);

+          

+            try{

+                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                    userLogin.set("delegator", userDelegatorName);

+                }

+                userLogin.store();

+            }

+            catch(GenericEntityException e){

+                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");

+                return "error";

+            }

+

             if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {

                 return "requirePasswordChange";

             }

@@ -419,7 +459,15 @@

         if (userLoginSession != null) {

             session.setAttribute("userLoginSession", userLoginSession);

         }

-

+        

+            

+        

+        //Begin specific

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));

+        CoreEvents.changeDelegator(request, response);

+        }

+        //End specific        

         request.setAttribute("_LOGIN_PASSED_", "TRUE");

 

         // run the after-login events

@@ -499,6 +547,16 @@

         // set the logged out flag

         LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);

 

+        //Begin specific :come back to default delegator for next login

+        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");

+            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  

+            HttpServletResponse response=null;

+            CoreEvents.changeDelegator(request, response);

+        }

+        //End specific  

+

+

         // this is a setting we don't want to lose, although it would be good to have a more general solution here...

         String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");

         // also make sure the delegatorName is preserved, especially so that a new Visit can be created

@@ -778,8 +836,14 @@

             GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");

             if (currentUserLogin != null) {

                 if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {

-                    // is the same user, just carry on...

-                    return "success";

+                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");

+                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){

+                        // is the same user, just carry on...

+                        return "success";

+                    }

+                    else{

+                        return "success";

+                    }

                 }

 

                 // logout the current user and login the new user...

@@ -786,8 +850,19 @@

                 logout(request, response);

                 // ignore the return value; even if the operation failed we want to set the new UserLogin

             }

-

+            

             doBasicLogin(userLogin, request);

+            

+            //Begin specific

+            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                String userDelegatorName = userLogin.getString("delegator");

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+                request.setAttribute("delegatorName", userDelegatorName);

+                CoreEvents.changeDelegator(request, response);

+            }

+            //End specific

+

+            

         } else {

             Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);


         }

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (working copy)

@@ -18,6 +18,9 @@

  *******************************************************************************/

 package org.ofbiz.webapp.event;

 

+import static org.ofbiz.base.util.UtilGenerics.checkCollection;

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.File;

 import java.io.FileInputStream;

 import java.io.FileNotFoundException;

@@ -28,7 +31,6 @@

 import java.util.Iterator;

 import java.util.Locale;

 import java.util.Map;

-import java.util.Set;

 import java.util.TimeZone;

 

 import javax.servlet.http.HttpServletRequest;

@@ -38,8 +40,6 @@

 import javolution.util.FastMap;

 

 import org.ofbiz.base.util.Debug;

-import static org.ofbiz.base.util.UtilGenerics.checkCollection;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilProperties;

 import org.ofbiz.base.util.UtilValidate;

@@ -54,6 +54,7 @@

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceDispatcher;

 import org.ofbiz.service.calendar.RecurrenceRule;

+import org.ofbiz.webapp.control.LoginWorker;

 import org.ofbiz.webapp.control.RequestHandler;

 

 /**

@@ -104,12 +105,54 @@

         String delegatorName = request.getParameter("delegator");

         Security security = (Security) request.getAttribute("security");

         Locale locale = UtilHttp.getLocale(request);

+        GenericDelegator delegator=null;

+        //Begin multi-delegator Specific : search for delegatorName into session information

+        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);

+            if (externalKey != null) {

+                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);

+                if (userLogin != null && delegatorName==null) {

+                    delegatorName = userLogin.getString("delegator");

+                }

+            }

+

+            if(delegatorName==null){

+                delegatorName = (String) request.getSession().getAttribute("delegatorName");

+            }

+            if (delegatorName == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

 

-        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

+            delegator = GenericDelegator.getGenericDelegator(delegatorName);

+

+            if (delegator == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        //set the secruity delegator to precise the database against wich the user permissions are checked

+            security.setDelegator(delegator);

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        }

+        //End multi-delegator specific

+        else{

+

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+

+

+           delegator = GenericDelegator.getGenericDelegator(delegatorName);

         }

+

         if (delegatorName == null) {

             String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

@@ -115,15 +158,6 @@

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

             return "error";

         }

-

-        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);

-

-        if (delegator == null) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

-        }

-

         // now change the dispatcher to use this delegator

         LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");

         DispatchContext dctx = dispatcher.getDispatchContext();

@@ -144,7 +178,14 @@

 

         request.getSession().setAttribute("delegator", delegator);

         request.getSession().setAttribute("dispatcher", dispatcher);

-

+        dispatcher.getJobManager().setDelegator(delegator);

+        dispatcher.setDelegator(delegator);

+        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("delegator", delegator);

+        request.setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("dispatcher", dispatcher);

+        request.setAttribute("security", security);

+        

         return "success";

     }

 

  was:
I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
I will be open to discuss any suggestion for improving this issue.
Following is a patch for current ofbiz trunk version:
Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml

===================================================================

--- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (working copy)

@@ -2611,6 +2611,9 @@

     </extend-entity>

     <extend-entity entity-name="UserLogin">

         <field name="partyId" type="id"></field>

+        <!--Begin specific : field used to store the delegator name along  theuse session -->

+        <field name="delegator" type="id"></field>

+        <!-- End Specific  -->

         <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">

             <key-map field-name="partyId"/>

         </relation>

Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (working copy)

@@ -1617,6 +1617,23 @@

         <value xml:lang="zh_CN">十二月</value>

         <value xml:lang="zh">十二月</value>

     </property>

+    <property key="CommonCompany">

+        <value xml:lang="ar">المؤسسة</value>

+        <value xml:lang="en">Company</value>

+        <value xml:lang="fr">Entreprise</value>

+    </property>

     <property key="CommonDelete">

         <value xml:lang="ar">حذف</value>

         <value xml:lang="cs">Smazat</value>

Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (working copy)

@@ -90,7 +90,7 @@

         if (username == null) username = (String) context.get("username");

         String password = (String) context.get("login.password");

         if (password == null) password = (String) context.get("password");

-

+        String userDelegatorName = (String) context.get("userDelegatorName");

         // get the visitId for the history entity

         String visitId = (String) context.get("visitId");

 

@@ -193,7 +193,9 @@

                                 // successful login & no loggout flag, no need to change anything, so don't do the store

                                 doStore = false;

                             }

-

+                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                                userLogin.set("delegator", userDelegatorName);

+                            }

                             successfulLogin = "Y";

 

                             if (!isServiceAuth) {

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (working copy)

@@ -96,6 +96,7 @@

   </div>

   <div id="masthead">

     <ul>

+      <li> Delegator : ${delegator.getDelegatorName()}</li>

       <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">

         <li class="logo-area">

           <#if shortcutIcon?has_content>

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (working copy)

@@ -18,7 +18,7 @@

 -->

 

 <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>

-

+<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>

 <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>

 <#if previousParams?has_content>

   <#assign previousParams = "?" + previousParams>

@@ -46,6 +46,12 @@

             <td class="label">${uiLabelMap.CommonPassword}</td>

             <td><input type="password" name="PASSWORD" value="" size="20"/></td>

           </tr>

+          <#if multidelegator=="true">

+          <tr>

+           <td class="label">${uiLabelMap.CommonCompany}</td>

+           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>

+          </tr>

+          </#if>

           <tr>

             <td colspan="2" align="center">

               <input type="submit" value="${uiLabelMap.CommonLogin}"/>

Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (working copy)

@@ -53,6 +53,9 @@

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

     </delegator>

+    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">

+        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        

+    </delegator>

     <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

@@ -327,6 +330,33 @@

                 pool-maxsize="250"/>

         <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

     </datasource>

+    <datasource name="localpostgres1"

+            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

+            schema-name="public"

+            field-type-name="postgres"

+            check-on-start="true"

+            add-missing-on-start="true"

+            use-fk-initially-deferred="false"

+            alias-view-columns="false"

+            join-style="ansi"

+            use-binary-type-for-blob="true">

+            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later:

+                result-fetch-size="50"

+            -->

+        <read-data reader-name="seed"/>

+        <read-data reader-name="seed-initial"/>

+        <read-data reader-name="demo"/>

+        <read-data reader-name="ext"/>

+        <inline-jdbc

+                jdbc-driver="org.postgresql.Driver"

+                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"

+                jdbc-username="ofbiz"

+                jdbc-password="ofbiz"

+                isolation-level="ReadCommitted"

+                pool-minsize="2"

+                pool-maxsize="250"/>

+        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

+    </datasource>

 

     <datasource name="localpostgres"

             helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties

===================================================================

--- /home/youssef/workspace/ofbiz/framework/security/config/security.properties (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties (working copy)

@@ -77,3 +77,6 @@

 

 # -- Hours after which EmailAdressVerification should expire

 email_verification.expire.hours=48

+

+# -- are we using multi delegator

+multi.delegator=false

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (working copy)

@@ -182,7 +182,14 @@

     public GenericDelegator getDelegator() {

         return dispatcher.getDelegator();

     }

-  

+        

+    /**

+     * @see org.ofbiz.service.LocalDispatcher#setDelegator()

+     */

+    public void setDelegator(GenericDelegator delegator) {

+            dispatcher.setDelegator(delegator);

+    }

+

     /**

      * @see org.ofbiz.service.LocalDispatcher#getSecurity()

      */

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (working copy)

@@ -100,7 +100,9 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator=delegator;

+    }

     public synchronized List<Job> poll() {

         List<Job> poll = FastList.newInstance();

 

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (working copy)

@@ -317,7 +317,7 @@

      * @return GenericEntityDelegator associated with this dispatcher

      */

     public GenericDelegator getDelegator();

-

+    public void setDelegator(GenericDelegator delegator);

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (working copy)

@@ -789,7 +789,14 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    

+    /**

+     * Gets the GenericDelegator associated with this dispatcher

+     * @return GenericDelegator associated with this dispatcher

+     */

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator = delegator;

+    }

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (working copy)

@@ -271,6 +271,15 @@

         <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>

         <value xml:lang="zh">密码是空的,请重新输入。</value>

     </property>

+    <property key="loginevents.delegator_not_found_reenter">

+        <value xml:lang="de">Company not found, please re-enter.</value>

+        <value xml:lang="en">Company not found, please re-enter.</value>

+        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>

+        <value xml:lang="it">Company not found, please re-enter.</value>

+        <value xml:lang="ru">Company not found, please re-enter.</value>

+        <value xml:lang="th">Company not found, please re-enter.</value>

+        <value xml:lang="zh">Company not found, please re-enter.</value>

+    </property>

     <property key="loginevents.unable_to_login_this_application">

         <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>

         <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (working copy)

@@ -18,6 +18,8 @@

  *******************************************************************************/

 package org.ofbiz.webapp.control;

 

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.UnsupportedEncodingException;

 import java.math.BigInteger;

 import java.net.URLEncoder;

@@ -23,7 +25,6 @@

 import java.net.URLEncoder;

 import java.security.cert.X509Certificate;

 import java.util.Enumeration;

-import java.util.HashMap;

 import java.util.List;

 import java.util.Map;

 import java.util.regex.Matcher;

@@ -47,7 +48,6 @@

 import org.ofbiz.base.util.GeneralException;

 import org.ofbiz.base.util.KeyStoreUtil;

 import org.ofbiz.base.util.UtilFormatOut;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilMisc;

 import org.ofbiz.base.util.UtilProperties;

@@ -58,7 +58,6 @@

 import org.ofbiz.entity.GenericValue;

 import org.ofbiz.entity.condition.EntityCondition;

 import org.ofbiz.entity.condition.EntityConditionList;

-import org.ofbiz.entity.condition.EntityExpr;

 import org.ofbiz.entity.condition.EntityOperator;

 import org.ofbiz.entity.model.ModelEntity;

 import org.ofbiz.entity.transaction.GenericTransactionException;

@@ -68,6 +67,7 @@

 import org.ofbiz.service.LocalDispatcher;

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceUtil;

+import org.ofbiz.webapp.event.CoreEvents;

 import org.ofbiz.webapp.stats.VisitHandler;

 

 /**

@@ -192,6 +192,9 @@

                     Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);

                 } else {

                     userLogin.set("hasLoggedOut", "Y");

+                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                        userLogin.set("delegator", null);

+                    }

                     userLogin.store();

                 }

             } catch (GenericEntityException e) {

@@ -308,9 +311,11 @@

 

         String username = request.getParameter("USERNAME");

         String password = request.getParameter("PASSWORD");

-

+        String userDelegatorName = request.getParameter("DELEGATOR");

+        

         if (username == null) username = (String) session.getAttribute("USERNAME");

         if (password == null) password = (String) session.getAttribute("PASSWORD");

+        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");

         

         // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...

         if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {

@@ -319,6 +324,11 @@

         if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {

             password = (String) request.getAttribute("PASSWORD");

         }

+        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){

+            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {

+                userDelegatorName = (String) request.getAttribute("DELEGATOR");

+            }

+        }

 

         List<String> unpwErrMsgList = FastList.newInstance();

         if (UtilValidate.isEmpty(username)) {

@@ -339,7 +349,21 @@

         if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {

             password = password.toLowerCase();

         }

-

+        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {

+            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+            request.setAttribute("_ERROR_MESSAGE_", errMsg);

+            return "error";

+        }

+        GenericDelegator userDelegator=null;

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);

+            if (userDelegator==null){

+                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+                request.setAttribute("_ERROR_MESSAGE_", errMsg);

+                return "error";

+            }

+        }

+        

         String requirePasswordChange = request.getParameter("requirePasswordChange");

 

         // get the visit id to pass to the userLogin for history

@@ -373,6 +397,10 @@

         }

 

         try {

+            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+                dispatcher.setDelegator(userDelegator);

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+            }

             result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));

         } catch (GenericServiceException e) {

             Debug.logError(e, "Error calling userLogin service", module);

@@ -385,6 +413,18 @@

         if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {

             GenericValue userLogin = (GenericValue) result.get("userLogin");

             Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);

+          

+            try{

+                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                    userLogin.set("delegator", userDelegatorName);

+                }

+                userLogin.store();

+            }

+            catch(GenericEntityException e){

+                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");

+                return "error";

+            }

+

             if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {

                 return "requirePasswordChange";

             }

@@ -419,7 +459,15 @@

         if (userLoginSession != null) {

             session.setAttribute("userLoginSession", userLoginSession);

         }

-

+        

+            

+        

+        //Begin specific

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));

+        CoreEvents.changeDelegator(request, response);

+        }

+        //End specific        

         request.setAttribute("_LOGIN_PASSED_", "TRUE");

 

         // run the after-login events

@@ -499,6 +547,16 @@

         // set the logged out flag

         LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);

 

+        //Begin specific :come back to default delegator for next login

+        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");

+            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  

+            HttpServletResponse response=null;

+            CoreEvents.changeDelegator(request, response);

+        }

+        //End specific  

+

+

         // this is a setting we don't want to lose, although it would be good to have a more general solution here...

         String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");

         // also make sure the delegatorName is preserved, especially so that a new Visit can be created

@@ -778,8 +836,14 @@

             GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");

             if (currentUserLogin != null) {

                 if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {

-                    // is the same user, just carry on...

-                    return "success";

+                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");

+                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){

+                        // is the same user, just carry on...

+                        return "success";

+                    }

+                    else{

+                        return "success";

+                    }

                 }

 

                 // logout the current user and login the new user...

@@ -786,8 +850,19 @@

                 logout(request, response);

                 // ignore the return value; even if the operation failed we want to set the new UserLogin

             }

-

+            

             doBasicLogin(userLogin, request);

+            

+            //Begin specific

+            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                String userDelegatorName = userLogin.getString("delegator");

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+                request.setAttribute("delegatorName", userDelegatorName);

+                CoreEvents.changeDelegator(request, response);

+            }

+            //End specific

+

+            

         } else {

             Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);

         }

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (working copy)

@@ -18,6 +18,9 @@

  *******************************************************************************/

 package org.ofbiz.webapp.event;

 

+import static org.ofbiz.base.util.UtilGenerics.checkCollection;

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.File;

 import java.io.FileInputStream;

 import java.io.FileNotFoundException;

@@ -28,7 +31,6 @@

 import java.util.Iterator;

 import java.util.Locale;

 import java.util.Map;

-import java.util.Set;

 import java.util.TimeZone;

 

 import javax.servlet.http.HttpServletRequest;

@@ -38,8 +40,6 @@

 import javolution.util.FastMap;

 

 import org.ofbiz.base.util.Debug;

-import static org.ofbiz.base.util.UtilGenerics.checkCollection;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilProperties;

 import org.ofbiz.base.util.UtilValidate;

@@ -54,6 +54,7 @@

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceDispatcher;

 import org.ofbiz.service.calendar.RecurrenceRule;

+import org.ofbiz.webapp.control.LoginWorker;

 import org.ofbiz.webapp.control.RequestHandler;

 

 /**

@@ -104,12 +105,54 @@

         String delegatorName = request.getParameter("delegator");

         Security security = (Security) request.getAttribute("security");

         Locale locale = UtilHttp.getLocale(request);

+        GenericDelegator delegator=null;

+        //Begin multi-delegator Specific : search for delegatorName into session information

+        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);

+            if (externalKey != null) {

+                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);

+                if (userLogin != null && delegatorName==null) {

+                    delegatorName = userLogin.getString("delegator");

+                }

+            }

+

+            if(delegatorName==null){

+                delegatorName = (String) request.getSession().getAttribute("delegatorName");

+            }

+            if (delegatorName == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

 

-        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

+            delegator = GenericDelegator.getGenericDelegator(delegatorName);

+

+            if (delegator == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        //set the secruity delegator to precise the database against wich the user permissions are checked

+            security.setDelegator(delegator);

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        }

+        //End multi-delegator specific

+        else{

+

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+

+

+           delegator = GenericDelegator.getGenericDelegator(delegatorName);

         }

+

         if (delegatorName == null) {

             String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

@@ -115,15 +158,6 @@

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

             return "error";

         }

-

-        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);

-

-        if (delegator == null) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

-        }

-

         // now change the dispatcher to use this delegator

         LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");

         DispatchContext dctx = dispatcher.getDispatchContext();

@@ -144,7 +178,14 @@

 

         request.getSession().setAttribute("delegator", delegator);

         request.getSession().setAttribute("dispatcher", dispatcher);

-

+        dispatcher.getJobManager().setDelegator(delegator);

+        dispatcher.setDelegator(delegator);

+        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("delegator", delegator);

+        request.setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("dispatcher", dispatcher);

+        request.setAttribute("security", security);

+        

         return "success";

     }

 

        Summary: Using one Ofbiz instance with multiple databases  (was: Using on Ofbiz instance with multiple databases)

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>             Fix For: SVN trunk
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:
> Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (working copy)
> @@ -2611,6 +2611,9 @@
>      </extend-entity>
>      <extend-entity entity-name="UserLogin">
>          <field name="partyId" type="id"></field>
> +        <!--Begin specific : field used to store the delegator name along  theuse session -->
> +        <field name="delegator" type="id"></field>
> +        <!-- End Specific  -->
>          <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">
>              <key-map field-name="partyId"/>
>          </relation>
> Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (working copy)
> @@ -1617,6 +1617,23 @@
>          <value xml:lang="zh_CN">十二月</value>
>          <value xml:lang="zh">十二月</value>
>      </property>
> +    <property key="CommonCompany">
> +        <value xml:lang="ar">المؤسسة</value>
> +        <value xml:lang="en">Company</value>
> +        <value xml:lang="fr">Entreprise</value>
> +    </property>
>      <property key="CommonDelete">
>          <value xml:lang="ar">حذف</value>
>          <value xml:lang="cs">Smazat</value>
> Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (working copy)
> @@ -90,7 +90,7 @@
>          if (username == null) username = (String) context.get("username");
>          String password = (String) context.get("login.password");
>          if (password == null) password = (String) context.get("password");
> -
> +        String userDelegatorName = (String) context.get("userDelegatorName");
>          // get the visitId for the history entity
>          String visitId = (String) context.get("visitId");
>  
> @@ -193,7 +193,9 @@
>                                  // successful login & no loggout flag, no need to change anything, so don't do the store
>                                  doStore = false;
>                              }
> -
> +                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                                userLogin.set("delegator", userDelegatorName);
> +                            }
>                              successfulLogin = "Y";
>  
>                              if (!isServiceAuth) {
> Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (working copy)
> @@ -96,6 +96,7 @@
>    </div>
>    <div id="masthead">
>      <ul>
> +      <li> Delegator : ${delegator.getDelegatorName()}</li>
>        <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">
>          <li class="logo-area">
>            <#if shortcutIcon?has_content>
> Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (working copy)
> @@ -18,7 +18,7 @@
>  -->
>  
>  <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>
> -
> +<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>
>  <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>
>  <#if previousParams?has_content>
>    <#assign previousParams = "?" + previousParams>
> @@ -46,6 +46,12 @@
>              <td class="label">${uiLabelMap.CommonPassword}</td>
>              <td><input type="password" name="PASSWORD" value="" size="20"/></td>
>            </tr>
> +          <#if multidelegator=="true">
> +          <tr>
> +           <td class="label">${uiLabelMap.CommonCompany}</td>
> +           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>
> +          </tr>
> +          </#if>
>            <tr>
>              <td colspan="2" align="center">
>                <input type="submit" value="${uiLabelMap.CommonLogin}"/>
> Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (working copy)
> @@ -53,6 +53,9 @@
>          <group-map group-name="org.ofbiz" datasource-name="localderby"/>
>          <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
>      </delegator>
> +    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">
> +        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        
> +    </delegator>
>      <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">
>          <group-map group-name="org.ofbiz" datasource-name="localderby"/>
>          <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
> @@ -327,6 +330,33 @@
>                  pool-maxsize="250"/>
>          <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
>      </datasource>
> +    <datasource name="localpostgres1"
> +            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
> +            schema-name="public"
> +            field-type-name="postgres"
> +            check-on-start="true"
> +            add-missing-on-start="true"
> +            use-fk-initially-deferred="false"
> +            alias-view-columns="false"
> +            join-style="ansi"
> +            use-binary-type-for-blob="true">
> +            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later:
> +                result-fetch-size="50"
> +            -->
> +        <read-data reader-name="seed"/>
> +        <read-data reader-name="seed-initial"/>
> +        <read-data reader-name="demo"/>
> +        <read-data reader-name="ext"/>
> +        <inline-jdbc
> +                jdbc-driver="org.postgresql.Driver"
> +                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"
> +                jdbc-username="ofbiz"
> +                jdbc-password="ofbiz"
> +                isolation-level="ReadCommitted"
> +                pool-minsize="2"
> +                pool-maxsize="250"/>
> +        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
> +    </datasource>
>  
>      <datasource name="localpostgres"
>              helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
> Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/security/config/security.properties (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties (working copy)
> @@ -77,3 +77,6 @@
>  
>  # -- Hours after which EmailAdressVerification should expire
>  email_verification.expire.hours=48
> +
> +# -- are we using multi delegator
> +multi.delegator=false
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (working copy)
> @@ -182,7 +182,14 @@
>      public GenericDelegator getDelegator() {
>          return dispatcher.getDelegator();
>      }
> -  
> +        
> +    /**
> +     * @see org.ofbiz.service.LocalDispatcher#setDelegator()
> +     */
> +    public void setDelegator(GenericDelegator delegator) {
> +            dispatcher.setDelegator(delegator);
> +    }
> +
>      /**
>       * @see org.ofbiz.service.LocalDispatcher#getSecurity()
>       */
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (working copy)
> @@ -100,7 +100,9 @@
>      public GenericDelegator getDelegator() {
>          return this.delegator;
>      }
> -
> +    public void setDelegator(GenericDelegator delegator) {
> +        this.delegator=delegator;
> +    }
>      public synchronized List<Job> poll() {
>          List<Job> poll = FastList.newInstance();
>  
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (working copy)
> @@ -317,7 +317,7 @@
>       * @return GenericEntityDelegator associated with this dispatcher
>       */
>      public GenericDelegator getDelegator();
> -
> +    public void setDelegator(GenericDelegator delegator);
>      /**
>       * Gets the Security object associated with this dispatcher
>       * @return Security object associated with this dispatcher
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (working copy)
> @@ -789,7 +789,14 @@
>      public GenericDelegator getDelegator() {
>          return this.delegator;
>      }
> -
> +    
> +    /**
> +     * Gets the GenericDelegator associated with this dispatcher
> +     * @return GenericDelegator associated with this dispatcher
> +     */
> +    public void setDelegator(GenericDelegator delegator) {
> +        this.delegator = delegator;
> +    }
>      /**
>       * Gets the Security object associated with this dispatcher
>       * @return Security object associated with this dispatcher
> Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (working copy)
> @@ -271,6 +271,15 @@
>          <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>
>          <value xml:lang="zh">密码是空的,请重新输入。</value>
>      </property>
> +    <property key="loginevents.delegator_not_found_reenter">
> +        <value xml:lang="de">Company not found, please re-enter.</value>
> +        <value xml:lang="en">Company not found, please re-enter.</value>
> +        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>
> +        <value xml:lang="it">Company not found, please re-enter.</value>
> +        <value xml:lang="ru">Company not found, please re-enter.</value>
> +        <value xml:lang="th">Company not found, please re-enter.</value>
> +        <value xml:lang="zh">Company not found, please re-enter.</value>
> +    </property>
>      <property key="loginevents.unable_to_login_this_application">
>          <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>
>          <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>
> Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (working copy)
> @@ -18,6 +18,8 @@
>   *******************************************************************************/
>  package org.ofbiz.webapp.control;
>  
> +import static org.ofbiz.base.util.UtilGenerics.checkMap;
> +
>  import java.io.UnsupportedEncodingException;
>  import java.math.BigInteger;
>  import java.net.URLEncoder;
> @@ -23,7 +25,6 @@
>  import java.net.URLEncoder;
>  import java.security.cert.X509Certificate;
>  import java.util.Enumeration;
> -import java.util.HashMap;
>  import java.util.List;
>  import java.util.Map;
>  import java.util.regex.Matcher;
> @@ -47,7 +48,6 @@
>  import org.ofbiz.base.util.GeneralException;
>  import org.ofbiz.base.util.KeyStoreUtil;
>  import org.ofbiz.base.util.UtilFormatOut;
> -import static org.ofbiz.base.util.UtilGenerics.checkMap;
>  import org.ofbiz.base.util.UtilHttp;
>  import org.ofbiz.base.util.UtilMisc;
>  import org.ofbiz.base.util.UtilProperties;
> @@ -58,7 +58,6 @@
>  import org.ofbiz.entity.GenericValue;
>  import org.ofbiz.entity.condition.EntityCondition;
>  import org.ofbiz.entity.condition.EntityConditionList;
> -import org.ofbiz.entity.condition.EntityExpr;
>  import org.ofbiz.entity.condition.EntityOperator;
>  import org.ofbiz.entity.model.ModelEntity;
>  import org.ofbiz.entity.transaction.GenericTransactionException;
> @@ -68,6 +67,7 @@
>  import org.ofbiz.service.LocalDispatcher;
>  import org.ofbiz.service.ModelService;
>  import org.ofbiz.service.ServiceUtil;
> +import org.ofbiz.webapp.event.CoreEvents;
>  import org.ofbiz.webapp.stats.VisitHandler;
>  
>  /**
> @@ -192,6 +192,9 @@
>                      Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);
>                  } else {
>                      userLogin.set("hasLoggedOut", "Y");
> +                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                        userLogin.set("delegator", null);
> +                    }
>                      userLogin.store();
>                  }
>              } catch (GenericEntityException e) {
> @@ -308,9 +311,11 @@
>  
>          String username = request.getParameter("USERNAME");
>          String password = request.getParameter("PASSWORD");
> -
> +        String userDelegatorName = request.getParameter("DELEGATOR");
> +        
>          if (username == null) username = (String) session.getAttribute("USERNAME");
>          if (password == null) password = (String) session.getAttribute("PASSWORD");
> +        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");
>          
>          // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...
>          if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {
> @@ -319,6 +324,11 @@
>          if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {
>              password = (String) request.getAttribute("PASSWORD");
>          }
> +        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){
> +            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {
> +                userDelegatorName = (String) request.getAttribute("DELEGATOR");
> +            }
> +        }
>  
>          List<String> unpwErrMsgList = FastList.newInstance();
>          if (UtilValidate.isEmpty(username)) {
> @@ -339,7 +349,21 @@
>          if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {
>              password = password.toLowerCase();
>          }
> -
> +        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {
> +            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        }
> +        GenericDelegator userDelegator=null;
> +        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);
> +            if (userDelegator==null){
> +                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));
> +                request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +                return "error";
> +            }
> +        }
> +        
>          String requirePasswordChange = request.getParameter("requirePasswordChange");
>  
>          // get the visit id to pass to the userLogin for history
> @@ -373,6 +397,10 @@
>          }
>  
>          try {
> +            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +                dispatcher.setDelegator(userDelegator);
> +                request.getSession().setAttribute("delegatorName", userDelegatorName);
> +            }
>              result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));
>          } catch (GenericServiceException e) {
>              Debug.logError(e, "Error calling userLogin service", module);
> @@ -385,6 +413,18 @@
>          if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {
>              GenericValue userLogin = (GenericValue) result.get("userLogin");
>              Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);
> +          
> +            try{
> +                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                    userLogin.set("delegator", userDelegatorName);
> +                }
> +                userLogin.store();
> +            }
> +            catch(GenericEntityException e){
> +                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");
> +                return "error";
> +            }
> +
>              if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {
>                  return "requirePasswordChange";
>              }
> @@ -419,7 +459,15 @@
>          if (userLoginSession != null) {
>              session.setAttribute("userLoginSession", userLoginSession);
>          }
> -
> +        
> +            
> +        
> +        //Begin specific
> +        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));
> +        CoreEvents.changeDelegator(request, response);
> +        }
> +        //End specific        
>          request.setAttribute("_LOGIN_PASSED_", "TRUE");
>  
>          // run the after-login events
> @@ -499,6 +547,16 @@
>          // set the logged out flag
>          LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);
>  
> +        //Begin specific :come back to default delegator for next login
> +        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");
> +            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  
> +            HttpServletResponse response=null;
> +            CoreEvents.changeDelegator(request, response);
> +        }
> +        //End specific  
> +
> +
>          // this is a setting we don't want to lose, although it would be good to have a more general solution here...
>          String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");
>          // also make sure the delegatorName is preserved, especially so that a new Visit can be created
> @@ -778,8 +836,14 @@
>              GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");
>              if (currentUserLogin != null) {
>                  if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {
> -                    // is the same user, just carry on...
> -                    return "success";
> +                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");
> +                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){
> +                        // is the same user, just carry on...
> +                        return "success";
> +                    }
> +                    else{
> +                        return "success";
> +                    }
>                  }
>  
>                  // logout the current user and login the new user...
> @@ -786,8 +850,19 @@
>                  logout(request, response);
>                  // ignore the return value; even if the operation failed we want to set the new UserLogin
>              }
> -
> +            
>              doBasicLogin(userLogin, request);
> +            
> +            //Begin specific
> +            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                String userDelegatorName = userLogin.getString("delegator");
> +                request.getSession().setAttribute("delegatorName", userDelegatorName);
> +                request.setAttribute("delegatorName", userDelegatorName);
> +                CoreEvents.changeDelegator(request, response);
> +            }
> +            //End specific
> +
> +            
>          } else {
>              Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);
>          }
> Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (working copy)
> @@ -18,6 +18,9 @@
>   *******************************************************************************/
>  package org.ofbiz.webapp.event;
>  
> +import static org.ofbiz.base.util.UtilGenerics.checkCollection;
> +import static org.ofbiz.base.util.UtilGenerics.checkMap;
> +
>  import java.io.File;
>  import java.io.FileInputStream;
>  import java.io.FileNotFoundException;
> @@ -28,7 +31,6 @@
>  import java.util.Iterator;
>  import java.util.Locale;
>  import java.util.Map;
> -import java.util.Set;
>  import java.util.TimeZone;
>  
>  import javax.servlet.http.HttpServletRequest;
> @@ -38,8 +40,6 @@
>  import javolution.util.FastMap;
>  
>  import org.ofbiz.base.util.Debug;
> -import static org.ofbiz.base.util.UtilGenerics.checkCollection;
> -import static org.ofbiz.base.util.UtilGenerics.checkMap;
>  import org.ofbiz.base.util.UtilHttp;
>  import org.ofbiz.base.util.UtilProperties;
>  import org.ofbiz.base.util.UtilValidate;
> @@ -54,6 +54,7 @@
>  import org.ofbiz.service.ModelService;
>  import org.ofbiz.service.ServiceDispatcher;
>  import org.ofbiz.service.calendar.RecurrenceRule;
> +import org.ofbiz.webapp.control.LoginWorker;
>  import org.ofbiz.webapp.control.RequestHandler;
>  
>  /**
> @@ -104,12 +105,54 @@
>          String delegatorName = request.getParameter("delegator");
>          Security security = (Security) request.getAttribute("security");
>          Locale locale = UtilHttp.getLocale(request);
> +        GenericDelegator delegator=null;
> +        //Begin multi-delegator Specific : search for delegatorName into session information
> +        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);
> +            if (externalKey != null) {
> +                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);
> +                if (userLogin != null && delegatorName==null) {
> +                    delegatorName = userLogin.getString("delegator");
> +                }
> +            }
> +
> +            if(delegatorName==null){
> +                delegatorName = (String) request.getSession().getAttribute("delegatorName");
> +            }
> +            if (delegatorName == null) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
>  
> -        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> -            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> -            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> -            return "error";
> +            delegator = GenericDelegator.getGenericDelegator(delegatorName);
> +
> +            if (delegator == null) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +        //set the secruity delegator to precise the database against wich the user permissions are checked
> +            security.setDelegator(delegator);
> +            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +        }
> +        //End multi-delegator specific
> +        else{
> +
> +            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +
> +
> +           delegator = GenericDelegator.getGenericDelegator(delegatorName);
>          }
> +
>          if (delegatorName == null) {
>              String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);
>              request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> @@ -115,15 +158,6 @@
>              request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
>              return "error";
>          }
> -
> -        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);
> -
> -        if (delegator == null) {
> -            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);
> -            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> -            return "error";
> -        }
> -
>          // now change the dispatcher to use this delegator
>          LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
>          DispatchContext dctx = dispatcher.getDispatchContext();
> @@ -144,7 +178,14 @@
>  
>          request.getSession().setAttribute("delegator", delegator);
>          request.getSession().setAttribute("dispatcher", dispatcher);
> -
> +        dispatcher.getJobManager().setDelegator(delegator);
> +        dispatcher.setDelegator(delegator);
> +        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());
> +        request.setAttribute("delegator", delegator);
> +        request.setAttribute("delegatorName", delegator.getDelegatorName());
> +        request.setAttribute("dispatcher", dispatcher);
> +        request.setAttribute("security", security);
> +        
>          return "success";
>      }
>  

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Updated: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

youssef khaye updated OFBIZ-2020:
---------------------------------

    Attachment: ofbiz-multi.patch

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>             Fix For: SVN trunk
>
>         Attachments: ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:
> Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (working copy)
> @@ -2611,6 +2611,9 @@
>      </extend-entity>
>      <extend-entity entity-name="UserLogin">
>          <field name="partyId" type="id"></field>
> +        <!--Begin specific : field used to store the delegator name along  theuse session -->
> +        <field name="delegator" type="id"></field>
> +        <!-- End Specific  -->
>          <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">
>              <key-map field-name="partyId"/>
>          </relation>
> Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (working copy)
> @@ -1617,6 +1617,23 @@
>          <value xml:lang="zh_CN">十二月</value>
>          <value xml:lang="zh">十二月</value>
>      </property>
> +    <property key="CommonCompany">
> +        <value xml:lang="ar">المؤسسة</value>
> +        <value xml:lang="en">Company</value>
> +        <value xml:lang="fr">Entreprise</value>
> +    </property>
>      <property key="CommonDelete">
>          <value xml:lang="ar">حذف</value>
>          <value xml:lang="cs">Smazat</value>
> Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (working copy)
> @@ -90,7 +90,7 @@
>          if (username == null) username = (String) context.get("username");
>          String password = (String) context.get("login.password");
>          if (password == null) password = (String) context.get("password");
> -
> +        String userDelegatorName = (String) context.get("userDelegatorName");
>          // get the visitId for the history entity
>          String visitId = (String) context.get("visitId");
>  
> @@ -193,7 +193,9 @@
>                                  // successful login & no loggout flag, no need to change anything, so don't do the store
>                                  doStore = false;
>                              }
> -
> +                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                                userLogin.set("delegator", userDelegatorName);
> +                            }
>                              successfulLogin = "Y";
>  
>                              if (!isServiceAuth) {
> Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (working copy)
> @@ -96,6 +96,7 @@
>    </div>
>    <div id="masthead">
>      <ul>
> +      <li> Delegator : ${delegator.getDelegatorName()}</li>
>        <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">
>          <li class="logo-area">
>            <#if shortcutIcon?has_content>
> Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (working copy)
> @@ -18,7 +18,7 @@
>  -->
>  
>  <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>
> -
> +<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>
>  <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>
>  <#if previousParams?has_content>
>    <#assign previousParams = "?" + previousParams>
> @@ -46,6 +46,12 @@
>              <td class="label">${uiLabelMap.CommonPassword}</td>
>              <td><input type="password" name="PASSWORD" value="" size="20"/></td>
>            </tr>
> +          <#if multidelegator=="true">
> +          <tr>
> +           <td class="label">${uiLabelMap.CommonCompany}</td>
> +           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>
> +          </tr>
> +          </#if>
>            <tr>
>              <td colspan="2" align="center">
>                <input type="submit" value="${uiLabelMap.CommonLogin}"/>
> Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (working copy)
> @@ -53,6 +53,9 @@
>          <group-map group-name="org.ofbiz" datasource-name="localderby"/>
>          <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
>      </delegator>
> +    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">
> +        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        
> +    </delegator>
>      <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">
>          <group-map group-name="org.ofbiz" datasource-name="localderby"/>
>          <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
> @@ -327,6 +330,33 @@
>                  pool-maxsize="250"/>
>          <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
>      </datasource>
> +    <datasource name="localpostgres1"
> +            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
> +            schema-name="public"
> +            field-type-name="postgres"
> +            check-on-start="true"
> +            add-missing-on-start="true"
> +            use-fk-initially-deferred="false"
> +            alias-view-columns="false"
> +            join-style="ansi"
> +            use-binary-type-for-blob="true">
> +            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later:
> +                result-fetch-size="50"
> +            -->
> +        <read-data reader-name="seed"/>
> +        <read-data reader-name="seed-initial"/>
> +        <read-data reader-name="demo"/>
> +        <read-data reader-name="ext"/>
> +        <inline-jdbc
> +                jdbc-driver="org.postgresql.Driver"
> +                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"
> +                jdbc-username="ofbiz"
> +                jdbc-password="ofbiz"
> +                isolation-level="ReadCommitted"
> +                pool-minsize="2"
> +                pool-maxsize="250"/>
> +        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
> +    </datasource>
>  
>      <datasource name="localpostgres"
>              helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
> Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/security/config/security.properties (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties (working copy)
> @@ -77,3 +77,6 @@
>  
>  # -- Hours after which EmailAdressVerification should expire
>  email_verification.expire.hours=48
> +
> +# -- are we using multi delegator
> +multi.delegator=false
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (working copy)
> @@ -182,7 +182,14 @@
>      public GenericDelegator getDelegator() {
>          return dispatcher.getDelegator();
>      }
> -  
> +        
> +    /**
> +     * @see org.ofbiz.service.LocalDispatcher#setDelegator()
> +     */
> +    public void setDelegator(GenericDelegator delegator) {
> +            dispatcher.setDelegator(delegator);
> +    }
> +
>      /**
>       * @see org.ofbiz.service.LocalDispatcher#getSecurity()
>       */
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (working copy)
> @@ -100,7 +100,9 @@
>      public GenericDelegator getDelegator() {
>          return this.delegator;
>      }
> -
> +    public void setDelegator(GenericDelegator delegator) {
> +        this.delegator=delegator;
> +    }
>      public synchronized List<Job> poll() {
>          List<Job> poll = FastList.newInstance();
>  
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (working copy)
> @@ -317,7 +317,7 @@
>       * @return GenericEntityDelegator associated with this dispatcher
>       */
>      public GenericDelegator getDelegator();
> -
> +    public void setDelegator(GenericDelegator delegator);
>      /**
>       * Gets the Security object associated with this dispatcher
>       * @return Security object associated with this dispatcher
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (working copy)
> @@ -789,7 +789,14 @@
>      public GenericDelegator getDelegator() {
>          return this.delegator;
>      }
> -
> +    
> +    /**
> +     * Gets the GenericDelegator associated with this dispatcher
> +     * @return GenericDelegator associated with this dispatcher
> +     */
> +    public void setDelegator(GenericDelegator delegator) {
> +        this.delegator = delegator;
> +    }
>      /**
>       * Gets the Security object associated with this dispatcher
>       * @return Security object associated with this dispatcher
> Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (working copy)
> @@ -271,6 +271,15 @@
>          <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>
>          <value xml:lang="zh">密码是空的,请重新输入。</value>
>      </property>
> +    <property key="loginevents.delegator_not_found_reenter">
> +        <value xml:lang="de">Company not found, please re-enter.</value>
> +        <value xml:lang="en">Company not found, please re-enter.</value>
> +        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>
> +        <value xml:lang="it">Company not found, please re-enter.</value>
> +        <value xml:lang="ru">Company not found, please re-enter.</value>
> +        <value xml:lang="th">Company not found, please re-enter.</value>
> +        <value xml:lang="zh">Company not found, please re-enter.</value>
> +    </property>
>      <property key="loginevents.unable_to_login_this_application">
>          <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>
>          <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>
> Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (working copy)
> @@ -18,6 +18,8 @@
>   *******************************************************************************/
>  package org.ofbiz.webapp.control;
>  
> +import static org.ofbiz.base.util.UtilGenerics.checkMap;
> +
>  import java.io.UnsupportedEncodingException;
>  import java.math.BigInteger;
>  import java.net.URLEncoder;
> @@ -23,7 +25,6 @@
>  import java.net.URLEncoder;
>  import java.security.cert.X509Certificate;
>  import java.util.Enumeration;
> -import java.util.HashMap;
>  import java.util.List;
>  import java.util.Map;
>  import java.util.regex.Matcher;
> @@ -47,7 +48,6 @@
>  import org.ofbiz.base.util.GeneralException;
>  import org.ofbiz.base.util.KeyStoreUtil;
>  import org.ofbiz.base.util.UtilFormatOut;
> -import static org.ofbiz.base.util.UtilGenerics.checkMap;
>  import org.ofbiz.base.util.UtilHttp;
>  import org.ofbiz.base.util.UtilMisc;
>  import org.ofbiz.base.util.UtilProperties;
> @@ -58,7 +58,6 @@
>  import org.ofbiz.entity.GenericValue;
>  import org.ofbiz.entity.condition.EntityCondition;
>  import org.ofbiz.entity.condition.EntityConditionList;
> -import org.ofbiz.entity.condition.EntityExpr;
>  import org.ofbiz.entity.condition.EntityOperator;
>  import org.ofbiz.entity.model.ModelEntity;
>  import org.ofbiz.entity.transaction.GenericTransactionException;
> @@ -68,6 +67,7 @@
>  import org.ofbiz.service.LocalDispatcher;
>  import org.ofbiz.service.ModelService;
>  import org.ofbiz.service.ServiceUtil;
> +import org.ofbiz.webapp.event.CoreEvents;
>  import org.ofbiz.webapp.stats.VisitHandler;
>  
>  /**
> @@ -192,6 +192,9 @@
>                      Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);
>                  } else {
>                      userLogin.set("hasLoggedOut", "Y");
> +                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                        userLogin.set("delegator", null);
> +                    }
>                      userLogin.store();
>                  }
>              } catch (GenericEntityException e) {
> @@ -308,9 +311,11 @@
>  
>          String username = request.getParameter("USERNAME");
>          String password = request.getParameter("PASSWORD");
> -
> +        String userDelegatorName = request.getParameter("DELEGATOR");
> +        
>          if (username == null) username = (String) session.getAttribute("USERNAME");
>          if (password == null) password = (String) session.getAttribute("PASSWORD");
> +        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");
>          
>          // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...
>          if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {
> @@ -319,6 +324,11 @@
>          if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {
>              password = (String) request.getAttribute("PASSWORD");
>          }
> +        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){
> +            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {
> +                userDelegatorName = (String) request.getAttribute("DELEGATOR");
> +            }
> +        }
>  
>          List<String> unpwErrMsgList = FastList.newInstance();
>          if (UtilValidate.isEmpty(username)) {
> @@ -339,7 +349,21 @@
>          if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {
>              password = password.toLowerCase();
>          }
> -
> +        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {
> +            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        }
> +        GenericDelegator userDelegator=null;
> +        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);
> +            if (userDelegator==null){
> +                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));
> +                request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +                return "error";
> +            }
> +        }
> +        
>          String requirePasswordChange = request.getParameter("requirePasswordChange");
>  
>          // get the visit id to pass to the userLogin for history
> @@ -373,6 +397,10 @@
>          }
>  
>          try {
> +            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +                dispatcher.setDelegator(userDelegator);
> +                request.getSession().setAttribute("delegatorName", userDelegatorName);
> +            }
>              result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));
>          } catch (GenericServiceException e) {
>              Debug.logError(e, "Error calling userLogin service", module);
> @@ -385,6 +413,18 @@
>          if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {
>              GenericValue userLogin = (GenericValue) result.get("userLogin");
>              Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);
> +          
> +            try{
> +                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                    userLogin.set("delegator", userDelegatorName);
> +                }
> +                userLogin.store();
> +            }
> +            catch(GenericEntityException e){
> +                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");
> +                return "error";
> +            }
> +
>              if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {
>                  return "requirePasswordChange";
>              }
> @@ -419,7 +459,15 @@
>          if (userLoginSession != null) {
>              session.setAttribute("userLoginSession", userLoginSession);
>          }
> -
> +        
> +            
> +        
> +        //Begin specific
> +        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));
> +        CoreEvents.changeDelegator(request, response);
> +        }
> +        //End specific        
>          request.setAttribute("_LOGIN_PASSED_", "TRUE");
>  
>          // run the after-login events
> @@ -499,6 +547,16 @@
>          // set the logged out flag
>          LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);
>  
> +        //Begin specific :come back to default delegator for next login
> +        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");
> +            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  
> +            HttpServletResponse response=null;
> +            CoreEvents.changeDelegator(request, response);
> +        }
> +        //End specific  
> +
> +
>          // this is a setting we don't want to lose, although it would be good to have a more general solution here...
>          String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");
>          // also make sure the delegatorName is preserved, especially so that a new Visit can be created
> @@ -778,8 +836,14 @@
>              GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");
>              if (currentUserLogin != null) {
>                  if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {
> -                    // is the same user, just carry on...
> -                    return "success";
> +                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");
> +                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){
> +                        // is the same user, just carry on...
> +                        return "success";
> +                    }
> +                    else{
> +                        return "success";
> +                    }
>                  }
>  
>                  // logout the current user and login the new user...
> @@ -786,8 +850,19 @@
>                  logout(request, response);
>                  // ignore the return value; even if the operation failed we want to set the new UserLogin
>              }
> -
> +            
>              doBasicLogin(userLogin, request);
> +            
> +            //Begin specific
> +            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                String userDelegatorName = userLogin.getString("delegator");
> +                request.getSession().setAttribute("delegatorName", userDelegatorName);
> +                request.setAttribute("delegatorName", userDelegatorName);
> +                CoreEvents.changeDelegator(request, response);
> +            }
> +            //End specific
> +
> +            
>          } else {
>              Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);
>          }
> Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (working copy)
> @@ -18,6 +18,9 @@
>   *******************************************************************************/
>  package org.ofbiz.webapp.event;
>  
> +import static org.ofbiz.base.util.UtilGenerics.checkCollection;
> +import static org.ofbiz.base.util.UtilGenerics.checkMap;
> +
>  import java.io.File;
>  import java.io.FileInputStream;
>  import java.io.FileNotFoundException;
> @@ -28,7 +31,6 @@
>  import java.util.Iterator;
>  import java.util.Locale;
>  import java.util.Map;
> -import java.util.Set;
>  import java.util.TimeZone;
>  
>  import javax.servlet.http.HttpServletRequest;
> @@ -38,8 +40,6 @@
>  import javolution.util.FastMap;
>  
>  import org.ofbiz.base.util.Debug;
> -import static org.ofbiz.base.util.UtilGenerics.checkCollection;
> -import static org.ofbiz.base.util.UtilGenerics.checkMap;
>  import org.ofbiz.base.util.UtilHttp;
>  import org.ofbiz.base.util.UtilProperties;
>  import org.ofbiz.base.util.UtilValidate;
> @@ -54,6 +54,7 @@
>  import org.ofbiz.service.ModelService;
>  import org.ofbiz.service.ServiceDispatcher;
>  import org.ofbiz.service.calendar.RecurrenceRule;
> +import org.ofbiz.webapp.control.LoginWorker;
>  import org.ofbiz.webapp.control.RequestHandler;
>  
>  /**
> @@ -104,12 +105,54 @@
>          String delegatorName = request.getParameter("delegator");
>          Security security = (Security) request.getAttribute("security");
>          Locale locale = UtilHttp.getLocale(request);
> +        GenericDelegator delegator=null;
> +        //Begin multi-delegator Specific : search for delegatorName into session information
> +        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);
> +            if (externalKey != null) {
> +                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);
> +                if (userLogin != null && delegatorName==null) {
> +                    delegatorName = userLogin.getString("delegator");
> +                }
> +            }
> +
> +            if(delegatorName==null){
> +                delegatorName = (String) request.getSession().getAttribute("delegatorName");
> +            }
> +            if (delegatorName == null) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
>  
> -        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> -            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> -            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> -            return "error";
> +            delegator = GenericDelegator.getGenericDelegator(delegatorName);
> +
> +            if (delegator == null) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +        //set the secruity delegator to precise the database against wich the user permissions are checked
> +            security.setDelegator(delegator);
> +            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +        }
> +        //End multi-delegator specific
> +        else{
> +
> +            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +
> +
> +           delegator = GenericDelegator.getGenericDelegator(delegatorName);
>          }
> +
>          if (delegatorName == null) {
>              String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);
>              request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> @@ -115,15 +158,6 @@
>              request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
>              return "error";
>          }
> -
> -        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);
> -
> -        if (delegator == null) {
> -            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);
> -            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> -            return "error";
> -        }
> -
>          // now change the dispatcher to use this delegator
>          LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
>          DispatchContext dctx = dispatcher.getDispatchContext();
> @@ -144,7 +178,14 @@
>  
>          request.getSession().setAttribute("delegator", delegator);
>          request.getSession().setAttribute("dispatcher", dispatcher);
> -
> +        dispatcher.getJobManager().setDelegator(delegator);
> +        dispatcher.setDelegator(delegator);
> +        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());
> +        request.setAttribute("delegator", delegator);
> +        request.setAttribute("delegatorName", delegator.getDelegatorName());
> +        request.setAttribute("dispatcher", dispatcher);
> +        request.setAttribute("security", security);
> +        
>          return "success";
>      }
>  

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12642630#action_12642630 ]

BJ Freeman commented on OFBIZ-2020:
-----------------------------------

can you give a overview for this requirement.
I am interested in how entity-views across applications, therefor delegators are handled.
how do you deal with the sandbox?
also why not entity-sync.


> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>             Fix For: SVN trunk
>
>         Attachments: ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:
> Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (working copy)
> @@ -2611,6 +2611,9 @@
>      </extend-entity>
>      <extend-entity entity-name="UserLogin">
>          <field name="partyId" type="id"></field>
> +        <!--Begin specific : field used to store the delegator name along  theuse session -->
> +        <field name="delegator" type="id"></field>
> +        <!-- End Specific  -->
>          <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">
>              <key-map field-name="partyId"/>
>          </relation>
> Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (working copy)
> @@ -1617,6 +1617,23 @@
>          <value xml:lang="zh_CN">十二月</value>
>          <value xml:lang="zh">十二月</value>
>      </property>
> +    <property key="CommonCompany">
> +        <value xml:lang="ar">المؤسسة</value>
> +        <value xml:lang="en">Company</value>
> +        <value xml:lang="fr">Entreprise</value>
> +    </property>
>      <property key="CommonDelete">
>          <value xml:lang="ar">حذف</value>
>          <value xml:lang="cs">Smazat</value>
> Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (working copy)
> @@ -90,7 +90,7 @@
>          if (username == null) username = (String) context.get("username");
>          String password = (String) context.get("login.password");
>          if (password == null) password = (String) context.get("password");
> -
> +        String userDelegatorName = (String) context.get("userDelegatorName");
>          // get the visitId for the history entity
>          String visitId = (String) context.get("visitId");
>  
> @@ -193,7 +193,9 @@
>                                  // successful login & no loggout flag, no need to change anything, so don't do the store
>                                  doStore = false;
>                              }
> -
> +                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                                userLogin.set("delegator", userDelegatorName);
> +                            }
>                              successfulLogin = "Y";
>  
>                              if (!isServiceAuth) {
> Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (working copy)
> @@ -96,6 +96,7 @@
>    </div>
>    <div id="masthead">
>      <ul>
> +      <li> Delegator : ${delegator.getDelegatorName()}</li>
>        <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">
>          <li class="logo-area">
>            <#if shortcutIcon?has_content>
> Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (working copy)
> @@ -18,7 +18,7 @@
>  -->
>  
>  <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>
> -
> +<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>
>  <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>
>  <#if previousParams?has_content>
>    <#assign previousParams = "?" + previousParams>
> @@ -46,6 +46,12 @@
>              <td class="label">${uiLabelMap.CommonPassword}</td>
>              <td><input type="password" name="PASSWORD" value="" size="20"/></td>
>            </tr>
> +          <#if multidelegator=="true">
> +          <tr>
> +           <td class="label">${uiLabelMap.CommonCompany}</td>
> +           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>
> +          </tr>
> +          </#if>
>            <tr>
>              <td colspan="2" align="center">
>                <input type="submit" value="${uiLabelMap.CommonLogin}"/>
> Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (working copy)
> @@ -53,6 +53,9 @@
>          <group-map group-name="org.ofbiz" datasource-name="localderby"/>
>          <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
>      </delegator>
> +    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">
> +        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        
> +    </delegator>
>      <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">
>          <group-map group-name="org.ofbiz" datasource-name="localderby"/>
>          <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
> @@ -327,6 +330,33 @@
>                  pool-maxsize="250"/>
>          <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
>      </datasource>
> +    <datasource name="localpostgres1"
> +            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
> +            schema-name="public"
> +            field-type-name="postgres"
> +            check-on-start="true"
> +            add-missing-on-start="true"
> +            use-fk-initially-deferred="false"
> +            alias-view-columns="false"
> +            join-style="ansi"
> +            use-binary-type-for-blob="true">
> +            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later:
> +                result-fetch-size="50"
> +            -->
> +        <read-data reader-name="seed"/>
> +        <read-data reader-name="seed-initial"/>
> +        <read-data reader-name="demo"/>
> +        <read-data reader-name="ext"/>
> +        <inline-jdbc
> +                jdbc-driver="org.postgresql.Driver"
> +                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"
> +                jdbc-username="ofbiz"
> +                jdbc-password="ofbiz"
> +                isolation-level="ReadCommitted"
> +                pool-minsize="2"
> +                pool-maxsize="250"/>
> +        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
> +    </datasource>
>  
>      <datasource name="localpostgres"
>              helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
> Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/security/config/security.properties (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties (working copy)
> @@ -77,3 +77,6 @@
>  
>  # -- Hours after which EmailAdressVerification should expire
>  email_verification.expire.hours=48
> +
> +# -- are we using multi delegator
> +multi.delegator=false
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (working copy)
> @@ -182,7 +182,14 @@
>      public GenericDelegator getDelegator() {
>          return dispatcher.getDelegator();
>      }
> -  
> +        
> +    /**
> +     * @see org.ofbiz.service.LocalDispatcher#setDelegator()
> +     */
> +    public void setDelegator(GenericDelegator delegator) {
> +            dispatcher.setDelegator(delegator);
> +    }
> +
>      /**
>       * @see org.ofbiz.service.LocalDispatcher#getSecurity()
>       */
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (working copy)
> @@ -100,7 +100,9 @@
>      public GenericDelegator getDelegator() {
>          return this.delegator;
>      }
> -
> +    public void setDelegator(GenericDelegator delegator) {
> +        this.delegator=delegator;
> +    }
>      public synchronized List<Job> poll() {
>          List<Job> poll = FastList.newInstance();
>  
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (working copy)
> @@ -317,7 +317,7 @@
>       * @return GenericEntityDelegator associated with this dispatcher
>       */
>      public GenericDelegator getDelegator();
> -
> +    public void setDelegator(GenericDelegator delegator);
>      /**
>       * Gets the Security object associated with this dispatcher
>       * @return Security object associated with this dispatcher
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (working copy)
> @@ -789,7 +789,14 @@
>      public GenericDelegator getDelegator() {
>          return this.delegator;
>      }
> -
> +    
> +    /**
> +     * Gets the GenericDelegator associated with this dispatcher
> +     * @return GenericDelegator associated with this dispatcher
> +     */
> +    public void setDelegator(GenericDelegator delegator) {
> +        this.delegator = delegator;
> +    }
>      /**
>       * Gets the Security object associated with this dispatcher
>       * @return Security object associated with this dispatcher
> Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (working copy)
> @@ -271,6 +271,15 @@
>          <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>
>          <value xml:lang="zh">密码是空的,请重新输入。</value>
>      </property>
> +    <property key="loginevents.delegator_not_found_reenter">
> +        <value xml:lang="de">Company not found, please re-enter.</value>
> +        <value xml:lang="en">Company not found, please re-enter.</value>
> +        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>
> +        <value xml:lang="it">Company not found, please re-enter.</value>
> +        <value xml:lang="ru">Company not found, please re-enter.</value>
> +        <value xml:lang="th">Company not found, please re-enter.</value>
> +        <value xml:lang="zh">Company not found, please re-enter.</value>
> +    </property>
>      <property key="loginevents.unable_to_login_this_application">
>          <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>
>          <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>
> Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (working copy)
> @@ -18,6 +18,8 @@
>   *******************************************************************************/
>  package org.ofbiz.webapp.control;
>  
> +import static org.ofbiz.base.util.UtilGenerics.checkMap;
> +
>  import java.io.UnsupportedEncodingException;
>  import java.math.BigInteger;
>  import java.net.URLEncoder;
> @@ -23,7 +25,6 @@
>  import java.net.URLEncoder;
>  import java.security.cert.X509Certificate;
>  import java.util.Enumeration;
> -import java.util.HashMap;
>  import java.util.List;
>  import java.util.Map;
>  import java.util.regex.Matcher;
> @@ -47,7 +48,6 @@
>  import org.ofbiz.base.util.GeneralException;
>  import org.ofbiz.base.util.KeyStoreUtil;
>  import org.ofbiz.base.util.UtilFormatOut;
> -import static org.ofbiz.base.util.UtilGenerics.checkMap;
>  import org.ofbiz.base.util.UtilHttp;
>  import org.ofbiz.base.util.UtilMisc;
>  import org.ofbiz.base.util.UtilProperties;
> @@ -58,7 +58,6 @@
>  import org.ofbiz.entity.GenericValue;
>  import org.ofbiz.entity.condition.EntityCondition;
>  import org.ofbiz.entity.condition.EntityConditionList;
> -import org.ofbiz.entity.condition.EntityExpr;
>  import org.ofbiz.entity.condition.EntityOperator;
>  import org.ofbiz.entity.model.ModelEntity;
>  import org.ofbiz.entity.transaction.GenericTransactionException;
> @@ -68,6 +67,7 @@
>  import org.ofbiz.service.LocalDispatcher;
>  import org.ofbiz.service.ModelService;
>  import org.ofbiz.service.ServiceUtil;
> +import org.ofbiz.webapp.event.CoreEvents;
>  import org.ofbiz.webapp.stats.VisitHandler;
>  
>  /**
> @@ -192,6 +192,9 @@
>                      Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);
>                  } else {
>                      userLogin.set("hasLoggedOut", "Y");
> +                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                        userLogin.set("delegator", null);
> +                    }
>                      userLogin.store();
>                  }
>              } catch (GenericEntityException e) {
> @@ -308,9 +311,11 @@
>  
>          String username = request.getParameter("USERNAME");
>          String password = request.getParameter("PASSWORD");
> -
> +        String userDelegatorName = request.getParameter("DELEGATOR");
> +        
>          if (username == null) username = (String) session.getAttribute("USERNAME");
>          if (password == null) password = (String) session.getAttribute("PASSWORD");
> +        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");
>          
>          // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...
>          if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {
> @@ -319,6 +324,11 @@
>          if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {
>              password = (String) request.getAttribute("PASSWORD");
>          }
> +        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){
> +            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {
> +                userDelegatorName = (String) request.getAttribute("DELEGATOR");
> +            }
> +        }
>  
>          List<String> unpwErrMsgList = FastList.newInstance();
>          if (UtilValidate.isEmpty(username)) {
> @@ -339,7 +349,21 @@
>          if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {
>              password = password.toLowerCase();
>          }
> -
> +        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {
> +            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        }
> +        GenericDelegator userDelegator=null;
> +        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);
> +            if (userDelegator==null){
> +                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));
> +                request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +                return "error";
> +            }
> +        }
> +        
>          String requirePasswordChange = request.getParameter("requirePasswordChange");
>  
>          // get the visit id to pass to the userLogin for history
> @@ -373,6 +397,10 @@
>          }
>  
>          try {
> +            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +                dispatcher.setDelegator(userDelegator);
> +                request.getSession().setAttribute("delegatorName", userDelegatorName);
> +            }
>              result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));
>          } catch (GenericServiceException e) {
>              Debug.logError(e, "Error calling userLogin service", module);
> @@ -385,6 +413,18 @@
>          if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {
>              GenericValue userLogin = (GenericValue) result.get("userLogin");
>              Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);
> +          
> +            try{
> +                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                    userLogin.set("delegator", userDelegatorName);
> +                }
> +                userLogin.store();
> +            }
> +            catch(GenericEntityException e){
> +                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");
> +                return "error";
> +            }
> +
>              if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {
>                  return "requirePasswordChange";
>              }
> @@ -419,7 +459,15 @@
>          if (userLoginSession != null) {
>              session.setAttribute("userLoginSession", userLoginSession);
>          }
> -
> +        
> +            
> +        
> +        //Begin specific
> +        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));
> +        CoreEvents.changeDelegator(request, response);
> +        }
> +        //End specific        
>          request.setAttribute("_LOGIN_PASSED_", "TRUE");
>  
>          // run the after-login events
> @@ -499,6 +547,16 @@
>          // set the logged out flag
>          LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);
>  
> +        //Begin specific :come back to default delegator for next login
> +        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");
> +            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  
> +            HttpServletResponse response=null;
> +            CoreEvents.changeDelegator(request, response);
> +        }
> +        //End specific  
> +
> +
>          // this is a setting we don't want to lose, although it would be good to have a more general solution here...
>          String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");
>          // also make sure the delegatorName is preserved, especially so that a new Visit can be created
> @@ -778,8 +836,14 @@
>              GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");
>              if (currentUserLogin != null) {
>                  if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {
> -                    // is the same user, just carry on...
> -                    return "success";
> +                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");
> +                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){
> +                        // is the same user, just carry on...
> +                        return "success";
> +                    }
> +                    else{
> +                        return "success";
> +                    }
>                  }
>  
>                  // logout the current user and login the new user...
> @@ -786,8 +850,19 @@
>                  logout(request, response);
>                  // ignore the return value; even if the operation failed we want to set the new UserLogin
>              }
> -
> +            
>              doBasicLogin(userLogin, request);
> +            
> +            //Begin specific
> +            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                String userDelegatorName = userLogin.getString("delegator");
> +                request.getSession().setAttribute("delegatorName", userDelegatorName);
> +                request.setAttribute("delegatorName", userDelegatorName);
> +                CoreEvents.changeDelegator(request, response);
> +            }
> +            //End specific
> +
> +            
>          } else {
>              Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);
>          }
> Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (working copy)
> @@ -18,6 +18,9 @@
>   *******************************************************************************/
>  package org.ofbiz.webapp.event;
>  
> +import static org.ofbiz.base.util.UtilGenerics.checkCollection;
> +import static org.ofbiz.base.util.UtilGenerics.checkMap;
> +
>  import java.io.File;
>  import java.io.FileInputStream;
>  import java.io.FileNotFoundException;
> @@ -28,7 +31,6 @@
>  import java.util.Iterator;
>  import java.util.Locale;
>  import java.util.Map;
> -import java.util.Set;
>  import java.util.TimeZone;
>  
>  import javax.servlet.http.HttpServletRequest;
> @@ -38,8 +40,6 @@
>  import javolution.util.FastMap;
>  
>  import org.ofbiz.base.util.Debug;
> -import static org.ofbiz.base.util.UtilGenerics.checkCollection;
> -import static org.ofbiz.base.util.UtilGenerics.checkMap;
>  import org.ofbiz.base.util.UtilHttp;
>  import org.ofbiz.base.util.UtilProperties;
>  import org.ofbiz.base.util.UtilValidate;
> @@ -54,6 +54,7 @@
>  import org.ofbiz.service.ModelService;
>  import org.ofbiz.service.ServiceDispatcher;
>  import org.ofbiz.service.calendar.RecurrenceRule;
> +import org.ofbiz.webapp.control.LoginWorker;
>  import org.ofbiz.webapp.control.RequestHandler;
>  
>  /**
> @@ -104,12 +105,54 @@
>          String delegatorName = request.getParameter("delegator");
>          Security security = (Security) request.getAttribute("security");
>          Locale locale = UtilHttp.getLocale(request);
> +        GenericDelegator delegator=null;
> +        //Begin multi-delegator Specific : search for delegatorName into session information
> +        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);
> +            if (externalKey != null) {
> +                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);
> +                if (userLogin != null && delegatorName==null) {
> +                    delegatorName = userLogin.getString("delegator");
> +                }
> +            }
> +
> +            if(delegatorName==null){
> +                delegatorName = (String) request.getSession().getAttribute("delegatorName");
> +            }
> +            if (delegatorName == null) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
>  
> -        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> -            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> -            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> -            return "error";
> +            delegator = GenericDelegator.getGenericDelegator(delegatorName);
> +
> +            if (delegator == null) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +        //set the secruity delegator to precise the database against wich the user permissions are checked
> +            security.setDelegator(delegator);
> +            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +        }
> +        //End multi-delegator specific
> +        else{
> +
> +            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +
> +
> +           delegator = GenericDelegator.getGenericDelegator(delegatorName);
>          }
> +
>          if (delegatorName == null) {
>              String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);
>              request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> @@ -115,15 +158,6 @@
>              request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
>              return "error";
>          }
> -
> -        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);
> -
> -        if (delegator == null) {
> -            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);
> -            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> -            return "error";
> -        }
> -
>          // now change the dispatcher to use this delegator
>          LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
>          DispatchContext dctx = dispatcher.getDispatchContext();
> @@ -144,7 +178,14 @@
>  
>          request.getSession().setAttribute("delegator", delegator);
>          request.getSession().setAttribute("dispatcher", dispatcher);
> -
> +        dispatcher.getJobManager().setDelegator(delegator);
> +        dispatcher.setDelegator(delegator);
> +        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());
> +        request.setAttribute("delegator", delegator);
> +        request.setAttribute("delegatorName", delegator.getDelegatorName());
> +        request.setAttribute("dispatcher", dispatcher);
> +        request.setAttribute("security", security);
> +        
>          return "success";
>      }
>  

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12642790#action_12642790 ]

youssef khaye commented on OFBIZ-2020:
--------------------------------------

Thank you Freeman for the comment;
I really dont understand wha do you means by entity-views across applications, but for sandbox i just switch the database of the JobManager to database of the user by changing the JobManager.delegator.

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>             Fix For: SVN trunk
>
>         Attachments: ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:
> Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (working copy)
> @@ -2611,6 +2611,9 @@
>      </extend-entity>
>      <extend-entity entity-name="UserLogin">
>          <field name="partyId" type="id"></field>
> +        <!--Begin specific : field used to store the delegator name along  theuse session -->
> +        <field name="delegator" type="id"></field>
> +        <!-- End Specific  -->
>          <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">
>              <key-map field-name="partyId"/>
>          </relation>
> Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (working copy)
> @@ -1617,6 +1617,23 @@
>          <value xml:lang="zh_CN">十二月</value>
>          <value xml:lang="zh">十二月</value>
>      </property>
> +    <property key="CommonCompany">
> +        <value xml:lang="ar">المؤسسة</value>
> +        <value xml:lang="en">Company</value>
> +        <value xml:lang="fr">Entreprise</value>
> +    </property>
>      <property key="CommonDelete">
>          <value xml:lang="ar">حذف</value>
>          <value xml:lang="cs">Smazat</value>
> Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (working copy)
> @@ -90,7 +90,7 @@
>          if (username == null) username = (String) context.get("username");
>          String password = (String) context.get("login.password");
>          if (password == null) password = (String) context.get("password");
> -
> +        String userDelegatorName = (String) context.get("userDelegatorName");
>          // get the visitId for the history entity
>          String visitId = (String) context.get("visitId");
>  
> @@ -193,7 +193,9 @@
>                                  // successful login & no loggout flag, no need to change anything, so don't do the store
>                                  doStore = false;
>                              }
> -
> +                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                                userLogin.set("delegator", userDelegatorName);
> +                            }
>                              successfulLogin = "Y";
>  
>                              if (!isServiceAuth) {
> Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (working copy)
> @@ -96,6 +96,7 @@
>    </div>
>    <div id="masthead">
>      <ul>
> +      <li> Delegator : ${delegator.getDelegatorName()}</li>
>        <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">
>          <li class="logo-area">
>            <#if shortcutIcon?has_content>
> Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (working copy)
> @@ -18,7 +18,7 @@
>  -->
>  
>  <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>
> -
> +<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>
>  <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>
>  <#if previousParams?has_content>
>    <#assign previousParams = "?" + previousParams>
> @@ -46,6 +46,12 @@
>              <td class="label">${uiLabelMap.CommonPassword}</td>
>              <td><input type="password" name="PASSWORD" value="" size="20"/></td>
>            </tr>
> +          <#if multidelegator=="true">
> +          <tr>
> +           <td class="label">${uiLabelMap.CommonCompany}</td>
> +           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>
> +          </tr>
> +          </#if>
>            <tr>
>              <td colspan="2" align="center">
>                <input type="submit" value="${uiLabelMap.CommonLogin}"/>
> Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (working copy)
> @@ -53,6 +53,9 @@
>          <group-map group-name="org.ofbiz" datasource-name="localderby"/>
>          <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
>      </delegator>
> +    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">
> +        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        
> +    </delegator>
>      <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">
>          <group-map group-name="org.ofbiz" datasource-name="localderby"/>
>          <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
> @@ -327,6 +330,33 @@
>                  pool-maxsize="250"/>
>          <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
>      </datasource>
> +    <datasource name="localpostgres1"
> +            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
> +            schema-name="public"
> +            field-type-name="postgres"
> +            check-on-start="true"
> +            add-missing-on-start="true"
> +            use-fk-initially-deferred="false"
> +            alias-view-columns="false"
> +            join-style="ansi"
> +            use-binary-type-for-blob="true">
> +            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later:
> +                result-fetch-size="50"
> +            -->
> +        <read-data reader-name="seed"/>
> +        <read-data reader-name="seed-initial"/>
> +        <read-data reader-name="demo"/>
> +        <read-data reader-name="ext"/>
> +        <inline-jdbc
> +                jdbc-driver="org.postgresql.Driver"
> +                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"
> +                jdbc-username="ofbiz"
> +                jdbc-password="ofbiz"
> +                isolation-level="ReadCommitted"
> +                pool-minsize="2"
> +                pool-maxsize="250"/>
> +        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
> +    </datasource>
>  
>      <datasource name="localpostgres"
>              helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
> Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/security/config/security.properties (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties (working copy)
> @@ -77,3 +77,6 @@
>  
>  # -- Hours after which EmailAdressVerification should expire
>  email_verification.expire.hours=48
> +
> +# -- are we using multi delegator
> +multi.delegator=false
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (working copy)
> @@ -182,7 +182,14 @@
>      public GenericDelegator getDelegator() {
>          return dispatcher.getDelegator();
>      }
> -  
> +        
> +    /**
> +     * @see org.ofbiz.service.LocalDispatcher#setDelegator()
> +     */
> +    public void setDelegator(GenericDelegator delegator) {
> +            dispatcher.setDelegator(delegator);
> +    }
> +
>      /**
>       * @see org.ofbiz.service.LocalDispatcher#getSecurity()
>       */
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (working copy)
> @@ -100,7 +100,9 @@
>      public GenericDelegator getDelegator() {
>          return this.delegator;
>      }
> -
> +    public void setDelegator(GenericDelegator delegator) {
> +        this.delegator=delegator;
> +    }
>      public synchronized List<Job> poll() {
>          List<Job> poll = FastList.newInstance();
>  
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (working copy)
> @@ -317,7 +317,7 @@
>       * @return GenericEntityDelegator associated with this dispatcher
>       */
>      public GenericDelegator getDelegator();
> -
> +    public void setDelegator(GenericDelegator delegator);
>      /**
>       * Gets the Security object associated with this dispatcher
>       * @return Security object associated with this dispatcher
> Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (working copy)
> @@ -789,7 +789,14 @@
>      public GenericDelegator getDelegator() {
>          return this.delegator;
>      }
> -
> +    
> +    /**
> +     * Gets the GenericDelegator associated with this dispatcher
> +     * @return GenericDelegator associated with this dispatcher
> +     */
> +    public void setDelegator(GenericDelegator delegator) {
> +        this.delegator = delegator;
> +    }
>      /**
>       * Gets the Security object associated with this dispatcher
>       * @return Security object associated with this dispatcher
> Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (working copy)
> @@ -271,6 +271,15 @@
>          <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>
>          <value xml:lang="zh">密码是空的,请重新输入。</value>
>      </property>
> +    <property key="loginevents.delegator_not_found_reenter">
> +        <value xml:lang="de">Company not found, please re-enter.</value>
> +        <value xml:lang="en">Company not found, please re-enter.</value>
> +        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>
> +        <value xml:lang="it">Company not found, please re-enter.</value>
> +        <value xml:lang="ru">Company not found, please re-enter.</value>
> +        <value xml:lang="th">Company not found, please re-enter.</value>
> +        <value xml:lang="zh">Company not found, please re-enter.</value>
> +    </property>
>      <property key="loginevents.unable_to_login_this_application">
>          <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>
>          <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>
> Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (working copy)
> @@ -18,6 +18,8 @@
>   *******************************************************************************/
>  package org.ofbiz.webapp.control;
>  
> +import static org.ofbiz.base.util.UtilGenerics.checkMap;
> +
>  import java.io.UnsupportedEncodingException;
>  import java.math.BigInteger;
>  import java.net.URLEncoder;
> @@ -23,7 +25,6 @@
>  import java.net.URLEncoder;
>  import java.security.cert.X509Certificate;
>  import java.util.Enumeration;
> -import java.util.HashMap;
>  import java.util.List;
>  import java.util.Map;
>  import java.util.regex.Matcher;
> @@ -47,7 +48,6 @@
>  import org.ofbiz.base.util.GeneralException;
>  import org.ofbiz.base.util.KeyStoreUtil;
>  import org.ofbiz.base.util.UtilFormatOut;
> -import static org.ofbiz.base.util.UtilGenerics.checkMap;
>  import org.ofbiz.base.util.UtilHttp;
>  import org.ofbiz.base.util.UtilMisc;
>  import org.ofbiz.base.util.UtilProperties;
> @@ -58,7 +58,6 @@
>  import org.ofbiz.entity.GenericValue;
>  import org.ofbiz.entity.condition.EntityCondition;
>  import org.ofbiz.entity.condition.EntityConditionList;
> -import org.ofbiz.entity.condition.EntityExpr;
>  import org.ofbiz.entity.condition.EntityOperator;
>  import org.ofbiz.entity.model.ModelEntity;
>  import org.ofbiz.entity.transaction.GenericTransactionException;
> @@ -68,6 +67,7 @@
>  import org.ofbiz.service.LocalDispatcher;
>  import org.ofbiz.service.ModelService;
>  import org.ofbiz.service.ServiceUtil;
> +import org.ofbiz.webapp.event.CoreEvents;
>  import org.ofbiz.webapp.stats.VisitHandler;
>  
>  /**
> @@ -192,6 +192,9 @@
>                      Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);
>                  } else {
>                      userLogin.set("hasLoggedOut", "Y");
> +                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                        userLogin.set("delegator", null);
> +                    }
>                      userLogin.store();
>                  }
>              } catch (GenericEntityException e) {
> @@ -308,9 +311,11 @@
>  
>          String username = request.getParameter("USERNAME");
>          String password = request.getParameter("PASSWORD");
> -
> +        String userDelegatorName = request.getParameter("DELEGATOR");
> +        
>          if (username == null) username = (String) session.getAttribute("USERNAME");
>          if (password == null) password = (String) session.getAttribute("PASSWORD");
> +        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");
>          
>          // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...
>          if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {
> @@ -319,6 +324,11 @@
>          if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {
>              password = (String) request.getAttribute("PASSWORD");
>          }
> +        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){
> +            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {
> +                userDelegatorName = (String) request.getAttribute("DELEGATOR");
> +            }
> +        }
>  
>          List<String> unpwErrMsgList = FastList.newInstance();
>          if (UtilValidate.isEmpty(username)) {
> @@ -339,7 +349,21 @@
>          if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {
>              password = password.toLowerCase();
>          }
> -
> +        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {
> +            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));
> +            request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +            return "error";
> +        }
> +        GenericDelegator userDelegator=null;
> +        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);
> +            if (userDelegator==null){
> +                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));
> +                request.setAttribute("_ERROR_MESSAGE_", errMsg);
> +                return "error";
> +            }
> +        }
> +        
>          String requirePasswordChange = request.getParameter("requirePasswordChange");
>  
>          // get the visit id to pass to the userLogin for history
> @@ -373,6 +397,10 @@
>          }
>  
>          try {
> +            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +                dispatcher.setDelegator(userDelegator);
> +                request.getSession().setAttribute("delegatorName", userDelegatorName);
> +            }
>              result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));
>          } catch (GenericServiceException e) {
>              Debug.logError(e, "Error calling userLogin service", module);
> @@ -385,6 +413,18 @@
>          if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {
>              GenericValue userLogin = (GenericValue) result.get("userLogin");
>              Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);
> +          
> +            try{
> +                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                    userLogin.set("delegator", userDelegatorName);
> +                }
> +                userLogin.store();
> +            }
> +            catch(GenericEntityException e){
> +                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");
> +                return "error";
> +            }
> +
>              if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {
>                  return "requirePasswordChange";
>              }
> @@ -419,7 +459,15 @@
>          if (userLoginSession != null) {
>              session.setAttribute("userLoginSession", userLoginSession);
>          }
> -
> +        
> +            
> +        
> +        //Begin specific
> +        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {
> +        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));
> +        CoreEvents.changeDelegator(request, response);
> +        }
> +        //End specific        
>          request.setAttribute("_LOGIN_PASSED_", "TRUE");
>  
>          // run the after-login events
> @@ -499,6 +547,16 @@
>          // set the logged out flag
>          LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);
>  
> +        //Begin specific :come back to default delegator for next login
> +        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");
> +            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  
> +            HttpServletResponse response=null;
> +            CoreEvents.changeDelegator(request, response);
> +        }
> +        //End specific  
> +
> +
>          // this is a setting we don't want to lose, although it would be good to have a more general solution here...
>          String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");
>          // also make sure the delegatorName is preserved, especially so that a new Visit can be created
> @@ -778,8 +836,14 @@
>              GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");
>              if (currentUserLogin != null) {
>                  if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {
> -                    // is the same user, just carry on...
> -                    return "success";
> +                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");
> +                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){
> +                        // is the same user, just carry on...
> +                        return "success";
> +                    }
> +                    else{
> +                        return "success";
> +                    }
>                  }
>  
>                  // logout the current user and login the new user...
> @@ -786,8 +850,19 @@
>                  logout(request, response);
>                  // ignore the return value; even if the operation failed we want to set the new UserLogin
>              }
> -
> +            
>              doBasicLogin(userLogin, request);
> +            
> +            //Begin specific
> +            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +                String userDelegatorName = userLogin.getString("delegator");
> +                request.getSession().setAttribute("delegatorName", userDelegatorName);
> +                request.setAttribute("delegatorName", userDelegatorName);
> +                CoreEvents.changeDelegator(request, response);
> +            }
> +            //End specific
> +
> +            
>          } else {
>              Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);
>          }
> Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java
> ===================================================================
> --- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (revision 705872)
> +++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (working copy)
> @@ -18,6 +18,9 @@
>   *******************************************************************************/
>  package org.ofbiz.webapp.event;
>  
> +import static org.ofbiz.base.util.UtilGenerics.checkCollection;
> +import static org.ofbiz.base.util.UtilGenerics.checkMap;
> +
>  import java.io.File;
>  import java.io.FileInputStream;
>  import java.io.FileNotFoundException;
> @@ -28,7 +31,6 @@
>  import java.util.Iterator;
>  import java.util.Locale;
>  import java.util.Map;
> -import java.util.Set;
>  import java.util.TimeZone;
>  
>  import javax.servlet.http.HttpServletRequest;
> @@ -38,8 +40,6 @@
>  import javolution.util.FastMap;
>  
>  import org.ofbiz.base.util.Debug;
> -import static org.ofbiz.base.util.UtilGenerics.checkCollection;
> -import static org.ofbiz.base.util.UtilGenerics.checkMap;
>  import org.ofbiz.base.util.UtilHttp;
>  import org.ofbiz.base.util.UtilProperties;
>  import org.ofbiz.base.util.UtilValidate;
> @@ -54,6 +54,7 @@
>  import org.ofbiz.service.ModelService;
>  import org.ofbiz.service.ServiceDispatcher;
>  import org.ofbiz.service.calendar.RecurrenceRule;
> +import org.ofbiz.webapp.control.LoginWorker;
>  import org.ofbiz.webapp.control.RequestHandler;
>  
>  /**
> @@ -104,12 +105,54 @@
>          String delegatorName = request.getParameter("delegator");
>          Security security = (Security) request.getAttribute("security");
>          Locale locale = UtilHttp.getLocale(request);
> +        GenericDelegator delegator=null;
> +        //Begin multi-delegator Specific : search for delegatorName into session information
> +        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){
> +            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);
> +            if (externalKey != null) {
> +                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);
> +                if (userLogin != null && delegatorName==null) {
> +                    delegatorName = userLogin.getString("delegator");
> +                }
> +            }
> +
> +            if(delegatorName==null){
> +                delegatorName = (String) request.getSession().getAttribute("delegatorName");
> +            }
> +            if (delegatorName == null) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
>  
> -        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> -            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> -            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> -            return "error";
> +            delegator = GenericDelegator.getGenericDelegator(delegatorName);
> +
> +            if (delegator == null) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +        //set the secruity delegator to precise the database against wich the user permissions are checked
> +            security.setDelegator(delegator);
> +            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +        }
> +        //End multi-delegator specific
> +        else{
> +
> +            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {
> +                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);
> +                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> +                return "error";
> +            }
> +
> +
> +           delegator = GenericDelegator.getGenericDelegator(delegatorName);
>          }
> +
>          if (delegatorName == null) {
>              String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);
>              request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> @@ -115,15 +158,6 @@
>              request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
>              return "error";
>          }
> -
> -        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);
> -
> -        if (delegator == null) {
> -            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);
> -            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);
> -            return "error";
> -        }
> -
>          // now change the dispatcher to use this delegator
>          LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");
>          DispatchContext dctx = dispatcher.getDispatchContext();
> @@ -144,7 +178,14 @@
>  
>          request.getSession().setAttribute("delegator", delegator);
>          request.getSession().setAttribute("dispatcher", dispatcher);
> -
> +        dispatcher.getJobManager().setDelegator(delegator);
> +        dispatcher.setDelegator(delegator);
> +        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());
> +        request.setAttribute("delegator", delegator);
> +        request.setAttribute("delegatorName", delegator.getDelegatorName());
> +        request.setAttribute("dispatcher", dispatcher);
> +        request.setAttribute("security", security);
> +        
>          return "success";
>      }
>  

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Updated: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jacques Le Roux updated OFBIZ-2020:
-----------------------------------

    Description:
I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
I will be open to discuss any suggestion for improving this issue.
Following is a patch for current ofbiz trunk version:

  was:
I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
I will be open to discuss any suggestion for improving this issue.
Following is a patch for current ofbiz trunk version:
Index: /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml

===================================================================

--- /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/applications/party/entitydef/entitymodel.xml (working copy)

@@ -2611,6 +2611,9 @@

     </extend-entity>

     <extend-entity entity-name="UserLogin">

         <field name="partyId" type="id"></field>

+        <!--Begin specific : field used to store the delegator name along  theuse session -->

+        <field name="delegator" type="id"></field>

+        <!-- End Specific  -->

         <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">

             <key-map field-name="partyId"/>

         </relation>

Index: /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/config/CommonUiLabels.xml (working copy)

@@ -1617,6 +1617,23 @@

         <value xml:lang="zh_CN">十二月</value>

         <value xml:lang="zh">十二月</value>

     </property>

+    <property key="CommonCompany">

+        <value xml:lang="ar">المؤسسة</value>

+        <value xml:lang="en">Company</value>

+        <value xml:lang="fr">Entreprise</value>

+    </property>

     <property key="CommonDelete">

         <value xml:lang="ar">حذف</value>

         <value xml:lang="cs">Smazat</value>

Index: /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/src/org/ofbiz/common/login/LoginServices.java (working copy)

@@ -90,7 +90,7 @@

         if (username == null) username = (String) context.get("username");

         String password = (String) context.get("login.password");

         if (password == null) password = (String) context.get("password");

-

+        String userDelegatorName = (String) context.get("userDelegatorName");

         // get the visitId for the history entity

         String visitId = (String) context.get("visitId");

 

@@ -193,7 +193,9 @@

                                 // successful login & no loggout flag, no need to change anything, so don't do the store

                                 doStore = false;

                             }

-

+                            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                                userLogin.set("delegator", userDelegatorName);

+                            }

                             successfulLogin = "Y";

 

                             if (!isServiceAuth) {

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/includes/header.ftl (working copy)

@@ -96,6 +96,7 @@

   </div>

   <div id="masthead">

     <ul>

+      <li> Delegator : ${delegator.getDelegatorName()}</li>

       <#if (userPreferences.COMPACT_HEADER)?default("N") == "Y">

         <li class="logo-area">

           <#if shortcutIcon?has_content>

Index: /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl

===================================================================

--- /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/common/webcommon/login.ftl (working copy)

@@ -18,7 +18,7 @@

 -->

 

 <#if requestAttributes.uiLabelMap?exists><#assign uiLabelMap = requestAttributes.uiLabelMap></#if>

-

+<#assign multidelegator = Static["org.ofbiz.base.util.UtilProperties"].getPropertyValue("security.properties", "multi.delegator")>

 <#assign previousParams = sessionAttributes._PREVIOUS_PARAMS_?if_exists>

 <#if previousParams?has_content>

   <#assign previousParams = "?" + previousParams>

@@ -46,6 +46,12 @@

             <td class="label">${uiLabelMap.CommonPassword}</td>

             <td><input type="password" name="PASSWORD" value="" size="20"/></td>

           </tr>

+          <#if multidelegator=="true">

+          <tr>

+           <td class="label">${uiLabelMap.CommonCompany}</td>

+           <td><input type="text" class="inputBox" name="DELEGATOR" value="" size="20"/></td>

+          </tr>

+          </#if>

           <tr>

             <td colspan="2" align="center">

               <input type="submit" value="${uiLabelMap.CommonLogin}"/>

Index: /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/entity/config/entityengine.xml (working copy)

@@ -53,6 +53,9 @@

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

     </delegator>

+    <delegator name="entreprise1" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">

+        <group-map group-name="org.ofbiz" datasource-name="localpostgres1"/>        

+    </delegator>

     <delegator name="default-no-eca" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" entity-eca-enabled="false" distributed-cache-clear-enabled="false">

         <group-map group-name="org.ofbiz" datasource-name="localderby"/>

         <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>

@@ -327,6 +330,33 @@

                 pool-maxsize="250"/>

         <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

     </datasource>

+    <datasource name="localpostgres1"

+            helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

+            schema-name="public"

+            field-type-name="postgres"

+            check-on-start="true"

+            add-missing-on-start="true"

+            use-fk-initially-deferred="false"

+            alias-view-columns="false"

+            join-style="ansi"

+            use-binary-type-for-blob="true">

+            <!-- use this attribute to make the EntityListIterator more effective for pgjdbc 7.5devel and later:

+                result-fetch-size="50"

+            -->

+        <read-data reader-name="seed"/>

+        <read-data reader-name="seed-initial"/>

+        <read-data reader-name="demo"/>

+        <read-data reader-name="ext"/>

+        <inline-jdbc

+                jdbc-driver="org.postgresql.Driver"

+                jdbc-uri="jdbc:postgresql://127.0.0.1/entreprise1"

+                jdbc-username="ofbiz"

+                jdbc-password="ofbiz"

+                isolation-level="ReadCommitted"

+                pool-minsize="2"

+                pool-maxsize="250"/>

+        <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->

+    </datasource>

 

     <datasource name="localpostgres"

             helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"

Index: /home/youssef/workspace/ofbiz/framework/security/config/security.properties

===================================================================

--- /home/youssef/workspace/ofbiz/framework/security/config/security.properties (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/security/config/security.properties (working copy)

@@ -77,3 +77,6 @@

 

 # -- Hours after which EmailAdressVerification should expire

 email_verification.expire.hours=48

+

+# -- are we using multi delegator

+multi.delegator=false

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/GenericAbstractDispatcher.java (working copy)

@@ -182,7 +182,14 @@

     public GenericDelegator getDelegator() {

         return dispatcher.getDelegator();

     }

-  

+        

+    /**

+     * @see org.ofbiz.service.LocalDispatcher#setDelegator()

+     */

+    public void setDelegator(GenericDelegator delegator) {

+            dispatcher.setDelegator(delegator);

+    }

+

     /**

      * @see org.ofbiz.service.LocalDispatcher#getSecurity()

      */

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/job/JobManager.java (working copy)

@@ -100,7 +100,9 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator=delegator;

+    }

     public synchronized List<Job> poll() {

         List<Job> poll = FastList.newInstance();

 

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/LocalDispatcher.java (working copy)

@@ -317,7 +317,7 @@

      * @return GenericEntityDelegator associated with this dispatcher

      */

     public GenericDelegator getDelegator();

-

+    public void setDelegator(GenericDelegator delegator);

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/service/src/org/ofbiz/service/ServiceDispatcher.java (working copy)

@@ -789,7 +789,14 @@

     public GenericDelegator getDelegator() {

         return this.delegator;

     }

-

+    

+    /**

+     * Gets the GenericDelegator associated with this dispatcher

+     * @return GenericDelegator associated with this dispatcher

+     */

+    public void setDelegator(GenericDelegator delegator) {

+        this.delegator = delegator;

+    }

     /**

      * Gets the Security object associated with this dispatcher

      * @return Security object associated with this dispatcher

Index: /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/config/WebappUiLabels.xml (working copy)

@@ -271,6 +271,15 @@

         <value xml:lang="th">รหัสผ่านเป็นค่าว่าง กรุณากรอกอีกครั้ง</value>

         <value xml:lang="zh">密码是空的,请重新输入。</value>

     </property>

+    <property key="loginevents.delegator_not_found_reenter">

+        <value xml:lang="de">Company not found, please re-enter.</value>

+        <value xml:lang="en">Company not found, please re-enter.</value>

+        <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>

+        <value xml:lang="it">Company not found, please re-enter.</value>

+        <value xml:lang="ru">Company not found, please re-enter.</value>

+        <value xml:lang="th">Company not found, please re-enter.</value>

+        <value xml:lang="zh">Company not found, please re-enter.</value>

+    </property>

     <property key="loginevents.unable_to_login_this_application">

         <value xml:lang="de">Sie können sich nicht bei dieser Anwendung anmelden (benötigte Berechtigungen fehlen).</value>

         <value xml:lang="en">Login for this application couldn't be completed (required permissions missing).</value>

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/control/LoginWorker.java (working copy)

@@ -18,6 +18,8 @@

  *******************************************************************************/

 package org.ofbiz.webapp.control;

 

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.UnsupportedEncodingException;

 import java.math.BigInteger;

 import java.net.URLEncoder;

@@ -23,7 +25,6 @@

 import java.net.URLEncoder;

 import java.security.cert.X509Certificate;

 import java.util.Enumeration;

-import java.util.HashMap;

 import java.util.List;

 import java.util.Map;

 import java.util.regex.Matcher;

@@ -47,7 +48,6 @@

 import org.ofbiz.base.util.GeneralException;

 import org.ofbiz.base.util.KeyStoreUtil;

 import org.ofbiz.base.util.UtilFormatOut;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilMisc;

 import org.ofbiz.base.util.UtilProperties;

@@ -58,7 +58,6 @@

 import org.ofbiz.entity.GenericValue;

 import org.ofbiz.entity.condition.EntityCondition;

 import org.ofbiz.entity.condition.EntityConditionList;

-import org.ofbiz.entity.condition.EntityExpr;

 import org.ofbiz.entity.condition.EntityOperator;

 import org.ofbiz.entity.model.ModelEntity;

 import org.ofbiz.entity.transaction.GenericTransactionException;

@@ -68,6 +67,7 @@

 import org.ofbiz.service.LocalDispatcher;

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceUtil;

+import org.ofbiz.webapp.event.CoreEvents;

 import org.ofbiz.webapp.stats.VisitHandler;

 

 /**

@@ -192,6 +192,9 @@

                     Debug.logError("Could not find UserLogin record for setLoggedOut with userLoginId [" + userLoginId + "]", module);

                 } else {

                     userLogin.set("hasLoggedOut", "Y");

+                    if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                        userLogin.set("delegator", null);

+                    }

                     userLogin.store();

                 }

             } catch (GenericEntityException e) {

@@ -308,9 +311,11 @@

 

         String username = request.getParameter("USERNAME");

         String password = request.getParameter("PASSWORD");

-

+        String userDelegatorName = request.getParameter("DELEGATOR");

+        

         if (username == null) username = (String) session.getAttribute("USERNAME");

         if (password == null) password = (String) session.getAttribute("PASSWORD");

+        if (userDelegatorName == null) userDelegatorName = (String) session.getAttribute("DELEGATOR");

         

         // allow a username and/or password in a request attribute to override the request parameter or the session attribute; this way a preprocessor can play with these a bit...

         if (UtilValidate.isNotEmpty((String) request.getAttribute("USERNAME"))) {

@@ -319,6 +324,11 @@

         if (UtilValidate.isNotEmpty((String) request.getAttribute("PASSWORD"))) {

             password = (String) request.getAttribute("PASSWORD");

         }

+        if("true".equals(UtilProperties.getPropertyValue("securiy.properties", "multi.delegator"))){

+            if (UtilValidate.isNotEmpty((String) request.getAttribute("DELEGATOR"))) {

+                userDelegatorName = (String) request.getAttribute("DELEGATOR");

+            }

+        }

 

         List<String> unpwErrMsgList = FastList.newInstance();

         if (UtilValidate.isEmpty(username)) {

@@ -339,7 +349,21 @@

         if ((password != null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "password.lowercase")))) {

             password = password.toLowerCase();

         }

-

+        if ((userDelegatorName == null) && ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))) {

+            String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+            request.setAttribute("_ERROR_MESSAGE_", errMsg);

+            return "error";

+        }

+        GenericDelegator userDelegator=null;

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+            userDelegator=GenericDelegator.getGenericDelegator(userDelegatorName);

+            if (userDelegator==null){

+                String errMsg = UtilProperties.getMessage(resourceWebapp, "loginevents.delegator_not_found_reenter",  UtilHttp.getLocale(request));

+                request.setAttribute("_ERROR_MESSAGE_", errMsg);

+                return "error";

+            }

+        }

+        

         String requirePasswordChange = request.getParameter("requirePasswordChange");

 

         // get the visit id to pass to the userLogin for history

@@ -373,6 +397,10 @@

         }

 

         try {

+            if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+                dispatcher.setDelegator(userDelegator);

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+            }

             result = dispatcher.runSync("userLogin", UtilMisc.toMap("login.username", username, "login.password", password, "visitId", visitId, "locale", UtilHttp.getLocale(request)));

         } catch (GenericServiceException e) {

             Debug.logError(e, "Error calling userLogin service", module);

@@ -385,6 +413,18 @@

         if (ModelService.RESPOND_SUCCESS.equals(result.get(ModelService.RESPONSE_MESSAGE))) {

             GenericValue userLogin = (GenericValue) result.get("userLogin");

             Map<String, Object> userLoginSession = checkMap(result.get("userLoginSession"), String.class, Object.class);

+          

+            try{

+                if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                    userLogin.set("delegator", userDelegatorName);

+                }

+                userLogin.store();

+            }

+            catch(GenericEntityException e){

+                request.setAttribute("_ERROR_MESSAGE_", "Unable to store userLogin");

+                return "error";

+            }

+

             if (userLogin != null && "Y".equals(userLogin.getString("requirePasswordChange"))) {

                 return "requirePasswordChange";

             }

@@ -419,7 +459,15 @@

         if (userLoginSession != null) {

             session.setAttribute("userLoginSession", userLoginSession);

         }

-

+        

+            

+        

+        //Begin specific

+        if ("true".equalsIgnoreCase(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))) {

+        request.getSession().setAttribute("delegatorName", userLogin.getString("delegator"));

+        CoreEvents.changeDelegator(request, response);

+        }

+        //End specific        

         request.setAttribute("_LOGIN_PASSED_", "TRUE");

 

         // run the after-login events

@@ -499,6 +547,16 @@

         // set the logged out flag

         LoginWorker.setLoggedOut(userLogin.getString("userLoginId"), delegator);

 

+        //Begin specific :come back to default delegator for next login

+        if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            GenericDelegator defaultdelegator=GenericDelegator.getGenericDelegator("default");

+            request.getSession().setAttribute("delegatorName", defaultdelegator.getDelegatorName());  

+            HttpServletResponse response=null;

+            CoreEvents.changeDelegator(request, response);

+        }

+        //End specific  

+

+

         // this is a setting we don't want to lose, although it would be good to have a more general solution here...

         String currCatalog = (String) session.getAttribute("CURRENT_CATALOG_ID");

         // also make sure the delegatorName is preserved, especially so that a new Visit can be created

@@ -778,8 +836,14 @@

             GenericValue currentUserLogin = (GenericValue) session.getAttribute("userLogin");

             if (currentUserLogin != null) {

                 if (currentUserLogin.getString("userLoginId").equals(userLogin.getString("userLoginId"))) {

-                    // is the same user, just carry on...

-                    return "success";

+                    GenericDelegator currentDelegator=(GenericDelegator) session.getAttribute("delegator");

+                    if(("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator")))&&(currentDelegator.getDelegatorName().equals(userLogin.getString("delegator")))){

+                        // is the same user, just carry on...

+                        return "success";

+                    }

+                    else{

+                        return "success";

+                    }

                 }

 

                 // logout the current user and login the new user...

@@ -786,8 +850,19 @@

                 logout(request, response);

                 // ignore the return value; even if the operation failed we want to set the new UserLogin

             }

-

+            

             doBasicLogin(userLogin, request);

+            

+            //Begin specific

+            if("true".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+                String userDelegatorName = userLogin.getString("delegator");

+                request.getSession().setAttribute("delegatorName", userDelegatorName);

+                request.setAttribute("delegatorName", userDelegatorName);

+                CoreEvents.changeDelegator(request, response);

+            }

+            //End specific

+

+            

         } else {

             Debug.logWarning("Could not find userLogin for external login key: " + externalKey, module);


         }

Index: /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java

===================================================================

--- /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (revision 705872)

+++ /home/youssef/workspace/ofbiz/framework/webapp/src/org/ofbiz/webapp/event/CoreEvents.java (working copy)

@@ -18,6 +18,9 @@

  *******************************************************************************/

 package org.ofbiz.webapp.event;

 

+import static org.ofbiz.base.util.UtilGenerics.checkCollection;

+import static org.ofbiz.base.util.UtilGenerics.checkMap;

+

 import java.io.File;

 import java.io.FileInputStream;

 import java.io.FileNotFoundException;

@@ -28,7 +31,6 @@

 import java.util.Iterator;

 import java.util.Locale;

 import java.util.Map;

-import java.util.Set;

 import java.util.TimeZone;

 

 import javax.servlet.http.HttpServletRequest;

@@ -38,8 +40,6 @@

 import javolution.util.FastMap;

 

 import org.ofbiz.base.util.Debug;

-import static org.ofbiz.base.util.UtilGenerics.checkCollection;

-import static org.ofbiz.base.util.UtilGenerics.checkMap;

 import org.ofbiz.base.util.UtilHttp;

 import org.ofbiz.base.util.UtilProperties;

 import org.ofbiz.base.util.UtilValidate;

@@ -54,6 +54,7 @@

 import org.ofbiz.service.ModelService;

 import org.ofbiz.service.ServiceDispatcher;

 import org.ofbiz.service.calendar.RecurrenceRule;

+import org.ofbiz.webapp.control.LoginWorker;

 import org.ofbiz.webapp.control.RequestHandler;

 

 /**

@@ -104,12 +105,54 @@

         String delegatorName = request.getParameter("delegator");

         Security security = (Security) request.getAttribute("security");

         Locale locale = UtilHttp.getLocale(request);

+        GenericDelegator delegator=null;

+        //Begin multi-delegator Specific : search for delegatorName into session information

+        if("".equals(UtilProperties.getPropertyValue("security.properties", "multi.delegator"))){

+            String externalKey = request.getParameter(LoginWorker.EXTERNAL_LOGIN_KEY_ATTR);

+            if (externalKey != null) {

+                GenericValue userLogin = (GenericValue) LoginWorker.externalLoginKeys.get(externalKey);

+                if (userLogin != null && delegatorName==null) {

+                    delegatorName = userLogin.getString("delegator");

+                }

+            }

+

+            if(delegatorName==null){

+                delegatorName = (String) request.getSession().getAttribute("delegatorName");

+            }

+            if (delegatorName == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

 

-        if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

+            delegator = GenericDelegator.getGenericDelegator(delegatorName);

+

+            if (delegator == null) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        //set the secruity delegator to precise the database against wich the user permissions are checked

+            security.setDelegator(delegator);

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+        }

+        //End multi-delegator specific

+        else{

+

+            if (!security.hasPermission("ENTITY_MAINT", request.getSession())) {

+                String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.not_authorized_use_fct", locale);

+                request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

+                return "error";

+            }

+

+

+           delegator = GenericDelegator.getGenericDelegator(delegatorName);

         }

+

         if (delegatorName == null) {

             String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.delegator_not_passed", locale);

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

@@ -115,15 +158,6 @@

             request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

             return "error";

         }

-

-        GenericDelegator delegator = GenericDelegator.getGenericDelegator(delegatorName);

-

-        if (delegator == null) {

-            String errMsg = UtilProperties.getMessage(CoreEvents.err_resource, "coreEvents.no_delegator_name_defined", locale);

-            request.setAttribute("_ERROR_MESSAGE_", "<li>" + errMsg);

-            return "error";

-        }

-

         // now change the dispatcher to use this delegator

         LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher");

         DispatchContext dctx = dispatcher.getDispatchContext();

@@ -144,7 +178,14 @@

 

         request.getSession().setAttribute("delegator", delegator);

         request.getSession().setAttribute("dispatcher", dispatcher);

-

+        dispatcher.getJobManager().setDelegator(delegator);

+        dispatcher.setDelegator(delegator);

+        request.getSession().setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("delegator", delegator);

+        request.setAttribute("delegatorName", delegator.getDelegatorName());

+        request.setAttribute("dispatcher", dispatcher);

+        request.setAttribute("security", security);

+        

         return "success";

     }

 


> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>             Fix For: SVN trunk
>
>         Attachments: ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Assigned: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jacques Le Roux reassigned OFBIZ-2020:
--------------------------------------

    Assignee: Jacques Le Roux

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12649914#action_12649914 ]

Jacques Le Roux commented on OFBIZ-2020:
----------------------------------------

Hi Youssef,

Please use relative pathes for your patches (read carefully http://docs.ofbiz.org/display/OFBADMIN/OFBiz+Contributors+Best+Practices)

Anyway after removing your specific path, I got this error.

{code}
D:\Workspace\ofbizRun>patch -p0  0<ofbiz-multi.patch
patching file applications/party/entitydef/entitymodel.xml
Hunk #1 succeeded at 2615 (offset 4 lines).
patching file framework/common/config/CommonUiLabels.xml
patch: **** malformed patch at line 31: Index: framework/common/src/org/ofbiz/common/login/LoginServices.java
{code}

Then I tried with Eclipse (using Subclipse "Apply patch" option) and was able to apply the modified patch (see patch attached) but an hunk in entitymodel.xml. See entitymodel.xml.rej, I guess you need to put your comments at end of lines instead between but I can't see why and not sure though since I gave up at this stage

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Updated: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jacques Le Roux updated OFBIZ-2020:
-----------------------------------

    Attachment: entitymodel.xml.rej

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Updated: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jacques Le Roux updated OFBIZ-2020:
-----------------------------------

    Attachment: ofbiz-multi.patch

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12650060#action_12650060 ]

youssef khaye commented on OFBIZ-2020:
--------------------------------------

Hi Jacques,
It was a great pleasure to read from you. For the relative path issue I did the nessecery.
My old patch was made from the 705872, revesion and i was surprised when you told that didn't work.
I make a newer patch on the old revision 705872, then I updated my project before doing the eclipse create patch.
To be sure that will work, I applied the patch on the base version and still working.
Best regards.

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Updated: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

youssef khaye updated OFBIZ-2020:
---------------------------------

    Attachment: ofbiz-multi.patch

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12650063#action_12650063 ]

youssef khaye commented on OFBIZ-2020:
--------------------------------------

Hi jacques again,
For relative path, using eclipse, you can check "ignore leading path name segment" to overcome the issue.
Best regards.

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12650083#action_12650083 ]

Jacques Le Roux commented on OFBIZ-2020:
----------------------------------------

Thanks Youssef,

Yes I know for Eclipse, actually most of the time I use Tortoise (on Windows) and it takes care of path issues automatically. But in your case it did not, I guess because your patch was not done on Windows. Anyway this was not a big worry, it's only because it's simpler for commiters which are not all using Eclipse.

I just tried to apply your patch, it's ok now. I will try to review and test this week, not sure though...

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12650865#action_12650865 ]

David E. Jones commented on OFBIZ-2020:
---------------------------------------

This patch must not be committed as-is. It appears to not be thread safe. In general a dispatcher should not have the delegator changed on the fly, there may be too much depending on the previous delegator (database set). It is also not thread-safe, or in other words one user changing the delegator would affect other users using the same dispatcher.




> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12650940#action_12650940 ]

Jacques Le Roux commented on OFBIZ-2020:
----------------------------------------

Also Youssef,

If ever you change for a thread-safe patch, be carefull about labels files. In framework/webapp/config/WebappUiLabels.xml

You put
    <value xml:lang="fr">Merci de v\u00E9rifiez l'entrepripse</value>
it should be
    <value xml:lang="fr">Merci de vérifier l'entreprise</value>

also use only the default when there are no translation for other languages
so
    <value xml:lang="en">Company not found, please re-enter.</value>
only

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12651132#action_12651132 ]

youssef khaye commented on OFBIZ-2020:
--------------------------------------

Hi Mr Jones;
Thanks for your interesting.
Reading your comment makes me think of the matter, It seems to be more significant to create a dispatcher in the same time with a delegator if someone request a connection for a database without them already created, and why not a new jobmanager too.
This would solve the issue because  every dispatcher with its own (jobManager,delegator) will continue working with their DB.
Since the issue of multi delegator can be  very useful in a production environment, I will be volunteer to accomplish the necessary work, of course with the guidance of persons like you and Mr Le Roux.
Best regards.


> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12664460#action_12664460 ]

Jacques Le Roux commented on OFBIZ-2020:
----------------------------------------

Any news Youssef ?

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>            Assignee: Jacques Le Roux
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Assigned: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

     [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Jacques Le Roux reassigned OFBIZ-2020:
--------------------------------------

    Assignee:     (was: Jacques Le Roux)

> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply | Threaded
Open this post in threaded view
|

[jira] Commented: (OFBIZ-2020) Using one Ofbiz instance with multiple databases

Nicolas Malin (Jira)
In reply to this post by Nicolas Malin (Jira)

    [ https://issues.apache.org/jira/browse/OFBIZ-2020?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12672986#action_12672986 ]

youssef khaye commented on OFBIZ-2020:
--------------------------------------

The main problème i get now is when changing the delegator on userLogin event, all already existing users get their work done on the new database but not the one they requested. In Other words, i thought that a session is created for each user, so that i put the delegator and dispatcher info in the session, meanwhile, this make those delegator and dispatcher available for everybody.
Exemple: i used two users
admin : connects to database delegator
flexadmin: connects to databse company1
-admin connect and plan a job( serviceName: myService ) that append the userLoginId & delegator (both giot from dispatchContext) in a file.
-now flexadmin connect and plan an other job (serviceName: myOtherService) that append the same info to the same file.
I expected that my file will contain the loginId and delegator name for both user in an alternative way. But in my file i have only the flexadmin userloginId and delegator (he loged in after the admin). which means that the last user who logged in changes the delegator for all existing users.


> Using one Ofbiz instance with multiple databases
> ------------------------------------------------
>
>                 Key: OFBIZ-2020
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-2020
>             Project: OFBiz
>          Issue Type: New Feature
>    Affects Versions: SVN trunk
>            Reporter: youssef khaye
>             Fix For: SVN trunk
>
>         Attachments: entitymodel.xml.rej, ofbiz-multi.patch, ofbiz-multi.patch, ofbiz-multi.patch
>
>
> I want to share my work with you implementing the use of one OFBiz instance with multiple databases, by defining multiple delegators, in the entityengine.xml, one for each databases. this is useful when we implementing ofbiz for semi-independent subsidiaries of one company having users allowed to use two or more databases.
> This involve mainly the user authentication procedure by asking for a company name in the login form. This company name represents a delegator name that describe a specific subsidiary database. After a successful user login operation, the passed company name is used to retrieve the corresponding delegator. The method CoreEvents.chageDelegator is modified to change the delegator of related Dispatcher and JobManager.
> Of course I needed to store the delegator name in the GenericValue UserLogin to navigate among different ofbiz applications keeping the same original database.
> I also provided a kind of mechanism to activate or deactivates the use of multi-delegator by adding a "multi.delegator" property in the security.properties configuration file that when set true, cause the ofbiz to display he company field in the login form and do the necessary work to switch from default database to the provided one.
> I will be open to discuss any suggestion for improving this issue.
> Following is a patch for current ofbiz trunk version:

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

12