/**
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.procedure.compiler.oracle.token;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import com.hundsun.ares.studio.biz.Parameter;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.engin.constant.ITokenConstant;
import com.hundsun.ares.studio.engin.constant.MarkConfig;
import com.hundsun.ares.studio.engin.token.ICodeToken;
import com.hundsun.ares.studio.engin.token.macro.IMacroToken;
import com.hundsun.ares.studio.procdure.Procedure;
import com.hundsun.ares.studio.procedure.compiler.oracle.constant.IProcedureEngineContextConstantOracle;
import com.hundsun.ares.studio.procedure.compiler.oracle.skeleton.util.ProcedureCompilerUtil;
/**
* ���̵����ӹ���Token
* @author liaogc
*
*/
public class SubProcedureCallToken implements ICodeToken{
private static final String NL = ITokenConstant.NL;
private static String FLAG_M="M";//m���
private static String PREFIX_P="p_";//ǰp
private static String PREFIX_V="v_";//ǰv
private static String ORACLE_ASSIGN=" => ";
private IMacroToken macroToken;
private Procedure procedure;//���õĹ���ģ��
private Procedure subProcedure;//�����õĹ���ģ��
private Map<String, String> defaultValueMap ;//Ĭ��ֵ�б�Map<Object, Object> context
private boolean isInTransaction;//�Ƿ���������
public SubProcedureCallToken(IMacroToken macroToken,Procedure procedure,Procedure subProcedure,Map<String, String> defaultValueMap,boolean isInTransaction){
this.macroToken = macroToken;
this.procedure = procedure;
this.subProcedure = subProcedure;
this.defaultValueMap = defaultValueMap;
this.isInTransaction = isInTransaction;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.token.ICodeToken#getContent()
*/
@Override
public String getContent() {
return StringUtils.EMPTY;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.token.ICodeToken#getType()
*/
@Override
public int getType() {
return ICodeToken.CODE_TEXT;
}
/**
* �����õĹ���ҵ�������Ƿ�Ϊ����
* ����Ϊ����ʱ��û�з���ֵ
* @return
* true ����
* false ����
*/
private boolean isSubProcedureProcdure(){
if(null != subProcedure &&
StringUtils.equalsIgnoreCase(subProcedure.getBizType(), IProcedureEngineContextConstantOracle.procedure)) {
return true;
}
return false;
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.engin.token.ICodeToken#genCode(java.util.Map)
*/
@Override
public String genCode(Map<Object, Object> context) throws Exception {
StringBuffer subCallCode = new StringBuffer();
IARESProject project = (IARESProject)context.get(IProcedureEngineContextConstantOracle.Aresproject);
subCallCode.append("--���ù��� :" ).append(subProcedure.getChineseName()).append(NL) ;
//2014��5��13��13:47:37 ֤ȯ������Ҫʹ�ù������ƣ���ԭ�����������߱���һ�£����Թ�������ֻ��֤ȯ������չ����չʾ
String subProcedureName = StringUtils.isNotBlank(subProcedure.getProcName())?subProcedure.getProcName():subProcedure.getName();
if(isSubProcedureProcdure()){//����Ϊ����ʱ��û�з���ֵ������Ҫ�������չ��̷���ֵ��ֱ�ӵ��ü���
subCallCode.append(subProcedureName).append(NL) ;
}else {
subCallCode.append("@error_no := ").append(subProcedureName).append(NL) ;
}
subCallCode.append(MarkConfig.MARK_LEFTSIGN).append(NL);
for(Parameter parameter :subProcedure.getInputParameters()){
String defaultValue = this.defaultValueMap.get(parameter.getId());//��Ĭ��ֵ������
if (defaultValue != null){//��Ĭ��ֵ������
subCallCode.append(PREFIX_P).append(parameter.getId()).append(ORACLE_ASSIGN).append(defaultValue).append(NL);
}else if(ProcedureCompilerUtil.isParameterINInputAndOutputParameterByName(procedure, parameter.getId(),project)){//�����������ǰ�ڲ�������
subCallCode.append(PREFIX_P).append(parameter.getId()).append(ORACLE_ASSIGN).append(MarkConfig.MARK_AT).append(parameter.getId()).append(MarkConfig.MARK_COMMA).append(NL);
} else {
//�ں���Ҫ���������ӹ��������ֶ����ӵ�������ȥ
subCallCode.append(PREFIX_P).append(parameter.getId()).append(ORACLE_ASSIGN).append(PREFIX_V).append(parameter.getId()).append(MarkConfig.MARK_COMMA).append(NL);
}
}
for(Parameter parameter :subProcedure.getOutputParameters()){
String defaultValue = this.defaultValueMap.get(parameter.getId());//��Ĭ��ֵ������
if (defaultValue != null){//��Ĭ��ֵ������
subCallCode.append(PREFIX_P).append(parameter.getId()).append(ORACLE_ASSIGN).append(defaultValue).append(NL);
}else if(ProcedureCompilerUtil.isParameterINInputAndOutputParameterByName(procedure, parameter.getId(),project)){//�����������ǰ�ڲ�������
subCallCode.append(PREFIX_P).append(parameter.getId()).append(ORACLE_ASSIGN).append(MarkConfig.MARK_AT).append(parameter.getId()).append(MarkConfig.MARK_COMMA).append(NL);
} else {
//�ں���Ҫ���������ӹ��������ֶ����ӵ�������ȥ
subCallCode.append(PREFIX_P).append(parameter.getId()).append(ORACLE_ASSIGN).append(PREFIX_V).append(parameter.getId()).append(MarkConfig.MARK_COMMA).append(NL);
}
}
if(subCallCode.lastIndexOf(",") != -1){//���һ�����Ŵ���һ��
subCallCode.deleteCharAt(subCallCode.lastIndexOf(","));
}
subCallCode.append(MarkConfig.MARK_RIGHTSIGN).append(MarkConfig.MARK_SEMICOLON).append(NL);
if(!isSubProcedureProcdure()){//����Ϊ����ʱ��û�д���ֵ���أ�Ҳ�������д�������Ϣ
subCallCode.append(getErrorString());//������
subCallCode.append("else").append(NL);
subCallCode.append(" @error_pathinfo := v_error_pathinfo_tmp;").append(NL);
subCallCode.append("end if;").append(NL);
}
return subCallCode.toString();
}
/**
* ����������
* @return �������ַ���
*/
private String getErrorString(){
StringBuffer error = new StringBuffer();
error.append("if @error_no != 0 then").append(NL);
boolean noText = true;
if(isInTransaction){//����ӹ���������֮�У���������Ҫrollback
noText = false;
error.append("rollback;").append(NL);
}
if(procedure.isOutputCollection()){//����ӹ����ǽ�������أ���Ҫ�α걨����
noText = false;
error.append("open @cursor for").append(NL);
error.append("select @error_pathinfo as error_pathinfo,@error_no as error_no, @error_info as error_info,@error_id as error_id, @error_sysinfo as error_sysinfo\n");
error.append("from dual;").append(NL);
}
if(macroToken.getFlag().indexOf(FLAG_M) == -1){
noText = false;
error.append(" return(@error_no);").append(NL);
}
if(noText){
error.append(" NULL;").append(NL);
}
return error.toString();
}
}