Browse Source

Merge pull request #4443 in DESIGN/design from feature/10.0 to feature/x

* commit '431c093e2f9fb99fa08fca2fa414ed84d746cc59':
  REPORT-53036 组件复用-合入主版本-下滑出现的复用组件提示,蓝字预期是“复用组件”,现在是“组件复用”
  REPORT-51683 对象/classloader过滤缩略图 剪枝加速查找
  REPORT-52933 [阻止]修改log导出配置目录后,log一直为空
  无JIRA任务 designer打包引用混淆类
  REPORT-53022 本地组件库刷新后的排序问题
research/11.0
superman 4 years ago
parent
commit
c16fba56ae
  1. 27
      designer-base/src/main/java/com/fr/design/DesignerEnvManager.java
  2. 3
      designer-base/src/main/java/com/fr/design/file/filter/ClassFilter.java
  3. 3
      designer-base/src/main/java/com/fr/design/mod/ModClassFilter.java
  4. 2
      designer-form/src/main/java/com/fr/design/mainframe/ReuseTriggerPointManager.java
  5. 3
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/local/GroupPane.java
  6. 1
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/local/LocalWidgetSelectPane.java
  7. 2
      designer-realize/src/main/java/com/fr/design/mainframe/app/DesignerAppActivator.java
  8. 12
      designer-realize/src/main/java/com/fr/design/mainframe/app/DesignerAppUtils.java
  9. 138
      designer-realize/src/main/java/com/fr/design/mainframe/app/PluginRemote.java

27
designer-base/src/main/java/com/fr/design/DesignerEnvManager.java

