/**
* Alipay.com Inc.
* Copyright (c) 2004-2012 All Rights Reserved.
*/
package com.alipay.zdal.rule.ruleengine.rule;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import com.alipay.zdal.rule.bean.AdvancedParameter;
import com.alipay.zdal.rule.groovy.GroovyListRuleEngine;
import com.alipay.zdal.rule.ruleengine.cartesianproductcalculator.SamplingField;
/**
* ���������ڶԶ�mapping�ij���
* ���Ƚ���ö�٣�Ȼ��ѿ��������õ������
* ��Ҫ��ӳ��Ķ����Ժ���get��������ӳ�䡣
* Ȼ��ӳ��Ľ������targetRule��������
*
*
*/
public abstract class AbstractMappingRule extends CartesianProductBasedListResultRule {
// protected CartesianProductBasedListResultRule targetRule;
private static final Logger logger = Logger.getLogger(AbstractMappingRule.class);
/**
* ת���Ժ��Ŀ�����
*/
protected GroovyListRuleEngine targetRule = new GroovyListRuleEngine();
/**
* ת�����Ŀ������
*/
private String targetKey = null;
/**
* ������ͨ��ӳ������������ؽ����ӳ����������testCase,��Ӧ�ڷֿ�ʱȡ�����������
* @see com.alipay.zdal.rule.ruleengine.rule.CartesianProductBasedListResultRule#evalueateSamplingField(com.alipay.zdal.rule.ruleengine.cartesianproductcalculator.SamplingField)
*/
@Override
public ResultAndMappingKey evalueateSamplingField(SamplingField samplingField) {
List<String> columns = samplingField.getColumns();
List<Object> enumFields = samplingField.getEnumFields();
if (columns != null && columns.size() == 1) {
//ӳ���Ժ������
Object target = null;
if (samplingField.getMappingValue() != null
&& samplingField.getMappingTargetKey().equals(targetKey)) {
//��ȡ��ӳ��ֵ��Ϊ�գ�����targetKey = targetKey.���ʾ�����Ѿ����ֿ�ȡ�����������ÿ��Ա��ֱ���ʹ�á�
target = samplingField.getMappingValue();
} else {
target = get(targetKey, columns.get(0), enumFields.get(0));
}
if (target == null) {
if (logger.isDebugEnabled()) {
logger.debug("target value is null");
}
return null;
}
Map<String/*target column*/, Object/*target value*/> argumentMap = new HashMap<String, Object>(
1);
argumentMap.put(targetKey, target);
if (logger.isDebugEnabled()) {
logger.debug("invoke target rule ,value is " + target);
}
//���������ֵ �����в�ѯ
String resultString = targetRule.imvokeMethod(new Object[] { argumentMap });
ResultAndMappingKey result = null;
if (resultString != null) {
//���ع����������Ӧ��mapping key
result = new ResultAndMappingKey(resultString);
result.mappingKey = target;
result.mappingTargetColumn = targetKey;
} else {
//���Ϊ�����׳��쳣�����ӳ��û��ȡ��targetValue��������������顣
throw new IllegalArgumentException("��������Ľ������Ϊnull");
}
return result;
} else {
throw new IllegalStateException("��������Ҫ��:columns:" + columns);
}
}
@Override
protected boolean ruleRequireThrowRuntimeExceptionWhenSetIsEmpty() {
//��mapping rule�У���Ҫ��Ϊ�մ���ʱ���׳��쳣
return true;
}
/**
* ����sourceKey��sourceValue��ȡ ����targerRule��IJ�����targetValue
*
* @param sourceKey
* @param sourceValue
* @return
*/
protected abstract Object get(String targetKey, String sourceKey, Object sourceValue);
public CartesianProductBasedListResultRule getTargetRule() {
return targetRule;
}
protected void initInternal() {
if (targetRule == null) {
throw new IllegalArgumentException("target rule is null");
}
// ����Ŀ�����
targetRule.initRule();
// �ӽ������Ŀ��������õ���ǰ����
Set<AdvancedParameter> advancedParameters = targetRule.getParameters();
if (advancedParameters.size() != 1) {
throw new IllegalArgumentException("Ŀ�����IJ�������Ϊ1��������ʹ��" + "ӳ�����");
}
// ȷ�ϲ���Ψһ�Ժ�ȡ���ò���
AdvancedParameter advancedParameter = advancedParameters.iterator().next();
targetKey = advancedParameter.key;
if (targetKey == null || targetKey.length() == 0) {
throw new IllegalArgumentException("target key is null .");
}
StringBuilder sb = new StringBuilder();
sb.append("parse mapping rule , target rule is ").append(targetRule).append(
"target target key is ").append(targetKey);
if (logger.isDebugEnabled()) {
logger.debug(sb.toString());
}
}
@Override
/**
* ������ ��ӳ���Ӧ���ߵĹ�����ɶ
*/
public void setExpression(String expression) {
targetRule.setExpression(expression);
}
}