blob: b7b23e2adbf5b4dc1a330d89f9456463988113bf [file] [log] [blame]
/*******************************************************************************
* 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.apache.ofbiz.service;
import java.io.Serializable;
import java.util.List;
import java.util.Locale;
import javax.wsdl.Definition;
import javax.wsdl.Part;
import javax.wsdl.WSDLException;
import javax.xml.namespace.QName;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.ObjectType;
import org.apache.ofbiz.base.util.UtilProperties;
import org.apache.ofbiz.base.util.UtilValidate;
/**
* Generic Service Model Parameter
*/
@SuppressWarnings("serial")
public class ModelParam implements Serializable {
public static final String module = ModelParam.class.getName();
/** Parameter name */
public String name;
/** The description of this parameter */
public String description;
/** Paramater type */
public String type;
/** Parameter mode (IN/OUT/INOUT) */
public String mode;
/** The form label */
public String formLabel;
/** The entity name */
public String entityName;
/** The entity field name */
public String fieldName;
/** Request attribute to look for if not defined as a parameter */
public String requestAttributeName;
/** Session attribute to look for if not defined as a parameter */
public String sessionAttributeName;
/** Parameter prefix for creating an attribute Map */
public String stringMapPrefix;
/** Parameter suffix for creating an attribute List */
public String stringListSuffix;
/** Validation methods */
public List<ModelParamValidator> validators;
/** Default value */
private String defaultValue = null;
/** Is this Parameter required or optional? Default to false, or required */
public boolean optional = false;
public boolean overrideOptional = false;
/** Is this parameter to be displayed via the form tool? */
public boolean formDisplay = true;
public boolean overrideFormDisplay = false;
/** Default value */
public String allowHtml = null;
/** Is this Parameter set internally? */
public boolean internal = false;
public ModelParam() {}
public ModelParam(ModelParam param) {
this.name = param.name;
this.description = param.description;
this.type = param.type;
this.mode = param.mode;
this.formLabel = param.formLabel;
this.entityName = param.entityName;
this.fieldName = param.fieldName;
this.requestAttributeName = param.requestAttributeName;
this.sessionAttributeName = param.sessionAttributeName;
this.stringMapPrefix = param.stringMapPrefix;
this.stringListSuffix = param.stringListSuffix;
this.validators = param.validators;
if (param.defaultValue != null) this.setDefaultValue(param.defaultValue);
this.optional = param.optional;
this.overrideOptional = param.overrideOptional;
this.formDisplay = param.formDisplay;
this.overrideFormDisplay = param.overrideFormDisplay;
this.allowHtml = param.allowHtml;
this.internal = param.internal;
}
public void addValidator(String className, String methodName, String failMessage) {
validators.add(new ModelParamValidator(className, methodName, failMessage, null, null));
}
public void addValidator(String className, String methodName, String failResource, String failProperty) {
validators.add(new ModelParamValidator(className, methodName, null, failResource, failProperty));
}
public String getPrimaryFailMessage(Locale locale) {
if (UtilValidate.isNotEmpty(validators)) {
return validators.get(0).getFailMessage(locale);
} else {
return null;
}
}
public String getShortDisplayDescription() {
return this.name + "[" + this.type + "-" + this.mode + "]" + (optional ? "" : "*");
}
public String getName() {
return this.name;
}
// Method to retrieve form-label from model parameter object in freemarker
public String getFormLabel() {
return this.formLabel;
}
public String getType() {
return this.type;
}
public String getMode() {
return this.mode;
}
public String getEntityName() {
return this.entityName;
}
public String getFieldName() {
return this.fieldName;
}
public boolean getInternal() {
return this.internal;
}
public boolean isIn() {
return "IN".equals(this.mode) || "INOUT".equals(this.mode);
}
public boolean isOut() {
return "OUT".equals(this.mode) || "INOUT".equals(this.mode);
}
public boolean isOptional() {
return this.optional;
}
public Object getDefaultValue() {
Object defaultValueObj = null;
if (this.type != null) {
try {
defaultValueObj = ObjectType.simpleTypeConvert(this.defaultValue, this.type, null, null, false);
} catch (Exception e) {
Debug.logWarning(e, "Service attribute [" + name + "] default value could not be converted to type [" + type + "]: " + e.toString(), module);
}
if (defaultValueObj == null) {
// uh-oh, conversion failed, set the String and see what happens
defaultValueObj = this.defaultValue;
}
} else {
defaultValueObj = this.defaultValue;
}
return defaultValueObj;
}
public void setDefaultValue(String defaultValue) {
this.defaultValue = defaultValue;
if (this.defaultValue != null) {
this.optional = true;
}
if (Debug.verboseOn()) Debug.logVerbose("Default value for attribute [" + this.name + "] set to [" + this.defaultValue + "]", module);
}
public void copyDefaultValue(ModelParam param) {
this.setDefaultValue(param.defaultValue);
}
public boolean equals(ModelParam model) {
return model.name.equals(this.name);
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
buf.append(name).append("::");
buf.append(type).append("::");
buf.append(mode).append("::");
buf.append(formLabel).append("::");
buf.append(entityName).append("::");
buf.append(fieldName).append("::");
buf.append(stringMapPrefix).append("::");
buf.append(stringListSuffix).append("::");
buf.append(optional).append("::");
buf.append(overrideOptional).append("::");
buf.append(formDisplay).append("::");
buf.append(overrideFormDisplay).append("::");
buf.append(allowHtml).append("::");
buf.append(defaultValue).append("::");
buf.append(internal);
if (validators != null)
buf.append(validators.toString()).append("::");
return buf.toString();
}
public Part getWSDLPart(Definition def) throws WSDLException {
Part part = def.createPart();
part.setName(this.name);
part.setTypeName(new QName(ModelService.TNS, this.java2wsdlType()));
return part;
}
protected String java2wsdlType() throws WSDLException {
if (ObjectType.instanceOf(java.lang.Character.class, this.type)) {
return "std-String";
} else if (ObjectType.instanceOf(java.lang.String.class, this.type)) {
return "std-String";
} else if (ObjectType.instanceOf(java.lang.Byte.class, this.type)) {
return "std-String";
} else if (ObjectType.instanceOf(java.lang.Boolean.class, this.type)) {
return "std-Boolean";
} else if (ObjectType.instanceOf(java.lang.Integer.class, this.type)) {
return "std-Integer";
} else if (ObjectType.instanceOf(java.lang.Double.class, this.type)) {
return "std-Double";
} else if (ObjectType.instanceOf(java.lang.Float.class, this.type)) {
return "std-Float";
} else if (ObjectType.instanceOf(java.lang.Short.class, this.type)) {
return "std-Integer";
} else if (ObjectType.instanceOf(java.math.BigDecimal.class, this.type)) {
return "std-Long";
} else if (ObjectType.instanceOf(java.math.BigInteger.class, this.type)) {
return "std-Integer";
} else if (ObjectType.instanceOf(java.util.Calendar.class, this.type)) {
return "sql-Timestamp";
} else if (ObjectType.instanceOf(com.ibm.icu.util.Calendar.class, this.type)) {
return "sql-Timestamp";
} else if (ObjectType.instanceOf(java.sql.Date.class, this.type)) {
return "sql-Date";
} else if (ObjectType.instanceOf(java.util.Date.class, this.type)) {
return "sql-Timestamp";
} else if (ObjectType.instanceOf(java.lang.Long.class, this.type)) {
return "std-Long";
} else if (ObjectType.instanceOf(java.sql.Timestamp.class, this.type)) {
return "sql-Timestamp";
} else if (ObjectType.instanceOf(org.apache.ofbiz.entity.GenericValue.class, this.type)) {
return "eeval-";
} else if (ObjectType.instanceOf(org.apache.ofbiz.entity.GenericPK.class, this.type)) {
return "eepk-";
} else if (ObjectType.instanceOf(java.util.Map.class, this.type)) {
return "map-Map";
} else if (ObjectType.instanceOf(java.util.List.class, this.type)) {
return "col-LinkedList";
} else {
return "cus-obj";
}
//throw new WSDLException(WSDLException.OTHER_ERROR, "Service cannot be described with WSDL (" + this.name + " / " + this.type + ")");
}
static class ModelParamValidator implements Serializable {
protected String className;
protected String methodName;
protected String failMessage;
protected String failResource;
protected String failProperty;
public ModelParamValidator(String className, String methodName, String failMessage, String failResource, String failProperty) {
this.className = className;
this.methodName = methodName;
this.failMessage = failMessage;
this.failResource = failResource;
this.failProperty = failProperty;
}
public String getClassName() {
return className;
}
public String getMethodName() {
return methodName;
}
public String getFailMessage(Locale locale) {
if (failMessage != null) {
return this.failMessage;
} else {
if (failResource != null && failProperty != null) {
return UtilProperties.getMessage(failResource, failProperty, locale);
}
}
return null;
}
@Override
public String toString() {
return className + "::" + methodName + "::" + failMessage + "::" + failResource + "::" + failProperty;
}
}
}