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 >>>> >>>> >>>> >>> >>> >>> >> >> > > >
smime.p7s
Description: S/MIME cryptographic signature
