Author: adrianc
Date: Sun Jan 4 00:02:04 2015 New Revision: 1649272 URL: http://svn.apache.org/r1649272 Log: Final pass at making tree widget thread-safe. Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java Modified: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java?rev=1649272&r1=1649271&r2=1649272&view=diff ============================================================================== --- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java (original) +++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/tree/ModelTreeAction.java Sun Jan 4 00:02:04 2015 @@ -48,60 +48,194 @@ import org.ofbiz.widget.ModelActionVisit import org.ofbiz.widget.ModelWidget; import org.ofbiz.widget.ModelWidgetAction; import org.ofbiz.widget.WidgetWorker; +import org.ofbiz.widget.tree.ModelTree.ModelNode; import org.w3c.dom.Document; import org.w3c.dom.Element; - /** - * Widget Library - Tree model class + * Abstract tree action. */ @SuppressWarnings("serial") public abstract class ModelTreeAction extends ModelWidgetAction { public static final String module = ModelTreeAction.class.getName(); - protected ModelTree modelTree; - protected ModelTree.ModelNode.ModelSubNode modelSubNode; + public static List<ModelWidgetAction> readNodeActions(ModelWidget modelNode, Element actionsElement) { + List<? extends Element> actionElementList = UtilXml.childElementList(actionsElement); + List<ModelWidgetAction> actions = new ArrayList<ModelWidgetAction>(actionElementList.size()); + for (Element actionElement : actionElementList) { + // TODO: Check for tree-specific actions + actions.add(ModelWidgetAction.newInstance(modelNode, actionElement)); + } + return actions; + } + + private final ModelNode.ModelSubNode modelSubNode; + private final ModelTree modelTree; - public ModelTreeAction(ModelTree.ModelNode modelNode, Element actionElement) { - if (Debug.verboseOn()) Debug.logVerbose("Reading Tree action with name: " + actionElement.getNodeName(), module); + protected ModelTreeAction(ModelNode modelNode, Element actionElement) { + if (Debug.verboseOn()) + Debug.logVerbose("Reading Tree action with name: " + actionElement.getNodeName(), module); this.modelTree = modelNode.getModelTree(); + this.modelSubNode = null; } - public ModelTreeAction(ModelTree.ModelNode.ModelSubNode modelSubNode, Element actionElement) { - if (Debug.verboseOn()) Debug.logVerbose("Reading Tree action with name: " + actionElement.getNodeName(), module); + protected ModelTreeAction(ModelNode.ModelSubNode modelSubNode, Element actionElement) { + if (Debug.verboseOn()) + Debug.logVerbose("Reading Tree action with name: " + actionElement.getNodeName(), module); this.modelSubNode = modelSubNode; this.modelTree = modelSubNode.getNode().getModelTree(); } - public static List<ModelWidgetAction> readNodeActions(ModelWidget modelNode, Element actionsElement) { - List<? extends Element> actionElementList = UtilXml.childElementList(actionsElement); - List<ModelWidgetAction> actions = new ArrayList<ModelWidgetAction>(actionElementList.size()); - for (Element actionElement : actionElementList) { - // TODO: Check for tree-specific actions - actions.add(ModelWidgetAction.newInstance(modelNode, actionElement)); + public ModelNode.ModelSubNode getModelSubNode() { + return modelSubNode; + } + + public ModelTree getModelTree() { + return modelTree; + } + + public static class EntityAnd extends ModelTreeAction { + private final ByAndFinder finder; + private final String listName; + + public EntityAnd(ModelNode.ModelSubNode modelSubNode, Element entityAndElement) { + super(modelSubNode, entityAndElement); + boolean useCache = "true".equalsIgnoreCase(entityAndElement.getAttribute("use-cache")); + Document ownerDoc = entityAndElement.getOwnerDocument(); + if (!useCache) + UtilXml.addChildElement(entityAndElement, "use-iterator", ownerDoc); + String listName = UtilFormatOut.checkEmpty(entityAndElement.getAttribute("list"), + entityAndElement.getAttribute("list-name")); + if (UtilValidate.isEmpty(listName)) + listName = "_LIST_ITERATOR_"; + this.listName = listName; + entityAndElement.setAttribute("list-name", this.listName); + finder = new ByAndFinder(entityAndElement); + } + + @Override + public void accept(ModelActionVisitor visitor) { + visitor.visit(this); + } + + public ByAndFinder getFinder() { + return finder; + } + + public String getListName() { + return listName; + } + + @Override + public void runAction(Map<String, Object> context) { + try { + context.put(this.listName, null); + finder.runFind(context, WidgetWorker.getDelegator(context)); + Object obj = context.get(this.listName); + if (obj != null && (obj instanceof EntityListIterator || obj instanceof ListIterator<?>)) { + ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(obj); + this.getModelSubNode().setListIterator(listIt, context); + } else { + if (obj instanceof List<?>) { + List<? extends Map<String, ? extends Object>> list = UtilGenerics.checkList(obj); + this.getModelSubNode().setListIterator(list.listIterator(), context); + } + } + } catch (GeneralException e) { + String errMsg = "Error doing entity query by condition: " + e.toString(); + Debug.logError(e, errMsg, module); + throw new IllegalArgumentException(errMsg); + } + } + } + + public static class EntityCondition extends ModelTreeAction { + private final ByConditionFinder finder; + private final String listName; + + public EntityCondition(ModelNode.ModelSubNode modelSubNode, Element entityConditionElement) { + super(modelSubNode, entityConditionElement); + Document ownerDoc = entityConditionElement.getOwnerDocument(); + boolean useCache = "true".equalsIgnoreCase(entityConditionElement.getAttribute("use-cache")); + if (!useCache) + UtilXml.addChildElement(entityConditionElement, "use-iterator", ownerDoc); + String listName = UtilFormatOut.checkEmpty(entityConditionElement.getAttribute("list"), + entityConditionElement.getAttribute("list-name")); + if (UtilValidate.isEmpty(listName)) + listName = "_LIST_ITERATOR_"; + this.listName = listName; + entityConditionElement.setAttribute("list-name", this.listName); + finder = new ByConditionFinder(entityConditionElement); + } + + @Override + public void accept(ModelActionVisitor visitor) { + visitor.visit(this); + } + + public ByConditionFinder getFinder() { + return finder; + } + + public String getListName() { + return listName; + } + + @Override + public void runAction(Map<String, Object> context) { + try { + context.put(this.listName, null); + finder.runFind(context, WidgetWorker.getDelegator(context)); + Object obj = context.get(this.listName); + if (obj != null && (obj instanceof EntityListIterator || obj instanceof ListIterator<?>)) { + ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(obj); + this.getModelSubNode().setListIterator(listIt, context); + } else { + if (obj instanceof List<?>) { + List<? extends Map<String, ? extends Object>> list = UtilGenerics.cast(obj); + this.getModelSubNode().setListIterator(list.listIterator(), context); + } + } + } catch (GeneralException e) { + String errMsg = "Error doing entity query by condition: " + e.toString(); + Debug.logError(e, errMsg, module); + throw new IllegalArgumentException(errMsg); + } } - return actions; } public static class Script extends ModelTreeAction { - protected String location; - protected String method; + private final String location; + private final String method; - public Script(ModelTree.ModelNode modelNode, Element scriptElement) { - super (modelNode, scriptElement); + public Script(ModelNode modelNode, Element scriptElement) { + super(modelNode, scriptElement); String scriptLocation = scriptElement.getAttribute("location"); this.location = WidgetWorker.getScriptLocation(scriptLocation); this.method = WidgetWorker.getScriptMethodName(scriptLocation); } - public Script(ModelTree.ModelNode.ModelSubNode modelSubNode, Element scriptElement) { - super (modelSubNode, scriptElement); + public Script(ModelNode.ModelSubNode modelSubNode, Element scriptElement) { + super(modelSubNode, scriptElement); String scriptLocation = scriptElement.getAttribute("location"); this.location = WidgetWorker.getScriptLocation(scriptLocation); this.method = WidgetWorker.getScriptMethodName(scriptLocation); } @Override + public void accept(ModelActionVisitor visitor) { + visitor.visit(this); + } + + public String getLocation() { + return location; + } + + public String getMethod() { + return method; + } + + @Override public void runAction(Map<String, Object> context) { context.put("_LIST_ITERATOR_", null); if (location.endsWith(".xml")) { @@ -119,87 +253,107 @@ public abstract class ModelTreeAction ex ScriptUtil.executeScript(this.location, this.method, context); } Object obj = context.get("_LIST_ITERATOR_"); - if (this.modelSubNode != null) { + if (this.getModelSubNode() != null) { if (obj != null && (obj instanceof EntityListIterator || obj instanceof ListIterator<?>)) { ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(obj); - this.modelSubNode.setListIterator(listIt, context); + this.getModelSubNode().setListIterator(listIt, context); } else { if (obj instanceof List<?>) { List<? extends Map<String, ? extends Object>> list = UtilGenerics.checkList(obj); - this.modelSubNode.setListIterator(list.listIterator(), context); + this.getModelSubNode().setListIterator(list.listIterator(), context); } } } } - - @Override - public void accept(ModelActionVisitor visitor) { - visitor.visit(this); - } } public static class Service extends ModelTreeAction { - protected FlexibleStringExpander serviceNameExdr; - protected FlexibleMapAccessor<Map<String, Object>> resultMapNameAcsr; - protected FlexibleStringExpander autoFieldMapExdr; - protected FlexibleStringExpander resultMapListNameExdr; - protected FlexibleStringExpander resultMapValueNameExdr; - protected FlexibleStringExpander valueNameExdr; - protected Map<FlexibleMapAccessor<Object>, Object> fieldMap; - - public Service(ModelTree.ModelNode modelNode, Element serviceElement) { - super (modelNode, serviceElement); - initService(serviceElement); - } + private final FlexibleStringExpander autoFieldMapExdr; + private final Map<FlexibleMapAccessor<Object>, Object> fieldMap; + private final FlexibleStringExpander resultMapListNameExdr; + private final FlexibleMapAccessor<Map<String, Object>> resultMapNameAcsr; + private final FlexibleStringExpander resultMapValueNameExdr; + private final FlexibleStringExpander serviceNameExdr; + private final FlexibleStringExpander valueNameExdr; - public Service(ModelTree.ModelNode.ModelSubNode modelSubNode, Element serviceElement) { - super (modelSubNode, serviceElement); - initService(serviceElement); + public Service(ModelNode modelNode, Element serviceElement) { + super(modelNode, serviceElement); + this.serviceNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("service-name")); + this.resultMapNameAcsr = FlexibleMapAccessor.getInstance(serviceElement.getAttribute("result-map")); + this.autoFieldMapExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("auto-field-map")); + this.resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list")); + this.resultMapValueNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-value")); + this.valueNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("value")); + this.fieldMap = EntityFinderUtil.makeFieldMap(serviceElement); } - public void initService(Element serviceElement) { - + public Service(ModelNode.ModelSubNode modelSubNode, Element serviceElement) { + super(modelSubNode, 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.resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list")); - if (this.resultMapListNameExdr.isEmpty()) this.resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list-name")); - if (this.resultMapListNameExdr.isEmpty()) this.resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list-iterator-name")); this.resultMapValueNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-value")); - if (this.resultMapValueNameExdr.isEmpty()) this.resultMapValueNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-value-name")); this.valueNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("value")); - if (this.valueNameExdr.isEmpty()) this.valueNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("value-name")); this.fieldMap = EntityFinderUtil.makeFieldMap(serviceElement); } @Override + public void accept(ModelActionVisitor visitor) { + visitor.visit(this); + } + + public FlexibleStringExpander getAutoFieldMapExdr() { + return autoFieldMapExdr; + } + + public Map<FlexibleMapAccessor<Object>, Object> getFieldMap() { + return fieldMap; + } + + public FlexibleStringExpander getResultMapListNameExdr() { + return resultMapListNameExdr; + } + + public FlexibleMapAccessor<Map<String, Object>> getResultMapNameAcsr() { + return resultMapNameAcsr; + } + + public FlexibleStringExpander getResultMapValueNameExdr() { + return resultMapValueNameExdr; + } + + public FlexibleStringExpander getServiceNameExdr() { + return serviceNameExdr; + } + + public FlexibleStringExpander getValueNameExdr() { + return valueNameExdr; + } + + @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); boolean autoFieldMapBool = !"false".equals(autoFieldMapString); - try { Map<String, Object> serviceContext = null; if (autoFieldMapBool) { - serviceContext = WidgetWorker.getDispatcher(context).getDispatchContext().makeValidContext(serviceNameExpanded, ModelService.IN_PARAM, context); + serviceContext = WidgetWorker.getDispatcher(context).getDispatchContext() + .makeValidContext(serviceNameExpanded, ModelService.IN_PARAM, context); } else { serviceContext = new HashMap<String, Object>(); } - 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"); + String queryString = (String) result.get("queryString"); context.put("queryString", queryString); context.put("queryStringMap", result.get("queryStringMap")); if (UtilValidate.isNotEmpty(queryString)) { @@ -217,17 +371,16 @@ public abstract class ModelTreeAction ex //String resultMapListIteratorName = resultMapListIteratorNameExdr.expandString(context); String resultMapValueName = resultMapValueNameExdr.expandString(context); String valueName = valueNameExdr.expandString(context); - - if (this.modelSubNode != null) { + if (this.getModelSubNode() != null) { //ListIterator iter = null; if (UtilValidate.isNotEmpty(resultMapListName)) { List<? extends Map<String, ? extends Object>> lst = UtilGenerics.checkList(result.get(resultMapListName)); if (lst != null) { if (lst instanceof ListIterator<?>) { ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(lst); - this.modelSubNode.setListIterator(listIt, context); + this.getModelSubNode().setListIterator(listIt, context); } else { - this.modelSubNode.setListIterator(lst.listIterator(), context); + this.getModelSubNode().setListIterator(lst.listIterator(), context); } } } @@ -247,100 +400,5 @@ public abstract class ModelTreeAction ex throw new IllegalArgumentException(errMsg); } } - - @Override - public void accept(ModelActionVisitor visitor) { - visitor.visit(this); - } - } - - public static class EntityAnd extends ModelTreeAction { - protected ByAndFinder finder; - String listName; - - public EntityAnd(ModelTree.ModelNode.ModelSubNode modelSubNode, Element entityAndElement) { - super (modelSubNode, entityAndElement); - boolean useCache = "true".equalsIgnoreCase(entityAndElement.getAttribute("use-cache")); - Document ownerDoc = entityAndElement.getOwnerDocument(); - if (!useCache) UtilXml.addChildElement(entityAndElement, "use-iterator", ownerDoc); - - this.listName = UtilFormatOut.checkEmpty(entityAndElement.getAttribute("list"), entityAndElement.getAttribute("list-name")); - if (UtilValidate.isEmpty(this.listName)) this.listName = "_LIST_ITERATOR_"; - entityAndElement.setAttribute("list-name", this.listName); - - finder = new ByAndFinder(entityAndElement); - } - - @Override - public void runAction(Map<String, Object> context) { - try { - context.put(this.listName, null); - finder.runFind(context, WidgetWorker.getDelegator(context)); - Object obj = context.get(this.listName); - if (obj != null && (obj instanceof EntityListIterator || obj instanceof ListIterator<?>)) { - ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(obj); - this.modelSubNode.setListIterator(listIt, context); - } else { - if (obj instanceof List<?>) { - List<? extends Map<String, ? extends Object>> list = UtilGenerics.checkList(obj); - this.modelSubNode.setListIterator(list.listIterator(), context); - } - } - } catch (GeneralException e) { - String errMsg = "Error doing entity query by condition: " + e.toString(); - Debug.logError(e, errMsg, module); - throw new IllegalArgumentException(errMsg); - } - } - - @Override - public void accept(ModelActionVisitor visitor) { - visitor.visit(this); - } - } - - public static class EntityCondition extends ModelTreeAction { - ByConditionFinder finder; - String listName; - - public EntityCondition(ModelTree.ModelNode.ModelSubNode modelSubNode, Element entityConditionElement) { - super (modelSubNode, entityConditionElement); - Document ownerDoc = entityConditionElement.getOwnerDocument(); - boolean useCache = "true".equalsIgnoreCase(entityConditionElement.getAttribute("use-cache")); - if (!useCache) UtilXml.addChildElement(entityConditionElement, "use-iterator", ownerDoc); - - this.listName = UtilFormatOut.checkEmpty(entityConditionElement.getAttribute("list"), entityConditionElement.getAttribute("list-name")); - if (UtilValidate.isEmpty(this.listName)) this.listName = "_LIST_ITERATOR_"; - entityConditionElement.setAttribute("list-name", this.listName); - - finder = new ByConditionFinder(entityConditionElement); - } - - @Override - public void runAction(Map<String, Object> context) { - try { - context.put(this.listName, null); - finder.runFind(context, WidgetWorker.getDelegator(context)); - Object obj = context.get(this.listName); - if (obj != null && (obj instanceof EntityListIterator || obj instanceof ListIterator<?>)) { - ListIterator<? extends Map<String, ? extends Object>> listIt = UtilGenerics.cast(obj); - this.modelSubNode.setListIterator(listIt, context); - } else { - if (obj instanceof List<?>) { - List<? extends Map<String, ? extends Object>> list = UtilGenerics.cast(obj); - this.modelSubNode.setListIterator(list.listIterator(), context); - } - } - } catch (GeneralException e) { - String errMsg = "Error doing entity query by condition: " + e.toString(); - Debug.logError(e, errMsg, module); - throw new IllegalArgumentException(errMsg); - } - } - - @Override - public void accept(ModelActionVisitor visitor) { - visitor.visit(this); - } } } |
Free forum by Nabble | Edit this page |