/** * <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 java.util.Set; 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.PackAddFieldHeadToken; import com.hundsun.ares.studio.engin.constant.IEngineContextConstant; import com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler; import com.hundsun.ares.studio.engin.skeleton.ISkeletonAttributeHelper; import com.hundsun.ares.studio.engin.token.ICodeToken; import com.hundsun.ares.studio.engin.token.IDomainHandler; import com.hundsun.ares.studio.engin.token.macro.IMacroToken; /** * @author zhuyf * */ public class PackAddFieldByHandworkMacroHandler implements IMacroTokenHandler { /* (non-Javadoc) * @see com.hundsun.ares.studio.engin.macrohandler.IMacroTokenHandler#getKey() */ @Override public String getKey() { // TODO Auto-generated method stub return MacroConstant.PACK_ADDFIELD_HANDWORK_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 { /*���������� [�ֹ����ͷ][Ҫ������ֶ��б�] �������̣� 1.��ȡ�ֶ��б����뵽PRO*C������ 2.ÿһ�ֶ����ɣ� lpOutPacker->AddField("[�ֶ���]"); ע������������͵IJ���������Ҳ�������仯 3.[�ֹ����ͷ][client_id,client_name,address][@packer]�����ɴ������£� v_packer->BeginPack(); v_packer->AddField("client_id"); v_packer->AddField("client_name"); * */ List<ICodeToken> tokens = new ArrayList<ICodeToken>(); String[] param_0 = new String[0]; String param_1 = ""; if (token.getParameters().length > 0) { param_0 = token.getParameters()[0].split(","); } if (token.getParameters().length > 1) { param_1 = token.getParameters()[1]; } //�����ݿ�ı��ֶΣ����뵽proc������ ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER); helper.addAttribute(IAtomEngineContextConstantMySQL.IS_ALREADY_RETURN_RESULTSET, "true"); List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST); //������ͷ���������뵽��ͨ�����б���ȥ for(String fieldName : param_0){ popVarList.add(fieldName.trim()); } boolean isObjectPack = isObjectPack(param_1); if(isObjectPack){ addObjectPackToVarList(param_1,context); } if(StringUtils.startsWith(param_1, "@") &&! StringUtils.endsWith(param_1, "ResultSet")){ param_1+="ResultSet"; } tokens.add(new PackAddFieldHeadToken(param_0,param_1,isObjectPack)); //����� IDomainHandler handler = (IDomainHandler) context.get(IEngineContextConstant.DOMAIN_HANDLER); handler.addDomain(new DefaultTokenDomain(getKey(), token.getParameters())); return tokens.iterator(); } /** * �Ƿ��Ƕ����� * @param packName * @return */ private boolean isObjectPack(String packName){ return StringUtils.endsWith(packName, "ResultSet"); } /** * �Ѷ����������뵽��ر����б��� * @param packName */ private void addObjectPackToVarList(String packName,Map<Object, Object> context){ ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstantMySQL.SKELETON_ATTRIBUTE_HELPER); List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST); List<String> popObjectVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_OBJECT_PARA_LIST); if(StringUtils.startsWith(packName, "@") && StringUtils.endsWith(packName, "ResultSet")){ String varName = StringUtils.replaceOnce(packName, "@", ""); int endIndex = StringUtils.lastIndexOf(varName, "ResultSet"); String objectName = StringUtils.substring(varName, 0, endIndex); helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_OUT_OBJECT_INIT_VARIABLE_LIST, objectName); popObjectVarList.add(objectName); popVarList.remove(objectName); }else if(StringUtils.startsWith(packName, "@") &&! StringUtils.endsWith(packName, "ResultSet")){ String varName = StringUtils.replaceOnce(packName, "@", ""); popObjectVarList.add(varName); helper.addAttribute(IAtomEngineContextConstantMySQL.ATTR_OUT_OBJECT_INIT_VARIABLE_LIST, varName); popObjectVarList.add(varName); popVarList.remove(varName); } } }