/** * <p>Copyright: Copyright (c) 2013</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.procedure.compiler.skeleton.util; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import com.hundsun.ares.studio.engin.parser.PseudoCodeParser; import com.hundsun.ares.studio.engin.token.ICodeToken; import com.hundsun.ares.studio.jres.model.database.TableColumn; import com.hundsun.ares.studio.jres.model.database.TableResourceData; /** * @author lvgao * */ public class ParamReplaceUtil { /** * ��������滻 * @param prefix ǰ׺��proc������:,���������"" * @param codes ������ĺ� * @param params * @param context * @return */ public static String handleParams(String prefix,Iterator<ICodeToken> codes,String[] params,Set<String> inoutParamList){ StringBuffer ret = new StringBuffer(); while(codes.hasNext()) { ICodeToken code = codes.next(); String c = code.getContent(); if(code.getType() != ICodeToken.COMMENT && code.getType() != ICodeToken.STRING) {//��ע�ͷ��ַ�������Ҫ�滻 for(String para:params){ if(inoutParamList.contains(para)){ String rStr = String.format("%s%s%s", prefix, "p_",para); c = replaceVariable(c,para, rStr); }else{ String rStr = String.format("%s%s%s", prefix, "v_",para); c = replaceVariable(c,para, rStr); } } } ret.append(c); } return ret.toString(); } /** * ��������滻 * @param prefix ǰ׺��proc������:,���������"" * @param content * @param params * @param context * @return */ public static String handleParams(String prefix,String content,String[] params,Set<String> inoutParamList){ StringBuffer ret = new StringBuffer(); //��proc����һ�� Iterator<ICodeToken> codes = PseudoCodeParser.parseEx(content, PseudoCodeParser.PROC_COMMENT_PATTERN, PseudoCodeParser.PROC_STRING_PATTERN, new HashMap<Object, Object>() ); while(codes.hasNext()) { ICodeToken code = codes.next(); String c = code.getContent(); if(code.getType() != ICodeToken.COMMENT && code.getType() != ICodeToken.STRING) {//��ע�ͷ��ַ�������Ҫ�滻 for(String para:params){ if(inoutParamList.contains(para)){ String rStr = String.format("%s%s%s", prefix, "p_",para); c = replaceVariable(c,para, rStr); }else{ String rStr = String.format("%s%s%s", prefix, "v_",para); c = replaceVariable(c,para, rStr); } } } ret.append(c); } return ret.toString(); // for(String para:params){ // if(inoutParamList.contains(para)){ // String rStr = String.format("%s%s%s", prefix, "p_",para); // content = replaceVariable(content,para, rStr); // }else{ // String rStr = String.format("%s%s%s", prefix, "v_",para); // content = replaceVariable(content,para, rStr); // } // } // return content; } /** * �����滻 * @param content * @param params * @param context * @return */ public static String handleParams(String content,String[] params,Set<String> inoutParamList){ return handleParams("", content, params, inoutParamList); } /** * �滻��׼�ֶ� * @param code * @param varName * @param replaceName * @return */ public static String replaceVariable(String code, String varName, String replaceName) { Pattern p = Pattern.compile("@" + varName+"[^\\@w\\d_]+"); StringBuffer sbRet = new StringBuffer(); Matcher m = p.matcher(code); int lastPos = 0; while (m.find()) { if (m.start() > lastPos) { sbRet.append(code.substring(lastPos, m.start())); } sbRet.append(m.group().replaceAll("@" + varName, replaceName)); lastPos = m.end(); } if (lastPos < code.length()) { sbRet.append(code.substring(lastPos)); } return sbRet.toString(); } /** * �滻���� * @param code * @param varName * @param replaceName * @return */ public static String replaceConstant(String code, String varName, String replaceName) { Pattern p = Pattern.compile("@" + varName + "[^\\w\\d_]"); StringBuffer sbRet = new StringBuffer(); Matcher m = p.matcher(code); int lastPos = 0; while (m.find()) { if (m.start() > lastPos) { sbRet.append(code.substring(lastPos, m.start())); } sbRet.append(m.group().replaceAll("@" + varName, replaceName)); lastPos = m.end(); } if (lastPos < code.length()) { sbRet.append(code.substring(lastPos)); } return sbRet.toString(); } /** * ��ȥ��ע�ͺ�Ĵ�����һ���ַ����滻������һ���ַ��� * @param content ���� * @param targetStr Ŀ���ַ��� * @param replaceStr �滻�ַ��� * @return */ public static String replaceContentWithNotString(String content, String targetStr, String replaceStr,Map<Object, Object> context){ StringBuffer ret = new StringBuffer(); //��proc����һ�� Iterator<ICodeToken> codes = PseudoCodeParser.parseEx(content, PseudoCodeParser.PROC_COMMENT_PATTERN, PseudoCodeParser.PROC_STRING_PATTERN, context); while(codes.hasNext()) { ICodeToken code = codes.next(); String c = code.getContent(); if(code.getType() != ICodeToken.COMMENT && code.getType() != ICodeToken.STRING) {//��ע�ͷ��ַ�������Ҫ�滻 c = c.replaceAll(targetStr, replaceStr); } ret.append(c); } return ret.toString(); } private static Pattern CONST_PATTERN = Pattern.compile("(([^<]|^)<[\\w\\d_]+>([^\\[]|$))", Pattern.MULTILINE); private static Pattern CONST_PATTERN2 = Pattern.compile("<[\\w\\d_]+>"); /** * �������г������ * * @param strText * @return */ public static List<String> findConstAll(String strText,Map<Object, Object> context) { List<String> ret = new ArrayList<String>(); //��proc����һ�� Iterator<ICodeToken> codes = PseudoCodeParser.parseEx(strText, PseudoCodeParser.PROC_COMMENT_PATTERN, PseudoCodeParser.PROC_STRING_PATTERN, context); while(codes.hasNext()) { ICodeToken code = codes.next(); String c = code.getContent(); if(code.getType() != ICodeToken.COMMENT && code.getType() != ICodeToken.STRING) {//��ע�ͷ��ַ�������Ҫ��� Matcher m = CONST_PATTERN.matcher(c); int index = 0; while ( m.find(index) ) { String group = m.group(); Matcher m2 = CONST_PATTERN2.matcher(group); if (m2.find()) { ret.add(m2.group()); } index = m.start() + m2.end() - 1; } } } return ret; } /** * ���Դ��и�����־λ���ֶ�. * ���table����his_��fil��r_��rl_��ͷ�ģ����ǻ᷵�������ֶ� * @param flag ��־λ * @return ���Ժ�� */ public static TableColumn[] getFieldsWithoutFlag(TableResourceData table , String flag,String tableName) { if(tableName.indexOf(".") >= 0){ tableName = tableName.substring(tableName.lastIndexOf(".")+1); } if(!tableName.isEmpty()){ tableName = tableName.trim(); if(tableName.startsWith("his_")|| tableName.startsWith("fil_")|| tableName.startsWith("r_")|| tableName.startsWith("rl_")){ return table.getColumns().toArray(new TableColumn[0]); } } List<TableColumn> filtered = new ArrayList<TableColumn>(); char[] flags = flag.toCharArray(); ; for (TableColumn field : table.getColumns()) { boolean contains = false; for (int ch : flags) { if (field.getMark() != null) { if (field.getMark().indexOf(ch) != -1) { contains = true; break; } } } if (!contains) { filtered.add(field); } } return filtered.toArray(new TableColumn[filtered.size()]); } public static StringBuffer formatInsert(String str){ int haveAt = 0; if(str.indexOf("@") != -1) haveAt = 1; StringBuffer buffer = new StringBuffer(str); for(int i = 0 ;20-buffer.length()-haveAt>0;i++){ buffer.append(" "); } return buffer; } public static StringBuffer formatInsert(String str,int maxLength){ int haveAt = 0; if(str.indexOf("@") != -1) haveAt = 1; StringBuffer buffer = new StringBuffer(str); int length = buffer.length(); if(maxLength>length){ for(int i = 0 ;i<(maxLength-length-haveAt);i++){ buffer.append(" "); } } return buffer; } }