Browse Source

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

* commit '506e0bc7a11f20fa94d28fa26b36e6bdbbc0dbd0':
  update
  update
  依赖下载位置
  依赖下载逻辑
  依赖下载
  所有依赖一起下载
  update
  update
  update
  远程不启动
  update
  update
  update
  update
  update
  update
  远程控制
  update
  update
  update
master
superman 8 years ago
parent
commit
7a52db10a7
  1. 31
      designer_base/src/com/fr/design/extra/PluginHelper.java
  2. 3
      designer_base/src/com/fr/design/extra/exe/InstallOnlineExecutor.java
  3. 163
      designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java
  4. 13
      designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java
  5. 23
      designer_base/src/com/fr/env/RemoteEnv.java

31
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.Env;
import com.fr.base.FRContext; import com.fr.base.FRContext;
import com.fr.design.DesignerEnvManager; 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.*;
import com.fr.general.http.HttpClient; import com.fr.general.http.HttpClient;
import com.fr.plugin.Plugin; import com.fr.plugin.Plugin;
import com.fr.plugin.PluginLoader; import com.fr.plugin.PluginLoader;
import com.fr.plugin.PluginManagerHelper; import com.fr.plugin.PluginManagerHelper;
import com.fr.plugin.dependence.PluginDependence; import com.fr.plugin.dependence.PluginDependence;
import com.fr.plugin.dependence.PluginDependenceException;
import com.fr.plugin.dependence.PluginDependenceUnit; import com.fr.plugin.dependence.PluginDependenceUnit;
import com.fr.stable.ArrayUtils; import com.fr.stable.ArrayUtils;
import com.fr.stable.EncodeConstants; import com.fr.stable.EncodeConstants;
@ -21,6 +22,7 @@ import javax.swing.*;
import java.io.*; import java.io.*;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutionException;
@ -33,6 +35,8 @@ import java.util.concurrent.ExecutionException;
public class PluginHelper { public class PluginHelper {
private static final String TEMP_PATH = System.getProperty("user.dir") + "/tmp"; 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 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"; 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(); PluginDependence dependence = plugin.getDependence();
if (dependence == null){ if (dependence == null){
return; return;
} }
List<PluginDependenceUnit> needInstallDependence = new ArrayList<PluginDependenceUnit>();
String currentID = dependence.getCurrentPluginID(); String currentID = dependence.getCurrentPluginID();
List<PluginDependenceUnit> list = dependence.getDependPlugins(); List<PluginDependenceUnit> list = dependence.getDependPlugins();
for (int i = 0;list != null && i < list.size(); i++){ for (int i = 0;list != null && i < list.size(); i++){
PluginDependenceUnit dependenceUnit = list.get(i); PluginDependenceUnit dependenceUnit = list.get(i);
if (!dependenceUnit.checkFileEnv()){ 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<PluginDependenceUnit> list) throws PluginDependenceException{
DownLoadDependenceUI ui = new DownLoadDependenceUI(currentID, list);
ui.installOnline();
}
/** /**
* 从选中的压缩文件中安装插件 * 从选中的压缩文件中安装插件
* *

3
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.design.extra.Process;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.plugin.PluginVerifyException; import com.fr.plugin.PluginVerifyException;
import com.fr.plugin.dependence.PluginDependenceException;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
import javax.swing.*; import javax.swing.*;
@ -89,6 +90,8 @@ public class InstallOnlineExecutor implements Executor {
}); });
} catch (PluginVerifyException e) { } catch (PluginVerifyException e) {
JOptionPane.showMessageDialog(null, e.getMessage(), Inter.getLocText("FR-Designer-Plugin_Warning"), JOptionPane.ERROR_MESSAGE); 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) { } catch (InterruptedException e) {
e.printStackTrace(); e.printStackTrace();
} catch (Exception e) { } catch (Exception e) {

163
designer_base/src/com/fr/design/extra/plugindependence/DownLoadDependenceUI.java

@ -1,5 +1,6 @@
package com.fr.design.extra.plugindependence; package com.fr.design.extra.plugindependence;
import com.fr.base.FRContext;
import com.fr.design.extra.PluginConstants; import com.fr.design.extra.PluginConstants;
import com.fr.design.extra.PluginHelper; import com.fr.design.extra.PluginHelper;
import com.fr.design.mainframe.DesignerContext; import com.fr.design.mainframe.DesignerContext;
@ -7,6 +8,8 @@ import com.fr.general.IOUtils;
import com.fr.general.Inter; import com.fr.general.Inter;
import com.fr.general.SiteCenter; import com.fr.general.SiteCenter;
import com.fr.general.http.HttpClient; 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.StableUtils;
import com.fr.stable.StringUtils; import com.fr.stable.StringUtils;
@ -21,7 +24,8 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.InputStream; import java.io.InputStream;
import java.net.HttpURLConnection; import java.net.HttpURLConnection;
import java.util.ArrayList;
import java.util.List;
/** /**
* Created by hufan on 2016/9/5. * Created by hufan on 2016/9/5.
*/ */
@ -43,8 +47,7 @@ public class DownLoadDependenceUI implements ActionListener {
//安装环境相关信息 //安装环境相关信息
private String currentID; private String currentID;
private String dependenceID; private List<PluginDependenceUnit> list = null;
private String dependenceDir;
//安装结果 //安装结果
private boolean result = false; private boolean result = false;
//链接服务器的客户端 //链接服务器的客户端
@ -54,13 +57,11 @@ public class DownLoadDependenceUI implements ActionListener {
//文件总长度 //文件总长度
private int totalSize = 0; private int totalSize = 0;
public DownLoadDependenceUI(String ID, String dir) { public DownLoadDependenceUI() {
} }
public DownLoadDependenceUI(String currentID, List<PluginDependenceUnit> list) {
public DownLoadDependenceUI(String currentID, String dependenceID, String dependenceDir) {
this.currentID = currentID; this.currentID = currentID;
this.dependenceID = dependenceID; this.list = list;
this.dependenceDir = dependenceDir;
this.totalSize = getFileLength(); this.totalSize = getFileLength();
init(); init();
} }
@ -89,7 +90,7 @@ public class DownLoadDependenceUI implements ActionListener {
timer = new Timer(100, this); timer = new Timer(100, this);
frame = new JDialog(DesignerContext.getDesignerFrame(), true); 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); frame.setSize(LOAD_WIDTH, LOAD_HEIGHT);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation(screenSize.width / 2 - LOAD_WIDTH / 2, screenSize.height / 2 - LOAD_HEIGHT / 2); 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() { private boolean connectToServer() {
httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceID)); for (int i = 0; i < list.size(); i++) {
return httpClient.getResponseCode() == HttpURLConnection.HTTP_OK; 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() { private int getFileLength(){
HttpClient httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceID)); int size = 0;
if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { for (int i = 0; i < list.size(); i++) {
return httpClient.getContentLength(); 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 { try {
thread.join(); thread.join();
} catch (InterruptedException e) { } catch (InterruptedException e) {
e.printStackTrace(); FRContext.getLogger().error(e.getMessage());
return false; return false;
} }
//停止时钟 //停止时钟
@ -151,55 +164,78 @@ public class DownLoadDependenceUI implements ActionListener {
return result; return result;
} }
private String downloadPluginDependenceFile() throws Exception { /**
httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceID)); * 下载和安装不分开是因为本地如果只安装好了一个依赖下次就不需要重复下载了
if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) { * 如果下载依赖后不安装则后面的插件会把前面的插件覆盖故而下载好了一个安装一个
InputStream reader = httpClient.getResponseStream(); * @return
String temp = StableUtils.pathJoin(PluginHelper.DOWNLOAD_PATH, PluginHelper.TEMP_FILE); * @throws Exception
StableUtils.makesureFileExist(new File(temp)); */
FileOutputStream writer = new FileOutputStream(temp); private void downloadAndInstallPluginDependenceFile() throws Exception {
byte[] buffer = new byte[PluginConstants.BYTES_NUM]; totalBytesRead = 0;
int bytesRead = 0; for (int i = 0; i < list.size(); i++) {
totalBytesRead = 0; PluginDependenceUnit dependenceUnit = list.get(i);
httpClient = new HttpClient(SiteCenter.getInstance().acquireUrlByKind(dependenceUnit.getDependenceID()));
while ((bytesRead = reader.read(buffer)) > 0 && flag) { if (httpClient.getResponseCode() == HttpURLConnection.HTTP_OK) {
writer.write(buffer, 0, bytesRead); InputStream reader = httpClient.getResponseStream();
buffer = new byte[PluginConstants.BYTES_NUM]; String temp = StableUtils.pathJoin(PluginHelper.DEPENDENCE_DOWNLOAD_PATH, PluginHelper.TEMP_FILE);
totalBytesRead += bytesRead; StableUtils.makesureFileExist(new File(temp));
} FileOutputStream writer = new FileOutputStream(temp);
reader.close(); byte[] buffer = new byte[PluginConstants.BYTES_NUM];
writer.flush(); int bytesRead = 0;
writer.close(); 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());
//下载被取消 } else {
if (flag == false) {
result = false; 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() { public void installDependenceOnline() {
try { try {
String filePath = downloadPluginDependenceFile(); //下载并安装文件
if (!StringUtils.EMPTY.equals(filePath)) { downloadAndInstallPluginDependenceFile();
//安装文件
installPluginDependenceFile(filePath);
result = true;
}
} catch (Exception e) { } 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<String> 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) { public void actionPerformed(ActionEvent e) {
@ -214,23 +250,22 @@ public class DownLoadDependenceUI implements ActionListener {
} }
} }
public boolean installOnline() { public void installOnline()throws PluginDependenceException {
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); 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 (choose == 0) {//下载安装
if (!connectToServer()) { if (!connectToServer()) {
JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Connect_Server_Error"), "alert", JOptionPane.ERROR_MESSAGE); //JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Connect_Server_Error"), "alert", JOptionPane.ERROR_MESSAGE);
return false; throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Connect_Server_Error"));
} }
//安装依赖环境 //安装依赖环境
if (install()) { if (install()) {
JOptionPane.showMessageDialog(null, dependenceID + Inter.getLocText("FR-Designer-Dependence_Install_Succeed") + "!!"); JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Install_Succeed") + "!!");
return true;
} else { } else {
JOptionPane.showMessageDialog(null, dependenceID + Inter.getLocText("FR-Designer-Dependence_Install_Failed") + "!!", "alert", JOptionPane.ERROR_MESSAGE); //JOptionPane.showMessageDialog(null, Inter.getLocText("FR-Designer-Dependence_Install_Failed") + "!!", "alert", JOptionPane.ERROR_MESSAGE);
return false; throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed"));
} }
} else {//不安装。无需为用户准备环境 }else {//不选择下载,则不安装图标插件
return true; throw new PluginDependenceException(Inter.getLocText("FR-Designer-Dependence_Install_Failed"));
} }
} }

13
designer_base/src/com/fr/design/extra/plugindependence/PluginDependenceUtils.java

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

23
designer_base/src/com/fr/env/RemoteEnv.java vendored

@ -31,6 +31,8 @@ import com.fr.plugin.Plugin;
import com.fr.plugin.PluginLicense; import com.fr.plugin.PluginLicense;
import com.fr.plugin.PluginLicenseManager; import com.fr.plugin.PluginLicenseManager;
import com.fr.plugin.PluginLoader; 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.*;
import com.fr.stable.file.XMLFileManagerProvider; import com.fr.stable.file.XMLFileManagerProvider;
import com.fr.stable.project.ProjectConstants; 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<String, String> para = new HashMap<String, String>();
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 @Override
public void checkAndRegisterLic(FileNode node, Plugin plugin) throws Exception { public void checkAndRegisterLic(FileNode node, Plugin plugin) throws Exception {
} }
} }
Loading…
Cancel
Save