/**
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.atom.compiler.macro.handlers;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.hundsun.ares.studio.atom.compiler.constant.IAtomEngineContextConstant;
import com.hundsun.ares.studio.atom.compiler.macro.MacroConstant;
import com.hundsun.ares.studio.atom.compiler.skeleton.util.MarkConfig;
import com.hundsun.ares.studio.atom.compiler.skeleton.util.TableResourceUtil;
import com.hundsun.ares.studio.atom.compiler.token.PROCInsertToken;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.engin.constant.IEngineContextConstant;
import com.hundsun.ares.studio.engin.constant.ITokenConstant;
import com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler;
import com.hundsun.ares.studio.engin.parser.PseudoCodeParser;
import com.hundsun.ares.studio.engin.skeleton.ISkeletonAttributeHelper;
import com.hundsun.ares.studio.engin.token.DefaultTokenEvent;
import com.hundsun.ares.studio.engin.token.ICodeToken;
import com.hundsun.ares.studio.engin.token.ITokenListenerManager;
import com.hundsun.ares.studio.engin.token.macro.IMacroToken;
import com.hundsun.ares.studio.jres.model.database.TableColumn;
/**
* @author zhuyf
*
*/
public class PROCInserTableMacroHandler implements IMacroTokenHandler {
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#getKey()
*/
@Override
public String getKey() {
return MacroConstant.PROC_INSERT_TABLE_MACRONAME;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#handle(com.hundsun.ares.studio.engin.token.macro.IMacroToken, java.util.Map)
*/
@Override
public Iterator<ICodeToken> handle(IMacroToken token,
Map<Object, Object> context) throws Exception {
/*
* [PRO*C������¼][table][Ĭ��ֵ]
* 1.���ݱ����õ������е��ֶ������ֶζ�����Proc�����б���
* 2.��ÿ���ֶ�ֵ��������ֵ��ȡֵ�������£�
�����ж���[Ĭ��ֵ]���Ƿ��и��ֶε�Ĭ��ֵ��
������ں��ֶ�ͬ���ı����ñ�����ֵ��Ϊ����ֵ��
�������ȡ����Ĭ��ֵ�����û�оʹ���������������ڲ�������Ѱ�ң�
�����û��������ֶ����ӱ��ֶ��б���ȡ�ĸ��ֶε���ʵĬ��ֵ��Ϊ����ֵ��
3.��Ӵ�������䣬����ú�ĵ�һ�б�־λ������E�������ڳ�������Ҫ�ر��α꣬
����ٺ����ӿڱ�־��ú�ĵ�һ�б�־�а�����M�������ٳ������в�������goto svr_end����䡣
4.֧�ֿ��û���������[PRO*C������¼][his_clientjour][clientjour]
[PRO*C������¼][fil_clientjour][clientjour]
[PRO*C������¼][r_clientjour][clientjour]
[PRO*C������¼][rl_clientjour][clientjour]
*/
List<ICodeToken> codeToken = new ArrayList<ICodeToken>(3);
addMacroNameToMacroList(token,context);//�Ѻ����ӵ������ݿ��б��Լ�proc�б���
if(token.getParameters().length > 0){
IARESProject project = (IARESProject) context.get(IAtomEngineContextConstant.Aresproject);
List<TableColumn> tableColumns = TableResourceUtil.getFieldsWithoutFlag("H",token.getParameters()[0],project);//��ȡ������Ӧ����
Map<String, String> defaultValueMap = new HashMap<String, String>();//Ĭ��ֵ�б�
if(isContainDefauleValue(token)){
defaultValueMap =getDefaultValueList(token);
}
List<String> fieldNames = getFieldNames(tableColumns);//���Ӧ���ֶ�
addPVarList(token,context,defaultValueMap,fieldNames);//�Ѹ��ֶμ��뵽�����б���ȥ
codeToken.add(new PROCInsertToken(token,defaultValueMap,tableColumns));//���proc����������select��䴦��Token
}else{
fireEventLessParameter(context);//����ȱ�ٲ����¼�
}
return codeToken.iterator();
}
/**
* ����ֶ��б�
* @param tableColumns
*/
private List<String> getFieldNames(List<TableColumn> tableColumns){
List<String> fieldNames = new ArrayList<String>(40);
for(TableColumn tableColumn:tableColumns){
fieldNames.add(tableColumn.getFieldName());
}
return fieldNames;
}
/**
* �ж��Ƿ����Ĭ��ֵ
* @param token
* @return
*/
private boolean isContainDefauleValue(IMacroToken token){
return token.getParameters().length==2 && StringUtils.isNotBlank(token.getParameters()[1]);
}
/**
* ���ֶι���ӵ������б���ȥ
*
* @param procVarList
* @param tableColumns
*/
private void addPVarList(IMacroToken token,Map<Object, Object> context,Map<String, String> defaultValueMap,List<String> fieldNames) {
ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstant.SKELETON_ATTRIBUTE_HELPER);
List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST);
for (String fieldName : fieldNames) {
if (!defaultValueMap.containsKey(fieldName)) {//���Ĭ��ֵ�б���û�б��ֶζ�Ӧ��ֵ
helper.addAttribute(IAtomEngineContextConstant.ATTR_PROC_VARIABLE_LIST,fieldName);
popVarList.add(fieldName);
}else if(defaultValueMap.containsKey(fieldName)){//���Ĭ��ֵ�����ֶζ�Ӧ��Ĭ��ֵ
String valueVarName = defaultValueMap.get(fieldName);
if (valueVarName.indexOf(MarkConfig.MARK_AT) >= 0) {// ���Ĭ�ϲ���ֵΪ����
String procVarName = valueVarName.substring(valueVarName.indexOf(MarkConfig.MARK_AT) + 1);
helper.addAttribute(IAtomEngineContextConstant.ATTR_PROC_VARIABLE_LIST,procVarName);
popVarList.add(procVarName);
}
}
}
}
/**
* ����Ĭ��ֵ�б�
* @return
*/
private Map<String, String> getDefaultValueList(IMacroToken token) {
Map<String, String> defaultValueMap = new Hashtable<String, String>();
// ���PROC������¼�����Ĭ��ֵ�б�
if (token.getParameters().length > 1) {
String fieldStr =token.getParameters()[1];
//fieldStr = EngineUtil.replaceConstant(fieldStr, this.getFunction(), true);
defaultValueMap = PseudoCodeParser.parserKeyValueWithAt(fieldStr);
}
return defaultValueMap;
}
/**
* �Ѻ������뵽���б���
*/
private void addMacroNameToMacroList(IMacroToken token,Map<Object, Object> context){
ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstant.SKELETON_ATTRIBUTE_HELPER);
helper.addAttribute(IAtomEngineContextConstant.ATTR_DATABASE_MACRO,token.getKeyword());//��ӵ����ݿ��б���
helper.addAttribute(IAtomEngineContextConstant.ATTR_PROC_MACRO,token.getKeyword());//��ӵ�proc���б���
}
/**
* ����ȱ�ٲ����¼�
*/
private void fireEventLessParameter(Map<Object, Object> context){
ITokenListenerManager manager = (ITokenListenerManager)context.get(IEngineContextConstant.TOKEN_LISTENER_MANAGER);
String message = String.format("��[%s]ȱ�ٲ����������б���������", MacroConstant.PROC_INSERT_TABLE_MACRONAME);
manager.fireEvent(new DefaultTokenEvent(ITokenConstant.EVENT_ENGINE_WARNNING,message));
}
}