/** * <p>Copyright: Copyright (c) 2013</p> * <p>Company: �������ӹɷ����޹�˾</p> */ package com.hundsun.ares.studio.procedure.compiler.oracle.token; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.script.Invocable; import javax.script.ScriptContext; import javax.script.ScriptEngine; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.StringUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IResource; import com.hundsun.ares.studio.core.ARESCore; import com.hundsun.ares.studio.core.ARESModelException; import com.hundsun.ares.studio.core.IARESProject; import com.hundsun.ares.studio.core.IARESProjectProperty; import com.hundsun.ares.studio.core.IARESResource; import com.hundsun.ares.studio.core.model.util.RevisionHistoryUtil; import com.hundsun.ares.studio.core.scripting.AresScriptEngineManager; import com.hundsun.ares.studio.core.service.DataServiceManager; import com.hundsun.ares.studio.engin.token.ICodeToken; import com.hundsun.ares.studio.jres.basicdata.core.basicdata.BasicDataBaseModel; import com.hundsun.ares.studio.jres.database.oracle.constant.IOracleResType; import com.hundsun.ares.studio.jres.database.oracle.service.IOracleDBService; import com.hundsun.ares.studio.jres.database.oracle.service.IOracleSpace; import com.hundsun.ares.studio.jres.database.oracle.service.ITableSpace; import com.hundsun.ares.studio.jres.script.engin.ScriptUtils; import com.hundsun.ares.studio.procdure.Procedure; import com.hundsun.ares.studio.procdure.constants.IProcedureConstant; import com.hundsun.ares.studio.procedure.compiler.oracle.constant.IProcedureEngineContextConstantOracle; /** * ������д�����ݿ�sql�ű� * <br>�˴�����Ҳ�����⴦���������ע�� * * @author qinyuan * */ public class ProcedureIntoHsobjectToken implements ICodeToken { IARESResource resource; public ProcedureIntoHsobjectToken(IARESResource resource){ this.resource = resource; } /* (non-Javadoc) * @see com.hundsun.ares.studio.engin.token.ICodeToken#getContent() */ @Override public String getContent() { // TODO Auto-generated method stub return null; } /* (non-Javadoc) * @see com.hundsun.ares.studio.engin.token.ICodeToken#getType() */ @Override public int getType() { // TODO Auto-generated method stub return 0; } /* (non-Javadoc) * @see com.hundsun.ares.studio.engin.token.ICodeToken#genCode(java.util.Map) */ @Override public String genCode(Map<Object, Object> context) throws Exception { Procedure procedure = (Procedure) context.get(IProcedureEngineContextConstantOracle.ResourceModel); if(StringUtils.isBlank(procedure.getDatabase())){ throw new Exception("���ݿⲻ��Ϊ�գ�"); } //�ű��ļ� IARESResource jsResource = getJSResource(); //����ʹ�ð󶨵Ľű�ʵ�� if(jsResource != null) { return genCodeByScript(context,jsResource); } IOracleDBService oracleService = DataServiceManager.getInstance().getService((IARESProject)context.get(IProcedureEngineContextConstantOracle.Aresproject), IOracleDBService.class); String dbuser = StringUtils.EMPTY; //2014��5��13��13:47:37 ֤ȯ������Ҫʹ�ù������ƣ���ԭ�����������߱���һ�£����Թ�������ֻ��֤ȯ������չ����չʾ String english = StringUtils.isNotBlank(procedure.getProcName())?procedure.getProcName():procedure.getName(); String objId = procedure.getObjectId(); String dbName = procedure.getDatabase(); String version = StringUtils.defaultIfBlank(RevisionHistoryUtil.getMaxVersion(procedure.getHistories()), "1.0.0.0"); try{ IOracleSpace os = oracleService.getSpace(IOracleResType.Space); if (os != null) { ITableSpace ts = os.getTableSpace(procedure.getDatabase()); if (ts != null) { dbuser = ts.getUser(); if(StringUtils.isNotBlank(dbuser)){ dbuser += "."; } } } }catch(Exception e){ e.printStackTrace(); } List<String> params = new ArrayList<String>(); for(String v : StringUtils.split(version, "\\.")){ params.add(v); } StringBuffer sb = new StringBuffer(); sb.append("begin\r\n"); sb.append(String.format("DELETE %1$shsobjects WHERE object_name = \'", dbuser)); sb.append(english); sb.append("\' AND object_type = \'P\';\r\n"); sb.append(String.format("INSERT into %1$shsobjects (\r\n",dbuser)); sb.append("\t\tobject_id, object_name, own_base, object_type,\r\n"); sb.append("\t\t master_ver, second_ver, third_ver, build_ver)\r\n"); sb.append("\tvalues (\r\n"); sb.append("\t\t" + objId + ","); sb.append("\t\t" + english + ","); sb.append("\t\t" + dbName + ","); sb.append("\t\t\'P\',\r\n"); if(params.size() == 4){ for (int i = 0; i < params.size(); i++) { sb.append("\t\t" + params.get(i)); if(i < params.size() - 1){ sb.append(","); } } }else { sb.append("\t\t1,"); sb.append("\t\t0,"); sb.append("\t\t0,"); sb.append("\t\t0"); } sb.append(");\r\n"); sb.append("end;\r\n"); sb.append("/\r\n"); return sb.toString(); } //ͨ����ȡ�̶��ű�������ʵ�����մ��� private String genCodeByScript(Map<Object, Object> context,IARESResource jsResource) { StringBuffer ret = new StringBuffer(); IOracleDBService oracleService = DataServiceManager.getInstance().getService((IARESProject)context.get(IProcedureEngineContextConstantOracle.Aresproject), IOracleDBService.class); //����ģ�� Procedure procedure = (Procedure) context.get(IProcedureEngineContextConstantOracle.ResourceModel); String dbuser = StringUtils.EMPTY; String version = StringUtils.defaultIfBlank(RevisionHistoryUtil.getMaxVersion(procedure.getHistories()), StringUtils.EMPTY); try{ IOracleSpace os = oracleService.getSpace(IOracleResType.Space); if (os != null) { ITableSpace ts = os.getTableSpace(procedure.getDatabase()); if (ts != null) { dbuser = ts.getUser(); } } }catch(Exception e){ e.printStackTrace(); } //��ȡ�ű����� ScriptEngine engine = AresScriptEngineManager.getScriptEngineManager().getEngineByName(ARESCore.SCRIPT_ENGINE_NAME); InputStream stream = null; try { stream = jsResource.openStream(); String script = null; IResource jsRes = jsResource.getResource(); if (jsRes instanceof IFile) { script = IOUtils.toString(stream, ((IFile) jsRes).getCharset()); } else { script = IOUtils.toString(stream, "UTF-8"); } // ����Ĭ�Ͻű������� Map<String, Object> defaultContext = ScriptUtils.createDefaultScriptContext(ScriptUtils.MODE_EDITOR_BUTTON,jsResource, resource,procedure, getClass().getClassLoader()); defaultContext.put("dbuser", dbuser); defaultContext.put("version", version); defaultContext.put("procedure", procedure); engine.setBindings(ScriptUtils.toScriptBindings(defaultContext), ScriptContext.ENGINE_SCOPE); engine.eval(script); //ִ�нű����� ret.append(((Invocable) engine).invokeFunction("genCodeEnd",defaultContext)); }catch (Exception e) { e.printStackTrace(); } finally { IOUtils.closeQuietly(stream); } return ret.toString(); } /** * ��ȡָ���Ľű��ļ� * @return * �����ڷ���null */ private IARESResource getJSResource() { try { IARESProjectProperty property = resource.getARESProject().getProjectProperty(); String fileName = property.getString(IProcedureConstant.PROC_REG_HSOBJECT_DIR); if (StringUtils.isNotBlank(fileName)) { IFile file = resource.getARESProject().getProject().getFile(fileName); return (IARESResource) ARESCore.create(file); } } catch (ARESModelException e) { e.printStackTrace(); } return null; // IFile file = resource.getARESProject().getProject().getFile("tools/Stock2/proc_gencode.js"); // if(file.isAccessible()) { // return (IARESResource) ARESCore.create(file); // } // return null; } }