On Jul 2, 2010, at 7:11 PM, Adrian Crum wrote:

> Because I've done it myself. ;-)

Wait, do you mean that in this case you did the actual copying and pasting? 
Well... I guess that would be one way to know for sure!

> I agree that code can look redundant and not be copy and paste. The obvious 
> ones are easy to spot because... well... they're *obvious*.

It's a great effort to refactor code and reduce it's size and redundancy. IMO 
that sort of effort is even more bang for the buck than automated testing for 
reducing bugs, and both developer and user experience with the stuff.

On the other hand, there is such a thing as too much parameterization that 
results in code that is more complicated and difficult to maintain than an 
alternative that might seem more redundant. I heard this put a funny way once, 
something like: if you start getting a nagging feeling that you are creating an 
alternative to a programming language in order to handle a specific business 
case then you've already crossed the line. ;)

-David

> --- On Fri, 7/2/10, David E Jones <[email protected]> wrote:
> 
>> From: David E Jones <[email protected]>
>> Subject: Re: svn commit: r959875 - 
>> /ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>> To: [email protected]
>> Date: Friday, July 2, 2010, 5:44 PM
>> 
>> How do you know it was copy and paste?
>> 
>> It could very well have been different code written by
>> different people and at different times, possibly even with
>> no reference to the other code. Redundant similar code is
>> annoying and nice to eliminate, but it's existence does not
>> imply copy/paste, or even necessarily awareness of the other
>> code.
>> 
>> -David
>> 
>> 
>> On Jul 2, 2010, at 1:18 AM, Adrian Crum wrote:
>> 
>>> My new mantra: Just say no to copy and paste.
>>> 
>>> I'm questioning nearly all of the code I come across.
>>> 
>>> -Adrian
>>> 
>>> 
>>> --- On Thu, 7/1/10, Scott Gray <[email protected]>
>> wrote:
>>> 
>>>> From: Scott Gray <[email protected]>
>>>> Subject: Re: svn commit: r959875 -
>> /ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>> To: [email protected]
>>>> Date: Thursday, July 1, 2010, 11:58 PM
>>>> Yeah no worries.  I'd never
>>>> really thought about it before until yesterday
>> when I came
>>>> across a problem in the
>> ModelMenuAction.PropertyMap action,
>>>> it replaces the existing uiLabelMap instead of
>> adding to it
>>>> like the ModelScreenAction version does. 
>> Option was to
>>>> either just copy and paste the screen version or
>> take the
>>>> plunge and sort it all out.
>>>> 
>>>> Regards
>>>> Scott
>>>> 
>>>> On 2/07/2010, at 6:45 PM, Adrian Crum wrote:
>>>> 
>>>>> Thanks! That duplication always bothered me.
>>>>> 
>>>>> -Adrian
>>>>> 
>>>>> --- On Thu, 7/1/10, [email protected]
>>>> <[email protected]>
>>>> wrote:
>>>>> 
>>>>>> From: [email protected]
>>>> <[email protected]>
>>>>>> Subject: svn commit: r959875 -
>>>> 
>> /ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>>>> To: [email protected]
>>>>>> Date: Thursday, July 1, 2010, 11:38 PM
>>>>>> Author: lektran
>>>>>> Date: Fri Jul  2 06:38:52 2010
>>>>>> New Revision: 959875
>>>>>> 
>>>>>> URL: http://svn.apache.org/viewvc?rev=959875&view=rev
>>>>>> Log:
>>>>>> Added a new class ModelWidgetAction which
>> will
>>>> serve to
>>>>>> replace the duplicate classes
>> ModelScreenAction,
>>>>>> ModelFormAction and ModelMenuAction. 
>> This
>>>> class is
>>>>>> virtually a direct copy of
>> ModelScreenAction and
>>>> its
>>>>>> subclasses.  I'll work over the
>> weekend to
>>>> switch the
>>>>>> existing classes to extend from
>> ModelWidgetAction,
>>>> remove
>>>>>> their methods and then deprecate the
>> shells that
>>>> are left
>>>>>> behind.
>>>>>> 
>>>>>> Added:
>>>>>>      
>>>>>> 
>>>> 
>> ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java   
>> (with
>>>>>> props)
>>>>>> 
>>>>>> Added:
>>>>>> 
>>>> 
>> ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>>>> URL: 
>>>>>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java?rev=959875&view=auto
>>>>>> 
>>>> 
>> ==============================================================================
>>>>>> ---
>>>>>> 
>>>> 
>> ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>>>> (added)
>>>>>> +++
>>>>>> 
>>>> 
>> ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>>>> Fri Jul  2 06:38:52 2010
>>>>>> @@ -0,0 +1,700 @@
>>>>>> 
>>>> 
>> +/*******************************************************************************
>>>>>> + * Licensed to the Apache Software
>> Foundation
>>>> (ASF) under
>>>>>> one
>>>>>> + * or more contributor license
>> agreements. 
>>>> See the
>>>>>> NOTICE file
>>>>>> + * distributed with this work for
>> additional
>>>> information
>>>>>> + * regarding copyright ownership. 
>> The ASF
>>>> licenses
>>>>>> this file
>>>>>> + * to you under the Apache License,
>> Version 2.0
>>>> (the
>>>>>> + * "License"); you may not use this file
>> except
>>>> in
>>>>>> compliance
>>>>>> + * with the License.  You may obtain
>> a copy
>>>> of the
>>>>>> License at
>>>>>> + *
>>>>>> + * http://www.apache.org/licenses/LICENSE-2.0
>>>>>> + *
>>>>>> + * Unless required by applicable law or
>> agreed to
>>>> in
>>>>>> writing,
>>>>>> + * software distributed under the License
>> is
>>>> distributed
>>>>>> on an
>>>>>> + * "AS IS" BASIS, WITHOUT WARRANTIES OR
>>>> CONDITIONS OF ANY
>>>>>> + * KIND, either express or implied. 
>> See the
>>>> License
>>>>>> for the
>>>>>> + * specific language governing
>> permissions and
>>>>>> limitations
>>>>>> + * under the License.
>>>>>> +
>>>>>> 
>>>> 
>> *******************************************************************************/
>>>>>> +package org.ofbiz.widget;
>>>>>> +
>>>>>> +import java.io.Serializable;
>>>>>> +import java.text.MessageFormat;
>>>>>> +import java.util.ArrayList;
>>>>>> +import java.util.List;
>>>>>> +import java.util.Locale;
>>>>>> +import java.util.Map;
>>>>>> +import java.util.TimeZone;
>>>>>> +import
>> java.util.regex.PatternSyntaxException;
>>>>>> +
>>>>>> +import javax.servlet.ServletContext;
>>>>>> +import javax.servlet.http.HttpSession;
>>>>>> +
>>>>>> +import javolution.util.FastList;
>>>>>> +import javolution.util.FastMap;
>>>>>> +
>>>>>> +import org.w3c.dom.Element;
>>>>>> +import
>>>> org.codehaus.groovy.runtime.InvokerHelper;
>>>>>> +import org.ofbiz.base.util.BshUtil;
>>>>>> +import org.ofbiz.base.util.Debug;
>>>>>> +import
>> org.ofbiz.base.util.GeneralException;
>>>>>> +import org.ofbiz.base.util.GroovyUtil;
>>>>>> +import org.ofbiz.base.util.ObjectType;
>>>>>> +import org.ofbiz.base.util.StringUtil;
>>>>>> +import org.ofbiz.base.util.UtilGenerics;
>>>>>> +import
>> org.ofbiz.base.util.UtilProperties;
>>>>>> +import org.ofbiz.base.util.UtilValidate;
>>>>>> +import org.ofbiz.base.util.UtilXml;
>>>>>> +import
>>>>>> 
>>>> 
>> org.ofbiz.base.util.collections.FlexibleMapAccessor;
>>>>>> +import
>>>>>> 
>>>> 
>> org.ofbiz.base.util.collections.ResourceBundleMapWrapper;
>>>>>> +import
>>>> 
>> org.ofbiz.base.util.string.FlexibleStringExpander;
>>>>>> +import
>> org.ofbiz.entity.GenericEntityException;
>>>>>> +import org.ofbiz.entity.GenericValue;
>>>>>> +import
>> org.ofbiz.entity.finder.ByAndFinder;
>>>>>> +import
>>>> org.ofbiz.entity.finder.ByConditionFinder;
>>>>>> +import
>> org.ofbiz.entity.finder.EntityFinderUtil;
>>>>>> +import
>> org.ofbiz.entity.finder.PrimaryKeyFinder;
>>>>>> +import
>> org.ofbiz.minilang.MiniLangException;
>>>>>> +import org.ofbiz.minilang.SimpleMethod;
>>>>>> +import
>> org.ofbiz.minilang.method.MethodContext;
>>>>>> +import
>> org.ofbiz.service.DispatchContext;
>>>>>> +import
>>>> org.ofbiz.service.GenericServiceException;
>>>>>> +import org.ofbiz.service.ModelService;
>>>>>> +
>>>>>> +...@suppresswarnings("serial")
>>>>>> +public abstract class ModelWidgetAction
>>>> implements
>>>>>> Serializable {
>>>>>> +    public static final String
>> module
>>>> =
>>>>>> ModelWidgetAction.class.getName();
>>>>>> +
>>>>>> +    protected ModelWidget
>> modelWidget;
>>>>>> +
>>>>>> +    protected
>> ModelWidgetAction() {}
>>>>>> +
>>>>>> +    public
>>>> ModelWidgetAction(ModelWidget
>>>>>> modelWidget, Element actionElement) {
>>>>>> +       
>> this.modelWidget =
>>>>>> modelWidget;
>>>>>> +        if
>>>> (Debug.verboseOn())
>>>>>> Debug.logVerbose("Reading widget action
>> with name:
>>>> " +
>>>>>> actionElement.getNodeName(), module);
>>>>>> +    }
>>>>>> +
>>>>>> +    public abstract void
>>>>>> runAction(Map<String, Object>
>> context)
>>>> throws
>>>>>> GeneralException;
>>>>>> +
>>>>>> +    public static
>>>> List<ModelWidgetAction>
>>>>>> readSubActions(ModelWidget modelWidget,
>> Element
>>>>>> parentElement) {
>>>>>> +       
>>>> List<ModelWidgetAction>
>>>>>> actions = FastList.newInstance();
>>>>>> +
>>>>>> +        List<?
>> extends
>>>> Element>
>>>>>> actionElementList =
>>>>>> UtilXml.childElementList(parentElement);
>>>>>> +        for (Element
>>>> actionElement:
>>>>>> actionElementList) {
>>>>>> +           
>> if
>>>>>> 
>> ("set".equals(actionElement.getNodeName())) {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new SetField(modelWidget,
>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>>>> 
>> ("property-map".equals(actionElement.getNodeName())) {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new PropertyMap(modelWidget,
>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>>>> 
>> ("property-to-field".equals(actionElement.getNodeName())) {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new
>> PropertyToField(modelWidget,
>>>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>> ("script".equals(actionElement.getNodeName())) {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new Script(modelWidget,
>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>> ("service".equals(actionElement.getNodeName())) {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new Service(modelWidget,
>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>> ("entity-one".equals(actionElement.getNodeName()))
>>>> {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new EntityOne(modelWidget,
>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>> ("entity-and".equals(actionElement.getNodeName()))
>>>> {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new EntityAnd(modelWidget,
>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>>>> 
>> ("entity-condition".equals(actionElement.getNodeName())) {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new
>> EntityCondition(modelWidget,
>>>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>>>> 
>> ("get-related-one".equals(actionElement.getNodeName())) {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new
>> GetRelatedOne(modelWidget,
>>>> actionElement));
>>>>>> +           
>> } else
>>>> if
>>>>>> 
>>>> 
>> ("get-related".equals(actionElement.getNodeName())) {
>>>>>> +       
>>    
>>>>     
>>>>>> actions.add(new GetRelated(modelWidget,
>>>> actionElement));
>>>>>> +           
>> } else
>>>> {
>>>>>> +       
>>    
>>>>     
>>>>>> throw new IllegalArgumentException("Action
>> element
>>>> not
>>>>>> supported with name: " +
>>>> actionElement.getNodeName());
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        return
>> actions;
>>>>>> +    }
>>>>>> +
>>>>>> +    public static void
>>>>>> 
>> runSubActions(List<ModelWidgetAction>
>>>> actions,
>>>>>> Map<String, Object> context) throws
>>>> GeneralException
>>>>>> {
>>>>>> +        if (actions
>> == null)
>>>> return;
>>>>>> +
>>>>>> +        for
>>>> (ModelWidgetAction action:
>>>>>> actions) {
>>>>>> +           
>> if
>>>>>> (Debug.verboseOn())
>> Debug.logVerbose("Running
>>>> widget action
>>>>>> " + action.getClass().getName(), module);
>>>>>> +       
>>    
>>>>>> action.runAction(context);
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> SetField
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<Object> field;
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<Object>
>> fromField;
>>>>>> +        protected
>>>>>> FlexibleStringExpander valueExdr;
>>>>>> +        protected
>>>>>> FlexibleStringExpander defaultExdr;
>>>>>> +        protected
>>>>>> FlexibleStringExpander globalExdr;
>>>>>> +        protected
>> String
>>>> type;
>>>>>> +        protected
>> String
>>>> toScope;
>>>>>> +        protected
>> String
>>>> fromScope;
>>>>>> +
>>>>>> +        public
>>>> SetField(ModelWidget
>>>>>> modelWidget, Element setElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, setElement);
>>>>>> +       
>>    
>>>> this.field =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(setElement.getAttribute("field"));
>>>>>> +       
>>    
>>>> this.fromField =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(setElement.getAttribute("from-field"));
>>>>>> +       
>>    
>>>> this.valueExdr =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("value"));
>>>>>> +       
>>    
>>>> this.defaultExdr
>>>>>> =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("default-value"));
>>>>>> +       
>>    
>>>> this.globalExdr
>>>>>> =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("global"));
>>>>>> +       
>>    
>>>> this.type =
>>>>>> setElement.getAttribute("type");
>>>>>> +       
>>    
>>>> this.toScope =
>>>>>> setElement.getAttribute("to-scope");
>>>>>> +       
>>    
>>>> this.fromScope =
>>>>>> setElement.getAttribute("from-scope");
>>>>>> +           
>> if
>>>>>> (!this.fromField.isEmpty() &&
>>>>>> !this.valueExdr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>> throw new IllegalArgumentException("Cannot
>> specify
>>>> a
>>>>>> from-field [" +
>>>> setElement.getAttribute("from-field") + "]
>>>>>> and a value [" +
>> setElement.getAttribute("value")
>>>> + "] on
>>>>>> the set action in a widget");
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +           
>> String
>>>> globalStr
>>>>>> = this.globalExdr.expandString(context);
>>>>>> +           
>> //
>>>> default to
>>>>>> false
>>>>>> +           
>> boolean
>>>> global =
>>>>>> "true".equals(globalStr);
>>>>>> +
>>>>>> +           
>> Object
>>>> newValue
>>>>>> = null;
>>>>>> +           
>> if
>>>>>> (this.fromScope != null &&
>>>>>> this.fromScope.equals("user")) {
>>>>>> +         
>>    
>>>>    if
>>>>>> (!this.fromField.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>>       HttpSession session =
>>>> (HttpSession)
>>>>>> context.get("session");
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>>>> getInMemoryPersistedFromField(session,
>> context);
>>>>>> +       
>>    
>>>>     
>>>>>>       if
>> (Debug.verboseOn())
>>>> Debug.logVerbose("In
>>>>>> user getting value for field from [" +
>>>>>> this.fromField.getOriginalName() + "]: "
>> +
>>>> newValue,
>>>>>> module);
>>>>>> +         
>>    
>>>>    }
>>>>>> else if (!this.valueExdr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>> this.valueExdr.expand(context);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> } else
>>>> if
>>>>>> (this.fromScope != null &&
>>>>>> this.fromScope.equals("application")) {
>>>>>> +         
>>    
>>>>    if
>>>>>> (!this.fromField.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>>       ServletContext
>>>> servletContext =
>>>>>> (ServletContext)
>> context.get("application");
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>>>> 
>> getInMemoryPersistedFromField(servletContext,
>>>> context);
>>>>>> +       
>>    
>>>>     
>>>>>>       if
>> (Debug.verboseOn())
>>>> Debug.logVerbose("In
>>>>>> application getting value for field from
>> [" +
>>>>>> this.fromField.getOriginalName() + "]: "
>> +
>>>> newValue,
>>>>>> module);
>>>>>> +         
>>    
>>>>    }
>>>>>> else if (!this.valueExdr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>>>> this.valueExdr.expandString(context);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> } else
>>>> {
>>>>>> +         
>>    
>>>>    if
>>>>>> (!this.fromField.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>> this.fromField.get(context);
>>>>>> +       
>>    
>>>>     
>>>>>>       if
>> (Debug.verboseOn())
>>>>>> Debug.logVerbose("Getting value for field
>> from ["
>>>> +
>>>>>> this.fromField.getOriginalName() + "]: "
>> +
>>>> newValue,
>>>>>> module);
>>>>>> +         
>>    
>>>>    }
>>>>>> else if (!this.valueExdr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>> this.valueExdr.expand(context);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> // If
>>>> newValue
>>>>>> is still empty, use the default value
>>>>>> +           
>> if
>>>>>> (ObjectType.isEmpty(newValue) &&
>>>>>> !this.defaultExdr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>> newValue =
>> this.defaultExdr.expand(context);
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> if
>>>>>> (UtilValidate.isNotEmpty(this.type)) {
>>>>>> +         
>>    
>>>>    if
>>>>>> ("NewMap".equals(this.type)) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>> FastMap.newInstance();
>>>>>> +         
>>    
>>>>    }
>>>>>> else if ("NewList".equals(this.type)) {
>>>>>> +       
>>    
> 
>>>>     
>>>>>>       newValue =
>>>> FastList.newInstance();
>>>>>> +         
>>    
>>>>    }
>>>>>> else {
>>>>>> +       
>>    
>>>>     
>>>>>>       try {
>>>>>> +       
>>    
>>>>     
>>>>>>           newValue
>> =
>>>>>> ObjectType.simpleTypeConvert(newValue,
>> this.type,
>>>> null,
>>>>>> (TimeZone) context.get("timeZone"),
>> (Locale)
>>>>>> context.get("locale"), true);
>>>>>> +       
>>    
>>>>     
>>>>>>       } catch
>> (GeneralException
>>>> e) {
>>>>>> +       
>>    
>>>>     
>>>>>>           String
>>>> errMsg = "Could not
>>>>>> convert field value for the field: [" +
>>>>>> this.field.getOriginalName() + "] to the
>> [" +
>>>> this.type + "]
>>>>>> type for the value [" + newValue + "]: "
>> +
>>>> e.toString();
>>>>>> +       
>>    
>>>>     
>>>>>>       
>>>>     Debug.logError(e, errMsg,
>>>>>> module);
>>>>>> +       
>>    
>>>>     
>>>>>>           throw
>> new
>>>>>> IllegalArgumentException(errMsg);
>>>>>> +       
>>    
>>>>     
>>>>>>       }
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> if
>>>> (this.toScope
>>>>>> != null &&
>> this.toScope.equals("user")) {
>>>>>> +       
>>    
>>>>     
>>>>>> String originalName =
>>>> this.field.getOriginalName();
>>>>>> +       
>>    
>>>>     
>>>>>> List<String> currentWidgetTrail =
>>>>>> 
>>>> 
>> UtilGenerics.toList(context.get("_WIDGETTRAIL_"));
>>>>>> +       
>>    
>>>>     
>>>>>> String newKey = "";
>>>>>> +         
>>    
>>>>    if
>>>>>> (currentWidgetTrail != null) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newKey =
>>>> StringUtil.join(currentWidgetTrail,
>>>>>> "|");
>>>>>> +         
>>    
>>>>    }
>>>>>> +         
>>    
>>>>    if
>>>>>> (UtilValidate.isNotEmpty(newKey)) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newKey += "|";
>>>>>> +         
>>    
>>>>    }
>>>>>> +       
>>    
>>>>     
>>>>>> newKey += originalName;
>>>>>> +       
>>    
>>>>     
>>>>>> HttpSession session =
>>>> (HttpSession)context.get("session");
>>>>>> +       
>>    
>>>>     
>>>>>> session.setAttribute(newKey, newValue);
>>>>>> +         
>>    
>>>>    if
>>>>>> (Debug.verboseOn()) Debug.logVerbose("In
>> user
>>>> setting value
>>>>>> for field from [" +
>> this.field.getOriginalName() +
>>>> "]: " +
>>>>>> newValue, module);
>>>>>> +           
>> } else
>>>> if
>>>>>> (this.toScope != null &&
>>>>>> this.toScope.equals("application")) {
>>>>>> +       
>>    
>>>>     
>>>>>> String originalName =
>>>> this.field.getOriginalName();
>>>>>> +       
>>    
>>>>     
>>>>>> List<String> currentWidgetTrail =
>>>>>> 
>>>> 
>> UtilGenerics.toList(context.get("_WIDGETTRAIL_"));
>>>>>> +       
>>    
>>>>     
>>>>>> String newKey = "";
>>>>>> +         
>>    
>>>>    if
>>>>>> (currentWidgetTrail != null) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newKey =
>>>> StringUtil.join(currentWidgetTrail,
>>>>>> "|");
>>>>>> +         
>>    
>>>>    }
>>>>>> +         
>>    
>>>>    if
>>>>>> (UtilValidate.isNotEmpty(newKey)) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newKey += "|";
>>>>>> +         
>>    
>>>>    }
>>>>>> +       
>>    
>>>>     
>>>>>> newKey += originalName;
>>>>>> +       
>>    
>>>>     
>>>>>> ServletContext servletContext =
>>>>>> 
>> (ServletContext)context.get("application");
>>>>>> +       
>>    
>>>>     
>>>>>> servletContext.setAttribute(newKey,
>> newValue);
>>>>>> +         
>>    
>>>>    if
>>>>>> (Debug.verboseOn()) Debug.logVerbose("In
>>>> application setting
>>>>>> value for field from [" +
>>>> this.field.getOriginalName() + "]:
>>>>>> " + newValue, module);
>>>>>> +           
>> } else
>>>> {
>>>>>> +         
>>    
>>>>    //
>>>>>> only do this if it is not global, if
>> global ONLY
>>>> put it in
>>>>>> the global context
>>>>>> +         
>>    
>>>>    if
>>>>>> (!global) {
>>>>>> +       
>>    
>>>>     
>>>>>>       if
>> (Debug.verboseOn())
>>>>>> Debug.logVerbose("Setting field [" +
>>>>>> this.field.getOriginalName() + "] to
>> value: " +
>>>> newValue,
>>>>>> module);
>>>>>> +       
>>    
>>>>     
>>>>>>      
>> this.field.put(context,
>>>> newValue);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> if
>>>> (global) {
>>>>>> +       
>>    
>>>>     
>>>>>> Map<String, Object> globalCtx =
>>>>>> 
>>>> 
>> UtilGenerics.checkMap(context.get("globalContext"));
>>>>>> +         
>>    
>>>>    if
>>>>>> (globalCtx != null) {
>>>>>> +       
>>    
>>>>     
>>>>>>      
>> this.field.put(globalCtx,
>>>> newValue);
>>>>>> +         
>>    
>>>>    }
>>>>>> else {
>>>>>> +       
>>    
>>>>     
>>>>>>      
>> this.field.put(context,
>>>> newValue);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> // this
>>>> is a
>>>>>> hack for backward compatibility with the
>> JPublish
>>>> page
>>>>>> object
>>>>>> +       
>>    
>>>> Map<String,
>>>>>> Object> page =
>>>>>> 
>> UtilGenerics.checkMap(context.get("page"));
>>>>>> +           
>> if
>>>> (page !=
>>>>>> null) {
>>>>>> +       
>>    
>>>>     
>>>>>> this.field.put(page, newValue);
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        public
>> Object
>>>>>> getInMemoryPersistedFromField(Object
>> storeAgent,
>>>>>> Map<String, Object> context) {
>>>>>> +           
>> Object
>>>> newValue
>>>>>> = null;
>>>>>> +           
>> String
>>>>>> originalName =
>> this.fromField.getOriginalName();
>>>>>> +       
>>    
>>>>>> List<String> currentWidgetTrail =
>>>>>> 
>>>> 
>> UtilGenerics.toList(context.get("_WIDGETTRAIL_"));
>>>>>> +       
>>    
>>>>>> List<String> trailList = new
>>>>>> ArrayList<String>();
>>>>>> +           
>> if
>>>>>> (currentWidgetTrail != null) {
>>>>>> +       
>>    
>>>>     
>>>>>> trailList.addAll(currentWidgetTrail);
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> for
>>>> (int
>>>>>> i=trailList.size(); i >= 0; i--) {
>>>>>> +       
>>    
>>>>     
>>>>>> List<String> subTrail =
>>>> trailList.subList(0,i);
>>>>>> +       
>>    
>>>>     
>>>>>> String newKey = null;
>>>>>> +         
>>    
>>>>    if
>>>>>> (subTrail.size() > 0)
>>>>>> +       
>>    
>>>>     
>>>>>>       newKey =
>>>> StringUtil.join(subTrail, "|") + "|"
>>>>>> + originalName;
>>>>>> +       
>>    
>>>>     
>>>>>> else
>>>>>> +       
>>    
>>>>     
>>>>>>       newKey =
>> originalName;
>>>>>> +
>>>>>> +         
>>    
>>>>    if
>>>>>> (storeAgent instanceof ServletContext) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>>>> 
>>>> 
>> ((ServletContext)storeAgent).getAttribute(newKey);
>>>>>> +         
>>    
>>>>    }
>>>>>> else if (storeAgent instanceof
>> HttpSession) {
>>>>>> +       
>>    
>>>>     
>>>>>>       newValue =
>>>>>> 
>> ((HttpSession)storeAgent).getAttribute(newKey);
>>>>>> +         
>>    
>>>>    }
>>>>>> +         
>>    
>>>>    if
>>>>>> (newValue != null) {
>>>>>> +       
>>    
>>>>     
>>>>>>       break;
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>>>> +           
>> return
>>>>>> newValue;
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> PropertyMap
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +        protected
>>>>>> FlexibleStringExpander resourceExdr;
>>>>>> +        protected
>>>>>> 
>>>> 
>> FlexibleMapAccessor<ResourceBundleMapWrapper>
>>>>>> mapNameAcsr;
>>>>>> +        protected
>>>>>> FlexibleStringExpander globalExdr;
>>>>>> +
>>>>>> +        public
>>>> PropertyMap(ModelWidget
>>>>>> modelWidget, Element setElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, setElement);
>>>>>> +       
>>    
>>>>>> this.resourceExdr =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("resource"));
>>>>>> +       
>>    
>>>> this.mapNameAcsr
>>>>>> =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(setElement.getAttribute("map-name"));
>>>>>> +       
>>    
>>>> this.globalExdr
>>>>>> =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("global"));
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +           
>> String
>>>> globalStr
>>>>>> = this.globalExdr.expandString(context);
>>>>>> +           
>> //
>>>> default to
>>>>>> false
>>>>>> +           
>> boolean
>>>> global =
>>>>>> "true".equals(globalStr);
>>>>>> +
>>>>>> +           
>> Locale
>>>> locale =
>>>>>> (Locale) context.get("locale");
>>>>>> +           
>> String
>>>> resource
>>>>>> = this.resourceExdr.expandString(context,
>>>> locale);
>>>>>> +
>>>>>> +       
>>    
>>>>>> ResourceBundleMapWrapper existingPropMap
>> =
>>>>>> this.mapNameAcsr.get(context);
>>>>>> +           
>> if
>>>>>> (existingPropMap == null) {
>>>>>> +       
>>    
>>>>     
>>>>>> this.mapNameAcsr.put(context,
>>>>>> 
>> UtilProperties.getResourceBundleMap(resource,
>>>> locale,
>>>>>> context));
>>>>>> +           
>> } else
>>>> {
>>>>>> +       
>>    
>>>>     
>>>>>> try {
>>>>>> +       
>>    
>>>>     
>>>>>>      
>>>>>> 
>>>> 
>> existingPropMap.addBottomResourceBundle(resource);
>>>>>> +         
>>    
>>>>    }
>>>>>> catch (IllegalArgumentException e) {
>>>>>> +       
>>    
>>>>     
>>>>>>       // log the error, but
>>>> don't let it kill
>>>>>> everything just for a typo or bad char in
>> an l10n
>>>> file
>>>>>> +       
>>    
>>>>     
>>>>>>       Debug.logError(e,
>> "Error
>>>> adding resource
>>>>>> bundle [" + resource + "]: " +
>> e.toString(),
>>>> module);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> if
>>>> (global) {
>>>>>> +       
>>    
>>>>     
>>>>>> Map<String, Object> globalCtx =
>>>>>> 
>>>> 
>> UtilGenerics.checkMap(context.get("globalContext"));
>>>>>> +         
>>    
>>>>    if
>>>>>> (globalCtx != null) {
>>>>>> +       
>>    
>>>>     
>>>>>>      
>> ResourceBundleMapWrapper
>>>> globalExistingPropMap
>>>>>> = this.mapNameAcsr.get(globalCtx);
>>>>>> +       
>>    
>>>>     
>>>>>>       if
>> (globalExistingPropMap
>>>> == null) {
>>>>>> +       
>>    
>>>>     
>>>>>>       
>>>>     this.mapNameAcsr.put(globalCtx,
>>>>>> 
>> UtilProperties.getResourceBundleMap(resource,
>>>> locale,
>>>>>> context));
>>>>>> +       
>>    
>>>>     
>>>>>>       } else {
>>>>>> +       
>>    
>>>>     
>>>>>>           // is it
>> the
>>>> same object? if not
>>>>>> add it in here too...
>>>>>> +       
>>    
>>>>     
>>>>>>           if
>>>> (existingPropMap !=
>>>>>> globalExistingPropMap) {
>>>>>> +       
>>    
>>>>     
>>>>>>           
>>>>     try {
>>>>>> +       
>>    
>>>>     
>>>>>>            
>>   
>>>>    
>>>>>> 
>>>> 
>> globalExistingPropMap.addBottomResourceBundle(resource);
>>>>>> +       
>>    
>>>>     
>>>>>>           
>>>>     } catch
>>>>>> (IllegalArgumentException e) {
>>>>>> +       
>>    
>>>>     
>>>>>>            
>>   
>>>>     //
>>>>>> log the error, but don't let it kill
>> everything
>>>> just for a
>>>>>> typo or bad char in an l10n file
>>>>>> +       
>>    
>>>>     
>>>>>>            
>>   
>>>>    
>>>>>> Debug.logError(e, "Error adding resource
>> bundle ["
>>>> +
>>>>>> resource + "]: " + e.toString(), module);
>>>>>> +       
>>    
>>>>     
>>>>>>           
>>>>     }
>>>>>> +       
>>    
>>>>     
>>>>>>           }
>>>>>> +       
>>    
>>>>     
>>>>>>       }
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> PropertyToField
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +
>>>>>> +        protected
>>>>>> FlexibleStringExpander resourceExdr;
>>>>>> +        protected
>>>>>> FlexibleStringExpander propertyExdr;
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<Object>
>> fieldAcsr;
>>>>>> +        protected
>>>>>> FlexibleStringExpander defaultExdr;
>>>>>> +        protected
>> boolean
>>>> noLocale;
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<List<? extends
>>>> Object>>
>>>>>> argListAcsr;
>>>>>> +        protected
>>>>>> FlexibleStringExpander globalExdr;
>>>>>> +
>>>>>> +        public
>>>>>> PropertyToField(ModelWidget modelWidget,
>> Element
>>>> setElement)
>>>>>> {
>>>>>> +           
>> super
>>>>>> (modelWidget, setElement);
>>>>>> +       
>>    
>>>>>> this.resourceExdr =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("resource"));
>>>>>> +       
>>    
>>>>>> this.propertyExdr =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("property"));
>>>>>> +       
>>    
>>>> this.fieldAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(setElement.getAttribute("field"));
>>>>>> +       
>>    
>>>> this.defaultExdr
>>>>>> =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("default"));
>>>>>> +       
>>    
>>>> this.noLocale =
>>>>>> 
>>>> 
>> "true".equals(setElement.getAttribute("no-locale"));
>>>>>> +       
>>    
>>>> this.argListAcsr
>>>>>> =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(setElement.getAttribute("arg-list-name"));
>>>>>> +       
>>    
>>>> this.globalExdr
>>>>>> =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(setElement.getAttribute("global"));
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +       
>>    
>>>> //String
>>>>>> globalStr =
>>>> this.globalExdr.expandString(context);
>>>>>> +           
>> //
>>>> default to
>>>>>> false
>>>>>> +       
>>    
>>>> //boolean global
>>>>>> = "true".equals(globalStr);
>>>>>> +
>>>>>> +           
>> Locale
>>>> locale =
>>>>>> (Locale) context.get("locale");
>>>>>> +           
>> String
>>>> resource
>>>>>> = this.resourceExdr.expandString(context,
>>>> locale);
>>>>>> +           
>> String
>>>> property
>>>>>> = this.propertyExdr.expandString(context,
>>>> locale);
>>>>>> +
>>>>>> +           
>> String
>>>> value =
>>>>>> null;
>>>>>> +           
>> if
>>>> (noLocale) {
>>>>>> +       
>>    
>>>>     
>>>>>> value =
>> UtilProperties.getPropertyValue(resource,
>>>>>> property);
>>>>>> +           
>> } else
>>>> {
>>>>>> +       
>>    
>>>>     
>>>>>> value =
>> UtilProperties.getMessage(resource,
>>>> property,
>>>>>> locale);
>>>>>> +           
>> }
>>>>>> +           
>> if
>>>>>> (UtilValidate.isEmpty(value)) {
>>>>>> +       
>>    
>>>>     
>>>>>> value =
>> this.defaultExdr.expandString(context);
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> // note
>>>> that
>>>>>> expanding the value string here will
>> handle
>>>> defaultValue and
>>>>>> the string from
>>>>>> +       
>>    
>>>> //  the
>>>>>> properties file; if we decide later that
>> we don't
>>>> want the
>>>>>> string from the properties
>>>>>> +       
>>    
>>>> //  file to
>>>>>> be expanded we should just expand the
>> defaultValue
>>>> at the
>>>>>> beginning of this method.
>>>>>> +           
>> value
>>>> =
>>>>>> 
>> FlexibleStringExpander.expandString(value,
>>>> context);
>>>>>> +
>>>>>> +           
>> if
>>>>>> (!argListAcsr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>> List<? extends Object> argList =
>>>>>> argListAcsr.get(context);
>>>>>> +         
>>    
>>>>    if
>>>>>> (UtilValidate.isNotEmpty(argList)) {
>>>>>> +       
>>    
>>>>     
>>>>>>       value =
>>>> MessageFormat.format(value,
>>>>>> argList.toArray());
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>>>> +       
>>    
>>>>>> fieldAcsr.put(context, value);
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class Script
>> extends
>>>>>> ModelWidgetAction {
>>>>>> +        protected
>> static
>>>> final
>>>>>> Object[] EMPTY_ARGS = {};
>>>>>> +        protected
>> String
>>>> location;
>>>>>> +        protected
>> String
>>>> method;
>>>>>> +
>>>>>> +        public
>>>> Script(ModelWidget
>>>>>> modelWidget, Element scriptElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, scriptElement);
>>>>>> +           
>> String
>>>>>> scriptLocation =
>>>> scriptElement.getAttribute("location");
>>>>>> +       
>>    
>>>> this.location =
>>>>>> 
>> WidgetWorker.getScriptLocation(scriptLocation);
>>>>>> +       
>>    
>>>> this.method =
>>>>>> 
>> WidgetWorker.getScriptMethodName(scriptLocation);
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context)
>>>> throws
>>>>>> GeneralException {
>>>>>> +           
>> if
>>>>>> (location.endsWith(".bsh")) {
>>>>>> +       
>>    
>>>>     
>>>>>> try {
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>     BshUtil.runBshAtLocation(location,
>>>> context);
>>>>>> +         
>>    
>>>>    }
>>>>>> catch (GeneralException e) {
>>>>>> +       
>>    
>>>>     
>>>>>>       throw new
>>>> GeneralException("Error running BSH
>>>>>> script at location [" + location + "]",
>> e);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> } else
>>>> if
>>>>>> (location.endsWith(".groovy")) {
>>>>>> +       
>>    
>>>>     
>>>>>> try {
>>>>>> +       
>>    
>>>>     
>>>>>>       groovy.lang.Script
>> script
>>>> =
>>>>>> 
>>>> 
>> InvokerHelper.createScript(GroovyUtil.getScriptClassFromLocation(location),
>>>>>> GroovyUtil.getBinding(context));
>>>>>> +       
>>    
>>>>     
>>>>>>       if
>>>> (UtilValidate.isEmpty(method)) {
>>>>>> +       
>>    
>>>>     
>>>>>>       
>>>>     script.run();
>>>>>> +       
>>    
>>>>     
>>>>>>       } else {
>>>>>> +       
>>    
>>>>     
>>>>>>       
>>>>     script.invokeMethod(method,
>>>>>> EMPTY_ARGS);
>>>>>> +       
>>    
>>>>     
>>>>>>       }
>>>>>> +         
>>    
>>>>    }
>>>>>> catch (GeneralException e) {
>>>>>> +       
>>    
>>>>     
>>>>>>       throw new
>>>> GeneralException("Error running
>>>>>> Groovy script at location [" + location +
>> "]",
>>>> e);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> } else
>>>> if
>>>>>> (location.endsWith(".xml")) {
>>>>>> +       
>>    
>>>>     
>>>>>> Map<String, Object> localContext =
>>>>>> FastMap.newInstance();
>>>>>> +       
>>    
>>>>     
>>>>>> localContext.putAll(context);
>>>>>> +       
>>    
>>>>     
>>>>>> DispatchContext ctx =
>>>>>> 
>>>> 
>> WidgetWorker.getDispatcher(context).getDispatchContext();
>>>>>> +       
>>    
>>>>     
>>>>>> MethodContext methodContext = new
>>>> MethodContext(ctx,
>>>>>> localContext, null);
>>>>>> +       
>>    
>>>>     
>>>>>> try {
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>    
>> SimpleMethod.runSimpleMethod(location,
>>>> method,
>>>>>> methodContext);
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>    
>> context.putAll(methodContext.getResults());
>>>>>> +         
>>    
>>>>    }
>>>>>> catch (MiniLangException e) {
>>>>>> +       
>>    
>>>>     
>>>>>>       throw new
>>>> GeneralException("Error running
>>>>>> simple method at location [" + location +
>> "]",
>>>> e);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> } else
>>>> {
>>>>>> +       
>>    
>>>>     
>>>>>> throw new GeneralException("For widget
>> script
>>>> actions the
>>>>>> script type is not yet supported for
>> location: ["
>>>> + location
>>>>>> + "]");
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> Service
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +        protected
>>>>>> FlexibleStringExpander serviceNameExdr;
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<Map<String,
>>>> Object>>
>>>>>> resultMapNameAcsr;
>>>>>> +        protected
>>>>>> FlexibleStringExpander autoFieldMapExdr;
>>>>>> +        protected
>>>>>> Map<FlexibleMapAccessor<Object>,
>>>> Object>
>>>>>> fieldMap;
>>>>>> +
>>>>>> +        public
>>>> Service(ModelWidget
>>>>>> modelWidget, Element serviceElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, serviceElement);
>>>>>> +       
>>    
>>>>>> this.serviceNameExdr =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(serviceElement.getAttribute("service-name"));
>>>>>> +       
>>    
>>>>>> this.resultMapNameAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(serviceElement.getAttribute("result-map"));
>>>>>> +           
>> if
>>>>>> (this.resultMapNameAcsr.isEmpty())
>>>> this.resultMapNameAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(serviceElement.getAttribute("result-map-name"));
>>>>>> +       
>>    
>>>>>> this.autoFieldMapExdr =
>>>>>> 
>>>> 
>> FlexibleStringExpander.getInstance(serviceElement.getAttribute("auto-field-map"));
>>>>>> +       
>>    
>>>> this.fieldMap =
>>>>>> 
>> EntityFinderUtil.makeFieldMap(serviceElement);
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +           
>> String
>>>>>> serviceNameExpanded =
>>>>>> 
>> this.serviceNameExdr.expandString(context);
>>>>>> +           
>> if
>>>>>> 
>> (UtilValidate.isEmpty(serviceNameExpanded)) {
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException("Service name
>>>> was empty,
>>>>>> expanded from: " +
>>>> this.serviceNameExdr.getOriginal());
>>>>>> +           
>> }
>>>>>> +
>>>>>> +           
>> String
>>>>>> autoFieldMapString =
>>>>>> 
>> this.autoFieldMapExdr.expandString(context);
>>>>>> +
>>>>>> +           
>> try {
>>>>>> +       
>>    
>>>>     
>>>>>> Map<String, Object> serviceContext =
>> null;
>>>>>> +         
>>    
>>>>    if
>>>>>> ("true".equals(autoFieldMapString)) {
>>>>>> +       
>>    
>>>>     
>>>>>>       DispatchContext dc =
>>>>>> 
>>>> 
>> WidgetWorker.getDispatcher(context).getDispatchContext();
>>>>>> +       
>>    
>>>>     
>>>>>>       // try a map called
>>>> "parameters", try it first
>>>>>> so values from here are overriden by
>> values in the
>>>> main
>>>>>> context
>>>>>> +       
>>    
>>>>     
>>>>>>       Map<String,
>> Object>
>>>> combinedMap =
>>>>>> FastMap.newInstance();
>>>>>> +       
>>    
>>>>     
>>>>>>       Map<String,
>> Object>
>>>> parametersObj =
>>>>>> 
>> UtilGenerics.toMap(context.get("parameters"));
>>>>>> +       
>>    
>>>>     
>>>>>>       if (parametersObj !=
>> null)
>>>> {
>>>>>> +       
>>    
>>>>     
>>>>>>          
>>>>>> combinedMap.putAll(parametersObj);
>>>>>> +       
>>    
>>>>     
>>>>>>       }
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>     combinedMap.putAll(context);
>>>>>> +       
>>    
>>>>     
>>>>>>       serviceContext =
>>>>>> dc.makeValidContext(serviceNameExpanded,
>>>>>> ModelService.IN_PARAM, combinedMap);
>>>>>> +         
>>    
>>>>    }
>>>>>> else if
>>>> (UtilValidate.isNotEmpty(autoFieldMapString)
>>>>>> &&
>> !"false".equals(autoFieldMapString)) {
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>     FlexibleMapAccessor<Object>
>> fieldFma
>>>> =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(autoFieldMapString);
>>>>>> +       
>>    
>>>>     
>>>>>>       Map<String,
>> Object>
>>>> autoFieldMap =
>>>>>> 
>> UtilGenerics.toMap(fieldFma.get(context));
>>>>>> +       
>>    
>>>>     
>>>>>>       if (autoFieldMap !=
>> null)
>>>> {
>>>>>> +       
>>    
>>>>     
>>>>>>       
>>>>     serviceContext =
>>>>>> 
>>>> 
>> WidgetWorker.getDispatcher(context).getDispatchContext().makeValidContext(serviceNameExpanded,
>>>>>> ModelService.IN_PARAM, autoFieldMap);
>>>>>> +       
>>    
>>>>     
>>>>>>       }
>>>>>> +         
>>    
>>>>    }
>>>>>> +         
>>    
>>>>    if
>>>>>> (serviceContext == null) {
>>>>>> +       
>>    
>>>>     
>>>>>>       serviceContext =
>>>> FastMap.newInstance();
>>>>>> +         
>>    
>>>>    }
>>>>>> +
>>>>>> +         
>>    
>>>>    if
>>>>>> (this.fieldMap != null) {
>>>>>> +       
>>    
>>>>     
>>>>>>      
>>>>>> 
>>>> 
>> EntityFinderUtil.expandFieldMapToContext(this.fieldMap,
>>>>>> context, serviceContext);
>>>>>> +         
>>    
>>>>    }
>>>>>> +
>>>>>> +       
>>    
>>>>     
>>>>>> Map<String, Object> result =
>>>>>> 
>>>> 
>> WidgetWorker.getDispatcher(context).runSync(serviceNameExpanded,
>>>>>> serviceContext);
>>>>>> +
>>>>>> +         
>>    
>>>>    if
>>>>>> (!this.resultMapNameAcsr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>     this.resultMapNameAcsr.put(context,
>>>> result);
>>>>>> +       
>>    
>>>>     
>>>>>>       String queryString =
>>>>>> (String)result.get("queryString");
>>>>>> +       
>>    
>>>>     
>>>>>>      
>> context.put("queryString",
>>>> queryString);
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>     context.put("queryStringMap",
>>>>>> result.get("queryStringMap"));
>>>>>> +       
>>    
>>>>     
>>>>>>       if
>>>> (UtilValidate.isNotEmpty(queryString)) {
>>>>>> +       
>>    
>>>>     
>>>>>>           try {
>>>>>> +       
>>    
>>>>     
>>>>>>           
>>>>     String
>>>>>> queryStringEncoded =
>>>> queryString.replaceAll("&",
>>>>>> "%26");
>>>>>> +       
>>    
>>>>     
>>>>>>          
>>    
>>>>>> context.put("queryStringEncoded",
>>>> queryStringEncoded);
>>>>>> +       
>>    
>>>>     
>>>>>>           } catch
>>>> (PatternSyntaxException
>>>>>> e) {
>>>>>> +
>>>>>> +       
>>    
>>>>     
>>>>>>           }
>>>>>> +       
>>    
>>>>     
>>>>>>       }
>>>>>> +         
>>    
>>>>    }
>>>>>> else {
>>>>>> +       
>>    
>>>>     
> 
>>>>>>      
>> context.putAll(result);
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>> catch
>>>>>> (GenericServiceException e) {
>>>>>> +       
>>    
>>>>     
>>>>>> String errMsg = "Error calling service
>> with name "
>>>> +
>>>>>> serviceNameExpanded + ": " +
>> e.toString();
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logError(e, errMsg, module);
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException(errMsg);
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        public
>>>> FlexibleStringExpander
>>>>>> getServiceNameExdr() {
>>>>>> +           
>> return
>>>>>> this.serviceNameExdr;
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> EntityOne
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +        protected
>>>> PrimaryKeyFinder
>>>>>> finder;
>>>>>> +
>>>>>> +        public
>>>> EntityOne(ModelWidget
>>>>>> modelWidget, Element entityOneElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, entityOneElement);
>>>>>> +           
>> finder
>>>> = new
>>>>>> PrimaryKeyFinder(entityOneElement);
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +           
>> try {
>>>>>> +       
>>    
>>>>     
>>>>>> finder.runFind(context,
>>>>>> WidgetWorker.getDelegator(context));
>>>>>> +           
>> }
>>>> catch
>>>>>> (GeneralException e) {
>>>>>> +       
>>    
>>>>     
>>>>>> String errMsg = "Error doing entity query
>> by
>>>> condition: " +
>>>>>> e.toString();
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logError(e, errMsg, module);
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException(errMsg);
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        public
>>>> PrimaryKeyFinder
>>>>>> getFinder() {
>>>>>> +           
>> return
>>>>>> this.finder;
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> EntityAnd
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +        protected
>> ByAndFinder
>>>> finder;
>>>>>> +
>>>>>> +        public
>>>> EntityAnd(ModelWidget
>>>>>> modelWidget, Element entityAndElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, entityAndElement);
>>>>>> +           
>> finder
>>>> = new
>>>>>> ByAndFinder(entityAndElement);
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +           
>> try {
>>>>>> +       
>>    
>>>>     
>>>>>> finder.runFind(context,
>>>>>> WidgetWorker.getDelegator(context));
>>>>>> +           
>> }
>>>> catch
>>>>>> (GeneralException e) {
>>>>>> +       
>>    
>>>>     
>>>>>> String errMsg = "Error doing entity query
>> by
>>>> condition: " +
>>>>>> e.toString();
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logError(e, errMsg, module);
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException(errMsg);
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        public
>> ByAndFinder
>>>> getFinder()
>>>>>> {
>>>>>> +           
>> return
>>>>>> this.finder;
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> EntityCondition
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +       
>> ByConditionFinder
>>>> finder;
>>>>>> +
>>>>>> +        public
>>>>>> EntityCondition(ModelWidget modelWidget,
>> Element
>>>>>> entityConditionElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, entityConditionElement);
>>>>>> +           
>> finder
>>>> = new
>>>>>> 
>> ByConditionFinder(entityConditionElement);
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +           
>> try {
>>>>>> +       
>>    
>>>>     
>>>>>> finder.runFind(context,
>>>>>> WidgetWorker.getDelegator(context));
>>>>>> +           
>> }
>>>> catch
>>>>>> (GeneralException e) {
>>>>>> +       
>>    
>>>>     
>>>>>> String errMsg = "Error doing entity query
>> by
>>>> condition: " +
>>>>>> e.toString();
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logError(e, errMsg, module);
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException(errMsg);
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        public
>>>> ByConditionFinder
>>>>>> getFinder() {
>>>>>> +           
>> return
>>>>>> this.finder;
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> GetRelatedOne
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<Object>
>> valueNameAcsr;
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<Object>
>>>> toValueNameAcsr;
>>>>>> +        protected
>> String
>>>>>> relationName;
>>>>>> +        protected
>> boolean
>>>> useCache;
>>>>>> +
>>>>>> +        public
>>>>>> GetRelatedOne(ModelWidget modelWidget,
>> Element
>>>>>> getRelatedOneElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, getRelatedOneElement);
>>>>>> +       
>>    
>>>>>> this.valueNameAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedOneElement.getAttribute("value-field"));
>>>>>> +           
>> if
>>>>>> (this.valueNameAcsr.isEmpty())
>> this.valueNameAcsr
>>>> =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedOneElement.getAttribute("value-name"));
>>>>>> +       
>>    
>>>>>> this.toValueNameAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedOneElement.getAttribute("to-value-field"));
>>>>>> +           
>> if
>>>>>> (this.toValueNameAcsr.isEmpty())
>>>> this.toValueNameAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedOneElement.getAttribute("to-value-name"));
>>>>>> +       
>>    
>>>>>> this.relationName =
>>>>>> 
>>>> 
>> getRelatedOneElement.getAttribute("relation-name");
>>>>>> +       
>>    
>>>> this.useCache =
>>>>>> 
>>>> 
>> "true".equals(getRelatedOneElement.getAttribute("use-cache"));
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +           
>> Object
>>>>>> valueObject = valueNameAcsr.get(context);
>>>>>> +           
>> if
>>>> (valueObject
>>>>>> == null) {
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logVerbose("Value not found with
>> name: " +
>>>>>> valueNameAcsr + ", not getting
>> related...",
>>>> module);
>>>>>> +       
>>    
>>>>     
>>>>>> return;
>>>>>> +           
>> }
>>>>>> +           
>> if
>>>>>> (!(valueObject instanceof GenericValue))
>> {
>>>>>> +       
>>    
>>>>     
>>>>>> String errMsg = "Env variable for
>> value-name " +
>>>>>> valueNameAcsr.toString() + " is not a
>> GenericValue
>>>> object;
>>>>>> for the relation-name: " + relationName +
>> "]";
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logError(errMsg, module);
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException(errMsg);
>>>>>> +           
>> }
>>>>>> +       
>>    
>>>> GenericValue
>>>>>> value = (GenericValue) valueObject;
>>>>>> +           
>> try {
>>>>>> +         
>>    
>>>>    if
>>>>>> (useCache) {
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>     toValueNameAcsr.put(context,
>>>>>> value.getRelatedOneCache(relationName));
>>>>>> +         
>>    
>>>>    }
>>>>>> else {
>>>>>> +       
>>    
>>>>     
>>>>>>   
>>>>     toValueNameAcsr.put(context,
>>>>>> value.getRelatedOne(relationName));
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>> catch
>>>>>> (GenericEntityException e) {
>>>>>> +       
>>    
>>>>     
>>>>>> String errMsg = "Problem getting related
>> one from
>>>> entity
>>>>>> with name " + value.getEntityName() + "
>> for the
>>>>>> relation-name: " + relationName + ": " +
>>>> e.getMessage();
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logError(e, errMsg, module);
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException(errMsg);
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        public
>> String
>>>>>> getRelationName() {
>>>>>> +           
>> return
>>>>>> this.relationName;
>>>>>> +        }
>>>>>> +    }
>>>>>> +
>>>>>> +    public static class
>> GetRelated
>>>> extends
>>>>>> ModelWidgetAction {
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<Object>
>> valueNameAcsr;
>>>>>> +        protected
>>>>>> 
>>>> 
>> FlexibleMapAccessor<List<GenericValue>>
>>>>>> listNameAcsr;
>>>>>> +        protected
>>>>>> FlexibleMapAccessor<Map<String,
>>>> Object>>
>>>>>> mapAcsr;
>>>>>> +        protected
>>>>>> 
>> FlexibleMapAccessor<List<String>>
>>>>>> orderByListAcsr;
>>>>>> +        protected
>> String
>>>>>> relationName;
>>>>>> +        protected
>> boolean
>>>> useCache;
>>>>>> +
>>>>>> +        public
>>>> GetRelated(ModelWidget
>>>>>> modelWidget, Element getRelatedElement) {
>>>>>> +           
>> super
>>>>>> (modelWidget, getRelatedElement);
>>>>>> +       
>>    
>>>>>> this.valueNameAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedElement.getAttribute("value-field"));
>>>>>> +           
>> if
>>>>>> (this.valueNameAcsr.isEmpty())
>> this.valueNameAcsr
>>>> =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedElement.getAttribute("value-name"));
>>>>>> +       
>>    
>>>>>> this.listNameAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedElement.getAttribute("list"));
>>>>>> +           
>> if
>>>>>> (this.listNameAcsr.isEmpty())
>> this.listNameAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedElement.getAttribute("list-name"));
>>>>>> +       
>>    
>>>>>> this.relationName =
>>>>>> 
>> getRelatedElement.getAttribute("relation-name");
>>>>>> +       
>>    
>>>> this.mapAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedElement.getAttribute("map"));
>>>>>> +           
>> if
>>>>>> (this.mapAcsr.isEmpty()) this.mapAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedElement.getAttribute("map-name"));
>>>>>> +       
>>    
>>>>>> this.orderByListAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedElement.getAttribute("order-by-list"));
>>>>>> +           
>> if
>>>>>> (this.orderByListAcsr.isEmpty())
>>>> this.orderByListAcsr =
>>>>>> 
>>>> 
>> FlexibleMapAccessor.getInstance(getRelatedElement.getAttribute("order-by-list-name"));
>>>>>> +       
>>    
>>>> this.useCache =
>>>>>> 
>>>> 
>> "true".equals(getRelatedElement.getAttribute("use-cache"));
>>>>>> +        }
>>>>>> +
>>>>>> +        @Override
>>>>>> +        public void
>>>>>> runAction(Map<String, Object>
>> context) {
>>>>>> +           
>> Object
>>>>>> valueObject = valueNameAcsr.get(context);
>>>>>> +           
>> if
>>>> (valueObject
>>>>>> == null) {
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logVerbose("Value not found with
>> name: " +
>>>>>> valueNameAcsr + ", not getting
>> related...",
>>>> module);
>>>>>> +       
>>    
>>>>     
>>>>>> return;
>>>>>> +           
>> }
>>>>>> +           
>> if
>>>>>> (!(valueObject instanceof GenericValue))
>> {
>>>>>> +       
>>    
>>>>     
>>>>>> String errMsg = "Env variable for
>> value-name " +
>>>>>> valueNameAcsr.toString() + " is not a
>> GenericValue
>>>> object;
>>>>>> for the relation-name: " + relationName +
>> "]";
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logError(errMsg, module);
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException(errMsg);
>>>>>> +           
>> }
>>>>>> +       
>>    
>>>> GenericValue
>>>>>> value = (GenericValue) valueObject;
>>>>>> +       
>>    
>>>>>> List<String> orderByNames = null;
>>>>>> +           
>> if
>>>>>> (!orderByListAcsr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>> orderByNames =
>> orderByListAcsr.get(context);
>>>>>> +           
>> }
>>>>>> +       
>>    
>>>> Map<String,
>>>>>> Object> constraintMap = null;
>>>>>> +           
>> if
>>>>>> (!mapAcsr.isEmpty()) {
>>>>>> +       
>>    
>>>>     
>>>>>> constraintMap = mapAcsr.get(context);
>>>>>> +           
>> }
>>>>>> +           
>> try {
>>>>>> +         
>>    
>>>>    if
>>>>>> (useCache) {
>>>>>> +       
>>    
>>>>     
>>>>>>      
>> listNameAcsr.put(context,
>>>>>> value.getRelatedCache(relationName,
>>>> constraintMap,
>>>>>> orderByNames));
>>>>>> +         
>>    
>>>>    }
>>>>>> else {
>>>>>> +       
>>    
>>>>     
>>>>>>      
>> listNameAcsr.put(context,
>>>>>> value.getRelated(relationName,
>> constraintMap,
>>>>>> orderByNames));
>>>>>> +         
>>    
>>>>    }
>>>>>> +           
>> }
>>>> catch
>>>>>> (GenericEntityException e) {
>>>>>> +       
>>    
>>>>     
>>>>>> String errMsg = "Problem getting related
>> from
>>>> entity with
>>>>>> name " + value.getEntityName() + " for
>> the
>>>> relation-name: "
>>>>>> + relationName + ": " + e.getMessage();
>>>>>> +       
>>    
>>>>     
>>>>>> Debug.logError(e, errMsg, module);
>>>>>> +       
>>    
>>>>     
>>>>>> throw new
>> IllegalArgumentException(errMsg);
>>>>>> +           
>> }
>>>>>> +        }
>>>>>> +
>>>>>> +        public
>> String
>>>>>> getRelationName() {
>>>>>> +           
>> return
>>>>>> this.relationName;
>>>>>> +        }
>>>>>> +    }
>>>>>> +}
>>>>>> 
>>>>>> Propchange:
>>>>>> 
>>>> 
>> ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>>>> 
>>>> 
>> ------------------------------------------------------------------------------
>>>>>>       svn:eol-style =
>> native
>>>>>> 
>>>>>> Propchange:
>>>>>> 
>>>> 
>> ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>>>> 
>>>> 
>> ------------------------------------------------------------------------------
>>>>>>       svn:keywords = "Date
>> Rev
>>>> Author URL Id"
>>>>>> 
>>>>>> Propchange:
>>>>>> 
>>>> 
>> ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>>>> 
>>>> 
>> ------------------------------------------------------------------------------
>>>>>>       svn:mime-type =
>>>> text/plain
>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> 
>> 
>> 
> 
> 
> 

Reply via email to