/**
* <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 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.macro.TokenDomain;
import com.hundsun.ares.studio.atom.compiler.mysql.token.PROCBlockBeginToken;
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.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.IDomainHandler;
import com.hundsun.ares.studio.engin.token.ITokenDomain;
import com.hundsun.ares.studio.engin.token.ITokenListenerManager;
import com.hundsun.ares.studio.engin.token.macro.IMacroToken;
/**
* @author zhuyf
*
*/
public class ProcBlockBeginMacroHandler implements IMacroTokenHandler {
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#getKey()
*/
@Override
public String getKey() {
return MacroConstant.PROC_BLOCK_BEGIN_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���鿪ʼ]��[PRO*C�������]
�������̣�
��α����༭��������[PRO*C���鿪ʼ]��[PRO*C�������]���������Ԥ��tabҳ���鿴��Ӧ����ʵ���롣
����������֮��Ĵ���Ҫ�����������
�ڸ�������֮��Ĵ������ʹ�ú�[������ʼ]��[���������]��[������¼]��[select������¼]�����������������Щ���˵����
����������֮����ֵı���Ҫ������PROC�����У���������Ϊ������ֵı�����δ�ڱ������������г��֣���������PROC�������������С�
��������֮����ֵı�����������@���Ž����滻��ʱ��Ҫͳһ���ϡ�������
��������֮����ù���Ҫʹ��PROC���÷�ʽ��
�����������������������ʽ��
EXEC SQL EXECUTE //proc���鿪ʼ;
BEGIN
*/
ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER);
helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_PROC_MACRO, this.getKey());
helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_DATABASE_MACRO, this.getKey());
List<ICodeToken> codeTokens = new ArrayList<ICodeToken>();
if(!checkIsMacroMatch(context)){//���PRO*C���鿪ʼ]��ǰ���Ƿ���������PRO*C���鿪ʼ]��
fireEvent(context);//���ͺ����ƥ���¼�
}
codeTokens.add(new PROCBlockBeginToken());//��Ӻ괦��codeToken
addDomain(context);//�����
return codeTokens.iterator();
}
/**
* �����PRO*C���鿪ʼ���Ƿ���������PRO*C���鿪ʼ��
* @return
*/
private boolean checkIsMacroMatch(Map<Object, Object> context){
IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER);
ITokenDomain procBlockBeginDomain =handler.getDomain(MacroConstant.PROC_BLOCK_BEGIN_MACRONAME);
//���ǰ����PRO*C���鿪ʼ��procBlockBeginDomain��Ϊnull
return procBlockBeginDomain==null;
}
/**
* ���ͺ����ƥ���¼�
*/
private void fireEvent(Map<Object, Object> context){
ITokenListenerManager manager = (ITokenListenerManager)context.get(IEngineContextConstant.TOKEN_LISTENER_MANAGER);
String message = String.format("��"+MacroConstant.PROC_BLOCK_BEGIN_MACRONAME+"ǰ�治����δ������[%s]��", MacroConstant.PROC_BLOCK_BEGIN_MACRONAME);
//����PRO*C���鿪ʼ]��ǰ�治����������PRO*C���鿪ʼ]���¼�
manager.fireEvent(new DefaultTokenEvent(ITokenConstant.EVENT_ENGINE_WARNNING,message));
}
/**
* �����
*/
private void addDomain(Map<Object, Object> context){
IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER);
handler.addDomain(new TokenDomain(MacroConstant.PROC_BLOCK_BEGIN_MACRONAME, null));
}
}