I'm sure I'll get regret my decision shortly, but in the meantime I'll feel 
good about doing the right thing.

Regards
Scott

On 2/07/2010, at 7:18 PM, 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
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> 
>> 
>> 
> 
> 
> 

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to