[ 
https://issues.apache.org/jira/browse/OFBIZ-9230?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15893856#comment-15893856
 ] 

Jacques Le Roux commented on OFBIZ-9230:
----------------------------------------

Let's think about the situation in all its aspects (and be ready to dive in ;)).

First your proposition for WidgetWorker would be actually something like this

{code}
Index: framework/widget/src/main/java/org/apache/ofbiz/widget/WidgetWorker.java
===================================================================
--- framework/widget/src/main/java/org/apache/ofbiz/widget/WidgetWorker.java    
(revision 1785155)
+++ framework/widget/src/main/java/org/apache/ofbiz/widget/WidgetWorker.java    
(working copy)
@@ -35,6 +35,7 @@
 import org.apache.ofbiz.base.util.UtilHttp;
 import org.apache.ofbiz.base.util.UtilValidate;
 import org.apache.ofbiz.entity.Delegator;
+import org.apache.ofbiz.entity.DelegatorFactory;
 import org.apache.ofbiz.service.LocalDispatcher;
 import org.apache.ofbiz.webapp.control.ConfigXMLReader;
 import org.apache.ofbiz.webapp.control.RequestHandler;
@@ -410,6 +411,16 @@

     public static Delegator getDelegator(Map<String, Object> context) {
         Delegator delegator = (Delegator) context.get("delegator");
+        if (delegator == null) {
+            // this will be the common case for now as the delegator isn't 
available where we want to do this
+            // we'll cheat a little here and assume the default delegator
+            Debug.logError("Could not get a delegator using the 'default' 
delegator", module);
+            delegator = DelegatorFactory.getDelegator("default");
+            if (delegator == null) {
+                Debug.logError("Could not get a delegator even trying with the 
'default' delegator", module);
+                return null;
+            }
+        }
         return delegator;
     }
 }
{code}

In the convo, you suggested
{code}
delegator = DelegatorFactory.getDelegator(delegatorName);
{code}
I asked you what should be in delegatorName, but you did not answer and that's 
the crux of the problem. We will see that later
I suggested to use in EntityUtilProperties.getSystemPropertyValue()
{code}
delegator = DelegatorFactory.getDelegator("default");
{code}
because it fixes the problem at hand while the patch above for getDelegator() 
does not (simply try it w/o the getSystemPropertyValue() patch).

So far so good, we saw that we have the same kind of think in checkRhsType(), 
which should then actually be patched with
{code}
Index: 
framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java
===================================================================
--- 
framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java
    (revision 1785155)
+++ 
framework/entity/src/main/java/org/apache/ofbiz/entity/condition/EntityExpr.java
    (working copy)
@@ -18,11 +18,13 @@
  
*******************************************************************************/
 package org.apache.ofbiz.entity.condition;

+import java.io.IOException;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;

 import org.apache.ofbiz.base.util.Debug;
+import org.apache.ofbiz.base.util.GeneralException;
 import org.apache.ofbiz.base.util.ObjectType;
 import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.entity.Delegator;
@@ -161,7 +163,7 @@
         visitor.acceptEntityExpr(this);
     }

-    public void checkRhsType(ModelEntity modelEntity, Delegator delegator) {
+    public void checkRhsType(ModelEntity modelEntity, Delegator delegator) 
throws IOException, GeneralException {
         if (this.rhs == null || this.rhs == GenericEntity.NULL_FIELD || 
modelEntity == null) return;

         Object value = this.rhs;
@@ -179,9 +181,13 @@
         }

         if (delegator == null) {
-            // this will be the common case for now as the delegator isn't 
available where we want to do this
-            // we'll cheat a little here and assume the default delegator
             delegator = DelegatorFactory.getDelegator("default");
+            Debug.logError("Could not get a delegator using the 'default' 
delegator", module);
+            if (delegator == null) {
+                Debug.logError("Could not get a delegator even trying with the 
'default' delegator", module);
+                GeneralException exception = new GeneralException("Could not 
get a delegator even trying with the 'default' delegator");
+                throw exception;
+            }
         }

         String fieldName = null;
{code}

And now I get to the reason for this analysis: *multitenant*! My patch for 
getSystemPropertyValue()  works in a simple tenant context. But in a 
multitenant context it will always refer to the "default" tenant, which can be 
a problem. Same for the other patches above including the checkRhsType() one. 
BTW the change introduced there is prior (2008) to multitenant insertion 
(2010), so is also an issue. Now if you look at OFBIZ-6884, which broke the 
current issue, it's motivated by multitenant, and EntityUtilProperties is 
mostly useful in a multitenant context, see the problem!

So to summarise:
# My getSystemPropertyValue() patch fixes the issue Wei reported, but is just a 
workaround, and is not enough and even wrong in a multitenant context.
# Same for my proposition for checkRhsType().  At first glance it's slightly 
better than what we have now because it's throws an error in log in case 
'default' is not there.  But it's a rare case in a simple tenant context (not a 
problem OOTB, works since 2008, but could be a problem with custom changes in 
the EntityEngine...). Anyway using default defeat the purpose of multitenant 
and is an issue by itself.
# Your proposition for getDelegator() is not related with the problem at hand. 
I'm not sure it helps in other contexts. So I'd refrain to commit it since it 
inserts a problem in a multitenant context.

So all those solutions are only working in a simple tenant context. I believe 
we should refrain to commit any and look for a real solution, ie why the 
delegator misses here.
Now there are 2 temporary solutions:
* The one I committed already, which hide the problem in UI and only shows it 
in log
* Reverting my commit and replaces the Exception handling by a 
GenericEntityException but then the error will show in the UI. Try it, not sure 
it's better!

So I suggest we let things as is and close is as unresolved. And create 2 new 
Jira issues:
# One for checkRhsType() which is wrong in a multitenant context.
# Another to properly fixes the issue at hand

In both we can refer to the analysis here to explain what we should do. I'm 
really yet unsure about what to do for checkRhsType()  :/

To put is simply, even if there are easy workarounds in a simple tenant 
context, this is a big worry for the multitenant feature which heavilyu relies 
on EntityUtilProperties.getSystemPropertyValueI(). To a point that I wonder if 
there are no other issues which makes the multitenant feature so fragile that 
it either needs to be totally fixed or removed!



> Missing reference to the delegator in 
> framework/widget/templates/HtmlFormMacroLibrary.ftl
> -----------------------------------------------------------------------------------------
>
>                 Key: OFBIZ-9230
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-9230
>             Project: OFBiz
>          Issue Type: Bug
>          Components: ALL COMPONENTS
>    Affects Versions: Trunk
>            Reporter: Wei Zhang
>            Assignee: Jacques Le Roux
>            Priority: Minor
>         Attachments: OFBIZ-9230.patch
>
>
> To reproduce
> 1. Load test data <SystemProperty systemResourceId="widget" 
> systemPropertyId="widget.autocompleter.defaultMinLength" 
> systemPropertyValue="3"/> 
> 2. Open https://localhost:8443/partymgr/control/main
> 3. You will still get warning below in log file
> {quote}
> 2017-02-24 12:56:16,348 |http-nio-8443-exec-7 |EntityUtilProperties          
> |I| Could not get a system property for widget.autocompleter.defaultMinLength 
> : null
> {quote}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Reply via email to