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 <scott.g...@hotwaxmedia.com> wrote:
> 
>> From: Scott Gray <scott.g...@hotwaxmedia.com>
>> Subject: Re: svn commit: r959875 - 
>> /ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>> To: dev@ofbiz.apache.org
>> 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, lekt...@apache.org
>> <lekt...@apache.org>
>> wrote:
>>> 
>>>> From: lekt...@apache.org
>> <lekt...@apache.org>
>>>> Subject: svn commit: r959875 -
>> /ofbiz/trunk/framework/widget/src/org/ofbiz/widget/ModelWidgetAction.java
>>>> To: comm...@ofbiz.apache.org
>>>> 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