[ 
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 via email to