blob: e134a60860a2375292f4e856839b496f3c48de1d [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.eca;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.ObjectType;
import org.apache.ofbiz.base.util.UtilGenerics;
import org.apache.ofbiz.base.util.UtilMisc;
import org.apache.ofbiz.base.util.UtilValidate;
import org.apache.ofbiz.service.DispatchContext;
import org.apache.ofbiz.service.GenericServiceException;
import org.apache.ofbiz.service.LocalDispatcher;
import org.apache.ofbiz.service.ServiceUtil;
import org.w3c.dom.Element;
/**
* ServiceEcaCondition
*/
@SuppressWarnings("serial")
public class ServiceEcaCondition implements java.io.Serializable {
public static final String module = ServiceEcaCondition.class.getName();
protected String conditionService = null;
protected String lhsValueName = null;
protected String rhsValueName = null;
protected String lhsMapName = null;
protected String rhsMapName = null;
protected String operator = null;
protected String compareType = null;
protected String format = null;
protected boolean isConstant = false;
protected boolean isService = false;
protected ServiceEcaCondition() {}
public ServiceEcaCondition(Element condition, boolean isConstant, boolean isService) {
if (isService) {
this.isService = isService;
this.conditionService = condition.getAttribute("service-name");
} else {
this.lhsValueName = condition.getAttribute("field-name");
this.lhsMapName = condition.getAttribute("map-name");
this.isConstant = isConstant;
if (isConstant) {
this.rhsValueName = condition.getAttribute("value");
this.rhsMapName = null;
} else {
this.rhsValueName = condition.getAttribute("to-field-name");
this.rhsMapName = condition.getAttribute("to-map-name");
}
this.operator = condition.getAttribute("operator");
this.compareType = condition.getAttribute("type");
this.format = condition.getAttribute("format");
if (lhsValueName == null) {
lhsValueName = "";
}
if (rhsValueName == null) {
rhsValueName = "";
}
}
}
public String getShortDisplayDescription(boolean moreDetail) {
StringBuilder buf = new StringBuilder();
if (isService) {
buf.append("[").append(conditionService).append("]");
} else {
buf.append("[");
if (UtilValidate.isNotEmpty(lhsMapName)) buf.append(lhsMapName).append(".");
buf.append(lhsValueName);
buf.append(":").append(operator).append(":");
if (UtilValidate.isNotEmpty(rhsMapName)) buf.append(rhsMapName).append(".");
buf.append(rhsValueName);
if (moreDetail) {
if (UtilValidate.isNotEmpty(compareType)) {
buf.append("-");
buf.append(compareType);
}
if (UtilValidate.isNotEmpty(format)) {
buf.append(";");
buf.append(format);
}
}
buf.append("]");
}
return buf.toString();
}
public boolean eval(String serviceName, DispatchContext dctx, Map<String, Object> context) throws GenericServiceException {
if (serviceName == null || dctx == null || context == null || dctx.getClassLoader() == null) {
throw new GenericServiceException("Cannot have null Service, Context or DispatchContext!");
}
if (Debug.verboseOn()) Debug.logVerbose(this.toString() + ", In the context: " + context, module);
// condition-service; run the service and return the reply result
if (isService) {
LocalDispatcher dispatcher = dctx.getDispatcher();
Map<String, Object> conditionServiceResult = dispatcher.runSync(conditionService,
UtilMisc.<String, Object>toMap("serviceContext", context, "serviceName", serviceName,
"userLogin", context.get("userLogin")));
Boolean conditionReply = Boolean.FALSE;
if (ServiceUtil.isError(conditionServiceResult)) {
Debug.logError("Error in condition-service : " +
ServiceUtil.getErrorMessage(conditionServiceResult), module);
} else {
conditionReply = (Boolean) conditionServiceResult.get("conditionReply");
}
return conditionReply.booleanValue();
}
Object lhsValue = null;
Object rhsValue = null;
if (UtilValidate.isNotEmpty(lhsMapName)) {
try {
if (context.containsKey(lhsMapName)) {
Map<String, ? extends Object> envMap = UtilGenerics.checkMap(context.get(lhsMapName));
lhsValue = envMap.get(lhsValueName);
} else {
Debug.logInfo("From Map (" + lhsMapName + ") not found in context, defaulting to null.", module);
}
} catch (ClassCastException e) {
throw new GenericServiceException("From Map field [" + lhsMapName + "] is not a Map.", e);
}
} else {
if (context.containsKey(lhsValueName)) {
lhsValue = context.get(lhsValueName);
} else {
Debug.logInfo("From Field (" + lhsValueName + ") is not found in context for " + serviceName + ", defaulting to null.", module);
}
}
if (isConstant) {
rhsValue = rhsValueName;
} else if (UtilValidate.isNotEmpty(rhsMapName)) {
try {
if (context.containsKey(rhsMapName)) {
Map<String, ? extends Object> envMap = UtilGenerics.checkMap(context.get(rhsMapName));
rhsValue = envMap.get(rhsValueName);
} else {
Debug.logInfo("To Map (" + rhsMapName + ") not found in context for " + serviceName + ", defaulting to null.", module);
}
} catch (ClassCastException e) {
throw new GenericServiceException("To Map field [" + rhsMapName + "] is not a Map.", e);
}
} else {
if (context.containsKey(rhsValueName)) {
rhsValue = context.get(rhsValueName);
} else {
Debug.logInfo("To Field (" + rhsValueName + ") is not found in context for " + serviceName + ", defaulting to null.", module);
}
}
if (Debug.verboseOn()) Debug.logVerbose("Comparing : " + lhsValue + " " + operator + " " + rhsValue, module);
// evaluate the condition & invoke the action(s)
List<Object> messages = new LinkedList<Object>();
Boolean cond = ObjectType.doRealCompare(lhsValue, rhsValue, operator, compareType, format, messages, null, dctx.getClassLoader(), isConstant);
// if any messages were returned send them out
if (messages.size() > 0 && Debug.warningOn()) {
for (Object message: messages) {
Debug.logWarning(message.toString(), module);
}
}
if (cond != null) {
return cond.booleanValue();
} else {
Debug.logWarning("doRealCompare returned null, returning false", module);
return false;
}
}
@Override
public String toString() {
StringBuilder buf = new StringBuilder();
if (UtilValidate.isNotEmpty(conditionService)) buf.append("[").append(conditionService).append("]");
if (UtilValidate.isNotEmpty(lhsMapName)) buf.append("[").append(lhsMapName).append("]");
if (UtilValidate.isNotEmpty(lhsValueName)) buf.append("[").append(lhsValueName).append("]");
if (UtilValidate.isNotEmpty(operator)) buf.append("[").append(operator).append("]");
if (UtilValidate.isNotEmpty(rhsMapName)) buf.append("[").append(rhsMapName).append("]");
if (UtilValidate.isNotEmpty(rhsValueName)) buf.append("[").append(rhsValueName).append("]");
if (UtilValidate.isNotEmpty(isConstant)) buf.append("[").append(isConstant).append("]");
if (UtilValidate.isNotEmpty(compareType)) buf.append("[").append(compareType).append("]");
if (UtilValidate.isNotEmpty(format)) buf.append("[").append(format).append("]");
return buf.toString();
}
@Override
public boolean equals(Object obj) {
if (obj instanceof ServiceEcaCondition) {
ServiceEcaCondition other = (ServiceEcaCondition) obj;
if (!UtilValidate.areEqual(this.conditionService, other.conditionService)) return false;
if (!UtilValidate.areEqual(this.lhsValueName, other.lhsValueName)) return false;
if (!UtilValidate.areEqual(this.rhsValueName, other.rhsValueName)) return false;
if (!UtilValidate.areEqual(this.lhsMapName, other.lhsMapName)) return false;
if (!UtilValidate.areEqual(this.rhsMapName, other.rhsMapName)) return false;
if (!UtilValidate.areEqual(this.operator, other.operator)) return false;
if (!UtilValidate.areEqual(this.compareType, other.compareType)) return false;
if (!UtilValidate.areEqual(this.format, other.format)) return false;
if (this.isConstant != other.isConstant) return false;
if (this.isService != other.isService) return false;
return true;
} else {
return false;
}
}
}