You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ad...@apache.org on 2015/01/18 22:03:42 UTC
svn commit: r1652852 [6/22] - in /ofbiz/trunk:
applications/content/src/org/ofbiz/content/cms/
applications/content/src/org/ofbiz/content/content/
applications/content/src/org/ofbiz/content/data/
applications/content/src/org/ofbiz/content/output/ appli...
Added: ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormAction.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormAction.java?rev=1652852&view=auto
==============================================================================
--- ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormAction.java (added)
+++ ofbiz/trunk/framework/widget/src/org/ofbiz/widget/model/ModelFormAction.java Sun Jan 18 21:03:40 2015
@@ -0,0 +1,272 @@
+/*******************************************************************************
+ * 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.model;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.ListIterator;
+import java.util.Map;
+import java.util.regex.PatternSyntaxException;
+
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.base.util.UtilGenerics;
+import org.ofbiz.base.util.UtilValidate;
+import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.FlexibleMapAccessor;
+import org.ofbiz.base.util.string.FlexibleStringExpander;
+import org.ofbiz.entity.finder.EntityFinderUtil;
+import org.ofbiz.service.GenericServiceException;
+import org.ofbiz.service.ModelService;
+import org.ofbiz.widget.WidgetWorker;
+import org.w3c.dom.Element;
+
+/**
+ * Abstract form action.
+ */
+public abstract class ModelFormAction {
+
+ public static final String module = ModelFormAction.class.getName();
+
+ public static List<ModelAction> readSubActions(ModelForm modelForm, Element parentElement) {
+ List<? extends Element> actionElementList = UtilXml.childElementList(parentElement);
+ List<ModelAction> actions = new ArrayList<ModelAction>(actionElementList.size());
+ for (Element actionElement : UtilXml.childElementList(parentElement)) {
+ if ("service".equals(actionElement.getNodeName())) {
+ actions.add(new Service(modelForm, actionElement));
+ } else if ("entity-and".equals(actionElement.getNodeName()) || "entity-condition".equals(actionElement.getNodeName())
+ || "get-related".equals(actionElement.getNodeName())) {
+ if (!actionElement.hasAttribute("list")) {
+ String listName = modelForm.getListName();
+ if (UtilValidate.isEmpty(listName)) {
+ listName = ModelForm.DEFAULT_FORM_RESULT_LIST_NAME;
+ }
+ actionElement.setAttribute("list", listName);
+ }
+ actions.add(AbstractModelAction.newInstance(modelForm, actionElement));
+ } else if ("call-parent-actions".equals(actionElement.getNodeName())) {
+ actions.add(new CallParentActions(modelForm, actionElement));
+ } else {
+ actions.add(AbstractModelAction.newInstance(modelForm, actionElement));
+ }
+ }
+ return Collections.unmodifiableList(actions);
+ }
+
+ /**
+ * Models the <call-parent-actions> element.
+ *
+ * @see <code>widget-form.xsd</code>
+ */
+ @SuppressWarnings("serial")
+ public static class CallParentActions extends AbstractModelAction {
+ private final ActionsKind kind;;
+ private final ModelForm modelForm;
+
+ public CallParentActions(ModelForm modelForm, Element callParentActionsElement) {
+ super(modelForm, callParentActionsElement);
+ String parentName = callParentActionsElement.getParentNode().getNodeName();
+ if ("actions".equals(parentName)) {
+ kind = ActionsKind.ACTIONS;
+ } else if ("row-actions".equals(parentName)) {
+ kind = ActionsKind.ROW_ACTIONS;
+ } else {
+ throw new IllegalArgumentException("Action element not supported for call-parent-actions : " + parentName);
+ }
+ ModelForm parentModel = modelForm.getParentModelForm();
+ if (parentModel == null) {
+ throw new IllegalArgumentException("call-parent-actions can only be used with form extending another form");
+ }
+ this.modelForm = modelForm;
+ }
+
+ @Override
+ public void accept(ModelActionVisitor visitor) throws Exception {
+ visitor.visit(this);
+ }
+
+ @Override
+ public void runAction(Map<String, Object> context) {
+ ModelForm parentModel = modelForm.getParentModelForm();
+ switch (kind) {
+ case ACTIONS:
+ parentModel.runFormActions(context);
+ break;
+ case ROW_ACTIONS:
+ AbstractModelAction.runSubActions(parentModel.getRowActions(), context);
+ break;
+ }
+ }
+
+ protected static enum ActionsKind {
+ ACTIONS, ROW_ACTIONS
+ }
+ }
+
+ /**
+ * Models the <service> element.
+ *
+ * @see <code>widget-form.xsd</code>
+ */
+ @SuppressWarnings("serial")
+ public static class Service extends AbstractModelAction {
+ private final FlexibleStringExpander autoFieldMapExdr;
+ private final Map<FlexibleMapAccessor<Object>, Object> fieldMap;
+ private final boolean ignoreError;
+ private final FlexibleStringExpander resultMapListNameExdr;
+ private final FlexibleMapAccessor<Map<String, Object>> resultMapNameAcsr;
+ private final FlexibleStringExpander serviceNameExdr;
+
+ public Service(ModelForm modelForm, Element serviceElement) {
+ super(modelForm, 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"));
+ FlexibleStringExpander resultMapListNameExdr = FlexibleStringExpander.getInstance("");
+ if (UtilValidate.isEmpty(serviceElement.getAttribute("result-map-list"))
+ && UtilValidate.isEmpty(serviceElement.getAttribute("result-map-list-name"))) {
+ if (UtilValidate.isEmpty(serviceElement.getAttribute("result-map-list-iterator"))
+ && UtilValidate.isEmpty(serviceElement.getAttribute("result-map-list-iterator-name"))) {
+ String lstNm = modelForm.getListName();
+ if (UtilValidate.isEmpty(lstNm)) {
+ lstNm = ModelForm.DEFAULT_FORM_RESULT_LIST_NAME;
+ }
+ resultMapListNameExdr = FlexibleStringExpander.getInstance(lstNm);
+ } else {
+ // this is deprecated, but support it for now anyway
+ resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement
+ .getAttribute("result-map-list-iterator"));
+ if (resultMapListNameExdr.isEmpty())
+ resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement
+ .getAttribute("result-map-list-iterator-name"));
+ }
+ } else {
+ resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement.getAttribute("result-map-list"));
+ if (resultMapListNameExdr.isEmpty())
+ resultMapListNameExdr = FlexibleStringExpander.getInstance(serviceElement
+ .getAttribute("result-map-list-name"));
+ }
+ this.resultMapListNameExdr = resultMapListNameExdr;
+ this.fieldMap = EntityFinderUtil.makeFieldMap(serviceElement);
+ this.ignoreError = "true".equals(serviceElement.getAttribute("ignore-error"));
+ }
+
+ @Override
+ public void accept(ModelActionVisitor visitor) throws Exception {
+ visitor.visit(this);
+ }
+
+ public String getServiceName() {
+ return serviceNameExdr.getOriginal();
+ }
+
+ @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) {
+ if (!"true".equals(autoFieldMapString)) {
+ Map<String, Object> autoFieldMap = UtilGenerics.checkMap(context.get(autoFieldMapString));
+ serviceContext = WidgetWorker.getDispatcher(context).getDispatchContext()
+ .makeValidContext(serviceNameExpanded, ModelService.IN_PARAM, autoFieldMap);
+ } else {
+ 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 = null;
+ if (this.ignoreError) {
+ result = WidgetWorker.getDispatcher(context).runSync(serviceNameExpanded, serviceContext, -1, true);
+ } else {
+ 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);
+ }
+ String listName = resultMapListNameExdr.expandString(context);
+ Object listObj = result.get(listName);
+ if (listObj != null) {
+ if (!(listObj instanceof List<?>) && !(listObj instanceof ListIterator<?>)) {
+ throw new IllegalArgumentException("Error in form [" + this.getModelWidget().getName()
+ + "] calling service with name [" + serviceNameExpanded
+ + "]: the result that is supposed to be a List or ListIterator and is not.");
+ }
+ context.put("listName", listName);
+ context.put(listName, listObj);
+ }
+ } catch (GenericServiceException e) {
+ String errMsg = "Error in form [" + this.getModelWidget().getName() + "] calling service with name ["
+ + serviceNameExpanded + "]: " + e.toString();
+ Debug.logError(e, errMsg, module);
+ if (!this.ignoreError) {
+ throw new IllegalArgumentException(errMsg);
+ }
+ }
+ }
+
+ public FlexibleStringExpander getAutoFieldMapExdr() {
+ return autoFieldMapExdr;
+ }
+
+ public Map<FlexibleMapAccessor<Object>, Object> getFieldMap() {
+ return fieldMap;
+ }
+
+ public boolean getIgnoreError() {
+ return ignoreError;
+ }
+
+ public FlexibleStringExpander getResultMapListNameExdr() {
+ return resultMapListNameExdr;
+ }
+
+ public FlexibleMapAccessor<Map<String, Object>> getResultMapNameAcsr() {
+ return resultMapNameAcsr;
+ }
+
+ public FlexibleStringExpander getServiceNameExdr() {
+ return serviceNameExdr;
+ }
+ }
+}