package com.hundsun.ares.studio.logic.ui;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Queue;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.preferences.IPreferencesService;
import org.eclipse.emf.common.util.EList;
import com.hundsun.ares.studio.atom.AtomService;
import com.hundsun.ares.studio.atom.constants.IAtomResType;
import com.hundsun.ares.studio.biz.Parameter;
import com.hundsun.ares.studio.biz.util.ParamGroupUtil;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.ARESProblem;
import com.hundsun.ares.studio.core.IARESModule;
import com.hundsun.ares.studio.core.IARESProblem;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.BasicResourceInfo;
import com.hundsun.ares.studio.core.model.ICommonModel;
import com.hundsun.ares.studio.cres.constant.ICresUIConstant;
import com.hundsun.ares.studio.cres.extend.cresextend.MoudleDepend;
import com.hundsun.ares.studio.cres.extend.ui.module.gencode.GenCresModuleCode;
import com.hundsun.ares.studio.cres.extend.ui.module.gencode.util.FileNameHelper;
import com.hundsun.ares.studio.cres.extend.ui.module.gencode.util.MakeFileBuilder;
import com.hundsun.ares.studio.cres.extend.ui.module.gencode.util.ModuleGeneratorHelper;
import com.hundsun.ares.studio.cres.extend.ui.module.gencode.util.RevisionHistoryGenUtil;
import com.hundsun.ares.studio.engin.format.CodeFormater;
import com.hundsun.ares.studio.engin.logic.ResourceEngin;
import com.hundsun.ares.studio.engin.skeleton.DefaultSkeletonInput;
import com.hundsun.ares.studio.logic.LogicFunction;
import com.hundsun.ares.studio.logic.LogicService;
import com.hundsun.ares.studio.logic.compiler.constant.ILogicEngineContextConstant;
import com.hundsun.ares.studio.logic.compiler.constant.ILogicSkeletonFactoryConstant;
import com.hundsun.ares.studio.logic.constants.ILogicResType;
import com.hundsun.ares.studio.logic.ui.util.LogicModuleGeneratorHelper;
import com.hundsun.ares.studio.ui.ARESUI;
public class GenLogicModuleCode extends GenCresModuleCode {
@Override
public void genModuleCode(IARESModule module, Map<Object, Object> context,
boolean isWithPath, boolean isPathWithCname, IProgressMonitor monitor) {
if(monitor.isCanceled()){
return;
}
String newPath = ModuleGeneratorHelper.getModuleGenCodePath(module.getARESProject());
IPreferencesService service = Platform.getPreferencesService();
String charset = service.getString(ARESUI.PLUGIN_ID, ARESUI.PRE_GENERATE_CHARSET, StringUtils.EMPTY, null);
try {
if(isWithPath) {//��Ŀ¼
if(isPathWithCname){//ʹ����������Ϊ�ļ�Ŀ¼
String moduleCName = ModuleGeneratorHelper.getModuleProperty(module).getString(ICommonModel.CNAME);
if(moduleCName != null && moduleCName.trim().length() > 0){
newPath += ModuleGeneratorHelper.getParentModuleCnamePath(module);//����ģ��·��
newPath += StringUtils.trim(FileNameHelper.legalFileOrDirName(moduleCName));//ģ�����������˵Ŀո�Ҫȥ��
newPath += "\\";
createFilePath(newPath);//�����ļ�Ŀ¼
}
}else{
String moduleName = module.getShortName();
if(moduleName != null && moduleName.trim().length() > 0){
newPath += ModuleGeneratorHelper.getParentModulePath(module);//����ģ��·��
newPath += moduleName;
newPath += "\\";
createFilePath(newPath);//�����ļ�Ŀ¼
}
}
}
//��ģ��
IARESModule[] subModules = module.getSubModules();
//��ģ����Դ
IARESResource[] mRess = module.getARESResources();
monitor.beginTask(newPath, mRess.length + subModules.length*10 + 1);
if(mRess.length > 0) {//����Դ������
if(mRess.length == 1 && StringUtils.equals(mRess[0].getType(), "module.xml")) {//�п�����ģ������
System.out.println(mRess[0].getType());
}else {
createLSFunctionFile(monitor,module,newPath,charset);//������
createLSServiceFile(monitor,module,newPath,charset);//������
createMakefile(module,newPath,isWithPath,charset);//�����ļ�
monitor.worked(1);
generateLogicServiceTest(module,newPath,charset);//����������ļ�
// createFuncPasFile(monitor,module,newPath);//
}
}
//�ݹ�ģ��
for (IARESModule subModule : subModules) {
genModuleCode(subModule,context,isWithPath,isPathWithCname,new SubProgressMonitor(monitor, 10));
}
monitor.done();
} catch (Exception e) {
e.printStackTrace();
monitor.setCanceled(true);
}
}
/**
* @param module
* @param newPath
*/
private void createMakefile(IARESModule module, String newPath,boolean isWithPath,String charset) throws Exception{
//=================gcc
String gccName = "s_ls_" + module.getShortName() + "flow.gcc";
createMakeOrderFile(gccName,newPath,isWithPath,charset);
//��Դ���ɴ���
String gccFileName = newPath + gccName;
//ģ������
HashSet<String> gccIncludes = new HashSet<String>();
EList<MoudleDepend> depends = ModuleGeneratorHelper.getCresMoudleExtendProperty(module).getDepends();
for (MoudleDepend moudleDepend : depends) {
//����moudleDepend�ҵ���Ӧ��ģ��
for (IARESModule m : module.getARESProject().getModules()) {
if(StringUtils.equals(m.getElementName(), moudleDepend.getModulePath())){
// ԭ�ӵIJ���Ҫ���,ֻ�����ģ��
if(m.getParent().getElementName().equals(ICresUIConstant.LOGIC_ROOT_NAME)){
gccIncludes.add("s_ls_" + moudleDepend.getName() + "flow");//�����lib�⣬���������ʱ��Ӧ��Ϊso������flow���˶Ժ�����������Ҳ����˹�����
}
}
}
}
// �Լ���������
gccIncludes.remove("s_ls_" + module.getShortName() + "flow");
StringBuffer gccCodeBuffer = new StringBuffer();
MakeFileBuilder.writeLSGccMakeFile(module.getARESProject(), gccCodeBuffer,
"s_ls_" + module.getShortName(), "s_ls_" + module.getShortName() + "flow",
"s_ls_" + module.getShortName() + "func", gccIncludes.toArray(new String[0]));
//д���ļ�
writeToFile(gccFileName, gccCodeBuffer.toString(),charset);
// //=================mvc
// //��Դ���ɴ���
// String mvcFileName = newPath + "s_ls_" + module.getShortName() + "flow.mvc";
// HashSet<String> mvcDepends = new HashSet<String>();
// // mvc ȡ��������
// List<MoudleDepend> mvcDps = ModuleGeneratorHelper.getAllDepends(module);
// for (MoudleDepend md : mvcDps) {
// //����moudleDepend�ҵ���Ӧ��ģ��
// for (IARESModule m : module.getARESProject().getModules()) {
// if(StringUtils.equals(m.getElementName(), md.getModulePath())){
// // ԭ�ӵIJ���Ҫ���,ֻ�����ģ��
// if(m.getParent().getElementName().equals(LOGIC_ROOT_NAME)){
// mvcDepends.add("s_ls_" + md.getName() + "func");
// }
// }
// }
// }
// // �Լ���������
// mvcDepends.remove("s_ls_" + module.getShortName() + "func");
//
// StringBuffer mvc = new StringBuffer();
// MakeFileBuilder.writeLSMvcMakeFile(module.getARESProject(), mvc,
// "s_ls_" + module.getShortName(), "s_ls_" + module.getShortName() + "flow",
// "s_ls_" + module.getShortName() + "func", depends.toArray(new String[0]));
//
// writeToFile(mvcFileName, mvc.toString());
}
/**
* @param monitor
* @param module
* @param newPath
*/
private void createLSServiceFile(IProgressMonitor monitor,
IARESModule module, String newPath,String charset) throws Exception{
IARESResource[] moduleRes = module.getARESResources(ILogicResType.LOGIC_SERVICE);//������
List<IARESResource> modulesReslist = Arrays.asList(moduleRes);
//����
Collections.sort(modulesReslist,new Comparator<IARESResource>() {
@Override
public int compare(IARESResource o1, IARESResource o2) {
try {
//��ʱ��ԴΪ������
LogicService ls1 = o1.getInfo(LogicService.class);
LogicService ls2 = o2.getInfo(LogicService.class);
if(ls1.getObjectId() != null && ls1.getObjectId() != "" && ls2.getObjectId() != null && ls2.getObjectId() != ""){
return Integer.valueOf(ls1.getObjectId()) - Integer.valueOf(ls2.getObjectId());
}
return 0;
} catch (ARESModelException e) {
e.printStackTrace();
return 0;
}
}
});
//���ɴ���ʱ��������Ϣ�������Ϣ����
Queue<IARESProblem> msgQueue = new ArrayDeque<IARESProblem>();
//��Դ���ɴ���
String codeFileName = newPath + "s_ls_" + module.getShortName() + "flow.cpp";
StringBuffer codeBuffer = new StringBuffer();
// д��ע��ͷ
ModuleGeneratorHelper.writeCommentHeader(codeBuffer,
ModuleGeneratorHelper.getCresProjectExtendProperty(module).getHeadFile(),
codeFileName, module.getShortName(), new Date());
codeBuffer.append("\n");
// �����ļ�¼
codeBuffer.append(RevisionHistoryGenUtil.getAllRevisionHistoryInfo(LogicModuleGeneratorHelper.getLogicModuleHistorys(module), "//"));
codeBuffer.append("\n");
// �������ģ���Ӣ��������ģ��Ϊ�ض�����
List<String> includes = new ArrayList<String>();
includes.add("s_ls_" + module.getShortName() + "func.h");
ModuleGeneratorHelper.writeIncludeSection(codeBuffer, includes);
codeBuffer.append("\n");
//������������������
ArrayList<BasicResourceInfo> services = new ArrayList<BasicResourceInfo>();
for (IARESResource iaresResource : modulesReslist) {
LogicService logicService = iaresResource.getInfo(LogicService.class);
services.add(logicService);
if(monitor.isCanceled()){
return;
}
monitor.setTaskName("������"+iaresResource.getFullyQualifiedName());
codeBuffer.append(genLogicServiceCode(iaresResource,msgQueue));
monitor.worked(1);
}
codeBuffer.append("\n");
//���������
ModuleGeneratorHelper.writeMiddlewareEnumerateMethod2(codeBuffer, services);
ModuleGeneratorHelper.writeStartupMethods2(codeBuffer, LogicModuleGeneratorHelper.getLogicModuleLastVersion(module));
//д���ļ�
writeToFile(codeFileName, codeBuffer.toString(),charset);
//================================== err
String errLogFileName = "s_ls_" + module.getElementName() + "flow.errorlog";
createErrLog(msgQueue, errLogFileName,newPath,charset);
}
/**
* @param monitor
* @param module
* @param newPath
*/
private void createLSFunctionFile(IProgressMonitor monitor,
IARESModule module, String newPath,String charset) throws Exception{
IARESResource[] moduleRes = module.getARESResources(ILogicResType.LOGIC_FUNCTION);//������
List<IARESResource> modulesReslist = Arrays.asList(moduleRes);
//����
Collections.sort(modulesReslist,new Comparator<IARESResource>() {
@Override
public int compare(IARESResource o1, IARESResource o2) {
try {
//��ʱ��ԴΪ������
LogicFunction lf1 = o1.getInfo(LogicFunction.class);
LogicFunction lf2 = o2.getInfo(LogicFunction.class);
if(lf1.getObjectId() != null && lf1.getObjectId() != "" && lf2.getObjectId() != null && lf2.getObjectId() != ""){
return Integer.valueOf(lf1.getObjectId()) - Integer.valueOf(lf2.getObjectId());
}
return 0;
} catch (ARESModelException e) {
e.printStackTrace();
return 0;
}
}
});
//���ɴ���ʱ��������Ϣ�������Ϣ����
Queue<IARESProblem> msgQueue = new ArrayDeque<IARESProblem>();
//��Դ���ɴ���
String codeFileName = newPath + "s_ls_" + module.getShortName() + "func.cpp";
StringBuffer codeBuffer = new StringBuffer();
// д��ע��ͷ
ModuleGeneratorHelper.writeCommentHeader(codeBuffer,
ModuleGeneratorHelper.getCresProjectExtendProperty(module).getHeadFile(),
codeFileName, module.getShortName(), new Date());
codeBuffer.append("\n");
// �����ļ�¼
codeBuffer.append(RevisionHistoryGenUtil.getAllRevisionHistoryInfo(LogicModuleGeneratorHelper.getLogicModuleHistorys(module), "//"));
codeBuffer.append("\n");
//���ݺ�����������cppͷ�ļ�
StringBuffer cppHeadBuffer = new StringBuffer();
// �������ģ���Ӣ��������ģ��Ϊ�ض�����
List<String> includes = new ArrayList<String>();
includes.add("s_ls_" + module.getShortName() + "func.h");
ModuleGeneratorHelper.writeIncludeSection(cppHeadBuffer, includes);
codeBuffer.append("\n");
//������������������
for (IARESResource iaresResource : modulesReslist) {
if(monitor.isCanceled()){
return;
}
monitor.setTaskName("��������"+iaresResource.getFullyQualifiedName());
cppHeadBuffer.append(genLogicFunctionCode(iaresResource,msgQueue));
monitor.worked(1);
}
codeBuffer.append(cppHeadBuffer);
//д���ļ�
writeToFile(codeFileName, codeBuffer.toString(),charset);
//================================ͷ�ļ�
String hppFileName = newPath + "s_ls_" + module.getShortName() + "func.h";
List<String> headIncludes = new ArrayList<String>();
headIncludes.add("hshead.h");
//ģ������
EList<MoudleDepend> depends = ModuleGeneratorHelper.getCresMoudleExtendProperty(module).getDepends();
for (MoudleDepend moudleDepend : depends) {
//����moudleDepend�ҵ���Ӧ��ģ��
for (IARESModule m : module.getARESProject().getModules()) {
if(StringUtils.equals(m.getElementName(), moudleDepend.getModulePath())){
// ԭ�ӵIJ���Ҫ���,ֻ�����ģ��
if(m.getParent().getElementName().equals(ICresUIConstant.LOGIC_ROOT_NAME)){
headIncludes.add("s_ls_" + moudleDepend.getName() + "func.h");
}
}
}
}
StringBuffer hppFileBuffer = ModuleGeneratorHelper.generateHeaderFile(cppHeadBuffer, "s_ls_" + module.getShortName() + "func.h", headIncludes.toArray(new String[includes.size()]), null);
//д���ļ�
writeToFile(hppFileName, hppFileBuffer.toString(),charset);
//================================== err
String errLogFileName = "s_ls_" + module.getElementName() + "func.errorlog";
createErrLog(msgQueue, errLogFileName,newPath,charset);
}
/**
* ��������������ļ�
* @param path
* @param module
* @param charSet
*/
private void generateLogicServiceTest(IARESModule module, String path,String charset) throws Exception{
String codeFileNname = path + "s_ls_" + module.getShortName() + ".xml";
StringBuffer codeBuffer = new StringBuffer();
codeBuffer.append("<?xml version=\"1.0\" encoding=\"GBK\"?>");
codeBuffer.append("\r\n");
codeBuffer.append("<TEST_PACK note=\"ct���ù��ܺ����������\">");
codeBuffer.append("\r\n");
codeBuffer.append(" <Test>");
codeBuffer.append("\r\n");
//������
IARESResource[] moduleRes = module.getARESResources(ILogicResType.LOGIC_SERVICE);//������
List<IARESResource> modulesReslist = Arrays.asList(moduleRes);
//����
Collections.sort(modulesReslist,new Comparator<IARESResource>() {
@Override
public int compare(IARESResource o1, IARESResource o2) {
try {
//��ʱ��ԴΪ������
LogicService as1 = o1.getInfo(LogicService.class);
LogicService as2 = o2.getInfo(LogicService.class);
return Integer.valueOf(as1.getObjectId()) - Integer.valueOf(as2.getObjectId());
} catch (ARESModelException e) {
e.printStackTrace();
return 0;
}
}
});
String inparams = " <in name=\"%s\" value=\"%s\"/>";
for (IARESResource res : modulesReslist) {
LogicService service = res.getInfo(LogicService.class);
if(!ParamGroupUtil.isContainObjectParameter(service.getInputParameters(),res.getARESProject()) && !ParamGroupUtil.isContainObjectParameter(service.getOutputParameters(),res.getARESProject())){
codeBuffer.append(" <sub id=\"" + service.getObjectId() + "\" block=\"1\" livetime=\"5000\" pri=\"8\" pack_ver=\"32\" note=\"" + service.getChineseName() + "\">");
codeBuffer.append("\r\n");
codeBuffer.append(" <route system=\"\" sub_system=\"\" branch=\"\" esb_name=\"\" esb_no=\"0\" neighbor=\"\" plugin=\"\"/>");
codeBuffer.append("\r\n");
codeBuffer.append(" <inparams note=\"" + service.getChineseName() + "\">");
codeBuffer.append("\r\n");
List<Parameter> allInputParametersWithNoObjectParameter = new ArrayList<Parameter>();
ParamGroupUtil.parserParametersWithNoObjectParameter(service.getInputParameters(), allInputParametersWithNoObjectParameter, res.getARESProject());
for(Parameter inParameter:allInputParametersWithNoObjectParameter){
codeBuffer.append(String.format(inparams, inParameter.getId(), "")).append("\r\n");
}
List<Parameter> allOutParametersWithNoObjectParameter = new ArrayList<Parameter>();
ParamGroupUtil.parserParametersWithNoObjectParameter(service.getOutputParameters(), allInputParametersWithNoObjectParameter, res.getARESProject());
for (Parameter outParameter : allOutParametersWithNoObjectParameter) {
if (StringUtils.indexOf(outParameter.getId(), "IO") >= 0) {
codeBuffer.append(String.format(inparams, outParameter.getId(), "")).append("\r\n");
}
}
codeBuffer.append(" </inparams>");
codeBuffer.append("\r\n");
codeBuffer.append(" </sub>");
codeBuffer.append("\r\n");
}
}
codeBuffer.append(" </Test>");
codeBuffer.append("\r\n");
codeBuffer.append("</TEST_PACK>");
codeBuffer.append("\r\n");
writeToFile(codeFileNname, codeBuffer.toString(),charset);
}
/**
* �����������������
* @param iaresResource
* @param msgQueue
* @return
*/
private StringBuffer genLogicServiceCode(IARESResource iaresResource,
Queue<IARESProblem> msgQueue) throws Exception{
StringBuffer ret = new StringBuffer();
Map<Object, Object> context = new HashMap<Object, Object>();
LogicService logicService = iaresResource.getInfo(LogicService.class);
// ���ΪD�ķ������ɴ���
if(StringUtils.contains(logicService.getInterfaceFlag(), "D")){
return ret;
}
///���Ϊ�������ţ��ԡ������ָ����Ҫ���ɶ��
String objectID = logicService.getObjectId();
if(StringUtils.isBlank(objectID)) {
String message = String.format("������[(%s)%s]���ܺ�Ϊ�ա�", logicService.getName(),logicService.getChineseName());
IARESProblem problem = ARESProblem.createError();
problem.setMessage(message);
msgQueue.add(problem);
}else {
if(objectID.contains(",")){
String[] objIDs = objectID.split(",");
for (String objID : objIDs) {
logicService.setObjectId(objID.trim());
context.put(ILogicEngineContextConstant.ResourceModel, logicService);
ret.append(ResourceEngin.instance.generate(
new DefaultSkeletonInput(
ILogicSkeletonFactoryConstant.SKELETONTYPE_LOGIC_SERVICE,
iaresResource), context,msgQueue));
ret.append("\r\n");
}
}else{
context.put(ILogicEngineContextConstant.ResourceModel, logicService);
ret.append(ResourceEngin.instance.generate(
new DefaultSkeletonInput(
ILogicSkeletonFactoryConstant.SKELETONTYPE_LOGIC_SERVICE,
iaresResource), context,msgQueue));
ret.append("\r\n");
}
}
return CodeFormater.formatCByForce(ret);
}
/**
* ������
* @param iaresResource
* @param msgQueue
* @return
*/
private StringBuffer genLogicFunctionCode(IARESResource iaresResource,
Queue<IARESProblem> msgQueue) throws Exception{
StringBuffer ret = new StringBuffer();
Map<Object, Object> context = new HashMap<Object, Object>();
LogicFunction logicFunction = iaresResource.getInfo(LogicFunction.class);
// ���ΪD�ķ������ɴ���
if(StringUtils.contains(logicFunction.getInterfaceFlag(), "D")){
return ret;
}
///���Ϊ�������ţ��ԡ������ָ����Ҫ���ɶ��
String objectID = logicFunction.getObjectId();
if(StringUtils.isNotBlank(objectID) && objectID.contains(",")){
String[] objIDs = objectID.split(",");
for (String objID : objIDs) {
logicFunction.setObjectId(objID.trim());
context.put(ILogicEngineContextConstant.ResourceModel, logicFunction);
ret.append(ResourceEngin.instance.generate(
new DefaultSkeletonInput(
ILogicSkeletonFactoryConstant.SKELETONTYPE_LOGIC_FUNCTION,
iaresResource), context,msgQueue));
ret.append("\r\n");
}
}else{
context.put(ILogicEngineContextConstant.ResourceModel, logicFunction);
ret.append(ResourceEngin.instance.generate(
new DefaultSkeletonInput(
ILogicSkeletonFactoryConstant.SKELETONTYPE_LOGIC_FUNCTION,
iaresResource), context,msgQueue));
ret.append("\r\n");
}
return CodeFormater.formatCByForce(ret);
}
@Override
public boolean canGenCode(IARESModule module) {
String rootName = module.getParent().getElementName();
if(StringUtils.equals(rootName, ICresUIConstant.LOGIC_ROOT_NAME)){
return true;
}
return false;
}
}