lemon
3 months ago
61 changed files with 691 additions and 3163 deletions
@ -0,0 +1,198 @@ |
|||||||
|
package com.fr.design.data.datapane.preview; |
||||||
|
|
||||||
|
import com.fr.base.DataSetProcessors; |
||||||
|
import com.fr.base.Parameter; |
||||||
|
import com.fr.base.ParameterHelper; |
||||||
|
import com.fr.base.ParameterTypeHandler; |
||||||
|
import com.fr.base.StoreProcedureParameter; |
||||||
|
import com.fr.base.TableData; |
||||||
|
import com.fr.data.impl.Connection; |
||||||
|
import com.fr.data.impl.DBTableData; |
||||||
|
import com.fr.data.impl.NameDatabaseConnection; |
||||||
|
import com.fr.data.impl.storeproc.StoreProcedure; |
||||||
|
import com.fr.decision.fun.UniversalServerTableDataProvider; |
||||||
|
import com.fr.decision.webservice.bean.dataset.ParameterBean; |
||||||
|
import com.fr.decision.webservice.bean.dataset.ParameterExternal; |
||||||
|
import com.fr.decision.webservice.bean.dataset.SQLDataSetBean; |
||||||
|
import com.fr.decision.webservice.bean.dataset.ServerDataSetBean; |
||||||
|
import com.fr.decision.webservice.bean.dataset.StoreProcedureBean; |
||||||
|
import com.fr.decision.webservice.v10.datasource.dataset.processor.impl.SQLDataSetProcessor; |
||||||
|
import com.fr.decision.webservice.v10.datasource.dataset.processor.impl.StoreProcedureProcessor; |
||||||
|
import com.fr.general.GeneralUtils; |
||||||
|
import com.fr.general.sql.SqlUtils; |
||||||
|
import com.fr.json.JSONObject; |
||||||
|
import com.fr.log.FineLoggerFactory; |
||||||
|
import com.fr.script.Calculator; |
||||||
|
import com.fr.security.encryption.transmission.TransmissionEncryptionManager; |
||||||
|
import com.fr.stable.ParameterProvider; |
||||||
|
import com.fr.stable.StringUtils; |
||||||
|
import com.fr.workspace.server.repository.connection.ConnectionRepository; |
||||||
|
import com.fr.workspace.server.repository.tabledata.DataEncryptionHelper; |
||||||
|
import com.fr.workspace.server.repository.tabledata.TableDataRepository; |
||||||
|
|
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
/** |
||||||
|
* 数据集bean工具类 |
||||||
|
* |
||||||
|
* @author Destiny.Lin |
||||||
|
* @since 11.0 |
||||||
|
* Created on 2024/8/9 |
||||||
|
*/ |
||||||
|
public class TableDataBeanHelper { |
||||||
|
|
||||||
|
/** |
||||||
|
* 获取服务器数据集 |
||||||
|
*/ |
||||||
|
public static Map<String, TableData> getServerTableDatas() { |
||||||
|
final List<ServerDataSetBean> beans = TableDataRepository.getInstance().getAllTableData(); |
||||||
|
final Map<String, Connection> connectionMap = ConnectionInfoBeanHelper.createConnectionMap(ConnectionRepository.getInstance().getAll()); |
||||||
|
final Map<String, TableData> tableDataMap = new HashMap<>(); |
||||||
|
try { |
||||||
|
TransmissionEncryptionManager.setTransEncryptionLevel(1); |
||||||
|
for (ServerDataSetBean bean : beans) { |
||||||
|
tableDataMap.put(bean.getDatasetName() , TableDataBeanHelper.getTableDataSet(connectionMap, bean.getDatasetType(), bean.getDatasetData())); |
||||||
|
} |
||||||
|
} catch (Exception e) { |
||||||
|
throw new RuntimeException(e); |
||||||
|
} finally { |
||||||
|
TransmissionEncryptionManager.removeTransEncryptionLevel(); |
||||||
|
} |
||||||
|
return tableDataMap; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据序列化数据生成tabledata |
||||||
|
*/ |
||||||
|
public static TableData getTableDataSet(Map<String, Connection> connectionMap, String type, String tableDataSetData) throws Exception { |
||||||
|
if (DataSetProcessors.getProcessors().containsKey(type)) { |
||||||
|
if (StringUtils.equals(SQLDataSetProcessor.TYPE, type)) { |
||||||
|
return deserialize4SQL(connectionMap, null, new JSONObject(tableDataSetData)); |
||||||
|
} else if (StringUtils.equals(StoreProcedureProcessor.TYPE, type)) { |
||||||
|
return deserialize4Procedure(connectionMap, null, new JSONObject(tableDataSetData)); |
||||||
|
} else { |
||||||
|
UniversalServerTableDataProvider processor = DataSetProcessors.getProcessors().get(type); |
||||||
|
return (TableData) processor.deserialize(null, new JSONObject(tableDataSetData)); |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
return null; |
||||||
|
} |
||||||
|
|
||||||
|
private static TableData deserialize4Procedure(Map<String, Connection> connectionMap, DBTableData oldDataSet, JSONObject object) { |
||||||
|
StoreProcedure storeProcedure = new StoreProcedure(); |
||||||
|
StoreProcedureBean bean = object.mapTo(StoreProcedureBean.class); |
||||||
|
storeProcedure.setShare(bean.isShare()); |
||||||
|
storeProcedure.setMaxMemRowCount(bean.getMaxMemRowCount()); |
||||||
|
storeProcedure.setQuery(bean.getQuery()); |
||||||
|
if (StringUtils.isNotEmpty(bean.getDatabase())) { |
||||||
|
Connection connection = connectionMap.get(bean.getDatabase()); |
||||||
|
if (connection != null) { |
||||||
|
storeProcedure.setDatabaseConnection(new NameDatabaseConnection(bean.getDatabase())); |
||||||
|
} else { |
||||||
|
FineLoggerFactory.getLogger().info("not find conn by {}", bean.getDatabase()); |
||||||
|
} |
||||||
|
} |
||||||
|
Parameter[] parameters = new Parameter[bean.getParameters().size()]; |
||||||
|
for (int i = 0; i < parameters.length; i++) { |
||||||
|
ParameterBean parameterBean = bean.getParameters().get(i); |
||||||
|
parameters[i] = (Parameter) ParameterTypeHandler.getInstance().parseParameter(parameterBean, new Parameter(parameterBean.getName())); |
||||||
|
} |
||||||
|
List<ParameterExternal> externals = bean.getStoreProcedureParameterBeanList(); |
||||||
|
StoreProcedureParameter[] procedureParameters = new StoreProcedureParameter[bean.getParameters().size()]; |
||||||
|
for (int i = 0; i < procedureParameters.length; i++) { |
||||||
|
StoreProcedureParameter storeProcedureParameter = new StoreProcedureParameter(); |
||||||
|
storeProcedureParameter.setName(parameters[i].getName()); |
||||||
|
storeProcedureParameter.setValue(parameters[i].getValue()); |
||||||
|
storeProcedureParameter.setSchema(externals.get(i).getSchema()); |
||||||
|
storeProcedureParameter.setType(externals.get(i).getTypeInt()); |
||||||
|
procedureParameters[i] = storeProcedureParameter; |
||||||
|
} |
||||||
|
storeProcedure.setParameters(procedureParameters); |
||||||
|
return storeProcedure; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* 获取服务器数据集传输的bean |
||||||
|
*/ |
||||||
|
public static ServerDataSetBean getServerDataSetBean(String name, TableData tableData) { |
||||||
|
for (UniversalServerTableDataProvider processor : DataSetProcessors.getProcessors().values()) { |
||||||
|
if (SQLDataSetProcessor.KEY.classForTableData() == tableData.getClass()) { |
||||||
|
return serialize4SQL(name, tableData); |
||||||
|
} else if (processor.classForTableData() == tableData.getClass()) { |
||||||
|
ServerDataSetBean bean = new ServerDataSetBean(); |
||||||
|
try { |
||||||
|
bean.setDatasetData(processor.serialize(tableData).toString()); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
bean.setDatasetData(StringUtils.EMPTY); |
||||||
|
} |
||||||
|
bean.setDatasetName(name); |
||||||
|
bean.setDatasetId(name); |
||||||
|
bean.setDatasetType(processor.nameForTableData()); |
||||||
|
return bean; |
||||||
|
} |
||||||
|
} |
||||||
|
return new ServerDataSetBean(name); |
||||||
|
} |
||||||
|
|
||||||
|
private static ServerDataSetBean serialize4SQL(String name, TableData tableData) { |
||||||
|
ServerDataSetBean bean = new ServerDataSetBean(); |
||||||
|
try { |
||||||
|
bean.setDatasetData(serialize4SQL0((DBTableData) tableData).toString()); |
||||||
|
} catch (Exception e) { |
||||||
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
|
bean.setDatasetData(StringUtils.EMPTY); |
||||||
|
} |
||||||
|
bean.setDatasetName(name); |
||||||
|
bean.setDatasetId(name); |
||||||
|
bean.setDatasetType(SQLDataSetProcessor.KEY.nameForTableData()); |
||||||
|
return bean; |
||||||
|
} |
||||||
|
|
||||||
|
private static Object serialize4SQL0(DBTableData dataSet) { |
||||||
|
SQLDataSetBean bean = new SQLDataSetBean(); |
||||||
|
if (dataSet.getDatabase() instanceof NameDatabaseConnection) { |
||||||
|
bean.setDatabase(((NameDatabaseConnection) dataSet.getDatabase()).getName()); |
||||||
|
} |
||||||
|
bean.setQuery(DataEncryptionHelper.encrypt(dataSet.getQuery())); |
||||||
|
List<ParameterBean> parameterBeans = new ArrayList<>(); |
||||||
|
ParameterProvider[] parameters = dataSet.getParameters(Calculator.createCalculator()); |
||||||
|
for (ParameterProvider parameter : parameters) { |
||||||
|
parameterBeans.add(new ParameterBean(parameter.getValue().getClass().getSimpleName(), parameter.getName(), GeneralUtils.objectToString(parameter.getValue()))); |
||||||
|
} |
||||||
|
bean.setParameters(parameterBeans); |
||||||
|
return JSONObject.mapFrom(bean); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
private static TableData deserialize4SQL(Map<String, Connection> connectionMap, DBTableData oldDataSet, JSONObject object) { |
||||||
|
DBTableData tableData = new DBTableData(); |
||||||
|
SQLDataSetBean bean = object.mapTo(SQLDataSetBean.class); |
||||||
|
tableData.setQuery(DataEncryptionHelper.decrypt(bean.getQuery())); |
||||||
|
Connection connection = connectionMap.get(bean.getDatabase()); |
||||||
|
if (connection != null) { |
||||||
|
tableData.setDatabase(new NameDatabaseConnection(bean.getDatabase())); |
||||||
|
} else { |
||||||
|
FineLoggerFactory.getLogger().info("not find conn by {}", bean.getDatabase()); |
||||||
|
} |
||||||
|
String sql = SqlUtils.clearSqlComments(DataEncryptionHelper.decrypt(bean.getQuery())); |
||||||
|
Parameter[] parameters = new Parameter[bean.getParameters().size()]; |
||||||
|
for (int i = 0; i < parameters.length; i++) { |
||||||
|
ParameterBean parameterBean = bean.getParameters().get(i); |
||||||
|
parameters[i] = (Parameter) ParameterTypeHandler.getInstance().parseParameter(parameterBean, new Parameter(parameterBean.getName())); |
||||||
|
} |
||||||
|
tableData.setParameters(ParameterHelper.analyzeAndUnionSameParameters(new String[]{sql}, parameters)); |
||||||
|
if (oldDataSet != null) { |
||||||
|
tableData.setMaxMemRowCount(oldDataSet.getMaxMemRowCount()); |
||||||
|
tableData.setPageQuerySql(oldDataSet.getPageQuerySql()); |
||||||
|
tableData.setShare(oldDataSet.isShare()); |
||||||
|
tableData.setDataQueryProcessor(oldDataSet.getDataQueryProcessor()); |
||||||
|
} |
||||||
|
return tableData; |
||||||
|
} |
||||||
|
} |
@ -1,42 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fr.design.dialog.UIDialog; |
|
||||||
import com.fr.design.utils.gui.GUICoreUtils; |
|
||||||
import com.fr.stable.StableUtils; |
|
||||||
|
|
||||||
import javax.swing.*; |
|
||||||
import java.awt.*; |
|
||||||
|
|
||||||
/** |
|
||||||
* Created by vito on 2017/5/5. |
|
||||||
*/ |
|
||||||
public class LoginDialog extends UIDialog { |
|
||||||
private static final Dimension DEFAULT_SHOP = new Dimension(401, 301); |
|
||||||
|
|
||||||
public LoginDialog(Frame frame, Component pane) { |
|
||||||
super(frame); |
|
||||||
init(pane); |
|
||||||
} |
|
||||||
|
|
||||||
public LoginDialog(Dialog dialog, Component pane) { |
|
||||||
super(dialog); |
|
||||||
init(pane); |
|
||||||
} |
|
||||||
|
|
||||||
private void init(Component pane) { |
|
||||||
if (StableUtils.getMajorJavaVersion() >= 8) { |
|
||||||
setUndecorated(true); |
|
||||||
} |
|
||||||
JPanel panel = (JPanel) getContentPane(); |
|
||||||
panel.setLayout(new BorderLayout()); |
|
||||||
add(pane, BorderLayout.CENTER); |
|
||||||
setSize(DEFAULT_SHOP); |
|
||||||
GUICoreUtils.centerWindow(this); |
|
||||||
setResizable(false); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void checkValid() throws Exception { |
|
||||||
// do nothing
|
|
||||||
} |
|
||||||
} |
|
@ -1,200 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fanruan.carina.Carina; |
|
||||||
import com.fanruan.cloud.FanruanCloud; |
|
||||||
import com.fanruan.config.bbs.FineBBSConfigProvider; |
|
||||||
import com.fr.concurrent.NamedThreadFactory; |
|
||||||
import com.fr.design.DesignerEnvManager; |
|
||||||
import com.fr.design.dialog.UIDialog; |
|
||||||
import com.fr.design.extra.exe.PluginLoginExecutor; |
|
||||||
import com.fr.design.gui.ilable.UILabel; |
|
||||||
import com.fr.design.locale.impl.BbsRegisterMark; |
|
||||||
import com.fr.design.locale.impl.BbsResetMark; |
|
||||||
import com.fr.design.login.service.DesignerLoginClient; |
|
||||||
import com.fr.design.login.service.DesignerLoginResult; |
|
||||||
import com.fr.general.CloudCenter; |
|
||||||
import com.fr.general.http.HttpClient; |
|
||||||
import com.fr.general.locale.LocaleCenter; |
|
||||||
import com.fr.general.locale.LocaleMark; |
|
||||||
import com.fr.log.FineLoggerFactory; |
|
||||||
import com.fr.stable.StringUtils; |
|
||||||
import javafx.concurrent.Task; |
|
||||||
import javafx.scene.web.WebEngine; |
|
||||||
import netscape.javascript.JSObject; |
|
||||||
|
|
||||||
import javax.swing.*; |
|
||||||
import java.awt.*; |
|
||||||
import java.net.URI; |
|
||||||
import java.util.concurrent.ExecutorService; |
|
||||||
import java.util.concurrent.Executors; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author vito |
|
||||||
*/ |
|
||||||
public class LoginWebBridge { |
|
||||||
|
|
||||||
//最低消息的条数
|
|
||||||
private static final int MIN_MESSAGE_COUNT = 0; |
|
||||||
//网络连接失败
|
|
||||||
private static final String NET_FAILED = "-4"; |
|
||||||
//用户名,密码为空
|
|
||||||
private static final String LOGIN_INFO_EMPTY = "-5"; |
|
||||||
private static final Color LOGIN_BACKGROUND = new Color(184, 220, 242); |
|
||||||
private static LoginWebBridge helper; |
|
||||||
//消息条数
|
|
||||||
private int messageCount; |
|
||||||
private UIDialog uiDialog; |
|
||||||
private UIDialog qqDialog; |
|
||||||
private UILabel uiLabel; |
|
||||||
private WebEngine webEngine; |
|
||||||
|
|
||||||
private LoginWebBridge() { |
|
||||||
} |
|
||||||
|
|
||||||
public static LoginWebBridge getHelper() { |
|
||||||
if (helper != null) { |
|
||||||
return helper; |
|
||||||
} |
|
||||||
synchronized (LoginWebBridge.class) { |
|
||||||
if (helper == null) { |
|
||||||
helper = new LoginWebBridge(); |
|
||||||
} |
|
||||||
return helper; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static LoginWebBridge getHelper(WebEngine webEngine) { |
|
||||||
getHelper(); |
|
||||||
helper.setWebEngine(webEngine); |
|
||||||
return helper; |
|
||||||
} |
|
||||||
|
|
||||||
public void setWebEngine(WebEngine webEngine) { |
|
||||||
this.webEngine = webEngine; |
|
||||||
} |
|
||||||
|
|
||||||
public int getMessageCount() { |
|
||||||
return messageCount; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 设置获取的消息长度,并设置显示 |
|
||||||
* |
|
||||||
* @param count |
|
||||||
*/ |
|
||||||
public void setMessageCount(int count) { |
|
||||||
if (count == MIN_MESSAGE_COUNT) { |
|
||||||
Carina.config(FineBBSConfigProvider.class).setBbsUsername(DesignerEnvManager.getEnvManager().getDesignerLoginUsername()); |
|
||||||
return; |
|
||||||
} |
|
||||||
this.messageCount = count; |
|
||||||
StringBuilder sb = new StringBuilder(); |
|
||||||
sb.append(StringUtils.BLANK).append(DesignerEnvManager.getEnvManager().getDesignerLoginUsername()) |
|
||||||
.append("(").append(this.messageCount) |
|
||||||
.append(")").append(StringUtils.BLANK); |
|
||||||
Carina.config(FineBBSConfigProvider.class).setBbsUsername(sb.toString()); |
|
||||||
} |
|
||||||
|
|
||||||
public void setQQDialog(UIDialog qqDialog) { |
|
||||||
closeQQWindow(); |
|
||||||
this.qqDialog = qqDialog; |
|
||||||
} |
|
||||||
|
|
||||||
public void setDialogHandle(UIDialog uiDialog) { |
|
||||||
closeWindow(); |
|
||||||
this.uiDialog = uiDialog; |
|
||||||
} |
|
||||||
|
|
||||||
public void setUILabel(UILabel uiLabel) { |
|
||||||
this.uiLabel = uiLabel; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 测试论坛网络连接 |
|
||||||
* |
|
||||||
* @return |
|
||||||
*/ |
|
||||||
private boolean testConnection() { |
|
||||||
HttpClient client = new HttpClient(CloudCenter.getInstance().acquireUrlByKind("bbs.test")); |
|
||||||
return client.isServerAlive(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 注册页面 |
|
||||||
*/ |
|
||||||
public void registerHref() { |
|
||||||
try { |
|
||||||
LocaleMark<String> registerMark = LocaleCenter.getMark(BbsRegisterMark.class); |
|
||||||
Desktop.getDesktop().browse(new URI(registerMark.getValue())); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 忘记密码 |
|
||||||
*/ |
|
||||||
public void forgetHref() { |
|
||||||
try { |
|
||||||
LocaleMark<String> resetMark = LocaleCenter.getMark(BbsResetMark.class); |
|
||||||
Desktop.getDesktop().browse(new URI(resetMark.getValue())); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 设计器端的用户登录 |
|
||||||
* |
|
||||||
* @param username 用户名 |
|
||||||
* @param password 密码 |
|
||||||
* @return 登录信息标志 |
|
||||||
*/ |
|
||||||
public void defaultLogin(String username, String password, final JSObject callback) { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new PluginLoginExecutor(username, password)); |
|
||||||
ExecutorService es = Executors.newSingleThreadExecutor(new NamedThreadFactory("bbsDefaultLogin")); |
|
||||||
es.submit(task); |
|
||||||
es.shutdown(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 登录操作 |
|
||||||
* |
|
||||||
* @param userInfo 登录信息 |
|
||||||
* @param password 密码 |
|
||||||
* @return 登录信息标志 |
|
||||||
*/ |
|
||||||
public String login(String userInfo, String password) { |
|
||||||
DesignerLoginClient client = new DesignerLoginClient(); |
|
||||||
DesignerLoginResult result = client.login(userInfo, password); |
|
||||||
int uid = result.getUid(); |
|
||||||
if (uid > 0) { |
|
||||||
closeWindow(); |
|
||||||
} |
|
||||||
return String.valueOf(uid); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 关闭窗口 |
|
||||||
*/ |
|
||||||
public void closeWindow() { |
|
||||||
if (uiDialog != null) { |
|
||||||
uiDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); |
|
||||||
uiDialog.setVisible(false); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 关闭QQ授权窗口 |
|
||||||
*/ |
|
||||||
public void closeQQWindow() { |
|
||||||
if (qqDialog != null) { |
|
||||||
qqDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); |
|
||||||
qqDialog.setVisible(false); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public void openUrlAtLocalWebBrowser(WebEngine eng, String url) { |
|
||||||
// do nothing
|
|
||||||
} |
|
||||||
} |
|
@ -1,54 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fr.design.dialog.FineJOptionPane; |
|
||||||
import javafx.application.Platform; |
|
||||||
import javafx.embed.swing.JFXPanel; |
|
||||||
import javafx.event.EventHandler; |
|
||||||
import javafx.scene.Scene; |
|
||||||
import javafx.scene.layout.BorderPane; |
|
||||||
import javafx.scene.web.WebEngine; |
|
||||||
import javafx.scene.web.WebEvent; |
|
||||||
import javafx.scene.web.WebView; |
|
||||||
import netscape.javascript.JSObject; |
|
||||||
|
|
||||||
import javax.swing.*; |
|
||||||
|
|
||||||
/** |
|
||||||
* Created by zhaohehe on 16/7/26. |
|
||||||
*/ |
|
||||||
public class LoginWebPane extends JFXPanel { |
|
||||||
|
|
||||||
public LoginWebPane(final String installHome) { |
|
||||||
Platform.setImplicitExit(false); |
|
||||||
Platform.runLater(new Runnable() { |
|
||||||
@Override |
|
||||||
public void run() { |
|
||||||
BorderPane root = new BorderPane(); |
|
||||||
Scene scene = new Scene(root); |
|
||||||
LoginWebPane.this.setScene(scene); |
|
||||||
WebView webView = new WebView(); |
|
||||||
WebEngine webEngine = webView.getEngine(); |
|
||||||
webEngine.load("file:///" + installHome + "/scripts/login.html"); |
|
||||||
webEngine.setOnAlert(new EventHandler<WebEvent<String>>() { |
|
||||||
@Override |
|
||||||
public void handle(WebEvent<String> event) { |
|
||||||
showAlert(event.getData()); |
|
||||||
} |
|
||||||
}); |
|
||||||
JSObject obj = (JSObject) webEngine.executeScript("window"); |
|
||||||
obj.setMember("LoginHelper", LoginWebBridge.getHelper(webEngine)); |
|
||||||
webView.setContextMenuEnabled(false);//屏蔽右键
|
|
||||||
root.setCenter(webView); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
private void showAlert(final String message) { |
|
||||||
SwingUtilities.invokeLater(new Runnable() { |
|
||||||
@Override |
|
||||||
public void run() { |
|
||||||
FineJOptionPane.showMessageDialog(LoginWebPane.this, message); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
@ -1,601 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fanruan.carina.Carina; |
|
||||||
import com.fanruan.cloud.FanruanCloud; |
|
||||||
import com.fanruan.config.bbs.FineBBSConfigProvider; |
|
||||||
import com.fr.config.MarketConfig; |
|
||||||
import com.fr.design.DesignerEnvManager; |
|
||||||
import com.fr.design.RestartHelper; |
|
||||||
import com.fr.design.bridge.exec.JSCallback; |
|
||||||
import com.fr.design.dialog.UIDialog; |
|
||||||
import com.fr.design.extra.exe.GetInstalledPluginsExecutor; |
|
||||||
import com.fr.design.extra.exe.GetPluginCategoriesExecutor; |
|
||||||
import com.fr.design.extra.exe.GetPluginFromStoreExecutor; |
|
||||||
import com.fr.design.extra.exe.GetPluginPrefixExecutor; |
|
||||||
import com.fr.design.extra.exe.PluginLoginExecutor; |
|
||||||
import com.fr.design.extra.exe.ReadUpdateOnlineExecutor; |
|
||||||
import com.fr.design.extra.exe.SearchOnlineExecutor; |
|
||||||
import com.fr.design.locale.impl.BbsRegisterMark; |
|
||||||
import com.fr.design.locale.impl.BbsResetMark; |
|
||||||
import com.fr.design.locale.impl.BbsSpaceMark; |
|
||||||
import com.fr.design.login.DesignerLoginSource; |
|
||||||
import com.fr.design.plugin.DesignerPluginContext; |
|
||||||
import com.fr.design.utils.concurrent.ThreadFactoryBuilder; |
|
||||||
import com.fr.general.locale.LocaleCenter; |
|
||||||
import com.fr.general.locale.LocaleMark; |
|
||||||
import com.fr.json.JSONObject; |
|
||||||
import com.fr.log.FineLoggerFactory; |
|
||||||
import com.fr.plugin.context.PluginMarker; |
|
||||||
import com.fr.stable.ArrayUtils; |
|
||||||
import com.fr.stable.StringUtils; |
|
||||||
import javafx.concurrent.Task; |
|
||||||
import javafx.scene.web.WebEngine; |
|
||||||
import javafx.stage.FileChooser; |
|
||||||
import javafx.stage.Stage; |
|
||||||
import netscape.javascript.JSObject; |
|
||||||
|
|
||||||
import javax.swing.*; |
|
||||||
import java.awt.*; |
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
import java.net.URI; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.List; |
|
||||||
import java.util.Map; |
|
||||||
import java.util.Set; |
|
||||||
import java.util.concurrent.ExecutorService; |
|
||||||
import java.util.concurrent.LinkedBlockingQueue; |
|
||||||
import java.util.concurrent.ThreadPoolExecutor; |
|
||||||
import java.util.concurrent.TimeUnit; |
|
||||||
|
|
||||||
/** |
|
||||||
* 开放给Web组件的接口,用于安装,卸载,更新以及更改插件可用状态 |
|
||||||
*/ |
|
||||||
public class PluginWebBridge { |
|
||||||
private static final String THREAD_NAME_TEMPLATE = "pluginbridge-thread-%s"; |
|
||||||
private static final String ACTION = "action"; |
|
||||||
private static final String KEYWORD = "keyword"; |
|
||||||
private static final String PLUGIN_INFO = "pluginInfo"; |
|
||||||
private static final int COREPOOLSIZE = 3; |
|
||||||
private static final int MAXPOOLSIZE = 5; |
|
||||||
|
|
||||||
private static PluginWebBridge helper; |
|
||||||
|
|
||||||
private UIDialog uiDialog; |
|
||||||
private ACTIONS actions; |
|
||||||
|
|
||||||
private Map<String, Object> config; |
|
||||||
private WebEngine webEngine; |
|
||||||
|
|
||||||
private ExecutorService threadPoolExecutor = new ThreadPoolExecutor(COREPOOLSIZE, MAXPOOLSIZE, |
|
||||||
0L, TimeUnit.MILLISECONDS, |
|
||||||
new LinkedBlockingQueue<Runnable>(COREPOOLSIZE), |
|
||||||
new ThreadFactoryBuilder().setNameFormat(THREAD_NAME_TEMPLATE).build()); |
|
||||||
|
|
||||||
private PluginWebBridge() { |
|
||||||
} |
|
||||||
|
|
||||||
public static PluginWebBridge getHelper() { |
|
||||||
if (helper != null) { |
|
||||||
return helper; |
|
||||||
} |
|
||||||
synchronized (PluginWebBridge.class) { |
|
||||||
if (helper == null) { |
|
||||||
helper = new PluginWebBridge(); |
|
||||||
} |
|
||||||
return helper; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static PluginWebBridge getHelper(WebEngine webEngine) { |
|
||||||
getHelper(); |
|
||||||
helper.setEngine(webEngine); |
|
||||||
return helper; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取打开动作配置 |
|
||||||
* |
|
||||||
* @return 配置信息 |
|
||||||
*/ |
|
||||||
public String getRunConfig() { |
|
||||||
if (actions != null) { |
|
||||||
JSONObject jsonObject = new JSONObject(); |
|
||||||
try { |
|
||||||
jsonObject.put(ACTION, actions.getContext()); |
|
||||||
Set<String> keySet = config.keySet(); |
|
||||||
for (String key : keySet) { |
|
||||||
jsonObject.put(key, config.get(key).toString()); |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
return jsonObject.toString(); |
|
||||||
} |
|
||||||
return StringUtils.EMPTY; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 配置打开动作 |
|
||||||
* |
|
||||||
* @param action 动作 |
|
||||||
* @param config 参数 |
|
||||||
*/ |
|
||||||
public void setRunConfig(ACTIONS action, Map<String, Object> config) { |
|
||||||
this.actions = action; |
|
||||||
this.config = config; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 清楚打开动作 |
|
||||||
*/ |
|
||||||
public void clearRunConfig() { |
|
||||||
this.actions = null; |
|
||||||
this.config = null; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 打开时搜索 |
|
||||||
* |
|
||||||
* @param keyword 关键词 |
|
||||||
*/ |
|
||||||
|
|
||||||
public void openWithSearch(String keyword) { |
|
||||||
HashMap<String, Object> map = new HashMap<String, Object>(2); |
|
||||||
map.put(KEYWORD, keyword); |
|
||||||
setRunConfig(ACTIONS.SEARCH, map); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 根据插件信息跳转到应用中心 |
|
||||||
* |
|
||||||
* @param keyword |
|
||||||
* @param pluginInfo |
|
||||||
*/ |
|
||||||
public void showResultInStore(String keyword, String pluginInfo) { |
|
||||||
HashMap<String, Object> map = new HashMap<>(); |
|
||||||
map.put(KEYWORD, keyword); |
|
||||||
map.put(PLUGIN_INFO, pluginInfo); |
|
||||||
setRunConfig(ACTIONS.SHOW_RESULT, map); |
|
||||||
} |
|
||||||
|
|
||||||
public void setEngine(WebEngine webEngine) { |
|
||||||
this.webEngine = webEngine; |
|
||||||
} |
|
||||||
|
|
||||||
public void setDialogHandle(UIDialog uiDialog) { |
|
||||||
closeWindow(); |
|
||||||
this.uiDialog = uiDialog; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从插件服务器上安装插件 |
|
||||||
* |
|
||||||
* @param pluginInfo 插件的ID |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
public void installPluginOnline(final String pluginInfo, final JSObject callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback)); |
|
||||||
PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); |
|
||||||
PluginOperateUtils.installPluginOnline(pluginMarker, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从磁盘上选择插件安装包进行安装 |
|
||||||
* |
|
||||||
* @param filePath 插件包的路径 |
|
||||||
*/ |
|
||||||
public void installPluginFromDisk(final String filePath, final JSObject callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback)); |
|
||||||
File file = new File(filePath); |
|
||||||
PluginOperateUtils.installPluginFromDisk(file, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 卸载当前选中的插件 |
|
||||||
* |
|
||||||
* @param pluginInfo 插件信息 |
|
||||||
*/ |
|
||||||
public void uninstallPlugin(final String pluginInfo, final boolean isForce, final JSObject callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback)); |
|
||||||
PluginOperateUtils.uninstallPlugin(pluginInfo, isForce, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从插件服务器上更新选中的插件 |
|
||||||
* |
|
||||||
* @param pluginIDs 插件集合 |
|
||||||
*/ |
|
||||||
public void updatePluginOnline(JSObject pluginIDs, final JSObject callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback)); |
|
||||||
String[] pluginInfos = jsObjectToStringArray(pluginIDs); |
|
||||||
List<PluginMarker> pluginMarkerList = new ArrayList<PluginMarker>(); |
|
||||||
for (int i = 0; i < pluginInfos.length; i++) { |
|
||||||
pluginMarkerList.add(PluginUtils.createPluginMarker(pluginInfos[i])); |
|
||||||
} |
|
||||||
PluginOperateUtils.updatePluginOnline(pluginMarkerList, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从磁盘上选择插件安装包进行插件升级 |
|
||||||
* |
|
||||||
* @param filePath 插件包的路径 |
|
||||||
*/ |
|
||||||
public void updatePluginFromDisk(String filePath, final JSObject callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback)); |
|
||||||
File file = new File(filePath); |
|
||||||
PluginOperateUtils.updatePluginFromDisk(file, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 修改选中的插件的活跃状态 |
|
||||||
* |
|
||||||
* @param pluginID 插件ID |
|
||||||
*/ |
|
||||||
public void setPluginActive(String pluginID, final JSObject callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback)); |
|
||||||
PluginOperateUtils.setPluginActive(pluginID, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 已安装插件检查更新 |
|
||||||
*/ |
|
||||||
public void readUpdateOnline(final JSObject callback) { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new ReadUpdateOnlineExecutor()); |
|
||||||
threadPoolExecutor.submit(task); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 选择文件对话框 |
|
||||||
* |
|
||||||
* @return 选择的文件的路径 |
|
||||||
*/ |
|
||||||
public String showFileChooser() { |
|
||||||
return showFileChooserWithFilter(StringUtils.EMPTY, StringUtils.EMPTY); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 选择文件对话框 |
|
||||||
* |
|
||||||
* @param des 过滤文件描述 |
|
||||||
* @param filter 文件的后缀 |
|
||||||
* @return 选择的文件的路径 |
|
||||||
* 这里换用JFileChooser会卡死,不知道为什么 |
|
||||||
*/ |
|
||||||
public String showFileChooserWithFilter(String des, String filter) { |
|
||||||
FileChooser fileChooser = new FileChooser(); |
|
||||||
|
|
||||||
if (StringUtils.isNotEmpty(filter)) { |
|
||||||
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(des, filter)); |
|
||||||
} |
|
||||||
|
|
||||||
File selectedFile = fileChooser.showOpenDialog(new Stage()); |
|
||||||
if (selectedFile == null) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
return selectedFile.getAbsolutePath(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 选择文件对话框 |
|
||||||
* |
|
||||||
* @param des 过滤文件描述 |
|
||||||
* @param args 文件的后缀 |
|
||||||
* @return 选择的文件的路径 |
|
||||||
*/ |
|
||||||
public String showFileChooserWithFilters(String des, JSObject args) { |
|
||||||
FileChooser fileChooser = new FileChooser(); |
|
||||||
String[] filters = jsObjectToStringArray(args); |
|
||||||
if (ArrayUtils.isNotEmpty(filters)) { |
|
||||||
fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(des, filters)); |
|
||||||
} |
|
||||||
|
|
||||||
File selectedFile = fileChooser.showOpenDialog(new Stage()); |
|
||||||
if (selectedFile == null) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
return selectedFile.getAbsolutePath(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取已经安装的插件的数组 |
|
||||||
* |
|
||||||
* @return 已安装的插件组成的数组 |
|
||||||
*/ |
|
||||||
public void getInstalledPlugins(final JSObject callback) { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new GetInstalledPluginsExecutor()); |
|
||||||
threadPoolExecutor.submit(task); |
|
||||||
} |
|
||||||
|
|
||||||
private String[] jsObjectToStringArray(JSObject obj) { |
|
||||||
if (obj == null) { |
|
||||||
return ArrayUtils.EMPTY_STRING_ARRAY; |
|
||||||
} |
|
||||||
int len = (int) obj.getMember("length"); |
|
||||||
List<String> list = new ArrayList<>(); |
|
||||||
for (int i = 0; i < len; i++) { |
|
||||||
list.add(obj.getSlot(i).toString()); |
|
||||||
} |
|
||||||
return list.toArray(new String[len]); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 搜索在线插件 |
|
||||||
* |
|
||||||
* @param keyword 关键字 |
|
||||||
*/ |
|
||||||
public void searchPlugin(String keyword, final JSObject callback) { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new SearchOnlineExecutor(keyword)); |
|
||||||
threadPoolExecutor.submit(task); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 根据条件获取在线插件的 |
|
||||||
* |
|
||||||
* @param category 分类 |
|
||||||
* @param seller 卖家性质 |
|
||||||
* @param fee 收费类型 |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
public void getPluginFromStore(String category, String seller, String fee, final JSObject callback) { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new GetPluginFromStoreExecutor(category, seller, fee, "")); |
|
||||||
threadPoolExecutor.submit(task); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 根据条件获取在线插件 |
|
||||||
* |
|
||||||
* @param info 插件信息 |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
public void getPluginFromStoreNew(String info, final JSObject callback) { |
|
||||||
try { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new GetPluginFromStoreExecutor(new JSONObject(info))); |
|
||||||
threadPoolExecutor.submit(task); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public void getPluginPrefix(final JSObject callback) { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new GetPluginPrefixExecutor()); |
|
||||||
threadPoolExecutor.submit(task); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 在线获取插件分类 |
|
||||||
* |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
public void getPluginCategories(final JSObject callback) { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new GetPluginCategoriesExecutor()); |
|
||||||
threadPoolExecutor.submit(task); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 展示一个重启的对话框(少用,莫名其妙会有bug) |
|
||||||
* |
|
||||||
* @param message 展示的消息 |
|
||||||
*/ |
|
||||||
public void showRestartMessage(String message) { |
|
||||||
int rv = JOptionPane.showOptionDialog( |
|
||||||
null, |
|
||||||
message, |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), |
|
||||||
JOptionPane.YES_NO_OPTION, |
|
||||||
JOptionPane.INFORMATION_MESSAGE, |
|
||||||
null, |
|
||||||
new String[]{com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Restart_Designer"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Restart_Designer_Later")}, |
|
||||||
null |
|
||||||
); |
|
||||||
if (rv == JOptionPane.OK_OPTION) { |
|
||||||
RestartHelper.restart(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 关闭窗口 |
|
||||||
*/ |
|
||||||
public void closeWindow() { |
|
||||||
if (uiDialog != null) { |
|
||||||
uiDialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); |
|
||||||
uiDialog.setVisible(false); |
|
||||||
} |
|
||||||
if (uiDialog == DesignerPluginContext.getPluginDialog()) { |
|
||||||
DesignerPluginContext.setPluginDialog(null); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 窗口是否无装饰(判断是否使用系统标题栏) |
|
||||||
*/ |
|
||||||
public boolean isCustomTitleBar() { |
|
||||||
if (uiDialog != null) { |
|
||||||
return uiDialog.isUndecorated(); |
|
||||||
} |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取系统登录的用户名 |
|
||||||
* |
|
||||||
* @param callback |
|
||||||
*/ |
|
||||||
public String getLoginInfo(final JSObject callback) { |
|
||||||
registerLoginInfo(callback); |
|
||||||
return DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 系统登录注册 |
|
||||||
* |
|
||||||
* @param callback |
|
||||||
*/ |
|
||||||
public void registerLoginInfo(final JSObject callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback)); |
|
||||||
PluginOperateUtils.getLoginInfo(jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 打开论坛消息界面 |
|
||||||
*/ |
|
||||||
public void getPriviteMessage() { |
|
||||||
try { |
|
||||||
LocaleMark<String> spaceMark = LocaleCenter.getMark(BbsSpaceMark.class); |
|
||||||
Desktop.getDesktop().browse(new URI(spaceMark.getValue())); |
|
||||||
} catch (Exception exp) { |
|
||||||
FineLoggerFactory.getLogger().info(exp.getMessage()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 打开登录页面 |
|
||||||
*/ |
|
||||||
public void loginContent() { |
|
||||||
SwingUtilities.invokeLater(new Runnable() { |
|
||||||
@Override |
|
||||||
public void run() { |
|
||||||
UserLoginContext.fireLoginContextListener(DesignerLoginSource.NORMAL); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 在本地浏览器里打开url |
|
||||||
* tips:重载的时候,需要给js调用的方法需要放在前面,否则可能不会被调用(此乃坑) |
|
||||||
* 所以最好的是不要重载在js可以访问的接口文件中 |
|
||||||
* |
|
||||||
* @param url 要打开的地址 |
|
||||||
*/ |
|
||||||
public void openShopUrlAtWebBrowser(String url) { |
|
||||||
openUrlAtLocalWebBrowser(webEngine, url); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 在本地浏览器里打开url |
|
||||||
* |
|
||||||
* @param eng web引擎 |
|
||||||
* @param url 要打开的地址 |
|
||||||
*/ |
|
||||||
public void openUrlAtLocalWebBrowser(WebEngine eng, String url) { |
|
||||||
if (Desktop.isDesktopSupported()) { |
|
||||||
try { |
|
||||||
//创建一个URI实例,注意不是URL
|
|
||||||
URI uri = URI.create(url); |
|
||||||
//获取当前系统桌面扩展
|
|
||||||
Desktop desktop = Desktop.getDesktop(); |
|
||||||
//判断系统桌面是否支持要执行的功能
|
|
||||||
if (desktop.isSupported(Desktop.Action.BROWSE)) { |
|
||||||
//获取系统默认浏览器打开链接
|
|
||||||
desktop.browse(uri); |
|
||||||
} |
|
||||||
} catch (NullPointerException e) { |
|
||||||
//此为uri为空时抛出异常
|
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} catch (IOException e) { |
|
||||||
//此为无法获取系统默认浏览器
|
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 注册页面 |
|
||||||
*/ |
|
||||||
public void registerHref() { |
|
||||||
try { |
|
||||||
LocaleMark<String> registerMark = LocaleCenter.getMark(BbsRegisterMark.class); |
|
||||||
Desktop.getDesktop().browse(new URI(registerMark.getValue())); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/*-------------------------------登录部分的处理----------------------------------*/ |
|
||||||
|
|
||||||
/** |
|
||||||
* 忘记密码 |
|
||||||
*/ |
|
||||||
public void forgetHref() { |
|
||||||
try { |
|
||||||
LocaleMark<String> resetMark = LocaleCenter.getMark(BbsResetMark.class); |
|
||||||
Desktop.getDesktop().browse(new URI(resetMark.getValue())); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 设计器端的用户登录 |
|
||||||
* |
|
||||||
* @param username 用户名 |
|
||||||
* @param password 密码 |
|
||||||
* @return 登录信息标志 |
|
||||||
*/ |
|
||||||
public void defaultLogin(String username, String password, final JSObject callback) { |
|
||||||
Task<Void> task = new PluginTask<>(webEngine, callback, new PluginLoginExecutor(username, password)); |
|
||||||
threadPoolExecutor.submit(task); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 通过QQ登录后通知登录 |
|
||||||
*/ |
|
||||||
public void ucsynLogin(long uid, String username, String password, final JSONObject callback) { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 清除用户信息 |
|
||||||
*/ |
|
||||||
public void clearUserInfo() { |
|
||||||
Carina.config(FineBBSConfigProvider.class).setBbsUsername(StringUtils.EMPTY); |
|
||||||
} |
|
||||||
|
|
||||||
public void getPackInfo(final JSObject callback){ |
|
||||||
JSCallback jsCallback = new JSCallback(PluginJavaFxExecutor.create(webEngine, callback)); |
|
||||||
jsCallback.execute(StringUtils.EMPTY); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 初始化设计器部分 |
|
||||||
*/ |
|
||||||
public void initExtraDiff(final JSObject callback) { |
|
||||||
//todo 初始化设计器其他部分
|
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* 国际化(用来做兼容,暂时不删) |
|
||||||
*/ |
|
||||||
public String parseI18(final String key) { |
|
||||||
return com.fr.design.i18n.Toolkit.i18nText(key); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* 是否是在设计器中操作 |
|
||||||
*/ |
|
||||||
public boolean isDesigner() { |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 动作枚举 |
|
||||||
*/ |
|
||||||
public enum ACTIONS { |
|
||||||
SEARCH("search"), SHOW_RESULT("showResult"); |
|
||||||
private String context; |
|
||||||
|
|
||||||
ACTIONS(String context) { |
|
||||||
this.context = context; |
|
||||||
} |
|
||||||
|
|
||||||
public String getContext() { |
|
||||||
return context; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,112 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fr.base.TemplateUtils; |
|
||||||
import com.fr.design.dialog.FineJOptionPane; |
|
||||||
import com.fr.general.GeneralContext; |
|
||||||
import com.fr.general.IOUtils; |
|
||||||
import com.fr.log.FineLoggerFactory; |
|
||||||
import com.fr.stable.EncodeConstants; |
|
||||||
import com.fr.stable.StableUtils; |
|
||||||
import com.fr.stable.StringUtils; |
|
||||||
import javafx.application.Platform; |
|
||||||
import javafx.embed.swing.JFXPanel; |
|
||||||
import javafx.event.EventHandler; |
|
||||||
import javafx.scene.Scene; |
|
||||||
import javafx.scene.layout.BorderPane; |
|
||||||
import javafx.scene.web.WebEngine; |
|
||||||
import javafx.scene.web.WebEvent; |
|
||||||
import javafx.scene.web.WebView; |
|
||||||
import netscape.javascript.JSObject; |
|
||||||
|
|
||||||
import javax.swing.JOptionPane; |
|
||||||
import javax.swing.SwingUtilities; |
|
||||||
import java.io.BufferedReader; |
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.io.InputStreamReader; |
|
||||||
import java.net.URLEncoder; |
|
||||||
import java.util.HashMap; |
|
||||||
import java.util.Map; |
|
||||||
|
|
||||||
/** |
|
||||||
* Created by richie on 16/3/19. |
|
||||||
*/ |
|
||||||
public class PluginWebPane extends JFXPanel { |
|
||||||
private static final String RESOURCE_URL = "resourceURL"; |
|
||||||
private static final String LANGUAGE = "language"; |
|
||||||
private static final String URL_PLUS = "+"; |
|
||||||
private static final String URL_SPACING = "%20"; |
|
||||||
private static final String URL_PREFIX = "file:///"; |
|
||||||
private WebEngine webEngine; |
|
||||||
|
|
||||||
public PluginWebPane(final String installHome, final String mainJs) { |
|
||||||
Platform.setImplicitExit(false); |
|
||||||
Platform.runLater(new Runnable() { |
|
||||||
@Override |
|
||||||
public void run() { |
|
||||||
BorderPane root = new BorderPane(); |
|
||||||
Scene scene = new Scene(root); |
|
||||||
PluginWebPane.this.setScene(scene); |
|
||||||
WebView webView = new WebView(); |
|
||||||
webEngine = webView.getEngine(); |
|
||||||
try{ |
|
||||||
String htmlString = getRenderedHtml(installHome, mainJs); |
|
||||||
webEngine.loadContent(htmlString); |
|
||||||
webEngine.setOnAlert(new EventHandler<WebEvent<String>>() { |
|
||||||
@Override |
|
||||||
public void handle(WebEvent<String> event) { |
|
||||||
showAlert(event.getData()); |
|
||||||
} |
|
||||||
}); |
|
||||||
JSObject obj = (JSObject) webEngine.executeScript("window"); |
|
||||||
obj.setMember("PluginHelper", PluginWebBridge.getHelper(webEngine)); |
|
||||||
webView.setContextMenuEnabled(false);//屏蔽右键
|
|
||||||
root.setCenter(webView); |
|
||||||
}catch (Exception e){ |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
private String getRenderedHtml(String installHome, String mainJs) throws IOException { |
|
||||||
InputStream inp = IOUtils.readResource(StableUtils.pathJoin(installHome, mainJs)); |
|
||||||
if (inp == null) { |
|
||||||
throw new IOException("Not found template: " + mainJs); |
|
||||||
} |
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(inp, StableUtils.RESOURCE_ENCODER)); |
|
||||||
BufferedReader read = new BufferedReader(reader); |
|
||||||
StringBuffer sb = new StringBuffer(); |
|
||||||
String line; |
|
||||||
Map<String, Object> map4Tpl = new HashMap<String, Object>(); |
|
||||||
//URL中关于空格的编码与空格所在位置相关:空格被编码成+的情况只能在查询字符串部分出现,而被编码成%20则可以出现在路径和查询字符串中
|
|
||||||
//URLEncoder会将空格转成+,这边需要+转成%20
|
|
||||||
map4Tpl.put(RESOURCE_URL, URL_PREFIX + URLEncoder.encode(installHome, EncodeConstants.ENCODING_UTF_8).replace(URL_PLUS, URL_SPACING)); |
|
||||||
map4Tpl.put(LANGUAGE, GeneralContext.getLocale().toString()); |
|
||||||
while ((line = read.readLine()) != null) { |
|
||||||
if (sb.length() > 0) { |
|
||||||
sb.append('\n'); |
|
||||||
} |
|
||||||
sb.append(line); |
|
||||||
} |
|
||||||
String htmlString = StringUtils.EMPTY; |
|
||||||
try{ |
|
||||||
htmlString = TemplateUtils.renderParameter4Tpl(sb.toString(), map4Tpl); |
|
||||||
}catch (Exception e){ |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
reader.close(); |
|
||||||
inp.close(); |
|
||||||
return htmlString; |
|
||||||
} |
|
||||||
|
|
||||||
private void showAlert(final String message) { |
|
||||||
SwingUtilities.invokeLater(new Runnable() { |
|
||||||
@Override |
|
||||||
public void run() { |
|
||||||
FineJOptionPane.showMessageDialog(PluginWebPane.this, message); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
@ -1,32 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fr.design.dialog.UIDialog; |
|
||||||
import com.fr.design.utils.gui.GUICoreUtils; |
|
||||||
|
|
||||||
import javax.swing.*; |
|
||||||
import java.awt.*; |
|
||||||
|
|
||||||
/** |
|
||||||
* Created by zhaohehe on 16/7/28. |
|
||||||
*/ |
|
||||||
public class QQLoginDialog extends UIDialog { |
|
||||||
private static final Dimension DEFAULT_SHOP = new Dimension(700, 500); |
|
||||||
|
|
||||||
public QQLoginDialog(Frame frame, Component pane) { |
|
||||||
super(frame); |
|
||||||
setUndecorated(true); |
|
||||||
JPanel panel = (JPanel) getContentPane(); |
|
||||||
panel.setLayout(new BorderLayout()); |
|
||||||
add(pane, BorderLayout.CENTER); |
|
||||||
setSize(DEFAULT_SHOP); |
|
||||||
GUICoreUtils.centerWindow(this); |
|
||||||
setResizable(false); |
|
||||||
setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Manager")); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void checkValid() throws Exception { |
|
||||||
// do nothing
|
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -1,46 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fr.design.dialog.BasicPane; |
|
||||||
import com.fr.design.dialog.UIDialog; |
|
||||||
import com.fr.design.jdk.JdkVersion; |
|
||||||
import com.fr.design.plugin.DesignerPluginContext; |
|
||||||
import com.fr.design.utils.gui.GUICoreUtils; |
|
||||||
import com.fr.stable.StableUtils; |
|
||||||
|
|
||||||
import javax.swing.*; |
|
||||||
import java.awt.*; |
|
||||||
|
|
||||||
/** |
|
||||||
* Created by vito on 16/4/18. |
|
||||||
*/ |
|
||||||
public class ShopDialog extends UIDialog { |
|
||||||
|
|
||||||
public ShopDialog(Frame frame, BasicPane pane) { |
|
||||||
super(frame); |
|
||||||
if (StableUtils.getMajorJavaVersion() >= 8) { |
|
||||||
setUndecorated(true); |
|
||||||
} |
|
||||||
JPanel panel = (JPanel) getContentPane(); |
|
||||||
panel.setLayout(new BorderLayout()); |
|
||||||
add(pane, BorderLayout.CENTER); |
|
||||||
setSize(createDefaultDimension()); |
|
||||||
GUICoreUtils.centerWindow(this); |
|
||||||
setResizable(false); |
|
||||||
DesignerPluginContext.setPluginDialog(this); |
|
||||||
} |
|
||||||
|
|
||||||
private Dimension createDefaultDimension() { |
|
||||||
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); |
|
||||||
// jdk11 分辨率较低 缩放较大时 屏幕高度小于或接近设定的高度 需要调整下
|
|
||||||
if (JdkVersion.GE_9.support() && screenSize.height - 700 < 50) { |
|
||||||
return new Dimension(900, screenSize.height - 100); |
|
||||||
} else { |
|
||||||
return new Dimension(900, 700); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void checkValid() throws Exception { |
|
||||||
// do nothing
|
|
||||||
} |
|
||||||
} |
|
@ -1,31 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fr.design.dialog.BasicPane; |
|
||||||
|
|
||||||
|
|
||||||
import java.awt.BorderLayout; |
|
||||||
import java.awt.Component; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author richie |
|
||||||
* @date 2015-03-09 |
|
||||||
* @since 8.0 |
|
||||||
* 应用中心的构建采用JavaScript代码来动态实现,但是不总是依赖于服务器端的HTML |
|
||||||
* 采用JDK提供的JavaScript引擎,实际是用JavaScript语法实现Java端的功能,并通过JavaScript引擎动态调用 |
|
||||||
* JavaScript放在安装目录下的scripts/store目录下,检测到新版本的时候,可以通过更新这个目录下的文件实现热更新 |
|
||||||
* 不直接嵌入WebView组件的原因是什么呢? |
|
||||||
* 因为如果直接嵌入WebView,和设计器的交互就需要预先设定好,这样灵活性会差很多,而如果使用JavaScript引擎, |
|
||||||
* 就可以直接在JavaScript中和WebView组件做交互,而同时JavaScript中可以调用任何的设计器API. |
|
||||||
*/ |
|
||||||
public class ShopManagerPane extends BasicPane { |
|
||||||
|
|
||||||
public ShopManagerPane(Component webPane) { |
|
||||||
setLayout(new BorderLayout()); |
|
||||||
add(webPane, BorderLayout.CENTER); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String title4PopupWindow() { |
|
||||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Manager"); |
|
||||||
} |
|
||||||
} |
|
@ -1,36 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import javafx.embed.swing.JFXPanel; |
|
||||||
|
|
||||||
/** |
|
||||||
* Created by vito on 2016/9/28. |
|
||||||
*/ |
|
||||||
public abstract class ShopPaneConfig { |
|
||||||
private String mainJS; |
|
||||||
private String scriptsId; |
|
||||||
private JFXPanel webPane; |
|
||||||
|
|
||||||
public ShopPaneConfig() { |
|
||||||
this.mainJS = setMainJS(); |
|
||||||
this.scriptsId = setScriptsId(); |
|
||||||
this.webPane = setWebPane(); |
|
||||||
} |
|
||||||
|
|
||||||
abstract String setMainJS(); |
|
||||||
|
|
||||||
abstract String setScriptsId(); |
|
||||||
|
|
||||||
abstract JFXPanel setWebPane(); |
|
||||||
|
|
||||||
public String getMainJS() { |
|
||||||
return mainJS; |
|
||||||
} |
|
||||||
|
|
||||||
public String getScriptsId() { |
|
||||||
return scriptsId; |
|
||||||
} |
|
||||||
|
|
||||||
public JFXPanel getWebPane() { |
|
||||||
return webPane; |
|
||||||
} |
|
||||||
} |
|
@ -1,307 +0,0 @@ |
|||||||
package com.fr.design.extra; |
|
||||||
|
|
||||||
import com.fr.design.dialog.BasicPane; |
|
||||||
import com.fr.design.dialog.FineJOptionPane; |
|
||||||
import com.fr.design.dialog.UIDialog; |
|
||||||
import com.fr.design.gui.frpane.UITabbedPane; |
|
||||||
import com.fr.design.login.utils.DesignerLoginUtils; |
|
||||||
import com.fr.design.mainframe.DesignerContext; |
|
||||||
import com.fr.general.CloudCenter; |
|
||||||
import com.fr.general.CommonIOUtils; |
|
||||||
import com.fr.general.ComparatorUtils; |
|
||||||
import com.fr.general.GeneralContext; |
|
||||||
import com.fr.general.IOUtils; |
|
||||||
import com.fr.general.http.HttpToolbox; |
|
||||||
import com.fr.json.JSONObject; |
|
||||||
import com.fr.log.FineLoggerFactory; |
|
||||||
import com.fr.plugin.PluginStoreConfig; |
|
||||||
import com.fr.plugin.PluginStoreConstants; |
|
||||||
import com.fr.stable.CommonUtils; |
|
||||||
import com.fr.stable.EnvChangedListener; |
|
||||||
import com.fanruan.product.ProductConstants; |
|
||||||
import com.fr.stable.StableUtils; |
|
||||||
|
|
||||||
import javax.swing.JOptionPane; |
|
||||||
import javax.swing.SwingWorker; |
|
||||||
import java.awt.BorderLayout; |
|
||||||
import java.awt.Component; |
|
||||||
import java.awt.Dialog; |
|
||||||
import java.awt.Frame; |
|
||||||
import java.awt.Window; |
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
import java.lang.reflect.Constructor; |
|
||||||
import java.util.concurrent.ExecutionException; |
|
||||||
|
|
||||||
/** |
|
||||||
* 在合适的 jre 环境下创建带有 WebView 的窗口 |
|
||||||
* |
|
||||||
* @author vito |
|
||||||
* @date 2016/9/28 |
|
||||||
*/ |
|
||||||
public class WebViewDlgHelper { |
|
||||||
private static final String LATEST = "latest"; |
|
||||||
private static final String SHOP_SCRIPTS = "shop_scripts"; |
|
||||||
private static final int VERSION_8 = 8; |
|
||||||
private static String installHome = PluginStoreConstants.getLocalInstallHome(); |
|
||||||
private static final String MAIN_JS_PATH = "/scripts/plugin.html"; |
|
||||||
|
|
||||||
static { |
|
||||||
GeneralContext.addEnvChangedListener(new EnvChangedListener() { |
|
||||||
@Override |
|
||||||
public void envChanged() { |
|
||||||
installHome = PluginStoreConstants.getLocalInstallHome(); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
public static void createPluginDialog() { |
|
||||||
if (StableUtils.getMajorJavaVersion() >= VERSION_8) { |
|
||||||
String mainJsPath = StableUtils.pathJoin(installHome, MAIN_JS_PATH); |
|
||||||
File file = new File(mainJsPath); |
|
||||||
if (!file.exists()) { |
|
||||||
int rv = FineJOptionPane.showConfirmDialog( |
|
||||||
null, |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install"), |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), |
|
||||||
JOptionPane.OK_CANCEL_OPTION, |
|
||||||
JOptionPane.INFORMATION_MESSAGE |
|
||||||
); |
|
||||||
if (rv == JOptionPane.OK_OPTION) { |
|
||||||
downloadShopScripts(SHOP_SCRIPTS); |
|
||||||
} |
|
||||||
return; |
|
||||||
} |
|
||||||
// 检测更新前先刷新一下版本号
|
|
||||||
PluginStoreConstants.refreshProps(); |
|
||||||
|
|
||||||
String jarVersion = PluginStoreConfig.getInstance().getEnvVersion(); |
|
||||||
if (ComparatorUtils.equals(jarVersion, ProductConstants.VERSION)) { |
|
||||||
updateShopScripts(SHOP_SCRIPTS); |
|
||||||
showPluginDlg(); |
|
||||||
} else { |
|
||||||
int rv = FineJOptionPane.showConfirmDialog( |
|
||||||
null, |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install_Version"), |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), |
|
||||||
JOptionPane.OK_CANCEL_OPTION, |
|
||||||
JOptionPane.INFORMATION_MESSAGE |
|
||||||
); |
|
||||||
if (rv == JOptionPane.OK_OPTION) { |
|
||||||
downloadShopScripts(SHOP_SCRIPTS); |
|
||||||
deleteExtraFile(StableUtils.pathJoin(installHome, "plugin.html")); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
} else { |
|
||||||
BasicPane traditionalStorePane = new BasicPane() { |
|
||||||
@Override |
|
||||||
protected String title4PopupWindow() { |
|
||||||
return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Manager"); |
|
||||||
} |
|
||||||
}; |
|
||||||
traditionalStorePane.setLayout(new BorderLayout()); |
|
||||||
traditionalStorePane.add(initTraditionalStore(), BorderLayout.CENTER); |
|
||||||
UIDialog dlg = new ShopDialog(DesignerContext.getDesignerFrame(), traditionalStorePane); |
|
||||||
dlg.setVisible(true); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 检查script文件夹中的plugin.html文件 |
|
||||||
*/ |
|
||||||
public static void checkAndCopyMainFile(String indexPath, String mainJsPath) { |
|
||||||
File file = new File(indexPath); |
|
||||||
if (!file.exists()) { |
|
||||||
copyMainFile(mainJsPath); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 將script文件夹中的plugin.html文件复制到webreport下 |
|
||||||
*/ |
|
||||||
private static void copyMainFile(String mainJsPath) { |
|
||||||
try { |
|
||||||
CommonIOUtils.copy(new File(mainJsPath), new File(installHome)); |
|
||||||
} catch (IOException e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* 删除9.0工程下无用的plugin.html文件 |
|
||||||
* |
|
||||||
* @param filePath 待删除文件路径 |
|
||||||
*/ |
|
||||||
private static void deleteExtraFile(String filePath) { |
|
||||||
CommonIOUtils.deleteFile(new File(filePath)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 以关键词打开设计器商店 |
|
||||||
* |
|
||||||
* @param keyword 关键词 |
|
||||||
*/ |
|
||||||
public static void createPluginDialog(String keyword) { |
|
||||||
PluginWebBridge.getHelper().openWithSearch(keyword); |
|
||||||
createPluginDialog(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 以关键词打开设计器商店显示搜索结果 |
|
||||||
* |
|
||||||
* @param keyword |
|
||||||
* @param data |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public static void showPluginInStore(String keyword, String data) { |
|
||||||
PluginWebBridge.getHelper().showResultInStore(keyword, data); |
|
||||||
createPluginDialog(); |
|
||||||
} |
|
||||||
|
|
||||||
public static void createLoginDialog() { |
|
||||||
if (StableUtils.getMajorJavaVersion() >= VERSION_8) { |
|
||||||
File file = new File(StableUtils.pathJoin(installHome, "scripts")); |
|
||||||
if (!file.exists()) { |
|
||||||
confirmDownLoadShopJS(); |
|
||||||
} else { |
|
||||||
showLoginDlg(DesignerContext.getDesignerFrame()); |
|
||||||
updateShopScripts(SHOP_SCRIPTS); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public static void createLoginDialog(Window parent) { |
|
||||||
if (StableUtils.getMajorJavaVersion() >= VERSION_8) { |
|
||||||
File file = new File(StableUtils.pathJoin(installHome, "scripts")); |
|
||||||
if (!file.exists()) { |
|
||||||
confirmDownLoadShopJS(); |
|
||||||
} else { |
|
||||||
showLoginDlg(parent); |
|
||||||
updateShopScripts(SHOP_SCRIPTS); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static void confirmDownLoadShopJS() { |
|
||||||
int rv = FineJOptionPane.showConfirmDialog( |
|
||||||
null, |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Install"), |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), |
|
||||||
JOptionPane.OK_CANCEL_OPTION, |
|
||||||
JOptionPane.INFORMATION_MESSAGE |
|
||||||
); |
|
||||||
if (rv == JOptionPane.OK_OPTION) { |
|
||||||
downloadShopScripts(SHOP_SCRIPTS); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static void showPluginDlg() { |
|
||||||
try { |
|
||||||
Class<?> clazz = Class.forName("com.fr.design.extra.PluginWebPane"); |
|
||||||
Constructor constructor = clazz.getConstructor(String.class, String.class); |
|
||||||
Component webPane = (Component) constructor.newInstance(installHome, MAIN_JS_PATH); |
|
||||||
|
|
||||||
BasicPane managerPane = new ShopManagerPane(webPane); |
|
||||||
UIDialog dlg = new ShopDialog(DesignerContext.getDesignerFrame(), managerPane); |
|
||||||
PluginWebBridge.getHelper().setDialogHandle(dlg); |
|
||||||
dlg.setVisible(true); |
|
||||||
DesignerLoginUtils.showPluginRemindOnFirstLaunch(dlg); |
|
||||||
} catch (Exception e) { |
|
||||||
// ignored
|
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static void showLoginDlg(Window window) { |
|
||||||
try { |
|
||||||
Class<?> clazz = Class.forName("com.fr.design.extra.LoginWebPane"); |
|
||||||
Constructor constructor = clazz.getConstructor(String.class); |
|
||||||
Component webPane = (Component) constructor.newInstance(installHome); |
|
||||||
UIDialog qqdlg; |
|
||||||
if (window instanceof Dialog) { |
|
||||||
qqdlg = new LoginDialog((Dialog) window, webPane); |
|
||||||
} else { |
|
||||||
qqdlg = new LoginDialog((Frame) window, webPane); |
|
||||||
} |
|
||||||
LoginWebBridge.getHelper().setDialogHandle(qqdlg); |
|
||||||
qqdlg.setVisible(true); |
|
||||||
} catch (Throwable ignored) { |
|
||||||
// ignored
|
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private static Component initTraditionalStore() { |
|
||||||
UITabbedPane tabbedPane = new UITabbedPane(); |
|
||||||
PluginInstalledPane installedPane = new PluginInstalledPane(); |
|
||||||
tabbedPane.addTab(installedPane.tabTitle(), installedPane); |
|
||||||
tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Update"), new PluginUpdatePane(tabbedPane)); |
|
||||||
tabbedPane.addTab(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_All_Plugins"), new PluginFromStorePane(tabbedPane)); |
|
||||||
return tabbedPane; |
|
||||||
} |
|
||||||
|
|
||||||
private static void downloadShopScripts(final String scriptsId) { |
|
||||||
new SwingWorker<Boolean, Void>() { |
|
||||||
@Override |
|
||||||
protected Boolean doInBackground() throws Exception { |
|
||||||
return PluginUtils.downloadShopScripts(scriptsId, new Process<Double>() { |
|
||||||
@Override |
|
||||||
public void process(Double integer) { |
|
||||||
// 这个注释毫无意义,就是为了通过SonarQube
|
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected void done() { |
|
||||||
|
|
||||||
try { |
|
||||||
if (get()) { |
|
||||||
File scriptZip = new File(StableUtils.pathJoin(PluginConstants.DOWNLOAD_PATH, PluginConstants.TEMP_FILE)); |
|
||||||
if (scriptZip.exists()) { |
|
||||||
IOUtils.unzip(scriptZip, installHome); |
|
||||||
CommonUtils.deleteFile(scriptZip); |
|
||||||
} |
|
||||||
PluginStoreConstants.refreshProps(); // 下载完刷新一下版本号等
|
|
||||||
FineJOptionPane.showMessageDialog(null, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Installed"), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Tool_Tips"), JOptionPane.INFORMATION_MESSAGE); |
|
||||||
} |
|
||||||
} catch (InterruptedException e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
Thread.currentThread().interrupt(); |
|
||||||
} catch (ExecutionException e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
}.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
private static void updateShopScripts(final String scriptsId) { |
|
||||||
new SwingWorker<Void, Void>() { |
|
||||||
@Override |
|
||||||
protected Void doInBackground() throws Exception { |
|
||||||
String url = CloudCenter.getInstance().acquireUrlByKind("shop.plugin.update"); |
|
||||||
if (url != null) { |
|
||||||
String text = HttpToolbox.get(url + "?" + PluginUtils.FR_VERSION + "=" + ProductConstants.VERSION + "&version=" + PluginStoreConfig.getInstance().getVersion()); |
|
||||||
JSONObject resultJSONObject = new JSONObject(text); |
|
||||||
String isLatest = resultJSONObject.optString("result"); |
|
||||||
if (!ComparatorUtils.equals(isLatest, LATEST)) { |
|
||||||
int rv = FineJOptionPane.showConfirmDialog( |
|
||||||
null, |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Shop_Need_Update"), |
|
||||||
com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Plugin_Warning"), |
|
||||||
JOptionPane.OK_CANCEL_OPTION, |
|
||||||
JOptionPane.INFORMATION_MESSAGE |
|
||||||
); |
|
||||||
if (rv == JOptionPane.OK_OPTION) { |
|
||||||
downloadShopScripts(scriptsId); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
}.execute(); |
|
||||||
} |
|
||||||
} |
|
@ -1,30 +0,0 @@ |
|||||||
package com.fr.design.login.executor; |
|
||||||
|
|
||||||
import com.fr.design.bridge.exec.JSExecutor; |
|
||||||
import com.teamdev.jxbrowser.chromium.JSFunction; |
|
||||||
import com.teamdev.jxbrowser.chromium.JSObject; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author richie |
|
||||||
* @version 10.0 |
|
||||||
* Created by richie on 2019-04-18 |
|
||||||
*/ |
|
||||||
public class DesignerLoginBrowserExecutor implements JSExecutor { |
|
||||||
|
|
||||||
public static DesignerLoginBrowserExecutor create(JSObject window, JSFunction callback) { |
|
||||||
return new DesignerLoginBrowserExecutor(window, callback); |
|
||||||
} |
|
||||||
|
|
||||||
private JSObject window; |
|
||||||
private JSFunction callback; |
|
||||||
|
|
||||||
private DesignerLoginBrowserExecutor(JSObject window, JSFunction callback) { |
|
||||||
this.window = window; |
|
||||||
this.callback = callback; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void executor(String newValue) { |
|
||||||
callback.invoke(window, newValue); |
|
||||||
} |
|
||||||
} |
|
@ -1,41 +1,31 @@ |
|||||||
package com.fr.design.os.impl; |
package com.fr.design.os.impl; |
||||||
|
|
||||||
import com.fr.config.ServerPreferenceConfig; |
|
||||||
import com.fr.design.DesignerEnvManager; |
|
||||||
import com.fr.design.extra.WebViewDlgHelper; |
|
||||||
import com.fr.design.jdk.JdkVersion; |
|
||||||
import com.fr.design.upm.UpmFinder; |
import com.fr.design.upm.UpmFinder; |
||||||
import com.fr.design.utils.DesignUtils; |
import com.fr.design.utils.DesignUtils; |
||||||
import com.fr.stable.StableUtils; |
import com.fr.log.FineLoggerFactory; |
||||||
import com.fr.stable.os.Arch; |
|
||||||
import com.fr.stable.os.OperatingSystem; |
import com.fr.stable.os.OperatingSystem; |
||||||
import com.fr.stable.os.support.OSBasedAction; |
import com.fr.stable.os.support.OSBasedAction; |
||||||
|
|
||||||
/** |
/** |
||||||
* 插件管理窗口 |
* 插件管理窗口 |
||||||
|
* |
||||||
* @author pengda |
* @author pengda |
||||||
* @date 2019/10/9 |
* @date 2019/10/9 |
||||||
*/ |
*/ |
||||||
public class PMDialogAction implements OSBasedAction { |
public class PMDialogAction implements OSBasedAction { |
||||||
private static String PLUGIN_MANAGER_ROUTE = "#management/plugin"; |
private static String PLUGIN_MANAGER_ROUTE = "#management/plugin"; |
||||||
|
|
||||||
@Override |
@Override |
||||||
public void execute(Object... objects) { |
public void execute(Object... objects) { |
||||||
if(Arch.getArch() == Arch.ARM || OperatingSystem.isLinux() || SupportOSImpl.MACOS_WEB_PLUGIN_MANAGEMENT.support()){ |
if (OperatingSystem.isLinux()) { |
||||||
DesignUtils.visitEnvServerByParameters( PLUGIN_MANAGER_ROUTE,null,null); |
DesignUtils.visitEnvServerByParameters(PLUGIN_MANAGER_ROUTE, null, null); |
||||||
return; |
return; |
||||||
} |
} |
||||||
if (checkUPMSupport()) { |
try { |
||||||
UpmFinder.showUPMDialog(); |
UpmFinder.showUPMDialog(); |
||||||
} else { |
} catch (Throwable e) { |
||||||
WebViewDlgHelper.createPluginDialog(); |
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||||
} |
DesignUtils.visitEnvServerByParameters(PLUGIN_MANAGER_ROUTE, null, null); |
||||||
} |
} |
||||||
|
|
||||||
private boolean checkUPMSupport() { |
|
||||||
return ServerPreferenceConfig.getInstance().isUseOptimizedUPM() |
|
||||||
|| SupportOSImpl.MACOS_NEW_PLUGIN_MANAGEMENT.support() |
|
||||||
|| DesignerEnvManager.getEnvManager().isUseOptimizedUPM4Adapter() |
|
||||||
//默认开启
|
|
||||||
|| DesignerEnvManager.getEnvManager().isUseNewPluginFirst(); |
|
||||||
} |
} |
||||||
} |
} |
||||||
|
@ -1,91 +0,0 @@ |
|||||||
package com.fr.design.ui; |
|
||||||
|
|
||||||
import com.fr.stable.StringUtils; |
|
||||||
import com.teamdev.jxbrowser.chromium.Browser; |
|
||||||
import com.teamdev.jxbrowser.chromium.BrowserContext; |
|
||||||
import com.teamdev.jxbrowser.chromium.BrowserPreferences; |
|
||||||
import com.teamdev.jxbrowser.chromium.ProtocolService; |
|
||||||
import com.teamdev.jxbrowser.chromium.URLResponse; |
|
||||||
|
|
||||||
import java.io.DataInputStream; |
|
||||||
import java.io.File; |
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.nio.file.Files; |
|
||||||
import java.nio.file.Path; |
|
||||||
import java.util.Collections; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author richie |
|
||||||
* @version 10.0 |
|
||||||
* Created by richie on 2019-03-07 |
|
||||||
*/ |
|
||||||
public class Assistant { |
|
||||||
|
|
||||||
public static void addChromiumSwitches(String... switches) { |
|
||||||
|
|
||||||
List<String> list = BrowserPreferences.getChromiumSwitches(); |
|
||||||
Collections.addAll(list, switches); |
|
||||||
|
|
||||||
BrowserPreferences.setChromiumSwitches((list.toArray(new String[0]))); |
|
||||||
} |
|
||||||
|
|
||||||
public static URLResponse inputStream2Response(InputStream inputStream, String filePath) throws Exception { |
|
||||||
URLResponse response = new URLResponse(); |
|
||||||
DataInputStream stream = new DataInputStream(inputStream); |
|
||||||
byte[] data = new byte[stream.available()]; |
|
||||||
stream.readFully(data); |
|
||||||
response.setData(data); |
|
||||||
String mimeType = getMimeType(filePath); |
|
||||||
response.getHeaders().setHeader("Content-Type", mimeType); |
|
||||||
return response; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
private static String getMimeType(String path) { |
|
||||||
if (StringUtils.isBlank(path)) { |
|
||||||
return "text/html"; |
|
||||||
} |
|
||||||
if (path.endsWith(".html")) { |
|
||||||
return "text/html"; |
|
||||||
} |
|
||||||
if (path.endsWith(".css")) { |
|
||||||
return "text/css"; |
|
||||||
} |
|
||||||
if (path.endsWith(".js")) { |
|
||||||
return "text/javascript"; |
|
||||||
} |
|
||||||
if (path.endsWith(".svg")) { |
|
||||||
return "image/svg+xml"; |
|
||||||
} |
|
||||||
// upm 文件夹中的图片如果返回 Content-type 为 image/png 时会显示异常
|
|
||||||
if (path.endsWith(".png") && !path.contains("/upm")) { |
|
||||||
return "image/png"; |
|
||||||
} |
|
||||||
if (path.endsWith(".woff")) { |
|
||||||
return "font/woff"; |
|
||||||
} |
|
||||||
if (path.endsWith(".ttf")) { |
|
||||||
return "truetype"; |
|
||||||
} |
|
||||||
if (path.endsWith(".eot")) { |
|
||||||
return "embedded-opentype"; |
|
||||||
} |
|
||||||
|
|
||||||
Path file = new File(path).toPath(); |
|
||||||
try { |
|
||||||
return Files.probeContentType(file); |
|
||||||
} catch (IOException e) { |
|
||||||
return "text/html"; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static void setEmbProtocolHandler(Browser browser, EmbProtocolHandler handler) { |
|
||||||
BrowserContext browserContext = browser.getContext(); |
|
||||||
ProtocolService protocolService = browserContext.getProtocolService(); |
|
||||||
// 支持读取jar包中文件的自定义协议————emb:/com/fr/design/images/bbs.png
|
|
||||||
protocolService.setProtocolHandler("emb", handler); |
|
||||||
protocolService.setProtocolHandler("file", handler); |
|
||||||
} |
|
||||||
} |
|
@ -1,135 +0,0 @@ |
|||||||
package com.fr.design.ui; |
|
||||||
|
|
||||||
import com.fr.base.TemplateUtils; |
|
||||||
import com.fr.general.IOUtils; |
|
||||||
import com.fr.log.FineLoggerFactory; |
|
||||||
import com.fr.stable.EncodeConstants; |
|
||||||
import com.fr.stable.StringUtils; |
|
||||||
import com.fr.third.org.apache.commons.codec.net.URLCodec; |
|
||||||
import com.fr.third.org.apache.commons.io.FileUtils; |
|
||||||
import com.fr.third.org.apache.commons.io.FilenameUtils; |
|
||||||
import com.fr.web.struct.AssembleComponent; |
|
||||||
import com.fr.web.struct.AtomBuilder; |
|
||||||
import com.fr.web.struct.PathGroup; |
|
||||||
import com.fr.web.struct.category.ScriptPath; |
|
||||||
import com.fr.web.struct.category.StylePath; |
|
||||||
import com.teamdev.jxbrowser.chromium.ProtocolHandler; |
|
||||||
import com.teamdev.jxbrowser.chromium.URLRequest; |
|
||||||
import com.teamdev.jxbrowser.chromium.URLResponse; |
|
||||||
|
|
||||||
import java.io.ByteArrayInputStream; |
|
||||||
import java.io.File; |
|
||||||
import java.io.FileInputStream; |
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.io.StringReader; |
|
||||||
import java.net.URI; |
|
||||||
import java.nio.charset.StandardCharsets; |
|
||||||
import java.util.Map; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author richie |
|
||||||
* @version 10.0 |
|
||||||
* Created by richie on 2019-03-07 |
|
||||||
*/ |
|
||||||
public class EmbProtocolHandler implements ProtocolHandler { |
|
||||||
|
|
||||||
private AssembleComponent component; |
|
||||||
private Map<String, String> map; |
|
||||||
|
|
||||||
public EmbProtocolHandler() { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
public EmbProtocolHandler(AssembleComponent component) { |
|
||||||
this.component = component; |
|
||||||
} |
|
||||||
|
|
||||||
public EmbProtocolHandler(AssembleComponent component, Map<String, String> map) { |
|
||||||
this.component = component; |
|
||||||
this.map = map; |
|
||||||
} |
|
||||||
|
|
||||||
public EmbProtocolHandler(Map<String, String> map) { |
|
||||||
this.map = map; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public URLResponse onRequest(URLRequest req) { |
|
||||||
InputStream inputStream = null; |
|
||||||
try { |
|
||||||
String path = req.getURL(); |
|
||||||
if (path.startsWith("file:")) { |
|
||||||
String url = new URLCodec().decode(path); |
|
||||||
String filePath = TemplateUtils.renderParameter4Tpl(url, map); |
|
||||||
File file = new File(URI.create(filePath).getPath()); |
|
||||||
inputStream = IOUtils.readResource(file.getAbsolutePath()); |
|
||||||
String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); |
|
||||||
text = TemplateUtils.renderParameter4Tpl(text, map); |
|
||||||
return Assistant.inputStream2Response(new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)), path); |
|
||||||
} else if (path.startsWith("emb:dynamic")) { |
|
||||||
URLResponse response = new URLResponse(); |
|
||||||
response.setData(htmlText(map).getBytes()); |
|
||||||
response.getHeaders().setHeader("Content-Type", "text/html"); |
|
||||||
return response; |
|
||||||
} else { |
|
||||||
int index = path.indexOf("="); |
|
||||||
if (index > 0) { |
|
||||||
path = path.substring(index + 1); |
|
||||||
} else { |
|
||||||
path = path.substring(4); |
|
||||||
} |
|
||||||
inputStream = IOUtils.readResource(path); |
|
||||||
if (path.endsWith(".html")) { |
|
||||||
String text = IOUtils.inputStream2String(inputStream, EncodeConstants.ENCODING_UTF_8); |
|
||||||
text = TemplateUtils.renderParameter4Tpl(text, map); |
|
||||||
return Assistant.inputStream2Response(new ByteArrayInputStream(text.getBytes(StandardCharsets.UTF_8)), path); |
|
||||||
} |
|
||||||
return Assistant.inputStream2Response(inputStream, path); |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
|
||||||
} finally { |
|
||||||
if (inputStream != null) { |
|
||||||
try { |
|
||||||
inputStream.close(); |
|
||||||
} catch (IOException e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
private String htmlText(Map<String, String> map) { |
|
||||||
PathGroup pathGroup = AtomBuilder.create().buildAssembleFilePath(ModernRequestClient.KEY, component); |
|
||||||
StylePath[] stylePaths = pathGroup.toStylePathGroup(); |
|
||||||
StringBuilder styleText = new StringBuilder(); |
|
||||||
for (StylePath path : stylePaths) { |
|
||||||
if (StringUtils.isNotBlank(path.toFilePath())) { |
|
||||||
styleText.append("<link rel=\"stylesheet\" href=\"emb:"); |
|
||||||
styleText.append(path.toFilePath()); |
|
||||||
styleText.append("\"/>"); |
|
||||||
} |
|
||||||
} |
|
||||||
String result = ModernUIConstants.HTML_TPL.replaceAll("##style##", styleText.toString()); |
|
||||||
ScriptPath[] scriptPaths = pathGroup.toScriptPathGroup(); |
|
||||||
StringBuilder scriptText = new StringBuilder(); |
|
||||||
for (ScriptPath path : scriptPaths) { |
|
||||||
if (StringUtils.isNotBlank(path.toFilePath())) { |
|
||||||
scriptText.append("<script src=\"emb:"); |
|
||||||
scriptText.append(path.toFilePath()); |
|
||||||
scriptText.append("\"></script>"); |
|
||||||
} |
|
||||||
} |
|
||||||
result = result.replaceAll("##script##", scriptText.toString()); |
|
||||||
if (map != null) { |
|
||||||
for (Map.Entry<String, String> entry : map.entrySet()) { |
|
||||||
String key = entry.getKey(); |
|
||||||
String value = entry.getValue(); |
|
||||||
result = result.replaceAll("\\$\\{" + key + "}", value); |
|
||||||
} |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
} |
|
@ -1,364 +0,0 @@ |
|||||||
package com.fr.design.ui; |
|
||||||
|
|
||||||
import com.fr.design.DesignerEnvManager; |
|
||||||
import com.fr.design.dialog.BasicPane; |
|
||||||
import com.fr.design.gui.ibutton.UIButton; |
|
||||||
import com.fr.design.gui.itoolbar.UIToolbar; |
|
||||||
import com.fr.design.i18n.Toolkit; |
|
||||||
import com.fr.design.ui.compatible.BuilderDiff; |
|
||||||
import com.fr.design.utils.gui.GUICoreUtils; |
|
||||||
import com.fr.web.struct.AssembleComponent; |
|
||||||
import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; |
|
||||||
import com.teamdev.jxbrowser.chromium.Browser; |
|
||||||
import com.teamdev.jxbrowser.chromium.BrowserType; |
|
||||||
import com.teamdev.jxbrowser.chromium.JSValue; |
|
||||||
import com.teamdev.jxbrowser.chromium.events.LoadListener; |
|
||||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; |
|
||||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; |
|
||||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; |
|
||||||
import com.teamdev.jxbrowser.chromium.swing.BrowserView; |
|
||||||
import com.teamdev.jxbrowser.event.Observer; |
|
||||||
|
|
||||||
import javax.swing.JDialog; |
|
||||||
import javax.swing.SwingUtilities; |
|
||||||
import javax.swing.WindowConstants; |
|
||||||
import java.awt.BorderLayout; |
|
||||||
import java.awt.Dimension; |
|
||||||
import java.awt.event.ActionEvent; |
|
||||||
import java.awt.event.ActionListener; |
|
||||||
import java.io.File; |
|
||||||
import java.util.Map; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author richie |
|
||||||
* @version 10.0 |
|
||||||
* Created by richie on 2019-03-04 |
|
||||||
* 用于加载html5的Swing容器,可以在设计选项设置中打开调试窗口,示例可查看:com.fr.design.ui.ModernUIPaneTest |
|
||||||
* @see {@link com.fr.design.jxbrowser.JxUIPane} |
|
||||||
* @deprecated 主要用于jxbrowser6,将在下个版本删除 |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public class ModernUIPane<T> extends BasicPane { |
|
||||||
|
|
||||||
private Browser browser; |
|
||||||
private String namespace = "Pool"; |
|
||||||
private String variable = "data"; |
|
||||||
private String expression = "update()"; |
|
||||||
|
|
||||||
private ModernUIPane(BrowserType browserType) { |
|
||||||
initialize(browserType); |
|
||||||
} |
|
||||||
|
|
||||||
protected ModernUIPane() { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
private void initialize(BrowserType browserType) { |
|
||||||
if (browser == null) { |
|
||||||
setLayout(new BorderLayout()); |
|
||||||
Assistant.addChromiumSwitches("--disable-google-traffic"); |
|
||||||
if (DesignerEnvManager.getEnvManager().isOpenDebug()) { |
|
||||||
UIToolbar toolbar = new UIToolbar(); |
|
||||||
add(toolbar, BorderLayout.NORTH); |
|
||||||
UIButton openDebugButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Open_Debug_Window")); |
|
||||||
toolbar.add(openDebugButton); |
|
||||||
UIButton reloadButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Reload")); |
|
||||||
toolbar.add(reloadButton); |
|
||||||
UIButton closeButton = new UIButton(Toolkit.i18nText("Fine-Design_Basic_Close_Window")); |
|
||||||
toolbar.add(closeButton); |
|
||||||
|
|
||||||
openDebugButton.addActionListener(new ActionListener() { |
|
||||||
@Override |
|
||||||
public void actionPerformed(ActionEvent e) { |
|
||||||
showDebuggerDialog(); |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
reloadButton.addActionListener(new ActionListener() { |
|
||||||
@Override |
|
||||||
public void actionPerformed(ActionEvent e) { |
|
||||||
browser.reloadIgnoringCache(); |
|
||||||
} |
|
||||||
}); |
|
||||||
|
|
||||||
closeButton.addActionListener(new ActionListener() { |
|
||||||
@Override |
|
||||||
public void actionPerformed(ActionEvent e) { |
|
||||||
SwingUtilities.getWindowAncestor(ModernUIPane.this).setVisible(false); |
|
||||||
} |
|
||||||
}); |
|
||||||
Assistant.addChromiumSwitches("--remote-debugging-port=9222"); |
|
||||||
initializeBrowser(browserType); |
|
||||||
add(new BrowserView(browser), BorderLayout.CENTER); |
|
||||||
} else { |
|
||||||
initializeBrowser(browserType); |
|
||||||
add(new BrowserView(browser), BorderLayout.CENTER); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private void showDebuggerDialog() { |
|
||||||
JDialog dialog = new JDialog(SwingUtilities.getWindowAncestor(this)); |
|
||||||
Browser debugger = new Browser(); |
|
||||||
BrowserView debuggerView = new BrowserView(debugger); |
|
||||||
dialog.add(debuggerView, BorderLayout.CENTER); |
|
||||||
dialog.setSize(new Dimension(800, 400)); |
|
||||||
GUICoreUtils.centerWindow(dialog); |
|
||||||
dialog.setVisible(true); |
|
||||||
dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); |
|
||||||
debugger.loadURL(browser.getRemoteDebuggingURL()); |
|
||||||
} |
|
||||||
|
|
||||||
private void initializeBrowser(BrowserType browserType) { |
|
||||||
browser = new Browser(browserType); |
|
||||||
// 初始化的时候,就把命名空间对象初始化好,确保window.a.b.c("a.b.c"为命名空间)对象都是初始化过的
|
|
||||||
browser.addScriptContextListener(new ScriptContextAdapter() { |
|
||||||
@Override |
|
||||||
public void onScriptContextCreated(ScriptContextEvent event) { |
|
||||||
event.getBrowser().executeJavaScript(String.format(ModernUIConstants.SCRIPT_INIT_NAME_SPACE, namespace)); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 转向一个新的地址,相当于重新加载 |
|
||||||
* |
|
||||||
* @param url 新的地址 |
|
||||||
*/ |
|
||||||
public void redirect(String url) { |
|
||||||
browser.loadURL(url); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 转向一个新的地址,相当于重新加载 |
|
||||||
* |
|
||||||
* @param url 新的地址 |
|
||||||
* @param map 初始化参数 |
|
||||||
*/ |
|
||||||
public void redirect(String url, Map<String, String> map) { |
|
||||||
Assistant.setEmbProtocolHandler(browser, new EmbProtocolHandler(map)); |
|
||||||
browser.loadURL(url); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected String title4PopupWindow() { |
|
||||||
return "Modern"; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
public void populate(final T t) { |
|
||||||
browser.addScriptContextListener(new ScriptContextAdapter() { |
|
||||||
@Override |
|
||||||
public void onScriptContextCreated(ScriptContextEvent event) { |
|
||||||
JSValue ns = event.getBrowser().executeJavaScriptAndReturnValue("window." + namespace); |
|
||||||
ns.asObject().setProperty(variable, t); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
|
|
||||||
public T update() { |
|
||||||
JSValue jsValue = browser.executeJavaScriptAndReturnValue("window." + namespace + "." + expression); |
|
||||||
if (jsValue.isObject()) { |
|
||||||
return (T) jsValue.asJavaObject(); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
public void disposeBrowser() { |
|
||||||
|
|
||||||
if (browser != null) { |
|
||||||
browser.dispose(); |
|
||||||
browser = null; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
public void clearCache() { |
|
||||||
if (browser != null) { |
|
||||||
browser.getCacheStorage().clearCache(); |
|
||||||
File file = new File(browser.getContext().getCacheDir()); |
|
||||||
if (file.exists()) { |
|
||||||
file.delete(); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public void executeJavaScript(String javaScript) { |
|
||||||
if (browser != null) { |
|
||||||
browser.executeJavaScript(javaScript); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public JSValue executeJavaScriptAndReturnValue(String javaScript) { |
|
||||||
if (browser != null) { |
|
||||||
return browser.executeJavaScriptAndReturnValue(javaScript); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* ModernUIPane 建造者 |
|
||||||
* |
|
||||||
* @param <T> |
|
||||||
*/ |
|
||||||
public static class Builder<T> implements BuilderDiff<T> { |
|
||||||
|
|
||||||
private ModernUIPane<T> pane; |
|
||||||
|
|
||||||
public Builder() { |
|
||||||
this(BrowserType.HEAVYWEIGHT); |
|
||||||
} |
|
||||||
|
|
||||||
public Builder(BrowserType browserType) { |
|
||||||
this.pane = new ModernUIPane<>(browserType); |
|
||||||
} |
|
||||||
|
|
||||||
public Builder(ModernUIPane<T> pane) { |
|
||||||
this.pane = pane; |
|
||||||
} |
|
||||||
|
|
||||||
public Builder<T> prepare(ScriptContextListener contextListener) { |
|
||||||
pane.browser.addScriptContextListener(contextListener); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
public Builder<T> prepare(LoadListener loadListener) { |
|
||||||
pane.browser.addLoadListener(loadListener); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 加载jar包中的资源 |
|
||||||
* |
|
||||||
* @param path 资源路径 |
|
||||||
*/ |
|
||||||
public Builder<T> withEMB(final String path) { |
|
||||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); |
|
||||||
pane.browser.loadURL("emb:" + path); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 加载jar包中的资源 |
|
||||||
* |
|
||||||
* @param path 资源路径 |
|
||||||
*/ |
|
||||||
public Builder<T> withEMB(final String path, Map<String, String> map) { |
|
||||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(map)); |
|
||||||
pane.browser.loadURL("emb:" + path); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 加载url指向的资源 |
|
||||||
* |
|
||||||
* @param url 文件的地址 |
|
||||||
*/ |
|
||||||
public Builder<T> withURL(final String url) { |
|
||||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); |
|
||||||
pane.browser.loadURL(url); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 加载url指向的资源 |
|
||||||
* |
|
||||||
* @param url 文件的地址 |
|
||||||
*/ |
|
||||||
public Builder<T> withURL(final String url, Map<String, String> map) { |
|
||||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(map)); |
|
||||||
pane.browser.loadURL(url); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 加载Atom组件 |
|
||||||
* |
|
||||||
* @param component Atom组件 |
|
||||||
*/ |
|
||||||
public Builder<T> withComponent(AssembleComponent component) { |
|
||||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(component)); |
|
||||||
pane.browser.loadURL("emb:dynamic"); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 加载Atom组件 |
|
||||||
* |
|
||||||
* @param component Atom组件 |
|
||||||
*/ |
|
||||||
public Builder<T> withComponent(AssembleComponent component, Map<String, String> map) { |
|
||||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler(component, map)); |
|
||||||
pane.browser.loadURL("emb:dynamic"); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 加载html文本内容 |
|
||||||
* |
|
||||||
* @param html 要加载html文本内容 |
|
||||||
*/ |
|
||||||
public Builder<T> withHTML(String html) { |
|
||||||
Assistant.setEmbProtocolHandler(pane.browser, new EmbProtocolHandler()); |
|
||||||
pane.browser.loadHTML(html); |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 设置该前端页面做数据交换所使用的对象 |
|
||||||
* |
|
||||||
* @param namespace 对象名 |
|
||||||
*/ |
|
||||||
public Builder<T> namespace(String namespace) { |
|
||||||
pane.namespace = namespace; |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* java端往js端传数据时使用的变量名字 |
|
||||||
* |
|
||||||
* @param name 变量的名字 |
|
||||||
*/ |
|
||||||
public Builder<T> variable(String name) { |
|
||||||
pane.variable = name; |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* js端往java端传数据时执行的函数表达式 |
|
||||||
* |
|
||||||
* @param expression 函数表达式 |
|
||||||
*/ |
|
||||||
public Builder<T> expression(String expression) { |
|
||||||
pane.expression = expression; |
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Builder<T> prepareForV6(ScriptContextListener contextListener) { |
|
||||||
return prepare(contextListener); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Builder<T> prepareForV6(LoadListener loadListener) { |
|
||||||
return prepare(loadListener); |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Builder<T> prepareForV7(InjectJsCallback callback) { |
|
||||||
// do nothing
|
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public Builder<T> prepareForV7(Class event, Observer listener) { |
|
||||||
// do nothing
|
|
||||||
return this; |
|
||||||
} |
|
||||||
|
|
||||||
public ModernUIPane<T> build() { |
|
||||||
return pane; |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,55 +0,0 @@ |
|||||||
package com.fr.design.ui.compatible; |
|
||||||
|
|
||||||
import com.fr.design.jxbrowser.JxUIPane; |
|
||||||
import com.fr.design.ui.ModernUIPane; |
|
||||||
import com.teamdev.jxbrowser.browser.callback.InjectJsCallback; |
|
||||||
import com.teamdev.jxbrowser.chromium.events.LoadListener; |
|
||||||
import com.teamdev.jxbrowser.chromium.events.ScriptContextListener; |
|
||||||
import com.teamdev.jxbrowser.event.Observer; |
|
||||||
|
|
||||||
/** |
|
||||||
* 封装jxbrwoser v6/v7的构建方式的差异 |
|
||||||
* |
|
||||||
* @author hades |
|
||||||
* @see {@link JxUIPane} |
|
||||||
* @since 10.0 |
|
||||||
* Created on 2021/6/13 |
|
||||||
* @deprecated 6在下个版本弃用 |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public interface BuilderDiff<T> { |
|
||||||
|
|
||||||
/** |
|
||||||
* v6准备工作 |
|
||||||
* |
|
||||||
* @param contextListener 上下文监听器 |
|
||||||
* @return 构造器 |
|
||||||
*/ |
|
||||||
ModernUIPane.Builder<T> prepareForV6(ScriptContextListener contextListener); |
|
||||||
|
|
||||||
/** |
|
||||||
* v6准备工作 |
|
||||||
* |
|
||||||
* @param loadListener 加载监听器 |
|
||||||
* @return 构造器 |
|
||||||
*/ |
|
||||||
ModernUIPane.Builder<T> prepareForV6(LoadListener loadListener); |
|
||||||
|
|
||||||
/** |
|
||||||
* v7准备工作 |
|
||||||
* |
|
||||||
* @param callback 注入js回调器 |
|
||||||
* @return 构造器 |
|
||||||
*/ |
|
||||||
ModernUIPane.Builder<T> prepareForV7(InjectJsCallback callback); |
|
||||||
|
|
||||||
/** |
|
||||||
* v7准备工作 |
|
||||||
* |
|
||||||
* @param event 事件 |
|
||||||
* @param listener 监听器 |
|
||||||
* @return 构造器 |
|
||||||
*/ |
|
||||||
ModernUIPane.Builder<T> prepareForV7(Class event, Observer listener); |
|
||||||
|
|
||||||
} |
|
@ -1,45 +0,0 @@ |
|||||||
package com.fr.design.ui.compatible; |
|
||||||
|
|
||||||
import com.fr.design.jxbrowser.JxUIPane; |
|
||||||
import com.fr.design.ui.ModernUIPane; |
|
||||||
|
|
||||||
/** |
|
||||||
* 根据版本选择构造器 |
|
||||||
* |
|
||||||
* @author hades |
|
||||||
* @see {@link JxUIPane} |
|
||||||
* @since 10.0 |
|
||||||
* Created on 2021/6/13 |
|
||||||
* @deprecated 6在下个版本弃用 |
|
||||||
*/ |
|
||||||
public class ModernUIPaneFactory { |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取一个 JxBrowser pane 的构造器 |
|
||||||
* |
|
||||||
* @param <T> 参数 |
|
||||||
* @return 构造器 |
|
||||||
*/ |
|
||||||
public static <T> ModernUIPane.Builder<T> modernUIPaneBuilder() { |
|
||||||
if (isV7()) { |
|
||||||
return new JxUIPane.Builder<>(); |
|
||||||
} else { |
|
||||||
return new ModernUIPane.Builder<>(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 判断 JxBrowser 版本是否在7或之上 |
|
||||||
* |
|
||||||
* @return 是否7或之上 |
|
||||||
*/ |
|
||||||
public static boolean isV7() { |
|
||||||
boolean jxBrowserV7 = true; |
|
||||||
try { |
|
||||||
Class.forName("com.teamdev.jxbrowser.net.Scheme"); |
|
||||||
} catch (ClassNotFoundException e) { |
|
||||||
jxBrowserV7 = false; |
|
||||||
} |
|
||||||
return jxBrowserV7; |
|
||||||
} |
|
||||||
} |
|
@ -1,515 +0,0 @@ |
|||||||
package com.fr.design.upm; |
|
||||||
|
|
||||||
import com.fr.config.ServerPreferenceConfig; |
|
||||||
import com.fr.decision.webservice.v10.plugin.helper.category.impl.UpmResourceLoader; |
|
||||||
import com.fr.design.DesignerEnvManager; |
|
||||||
import com.fr.design.bridge.exec.JSBridge; |
|
||||||
import com.fr.design.bridge.exec.JSCallback; |
|
||||||
import com.fr.design.extra.PluginOperateUtils; |
|
||||||
import com.fr.design.extra.PluginUtils; |
|
||||||
import com.fr.design.extra.exe.GetInstalledPluginsExecutor; |
|
||||||
import com.fr.design.extra.exe.GetPluginCategoriesExecutor; |
|
||||||
import com.fr.design.extra.exe.GetPluginFromStoreExecutor; |
|
||||||
import com.fr.design.extra.exe.GetPluginPrefixExecutor; |
|
||||||
import com.fr.design.extra.exe.PluginLoginExecutor; |
|
||||||
import com.fr.design.extra.exe.ReadUpdateOnlineExecutor; |
|
||||||
import com.fr.design.extra.exe.SearchOnlineExecutor; |
|
||||||
import com.fr.design.gui.ifilechooser.FileChooserArgs; |
|
||||||
import com.fr.design.gui.ifilechooser.FileChooserFactory; |
|
||||||
import com.fr.design.gui.ifilechooser.FileChooserProvider; |
|
||||||
import com.fr.design.gui.ifilechooser.FileSelectionMode; |
|
||||||
import com.fr.design.i18n.Toolkit; |
|
||||||
import com.fr.design.locale.impl.BbsRegisterMark; |
|
||||||
import com.fr.design.locale.impl.BbsResetMark; |
|
||||||
import com.fr.design.locale.impl.BbsSpaceMark; |
|
||||||
import com.fr.design.login.utils.DesignerLoginUtils; |
|
||||||
import com.fr.design.ui.util.UIUtil; |
|
||||||
import com.fr.design.upm.event.DownloadEvent; |
|
||||||
import com.fr.design.upm.exec.UpmBrowserExecutor; |
|
||||||
import com.fr.design.upm.task.UpmTaskWorker; |
|
||||||
import com.fr.design.utils.BrowseUtils; |
|
||||||
import com.fr.event.EventDispatcher; |
|
||||||
import com.fr.general.GeneralUtils; |
|
||||||
import com.fr.general.locale.LocaleCenter; |
|
||||||
import com.fr.general.locale.LocaleMark; |
|
||||||
import com.fr.json.JSONObject; |
|
||||||
import com.fr.log.FineLoggerFactory; |
|
||||||
import com.fr.plugin.context.PluginMarker; |
|
||||||
import com.fr.stable.ArrayUtils; |
|
||||||
import com.fr.stable.StringUtils; |
|
||||||
import com.teamdev.jxbrowser.chromium.Browser; |
|
||||||
import com.teamdev.jxbrowser.chromium.JSArray; |
|
||||||
import com.teamdev.jxbrowser.chromium.JSFunction; |
|
||||||
import com.teamdev.jxbrowser.chromium.JSObject; |
|
||||||
|
|
||||||
import javax.swing.JFileChooser; |
|
||||||
import javax.swing.SwingUtilities; |
|
||||||
import javax.swing.SwingWorker; |
|
||||||
import javax.swing.filechooser.FileNameExtensionFilter; |
|
||||||
import java.awt.Desktop; |
|
||||||
import java.io.File; |
|
||||||
import java.net.URI; |
|
||||||
import java.util.ArrayList; |
|
||||||
import java.util.List; |
|
||||||
import java.util.concurrent.Callable; |
|
||||||
import java.util.concurrent.FutureTask; |
|
||||||
import java.util.concurrent.RunnableFuture; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author richie |
|
||||||
* @version 10.0 |
|
||||||
* Created by richie on 2019-04-12 |
|
||||||
* 桥接Java和JavaScript的类 |
|
||||||
* @deprecated 用于jxbrowser6,下版本删除 |
|
||||||
*/ |
|
||||||
@Deprecated |
|
||||||
public class UpmBridge { |
|
||||||
|
|
||||||
public static UpmBridge getBridge(Browser browser) { |
|
||||||
return new UpmBridge(browser); |
|
||||||
} |
|
||||||
|
|
||||||
private JSObject window; |
|
||||||
|
|
||||||
private UpmBridge(Browser browser) { |
|
||||||
this.window = browser.executeJavaScriptAndReturnValue("window").asObject(); |
|
||||||
} |
|
||||||
|
|
||||||
protected UpmBridge() { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 更新插件管理中心资源文件,这个方法仅仅是为了语义上的作用(更新) |
|
||||||
* |
|
||||||
* @param callback 安装完成后的回调函数 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void update(final JSFunction callback) { |
|
||||||
callback.invoke(window, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); |
|
||||||
try { |
|
||||||
UpmResourceLoader.INSTANCE.download(); |
|
||||||
UpmResourceLoader.INSTANCE.install(); |
|
||||||
callback.invoke(window, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); |
|
||||||
EventDispatcher.fire(DownloadEvent.UPDATE, "success"); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
callback.invoke(window, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 下载并安装插件管理中心的资源文件 |
|
||||||
* |
|
||||||
* @param callback 安装完成后的回调函数 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void startDownload(final JSFunction callback) { |
|
||||||
callback.invoke(window, "start", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Start")); |
|
||||||
new SwingWorker<Void, Void>() { |
|
||||||
@Override |
|
||||||
protected Void doInBackground() throws Exception { |
|
||||||
UpmResourceLoader.INSTANCE.download(); |
|
||||||
UpmResourceLoader.INSTANCE.install(); |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
protected void done() { |
|
||||||
try { |
|
||||||
get(); |
|
||||||
callback.invoke(window, "success", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Success")); |
|
||||||
EventDispatcher.fire(DownloadEvent.SUCCESS, "success"); |
|
||||||
} catch (Exception e) { |
|
||||||
callback.invoke(window, "error", Toolkit.i18nText("Fine-Design_Basic_Update_Plugin_Manager_Download_Error")); |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
EventDispatcher.fire(DownloadEvent.ERROR, "error"); |
|
||||||
} |
|
||||||
} |
|
||||||
}.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取upm的版本信息 |
|
||||||
* |
|
||||||
* @return 版本信息 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public String getVersion() { |
|
||||||
return ServerPreferenceConfig.getInstance().getOptimizedUPMVersion(); |
|
||||||
} |
|
||||||
|
|
||||||
@JSBridge |
|
||||||
public String i18nText(String key) { |
|
||||||
return Toolkit.i18nText(key); |
|
||||||
} |
|
||||||
|
|
||||||
@JSBridge |
|
||||||
public void closeWindow() { |
|
||||||
UIUtil.invokeLaterIfNeeded(UpmFinder::closeWindow); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
@JSBridge |
|
||||||
public boolean isDesigner() { |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
@JSBridge |
|
||||||
public void getPackInfo(final JSFunction callback) { |
|
||||||
callback.invoke(window, StringUtils.EMPTY); |
|
||||||
} |
|
||||||
|
|
||||||
@JSBridge |
|
||||||
public void getPluginPrefix(final JSFunction callback) { |
|
||||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginPrefixExecutor()); |
|
||||||
task.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 在线获取插件分类 |
|
||||||
* |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void getPluginCategories(final JSFunction callback) { |
|
||||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginCategoriesExecutor()); |
|
||||||
task.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 根据条件获取在线插件 |
|
||||||
* |
|
||||||
* @param info 插件信息 |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void getPluginFromStoreNew(String info, final JSFunction callback) { |
|
||||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetPluginFromStoreExecutor(new JSONObject(info))); |
|
||||||
task.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 已安装插件检查更新 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void readUpdateOnline(final JSFunction callback) { |
|
||||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new ReadUpdateOnlineExecutor()); |
|
||||||
task.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 获取已经安装的插件的数组 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void getInstalledPlugins(final JSFunction callback) { |
|
||||||
UpmTaskWorker<Void> task = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new GetInstalledPluginsExecutor()); |
|
||||||
task.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从插件服务器上更新选中的插件 |
|
||||||
* |
|
||||||
* @param pluginIDs 插件集合 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void updatePluginOnline(Object pluginIDs, final JSFunction callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
|
||||||
List<PluginMarker> pluginMarkerList = new ArrayList<>(); |
|
||||||
if (pluginIDs instanceof String) { |
|
||||||
pluginMarkerList.add(PluginUtils.createPluginMarker(pluginIDs.toString())); |
|
||||||
} else if (pluginIDs instanceof JSArray) { |
|
||||||
JSArray pluginInfos = (JSArray) pluginIDs; |
|
||||||
for (int i = 0, len = pluginInfos.length(); i < len; i++) { |
|
||||||
String value = pluginInfos.get(i).asString().getValue(); |
|
||||||
pluginMarkerList.add(PluginUtils.createPluginMarker(value)); |
|
||||||
} |
|
||||||
} |
|
||||||
PluginOperateUtils.updatePluginOnline(pluginMarkerList, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 搜索在线插件 |
|
||||||
* |
|
||||||
* @param keyword 关键字 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void searchPlugin(String keyword, final JSFunction callback) { |
|
||||||
UpmTaskWorker<Void> worker = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new SearchOnlineExecutor(keyword)); |
|
||||||
worker.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从磁盘上选择插件安装包进行安装 |
|
||||||
* |
|
||||||
* @param filePath 插件包的路径 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void installPluginFromDisk(final String filePath, final JSFunction callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
|
||||||
File file = new File(filePath); |
|
||||||
PluginOperateUtils.installPluginFromDisk(file, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 卸载当前选中的插件 |
|
||||||
* |
|
||||||
* @param pluginInfo 插件信息 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void uninstallPlugin(final String pluginInfo, final boolean isForce, final JSFunction callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
|
||||||
PluginOperateUtils.uninstallPlugin(pluginInfo, isForce, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从插件服务器上安装插件 |
|
||||||
* |
|
||||||
* @param pluginInfo 插件的ID |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void installPluginOnline(final String pluginInfo, final JSFunction callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
|
||||||
PluginMarker pluginMarker = PluginUtils.createPluginMarker(pluginInfo); |
|
||||||
PluginOperateUtils.installPluginOnline(pluginMarker, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从磁盘上选择插件安装包进行插件升级 |
|
||||||
* |
|
||||||
* @param filePath 插件包的路径 |
|
||||||
*/ |
|
||||||
public void updatePluginFromDisk(String filePath, final JSFunction callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
|
||||||
File file = new File(filePath); |
|
||||||
PluginOperateUtils.updatePluginFromDisk(file, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 修改选中的插件的活跃状态 |
|
||||||
* |
|
||||||
* @param pluginID 插件ID |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void setPluginActive(String pluginID, final JSFunction callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
|
||||||
PluginOperateUtils.setPluginActive(pluginID, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 批量修改选中的插件的活跃状态 |
|
||||||
* |
|
||||||
* @param pluginIDs 要处理的插件ID |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void setAllPluginActive(JSArray pluginIDs, final JSFunction callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
|
||||||
List<String> list = new ArrayList<>(); |
|
||||||
int len = pluginIDs.length(); |
|
||||||
for (int i = 0; i < len; i++) { |
|
||||||
list.add(pluginIDs.get(i).asString().getValue()); |
|
||||||
} |
|
||||||
PluginOperateUtils.setPluginActive(list, jsCallback); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 选择文件对话框 |
|
||||||
* |
|
||||||
* @return 选择的文件的路径 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public String showFileChooser() { |
|
||||||
return showFileChooserWithFilter(StringUtils.EMPTY, StringUtils.EMPTY); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 选择文件对话框 |
|
||||||
* |
|
||||||
* @param des 过滤文件描述 |
|
||||||
* @param filter 文件的后缀 |
|
||||||
* @return 选择的文件的路径 |
|
||||||
* 这里换用JFileChooser会卡死,不知道为什么 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public String showFileChooserWithFilter(final String des, final String filter) { |
|
||||||
RunnableFuture<String> future = new FutureTask<>(new Callable<String>() { |
|
||||||
@Override |
|
||||||
public String call() { |
|
||||||
FileChooserProvider fileChooserProvider = FileChooserFactory.createFileChooser( |
|
||||||
FileChooserArgs.newBuilder(). |
|
||||||
setFileSelectionMode(FileSelectionMode.FILE). |
|
||||||
setFilter(des, filter).build()); |
|
||||||
int result = fileChooserProvider.showDialog(UpmFinder.getDialog()); |
|
||||||
if (result == JFileChooser.APPROVE_OPTION) { |
|
||||||
return fileChooserProvider.getSelectedFile().getAbsolutePath(); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
}); |
|
||||||
SwingUtilities.invokeLater(future); |
|
||||||
try { |
|
||||||
return future.get(); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 选择文件对话框 |
|
||||||
* |
|
||||||
* @param des 过滤文件描述 |
|
||||||
* @param args 文件的后缀 |
|
||||||
* @return 选择的文件的路径 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public String showFileChooserWithFilters(final String des, final Object args) { |
|
||||||
RunnableFuture<String> future = new FutureTask<>(new Callable<String>() { |
|
||||||
@Override |
|
||||||
public String call() { |
|
||||||
JFileChooser fileChooser = new JFileChooser(); |
|
||||||
List<String> filterList = new ArrayList<>(); |
|
||||||
if (args instanceof String) { |
|
||||||
filterList.add(GeneralUtils.objectToString(args)); |
|
||||||
} else if (args instanceof JSArray) { |
|
||||||
JSArray array = (JSArray) args; |
|
||||||
for (int i = 0, len = array.length(); i < len; i++) { |
|
||||||
filterList.add(array.get(i).getStringValue()); |
|
||||||
} |
|
||||||
} |
|
||||||
String[] filters = filterList.toArray(new String[0]); |
|
||||||
if (ArrayUtils.isNotEmpty(filters)) { |
|
||||||
FileNameExtensionFilter filter = new FileNameExtensionFilter(des, UpmUtils.findMatchedExtension(filters)); |
|
||||||
fileChooser.setFileFilter(filter); |
|
||||||
} |
|
||||||
int result = fileChooser.showOpenDialog(UpmFinder.getDialog()); |
|
||||||
if (result == JFileChooser.APPROVE_OPTION) { |
|
||||||
return fileChooser.getSelectedFile().getAbsolutePath(); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
}); |
|
||||||
SwingUtilities.invokeLater(future); |
|
||||||
try { |
|
||||||
return future.get(); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
////////登录相关///////
|
|
||||||
|
|
||||||
/** |
|
||||||
* 获取系统登录的用户名 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public String getLoginInfo(final JSFunction callback) { |
|
||||||
registerLoginInfo(callback); |
|
||||||
return DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 系统登录注册 |
|
||||||
* |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void registerLoginInfo(final JSFunction callback) { |
|
||||||
JSCallback jsCallback = new JSCallback(UpmBrowserExecutor.create(window, callback)); |
|
||||||
String username = DesignerEnvManager.getEnvManager().getDesignerLoginUsername(); |
|
||||||
if (StringUtils.isEmpty(username)) { |
|
||||||
jsCallback.execute(StringUtils.EMPTY); |
|
||||||
} else { |
|
||||||
jsCallback.execute(username); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
/** |
|
||||||
* 设计器端的用户登录 |
|
||||||
* |
|
||||||
* @param username 用户名 |
|
||||||
* @param password 密码 |
|
||||||
* @param callback 回调函数 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void defaultLogin(String username, String password, final JSFunction callback) { |
|
||||||
UpmTaskWorker<Void> worker = new UpmTaskWorker<>(new JSCallback(UpmBrowserExecutor.create(window, callback)), new PluginLoginExecutor(username, password)); |
|
||||||
worker.execute(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 清除用户信息 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void clearUserInfo() { |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 打开论坛消息界面 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void getPriviteMessage() { |
|
||||||
try { |
|
||||||
LocaleMark<String> spaceMark = LocaleCenter.getMark(BbsSpaceMark.class); |
|
||||||
String ssoUrl = DesignerLoginUtils.generateDesignerSSOUrl(spaceMark.getValue()); |
|
||||||
BrowseUtils.browser(ssoUrl); |
|
||||||
} catch (Exception exp) { |
|
||||||
FineLoggerFactory.getLogger().info(exp.getMessage()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 忘记密码 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void forgetHref() { |
|
||||||
try { |
|
||||||
LocaleMark<String> resetMark = LocaleCenter.getMark(BbsResetMark.class); |
|
||||||
Desktop.getDesktop().browse(new URI(resetMark.getValue())); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 立即注册 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void registerHref() { |
|
||||||
try { |
|
||||||
LocaleMark<String> registerMark = LocaleCenter.getMark(BbsRegisterMark.class); |
|
||||||
Desktop.getDesktop().browse(new URI(registerMark.getValue())); |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().info(e.getMessage()); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 使用系统浏览器打开网页 |
|
||||||
* |
|
||||||
* @param url 要打开的网页 |
|
||||||
*/ |
|
||||||
@JSBridge |
|
||||||
public void openShopUrlAtWebBrowser(String url) { |
|
||||||
if (Desktop.isDesktopSupported()) { |
|
||||||
try { |
|
||||||
//创建一个URI实例,注意不是URL
|
|
||||||
URI uri = URI.create(url); |
|
||||||
//获取当前系统桌面扩展
|
|
||||||
Desktop desktop = Desktop.getDesktop(); |
|
||||||
//判断系统桌面是否支持要执行的功能
|
|
||||||
if (desktop.isSupported(Desktop.Action.BROWSE)) { |
|
||||||
//获取系统默认浏览器打开链接
|
|
||||||
desktop.browse(uri); |
|
||||||
} |
|
||||||
} catch (Exception e) { |
|
||||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,30 +0,0 @@ |
|||||||
package com.fr.design.upm.exec; |
|
||||||
|
|
||||||
import com.fr.design.bridge.exec.JSExecutor; |
|
||||||
import com.teamdev.jxbrowser.chromium.JSFunction; |
|
||||||
import com.teamdev.jxbrowser.chromium.JSObject; |
|
||||||
|
|
||||||
/** |
|
||||||
* @author richie |
|
||||||
* @version 10.0 |
|
||||||
* Created by richie on 2019-04-18 |
|
||||||
*/ |
|
||||||
public class UpmBrowserExecutor implements JSExecutor { |
|
||||||
|
|
||||||
public static UpmBrowserExecutor create(JSObject window, JSFunction callback) { |
|
||||||
return new UpmBrowserExecutor(window, callback); |
|
||||||
} |
|
||||||
|
|
||||||
private JSObject window; |
|
||||||
private JSFunction callback; |
|
||||||
|
|
||||||
private UpmBrowserExecutor(JSObject window, JSFunction callback) { |
|
||||||
this.window = window; |
|
||||||
this.callback = callback; |
|
||||||
} |
|
||||||
|
|
||||||
@Override |
|
||||||
public void executor(String newValue) { |
|
||||||
callback.invoke(window, newValue); |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue