/**
* Alipay.com Inc.
* Copyright (c) 2004-2012 All Rights Reserved.
*/
package com.alipay.zdal.rule.ruleengine.rule;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.log4j.Logger;
import com.alipay.zdal.common.lang.StringUtil;
import com.alipay.zdal.rule.bean.AdvancedParameter;
/**
* ������ܳ��� �����ɲ����ͱ��ʽ���
*
*/
public abstract class AbstractRule {
private static final Logger log = Logger.getLogger(AbstractRule.class);
/**
* ��ǰ������Ҫ�õ��IJ���
*/
protected Set<AdvancedParameter> parameters;
private boolean inited = false;
/**
* ��ǰ������Ҫ�õ��ı��ʽ
*/
protected String expression;
/*
* ͨ���������ṹ�������ܼ�����Ӵ�������set�������У���Ҫע�����
* ����ж��ֵ������һ������ʽ�����ַ����Dz�ȷ�ģ���ʱ�����ͨ�������ļ�
* �ֶ��������������ÿһ����������IJ����ĵ��Ӵ�����
*
* ���ڻ�û���ã���Ϊ�Ƚϸ���
*
* @param cumulativeTimes
public void setCumulativeTimes(int cumulativeTimes){
for(KeyAndAtomIncValue keyAndAtomIncValue :parameters){
if(keyAndAtomIncValue.cumulativeTimes == null){
keyAndAtomIncValue.cumulativeTimes = cumulativeTimes;
}
}
}
*/
protected abstract void initInternal();
/**
* ȷ������ֻ��ʼ��һ��
*/
public void initRule() {
if (inited) {
if (log.isDebugEnabled()) {
log.debug("rule has inited");
}
} else {
initInternal();
inited = true;
}
}
public Set<AdvancedParameter> getParameters() {
return parameters;
}
/**
* springע�����Ĭ�������ֶε�ֵ,�Ὣ����ֵ��ΪСд
*
* @param parameters
*/
public void setParameters(Set<String> parameters) {
if (this.parameters == null) {
this.parameters = new HashSet<AdvancedParameter>();
}
for (String str : parameters) {
AdvancedParameter advancedParameter = getAdvancedParamByParamToken(str);
this.parameters.add(advancedParameter);
}
}
/**
* Springע����
* @param parameters
*/
public void setAdvancedParameter(Set<AdvancedParameter> parameters) {
if (this.parameters == null) {
this.parameters = new HashSet<AdvancedParameter>();
}
for (AdvancedParameter keyAndAtomIncValue : parameters) {
this.parameters.add(keyAndAtomIncValue);
}
}
/**
* springע��һ��
* @param parameter
*/
public void setAdvancedParameter(AdvancedParameter parameter) {
if (this.parameters == null) {
this.parameters = new HashSet<AdvancedParameter>();
}
this.parameters.add(parameter);
}
public String getExpression() {
return expression;
}
/**
* ����
* col,1,7�������ֶ�
* col,1_date,7
* col = ��Ҫ�ֿ�ֱ������
* 1����ʾԭ����������
* 7 ��ʾy�ı仯��Χ
* �����뿴����ĵ�
*
* @param paramToken
* @return
*/
protected AdvancedParameter getAdvancedParamByParamToken(String paramToken) {
AdvancedParameter param = new AdvancedParameter();
String[] paramTokens = paramToken.split(",");
int tokenLength = paramTokens.length;
switch (tokenLength) {
case 1:
param.key = paramTokens[0];
break;
case 3:
param.key = paramTokens[0];
try {
/*
* ����tokens��ȡ��������
* ��Ҫ�����࣬��һ��������_date...
* �ڶ����� ֱ��Ϊ���ֵġ�
*/
Comparable<?> atomicIncreateValue = getIncreatementValueByString(paramTokens);
param.atomicIncreateValue = atomicIncreateValue;
param.cumulativeTimes = Integer.valueOf(paramTokens[2]);
if (param.atomicIncreateValue != null) {
param.needMergeValueInCloseInterval = true;
}
} catch (NumberFormatException e) {
throw new IllegalArgumentException("����IJ�����ΪInteger����,����Ϊ:" + paramToken, e);
}
break;
default:
throw new IllegalArgumentException("����IJ�������������Ϊ1������3����3����ʱ��Ϊ����ʹ��" + "ö��ʱ������");
}
return param;
}
/**
* ���� 1_date������_month������_year ���Լ������ֵļ��������
* �������ǿ�
* @param paramTokens
* @return
*/
private Comparable<?> getIncreatementValueByString(String[] paramTokens) {
Comparable<?> atomicIncreateValue = null;
String atomicIncreateValueField = paramTokens[1];
String[] fields = StringUtil.split(atomicIncreateValueField, "_");
int length = fields.length;
switch (length) {
//����_��������
case 2:
int calendarFieldType = 0;
String fieldString = StringUtil.trim(fields[1]);
if (StringUtil.equalsIgnoreCase("date", fieldString)) {
calendarFieldType = Calendar.DATE;
} else if (StringUtil.equalsIgnoreCase("month", fieldString)) {
calendarFieldType = Calendar.MONTH;
} else if (StringUtil.equalsIgnoreCase("YEAR", fieldString)) {
calendarFieldType = Calendar.YEAR;
}
DateEnumerationParameter dateEP = new DateEnumerationParameter(Integer
.valueOf(fields[0]), calendarFieldType);
atomicIncreateValue = dateEP;
break;
default:
//Ĭ�������ֱ��valueOf,�ߵ�·������ǰһ�������׳�NumberformatExceptionʱ ����쳣��ȥ��
atomicIncreateValue = Integer.valueOf(paramTokens[1]);
break;
}
return atomicIncreateValue;
}
public void setExpression(String expression) {
if (expression != null)
this.expression = expression;
}
/**
* col,1,7|col1,1,7....
* @param parameterArray
*/
public void setParameter(String parameterArray) {
if (parameterArray != null && parameterArray.length() != 0) {
String[] paramArray = parameterArray.split("\\|");
Set<String> paramSet = new HashSet<String>(Arrays.asList(paramArray));
this.setParameters(paramSet);
}
}
public void setContext(Map<String, Object> context) {
}
}