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 > > >