/**
* <p>Copyright: Copyright (c) 2013</p>
* <p>Company: �������ӹɷ�����˾</p>
*/
package com.hundsun.ares.studio.atom.compiler.token;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.hundsun.ares.studio.atom.InternalParam;
import com.hundsun.ares.studio.atom.compiler.constant.IAtomEngineContextConstant;
import com.hundsun.ares.studio.atom.compiler.skeleton.util.AtomFunctionCompilerUtil;
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.token.IParamDefineHelper;
import com.hundsun.ares.studio.engin.util.TypeRule;
import com.hundsun.ares.studio.jres.model.metadata.BusinessDataType;
import com.hundsun.ares.studio.jres.model.metadata.StandardDataType;
import com.hundsun.ares.studio.jres.model.metadata.TypeDefaultValue;
import com.hundsun.ares.studio.jres.model.metadata.util.MetadataServiceProvider;
/**
* ����������������,��Ҫ���� �꾲̬�ı��еı���
* @author liaogc
*
*/
public class SpecialParamDefineHelper {
private final static String PARAM_DEFINE = "%1$s @%2$s = %3$s;" + ITokenConstant.NL;
private final static String PARAM_DEFINE_STR = "char @%1$s[%2$s] = {0};" + ITokenConstant.NL;
private Map<String,ParamrDefineBean> params = new HashMap<String,ParamrDefineBean>(10);
public static SpecialParamDefineHelper instance = new SpecialParamDefineHelper();
public SpecialParamDefineHelper(){
initParam();
}
/**
*
* @param project
* @param context
* @param type IAtomEngineContextConstant.ATTR_PROC_VARIABLE_LIST,IEngineContextConstant.PSEUDO_CODE_PARA_LIST֮һ
* @return
*/
public String getSpecialParamsDefineCodeStr(IARESProject project,Map<Object, Object> context,Collection col){
StringBuffer codeBuffer = new StringBuffer();
//ISkeletonAttributeHelper helper = (ISkeletonAttributeHelper)context.get(IAtomEngineContextConstant.SKELETON_ATTRIBUTE_HELPER);
//Set<String> procVarList = helper.getAttribute(IAtomEngineContextConstant.ATTR_PROC_VARIABLE_LIST);//proc�ݲ�����
//List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST);
List<String> popVarList = (List<String>)context.get(IEngineContextConstant.PSEUDO_CODE_PARA_LIST);
IParamDefineHelper defineHelper = (IParamDefineHelper)context.get(IAtomEngineContextConstant.PARAM_DEFINE_HELPER);
//if(popVarList)
Set<String> paramNameSet =params.keySet();
for(String paramName:paramNameSet){
ParamrDefineBean paramBean = null;
if(col.contains(paramName)){
paramBean = params.get(paramName);
}
if (paramBean != null) {
StandardDataType stdType = null;
String dataType = paramBean.getType();
String defaultValue = paramBean.getDefaultValue();
int length = paramBean.getLength();
try {
stdType = MetadataServiceProvider
.getStandardDataTypeOfStdFieldByName(project,
paramName);
} catch (Exception e) {
}
//����ֻ��Ҫ�����DZ��ֶε���Щ��������������Щ�����Ѿ��ڱ��ֶ��ж����ˣ���ôProc������α��������л�ͳһ��������Ҫ�����ﴦ�����ˡ�
if (stdType == null) {
//if(!isDefined(paramName)){
//if (StringUtils.equals(IAtomEngineContextConstant.ATTR_PROC_VARIABLE_LIST,type)) {
if(defineHelper.canInit(IParamDefineHelper.STD, paramName))
{
if (TypeRule.typeRuleCharArray(dataType)) {// �ַ���
codeBuffer.append(String.format(PARAM_DEFINE_STR,paramName + "", length));
//setDefined(paramName, Boolean.TRUE);
defineHelper.addInit(IParamDefineHelper.STD, paramName);
} else {// ��������ʱ
codeBuffer.append(String.format(PARAM_DEFINE,dataType, paramName + "", defaultValue));
//setDefined(paramName, Boolean.TRUE);
defineHelper.addInit(IParamDefineHelper.STD, paramName);
}
//}
// } else if (StringUtils.equals(IEngineContextConstant.PSEUDO_CODE_PARA_LIST, type)&&!procVarList.contains(paramName)) {
// if (TypeRule.typeRuleCharArray(dataType)) {// �ַ���
// codeBuffer.append(String.format(PARAM_DEFINE_STR,paramName + "", length));
// setDefined(paramName, Boolean.TRUE);
// } else {// ��������ʱ
// codeBuffer.append(String.format(PARAM_DEFINE,dataType, paramName + "", defaultValue));
// setDefined(paramName, Boolean.TRUE);
// }
// }
}
}else{
if(defineHelper.canInit(IParamDefineHelper.STD, paramName)&&!isDefined(paramName)){
codeBuffer.append(getParamDefineCodeStr(paramName,project));
//setDefined(paramName, Boolean.TRUE);
defineHelper.addInit(IParamDefineHelper.STD, paramName);
}
}
}
}
return codeBuffer.toString();
}
private void initParam(){
params.put("result_num",new ParamrDefineBean("result_num","int","0",0,Boolean.FALSE));
params.put("error_pathinfo_tmp",new ParamrDefineBean("error_pathinfo_tmp","char[501]","{0}",501,Boolean.FALSE));
params.put("error_no",new ParamrDefineBean("error_no","int","0",0,Boolean.FALSE));
params.put("error_info",new ParamrDefineBean("error_info","char[501]","{0}",500,Boolean.FALSE));
params.put("error_id",new ParamrDefineBean("error_id","int","0",0,Boolean.FALSE));
params.put("error_sysinfo",new ParamrDefineBean("error_sysinfo","char[501]","{0}",500,Boolean.FALSE));
params.put("error_pathinfo",new ParamrDefineBean("error_pathinfo","char[501]","{0}",500,Boolean.FALSE));
}
public boolean isSpecialParam(String param_name){
if(params.get(param_name) == null){
return false;
}
return true;
}
private boolean isDefined(String paramName){
if(params.get(paramName)!=null){
return params.get(paramName).isDefined();
}
return Boolean.TRUE;
}
private void setDefined(String paramName,boolean isDefined){
if(params.get(paramName)!=null){
params.get(paramName).setDefined(isDefined);
}
}
private class ParamrDefineBean{
private String name;//������
private String type;//��������
private String defaultValue;//Ĭ��ֵ
private boolean isDefined = false;//�Ƿ��Ѿ�����
private int length = 0;
public ParamrDefineBean(String name,String type,String defaultValue,int length,boolean isDefined){
this.name = name;
this.type = type;
this.defaultValue = defaultValue;
this.isDefined = isDefined;
this.length = length;
}
/**
* @return the name
*/
private String getName() {
return name;
}
/**
* @return the type
*/
private String getType() {
return type;
}
/**
* @return the defaultValue
*/
private String getDefaultValue() {
return defaultValue;
}
/**
* @return the isDefined
*/
private boolean isDefined() {
return isDefined;
}
/**
* @param isDefined the isDefined to set
*/
private void setDefined(boolean isDefined) {
this.isDefined = isDefined;
}
/**
* @return the length
*/
private int getLength() {
return length;
}
/**
* @param length the length to set
*/
private void setLength(int length) {
this.length = length;
}
}
/**
*
* @param paramName
* @param project
* @return
*/
private String getParamDefineCodeStr(String paramName,IARESProject project){
StringBuffer codeBuffer = new StringBuffer();
StandardDataType stdType = null;
try {
stdType = MetadataServiceProvider.getStandardDataTypeOfStdFieldByName(project, paramName);
} catch (Exception e) {
e.printStackTrace();
}
TypeDefaultValue typpeDefValue = null;
try {
typpeDefValue = MetadataServiceProvider.getTypeDefaultValueOfStdFieldByName(project, paramName);
} catch (Exception e) {
e.printStackTrace();
}
BusinessDataType busType = null;
try {
busType = MetadataServiceProvider.getBusinessDataTypeOfStdFieldByName(project, paramName);
} catch (Exception e) {
e.printStackTrace();
}
if((stdType != null) && ( typpeDefValue!= null) && ( busType!= null))//���ֶ�
{
String dataType = StringUtils.defaultIfBlank(stdType.getValue(MetadataServiceProvider.C_TYPE), "");
String defValue = typpeDefValue.getValue(MetadataServiceProvider.C_TYPE);
int length = 0;
if(busType.getLength() != null){
try {
length = Integer.parseInt(busType.getLength()) + 1;
} catch (Exception e) {
//throw new Exception(String.format("ҵ����������:%1$s�ij���Ϊ�Ƿ����֣�%2$s��", busType.getName(),busType.getLength()));
}
//����Char�������ʱ������Ҫ��1
dataType = dataType.replace("$L", length + "");
}
if(TypeRule.typeRuleCharArray(dataType)){
codeBuffer.append(String.format(PARAM_DEFINE_STR,paramName ,length));
}else{
codeBuffer.append(String.format(PARAM_DEFINE,dataType,paramName ,defValue));
}
}
return codeBuffer.toString();
}
}