Browse Source

Merge pull request #306 in BA/design from ~XIAOHU/design:dev to dev

* commit 'b5502d16c1935f860036a2b28c27bca1b181957f': (22 commits)
  update
  update
  update
  update
  update
  update
  update
  插件依赖
  下载依赖的通道
  update
  update
  插件依赖
  update
  update
  从配置文件中控制是否需要检测插件依赖环境
  update
  phantomjs
  phantomjs
  update
  update
  ...
master
superman 8 years ago
parent
commit
19541e82cc
  1. 22
      designer_base/src/com/fr/design/extra/PluginHelper.java
  2. 1
      designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java
  3. 240
      designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java
  4. 13
      designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java
  5. BIN
      designer_base/src/com/fr/design/extra/plugindependence/image/background.png

22
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<PluginDependenceUnit> 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());
}
}
}
/**
* 从选中的压缩文件中安装插件
*

1
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<String> process) {
//下载插件
if(StringUtils.isBlank(DesignerEnvManager.getEnvManager().getBBSName())){
LoginCheckContext.fireLoginCheckListener();
}

240
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) + "";
}
}

13
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();
}
}

BIN
designer_base/src/com/fr/design/extra/plugindependence/image/background.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 105 KiB

Loading…
Cancel
Save