/** * <p>Copyright: Copyright (c) 2009</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.cres.extend.ui.module.gencode.util; import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.List; import java.util.regex.MatchResult; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.common.util.EList; import com.hundsun.ares.studio.core.IARESModule; import com.hundsun.ares.studio.core.IARESProject; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.core.model.BasicResourceInfo; import com.hundsun.ares.studio.core.model.Constants; import com.hundsun.ares.studio.core.model.ICommonModel; import com.hundsun.ares.studio.core.model.ModuleProperty; import com.hundsun.ares.studio.core.model.ModuleRevisionHistoryList; import com.hundsun.ares.studio.core.model.RevisionHistory; import com.hundsun.ares.studio.cres.extend.core.constants.ICresExtendConstants; import com.hundsun.ares.studio.cres.extend.cresextend.CresMoudleExtendProperty; import com.hundsun.ares.studio.cres.extend.cresextend.CresProjectExtendProperty; import com.hundsun.ares.studio.cres.extend.cresextend.CresextendFactory; import com.hundsun.ares.studio.cres.extend.cresextend.MoudleDepend; /** * ������������ * @author * @version 1.0 * @history */ public class ModuleGeneratorHelper { public static final String FILE_OUTPUT_LOCATION = "com.hundsun.ares.studio.preference.fileoutputlocation"; private static Pattern pCppMethodSignature = Pattern.compile("(//[^\\r\\n]*\\r?\\n\\s*)?int\\s+FUNCTION_CALL_MODE\\s+\\w+\\(IAS2Context \\* lpContext,IF2UnPacker \\* lpInUnPacker,IF2Packer \\* lpOutPacker\\)"); //Pattern.compile("(//[^\\r\\n]*\\r?\\n\\s*)?int\\s+\\w+\\s+F\\d+\\(.*?\\)"); private static String FORMAT_ALL = "#ifndef %1$s \n" + "#define %1$s \n" + "%2$s \n" + "%3$s\n" + "#endif /* %1$s */\r\n"; private static String FORMAT_INCLUDE = "#include \"%1$s\" \n"; /** * ��Դͳ�Ƹ�ʽ�� */ private static String RES_HEADER_FORMAT = "*%-15s%-50s%-50s%-100s*"; /** * ģ�����������Դͳ����Ϣ * @param infos * @return */ public static StringBuffer getResourceStatisticsInfo(List<ModuleResourceStatisticsInfo> infos) { StringBuffer ret = new StringBuffer(); // //�����ܺ����� // Collections.sort(infos,new Comparator<ModuleResourceStatisticsInfo>() { // @Override // public int compare(ModuleResourceStatisticsInfo o1, // ModuleResourceStatisticsInfo o2) { // return o1.getObjectID().compareTo(o2.getObjectID()); // } // }); ret.append("/"); ret.append(String.format(RES_HEADER_FORMAT, "***************","*****************************************","*****************************************","********************************************************************************")); ret.append("\r\n"); ret.append(String.format(RES_HEADER_FORMAT, " �����","Ӣ����","������","˵����Ϣ")); ret.append("\r\n"); ret.append(String.format(RES_HEADER_FORMAT, "---------------","-----------------------------------------","-----------------------------------------","---------------------------------------------------------------------------------")); ret.append("\r\n"); for (ModuleResourceStatisticsInfo info : infos) { ret.append(String.format(RES_HEADER_FORMAT, " "+info.getObjectID(), info.getName(),info.getcName(),info.getDesc().replaceAll("\n", "").replaceAll("\r", ""))); ret.append("\r\n"); } ret.append(String.format(RES_HEADER_FORMAT, "*******************","*****************************************","*****************************************","********************************************************************************")); ret.append("/"); ret.append("\r\n"); return ret; } /** * ��ȡ��ѡ��������ļ�·�� * */ public static String getFileOutPutPath() { String id = "com.hundsun.ares.studio.ui.jres_gen_path"; int index = StringUtils.lastIndexOf(id, '.'); if(index <= 0 || index == id.length()){ return null; } String qualifer = StringUtils.substring(id,0, index); String key = StringUtils.substring(id,index + 1, id.length()); String text = Platform.getPreferencesService().getString(qualifer, key, "", null); return text; } /** * д�ļ��İ�����Ϣ * * @param sb * @param includes */ public static void writeIncludeSection(StringBuffer sb, List<String> includes) { HashSet<String> includeSet = new HashSet<String>(); includeSet.addAll(includes); sb.append("\n"); for (String file : includeSet) { sb.append(String.format(FORMAT_INCLUDE, file)); } } /** * ��ȡģ��ĸ�ģ��·�� ��Ӣ����·���� * <br>���磺 * ģ���ϵ A->B->C,����Cģ�飺 * ���أ�A\B * @param module * @return * @throws Exception */ public static String getParentModulePath(IARESModule module) throws Exception{ List<IARESModule> parents = new ArrayList<IARESModule>(); getParentModules(module, parents); int parentSize = parents.size(); if(parentSize > 0){//���ڸ�ģ�� StringBuffer path = new StringBuffer(); for (int i = parentSize - 1; i >= 0; i--) { path.append(parents.get(i).getShortName()); path.append("\\"); } return path.toString(); } return ""; } /** * ��ȡģ��ĸ�ģ��·�� (������·����ָ���ָ���) * <br>���磺 * ģ���ϵ A->B->C,����Cģ�飺 * @param module * @segment �ָ��� * @return �ָ�����-������A-B�� * @throws Exception */ public static String getParentModuleCnamePath(IARESModule module,String segment) throws Exception{ List<IARESModule> parents = new ArrayList<IARESModule>(); getParentModules(module, parents); int parentSize = parents.size(); if(parentSize > 0){//���ڸ�ģ�� StringBuffer path = new StringBuffer(); for (int i = parentSize - 1; i >= 0; i--) { path.append(getModuleProperty(parents.get(i)).getString(ICommonModel.CNAME)); path.append(segment); } return path.toString(); } return ""; } /** * ��ȡģ��ĸ�ģ��·�� (������·��) * <br>���磺 * ģ���ϵ A->B->C,����Cģ�飺 * ���أ�A\B * @param module * @return * @throws Exception */ public static String getParentModuleCnamePath(IARESModule module) throws Exception{ List<IARESModule> parents = new ArrayList<IARESModule>(); getParentModules(module, parents); int parentSize = parents.size(); if(parentSize > 0){//���ڸ�ģ�� StringBuffer path = new StringBuffer(); for (int i = parentSize - 1; i >= 0; i--) { path.append(StringUtils.trim(FileNameHelper.legalFileOrDirName(getModuleProperty(parents.get(i)).getString(ICommonModel.CNAME)))); path.append("\\"); } return path.toString(); } return ""; } /** * ��ȡģ��ĸ�ģ��·�� (������·��) * ��ָ��ǰ׺�����߼�_��ԭ��_�� * <br>���磺 * ģ���ϵ A->B->C,����Cģ�飺 * ���أ�A\B * @param module * @return * @throws Exception */ public static String getParentModuleCnamePathWithPrefix(IARESModule module,String prefix) throws Exception{ List<IARESModule> parents = new ArrayList<IARESModule>(); getParentModules(module, parents); int parentSize = parents.size(); if(parentSize > 0){//���ڸ�ģ�� StringBuffer path = new StringBuffer(); for (int i = parentSize - 1; i >= 0; i--) { path.append(prefix + getModuleProperty(parents.get(i)).getString(ICommonModel.CNAME)); path.append("\\"); } return path.toString(); } return ""; } /** * ��ȡģ������и�ģ�� * @param module * @param parents */ public static void getParentModules(IARESModule module,List<IARESModule> parents){ IARESModule parent = module.getParentModule(); if(null != parent) { parents.add(parent); getParentModules(parent, parents); } } /** * ��ȡ��������·�� * @param module * @return */ public static String getModuleGenCodePath(IARESProject project) { String path = getFileOutPutPath(); if (path == null || path.isEmpty()) { path = "c:\\generate\\"; } else { if (!(path.endsWith("\\") || path.endsWith("/"))) { path += "\\"; } } // 2014-3-27 sundl TASK #9687 ��ѡ������Cres��UFT��������Ŀ¼ CRESҵ���߼����ɴ���Ŀ¼�Զ�������CRES����Ŀ¼ // 2014-4-14 sundl TASK #9885 �洢���̹����У�ģ���������ʱ������Ҫ��CRES return path = path + project.getElementName() + File.separator; } /** * ��ȡ���������� * * @param module * @return */ public static List<MoudleDepend> getAllDepends(IARESModule module) throws Exception{ List<MoudleDepend> depends = new ArrayList<MoudleDepend>(); getAllDepends(module,depends); return depends; } private static void getAllDepends(IARESModule module, List<MoudleDepend> depends) throws Exception{ EList<MoudleDepend> mds = getCresMoudleExtendProperty(module).getDepends(); depends.addAll(mds); for (MoudleDepend md : mds) { //����moudleDepend�ҵ���Ӧ��ģ�� for (IARESModule m : module.getARESProject().getModules()) { if(StringUtils.equals(m.getElementName(), md.getModulePath())){ getAllDepends(m, depends); break; } } } } /** * ��ȡcresģ����չ���� * @param module * @return * @throws Exception */ public static CresMoudleExtendProperty getCresMoudleExtendProperty(IARESModule module) throws Exception{ ModuleProperty mp = getModuleProperty(module); Object mProperty = mp.getMap().get(ICresExtendConstants.CRES_EXTEND_MOUDLE_PROPERTY); if(mProperty instanceof CresMoudleExtendProperty) { return (CresMoudleExtendProperty)mProperty; } return CresextendFactory.eINSTANCE.createCresMoudleExtendProperty(); } /** * ��ȡcres������չ���� * @param module * @return * @throws Exception */ public static CresProjectExtendProperty getCresProjectExtendProperty(IARESModule module) throws Exception{ return getCresProjectExtendProperty(module.getARESProject()); } /** * ��ȡcres������չ���� * @param project * @return * @throws Exception */ public static CresProjectExtendProperty getCresProjectExtendProperty(IARESProject project) throws Exception{ Object pProperty = project.getProjectProperty().getMap().get(ICresExtendConstants.CRES_EXTEND_PROJECT_PROPERTY); if(pProperty instanceof CresProjectExtendProperty) { return (CresProjectExtendProperty)pProperty; } return CresextendFactory.eINSTANCE.createCresProjectExtendProperty(); } /** * ��ȡģ������ * @param module * @return * @throws Exception */ public static ModuleProperty getModuleProperty(IARESModule module) throws Exception{ IARESResource res = module.getARESResource(IARESModule.MODULE_PROPERTY_FILE); return res.getInfo(ModuleProperty.class); } public static void writeStartupMethods(StringBuffer sb, String ProjectVersion) { sb.append("const char * ASFC_CALL_MODE GetLibVersion()\n"); sb.append("{\n"); sb.append("return \""); sb.append(ProjectVersion); sb.append("\";\n"); sb.append("}\n"); sb.append("void ASFC_CALL_MODE OnLoad(IAppContext * pContext,char * arg)\n"); sb.append("{\n"); sb.append("//@todo �ڴ˲�����Ӧ��������¼�����\n"); sb.append("}\n"); sb.append("void ASFC_CALL_MODE OnUnload(IAppContext * pContext)\n"); sb.append("{\n"); sb.append("//@todo �ڴ˲�����Ӧ���ж���¼�����\n"); sb.append("}\n"); sb.append("void ASFC_CALL_MODE OnStart(IAppContext * pContext,char * arg)\n"); sb.append("{\n"); sb.append("//@todo �ڴ˲�����ӦAS�����¼�����\n"); sb.append("}\n"); sb.append("void ASFC_CALL_MODE OnStop(IAppContext * pContext)\n"); sb.append("{\n"); sb.append("//@todo �ڴ˲�����ӦASֹͣ�¼�����\n"); sb.append("}\n"); sb.append("\n"); sb.append("\n"); } public static void writeStartupMethods2(StringBuffer sb, String ProjectVersion) { sb.append("char * FUNCTION_CALL_MODE GetLibVersion()\n"); sb.append("{\n"); sb.append("return \""); sb.append(ProjectVersion); sb.append("\";\n"); sb.append("}\n"); sb.append("void FUNCTION_CALL_MODE OnLoad(char * arg)\n"); sb.append("{\n"); sb.append("//@todo �ڴ˲�����Ӧ��������¼�����\n"); sb.append("}\n"); sb.append("void FUNCTION_CALL_MODE OnUnload()\n"); sb.append("{\n"); sb.append("//@todo �ڴ˲�����Ӧ���ж���¼�����\n"); sb.append("}\n"); sb.append("void FUNCTION_CALL_MODE OnStart()\n"); sb.append("{\n"); sb.append("//@todo �ڴ˲�����ӦAS�����¼�����\n"); sb.append("}\n"); sb.append("void FUNCTION_CALL_MODE OnStop()\n"); sb.append("{\n"); sb.append("//@todo �ڴ˲�����ӦASֹͣ�¼�����\n"); sb.append("}\n"); sb.append("\n"); sb.append("\n"); } /** * д���м��ö�ٷ���1.0 * * @param sb * @param businesses */ public static void writeMiddlewareEnumerateMethod(StringBuffer sb, List<BasicResourceInfo> businesses) { sb.append("int ASFC_CALL_MODE GetCompsInfo(int Index, LPFUNC_INFO ppv )\n"); writeMiddlewareEnumerateMethodbody(sb, businesses); } /** * д���м��ö�ٷ���2.0 * * @param sb * @param businesses */ public static void writeMiddlewareEnumerateMethod2(StringBuffer sb, List<BasicResourceInfo> businesses) { sb.append("int FUNCTION_CALL_MODE GetBizFunctionsInfo(int Index, LPBIZ_FUNC_INFO ppv )\n"); writeMiddlewareEnumerateMethodbody(sb, businesses); } private static void writeMiddlewareEnumerateMethodbody(StringBuffer sb, List<BasicResourceInfo> businesses) { sb.append("{\n"); sb.append("int iReturnCode = ASFC_EXISTS;\n"); sb.append("switch (Index)\n"); sb.append("{\n"); for (int i = 0; i < businesses.size(); i++) { sb.append("case "); sb.append(i); sb.append(":\n"); sb.append("if (ppv!=NULL)\n"); sb.append("{\n"); // ppv->dwFunctionNo = 433001; sb.append("ppv->dwFunctionNo = "); sb.append(businesses.get(i).getObjectId()); sb.append(";\n"); // ppv->iVersion = 20070821; sb.append("ppv->iVersion = "); sb.append(new SimpleDateFormat("yyyyMMdd").format(new Date())); // String ver = services.get(i).getVersion(); // if (ver == null || ver.isEmpty()) { // sb.append(0); // } else { // if (ver.indexOf(".") != -1) { // String vv[] = ver.split("\\."); // sb.append(vv[vv.length - 1]); // } else { // sb.append(ver); // } // } sb.append(";\n"); // ppv->ReqProc = F433001; sb.append("ppv->ReqProc = "); sb.append("F" + businesses.get(i).getObjectId()); sb.append(";\n"); // ppv->AnsProc = NULL; sb.append("ppv->AnsProc = NULL;\n"); // ppv->Caption = "����_�ͻ�������Ϣ��"; sb.append("ppv->Caption = \""); sb.append(businesses.get(i).getChineseName()); sb.append("\";\n"); sb.append("}\n"); sb.append("break;\n"); } // default:iReturnCode = ASFC_NONE; sb.append("default:iReturnCode = ASFC_NONE;\n"); sb.append("}\n"); sb.append("return iReturnCode;\n"); sb.append("}\n"); } /** * ����cpp�ļ�����ͷ�ļ� * * @param Cppbody * @param headerFileName * @param includeFiles * @param defaults * @return */ public static StringBuffer generateHeaderFile(StringBuffer Cppbody, String headerFileName, String includeFiles[], String defaults[]) { String macroName = headerFileName.toUpperCase().replaceAll("\\.", "_"); macroName = "_" + macroName + "_"; StringBuffer include = new StringBuffer(); if (includeFiles != null) { for (String file : includeFiles) { include.append( String.format(FORMAT_INCLUDE, file) ); } } StringBuffer body = new StringBuffer(); Matcher m = pCppMethodSignature.matcher(Cppbody); int iFindPostion = 0; while (m.find(iFindPostion)) { MatchResult result = m.toMatchResult(); body.append("#ifdef __cplusplus \nextern \"C\" { \n#endif \n\n"); if (defaults != null) { String function = result.group(); int beginIndex = function.indexOf('(') + 1; int endIndex = function.lastIndexOf(')'); String s1 = function.substring(0, beginIndex); String s2 = function.substring(beginIndex, endIndex); String s3 = function.substring(endIndex); String splitString[] = s2.split(","); for (int i = 0; i < defaults.length; i++) { splitString[splitString.length - 1 - i ] += " = " + defaults[i]; } body.append(s1); body.append(splitString[0]); for (int i = 1; i < splitString.length; i++) { body.append(", "); body.append(splitString[i]); } body.append(s3); } else { body.append(result.group()); } body.append(";\n"); body.append("#ifdef __cplusplus \n} \n#endif\n\n"); iFindPostion = result.end(); } return new StringBuffer(String.format(FORMAT_ALL, macroName, include, body)); } /** * д���ļ�ע��ͷ��Ϣ * * @param commentHeader * @param fileName * @param date */ public static void writeCommentHeader(StringBuffer sb, String commentHeader, String fileName, String moduleName, Date date) { if(commentHeader == null) return; // ֧�ֺ��滻 $(FILE) $(DATE) $(MODULE) commentHeader = commentHeader.replaceAll("\\$\\(FILE\\)", fileName); commentHeader = commentHeader.replaceAll("\\$\\(MODULE\\)", moduleName); String theDate = new SimpleDateFormat("yyyy/MM/dd").format(date); commentHeader = commentHeader.replaceAll("\\$\\(DATE\\)", theDate); sb.append(commentHeader); sb.append("\n"); } /** * ��ȡģ���޸ļ�¼ * @param module * @return * @throws Exception */ protected static List<RevisionHistory> getModuleHistorys(IARESModule module) throws Exception{ ModuleProperty property = ModuleGeneratorHelper.getModuleProperty(module);//ģ������ //ģ���޸ļ�¼ ModuleRevisionHistoryList modRev = (ModuleRevisionHistoryList) property.getMap().get(Constants.RevisionHistory.MODULE_REVISION_EXT_KEY); if(null != modRev) { return modRev.getHistories(); }else { return new ArrayList<RevisionHistory>(); } } /** * ���޸ļ�¼���汾������ * @param hiss */ protected static void sortHistoryByVersion(List<RevisionHistory> hiss) { Collections.sort(hiss, new Comparator<RevisionHistory>() { @Override public int compare(RevisionHistory log1, RevisionHistory log2) { if(log1.getVersion().compareToIgnoreCase(log2.getVersion()) != 0){ if(log1.getVersion().trim().isEmpty()){ return 1; } if(log2.getVersion().trim().isEmpty()){ return -1; } String[] v1 = log1.getVersion().split("\\."); String[] v2 = log2.getVersion().split("\\."); int i = 0; while(i < v1.length && i < v2.length){ if(v1[i].compareToIgnoreCase(v2[i]) != 0){ try{ return Integer.valueOf(removeFirst(v2[i])) - Integer.valueOf(removeFirst(v1[i])); }catch(Exception e){ return removeFirst(v1[i]).compareToIgnoreCase(removeFirst(v2[i])); } }else{ i++; } } return 1; }else{ return -1; } } }); } protected static String removeFirst(String str){ for(char c:str.toCharArray()){ if(c<'0' || c > '9'){ str = str.substring(1); }else{ break; } } return str; } }