diff --git a/designer_base/src/com/fr/design/extra/PluginHelper.java b/designer_base/src/com/fr/design/extra/PluginHelper.java index 8bab17e68e..c5785d8888 100644 --- a/designer_base/src/com/fr/design/extra/PluginHelper.java +++ b/designer_base/src/com/fr/design/extra/PluginHelper.java @@ -3,11 +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.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.PluginDependenceUnit; import com.fr.stable.ArrayUtils; import com.fr.stable.EncodeConstants; import com.fr.stable.StableUtils; @@ -19,6 +22,7 @@ import java.io.*; import java.net.HttpURLConnection; import java.net.URLDecoder; import java.util.HashMap; +import java.util.List; import java.util.concurrent.ExecutionException; /** @@ -105,6 +109,8 @@ public class PluginHelper { plugin = new Plugin(); InputStream inputStream = plugin.readEncryptXml(new FileInputStream(f)); XMLTools.readInputStreamXML(plugin, inputStream); + //检查是否需要准备插件依赖环境 + checkDependenceEnv(plugin); if (!plugin.isValidate()) { return null; } @@ -117,6 +123,22 @@ public class PluginHelper { return plugin; } + //将所有未配置好的资源文件依赖准备好 + private static void checkDependenceEnv(Plugin plugin) { + PluginDependence dependence = plugin.getDependence(); + if (dependence == null){ + return; + } + 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()); + } + } + } + /** * 从选中的压缩文件中安装插件 * 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 70509575de..0844a71100 100644 --- a/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java +++ b/designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java @@ -40,6 +40,7 @@ public class InstallOnlineExecutor implements Executor { @Override public void run(final Process process) { + //下载插件 if(StringUtils.isBlank(DesignerEnvManager.getEnvManager().getBBSName())){ LoginCheckContext.fireLoginCheckListener(); } diff --git a/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java b/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java new file mode 100644 index 0000000000..514d535d81 --- /dev/null +++ b/designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java @@ -0,0 +1,240 @@ +package com.fr.design.extra.plugindependence; + +import com.fr.design.extra.PluginConstants; +import com.fr.design.extra.PluginHelper; +import com.fr.design.mainframe.DesignerContext; +import com.fr.general.IOUtils; +import com.fr.general.Inter; +import com.fr.general.SiteCenter; +import com.fr.general.http.HttpClient; +import com.fr.stable.StableUtils; +import com.fr.stable.StringUtils; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.net.HttpURLConnection; + +/** + * Created by hufan on 2016/9/5. + */ +public class DownLoadDependenceUI implements ActionListener { + //进度显示界面 + private JDialog frame = null; + //进度条 + private JProgressBar progressbar; + //进度信息 + private JLabel label; + //进度条更新时钟 + private Timer timer; + //是否继续下载 + private boolean flag = true; + + // 定义加载窗口大小 + private final int LOAD_WIDTH = 455; + private final int LOAD_HEIGHT = 295; + + //安装环境相关信息 + private String currentID; + private String dependenceID; + private String dependenceDir; + //安装结果 + private boolean result = false; + //链接服务器的客户端 + private HttpClient httpClient; + //已读文件字节数 + private int totalBytesRead = 0; + //文件总长度 + private int totalSize = 0; + + public DownLoadDependenceUI(String ID, String dir) { + } + + public DownLoadDependenceUI(String currentID, String dependenceID, String dependenceDir) { + this.currentID = currentID; + this.dependenceID = dependenceID; + this.dependenceDir = dependenceDir; + this.totalSize = getFileLength(); + init(); + } + + private void init() { + // 创建标签,并在标签上放置一张图片 + BufferedImage image = IOUtils.readImage("/com/fr/design/extra/plugindependence/image/background.png"); + ImageIcon imageIcon = new ImageIcon(image); + label = new JLabel(imageIcon); + label.setBounds(0, 0, LOAD_WIDTH, LOAD_HEIGHT - 15); + + progressbar = new JProgressBar(); + // 显示当前进度值信息 + progressbar.setStringPainted(true); + // 设置进度条边框不显示 + progressbar.setBorderPainted(false); + // 设置进度条的前景色 + progressbar.setForeground(new Color(0x38aef5)); + // 设置进度条的背景色 + progressbar.setBackground(new Color(188, 190, 194)); + progressbar.setBounds(0, LOAD_HEIGHT - 15, LOAD_WIDTH, 15); + progressbar.setMinimum(0); + progressbar.setMaximum(totalSize); + progressbar.setValue(0); + + timer = new Timer(100, this); + + frame = new JDialog(DesignerContext.getDesignerFrame(), true); + frame.setTitle(Inter.getLocText("FR-Designer-Dependence_Install_Online") + dependenceID); + 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); + frame.setResizable(false); + // 设置布局为空 + frame.setLayout(new BorderLayout(0, 0)); + frame.getContentPane().add(label, BorderLayout.CENTER); + frame.getContentPane().add(progressbar, BorderLayout.SOUTH); + + frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); + frame.addWindowListener(new WindowAdapter() { + public void windowClosing(WindowEvent e) { + //取消下载 + flag = false; + frame.dispose(); + } + }); + } + + + //是否可以连接服务器 + private boolean connectToServer() { + httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceID)); + return httpClient.getResponseCode() == HttpURLConnection.HTTP_OK; + } + + //获取依赖文件大小 + private int getFileLength() { + HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceID)); + if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { + return httpClient.getContentLength(); + } + return -1; + } + + //安装 + private boolean install() { + //开始时钟 + timer.start(); + //开始下载 + Thread thread = new Thread(new Runnable() { + @Override + public void run() { + installDependenceOnline(); + } + }); + thread.start(); + + frame.setVisible(true); + //等待下载线程处理结束 + try { + thread.join(); + } catch (InterruptedException e) { + e.printStackTrace(); + return false; + } + //停止时钟 + timer.stop(); + 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(); + + //下载被取消 + if (flag == false) { + result = false; + return StringUtils.EMPTY; + } + return temp; + + } else { + result = false; + throw new com.fr.plugin.PluginVerifyException(Inter.getLocText("FR-Designer-Plugin_Connect_Server_Error")); + } + } + + public void installDependenceOnline() { + try { + String filePath = downloadPluginDependenceFile(); + if (!StringUtils.EMPTY.equals(filePath)) { + //安装文件 + installPluginDependenceFile(filePath); + result = true; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + //安装已经下载好的文件 + private void installPluginDependenceFile(String filePath) { + IOUtils.unzip(new File(filePath), dependenceDir); + } + + public void actionPerformed(ActionEvent e) { + if (e.getSource() == timer) { + int value = progressbar.getValue(); + if (value < totalSize) { + progressbar.setValue(totalBytesRead); + } else { + timer.stop(); + frame.dispose(); + } + } + } + + public boolean installOnline() { + int choose = JOptionPane.showConfirmDialog(null, Inter.getLocText("FR-Designer-Plugin_Plugin") + currentID + Inter.getLocText("Need") + dependenceID + Inter.getLocText("Support") + "," + Inter.getLocText("Need_Install") + dependenceID + "(" + 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; + } + //安装依赖环境 + if (install()) { + JOptionPane.showMessageDialog(null, dependenceID + Inter.getLocText("FR-Designer-Dependence_Install_Succeed") + "!!"); + return true; + } else { + JOptionPane.showMessageDialog(null, dependenceID + Inter.getLocText("FR-Designer-Dependence_Install_Failed") + "!!", "alert", JOptionPane.ERROR_MESSAGE); + return false; + } + } else {//不安装。无需为用户准备环境 + return true; + } + } + + private String showFileLength() { + return totalSize == -1 ? "NAN" : totalSize / Math.pow(10, 6) + ""; + } +} diff --git a/designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java b/designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java new file mode 100644 index 0000000000..bb930f111b --- /dev/null +++ b/designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java @@ -0,0 +1,13 @@ +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/design/extra/plugindependence/image/background.png b/designer_base/src/com/fr/design/extra/plugindependence/image/background.png new file mode 100644 index 0000000000..45bf328e33 Binary files /dev/null and b/designer_base/src/com/fr/design/extra/plugindependence/image/background.png differ