diff --git a/designer_base/src/com/fr/design/extra/PluginHelper.java b/designer_base/src/com/fr/design/extra/PluginHelper.java index c5785d8888..5d0c9fa1a9 100644 --- a/designer_base/src/com/fr/design/extra/PluginHelper.java +++ b/designer_base/src/com/fr/design/extra/PluginHelper.java @@ -3,13 +3,14 @@ package com.fr.design.extra; import com.fr.base.Env; import com.fr.base.FRContext; import com.fr.design.DesignerEnvManager; -import com.fr.design.extra.plugindependence.PluginDependenceUtils; +import com.fr.design.extra.plugindependence.DownLoadDependenceUI; import com.fr.general.*; import com.fr.general.http.HttpClient; import com.fr.plugin.Plugin; import com.fr.plugin.PluginLoader; import com.fr.plugin.PluginManagerHelper; import com.fr.plugin.dependence.PluginDependence; +import com.fr.plugin.dependence.PluginDependenceException; import com.fr.plugin.dependence.PluginDependenceUnit; import com.fr.stable.ArrayUtils; import com.fr.stable.EncodeConstants; @@ -21,6 +22,7 @@ import javax.swing.*; import java.io.*; import java.net.HttpURLConnection; import java.net.URLDecoder; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.ExecutionException; @@ -33,6 +35,8 @@ import java.util.concurrent.ExecutionException; public class PluginHelper { private static final String TEMP_PATH = System.getProperty("user.dir") + "/tmp"; public static final String DOWNLOAD_PATH = System.getProperty("user.dir") + "/download"; + //插件依赖的下载位置 + public static final String DEPENDENCE_DOWNLOAD_PATH = System.getProperty("user.dir") + "/download/dependence"; public static final String TEMP_FILE = "temp.zip"; /** @@ -124,21 +128,42 @@ public class PluginHelper { } //将所有未配置好的资源文件依赖准备好 - private static void checkDependenceEnv(Plugin plugin) { + private static void checkDependenceEnv(Plugin plugin) throws PluginDependenceException { PluginDependence dependence = plugin.getDependence(); if (dependence == null){ return; } + + List needInstallDependence = new ArrayList(); + String currentID = dependence.getCurrentPluginID(); List list = dependence.getDependPlugins(); for (int i = 0;list != null && i < list.size(); i++){ PluginDependenceUnit dependenceUnit = list.get(i); if (!dependenceUnit.checkFileEnv()){ - PluginDependenceUtils.installDependenceOnline(currentID, dependenceUnit.getDependenceID(), dependenceUnit.getFileDir()); + needInstallDependence.add(dependenceUnit); } } + + if (needInstallDependence.isEmpty()){ + return; + } + + //安装插件依赖 + installDependenceOnline(currentID, needInstallDependence); } + + /** + * 构造一个下载UI + * @param currentID + * @param list + * @throws PluginDependenceException + */ + private static void installDependenceOnline(String currentID, List list) throws PluginDependenceException{ + DownLoadDependenceUI ui = new DownLoadDependenceUI(currentID, list); + ui.installOnline(); + } /** * 从选中的压缩文件中安装插件 * diff --git a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java index 0844a71100..53fc738ad5 100644 --- a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java @@ -9,6 +9,7 @@ import com.fr.design.extra.PluginHelper; import com.fr.design.extra.Process; import com.fr.general.Inter; import com.fr.plugin.PluginVerifyException; +import com.fr.plugin.dependence.PluginDependenceException; import com.fr.stable.StringUtils; import javax.swing.*; @@ -89,6 +90,8 @@ public class InstallOnlineExecutor implements Executor { }); } catch (PluginVerifyException e) { JOptionPane.showMessageDialog(null, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); + } catch (PluginDependenceException e){ + JOptionPane.showMessageDialog(null, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); } catch (InterruptedException e) { e.printStackTrace(); } catch (Exception e) { diff --git a/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java b/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java index 6c9555649d..5b0de740c7 100644 --- a/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java +++ b/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java @@ -1,5 +1,6 @@ package com.fr.design.extra.plugindependence; +import com.fr.base.FRContext; import com.fr.design.extra.PluginConstants; import com.fr.design.extra.PluginHelper; import com.fr.design.mainframe.DesignerContext; @@ -7,6 +8,8 @@ import com.fr.general.IOUtils; import com.fr.general.Inter; import com.fr.general.SiteCenter; import com.fr.general.http.HttpClient; +import com.fr.plugin.dependence.PluginDependenceException; +import com.fr.plugin.dependence.PluginDependenceUnit; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -21,7 +24,8 @@ import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.net.HttpURLConnection; - +import java.util.ArrayList; +import java.util.List; /** * Created by hufan on 2016/9/5. */ @@ -43,8 +47,7 @@ public class DownLoadDependenceUI implements ActionListener { //安装环境相关信息 private String currentID; - private String dependenceID; - private String dependenceDir; + private List list = null; //安装结果 private boolean result = false; //链接服务器的客户端 @@ -54,13 +57,11 @@ public class DownLoadDependenceUI implements ActionListener { //文件总长度 private int totalSize = 0; - public DownLoadDependenceUI(String ID, String dir) { + public DownLoadDependenceUI() { } - - public DownLoadDependenceUI(String currentID, String dependenceID, String dependenceDir) { + public DownLoadDependenceUI(String currentID, List list) { this.currentID = currentID; - this.dependenceID = dependenceID; - this.dependenceDir = dependenceDir; + this.list = list; this.totalSize = getFileLength(); init(); } @@ -89,7 +90,7 @@ public class DownLoadDependenceUI implements ActionListener { timer = new Timer(100, this); frame = new JDialog(DesignerContext.getDesignerFrame(), true); - frame.setTitle(Inter.getLocText("FR-Designer-Dependence_Install_Online") + dependenceID); + frame.setTitle(Inter.getLocText("FR-Designer-Dependence_Install_Online")); frame.setSize(LOAD_WIDTH, LOAD_HEIGHT); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation(screenSize.width / 2 - LOAD_WIDTH / 2, screenSize.height / 2 - LOAD_HEIGHT / 2); @@ -112,17 +113,29 @@ public class DownLoadDependenceUI implements ActionListener { //是否可以连接服务器 private boolean connectToServer() { - httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceID)); - return httpClient.getResponseCode() == HttpURLConnection.HTTP_OK; + for (int i = 0; i < list.size(); i++) { + PluginDependenceUnit dependenceUnit = list.get(i); + httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceUnit.getDependenceID())); + if (httpClient.getResponseCode() != HttpURLConnection.HTTP_OK){ + return false; + } + } + return true; } //获取依赖文件大小 - private int getFileLength() { - HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceID)); - if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - return httpClient.getContentLength(); + private int getFileLength(){ + int size = 0; + for (int i = 0; i < list.size(); i++) { + PluginDependenceUnit dependenceUnit = list.get(i); + HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceUnit.getDependenceID())); + if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { + size += httpClient.getContentLength(); + }else { + return -1; + } } - return -1; + return size; } //安装 @@ -143,7 +156,7 @@ public class DownLoadDependenceUI implements ActionListener { try { thread.join(); } catch (InterruptedException e) { - e.printStackTrace(); + FRContext.getLogger().error(e.getMessage()); return false; } //停止时钟 @@ -151,55 +164,78 @@ public class DownLoadDependenceUI implements ActionListener { return result; } - private String downloadPluginDependenceFile() throws Exception { - httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceID)); - if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { - InputStream reader = httpClient.getResponseStream(); - String temp = StableUtils.pathJoin(PluginHelper.DOWNLOAD_PATH, PluginHelper.TEMP_FILE); - StableUtils.makesureFileExist(new File(temp)); - FileOutputStream writer = new FileOutputStream(temp); - byte[] buffer = new byte[PluginConstants.BYTES_NUM]; - int bytesRead = 0; - totalBytesRead = 0; - - while ((bytesRead = reader.read(buffer)) > 0 && flag) { - writer.write(buffer, 0, bytesRead); - buffer = new byte[PluginConstants.BYTES_NUM]; - totalBytesRead += bytesRead; - } - reader.close(); - writer.flush(); - writer.close(); + /** + * 下载和安装不分开是因为,本地如果只安装好了一个依赖,下次就不需要重复下载了 + * 如果下载依赖后不安装,则后面的插件会把前面的插件覆盖,故而下载好了一个安装一个 + * @return + * @throws Exception + */ + private void downloadAndInstallPluginDependenceFile() throws Exception { + totalBytesRead = 0; + for (int i = 0; i < list.size(); i++) { + PluginDependenceUnit dependenceUnit = list.get(i); + httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceUnit.getDependenceID())); + if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { + InputStream reader = httpClient.getResponseStream(); + String temp = StableUtils.pathJoin(PluginHelper.DEPENDENCE_DOWNLOAD_PATH, PluginHelper.TEMP_FILE); + StableUtils.makesureFileExist(new File(temp)); + FileOutputStream writer = new FileOutputStream(temp); + byte[] buffer = new byte[PluginConstants.BYTES_NUM]; + int bytesRead = 0; + while ((bytesRead = reader.read(buffer)) > 0 && flag) { + writer.write(buffer, 0, bytesRead); + buffer = new byte[PluginConstants.BYTES_NUM]; + totalBytesRead += bytesRead; + } + reader.close(); + writer.flush(); + writer.close(); + + //下载被取消 + if (flag == false) { + result = false; + throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed")); + } + + //安装文件 + IOUtils.unzip(new File(temp), FRContext.getCurrentEnv().getPath() + dependenceUnit.getDependenceDir()); - //下载被取消 - if (flag == false) { + } else { result = false; - return StringUtils.EMPTY; + throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed")); } - return temp; - - } else { - result = false; - throw new com.fr.plugin.PluginVerifyException(Inter.getLocText("FR-Designer-Plugin_Connect_Server_Error")); } + //所有依赖都正常安装下载完毕,则结果为true + result = true; } public void installDependenceOnline() { try { - String filePath = downloadPluginDependenceFile(); - if (!StringUtils.EMPTY.equals(filePath)) { - //安装文件 - installPluginDependenceFile(filePath); - result = true; - } + //下载并安装文件 + downloadAndInstallPluginDependenceFile(); } catch (Exception e) { - e.printStackTrace(); + result = false; + FRContext.getLogger().error(e.getMessage()); } } - //安装已经下载好的文件 - private void installPluginDependenceFile(String filePath) { - IOUtils.unzip(new File(filePath), dependenceDir); + //安装已经下载好的文件,如果是服务文件,则需要复制一份到安装目录下, + //以便切换远程时,使用本地的服务 + //如果是服务器环境,则只会安装一份 + private void installPluginDependenceFile(List filePathList){ + if (filePathList.isEmpty()){ + result = false; + return; + } + for(int i = 0; i < filePathList.size(); i++) { + if (StringUtils.EMPTY.equals(filePathList.get(i))){ + result = false; + return; + } + PluginDependenceUnit dependenceUnit = list.get(i); + IOUtils.unzip(new File(filePathList.get(i)), FRContext.getCurrentEnv().getPath() + dependenceUnit.getDependenceDir()); + result = true; + } } public void actionPerformed(ActionEvent e) { @@ -214,23 +250,22 @@ public class DownLoadDependenceUI implements ActionListener { } } - public boolean installOnline() { - int choose = JOptionPane.showConfirmDialog(null, Inter.getLocText("FR-Designer-Plugin_Plugin") + currentID + Inter.getLocText("FR-Designer-Need") + " " + dependenceID + " " + Inter.getLocText("FR-Designer-Support") + "," + Inter.getLocText("FR-Designer-Dependence_Need_Install") + " " + dependenceID + " " + "(" + showFileLength() + " m)?", "install tooltip", JOptionPane.YES_NO_OPTION); + public void installOnline()throws PluginDependenceException { + int choose = JOptionPane.showConfirmDialog(null, Inter.getLocText("FR-Designer-Plugin_Plugin") + Inter.getLocText("FR-Designer-Need") + Inter.getLocText("FR-Designer-Dependence") + Inter.getLocText("FR-Designer-Support") + "," + Inter.getLocText("FR-Designer-Dependence_Need_Install") + "(" + showFileLength() + " m)?", "install tooltip", JOptionPane.YES_NO_OPTION); if (choose == 0) {//下载安装 if (!connectToServer()) { - JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Connect_Server_Error"), "alert", JOptionPane.ERROR_MESSAGE); - return false; + //JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Connect_Server_Error"), "alert", JOptionPane.ERROR_MESSAGE); + throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Connect_Server_Error")); } //安装依赖环境 if (install()) { - JOptionPane.showMessageDialog(null, dependenceID + Inter.getLocText("FR-Designer-Dependence_Install_Succeed") + "!!"); - return true; + JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Install_Succeed") + "!!"); } else { - JOptionPane.showMessageDialog(null, dependenceID + Inter.getLocText("FR-Designer-Dependence_Install_Failed") + "!!", "alert", JOptionPane.ERROR_MESSAGE); - return false; + //JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Install_Failed") + "!!", "alert", JOptionPane.ERROR_MESSAGE); + throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed")); } - } else {//不安装。无需为用户准备环境 - return true; + }else {//不选择下载,则不安装图标插件 + throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed")); } } diff --git a/designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java b/designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java deleted file mode 100644 index bb930f111b..0000000000 --- a/designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.fr.design.extra.plugindependence; - -/** - * Created by hufan on 2016/8/31. - */ - - -public class PluginDependenceUtils { - public static boolean installDependenceOnline(String currentID, String dependenceID, String dependenceDir) { - DownLoadDependenceUI ui = new DownLoadDependenceUI(currentID, dependenceID, dependenceDir); - return ui.installOnline(); - } -} diff --git a/designer_base/src/com/fr/env/RemoteEnv.java b/designer_base/src/com/fr/env/RemoteEnv.java index a779026eab..6aff74d7ca 100644 --- a/designer_base/src/com/fr/env/RemoteEnv.java +++ b/designer_base/src/com/fr/env/RemoteEnv.java @@ -31,6 +31,8 @@ import com.fr.plugin.Plugin; import com.fr.plugin.PluginLicense; import com.fr.plugin.PluginLicenseManager; import com.fr.plugin.PluginLoader; +import com.fr.plugin.dependence.PluginServiceCreator; +import com.fr.plugin.dependence.PluginServiceManager; import com.fr.stable.*; import com.fr.stable.file.XMLFileManagerProvider; import com.fr.stable.project.ProjectConstants; @@ -2079,7 +2081,28 @@ public class RemoteEnv implements Env { } } + @Override + public String pluginServiceAction(String serviceID, String req) throws Exception { + HashMap para = new HashMap(); + para.put("op", "fr_remote_design"); + para.put("cmd", "design_get_plugin_service_data"); + para.put("serviceID", serviceID); + para.put("req", req); + HttpClient client = createHttpMethod(para); //jim :加上user,远程设计点击预览时传递用户角色信息 + InputStream inputStream = execute4InputStream(client); + return IOUtils.inputStream2String(inputStream); + } + + /** + * 远程不启动,使用虚拟服务 + * @param serviceID + */ + @Override + public void pluginServiceStart(String serviceID){ + } + @Override public void checkAndRegisterLic(FileNode node, Plugin plugin) throws Exception { + } } \ No newline at end of file