@ -15,21 +15,19 @@ import com.fr.design.env.DesignerWorkspaceType;
import com.fr.design.env.LocalDesignerWorkspaceInfo;
import com.fr.design.env.RemoteDesignerWorkspaceInfo;
import com.fr.design.file.HistoryTemplateListPane;
import com.fr.design.fun.DesignerPortProvider;
import com.fr.design.i18n.Toolkit;
import com.fr.design.locale.impl.ProductImproveMark;
import com.fr.design.mainframe.reuse.ComponentReuseNotificationInfo;
import com.fr.design.mainframe.vcs.VcsConfigManager;
import com.fr.design.notification.SnapChatConfig;
import com.fr.design.port.DesignerPortContext;
import com.fr.design.update.push.DesignerPushUpdateConfigManager;
import com.fr.design.style.color.ColorSelectConfigManager;
import com.fr.design.update.push.DesignerPushUpdateConfigManager;
import com.fr.design.utils.DesignUtils;
import com.fr.design.utils.DesignerPort;
import com.fr.exit.DesignerExiter;
import com.fr.file.FILEFactory;
import com.fr.general.ComparatorUtils;
import com.fr.general.FRLogFormatter;
import com.fr.general.GeneralContext;
import com.fr.general.IOUtils;
import com.fr.general.SupportLocale;
@ -37,15 +35,14 @@ import com.fr.general.locale.LocaleCenter;
import com.fr.general.locale.LocaleMark;
import com.fr.general.xml.GeneralXMLTools;
import com.fr.log.FineLoggerFactory;
import com.fr.log.LogHandler;
import com.fr.stable.CommonUtils;
import com.fr.stable.Constants;
import com.fr.stable.CoreConstants;
import com.fr.stable.EnvChangedListener;
import com.fr.stable.ListMap;
import com.fr.stable.ProductConstants;
import com.fr.stable.StableUtils;
import com.fr.stable.StringUtils;
import com.fr.stable.bridge.StableFactory;
import com.fr.stable.core.UUID;
import com.fr.stable.project.ProjectConstants;
import com.fr.stable.xml.XMLPrintWriter;
@ -53,6 +50,7 @@ import com.fr.stable.xml.XMLReadable;
import com.fr.stable.xml.XMLTools;
import com.fr.stable.xml.XMLWriter;
import com.fr.stable.xml.XMLableReader;
import com.fr.third.apache.log4j.FileAppender;
import com.fr.third.org.apache.commons.io.FilenameUtils;
import com.fr.workspace.WorkContext;
import com.fr.workspace.WorkContextCallback;
@ -79,8 +77,6 @@ import java.util.ListIterator;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
/**
* The manager of Designer GUI.
@ -309,14 +305,23 @@ public class DesignerEnvManager implements XMLReadable, XMLWriter {
calender.setTimeInMillis(System.currentTimeMillis());
String today = calender.get(Calendar.YEAR) + "-" + (calender.get(Calendar.MONTH) + 1) + "-" + calender.get(Calendar.DAY_OF_MONTH);
String fileName = StableUtils.pathJoin(logLocation, "fr_" + today + "_%g.log");
final String fileName = StableUtils.pathJoin(logLocation, "fr_" + today + "_%g.log");
if (!new File(fileName).exists()) {
StableUtils.makesureFileExist(new File(fileName));
}
Handler handler = new FileHandler(fileName, true);
LogHandler handler = new LogHandler<FileAppender>() {
final FileAppender appender = new FileAppender(
new com.fr.third.apache.log4j.PatternLayout("%d{HH:mm:ss} %t %p [%c] %m%n"),
fileName
);
@Override
public FileAppender getHandler() {
return appender;
}
};
handler.setFormatter(new FRLogFormatter());
FineLoggerFactory.getLogger().addLogHandler(handler);
FineLoggerFactory.getLogger().addLogAppender(handler);
} catch (SecurityException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
} catch (IOException e) {

3
designer-base/src/main/java/com/fr/design/file/filter/ClassFilter.java

@ -5,6 +5,8 @@ import java.util.HashSet;
import java.util.Set;
/**
* classloader查找过滤器
*
* 过滤无需遍历的jdk class
*
* @author hades
@ -26,6 +28,7 @@ public class ClassFilter implements Filter<String> {
FILTER_SET.add("java.awt.image.BufferedImage");
FILTER_SET.add("sun.awt.AppContext");
FILTER_SET.add("com.fr.poly.creator.ECBlockCreator");
FILTER_SET.add("com.fr.form.ui.ElementCaseImage");
}
@Override

3
designer-base/src/main/java/com/fr/design/mod/ModClassFilter.java

@ -5,6 +5,8 @@ import java.util.HashSet;
import java.util.Set;
/**
* 联动修改的类过滤器
*
* @author hades
* @version 10.0
* Created by hades on 2021/5/31
@ -24,6 +26,7 @@ public class ModClassFilter implements Filter<String> {
FILTER_SET.add("sun.awt.AppContext");
FILTER_SET.add("com.fr.poly.creator.ECBlockCreator");
FILTER_SET.add("io.netty.channel.nio.SelectedSelectionKeySet");
FILTER_SET.add("com.fr.form.ui.ElementCaseImage");
}
@Override

2
designer-form/src/main/java/com/fr/design/mainframe/ReuseTriggerPointManager.java

@ -177,7 +177,7 @@ public class ReuseTriggerPointManager {
private JPanel createReusePrompt(JForm jForm) {
JPanel jPanel = FRGUIPaneFactory.createBorderLayout_S_Pane();
jPanel.add(new UILabel(Toolkit.i18nText("Fine-Design_Component_Reuse_Try_Prompt")), BorderLayout.WEST);
UILabel reuseLabel = new UILabel(Toolkit.i18nText("Fine-Design_Component_Reuse"));
UILabel reuseLabel = new UILabel(Toolkit.i18nText("Fine-Design_Share_Component"));
reuseLabel.addMouseListener(new MouseListener() {
@Override
public void mouseClicked(MouseEvent e) {

3
designer-form/src/main/java/com/fr/design/mainframe/share/ui/local/GroupPane.java

@ -18,6 +18,7 @@ import com.fr.design.utils.gui.GUICoreUtils;
import com.fr.form.share.SharableWidgetProvider;
import com.fr.form.share.group.DefaultShareGroupManager;
import com.fr.form.share.Group;
import com.fr.form.share.record.ShareWidgetInfoManager;
import com.fr.general.IOUtils;
import com.fr.stable.StringUtils;
@ -100,6 +101,8 @@ class GroupPane extends JPanel {
searchByKeyword(keyWord);
return;
}
ShareWidgetInfoManager.getInstance().checkInstallCompInfo(elCaseBindInfoList);
sortType.sort(elCaseBindInfoList);
reCreateShowPane(elCaseBindInfoList);
expendGroup(needExpendGroup);
}

1
designer-form/src/main/java/com/fr/design/mainframe/share/ui/local/LocalWidgetSelectPane.java

@ -73,7 +73,6 @@ public class LocalWidgetSelectPane extends AbstractWidgetSelectPane {
} else {
showEmpty();
}
ShareWidgetInfoManager.getInstance().checkInstallCompInfo(providers);
}
public Group getGroup() {

2
designer-realize/src/main/java/com/fr/design/mainframe/app/DesignerAppActivator.java

@ -20,6 +20,7 @@ public class DesignerAppActivator extends Activator implements Prepare {
for (App app : appList) {
JTemplateFactory.register(app);
}
PluginRemote.getInstance().start();
}
@Override
@ -29,6 +30,7 @@ public class DesignerAppActivator extends Activator implements Prepare {
for (App app : appList) {
JTemplateFactory.remove(app);
}
PluginRemote.getInstance().stop();
}
@Override

12
designer-realize/src/main/java/com/fr/design/mainframe/app/DesignerAppUtils.java

@ -6,11 +6,11 @@ import com.fr.design.extra.exe.callback.InstallOnlineCallback;
import com.fr.design.extra.exe.callback.ModifyStatusCallback;
import com.fr.design.i18n.Toolkit;
import com.fr.design.mainframe.DesignerContext;
import com.fr.design.mainframe.app.PluginRemote.PluginStatus;
import com.fr.design.ui.util.UIUtil;
import com.fr.locale.InterProviderFactory;
import com.fr.plugin.context.PluginMarker;
import com.fr.plugin.context.PluginMarkerAdapter;
import com.fr.plugin.engine.remote.PluginRemoteSync;
import com.fr.plugin.manage.PluginManager;
import com.fr.plugin.manage.control.PluginControllerHelper;
import com.fr.plugin.manage.control.PluginTask;
@ -130,21 +130,21 @@ public class DesignerAppUtils {
* @param pendingPlugins 待处理列表
*/
public static void rearrange(Multimap<String, PluginMarkerAdapter> pendingPlugins) {
Map<String, PluginRemoteSync.PluginStatus> pluginRemoteStatusByIdIndex = PluginRemoteSync.getInstance().getPluginRemoteStatusByIdIndex();
Map<String, PluginStatus> pluginRemoteStatus = PluginRemote.getInstance().getPluginRemoteStatus();
Collection<PluginMarkerAdapter> unknownPlugins = pendingPlugins.get(TemplateIOErrorContextHolder.UNKNOWN_PLUGIN);
Collection<PluginMarkerAdapter> notInstall = pendingPlugins.get(TemplateIOErrorContextHolder.NOT_INSTALLED_PLUGIN);
Collection<PluginMarkerAdapter> disable = pendingPlugins.get(TemplateIOErrorContextHolder.DISABLE_PLUGIN);
unknownPlugins.removeIf(adapter -> pluginRemoteStatusByIdIndex.containsKey(adapter.getPluginID()));
unknownPlugins.removeIf(adapter -> pluginRemoteStatus.containsKey(adapter.getPluginID()));
// 本地未启用名单不准确添加到一起之后重新分配
notInstall.addAll(disable);
disable.clear();
// 从所有未安装中过滤远程未启用的,添加到未启用列表
disable.addAll(notInstall.stream().filter(plugin ->
pluginRemoteStatusByIdIndex.containsKey(plugin.getPluginID())
&& !pluginRemoteStatusByIdIndex.get(plugin.getPluginID()).isRunning())
pluginRemoteStatus.containsKey(plugin.getPluginID())
&& !pluginRemoteStatus.get(plugin.getPluginID()).isRunning())
.collect(Collectors.toList()));
// 清理未安装中所有远程安装过的插件(包含启用和未启用)
notInstall.removeIf(adapter -> pluginRemoteStatusByIdIndex.containsKey(adapter.getPluginID()));
notInstall.removeIf(adapter -> pluginRemoteStatus.containsKey(adapter.getPluginID()));
}
/**

138
designer-realize/src/main/java/com/fr/design/mainframe/app/PluginRemote.java

@ -0,0 +1,138 @@
package com.fr.design.mainframe.app;
import com.fr.base.FRContext;
import com.fr.json.JSONArray;
import com.fr.json.JSONException;
import com.fr.json.JSONObject;
import com.fr.log.FineLoggerFactory;
import com.fr.plugin.context.PluginMarker;
import com.fr.stable.StringUtils;
import com.fr.value.AtomicClearableLazyValue;
import com.fr.workspace.WorkContext;
import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 获取远程插件情况定时刷新
*
* @author vito
* @version 10.0
* Created by vito on 2021/6/1
*/
public class PluginRemote {
private static final PluginRemote INSTANCE = new PluginRemote();
private final AtomicClearableLazyValue<Map<String, PluginStatus>> lazyValue = new AtomicClearableLazyValue<Map<String, PluginStatus>>() {
@NotNull
@Override
protected Map<String, PluginStatus> compute() {
return getRemoteStatus();
}
};
/**
* 时间间隔两分钟
*/
private static final int INTERVAL = 2;
private ScheduledExecutorService executor;
public static PluginRemote getInstance() {
return INSTANCE;
}
/**
* 获取远程插件状态
* @return 远程插件状态
*/
public Map<String, PluginStatus> getPluginRemoteStatus() {
return lazyValue.getValue();
}
private Map<String, PluginStatus> getRemoteStatus() {
JSONArray statusArray = FRContext.getCommonOperator().getPluginStatus();
JSONObject status;
String id;
String version;
boolean running;
Map<String, PluginStatus> statusMap = new HashMap<>();
for (int i = 0; i < statusArray.length(); i++) {
try {
status = statusArray.getJSONObject(i);
id = status.getString("id");
version = status.getString("version");
running = status.getBoolean("running");
if(StringUtils.isBlank(id)){
continue;
}
PluginStatus pluginStatus = PluginStatus.create(id, version, running);
if (pluginStatus != null) {
statusMap.put(id, pluginStatus);
}
} catch (JSONException e) {
FineLoggerFactory.getLogger().error(e.getMessage(), e);
}
}
return statusMap;
}
public void start() {
// 远程环境下开始同步插件情况
if (!WorkContext.getCurrent().isLocal()) {
executor = Executors.newSingleThreadScheduledExecutor();
executor.scheduleAtFixedRate(() -> {
lazyValue.drop();
lazyValue.getValue();
}, 0, INTERVAL, TimeUnit.MINUTES);
}
}
public void stop() {
if (executor != null) {
executor.shutdown();
executor = null;
lazyValue.drop();
}
}
public static class PluginStatus {
private final PluginMarker marker;
private final boolean running;
private PluginStatus(PluginMarker marker, boolean running) {
this.marker = marker;
this.running = running;
}
static PluginStatus create(String id, String version, boolean running) {
PluginMarker marker = PluginMarker.create(id, version);
if (marker != null && marker.valid()) {
return new PluginStatus(marker, running);
}
return null;
}
public PluginMarker getMarker() {
return marker;
}
public boolean isRunning() {
return running;
}
}
}
Loading…
Cancel
Save