package com.hundsun.ares.studio.procedure.ui.module.code;
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.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 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.IARESProject;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.core.model.ICommonModel;
import com.hundsun.ares.studio.cres.constant.ICresUIConstant;
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.ModuleGeneratorHelper;
import com.hundsun.ares.studio.cres.extend.ui.module.gencode.util.ModuleResourceStatisticsInfo;
import com.hundsun.ares.studio.cres.extend.ui.module.gencode.util.RevisionHistoryGenUtil;
import com.hundsun.ares.studio.engin.logic.ResourceEngin;
import com.hundsun.ares.studio.engin.skeleton.DefaultSkeletonInput;
import com.hundsun.ares.studio.jres.database.utils.ProjectSettingUtil;
import com.hundsun.ares.studio.procdure.Procedure;
import com.hundsun.ares.studio.procdure.constants.IProcedureResType;
import com.hundsun.ares.studio.procdure.provider.ProcedureUI;
import com.hundsun.ares.studio.procedure.compiler.mysql.constant.IProcedureSkeletonFactoryConstantMySQL;
import com.hundsun.ares.studio.procedure.compiler.oracle.constant.IProcedureEngineContextConstantOracle;
import com.hundsun.ares.studio.procedure.compiler.oracle.constant.IProcedureSkeletonFactoryConstantOracle;
import com.hundsun.ares.studio.procedure.ui.util.ProcedureModuleGeneratorHelper;
import com.hundsun.ares.studio.ui.ARESUI;
public class GenProcedureModuleCode 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(true);
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 {
createModuleFile(monitor,module,newPath,charset,context);//���ɹ���
}
}
//�ݹ�ģ��
for (IARESModule subModule : subModules) {
genModuleCode(subModule,context,isWithPath,isPathWithCname,new SubProgressMonitor(monitor, 10));
}
monitor.done();
} catch (Exception e) {
e.printStackTrace();
monitor.setCanceled(true);
}
}
/* (non-Javadoc)
* @see com.hundsun.ares.studio.cres.extend.ui.module.gencode.GenCresModuleCode#getContent(com.hundsun.ares.studio.core.IARESProject)
*/
@Override
public Map<Object, Object> getContext(IARESProject project) {
Map<Object, Object> context = new HashMap<Object, Object>();
context.put(IProcedureEngineContextConstantOracle.auto_define_input_param,
ProcedureUI.getPlugin().getPreferenceStore().getBoolean(ProcedureUI.PER_AUTO_DEFINE_PROC_INPARAM));
context.put(IProcedureEngineContextConstantOracle.not_define_connect_type,
ProcedureUI.getPlugin().getPreferenceStore().getBoolean(ProcedureUI.PER_NOT_DEFINE_CONNECT_TYPE));
context.put(IProcedureEngineContextConstantOracle.return_error_info,
ProcedureUI.getPlugin().getPreferenceStore().getBoolean(ProcedureUI.PER_RETURN_ERROR_INFO));
context.put(IProcedureEngineContextConstantOracle.gen_related_info,
ProcedureUI.getPlugin().getPreferenceStore().getBoolean(ProcedureUI.PER_GEN_RELATED_INFO));
if(ProcedureUI.isStock2Procedure()) {
context.put(IProcedureEngineContextConstantOracle.gen_begin_code,
isHeadCode());
context.put(IProcedureEngineContextConstantOracle.gen_end_code,
isEndCode());
}else {
context.put(IProcedureEngineContextConstantOracle.gen_begin_code, false);
context.put(IProcedureEngineContextConstantOracle.gen_end_code, false);
}
return context;
}
/**
* ���ɹ��̽ű��ļ�
* @param moduleRes
* ������Դ
* @param fileSuffixName
* �ļ�����
* @param monitor
* @param module
* @param path
* @param charset
* @throws Exception
*/
private void createProcedureFile(
IARESResource[] moduleRes,String fileSuffixName,IProgressMonitor monitor,
IARESModule module, String path,String charset,Map<Object, Object> context,boolean needSort) throws Exception{
// ģ����û�й��̣�������sql�ļ�
if(moduleRes == null || moduleRes.length < 1) {
return;
}
List<IARESResource> modulesReslist = Arrays.asList(moduleRes);
//����
if(needSort){
Collections.sort(modulesReslist,new Comparator<IARESResource>() {
@Override
public int compare(IARESResource o1, IARESResource o2) {
try {
//��ʱ��ԴΪ�洢����
Procedure p1 = o1.getInfo(Procedure.class);
Procedure p2 = o2.getInfo(Procedure.class);
return Integer.valueOf(p1.getObjectId()) - Integer.valueOf(p2.getObjectId());
} catch (ARESModelException e) {
e.printStackTrace();
return 0;
}
}
});
}
//���ɴ���ʱ��������Ϣ�������Ϣ����
Queue<IARESProblem> msgQueue = new ArrayDeque<IARESProblem>();
//���ݿ���
String dbName = "";
String codeFileName = path + dbName + getModuleNameFromAutoCreateModuleName(module) + fileSuffixName;
StringBuffer codeBuffer = new StringBuffer();
// д��ע��ͷ
ModuleGeneratorHelper.writeCommentHeader(codeBuffer,
ModuleGeneratorHelper.getCresProjectExtendProperty(module).getHeadFile(),
codeFileName, module.getShortName(), new Date());
codeBuffer.append("\n");
//��Դͳ����Ϣ
List<ModuleResourceStatisticsInfo> infos = new ArrayList<ModuleResourceStatisticsInfo>();
StringBuffer resCodeBuffer = new StringBuffer();//��Դ����
//������������������
for (IARESResource iaresResource : modulesReslist) {
if(monitor.isCanceled()){
return;
}
monitor.setTaskName("�洢���̣�"+iaresResource.getFullyQualifiedName());
Procedure procedure = iaresResource.getInfo(Procedure.class);
String id = procedure.getObjectId() + "&&" + procedure.getFullyQualifiedName();
//���ɴ���ʱ��������Դ������Ϣ�������Ϣ����
Queue<IARESProblem> msg = new ArrayDeque<IARESProblem>();
if(!resCodeCache.containsKey(id)) {
resCodeCache.put(id, genProcedureCode(iaresResource,procedure,msg,context));
}
msgQueue.addAll(msg);
resCodeBuffer.append(resCodeCache.get(id));
infos.add(new ModuleResourceStatisticsInfo(procedure.getObjectId(), procedure.getName(), procedure.getChineseName(), procedure.getDescription()));
monitor.worked(1);
}
//����Ҫ�����ļ�ͷ�����Ϣ
if(ProcedureUI.isStock2Procedure()) {
codeBuffer.append("set define off;\r\n");
codeBuffer.append("set feedback off;\r\n");
codeBuffer.append("set serveroutput on;\r\n");
}
codeBuffer.append(ModuleGeneratorHelper.getResourceStatisticsInfo(infos));
codeBuffer.append("\n");
// �����ļ�¼
codeBuffer.append(RevisionHistoryGenUtil.getAllRevisionHistoryInfo(ProcedureModuleGeneratorHelper.getProcedureModuleHistorys(module), "--"));
codeBuffer.append("\n");
codeBuffer.append(resCodeBuffer);
codeBuffer.append("\n");
//д���ļ�
writeToFile(codeFileName, codeBuffer.toString(),charset);
//================================== err
String errLogFileName = "s_as_" + getModuleNameFromAutoCreateModuleName(module) + "proc.errorlog";
createErrLog(msgQueue, errLogFileName,path,charset);
}
/**
* ���ɹ���squall�ļ�
* @param monitor
* @param module
* @param path
* @throws Exception
*/
private void createModuleFile(IProgressMonitor monitor,
IARESModule module, String path,String charset,Map<Object, Object> context) throws Exception{
//��ģ����Դ
IARESResource[] moduleRes = module.getARESResources(IProcedureResType.PROCEDURE);
createProcedureFile(moduleRes, "_or.sql", monitor, module, path, charset,context,true);
if(ProcedureUI.isStock2Procedure()) {//������ģ���������
//��ģ��
IARESModule[] subModules = module.getSubModules();
List<IARESModule> subModuleLists = Arrays.asList(subModules);
Collections.sort(subModuleLists,new Comparator<IARESModule>(){//����ģ������
@Override
public int compare(IARESModule o1, IARESModule o2) {
return getModuleNameFromAutoCreateModuleName(o1).compareTo(getModuleNameFromAutoCreateModuleName(o2));
}
});
List<IARESResource> allSubModules = new ArrayList<IARESResource>();
for (IARESModule subModule : subModuleLists) {
IARESResource[] ress = subModule.getARESResources(IProcedureResType.PROCEDURE);
List<IARESResource> ressList = Arrays.asList(ress);
//����
Collections.sort(ressList,new Comparator<IARESResource>() {
@Override
public int compare(IARESResource o1, IARESResource o2) {
try {
//��ʱ��ԴΪ�洢����
Procedure p1 = o1.getInfo(Procedure.class);
Procedure p2 = o2.getInfo(Procedure.class);
return Integer.valueOf(p1.getObjectId()) - Integer.valueOf(p2.getObjectId());
} catch (ARESModelException e) {
e.printStackTrace();
return 0;
}
}
});
allSubModules.addAll(ressList);
}
if(allSubModules.size() > 0){
//��ǰģ��û����ģ�飬����Ҫ����һ�������ļ�
createProcedureFile(allSubModules.toArray(new IARESResource[0]), "_all_or.sql", monitor, module, path, charset,context,false);
}
}else {
//��ģ��������Դ��Դ���ݹ���ģ��
IARESResource[] moduleAllRes = module.getARESResources(IProcedureResType.PROCEDURE,true);
if(moduleRes.length != moduleAllRes.length) {
//��ǰģ��û����ģ�飬����Ҫ����һ�������ļ�
createProcedureFile(moduleAllRes, "_all_or.sql", monitor, module, path, charset,context,true);
}
}
}
/**
* @param iaresResource
* @param msgQueue
* @return
*/
public StringBuffer genProcedureCode(IARESResource iaresResource,Procedure procedure,
Queue<IARESProblem> msgQueue,Map<Object, Object> context) throws Exception{
StringBuffer ret = new StringBuffer();
///���Ϊ�������ţ��ԡ������ָ����Ҫ���ɶ��
String objectID = procedure.getObjectId();
if(StringUtils.isBlank(objectID)) {
String message = String.format("�洢����[(%s)%s]�����Ϊ�ա�", procedure.getName(),procedure.getChineseName());
IARESProblem problem = ARESProblem.createError();
problem.setMessage(message);
msgQueue.add(problem);
}else {
String databaseType = ProjectSettingUtil.getDatabaseType(iaresResource.getARESProject());
if(objectID.contains(",")){
String[] objIDs = objectID.split(",");
for (String objID : objIDs) {
procedure.setObjectId(objID.trim());
context.put(IProcedureEngineContextConstantOracle.ResourceModel, procedure);
if(databaseType.equalsIgnoreCase(ProjectSettingUtil.MYSQL)){
ret.append(ResourceEngin.instance.generate(
new DefaultSkeletonInput(
IProcedureSkeletonFactoryConstantMySQL.SKELETONTYPE_CRES_PROCEDURE_MYSQL,
iaresResource), context,msgQueue));
}else{
ret.append(ResourceEngin.instance.generate(
new DefaultSkeletonInput(
IProcedureSkeletonFactoryConstantOracle.SKELETONTYPE_CRES_PROCEDURE_ORACLE,
iaresResource), context,msgQueue));
}
ret.append("\r\n");
}
}else{
context.put(IProcedureEngineContextConstantOracle.ResourceModel, procedure);
if(databaseType.equalsIgnoreCase(ProjectSettingUtil.MYSQL)){
ret.append(ResourceEngin.instance.generate(
new DefaultSkeletonInput(
IProcedureSkeletonFactoryConstantMySQL.SKELETONTYPE_CRES_PROCEDURE_MYSQL,
iaresResource), context,msgQueue));
}else{
ret.append(ResourceEngin.instance.generate(
new DefaultSkeletonInput(
IProcedureSkeletonFactoryConstantOracle.SKELETONTYPE_CRES_PROCEDURE_ORACLE,
iaresResource), context,msgQueue));
}
ret.append("\r\n");
}
}
// return CodeFormater.formatProc(ret);
return ret;
}
@Override
public boolean canGenCode(IARESModule module) {
String rootName = module.getParent().getElementName();
if(StringUtils.equals(rootName, ICresUIConstant.ATOM_ROOT_NAME) || StringUtils.equals(rootName, ICresUIConstant.PROCEDURE_ROOT_NAME)){
return true;
}
return false;
}
}