/**
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.atom.compiler.mysql.macro.handlers;
import java.util.ArrayList;
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.mysql.constant.IAtomEngineContextConstantMySQL;
import com.hundsun.ares.studio.atom.compiler.mysql.macro.MacroConstant;
import com.hundsun.ares.studio.atom.compiler.mysql.token.NestPackAddFieldToken;
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;
/**
* @author liaogc
*
*/
public class NestPackAddFieldMacroHandler implements IMacroTokenHandler{
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#getKey()
*/
@Override
public String getKey() {
return MacroConstant.NEST_PACK_ADD_FIELD_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 {
ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER);
List<ICodeToken> codeTokens= new ArrayList<ICodeToken>();
if (token.getParameters().length !=2) {
ITokenListenerManager manager =(ITokenListenerManager) context.get(IEngineContextConstant.TOKEN_LISTENER_MANAGER);
String message = String.format("��[%s]ȱ�ٲ�����", MacroConstant.NEST_PACK_ADD_FIELD_MACRONAME);
manager.fireEvent(new DefaultTokenEvent(ITokenConstant.EVENT_ENGINE_WARNNING,message));
}else{
String parentPackName = StringUtils.trim(token.getParameters()[0]);//������
String paramName = "";//������ֶ�(����)
String packName = "";//��ʵ�ı�����ֶ�ֵ
String childrenParam = StringUtils.trim(token.getParameters()[1]);
Map<String,String> aliasParameters = PseudoCodeParser.parserKeyValueWithAt(childrenParam);
if(!aliasParameters.keySet().isEmpty()){
paramName = StringUtils.trim(aliasParameters.keySet().toArray(new String[aliasParameters.keySet().size()])[0]);
packName = StringUtils.trim(aliasParameters.get(aliasParameters.keySet().toArray(new String[aliasParameters.keySet().size()])[0]));
}else{
paramName = childrenParam;
packName = childrenParam;
}
if(StringUtils.indexOf(packName,"@")>-1){//��ȡȡ����Ӧ�IJ�������Ķ�����
packName = StringUtils.substring(packName,StringUtils.indexOf(packName,"@")+1);
if(StringUtils.endsWith(packName,"ResultSet")){
packName = StringUtils.substring(packName,0,StringUtils.indexOf(packName,"ResultSet"));
}
}
if(aliasParameters.keySet().isEmpty()){
paramName = packName;
}
if(StringUtils.indexOf(parentPackName,"@")>-1){
parentPackName = StringUtils.substring(parentPackName,StringUtils.indexOf(parentPackName,"@")+1);
if(!StringUtils.endsWith(parentPackName,"ResultSet")){
parentPackName+="ResultSet";
}
}
codeTokens.add(new NestPackAddFieldToken(parentPackName,paramName,packName));//������Ӧ��token
helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_OUT_OBJECT_INIT_VARIABLE_LIST, packName);//���뵽Ҫ�����Ķ��������б���
List<String> popObjectVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_OBJECT_PARA_LIST);
popObjectVarList.add(packName);//���뵽����α�����б���
List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST);
popVarList.remove(packName);//����ͨα�����б� ��ɾ��
}
return codeTokens.iterator();
}
}