From ac6cf87132a2f1442a89d65583755dd99c2562bf Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Thu, 26 Sep 2019 18:45:40 +0800 Subject: [PATCH 01/28] =?UTF-8?q?REPORT-21689=20=20=E6=B0=B4=E5=8D=B0?= =?UTF-8?q?=E5=AF=86=E5=BA=A6=E5=A2=9E=E5=8A=A0=E6=9C=80=E5=B0=8F=E5=80=BC?= =?UTF-8?q?=E9=99=90=E5=88=B6=E3=80=81=E6=A0=B9=E6=8D=AE=E4=BA=A4=E4=BA=92?= =?UTF-8?q?=E6=8F=90=E4=BE=9B=E7=9A=84=E5=86=85=E5=AE=B9=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/gui/ispinner/UISpinner.java | 4 + .../gui/ispinner/UnsignedIntUISpinner.java | 28 +---- .../com/fr/design/report/WatermarkPane.java | 108 ++++++++++++++++-- 3 files changed, 104 insertions(+), 36 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java index 66a9a7575..825dddb4e 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java @@ -93,6 +93,10 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver return textField; } + public UIButton getNextButton() { + return nextButton; + } + public void setValue(double value) { setValue(value, true); } diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UnsignedIntUISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UnsignedIntUISpinner.java index 1515477a3..42a40cd79 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UnsignedIntUISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UnsignedIntUISpinner.java @@ -3,8 +3,6 @@ package com.fr.design.gui.ispinner; import com.fr.design.gui.itextfield.UIIntNumberField; import com.fr.design.gui.itextfield.UINumberField; -import java.awt.event.FocusEvent; -import java.awt.event.FocusListener; /** * Created by IntelliJ IDEA. @@ -31,7 +29,7 @@ public class UnsignedIntUISpinner extends UISpinner { @Override protected UINumberField initNumberField() { - final UIIntNumberField numberField = new UIIntNumberField() { + return new UIIntNumberField() { public boolean shouldResponseChangeListener() { return false; } @@ -44,29 +42,5 @@ public class UnsignedIntUISpinner extends UISpinner { }; } }; - numberField.addFocusListener(new FocusListener() { - @Override - public void focusGained(FocusEvent e) { - - } - - /** - * 失去焦点后再做范围限制、不然最小值为 100 时,输个 1 都不让.... - * @param e - */ - @Override - public void focusLost(FocusEvent e) { - double value = numberField.getValue(); - if (!isOverMaxOrMinValue(value)) { - return; - } - numberField.setValue(value < minValue ? minValue : maxValue); - } - - private boolean isOverMaxOrMinValue(double value) { - return value < minValue || value > maxValue; - } - }); - return numberField; } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java index a7f78e117..178479de8 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java @@ -23,6 +23,9 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; +import javax.swing.JDialog; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; import java.awt.Dimension; import java.awt.BorderLayout; import java.awt.Color; @@ -30,6 +33,12 @@ import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; +import java.awt.event.MouseListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.Dialog; +import java.awt.FlowLayout; + /** * Created by plough on 2018/5/15. @@ -49,6 +58,13 @@ public class WatermarkPane extends BasicPane { private UISpinner verticalGapSpinner; // 文字颜色 private NewColorSelectPane colorPane; + //间距超过限制消息 + private UILabel message; + + //横向间距最小值 + public static final int HORIZONTAL_GAP_MIX = 100; + //纵向间距最小值 + public static final int VERTICAL_GAP_MIX = 50; private static final Dimension SPINNER_DIMENSION = new Dimension(75, 20); @@ -57,6 +73,7 @@ public class WatermarkPane extends BasicPane { } private void initComponents() { + message = new UILabel(); this.setBorder(BorderFactory.createEmptyBorder(4, 4, -5, 4)); this.setLayout(FRGUIPaneFactory.createBorderLayout()); @@ -93,7 +110,7 @@ public class WatermarkPane extends BasicPane { public WatermarkAttr update() { WatermarkAttr watermark = new WatermarkAttr(); watermark.setText(formulaPane.getUITextField().getText()); - watermark.setFontSize((int)fontSizeComboBox.getSelectedItem()); + watermark.setFontSize((int) fontSizeComboBox.getSelectedItem()); watermark.setHorizontalGap((int) horizontalGapSpinner.getValue()); watermark.setVerticalGap((int) verticalGapSpinner.getValue()); watermark.setColor(colorPane.getColor()); @@ -109,7 +126,7 @@ public class WatermarkPane extends BasicPane { this.formulaPane = formulaPane; } - protected UIScrollPane initRightPane(){ + protected UIScrollPane initRightPane() { formulaPane = new TinyFormulaPane(); fontSizeComboBox = new UIComboBox(FRFontPane.FONT_SIZES); fontSizeComboBox.setEditable(true); @@ -117,7 +134,17 @@ public class WatermarkPane extends BasicPane { verticalGapSpinner = new UnsignedIntUISpinner(50, Integer.MAX_VALUE, 1, 100); horizontalGapSpinner.setPreferredSize(SPINNER_DIMENSION); verticalGapSpinner.setPreferredSize(SPINNER_DIMENSION); - JPanel fontSizeTypePane = new JPanel(new BorderLayout(10,0)); + message.setBorder(BorderFactory.createEmptyBorder(8, 5, 0, 0)); + //失去焦点时要判断是否要弹出提示 + horizontalGapSpinner.getTextField().addFocusListener( + createFocusListener4GapNumberField(horizontalGapSpinner, HORIZONTAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Horizontal_Gap_Over_Warning"))); + verticalGapSpinner.getTextField().addFocusListener(createFocusListener4GapNumberField(verticalGapSpinner, VERTICAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Vertical_Gap_Over_Warning"))); + + //next 按钮 释放时也要判断是否要弹出提示 + horizontalGapSpinner.getNextButton().addMouseListener(createMouseListener4GapNextButton(horizontalGapSpinner, HORIZONTAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Horizontal_Gap_Over_Warning"))); + verticalGapSpinner.getNextButton().addMouseListener(createMouseListener4GapNextButton(verticalGapSpinner, VERTICAL_GAP_MIX, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Vertical_Gap_Over_Warning"))); + + JPanel fontSizeTypePane = new JPanel(new BorderLayout(10, 0)); fontSizeTypePane.add(fontSizeComboBox, BorderLayout.CENTER); //水印间距面板 @@ -144,18 +171,18 @@ public class WatermarkPane extends BasicPane { JPanel rightContentPane = TableLayoutHelper.createCommonTableLayoutPane(new JComponent[][]{ {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Watermark_Text")), formulaPane}, {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Font_Size")), fontSizeTypePane}, - {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Watermark_Gap")),watermarkGapPane }, - {null,watermarkGapTipsPane }, + {new UILabel(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Watermark_Gap")), watermarkGapPane}, + {null, watermarkGapTipsPane}, {colorLabelPane, colorPane}, }, rowSize, columnSize, 10); rightContentPane.setBorder(BorderFactory.createEmptyBorder(15, 12, 10, 12)); UIScrollPane configPane = new UIScrollPane(rightContentPane); - configPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Config"),null)); + configPane.setBorder(GUICoreUtils.createTitledBorder(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Basic_Config"), null)); return configPane; } - protected void populateFontSize(int fontSize){ + protected void populateFontSize(int fontSize) { this.fontSizeComboBox.setSelectedItem(fontSize); this.fontSizeComboBox.addItemListener(new ItemListener() { @Override @@ -165,7 +192,7 @@ public class WatermarkPane extends BasicPane { }); } - protected void populateWatermarkGap(WatermarkAttr watermark){ + protected void populateWatermarkGap(WatermarkAttr watermark) { this.horizontalGapSpinner.setValue(watermark.getHorizontalGap()); this.horizontalGapSpinner.addUISpinnerFocusListenner(new FocusListener() { @@ -195,7 +222,7 @@ public class WatermarkPane extends BasicPane { }); } - protected void paintPreviewPane(){ + protected void paintPreviewPane() { watermarkPreviewPane.repaint(update()); } @@ -235,4 +262,67 @@ public class WatermarkPane extends BasicPane { protected String title4PopupWindow() { return com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_WaterMark"); } + + /** + * 创建水印间距文本段焦点监听器 + * + * @return + */ + private FocusListener createFocusListener4GapNumberField(final UISpinner spinner, final int limitMinValue, final String messageStr) { + return new FocusListener() { + @Override + public void focusGained(FocusEvent e) { + } + + @Override + public void focusLost(FocusEvent e) { + if (spinner.getValue() >= limitMinValue) { + return; + } + createGapDialog(new StringBuilder(messageStr).append(limitMinValue).toString()); + } + }; + } + + /** + * 创建水印间距微调器 NextButton 的鼠标释放监听器 + * + * @param messageStr 提示消息 + * @param limitMinValue 限制的最小值 + * @return + */ + private MouseListener createMouseListener4GapNextButton(final UISpinner spinner, final int limitMinValue, final String messageStr) { + MouseAdapter mouseAdapter = new MouseAdapter() { + @Override + public void mousePressed(MouseEvent e) { + if (spinner.getValue() >= limitMinValue) { + return; + } + createGapDialog(new StringBuilder(messageStr).append(limitMinValue).toString()); + } + }; + return mouseAdapter; + } + + /** + * 创建超过水印间距限制的对话框 + * + * @param messageStr 提示消息 + */ + private void createGapDialog(String messageStr) { + JDialog dialog = new JDialog((Dialog) SwingUtilities.getWindowAncestor(WatermarkPane.this), com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Form_Joption_News"), true); + dialog.setSize(new Dimension(268, 118)); + message.setText(messageStr); + JPanel upPane = new JPanel(); + UILabel uiLabel = new UILabel(UIManager.getIcon("OptionPane.informationIcon")); + upPane.setLayout(new FlowLayout(FlowLayout.LEFT, 10, 10)); + upPane.add(uiLabel); + upPane.add(message); + dialog.add(upPane); + dialog.setResizable(false); + dialog.setLocationRelativeTo(SwingUtilities.getWindowAncestor(WatermarkPane.this)); + dialog.setVisible(true); + dialog.dispose(); + } + } From 5ed6fa5919e4809c8fac5079f0117fa37352e795 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Fri, 27 Sep 2019 16:03:50 +0800 Subject: [PATCH 02/28] =?UTF-8?q?CHART-10247=20=E7=83=AD=E5=8A=9B=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE-=E7=95=8C=E9=9D=A2=E5=9B=BE=E7=89=87=E4=B8=8D?= =?UTF-8?q?=E5=AF=B9&=E6=89=A9=E5=B1=95=E5=9B=BE=E8=A1=A8=E5=8F=98?= =?UTF-8?q?=E6=88=90=E6=9D=A1=E5=BD=A2=E5=9B=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/mainframe/chart/gui/ChartTypePane.java | 12 ++++++------ .../HeatMapIndependentVanChartInterface.java | 7 +++++++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index e9dcbedce..087efff89 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -20,15 +20,15 @@ import com.fr.log.FineLoggerFactory; import com.fr.stable.StringUtils; import javax.swing.JPanel; -import java.awt.BorderLayout; -import java.awt.CardLayout; -import java.awt.event.ItemEvent; -import java.awt.event.ItemListener; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.awt.BorderLayout; +import java.awt.CardLayout; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; /** * 图表 属性表, 类型选择 界面. @@ -125,7 +125,8 @@ public class ChartTypePane extends AbstractChartAttrPane{ String lastPlotID = chart.getID(); try{ - ChartProvider newDefaultChart = (ChartProvider) ((AbstractChartTypePane) getSelectedPane()).getDefaultChart().clone(); + AbstractChartTypePane selectedPane = (AbstractChartTypePane) getSelectedPane(); + ChartProvider newDefaultChart =(ChartProvider) ChartTypeManager.getInstanceWithCheck().getChartTypes(selectedPane.getPlotID())[0].clone(); if (!ComparatorUtils.equals(chart.getClass(), newDefaultChart.getClass())) { //vanChart 和 chart 之间切换 //不同chart之间切换 @@ -136,7 +137,6 @@ public class ChartTypePane extends AbstractChartAttrPane{ }catch (CloneNotSupportedException e){ FineLoggerFactory.getLogger().error(e.getMessage(), e); } - //这一步会替换plot ((AbstractChartTypePane)getSelectedPane()).updateBean(chart); diff --git a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java index 2d07fda4d..b4e49606e 100644 --- a/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java +++ b/designer-chart/src/main/java/com/fr/van/chart/heatmap/designer/HeatMapIndependentVanChartInterface.java @@ -38,6 +38,13 @@ public class HeatMapIndependentVanChartInterface extends MapIndependentVanChartI return Toolkit.i18nText("Fine-Design_Chart_New_HeatMap"); } + @Override + public String[] getSubName() { + return new String[]{ + Toolkit.i18nText("Fine-Design_Chart_New_HeatMap"), + }; + } + @Override public String[] getDemoImagePath() { return new String[]{ From 34f6292dc27fce63c78bcdbcb521a6a67020d407 Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 27 Sep 2019 17:00:26 +0800 Subject: [PATCH 03/28] =?UTF-8?q?REPORT-19947=20=E5=85=B3=E5=81=9C?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=97=B6=E7=BA=BF=E7=A8=8B=E6=AE=8B=E7=95=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/data/DesignTableDataManager.java | 22 ++++++++---- .../design/gui/style/FormatePaneNumField.java | 34 +++++++++++------- .../style/series/ColorPickerPaneNumFiled.java | 36 ++++++++++++------- 3 files changed, 59 insertions(+), 33 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index 44de37ea8..92c30d5be 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -2,6 +2,7 @@ package com.fr.design.data; import com.fr.base.StoreProcedureParameter; import com.fr.base.TableData; +import com.fr.concurrent.NamedThreadFactory; import com.fr.data.TableDataSource; import com.fr.data.TableDataSourceTailor; import com.fr.data.core.DataCoreXmlUtils; @@ -30,14 +31,14 @@ import com.fr.general.ComparatorUtils; import com.fr.general.data.DataModel; import com.fr.general.data.TableDataException; import com.fr.log.FineLoggerFactory; +import com.fr.module.ModuleContext; import com.fr.script.Calculator; import com.fr.stable.ArrayUtils; import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; -import javax.swing.event.ChangeEvent; -import javax.swing.event.ChangeListener; +import javax.swing.event.*; import java.io.ByteArrayOutputStream; import java.text.Collator; import java.util.ArrayList; @@ -48,8 +49,8 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; -import java.util.Timer; -import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * 设计器管理操作数据集的类: @@ -444,11 +445,18 @@ public abstract class DesignTableDataManager { } catch (Exception e) { throw new TableDataException(e.getMessage(), e); } finally { - new Timer().schedule(new TimerTask() { + ScheduledExecutorService scheduledExecutorService = ModuleContext + .getExecutor() + .newSingleThreadScheduledExecutor(new NamedThreadFactory("")); + scheduledExecutorService.schedule(new Runnable() { + @Override public void run() { - loadingBar.close(); + if (loadingBar != null) { + loadingBar.close(); + } } - }, 100); + }, 100, TimeUnit.MILLISECONDS); + scheduledExecutorService.shutdown(); } } diff --git a/designer-base/src/main/java/com/fr/design/gui/style/FormatePaneNumField.java b/designer-base/src/main/java/com/fr/design/gui/style/FormatePaneNumField.java index ee397d755..dc706416c 100644 --- a/designer-base/src/main/java/com/fr/design/gui/style/FormatePaneNumField.java +++ b/designer-base/src/main/java/com/fr/design/gui/style/FormatePaneNumField.java @@ -1,10 +1,14 @@ package com.fr.design.gui.style; +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.gui.frpane.AbstractAttrNoScrollPane; import com.fr.design.gui.itextfield.UITextField; +import com.fr.module.ModuleContext; +import com.fr.value.ClearableLazyValue; +import org.jetbrains.annotations.NotNull; -import java.util.Timer; -import java.util.TimerTask; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * Created with IntelliJ IDEA. @@ -14,31 +18,35 @@ import java.util.TimerTask; * To change this template use File | Settings | File Templates. */ public class FormatePaneNumField extends UITextField { - private Timer timer; + private ClearableLazyValue ses = new ClearableLazyValue() { + @NotNull + @Override + protected ScheduledExecutorService compute() { + return ModuleContext.getExecutor() + .newSingleThreadScheduledExecutor(new NamedThreadFactory("FormatePaneNumFieldRunChange")); + } + }; + public FormatePaneNumField() { super(); } + @Override protected void attributeChange() { if (!AbstractAttrNoScrollPane.isHasChangeListener()) { return; } - if(timer != null){ - timer.cancel(); - } - timer = new Timer(); - timer.schedule(new TimerTask() { + ses.getValue().schedule(new Runnable() { @Override public void run() { runChange(); } - },100); - + }, 100, TimeUnit.MILLISECONDS); } - protected void runChange(){ + protected void runChange() { super.attributeChange(); - timer.cancel(); - + ses.getValue().shutdown(); + ses.drop(); } } \ No newline at end of file diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneNumFiled.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneNumFiled.java index 267a8a847..fcaed6d99 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneNumFiled.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/style/series/ColorPickerPaneNumFiled.java @@ -1,9 +1,13 @@ package com.fr.design.mainframe.chart.gui.style.series; -import java.util.Timer; -import java.util.TimerTask; - +import com.fr.concurrent.NamedThreadFactory; import com.fr.design.gui.itextfield.UINumberField; +import com.fr.module.ModuleContext; +import com.fr.value.ClearableLazyValue; +import org.jetbrains.annotations.NotNull; + +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; /** * Created with IntelliJ IDEA. @@ -13,28 +17,34 @@ import com.fr.design.gui.itextfield.UINumberField; * To change this template use File | Settings | File Templates. */ public class ColorPickerPaneNumFiled extends UINumberField { - private Timer timer; + private ClearableLazyValue ses = new ClearableLazyValue() { + @NotNull + @Override + protected ScheduledExecutorService compute() { + return ModuleContext.getExecutor() + .newSingleThreadScheduledExecutor(new NamedThreadFactory("FormatePaneNumFieldRunChange")); + } + }; + public ColorPickerPaneNumFiled() { super(); } + @Override protected void attributeChange() { - if(timer != null){ - timer.cancel(); - } - timer = new Timer(); - timer.schedule(new TimerTask() { + ses.getValue().schedule(new Runnable() { @Override public void run() { + // kuns: 默认修改500, 在地图修改系列颜色text时, 快速响应. runChange(); } - },500);// kuns: 默认修改500, 在地图修改系列颜色text时, 快速响应. - + }, 500, TimeUnit.MILLISECONDS); } - protected void runChange(){ + protected void runChange() { super.attributeChange(); - timer.cancel(); + ses.getValue().shutdown(); + ses.drop(); } From 3ba100d4d022375c9fe7c33e32c6b5d52fb098ee Mon Sep 17 00:00:00 2001 From: vito Date: Fri, 27 Sep 2019 17:03:55 +0800 Subject: [PATCH 04/28] =?UTF-8?q?REPORT-19947=20=E5=85=B3=E5=81=9C?= =?UTF-8?q?=E5=BA=94=E7=94=A8=E6=97=B6=E7=BA=BF=E7=A8=8B=E6=AE=8B=E7=95=99?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/fr/design/data/DesignTableDataManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java index 92c30d5be..f1e911e7a 100644 --- a/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java +++ b/designer-base/src/main/java/com/fr/design/data/DesignTableDataManager.java @@ -38,7 +38,8 @@ import com.fr.stable.ParameterProvider; import com.fr.stable.StringUtils; import com.fr.stable.xml.XMLPrintWriter; -import javax.swing.event.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import java.io.ByteArrayOutputStream; import java.text.Collator; import java.util.ArrayList; @@ -521,6 +522,7 @@ public abstract class DesignTableDataManager { if (inParameters.length > 0 && !ComparatorUtils.equals(threadLocal.get(), NO_PARAMETER)) {// 检查Parameter. final ParameterInputPane pPane = new ParameterInputPane(inParameters); pPane.showSmallWindow(DesignerContext.getDesignerFrame(), new DialogActionAdapter() { + @Override public void doOk() { parameterMap.putAll(pPane.update()); } From 87cadd7049ee6db85fff76b02e026f28c28354b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Fri, 27 Sep 2019 17:30:01 +0800 Subject: [PATCH 05/28] =?UTF-8?q?CHART-10247=20=E6=89=A9=E5=B1=95=E5=9B=BE?= =?UTF-8?q?=E8=A1=A8=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/ChartTypeInterfaceManager.java | 8 ++++---- .../src/main/java/com/fr/design/chart/ChartTypePane.java | 2 +- .../com/fr/design/mainframe/chart/gui/ChartTypePane.java | 2 +- .../main/java/com/fr/extended/chart/ExtendedTypePane.java | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java index b9950256f..f6f674ba9 100644 --- a/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java +++ b/designer-chart/src/main/java/com/fr/design/ChartTypeInterfaceManager.java @@ -165,7 +165,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr ChartWidgetOption[] child = new ChartWidgetOption[chartIDs.length]; int index = 0; for (String chartID : chartIDs) { - ChartProvider[] rowChart = ChartTypeManager.getInstance().getChartTypes(chartID); + ChartProvider[] rowChart = ChartTypeManager.getInstance().getCharts(chartID); if (ArrayUtils.isEmpty(rowChart) && !ChartTypeManager.innerChart(chartID)) { continue; } @@ -364,7 +364,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr try { //兼容 图表类型选择界面会调到这边 - ChartProvider[] charts = ChartTypeManager.getInstanceWithCheck().getChartTypes(chartID); + ChartProvider[] charts = ChartTypeManager.getInstanceWithCheck().getCharts(chartID); result = new String[charts.length]; for (int i = 0; i < charts.length; i++) { //Chart && AbstractChart @@ -403,7 +403,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr //兼容 private String[] getCompatibleSubName(String chartID, ChartTypeUIProvider provider) { - ChartProvider[] chartProviders = ChartTypeManager.getInstanceWithCheck().getChartTypes(chartID); + ChartProvider[] chartProviders = ChartTypeManager.getInstanceWithCheck().getCharts(chartID); if (chartProviders.length == 1) { return new String[]{getName(chartID)}; @@ -453,7 +453,7 @@ public class ChartTypeInterfaceManager implements ExtraChartDesignClassManagerPr try { - ChartProvider chartProvider = ChartTypeManager.getInstanceWithCheck().getChartTypes(chartID)[0]; + ChartProvider chartProvider = ChartTypeManager.getInstanceWithCheck().getCharts(chartID)[0]; if (chartProvider instanceof Chart) { //AbstractExtendedChartUIProvider result = ((Chart) chartProvider).getChartName(); diff --git a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java index 0eb70fd12..8233e68e8 100644 --- a/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/chart/ChartTypePane.java @@ -126,7 +126,7 @@ public class ChartTypePane extends ChartCommonWizardPane { ChartProvider chart4Update = cc.getSelectedChartProvider(); if (chart4Update == null) { String plotID = this.chartIDs[mainTypeList.getSelectedIndex()]; - ChartProvider chart = ChartTypeManager.getInstance().getChartTypes(plotID)[iconViewList.getSelectedIndex()]; + ChartProvider chart = ChartTypeManager.getInstance().getCharts(plotID)[iconViewList.getSelectedIndex()]; try { chart4Update = (ChartProvider) chart.clone(); cc.addChart(chart4Update); diff --git a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java index bb7d30410..77e75a69a 100644 --- a/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java +++ b/designer-chart/src/main/java/com/fr/design/mainframe/chart/gui/ChartTypePane.java @@ -125,7 +125,7 @@ public class ChartTypePane extends AbstractChartAttrPane{ try{ AbstractChartTypePane selectedPane = (AbstractChartTypePane) getSelectedPane(); - ChartProvider newDefaultChart =(ChartProvider) ChartTypeManager.getInstanceWithCheck().getChartTypes(selectedPane.getPlotID())[0].clone(); + ChartProvider newDefaultChart =(ChartProvider) ChartTypeManager.getInstanceWithCheck().getCharts(selectedPane.getPlotID())[0].clone(); if (!ComparatorUtils.equals(chart.getClass(), newDefaultChart.getClass())) { //vanChart 和 chart 之间切换 //不同chart之间切换 diff --git a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java index 2d9ebb5dc..d373eab4e 100644 --- a/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java +++ b/designer-chart/src/main/java/com/fr/extended/chart/ExtendedTypePane.java @@ -67,7 +67,7 @@ public class ExtendedTypePane extends AbstractChartType @Override public ChartProvider getDefaultChart() { - return ChartTypeManager.getInstance().getChartTypes(getPlotID())[0]; + return ChartTypeManager.getInstance().getCharts(getPlotID())[0]; } @Override From 466f27cd185057174ee6b45cd3ffeafa9aa3956e Mon Sep 17 00:00:00 2001 From: Bryant Date: Fri, 27 Sep 2019 17:56:13 +0800 Subject: [PATCH 06/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/update/domain/UpdateConstants.java | 6 +- .../update/ui/dialog/UpdateMainDialog.java | 89 +++++++++--------- .../java/com/fr/design/upm/UpmShowDialog.java | 2 +- .../java/com/fr/design/upm/UpmShowPane.java | 94 ++++++++++++------- 4 files changed, 111 insertions(+), 80 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/update/domain/UpdateConstants.java b/designer-base/src/main/java/com/fr/design/update/domain/UpdateConstants.java index 737deafe6..54522c5f7 100644 --- a/designer-base/src/main/java/com/fr/design/update/domain/UpdateConstants.java +++ b/designer-base/src/main/java/com/fr/design/update/domain/UpdateConstants.java @@ -23,14 +23,12 @@ public interface UpdateConstants { String CHANGELOG_X_START = "2018-07-11"; String DEFAULT_APP_NAME = "FineReport"; - String DOWNLOAD_DIR = "update"; String DESIGNER_BACKUP_DIR = "designerbackup"; String UPDATE_CACHE_CONFIG_X = "updateCacheConfig10"; String UPDATE_CACHE_INFO_X = "updateCacheInfo10"; - - int BYTE = 153600; + String JXBROWSER = "jxbrowser"; List JARS_FOR_SERVER_X = Collections.unmodifiableList(Arrays.asList(new String[]{ "fine-activator-10.0.jar", @@ -51,8 +49,6 @@ public interface UpdateConstants { "fine-report-designer-10.0.jar", "aspectjrt.jar" })); - - List LOG_TYPE = Collections.unmodifiableList(Arrays.asList(new String[]{ "REPORT", "MOBILE", "CHART", "PFC", "BI" })); diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 9e83e40dd..45728505c 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -9,6 +9,7 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIScrollPane; import com.fr.design.gui.ilable.UILabel; import com.fr.design.gui.itextfield.UITextField; +import com.fr.design.i18n.Toolkit; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; @@ -23,12 +24,7 @@ import com.fr.design.update.ui.widget.UpdateInfoTableCellRender; import com.fr.design.update.ui.widget.UpdateInfoTableModel; import com.fr.design.update.ui.widget.UpdateInfoTextAreaCellRender; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.general.CloudCenter; -import com.fr.general.ComparatorUtils; -import com.fr.general.DateUtils; -import com.fr.general.GeneralContext; -import com.fr.general.GeneralUtils; -import com.fr.general.SiteCenter; +import com.fr.general.*; import com.fr.general.http.HttpClient; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; @@ -39,6 +35,7 @@ import com.fr.stable.EncodeConstants; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; import com.fr.workspace.WorkContext; import com.sun.java.swing.plaf.motif.MotifProgressBarUI; @@ -46,21 +43,10 @@ import javax.swing.*; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.table.TableRowSorter; -import java.awt.BorderLayout; -import java.awt.Color; -import java.awt.Component; -import java.awt.Dialog; -import java.awt.Dimension; -import java.awt.Frame; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.io.BufferedReader; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; +import java.io.*; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -121,8 +107,6 @@ public class UpdateMainDialog extends UIDialog { //搜索更新信息关键词文本框 private UITextField searchUpdateInfoKeyword; - private boolean updateSuccessful; - private UpdateInfoTable updateInfoTable; private ArrayList updateInfoList; @@ -248,12 +232,12 @@ public class UpdateMainDialog extends UIDialog { updateInfoTable.setShowGrid(false); updateInfoTable.setCellSelectionEnabled(false); - TableRowSorter sorter = new TableRowSorter(updateInfoTable.getDataModel()); + TableRowSorter sorter = new TableRowSorter<>(updateInfoTable.getDataModel()); sorter.setSortable(updateTimeColIndex, true); sorter.setSortable(updateTitleColIndex, false); sorter.setSortable(updateSignColIndex, false); updateInfoTable.setRowSorter(sorter); - List sortKeys = new ArrayList(); + List sortKeys = new ArrayList<>(); sortKeys.add(new RowSorter.SortKey(updateTimeColIndex, SortOrder.DESCENDING)); sorter.setSortKeys(sortKeys); @@ -367,6 +351,7 @@ public class UpdateMainDialog extends UIDialog { try { downloadFileConfig = get(); showDownLoadInfo(); + afterInit(); } catch (InterruptedException e) { stopLoading(); Thread.currentThread().interrupt(); @@ -380,7 +365,7 @@ public class UpdateMainDialog extends UIDialog { } private SwingWorker getUpdateInfo(final String keyword) { - updateInfoList = new ArrayList(); + updateInfoList = new ArrayList<>(); lastUpdateCacheTime = UpdateConstants.CHANGELOG_X_START; String cacheConfigPath = getUpdateCacheConfig(); cacheProperty = new UpdateInfoCachePropertyManager(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), "resources", "offlineres", cacheConfigPath)); @@ -430,7 +415,6 @@ public class UpdateMainDialog extends UIDialog { getUpdateInfoSuccess = true; //step4:update cache file,start from cacheRecordTime,end latest server jartime updateCachedInfoFile(jsonArray); - afterInit(); } catch (Exception e) { getUpdateInfoSuccess = true; FineLoggerFactory.getLogger().error(e.getMessage()); @@ -532,7 +516,7 @@ public class UpdateMainDialog extends UIDialog { updateInfoList.add(new Object[]{UPDATE_INFO_TABLE_FORMAT.format(updateTime), updateTitle, updateTime.after(curJarDate)}); } } - return new ArrayList(updateInfoList); + return new ArrayList<>(updateInfoList); } private boolean containsKeyword(String str, String keyword) { @@ -594,12 +578,12 @@ public class UpdateMainDialog extends UIDialog { updateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if (updateSuccessful) { - RestartHelper.restart(); - } else { + backup(); + int a = JOptionPane.showConfirmDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Information"),Toolkit.i18nText("Fine-Design_Update_Info_Title"),2); + if (a == 0) { progressBar.setVisible(true); + progressBar.setString(Toolkit.i18nText("Fine-Design_Update_Info_Wait_Message")); UpdateCallBack callBack = new UpdateProgressCallBack(progressBar); - deletePreviousPropertyFile(); updateButton.setEnabled(false); updateLabel.setVisible(false); new FileProcess(callBack) { @@ -607,12 +591,13 @@ public class UpdateMainDialog extends UIDialog { public void onDownloadSuccess() { updateButton.setEnabled(true); progressBar.setVisible(false); - updateSuccessful = true; - updateButton.setText(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restart_Designer")); + RestartHelper.restart(); } @Override public void onDownloadFailed() { progressBar.setVisible(false); + JOptionPane.showMessageDialog(getParent(),"Update Failed"); + RestartHelper.restart(); } }.execute(); } @@ -621,20 +606,40 @@ public class UpdateMainDialog extends UIDialog { } /** - * 确保升级更新之前删除以前的配置文件 + * Jar还原按钮兼容 */ - public static void deletePreviousPropertyFile() { - //在进行更新升级之前确保move和delete.properties删除 - File moveFile = new File(RestartHelper.MOVE_FILE); - File delFile = new File(RestartHelper.RECORD_FILE); - if ((moveFile.exists()) && (!moveFile.delete())) { - FineLoggerFactory.getLogger().error(RestartHelper.MOVE_FILE + "delete failed!"); - } - if ((delFile.exists()) && (!delFile.delete())) { - FineLoggerFactory.getLogger().error(RestartHelper.RECORD_FILE + "delete failed!"); + private void backup() { + String installHome = StableUtils.getInstallHome(); + //jar包备份文件的目录为"backup/"+jar包当前版本号 + String todayBackupDir = StableUtils.pathJoin(installHome, getBackupDirectory(), (GeneralUtils.readBuildNO())); + backupFilesFromInstallEnv(installHome, todayBackupDir, UpdateConstants.JARS_FOR_SERVER_X); + backupFilesFromInstallLib(installHome, todayBackupDir, UpdateConstants.JARS_FOR_DESIGNER_X); + jarCurrentLabel.setText(downloadFileConfig.optString("buildNO")); + } + + private void backupFilesFromInstallEnv(String installHome, String todayBackupDir, List files) { + for (String file : files) { + try { + IOUtils.copy( + new File(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)), + new File(StableUtils.pathJoin(todayBackupDir))); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } } } + private void backupFilesFromInstallLib(String installHome, String todayBackupDir, List files) { + for (String file : files) { + try { + IOUtils.copy( + new File(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)), + new File(StableUtils.pathJoin(todayBackupDir))); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage()); + } + } + } //获取备份目录 private String getBackupDirectory() { diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java b/designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java index 704e01121..d5f132e98 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmShowDialog.java @@ -3,7 +3,6 @@ package com.fr.design.upm; import com.fr.design.dialog.BasicPane; import com.fr.design.dialog.UIDialog; import com.fr.design.utils.gui.GUICoreUtils; -import com.fr.stable.StableUtils; import javax.swing.*; import java.awt.*; @@ -30,5 +29,6 @@ public class UpmShowDialog extends UIDialog { @Override public void checkValid() throws Exception { + } } diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java b/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java index 57b225920..834600e53 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java @@ -1,16 +1,26 @@ package com.fr.design.upm; import com.fr.design.dialog.BasicPane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.mainframe.DesignerContext; import com.fr.design.ui.ModernUIPane; +import com.fr.design.update.domain.UpdateConstants; +import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.design.upm.event.DownloadEvent; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StableUtils; +import com.fr.stable.project.ProjectConstants; import com.teamdev.jxbrowser.chromium.JSValue; import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; +import javax.swing.*; import java.awt.*; +import java.io.File; +import java.io.FileNotFoundException; /** * @author richie @@ -27,41 +37,61 @@ public class UpmShowPane extends BasicPane { return "UPM"; } - public UpmShowPane() { + UpmShowPane() { setLayout(new BorderLayout()); - if (UpmFinder.checkUPMResourcesExist()) { - modernUIPane = new ModernUIPane.Builder<>() - .prepare(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); - window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); - } - }) - .withURL(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()) - .build(); - EventDispatcher.listen(DownloadEvent.UPDATE, new Listener() { - @Override - public void on(Event event, String param) { - modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); + boolean flag = false; + File file = new File(StableUtils.pathJoin(StableUtils.getInstallHome(),ProjectConstants.LIB_NAME)); + File[] files = file.listFiles(); + if (files != null) { + for (File file1 : files) { + if (file1.getName().contains(UpdateConstants.JXBROWSER)) { + flag = true; + break; } - }); + } + }else { + FineLoggerFactory.getLogger().error("Designer lib can not be null"); + } + if (flag) { + if (UpmFinder.checkUPMResourcesExist()) { + modernUIPane = new ModernUIPane.Builder<>() + .prepare(new ScriptContextAdapter() { + @Override + public void onScriptContextCreated(ScriptContextEvent event) { + JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); + window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); + } + }) + .withURL(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()) + .build(); + EventDispatcher.listen(DownloadEvent.UPDATE, new Listener() { + @Override + public void on(Event event, String param) { + modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); + } + }); + } else { + modernUIPane = new ModernUIPane.Builder<>() + .withComponent(WarnComponent.KEY) + .prepare(new ScriptContextAdapter() { + @Override + public void onScriptContextCreated(ScriptContextEvent event) { + JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); + window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); + } + }).build(); + EventDispatcher.listen(DownloadEvent.SUCCESS, new Listener() { + @Override + public void on(Event event, String param) { + modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); + } + }); + } } else { - modernUIPane = new ModernUIPane.Builder<>() - .withComponent(WarnComponent.KEY) - .prepare(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); - window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); - } - }).build(); - EventDispatcher.listen(DownloadEvent.SUCCESS, new Listener() { - @Override - public void on(Event event, String param) { - modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); - } - }); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Update_Info_Plugin_Message")); + UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); + dialog.setAutoUpdateAfterInit(); + dialog.showDialog(); } add(modernUIPane, BorderLayout.CENTER); } From e7709306726103d442533ee30e23b6b1edbdb5fc Mon Sep 17 00:00:00 2001 From: Bryant Date: Sun, 29 Sep 2019 14:16:19 +0800 Subject: [PATCH 07/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../update/ui/dialog/RestoreResultDialog.java | 23 +++++--- .../update/ui/dialog/UpdateMainDialog.java | 54 +++++++++++-------- 2 files changed, 48 insertions(+), 29 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java index 0e83ff12f..8c1db89ec 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java @@ -7,12 +7,12 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.update.domain.UpdateConstants; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; +import com.fr.log.FineLoggerFactory; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; - import javax.swing.AbstractAction; import javax.swing.BorderFactory; import javax.swing.JDialog; @@ -25,6 +25,7 @@ import java.awt.Font; import java.awt.Frame; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -92,9 +93,7 @@ public class RestoreResultDialog extends JDialog { jarProgressLabel.setVisible(true); progressLabelPane.add(jarProgressLabel); pane.add(progressLabelPane, BorderLayout.CENTER); - - UpdateMainDialog.deletePreviousPropertyFile(); - + deletePreviousPropertyFile(); putJarBackupFiles(); restartButton.setEnabled(true); restartLaterButton.setEnabled(true); @@ -102,6 +101,18 @@ public class RestoreResultDialog extends JDialog { this.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Jar_Restore")); } + public static void deletePreviousPropertyFile() { + //在进行更新升级之前确保move和delete.properties删除 + File moveFile = new File(RestartHelper.MOVE_FILE); + File delFile = new File(RestartHelper.RECORD_FILE); + if ((moveFile.exists()) && (!moveFile.delete())) { + FineLoggerFactory.getLogger().error(RestartHelper.MOVE_FILE + "delete failed!"); + } + if ((delFile.exists()) && (!delFile.delete())) { + FineLoggerFactory.getLogger().error(RestartHelper.RECORD_FILE + "delete failed!"); + } + } + private void initOldVersionRestoreComps() { this.setResizable(false); JPanel pane = new JPanel(); @@ -151,8 +162,8 @@ public class RestoreResultDialog extends JDialog { } private void putJarBackupFiles() { - Map map = new HashMap(); - java.util.List list = new ArrayList(); + Map map = new HashMap<>(); + java.util.List list = new ArrayList<>(); String installHome = StableUtils.getInstallHome(); putJarBackupFilesToInstallLib(installHome, map, list); diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 45728505c..2f39f5eb0 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -25,7 +25,6 @@ import com.fr.design.update.ui.widget.UpdateInfoTableModel; import com.fr.design.update.ui.widget.UpdateInfoTextAreaCellRender; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.*; -import com.fr.general.http.HttpClient; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONObject; @@ -36,6 +35,9 @@ import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; +import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; +import com.fr.third.org.apache.http.client.methods.HttpGet; +import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; import com.fr.workspace.WorkContext; import com.sun.java.swing.plaf.motif.MotifProgressBarUI; @@ -47,6 +49,7 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.*; +import java.nio.charset.StandardCharsets; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -55,6 +58,8 @@ import java.util.List; import java.util.Locale; import java.util.concurrent.ExecutionException; +import static java.nio.charset.StandardCharsets.*; + /** * Created by XINZAI on 2018/8/21. */ @@ -380,6 +385,8 @@ public class UpdateMainDialog extends UIDialog { return new SwingWorker() { @Override protected JSONArray doInBackground() { + CloseableHttpClient httpClient; + CloseableHttpResponse response; try { getUpdateInfoSuccess = false; //step1:read from cache file @@ -388,16 +395,15 @@ public class UpdateMainDialog extends UIDialog { if (downloadFileConfig == null) { throw new Exception("network error."); } - HttpClient hc = new HttpClient(SiteCenter.getInstance().acquireUrlByKind("changelog10") + "&start=" + lastUpdateCacheTime + "&end=" + getLatestJARTimeStr()); - hc.asGet(); - hc.setTimeout(UpdateConstants.CONNECTION_TIMEOUT * 2); - String responseText = hc.getResponseText(); + HttpGet get = new HttpGet(CloudCenter.getInstance().acquireUrlByKind("changelog10") + "&start=" + lastUpdateCacheTime + "&end=" + getLatestJARTimeStr()); + httpClient = HttpToolbox.getHttpClient(CloudCenter.getInstance().acquireUrlByKind("changelog10") + "&start=" + lastUpdateCacheTime + "&end=" + getLatestJARTimeStr()); + response = httpClient.execute(get); + String responseText = CommonIOUtils.inputStream2String(response.getEntity().getContent(),EncodeConstants.ENCODING_UTF_8).trim(); JSONArray array = JSONArray.create(); //假如返回"-1",说明socket出错了 if (!ComparatorUtils.equals(responseText, "-1")) { array = new JSONArray(responseText); } - hc.release(); return array; } catch (Exception e) { FineLoggerFactory.getLogger().error(e.getMessage()); @@ -438,7 +444,7 @@ public class UpdateMainDialog extends UIDialog { return; } if (cacheFile.exists()) { - try (InputStreamReader streamReader = new InputStreamReader(new FileInputStream(cacheFile), "UTF-8"); + try (InputStreamReader streamReader = new InputStreamReader(new FileInputStream(cacheFile), StandardCharsets.UTF_8); BufferedReader br = new BufferedReader(streamReader)) { String readStr, updateTimeStr; while ((readStr = br.readLine()) != null) { @@ -483,13 +489,14 @@ public class UpdateMainDialog extends UIDialog { if (endTime.equals(lastUpdateCacheTime) || jsonArray.length() == 0 || ComparatorUtils.compare(endTime, lastUpdateCacheTime) <= 0) { return; } - try (OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(cacheFile), EncodeConstants.ENCODING_UTF_8); - BufferedWriter bufferWriter = new BufferedWriter(writerStream)) { - for (int i = 0; i < jsonArray.length(); i++) { - JSONObject jo = (JSONObject) jsonArray.get(i); - bufferWriter.write((String) jo.get("update") + '\t' + jo.get("title")); - bufferWriter.newLine(); - bufferWriter.flush(); + try (OutputStreamWriter writerStream = new OutputStreamWriter(new FileOutputStream(cacheFile), UTF_8)) { + try (BufferedWriter bufferWriter = new BufferedWriter(writerStream)) { + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject jo = (JSONObject) jsonArray.get(i); + bufferWriter.write((String) jo.get("update") + '\t' + jo.get("title")); + bufferWriter.newLine(); + bufferWriter.flush(); + } } } lastUpdateCacheState = UPDATE_CACHE_STATE_SUCCESS; @@ -507,6 +514,9 @@ public class UpdateMainDialog extends UIDialog { //形如 Build#release-2018.07.31.03.03.52.80 String currentNO = GeneralUtils.readBuildNO(); Date curJarDate = UPDATE_INFO_TABLE_FORMAT.parse(currentNO, new ParsePosition(currentNO.indexOf("-") + 1)); + if (curJarDate == null) { + curJarDate = updateTime; + } if (!ComparatorUtils.equals(keyword, StringUtils.EMPTY)) { if (!containsKeyword(UPDATE_INFO_TABLE_FORMAT.format(updateTime), keyword) && !containsKeyword(updateTitle, keyword)) { continue; @@ -579,7 +589,7 @@ public class UpdateMainDialog extends UIDialog { @Override public void actionPerformed(ActionEvent e) { backup(); - int a = JOptionPane.showConfirmDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Information"),Toolkit.i18nText("Fine-Design_Update_Info_Title"),2); + int a = JOptionPane.showConfirmDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Information"),Toolkit.i18nText("Fine-Design_Update_Info_Title"), JOptionPane.OK_CANCEL_OPTION); if (a == 0) { progressBar.setVisible(true); progressBar.setString(Toolkit.i18nText("Fine-Design_Update_Info_Wait_Message")); @@ -612,13 +622,13 @@ public class UpdateMainDialog extends UIDialog { String installHome = StableUtils.getInstallHome(); //jar包备份文件的目录为"backup/"+jar包当前版本号 String todayBackupDir = StableUtils.pathJoin(installHome, getBackupDirectory(), (GeneralUtils.readBuildNO())); - backupFilesFromInstallEnv(installHome, todayBackupDir, UpdateConstants.JARS_FOR_SERVER_X); - backupFilesFromInstallLib(installHome, todayBackupDir, UpdateConstants.JARS_FOR_DESIGNER_X); + backupFilesFromInstallEnv(installHome, todayBackupDir); + backupFilesFromInstallLib(installHome, todayBackupDir); jarCurrentLabel.setText(downloadFileConfig.optString("buildNO")); } - private void backupFilesFromInstallEnv(String installHome, String todayBackupDir, List files) { - for (String file : files) { + private void backupFilesFromInstallEnv(String installHome, String todayBackupDir) { + for (String file : UpdateConstants.JARS_FOR_SERVER_X) { try { IOUtils.copy( new File(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)), @@ -629,8 +639,8 @@ public class UpdateMainDialog extends UIDialog { } } - private void backupFilesFromInstallLib(String installHome, String todayBackupDir, List files) { - for (String file : files) { + private void backupFilesFromInstallLib(String installHome, String todayBackupDir) { + for (String file : UpdateConstants.JARS_FOR_DESIGNER_X) { try { IOUtils.copy( new File(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)), @@ -692,10 +702,8 @@ public class UpdateMainDialog extends UIDialog { /** * 检查有效性 * - * @throws Exception */ @Override public void checkValid() throws Exception { - } } \ No newline at end of file From 525a3256a83fec67700402e0d762eae33d2d4c33 Mon Sep 17 00:00:00 2001 From: vito Date: Sun, 29 Sep 2019 15:29:44 +0800 Subject: [PATCH 08/28] =?UTF-8?q?REPORT-22377=20=E6=94=B6=E9=9B=86jar?= =?UTF-8?q?=E7=89=88=E6=9C=AC=E4=BF=A1=E6=81=AF&release=E9=83=A8=E5=88=86?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=A0feature?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/InformationCollector.java | 644 +++++++++--------- .../StartupMessageCollector.java | 9 +- 2 files changed, 345 insertions(+), 308 deletions(-) diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java index 25c8a493e..52440d9e3 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/InformationCollector.java @@ -30,6 +30,7 @@ import com.fr.stable.xml.XMLTools; import com.fr.stable.xml.XMLWriter; import com.fr.stable.xml.XMLableReader; import com.fr.third.javax.xml.stream.XMLStreamException; +import com.sun.management.OperatingSystemMXBean; import java.io.BufferedWriter; import java.io.ByteArrayInputStream; @@ -43,11 +44,14 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; +import java.lang.management.ManagementFactory; +import java.nio.charset.StandardCharsets; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; +import java.util.Objects; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -58,309 +62,339 @@ import java.util.concurrent.TimeUnit; */ public class InformationCollector implements XMLReadable, XMLWriter { - // 24小时上传一次 - private static final long DELTA = 24 * 3600 * 1000L; - private static final long SEND_DELAY = 300 * 1000L; - private static final String FILE_NAME = "fr.info"; - private static final String XML_START_STOP_LIST = "StartStopList"; - private static final String XML_START_STOP = "StartStop"; - private static final String XML_LAST_TIME = "LastTime"; - private static final String ATTR_START = "start"; - private static final String ATTR_STOP = "stop"; - private static final String XML_JAR = "JarInfo"; - private static final String XML_VERSION = "Version"; - private static final String XML_USERNAME = "Username"; - private static final String XML_UUID = "UUID"; - private static final String XML_KEY = "ActiveKey"; - private static final String XML_OS = "OS"; - - private static InformationCollector collector; - - //启动时间与关闭时间列表 - private List startStop = new ArrayList(); - //上一次的发送时间 - private String lastTime; - private StartStopTime current = new StartStopTime(); - - public static InformationCollector getInstance() { - if (collector == null) { - collector = new InformationCollector(); - - readEncodeXMLFile(collector, collector.getInfoFile()); - } - - return collector; - } - - private static void readEncodeXMLFile(XMLReadable xmlReadable, File xmlFile) { - if (xmlFile == null || !xmlFile.exists()) { - return; - } - String charset = EncodeConstants.ENCODING_UTF_8; - try { - String decodeContent = getDecodeFileContent(xmlFile); - InputStream xmlInputStream = new ByteArrayInputStream(decodeContent.getBytes(charset)); - InputStreamReader inputStreamReader = new InputStreamReader(xmlInputStream, charset); - - XMLableReader xmlReader = XMLableReader.createXMLableReader(inputStreamReader); - - if (xmlReader != null) { - xmlReader.readXMLObject(xmlReadable); - } - xmlInputStream.close(); - } catch (FileNotFoundException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } catch (XMLStreamException e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - - } - - private static String getDecodeFileContent(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException { - InputStream encodeInputStream = new FileInputStream(xmlFile); - String encodeContent = IOUtils.inputStream2String(encodeInputStream); - return DesUtils.getDecString(encodeContent); - } - - private long getLastTimeMillis() { - if (StringUtils.isEmpty(this.lastTime)) { - return 0; - } - - try { - return DateUtils.string2Date(this.lastTime, true).getTime(); - } catch (Exception e) { - return -1; - } - - } - - private JSONObject getJSONContentAsByte() { - JSONObject content = new JSONObject(); - - JSONArray startStopArray = new JSONArray(); - for (int i = 0; i < startStop.size(); i++) { - JSONObject jo = new JSONObject(); - jo.put(ATTR_START, startStop.get(i).getStartDate()); - jo.put(ATTR_STOP, startStop.get(i).getStopDate()); - startStopArray.put(jo); - DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); - content.put(XML_START_STOP, startStopArray); - content.put(XML_UUID, envManager.getUUID()); - content.put(XML_JAR, GeneralUtils.readBuildNO()); - content.put(XML_VERSION, ProductConstants.RELEASE_VERSION); - content.put(XML_USERNAME, MarketConfig.getInstance().getBbsUsername()); - content.put(XML_KEY, envManager.getActivationKey()); - content.put(XML_OS, System.getProperty("os.name")); - } - return content; - } - - private void sendUserInfo() { - long currentTime = new Date().getTime(); - long lastTime = getLastTimeMillis(); - - if (currentTime - lastTime <= DELTA) { - return; - } - JSONObject content = getJSONContentAsByte(); - String url = CloudCenter.getInstance().acquireUrlByKind("user.info.v10"); - boolean success = false; - try { - HashMap para = new HashMap<>(); - para.put("token", SiteCenterToken.generateToken()); - para.put("content", content); - String res = HttpToolbox.post(url, para); - success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - if (success) { - this.reset(); - } - } - - /** - * 收集开始使用时间,发送信息 - */ - public void collectStartTime() { - this.current.setStartDate(dateToString()); - - sendUserInfoInOtherThread(); - } - - private void sendUserInfoInOtherThread() { - if (!DesignerEnvManager.getEnvManager().isJoinProductImprove() || !FRContext.isChineseEnv()) { - return; - } - - ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(new NamedThreadFactory("InformationCollector")); - service.schedule(new Runnable() { - @Override - public void run() { - sendUserInfo(); - FocusPointMessageUploader.getInstance().sendToCloudCenter(); - TemplateInfoCollector.getInstance().sendTemplateInfo(); - ErrorInfoUploader.getInstance().sendErrorInfo(); - } - }, SEND_DELAY, TimeUnit.MILLISECONDS); - } - - /** - * 收集结束使用时间 - */ - public void collectStopTime() { - this.current.setStopDate(dateToString()); - } - - private String dateToString() { - DateFormat df = FRContext.getDefaultValues().getDateTimeFormat(); - return df.format(new Date()); - } - - private void reset() { - this.startStop.clear(); - this.lastTime = dateToString(); - } - - private File getInfoFile() { - return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); - } - - /** - * 保存xml文件 - */ - public void saveXMLFile() { - File xmlFile = this.getInfoFile(); - try { - ByteArrayOutputStream out = new ByteArrayOutputStream(); - XMLTools.writeOutputStreamXML(this, out); - out.flush(); - out.close(); - String fileContent = new String(out.toByteArray(), EncodeConstants.ENCODING_UTF_8); - String encodeCotent = DesUtils.getEncString(fileContent); - writeEncodeContentToFile(encodeCotent, xmlFile); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - - - /** - * 将文件内容写到输出流中 - */ - private static void writeEncodeContentToFile(String fileContent, File file) { - try (FileOutputStream fos = new FileOutputStream(file); - OutputStreamWriter osw = new OutputStreamWriter(fos, EncodeConstants.ENCODING_UTF_8); - BufferedWriter bw = new BufferedWriter(osw)) { - bw.write(fileContent); - } catch (Exception e) { - FineLoggerFactory.getLogger().error(e.getMessage(), e); - } - } - - @Override - public void writeXML(XMLPrintWriter writer) { - startStop.add(current); - writer.startTAG("Info"); - //启停信息 - writeStartStopList(writer); - //上一次更新的时间 - writeTag(XML_LAST_TIME, this.lastTime, writer); - - writer.end(); - } - - private void writeStartStopList(XMLPrintWriter writer) { - //启停 - writer.startTAG(XML_START_STOP_LIST); - for (int i = 0; i < startStop.size(); i++) { - startStop.get(i).writeXML(writer); - } - writer.end(); - } - - private void writeTag(String tag, String content, XMLPrintWriter writer) { - if (StringUtils.isEmpty(content)) { - return; - } - - writer.startTAG(tag); - writer.textNode(content); - writer.end(); - } - - @Override - public void readXML(XMLableReader reader) { - if (reader.isChildNode()) { - String name = reader.getTagName(); - if (XML_START_STOP_LIST.equals(name)) { - readStartStopList(reader); - } else if (XML_LAST_TIME.equals(name)) { - readLastTime(reader); - } - } - } - - private void readLastTime(XMLableReader reader) { - String tmpVal; - if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { - this.lastTime = tmpVal; - } - } - - private void readStartStopList(XMLableReader reader) { - startStop.clear(); - - reader.readXMLObject(new XMLReadable() { - public void readXML(XMLableReader reader) { - if (XML_START_STOP.equals(reader.getTagName())) { - StartStopTime startStopTime = new StartStopTime(); - reader.readXMLObject(startStopTime); - startStop.add(startStopTime); - } - } - }); - } - - private class StartStopTime implements XMLReadable, XMLWriter { - - private String startDate; - private String stopDate; - - public String getStartDate() { - return startDate; - } - - public void setStartDate(String startDate) { - this.startDate = startDate; - } - - public String getStopDate() { - return stopDate; - } - - public void setStopDate(String endDate) { - this.stopDate = endDate; - } - - public void writeXML(XMLPrintWriter writer) { - writer.startTAG(XML_START_STOP); - if (StringUtils.isNotEmpty(startDate)) { - writer.attr(ATTR_START, this.startDate); - } - if (StringUtils.isNotEmpty(stopDate)) { - writer.attr(ATTR_STOP, this.stopDate); - } - writer.end(); - } - - public void readXML(XMLableReader reader) { - this.startDate = reader.getAttrAsString(ATTR_START, StringUtils.EMPTY); - this.stopDate = reader.getAttrAsString(ATTR_STOP, StringUtils.EMPTY); - } - - } + /** + * 24小时上传一次 + */ + private static final long DELTA = 24 * 3600 * 1000L; + private static final long SEND_DELAY = 300 * 1000L; + private static final int BYTE_TO_MB = 1024 * 1024; + private static final String FILE_NAME = "fr.info"; + private static final String XML_START_STOP_LIST = "StartStopList"; + private static final String XML_START_STOP = "StartStop"; + private static final String XML_LAST_TIME = "LastTime"; + private static final String ATTR_START = "start"; + private static final String ATTR_STOP = "stop"; + private static final String XML_JAR = "JarInfo"; + private static final String XML_VERSION = "Version"; + private static final String XML_USERNAME = "Username"; + private static final String XML_UUID = "UUID"; + private static final String XML_KEY = "ActiveKey"; + private static final String XML_OS = "OS"; + private static final String XML_ARCH = "arch"; + private static final String XML_AVAILABLE_PROCESSORS = "cpu"; + private static final String XML_PHYSICAL_MEMORY = "systemMemory"; + + private static InformationCollector collector; + + /** + * 启动时间与关闭时间列表 + */ + private List startStop = new ArrayList(); + + /** + * 上一次的发送时间 + */ + private String lastTime; + private StartStopTime current = new StartStopTime(); + + public static InformationCollector getInstance() { + if (collector == null) { + collector = new InformationCollector(); + + readEncodeXMLFile(collector, collector.getInfoFile()); + } + + return collector; + } + + private static void readEncodeXMLFile(XMLReadable xmlReadable, File xmlFile) { + if (xmlFile == null || !xmlFile.exists()) { + return; + } + String charset = EncodeConstants.ENCODING_UTF_8; + try { + String decodeContent = getDecodeFileContent(xmlFile); + InputStream xmlInputStream = new ByteArrayInputStream(decodeContent.getBytes(charset)); + InputStreamReader inputStreamReader = new InputStreamReader(xmlInputStream, charset); + + XMLableReader xmlReader = XMLableReader.createXMLableReader(inputStreamReader); + + if (xmlReader != null) { + xmlReader.readXMLObject(xmlReadable); + } + xmlInputStream.close(); + } catch (FileNotFoundException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (XMLStreamException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + + } + + private static String getDecodeFileContent(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException { + InputStream encodeInputStream = new FileInputStream(xmlFile); + String encodeContent = IOUtils.inputStream2String(encodeInputStream); + return DesUtils.getDecString(encodeContent); + } + + private long getLastTimeMillis() { + if (StringUtils.isEmpty(this.lastTime)) { + return 0; + } + + try { + return Objects.requireNonNull(DateUtils.string2Date(this.lastTime, true)).getTime(); + } catch (Exception e) { + return -1; + } + + } + + private JSONObject getJSONContentAsByte() { + JSONObject content = new JSONObject(); + + JSONArray startStopArray = new JSONArray(); + for (StartStopTime startStopTime : startStop) { + JSONObject jo = new JSONObject(); + jo.put(ATTR_START, startStopTime.getStartDate()); + jo.put(ATTR_STOP, startStopTime.getStopDate()); + startStopArray.put(jo); + } + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); + content.put(XML_START_STOP, startStopArray); + content.put(XML_UUID, envManager.getUUID()); + content.put(XML_JAR, GeneralUtils.readBuildNO()); + content.put(XML_VERSION, ProductConstants.RELEASE_VERSION); + content.put(XML_USERNAME, MarketConfig.getInstance().getBbsUsername()); + content.put(XML_KEY, envManager.getActivationKey()); + content.put(XML_OS, System.getProperty("os.name")); + content.put(XML_ARCH, System.getProperty("os.arch")); + content.put(XML_AVAILABLE_PROCESSORS, Runtime.getRuntime().availableProcessors()); + content.put(XML_PHYSICAL_MEMORY, getTotalPhysicalMemorySize()); + return content; + } + + /** + * 获取物理内存,单位GB + * + * @return 物理内存 + */ + private static long getTotalPhysicalMemorySize() { + OperatingSystemMXBean bean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + return bean.getTotalPhysicalMemorySize() / BYTE_TO_MB; + } + + + private void sendUserInfo() { + long currentTime = System.currentTimeMillis(); + long lastTime = getLastTimeMillis(); + + if (currentTime - lastTime <= DELTA) { + return; + } + JSONObject content = getJSONContentAsByte(); + String url = CloudCenter.getInstance().acquireUrlByKind("user.info.v10"); + boolean success = false; + try { + HashMap para = new HashMap<>(); + para.put("token", SiteCenterToken.generateToken()); + para.put("content", content); + String res = HttpToolbox.post(url, para); + success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + if (success) { + this.reset(); + } + } + + /** + * 收集开始使用时间,发送信息 + */ + public void collectStartTime() { + this.current.setStartDate(dateToString()); + + sendUserInfoInOtherThread(); + } + + private void sendUserInfoInOtherThread() { + if (!DesignerEnvManager.getEnvManager().isJoinProductImprove() || !FRContext.isChineseEnv()) { + return; + } + + ScheduledExecutorService service = Executors + .newSingleThreadScheduledExecutor(new NamedThreadFactory("InformationCollector")); + service.schedule(new Runnable() { + @Override + public void run() { + sendUserInfo(); + FocusPointMessageUploader.getInstance().sendToCloudCenter(); + TemplateInfoCollector.getInstance().sendTemplateInfo(); + ErrorInfoUploader.getInstance().sendErrorInfo(); + } + }, SEND_DELAY, TimeUnit.MILLISECONDS); + service.shutdown(); + } + + /** + * 收集结束使用时间 + */ + public void collectStopTime() { + this.current.setStopDate(dateToString()); + } + + private String dateToString() { + DateFormat df = FRContext.getDefaultValues().getDateTimeFormat(); + return df.format(new Date()); + } + + private void reset() { + this.startStop.clear(); + this.lastTime = dateToString(); + } + + private File getInfoFile() { + return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); + } + + /** + * 保存xml文件 + */ + public void saveXMLFile() { + File xmlFile = this.getInfoFile(); + try { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + XMLTools.writeOutputStreamXML(this, out); + out.flush(); + out.close(); + String fileContent = new String(out.toByteArray(), StandardCharsets.UTF_8); + String encodeCotent = DesUtils.getEncString(fileContent); + writeEncodeContentToFile(encodeCotent, xmlFile); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + + /** + * 将文件内容写到输出流中 + */ + private static void writeEncodeContentToFile(String fileContent, File file) { + try (FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8); + BufferedWriter bw = new BufferedWriter(osw)) { + bw.write(fileContent); + } catch (Exception e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + } + + @Override + public void writeXML(XMLPrintWriter writer) { + startStop.add(current); + writer.startTAG("Info"); + //启停信息 + writeStartStopList(writer); + //上一次更新的时间 + writeTag(XML_LAST_TIME, this.lastTime, writer); + + writer.end(); + } + + private void writeStartStopList(XMLPrintWriter writer) { + //启停 + writer.startTAG(XML_START_STOP_LIST); + for (StartStopTime startStopTime : startStop) { + startStopTime.writeXML(writer); + } + writer.end(); + } + + private void writeTag(String tag, String content, XMLPrintWriter writer) { + if (StringUtils.isEmpty(content)) { + return; + } + + writer.startTAG(tag); + writer.textNode(content); + writer.end(); + } + + @Override + public void readXML(XMLableReader reader) { + if (reader.isChildNode()) { + String name = reader.getTagName(); + if (XML_START_STOP_LIST.equals(name)) { + readStartStopList(reader); + } else if (XML_LAST_TIME.equals(name)) { + readLastTime(reader); + } + } + } + + private void readLastTime(XMLableReader reader) { + String tmpVal; + if (StringUtils.isNotBlank(tmpVal = reader.getElementValue())) { + this.lastTime = tmpVal; + } + } + + private void readStartStopList(XMLableReader reader) { + startStop.clear(); + + reader.readXMLObject(new XMLReadable() { + @Override + public void readXML(XMLableReader reader) { + if (XML_START_STOP.equals(reader.getTagName())) { + StartStopTime startStopTime = new StartStopTime(); + reader.readXMLObject(startStopTime); + startStop.add(startStopTime); + } + } + }); + } + + private class StartStopTime implements XMLReadable, XMLWriter { + + private String startDate; + private String stopDate; + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getStopDate() { + return stopDate; + } + + public void setStopDate(String endDate) { + this.stopDate = endDate; + } + + @Override + public void writeXML(XMLPrintWriter writer) { + writer.startTAG(XML_START_STOP); + if (StringUtils.isNotEmpty(startDate)) { + writer.attr(ATTR_START, this.startDate); + } + if (StringUtils.isNotEmpty(stopDate)) { + writer.attr(ATTR_STOP, this.stopDate); + } + writer.end(); + } + + @Override + public void readXML(XMLableReader reader) { + this.startDate = reader.getAttrAsString(ATTR_START, StringUtils.EMPTY); + this.stopDate = reader.getAttrAsString(ATTR_STOP, StringUtils.EMPTY); + } + + } } \ No newline at end of file diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/StartupMessageCollector.java b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/StartupMessageCollector.java index ac1072466..0ca2eb95b 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/StartupMessageCollector.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/messagecollect/StartupMessageCollector.java @@ -8,6 +8,7 @@ import com.fr.event.EventDispatcher; import com.fr.event.Listener; import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralUtils; import com.fr.general.http.HttpToolbox; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; @@ -30,14 +31,15 @@ public class StartupMessageCollector { private static final String XML_STARTUP_TIME = "t"; private static final String XML_STARTUP_LOG = "startupLog"; - private static final String XML_STARTUP_Memory = "designerMemory"; + private static final String XML_STARTUP_MEMORY = "designerMemory"; private static final String XML_STARTUP_COST = "cost"; private static final String XML_UUID = "UUID"; + private static final String XML_BUILD_NO = "buildNO"; private static final String STARTUP_URL_KEY = "user.info.v10.startup"; private static final String LOG_TYPE = "single"; private static final int BYTE_TO_MB = 1024 * 1024; - public static final StartupMessageCollector INSTANCE = new StartupMessageCollector(); + private static final StartupMessageCollector INSTANCE = new StartupMessageCollector(); private StartupMessageCollector() { } @@ -67,10 +69,11 @@ public class StartupMessageCollector { } JSONObject json = JSONObject.create() .put(XML_UUID, DesignerEnvManager.getEnvManager().getUUID()) + .put(XML_BUILD_NO, GeneralUtils.readBuildNO()) .put(XML_STARTUP_TIME, FineRuntime.getAppStartTime() + FineRuntime.getStartingTime()) .put(XML_STARTUP_COST, FineRuntime.getStartingTime()) .put(XML_STARTUP_LOG, profile) - .put(XML_STARTUP_Memory, Runtime.getRuntime().totalMemory() / BYTE_TO_MB); + .put(XML_STARTUP_MEMORY, Runtime.getRuntime().maxMemory() / BYTE_TO_MB); sendInfo(json, url + LOG_TYPE); } }); From 69dc9bf939a0ddea5bcb1596e0386f6dee42234c Mon Sep 17 00:00:00 2001 From: Bryant Date: Sun, 29 Sep 2019 15:35:51 +0800 Subject: [PATCH 09/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../update/ui/dialog/RestoreResultDialog.java | 16 +++++++------ .../ui/dialog/RestoreResultDialogTest.java | 23 +++++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 designer-base/src/test/java/com/fr/design/update/ui/dialog/RestoreResultDialogTest.java diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java index 8c1db89ec..a1211e7ff 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java @@ -93,7 +93,7 @@ public class RestoreResultDialog extends JDialog { jarProgressLabel.setVisible(true); progressLabelPane.add(jarProgressLabel); pane.add(progressLabelPane, BorderLayout.CENTER); - deletePreviousPropertyFile(); + deletePreviousPropertyFile(RestartHelper.MOVE_FILE,RestartHelper.RECORD_FILE); putJarBackupFiles(); restartButton.setEnabled(true); restartLaterButton.setEnabled(true); @@ -101,16 +101,18 @@ public class RestoreResultDialog extends JDialog { this.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Jar_Restore")); } - public static void deletePreviousPropertyFile() { - //在进行更新升级之前确保move和delete.properties删除 - File moveFile = new File(RestartHelper.MOVE_FILE); - File delFile = new File(RestartHelper.RECORD_FILE); + public static boolean deletePreviousPropertyFile(String move, String record) { + File moveFile = new File(move); + File delFile = new File(record); if ((moveFile.exists()) && (!moveFile.delete())) { - FineLoggerFactory.getLogger().error(RestartHelper.MOVE_FILE + "delete failed!"); + FineLoggerFactory.getLogger().error(move + "delete failed!"); + return false; } if ((delFile.exists()) && (!delFile.delete())) { - FineLoggerFactory.getLogger().error(RestartHelper.RECORD_FILE + "delete failed!"); + FineLoggerFactory.getLogger().error(record + "delete failed!"); + return false; } + return true; } private void initOldVersionRestoreComps() { diff --git a/designer-base/src/test/java/com/fr/design/update/ui/dialog/RestoreResultDialogTest.java b/designer-base/src/test/java/com/fr/design/update/ui/dialog/RestoreResultDialogTest.java new file mode 100644 index 000000000..9a30e54fd --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/update/ui/dialog/RestoreResultDialogTest.java @@ -0,0 +1,23 @@ +package com.fr.design.update.ui.dialog; + + +import org.easymock.EasyMock; +import org.easymock.IMocksControl; +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; + +public class RestoreResultDialogTest { + + @Test + public void testDeletePreviousPropertyFile() { + IMocksControl control = EasyMock.createControl(); + File testRecordFile = control.createMock(File.class); + File testMoveFile = control.createMock(File.class); + EasyMock.expect(testRecordFile.getPath()).andReturn("move").anyTimes(); + EasyMock.expect(testMoveFile.getPath()).andReturn("record").anyTimes(); + control.replay(); + Assert.assertTrue(RestoreResultDialog.deletePreviousPropertyFile("move","record")); + } +} From 8a56c817a56c004a9a8065c5d9b083e19f549133 Mon Sep 17 00:00:00 2001 From: Bryant Date: Sun, 29 Sep 2019 15:59:38 +0800 Subject: [PATCH 10/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../update/ui/dialog/RestoreResultDialog.java | 20 ++++++---------- .../ui/dialog/RestoreResultDialogTest.java | 23 +++++++++++-------- 2 files changed, 20 insertions(+), 23 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java index a1211e7ff..5f325a1d9 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java @@ -7,7 +7,6 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.update.domain.UpdateConstants; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; -import com.fr.log.FineLoggerFactory; import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; @@ -93,7 +92,7 @@ public class RestoreResultDialog extends JDialog { jarProgressLabel.setVisible(true); progressLabelPane.add(jarProgressLabel); pane.add(progressLabelPane, BorderLayout.CENTER); - deletePreviousPropertyFile(RestartHelper.MOVE_FILE,RestartHelper.RECORD_FILE); + deletePreviousPropertyFile(); putJarBackupFiles(); restartButton.setEnabled(true); restartLaterButton.setEnabled(true); @@ -101,18 +100,13 @@ public class RestoreResultDialog extends JDialog { this.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Jar_Restore")); } - public static boolean deletePreviousPropertyFile(String move, String record) { - File moveFile = new File(move); - File delFile = new File(record); - if ((moveFile.exists()) && (!moveFile.delete())) { - FineLoggerFactory.getLogger().error(move + "delete failed!"); - return false; + public static boolean deletePreviousPropertyFile() { + File moveFile = new File(RestartHelper.MOVE_FILE); + File delFile = new File(RestartHelper.RECORD_FILE); + if (StableUtils.mkdirs(moveFile) && StableUtils.mkdirs(delFile)) { + return StableUtils.deleteFile(moveFile) && StableUtils.deleteFile(delFile); } - if ((delFile.exists()) && (!delFile.delete())) { - FineLoggerFactory.getLogger().error(record + "delete failed!"); - return false; - } - return true; + return false; } private void initOldVersionRestoreComps() { diff --git a/designer-base/src/test/java/com/fr/design/update/ui/dialog/RestoreResultDialogTest.java b/designer-base/src/test/java/com/fr/design/update/ui/dialog/RestoreResultDialogTest.java index 9a30e54fd..86be0450e 100644 --- a/designer-base/src/test/java/com/fr/design/update/ui/dialog/RestoreResultDialogTest.java +++ b/designer-base/src/test/java/com/fr/design/update/ui/dialog/RestoreResultDialogTest.java @@ -1,23 +1,26 @@ package com.fr.design.update.ui.dialog; - -import org.easymock.EasyMock; -import org.easymock.IMocksControl; +import com.fr.design.RestartHelper; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.StableUtils; import org.junit.Assert; import org.junit.Test; import java.io.File; +import java.io.IOException; public class RestoreResultDialogTest { @Test public void testDeletePreviousPropertyFile() { - IMocksControl control = EasyMock.createControl(); - File testRecordFile = control.createMock(File.class); - File testMoveFile = control.createMock(File.class); - EasyMock.expect(testRecordFile.getPath()).andReturn("move").anyTimes(); - EasyMock.expect(testMoveFile.getPath()).andReturn("record").anyTimes(); - control.replay(); - Assert.assertTrue(RestoreResultDialog.deletePreviousPropertyFile("move","record")); + File moveFile = new File(RestartHelper.MOVE_FILE); + File recordFile = new File(RestartHelper.RECORD_FILE); + try { + StableUtils.makesureFileExist(moveFile); + StableUtils.makesureFileExist(recordFile); + Assert.assertTrue(RestoreResultDialog.deletePreviousPropertyFile()); + } catch (IOException e) { + FineLoggerFactory.getLogger().error(e.getMessage(),e); + } } } From d7b8ba9f3993239926e611ce7eb6d232af35e1c1 Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Mon, 30 Sep 2019 14:04:45 +0800 Subject: [PATCH 11/28] =?UTF-8?q?REPORT-21689=20=E6=B0=B4=E5=8D=B0?= =?UTF-8?q?=E5=AF=86=E5=BA=A6=E6=9C=80=E5=B0=8F=E5=80=BC=E9=99=90=E5=88=B6?= =?UTF-8?q?=EF=BC=8C=E6=A0=B9=E6=8D=AE=E4=BA=A4=E4=BA=92=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AE=B9=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/gui/ispinner/UISpinner.java | 11 +++++++++-- .../java/com/fr/design/report/WatermarkPane.java | 13 +++++-------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java index 825dddb4e..6a5f61cc9 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java @@ -39,6 +39,7 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver private String spinnerName = StringUtils.EMPTY; private UIObserverListener uiObserverListener; private GlobalNameListener globalNameListener = null; + private boolean lessMinValue = false; public UISpinner(double minValue, double maxValue, double dierta) { @@ -97,6 +98,10 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver return nextButton; } + public boolean isLessMinValue() { + return lessMinValue; + } + public void setValue(double value) { setValue(value, true); } @@ -113,7 +118,8 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver if (globalNameListener != null && shouldResponseNameListener()) { globalNameListener.setGlobalName(spinnerName); } - value = value < minValue ? minValue : value; + lessMinValue = value < minValue; + value = lessMinValue ? minValue : value; value = value > maxValue ? maxValue : value; if (CommonUtils.equals(value, this.value)) { return; @@ -135,7 +141,8 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver if (globalNameListener != null && shouldResponseNameListener()) { globalNameListener.setGlobalName(spinnerName); } - value = value < minValue ? minValue : value; + lessMinValue = value < minValue; + value = lessMinValue ? minValue : value; value = value > maxValue ? maxValue : value; if (CommonUtils.equals(value, this.value)) { diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java index 178479de8..d5107d527 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java @@ -36,6 +36,7 @@ import java.awt.event.ItemListener; import java.awt.event.MouseListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; +import java.awt.event.FocusAdapter; import java.awt.Dialog; import java.awt.FlowLayout; @@ -269,14 +270,10 @@ public class WatermarkPane extends BasicPane { * @return */ private FocusListener createFocusListener4GapNumberField(final UISpinner spinner, final int limitMinValue, final String messageStr) { - return new FocusListener() { - @Override - public void focusGained(FocusEvent e) { - } - + return new FocusAdapter() { @Override public void focusLost(FocusEvent e) { - if (spinner.getValue() >= limitMinValue) { + if (!spinner.isLessMinValue()) { return; } createGapDialog(new StringBuilder(messageStr).append(limitMinValue).toString()); @@ -294,8 +291,8 @@ public class WatermarkPane extends BasicPane { private MouseListener createMouseListener4GapNextButton(final UISpinner spinner, final int limitMinValue, final String messageStr) { MouseAdapter mouseAdapter = new MouseAdapter() { @Override - public void mousePressed(MouseEvent e) { - if (spinner.getValue() >= limitMinValue) { + public void mouseReleased(MouseEvent e) { + if (!spinner.isLessMinValue()) { return; } createGapDialog(new StringBuilder(messageStr).append(limitMinValue).toString()); From a6487c2354fdc7b933242be3663d2d3816a2899d Mon Sep 17 00:00:00 2001 From: "Hugh.C" Date: Mon, 30 Sep 2019 14:23:18 +0800 Subject: [PATCH 12/28] =?UTF-8?q?REPORT-21689=20=E6=B0=B4=E5=8D=B0?= =?UTF-8?q?=E5=AF=86=E5=BA=A6=E6=9C=80=E5=B0=8F=E5=80=BC=E9=99=90=E5=88=B6?= =?UTF-8?q?=EF=BC=8C=E6=A0=B9=E6=8D=AE=E4=BA=A4=E4=BA=92=E6=8F=90=E4=BE=9B?= =?UTF-8?q?=E7=9A=84=E5=86=85=E5=AE=B9=E8=A1=A5=E5=85=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/design/gui/ispinner/UISpinner.java | 4 ++++ .../src/main/java/com/fr/design/report/WatermarkPane.java | 2 ++ 2 files changed, 6 insertions(+) diff --git a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java index 6a5f61cc9..fb6752ac1 100644 --- a/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java +++ b/designer-base/src/main/java/com/fr/design/gui/ispinner/UISpinner.java @@ -102,6 +102,10 @@ public class UISpinner extends JPanel implements UIObserver, GlobalNameObserver return lessMinValue; } + public void resetLessMinValue() { + lessMinValue = false; + } + public void setValue(double value) { setValue(value, true); } diff --git a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java index d5107d527..07ec40bfe 100644 --- a/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java +++ b/designer-base/src/main/java/com/fr/design/report/WatermarkPane.java @@ -276,6 +276,7 @@ public class WatermarkPane extends BasicPane { if (!spinner.isLessMinValue()) { return; } + spinner.resetLessMinValue(); createGapDialog(new StringBuilder(messageStr).append(limitMinValue).toString()); } }; @@ -295,6 +296,7 @@ public class WatermarkPane extends BasicPane { if (!spinner.isLessMinValue()) { return; } + spinner.resetLessMinValue(); createGapDialog(new StringBuilder(messageStr).append(limitMinValue).toString()); } }; From 1cc8fb3a0cddf8d42298bf5fcd4bbf16850b1b9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Mon, 30 Sep 2019 15:45:35 +0800 Subject: [PATCH 13/28] =?UTF-8?q?CHART-10233=20=E8=B6=85=E9=93=BE=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chartx/component/HyperLinkPane.java | 274 ++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java new file mode 100644 index 000000000..b3236fd6a --- /dev/null +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java @@ -0,0 +1,274 @@ +package com.fr.design.chartx.component; + +import com.fr.base.BaseFormula; +import com.fr.chart.web.ChartHyperPoplink; +import com.fr.chart.web.ChartHyperRelateCellLink; +import com.fr.chart.web.ChartHyperRelateFloatLink; +import com.fr.design.ExtraDesignClassManager; +import com.fr.design.beans.BasicBeanPane; +import com.fr.design.chart.javascript.ChartEmailPane; +import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperPoplinkPane; +import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperRelateCellLinkPane; +import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperRelateFloatLinkPane; +import com.fr.design.chart.series.SeriesCondition.impl.FormHyperlinkPane; +import com.fr.design.event.UIObserver; +import com.fr.design.event.UIObserverListener; +import com.fr.design.fun.HyperlinkProvider; +import com.fr.design.gui.controlpane.NameObjectCreator; +import com.fr.design.gui.controlpane.NameableCreator; +import com.fr.design.gui.controlpane.UIListControlPane; +import com.fr.design.gui.ilable.UILabel; +import com.fr.design.gui.imenutable.UIMenuNameableCreator; +import com.fr.design.gui.itoolbar.UIToolbar; +import com.fr.design.hyperlink.ReportletHyperlinkPane; +import com.fr.design.hyperlink.WebHyperlinkPane; +import com.fr.design.i18n.Toolkit; +import com.fr.design.javascript.JavaScriptImplPane; +import com.fr.design.javascript.ParameterJavaScriptPane; +import com.fr.design.layout.TableLayout; +import com.fr.design.layout.TableLayoutHelper; +import com.fr.design.module.DesignModuleFactory; +import com.fr.general.NameObject; +import com.fr.js.EmailJavaScript; +import com.fr.js.FormHyperlinkProvider; +import com.fr.js.JavaScript; +import com.fr.js.JavaScriptImpl; +import com.fr.js.NameJavaScript; +import com.fr.js.NameJavaScriptGroup; +import com.fr.js.ParameterJavaScript; +import com.fr.js.ReportletHyperlink; +import com.fr.js.WebHyperlink; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.ListMap; +import com.fr.stable.Nameable; +import com.fr.stable.bridge.StableFactory; +import com.fr.van.chart.designer.TableLayout4VanChartHelper; + +import javax.swing.JPanel; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.awt.Component; + +/** + * @author Bjorn + * @version 10.0 + * Created by Bjorn on 2019-09-25 + */ +public class HyperLinkPane extends UIListControlPane implements UIObserver { + + NameJavaScriptGroup nameGroup; + + HashMap hyperLinkEditorMap; + + private UIObserverListener uiObserverListener; + + public HyperLinkPane() { + super(); + this.setBorder(null); + } + + @Override + public NameableCreator[] createNameableCreators() { + //面板初始化,需要在populate的时候更新 + Map nameCreators = new ListMap(); + NameableCreator[] creators = DesignModuleFactory.getHyperlinkGroupType().getHyperlinkCreators(); + for (NameableCreator creator : creators) { + nameCreators.put(creator.menuName(), creator); + } + Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); + for (HyperlinkProvider provider : providers) { + NameableCreator nc = provider.createHyperlinkCreator(); + nameCreators.put(nc.menuName(), nc); + } + return nameCreators.values().toArray(new NameableCreator[nameCreators.size()]); + } + + public BasicBeanPane createPaneByCreators(NameableCreator creator) { + Constructor constructor; + try { + constructor = creator.getUpdatePane().getConstructor(HashMap.class, boolean.class); + return constructor.newInstance(hyperLinkEditorMap, false); + + } catch (InstantiationException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (IllegalAccessException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (NoSuchMethodException e) { + return super.createPaneByCreators(creator); + } catch (InvocationTargetException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } + return null; + } + + @Override + public void registerChangeListener(UIObserverListener listener) { + uiObserverListener = listener; + } + + @Override + public boolean shouldResponseChangeListener() { + return true; + } + + @Override + protected JPanel getLeftTopPane(UIToolbar topToolBar) { + double p = TableLayout.PREFERRED; + double f = TableLayout.FILL; + double e = TableLayout4VanChartHelper.EDIT_AREA_WIDTH; + double[] columnSize = {f, e}; + double[] rowSize = {p}; + Component[][] components = new Component[][]{ + new Component[]{new UILabel(getAddItemText()), topToolBar}, + }; + return TableLayoutHelper.createTableLayoutPane(components, rowSize, columnSize); + } + + @Override + public void saveSettings() { + if (isPopulating) { + return; + } + uiObserverListener.doChange(); + } + + public void update(NameJavaScriptGroup nameGroup) { + + Nameable[] nameables = update(); + + nameGroup.clear(); + + for (int i = 0; i < nameables.length; i++) { + JavaScript javaScript = (JavaScript) ((NameObject) nameables[i]).getObject(); + String name = nameables[i].getName(); + NameJavaScript nameJava = new NameJavaScript(name, javaScript); + nameGroup.addNameHyperlink(nameJava); + } + + } + + public void populate(NameJavaScriptGroup nameGroup, HashMap hyperLinkEditorMap) { + this.nameGroup = nameGroup; + if (this.hyperLinkEditorMap == null) { + this.hyperLinkEditorMap = hyperLinkEditorMap; + } + + HashMap paneMap = getHyperlinkMap(); + + //安装平台内打开插件时,添加相应按钮 + Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); + for (HyperlinkProvider provider : providers) { + NameableCreator nc = provider.createHyperlinkCreator(); + paneMap.put(nc.getHyperlink(), nc.getUpdatePane()); + } + + List list = refreshList(paneMap); + NameObjectCreator[] creators = new NameObjectCreator[list.size()]; + for (int i = 0; list != null && i < list.size(); i++) { + UIMenuNameableCreator uiMenuNameableCreator = list.get(i); + creators[i] = new NameObjectCreator(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj().getClass(), uiMenuNameableCreator.getPaneClazz()); + + } + + refreshNameableCreator(creators); + + List nameObjects = new ArrayList(); + + for (int i = 0; nameGroup != null && i < nameGroup.size(); i++) { + NameJavaScript javaScript = nameGroup.getNameHyperlink(i); + if (javaScript != null && javaScript.getJavaScript() != null) { + JavaScript script = javaScript.getJavaScript(); + UIMenuNameableCreator uiMenuNameableCreator = new UIMenuNameableCreator(javaScript.getName(), script, getUseMap(paneMap, script.getClass())); + nameObjects.add(new NameObject(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj())); + + } + } + + this.populate(nameObjects.toArray(new NameObject[nameObjects.size()])); + doLayout(); + } + + private HashMap getHyperlinkMap() { + HashMap map = new HashMap(); + + map.put(ReportletHyperlink.class, ReportletHyperlinkPane.class); + map.put(EmailJavaScript.class, ChartEmailPane.class); + map.put(WebHyperlink.class, WebHyperlinkPane.class); + map.put(ParameterJavaScript.class, ParameterJavaScriptPane.class); + + map.put(JavaScriptImpl.class, JavaScriptImplPane.class); + map.put(ChartHyperPoplink.class, ChartHyperPoplinkPane.class); + map.put(ChartHyperRelateCellLink.class, ChartHyperRelateCellLinkPane.class); + map.put(ChartHyperRelateFloatLink.class, ChartHyperRelateFloatLinkPane.class); + + map.put(FormHyperlinkProvider.class, FormHyperlinkPane.class); + return map; + } + + private List refreshList(HashMap map) { + List list = new ArrayList(); + + list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Reportlet"), + new ReportletHyperlink(), getUseMap(map, ReportletHyperlink.class))); + list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Mail"), new EmailJavaScript(), NewChartEmailPane.class)); + list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Web"), + new WebHyperlink(), getUseMap(map, WebHyperlink.class))); + list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Dynamic_Parameters"), + new ParameterJavaScript(), getUseMap(map, ParameterJavaScript.class))); + list.add(new UIMenuNameableCreator("JavaScript", new JavaScriptImpl(), getUseMap(map, JavaScriptImpl.class))); + + list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Float_Chart"), + new ChartHyperPoplink(), getUseMap(map, ChartHyperPoplink.class))); + list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Cell"), + new ChartHyperRelateCellLink(), getUseMap(map, ChartHyperRelateCellLink.class))); + list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Float"), + new ChartHyperRelateFloatLink(), getUseMap(map, ChartHyperRelateFloatLink.class))); + + FormHyperlinkProvider hyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); + list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Form"), + hyperlink, getUseMap(map, FormHyperlinkProvider.class))); + + return list; + } + + private Class getUseMap(HashMap map, Object key) { + if (map.get(key) != null) { + return (Class) map.get(key); + } + //引擎在这边放了个provider,当前表单对象 + for (Object tempKey : map.keySet()) { + if (((Class) tempKey).isAssignableFrom((Class) key)) { + return (Class) map.get(tempKey); + } + } + return null; + } + + /** + * 弹出列表的标题. + * + * @return 返回标题字符串. + */ + @Override + public String title4PopupWindow() { + return Toolkit.i18nText("Fine-Design_Report_Hyperlink"); + } + + @Override + protected String getAddItemText() { + return Toolkit.i18nText("Fine-Design_Basic_Add_Hyperlink"); + } + + //邮箱 + public static class NewChartEmailPane extends ChartEmailPane { + @Override + protected boolean needRenamePane() { + return false; + } + } +} From 743b4fb1aa45b01697e920c1ab1bead6768f7ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 8 Oct 2019 11:22:49 +0800 Subject: [PATCH 14/28] =?UTF-8?q?CHART-10233=20=E4=BB=A3=E7=A0=81=E8=B4=A8?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chartx/component/HyperLinkPane.java | 22 ++++++++----------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java index b3236fd6a..4b737fbd5 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java @@ -61,9 +61,7 @@ import java.awt.Component; */ public class HyperLinkPane extends UIListControlPane implements UIObserver { - NameJavaScriptGroup nameGroup; - - HashMap hyperLinkEditorMap; + private Map hyperLinkEditorMap; private UIObserverListener uiObserverListener; @@ -152,13 +150,11 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { } - public void populate(NameJavaScriptGroup nameGroup, HashMap hyperLinkEditorMap) { - this.nameGroup = nameGroup; - if (this.hyperLinkEditorMap == null) { - this.hyperLinkEditorMap = hyperLinkEditorMap; - } + public void populate(NameJavaScriptGroup nameGroup, Map hyperLinkEditorMap) { + + this.hyperLinkEditorMap = hyperLinkEditorMap; - HashMap paneMap = getHyperlinkMap(); + Map paneMap = getHyperlinkMap(); //安装平台内打开插件时,添加相应按钮 Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); @@ -193,8 +189,8 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { doLayout(); } - private HashMap getHyperlinkMap() { - HashMap map = new HashMap(); + private Map getHyperlinkMap() { + Map map = new HashMap(); map.put(ReportletHyperlink.class, ReportletHyperlinkPane.class); map.put(EmailJavaScript.class, ChartEmailPane.class); @@ -210,7 +206,7 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { return map; } - private List refreshList(HashMap map) { + private List refreshList(Map map) { List list = new ArrayList(); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Reportlet"), @@ -236,7 +232,7 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { return list; } - private Class getUseMap(HashMap map, Object key) { + private Class getUseMap(Map map, Object key) { if (map.get(key) != null) { return (Class) map.get(key); } From 675fa746d3eb43766d9921bd5f9976281495930a Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 8 Oct 2019 14:02:32 +0800 Subject: [PATCH 15/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/upm/UpmFinder.java | 34 ++++++- .../java/com/fr/design/upm/UpmShowPane.java | 93 +++++++------------ 2 files changed, 61 insertions(+), 66 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java index 5b90d4330..7f084f823 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java @@ -2,11 +2,16 @@ package com.fr.design.upm; import com.fr.base.FRContext; import com.fr.design.dialog.UIDialog; +import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.update.domain.UpdateConstants; +import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; +import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; +import com.fr.stable.project.ProjectConstants; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; @@ -51,11 +56,32 @@ public class UpmFinder { } public static void showUPMDialog() { - UpmShowPane upmPane = new UpmShowPane(); - if (dialog == null) { - dialog = new UpmShowDialog(DesignerContext.getDesignerFrame(), upmPane); + boolean flag = false; + File file = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), ProjectConstants.LIB_NAME)); + File[] files = file.listFiles(); + if (files != null) { + for (File file1 : files) { + if (file1.getName().contains(UpdateConstants.JXBROWSER)) { + flag = true; + break; + } + } + }else { + FineLoggerFactory.getLogger().error("Designer lib can not be null"); + } + if (flag) { + UpmShowPane upmPane = new UpmShowPane(); + if (dialog == null) { + dialog = new UpmShowDialog(DesignerContext.getDesignerFrame(), upmPane); + } + dialog.setVisible(true); + } else { + FineLoggerFactory.getLogger().error("jsxb false"); + JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Update_Info_Plugin_Message")); + UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); + dialog.setAutoUpdateAfterInit(); + dialog.showDialog(); } - dialog.setVisible(true); } public static void closeWindow() { diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java b/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java index 834600e53..31e44c8ab 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmShowPane.java @@ -1,26 +1,16 @@ package com.fr.design.upm; import com.fr.design.dialog.BasicPane; -import com.fr.design.i18n.Toolkit; -import com.fr.design.mainframe.DesignerContext; import com.fr.design.ui.ModernUIPane; -import com.fr.design.update.domain.UpdateConstants; -import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.design.upm.event.DownloadEvent; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; -import com.fr.log.FineLoggerFactory; -import com.fr.stable.StableUtils; -import com.fr.stable.project.ProjectConstants; import com.teamdev.jxbrowser.chromium.JSValue; import com.teamdev.jxbrowser.chromium.events.ScriptContextAdapter; import com.teamdev.jxbrowser.chromium.events.ScriptContextEvent; -import javax.swing.*; import java.awt.*; -import java.io.File; -import java.io.FileNotFoundException; /** * @author richie @@ -39,61 +29,40 @@ public class UpmShowPane extends BasicPane { UpmShowPane() { setLayout(new BorderLayout()); - boolean flag = false; - File file = new File(StableUtils.pathJoin(StableUtils.getInstallHome(),ProjectConstants.LIB_NAME)); - File[] files = file.listFiles(); - if (files != null) { - for (File file1 : files) { - if (file1.getName().contains(UpdateConstants.JXBROWSER)) { - flag = true; - break; + if (UpmFinder.checkUPMResourcesExist()) { + modernUIPane = new ModernUIPane.Builder<>() + .prepare(new ScriptContextAdapter() { + @Override + public void onScriptContextCreated(ScriptContextEvent event) { + JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); + window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); + } + }) + .withURL(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()) + .build(); + EventDispatcher.listen(DownloadEvent.UPDATE, new Listener() { + @Override + public void on(Event event, String param) { + modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); } - } - }else { - FineLoggerFactory.getLogger().error("Designer lib can not be null"); - } - if (flag) { - if (UpmFinder.checkUPMResourcesExist()) { - modernUIPane = new ModernUIPane.Builder<>() - .prepare(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); - window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); - } - }) - .withURL(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()) - .build(); - EventDispatcher.listen(DownloadEvent.UPDATE, new Listener() { - @Override - public void on(Event event, String param) { - modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); - } - }); - } else { - modernUIPane = new ModernUIPane.Builder<>() - .withComponent(WarnComponent.KEY) - .prepare(new ScriptContextAdapter() { - @Override - public void onScriptContextCreated(ScriptContextEvent event) { - JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); - window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); - } - }).build(); - EventDispatcher.listen(DownloadEvent.SUCCESS, new Listener() { - @Override - public void on(Event event, String param) { - modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); - } - }); - } + }); } else { - JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Update_Info_Plugin_Message")); - UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); - dialog.setAutoUpdateAfterInit(); - dialog.showDialog(); + modernUIPane = new ModernUIPane.Builder<>() + .withComponent(WarnComponent.KEY) + .prepare(new ScriptContextAdapter() { + @Override + public void onScriptContextCreated(ScriptContextEvent event) { + JSValue window = event.getBrowser().executeJavaScriptAndReturnValue("window"); + window.asObject().setProperty("PluginHelper", UpmBridge.getBridge(event.getBrowser())); + } + }).build(); + EventDispatcher.listen(DownloadEvent.SUCCESS, new Listener() { + @Override + public void on(Event event, String param) { + modernUIPane.redirect(UpmFinder.getMainResourcePath(), UpmUtils.renderMap()); + } + }); } add(modernUIPane, BorderLayout.CENTER); } - } From 8133b368d04ce08c565efd4c4884470dbb20a4dc Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 8 Oct 2019 14:04:57 +0800 Subject: [PATCH 16/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- designer-base/src/main/java/com/fr/design/upm/UpmFinder.java | 1 - 1 file changed, 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java index 7f084f823..0b4d6c720 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java @@ -76,7 +76,6 @@ public class UpmFinder { } dialog.setVisible(true); } else { - FineLoggerFactory.getLogger().error("jsxb false"); JOptionPane.showMessageDialog(DesignerContext.getDesignerFrame(), Toolkit.i18nText("Fine-Design_Update_Info_Plugin_Message")); UpdateMainDialog dialog = new UpdateMainDialog(DesignerContext.getDesignerFrame()); dialog.setAutoUpdateAfterInit(); From aacf3ce359f58ed8db807425d79c5a764253b3ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 8 Oct 2019 14:15:16 +0800 Subject: [PATCH 17/28] =?UTF-8?q?CHART-10233=20=E4=BB=A3=E7=A0=81=E8=B4=A8?= =?UTF-8?q?=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/chartx/component/HyperLinkPane.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java index 4b737fbd5..470e98a34 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java @@ -154,7 +154,7 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { this.hyperLinkEditorMap = hyperLinkEditorMap; - Map paneMap = getHyperlinkMap(); + Map paneMap = getHyperlinkMap(); //安装平台内打开插件时,添加相应按钮 Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); @@ -189,7 +189,7 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { doLayout(); } - private Map getHyperlinkMap() { + private Map getHyperlinkMap() { Map map = new HashMap(); map.put(ReportletHyperlink.class, ReportletHyperlinkPane.class); @@ -206,7 +206,7 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { return map; } - private List refreshList(Map map) { + private List refreshList(Map map) { List list = new ArrayList(); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Reportlet"), @@ -232,7 +232,7 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { return list; } - private Class getUseMap(Map map, Object key) { + private Class getUseMap(Map map, Object key) { if (map.get(key) != null) { return (Class) map.get(key); } From 8ce3644d2866f2dfa1779f2ee2834a3175cb5b62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 8 Oct 2019 15:37:50 +0800 Subject: [PATCH 18/28] =?UTF-8?q?CHART-10233=20=E8=B6=85=E9=93=BE=E9=9D=A2?= =?UTF-8?q?=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chartx/component/HyperLinkPane.java | 95 ++++--------------- 1 file changed, 18 insertions(+), 77 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java index 470e98a34..770f06e45 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java @@ -4,7 +4,6 @@ import com.fr.base.BaseFormula; import com.fr.chart.web.ChartHyperPoplink; import com.fr.chart.web.ChartHyperRelateCellLink; import com.fr.chart.web.ChartHyperRelateFloatLink; -import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.javascript.ChartEmailPane; import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperPoplinkPane; @@ -13,7 +12,6 @@ import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperRelateFloatLink import com.fr.design.chart.series.SeriesCondition.impl.FormHyperlinkPane; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; -import com.fr.design.fun.HyperlinkProvider; import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.controlpane.UIListControlPane; @@ -27,7 +25,6 @@ import com.fr.design.javascript.JavaScriptImplPane; import com.fr.design.javascript.ParameterJavaScriptPane; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; -import com.fr.design.module.DesignModuleFactory; import com.fr.general.NameObject; import com.fr.js.EmailJavaScript; import com.fr.js.FormHyperlinkProvider; @@ -39,7 +36,6 @@ import com.fr.js.ParameterJavaScript; import com.fr.js.ReportletHyperlink; import com.fr.js.WebHyperlink; import com.fr.log.FineLoggerFactory; -import com.fr.stable.ListMap; import com.fr.stable.Nameable; import com.fr.stable.bridge.StableFactory; import com.fr.van.chart.designer.TableLayout4VanChartHelper; @@ -51,7 +47,6 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.Set; import java.awt.Component; /** @@ -72,18 +67,15 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { @Override public NameableCreator[] createNameableCreators() { - //面板初始化,需要在populate的时候更新 - Map nameCreators = new ListMap(); - NameableCreator[] creators = DesignModuleFactory.getHyperlinkGroupType().getHyperlinkCreators(); - for (NameableCreator creator : creators) { - nameCreators.put(creator.menuName(), creator); - } - Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); - for (HyperlinkProvider provider : providers) { - NameableCreator nc = provider.createHyperlinkCreator(); - nameCreators.put(nc.menuName(), nc); + + List list = createMenuList(); + NameObjectCreator[] creators = new NameObjectCreator[list.size()]; + for (int i = 0; list != null && i < list.size(); i++) { + UIMenuNameableCreator uiMenuNameableCreator = list.get(i); + creators[i] = new NameObjectCreator(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj().getClass(), uiMenuNameableCreator.getPaneClazz()); + } - return nameCreators.values().toArray(new NameableCreator[nameCreators.size()]); + return creators; } public BasicBeanPane createPaneByCreators(NameableCreator creator) { @@ -154,34 +146,13 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { this.hyperLinkEditorMap = hyperLinkEditorMap; - Map paneMap = getHyperlinkMap(); - - //安装平台内打开插件时,添加相应按钮 - Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); - for (HyperlinkProvider provider : providers) { - NameableCreator nc = provider.createHyperlinkCreator(); - paneMap.put(nc.getHyperlink(), nc.getUpdatePane()); - } - - List list = refreshList(paneMap); - NameObjectCreator[] creators = new NameObjectCreator[list.size()]; - for (int i = 0; list != null && i < list.size(); i++) { - UIMenuNameableCreator uiMenuNameableCreator = list.get(i); - creators[i] = new NameObjectCreator(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj().getClass(), uiMenuNameableCreator.getPaneClazz()); - - } - - refreshNameableCreator(creators); - List nameObjects = new ArrayList(); for (int i = 0; nameGroup != null && i < nameGroup.size(); i++) { NameJavaScript javaScript = nameGroup.getNameHyperlink(i); if (javaScript != null && javaScript.getJavaScript() != null) { JavaScript script = javaScript.getJavaScript(); - UIMenuNameableCreator uiMenuNameableCreator = new UIMenuNameableCreator(javaScript.getName(), script, getUseMap(paneMap, script.getClass())); - nameObjects.add(new NameObject(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj())); - + nameObjects.add(new NameObject(javaScript.getName(), script)); } } @@ -189,62 +160,32 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { doLayout(); } - private Map getHyperlinkMap() { - Map map = new HashMap(); - - map.put(ReportletHyperlink.class, ReportletHyperlinkPane.class); - map.put(EmailJavaScript.class, ChartEmailPane.class); - map.put(WebHyperlink.class, WebHyperlinkPane.class); - map.put(ParameterJavaScript.class, ParameterJavaScriptPane.class); - - map.put(JavaScriptImpl.class, JavaScriptImplPane.class); - map.put(ChartHyperPoplink.class, ChartHyperPoplinkPane.class); - map.put(ChartHyperRelateCellLink.class, ChartHyperRelateCellLinkPane.class); - map.put(ChartHyperRelateFloatLink.class, ChartHyperRelateFloatLinkPane.class); - - map.put(FormHyperlinkProvider.class, FormHyperlinkPane.class); - return map; - } - - private List refreshList(Map map) { + private List createMenuList() { List list = new ArrayList(); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Reportlet"), - new ReportletHyperlink(), getUseMap(map, ReportletHyperlink.class))); + new ReportletHyperlink(), ReportletHyperlinkPane.class)); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Mail"), new EmailJavaScript(), NewChartEmailPane.class)); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Web"), - new WebHyperlink(), getUseMap(map, WebHyperlink.class))); + new WebHyperlink(), WebHyperlinkPane.class)); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Dynamic_Parameters"), - new ParameterJavaScript(), getUseMap(map, ParameterJavaScript.class))); - list.add(new UIMenuNameableCreator("JavaScript", new JavaScriptImpl(), getUseMap(map, JavaScriptImpl.class))); + new ParameterJavaScript(), ParameterJavaScriptPane.class)); + list.add(new UIMenuNameableCreator("JavaScript", new JavaScriptImpl(), JavaScriptImplPane.class)); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Float_Chart"), - new ChartHyperPoplink(), getUseMap(map, ChartHyperPoplink.class))); + new ChartHyperPoplink(), ChartHyperPoplinkPane.class)); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Cell"), - new ChartHyperRelateCellLink(), getUseMap(map, ChartHyperRelateCellLink.class))); + new ChartHyperRelateCellLink(), ChartHyperRelateCellLinkPane.class)); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Float"), - new ChartHyperRelateFloatLink(), getUseMap(map, ChartHyperRelateFloatLink.class))); + new ChartHyperRelateFloatLink(), ChartHyperRelateFloatLinkPane.class)); FormHyperlinkProvider hyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Form"), - hyperlink, getUseMap(map, FormHyperlinkProvider.class))); + hyperlink, FormHyperlinkPane.class)); return list; } - private Class getUseMap(Map map, Object key) { - if (map.get(key) != null) { - return (Class) map.get(key); - } - //引擎在这边放了个provider,当前表单对象 - for (Object tempKey : map.keySet()) { - if (((Class) tempKey).isAssignableFrom((Class) key)) { - return (Class) map.get(tempKey); - } - } - return null; - } - /** * 弹出列表的标题. * From 5add30400339ee3ff4b48e5bbde30c08ff14ae14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 8 Oct 2019 16:10:46 +0800 Subject: [PATCH 19/28] CHART-10233 --- .../chartx/component/HyperLinkPane.java | 55 +++++++------------ 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java index 770f06e45..7b5a6f800 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java @@ -16,7 +16,6 @@ import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.controlpane.UIListControlPane; import com.fr.design.gui.ilable.UILabel; -import com.fr.design.gui.imenutable.UIMenuNameableCreator; import com.fr.design.gui.itoolbar.UIToolbar; import com.fr.design.hyperlink.ReportletHyperlinkPane; import com.fr.design.hyperlink.WebHyperlinkPane; @@ -67,15 +66,29 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { @Override public NameableCreator[] createNameableCreators() { + List creators = new ArrayList(); + + creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Reportlet"), + ReportletHyperlink.class, ReportletHyperlinkPane.class)); + creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Mail"), EmailJavaScript.class, NewChartEmailPane.class)); + creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Web"), + WebHyperlink.class, WebHyperlinkPane.class)); + creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Dynamic_Parameters"), + ParameterJavaScript.class, ParameterJavaScriptPane.class)); + creators.add(new NameObjectCreator("JavaScript", JavaScriptImpl.class, JavaScriptImplPane.class)); + + creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Float_Chart"), + ChartHyperPoplink.class, ChartHyperPoplinkPane.class)); + creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Cell"), + ChartHyperRelateCellLink.class, ChartHyperRelateCellLinkPane.class)); + creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Float"), + ChartHyperRelateFloatLink.class, ChartHyperRelateFloatLinkPane.class)); - List list = createMenuList(); - NameObjectCreator[] creators = new NameObjectCreator[list.size()]; - for (int i = 0; list != null && i < list.size(); i++) { - UIMenuNameableCreator uiMenuNameableCreator = list.get(i); - creators[i] = new NameObjectCreator(uiMenuNameableCreator.getName(), uiMenuNameableCreator.getObj().getClass(), uiMenuNameableCreator.getPaneClazz()); + FormHyperlinkProvider hyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); + creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Form"), + hyperlink.getClass(), FormHyperlinkPane.class)); - } - return creators; + return creators.toArray(new NameObjectCreator[creators.size()]); } public BasicBeanPane createPaneByCreators(NameableCreator creator) { @@ -160,32 +173,6 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { doLayout(); } - private List createMenuList() { - List list = new ArrayList(); - - list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Reportlet"), - new ReportletHyperlink(), ReportletHyperlinkPane.class)); - list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Mail"), new EmailJavaScript(), NewChartEmailPane.class)); - list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Web"), - new WebHyperlink(), WebHyperlinkPane.class)); - list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Dynamic_Parameters"), - new ParameterJavaScript(), ParameterJavaScriptPane.class)); - list.add(new UIMenuNameableCreator("JavaScript", new JavaScriptImpl(), JavaScriptImplPane.class)); - - list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Float_Chart"), - new ChartHyperPoplink(), ChartHyperPoplinkPane.class)); - list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Cell"), - new ChartHyperRelateCellLink(), ChartHyperRelateCellLinkPane.class)); - list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Float"), - new ChartHyperRelateFloatLink(), ChartHyperRelateFloatLinkPane.class)); - - FormHyperlinkProvider hyperlink = StableFactory.getMarkedInstanceObjectFromClass(FormHyperlinkProvider.XML_TAG, FormHyperlinkProvider.class); - list.add(new UIMenuNameableCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Form"), - hyperlink, FormHyperlinkPane.class)); - - return list; - } - /** * 弹出列表的标题. * From 7def8afd8fed562a752fe72b8927116546eb46e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E5=B2=B3?= <445798420@qq.com> Date: Tue, 8 Oct 2019 16:49:17 +0800 Subject: [PATCH 20/28] =?UTF-8?q?CHART-10233=20=E6=8F=92=E4=BB=B6=E8=B6=85?= =?UTF-8?q?=E9=93=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/chartx/component/HyperLinkPane.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java index 7b5a6f800..c1ff69974 100644 --- a/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java +++ b/designer-chart/src/main/java/com/fr/design/chartx/component/HyperLinkPane.java @@ -4,6 +4,7 @@ import com.fr.base.BaseFormula; import com.fr.chart.web.ChartHyperPoplink; import com.fr.chart.web.ChartHyperRelateCellLink; import com.fr.chart.web.ChartHyperRelateFloatLink; +import com.fr.design.ExtraDesignClassManager; import com.fr.design.beans.BasicBeanPane; import com.fr.design.chart.javascript.ChartEmailPane; import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperPoplinkPane; @@ -12,6 +13,7 @@ import com.fr.design.chart.series.SeriesCondition.impl.ChartHyperRelateFloatLink import com.fr.design.chart.series.SeriesCondition.impl.FormHyperlinkPane; import com.fr.design.event.UIObserver; import com.fr.design.event.UIObserverListener; +import com.fr.design.fun.HyperlinkProvider; import com.fr.design.gui.controlpane.NameObjectCreator; import com.fr.design.gui.controlpane.NameableCreator; import com.fr.design.gui.controlpane.UIListControlPane; @@ -46,6 +48,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.awt.Component; /** @@ -66,7 +69,7 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { @Override public NameableCreator[] createNameableCreators() { - List creators = new ArrayList(); + List creators = new ArrayList(); creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Reportlet"), ReportletHyperlink.class, ReportletHyperlinkPane.class)); @@ -88,7 +91,13 @@ public class HyperLinkPane extends UIListControlPane implements UIObserver { creators.add(new NameObjectCreator(Toolkit.i18nText("Fine-Design_Chart_Link_Form"), hyperlink.getClass(), FormHyperlinkPane.class)); - return creators.toArray(new NameObjectCreator[creators.size()]); + Set providers = ExtraDesignClassManager.getInstance().getArray(HyperlinkProvider.XML_TAG); + for (HyperlinkProvider provider : providers) { + NameableCreator nc = provider.createHyperlinkCreator(); + creators.add(nc); + } + + return creators.toArray(new NameableCreator[creators.size()]); } public BasicBeanPane createPaneByCreators(NameableCreator creator) { From cd5ea2205e486b7bd088901d13577b0533c8cc33 Mon Sep 17 00:00:00 2001 From: Bryant Date: Tue, 8 Oct 2019 17:28:38 +0800 Subject: [PATCH 21/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/update/ui/dialog/UpdateMainDialog.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 2f39f5eb0..17400a213 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -35,6 +35,7 @@ import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; +import com.fr.third.org.apache.http.ProtocolException; import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; import com.fr.third.org.apache.http.client.methods.HttpGet; import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; @@ -431,6 +432,7 @@ public class UpdateMainDialog extends UIDialog { private void afterInit() { if (autoUpdateAfterInit) { + updateButton.setEnabled(true); updateButton.doClick(); } } @@ -606,7 +608,7 @@ public class UpdateMainDialog extends UIDialog { @Override public void onDownloadFailed() { progressBar.setVisible(false); - JOptionPane.showMessageDialog(getParent(),"Update Failed"); + JOptionPane.showMessageDialog(getParent(),Toolkit.i18nText("Fine-Design_Update_Info_Failed_Message")); RestartHelper.restart(); } }.execute(); From 31f62863472d3ef4f76dc411a6a4aeb55028a1b9 Mon Sep 17 00:00:00 2001 From: Bryant Date: Wed, 9 Oct 2019 11:20:25 +0800 Subject: [PATCH 22/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../design/update/domain/UpdateConstants.java | 56 ------------ .../update/ui/dialog/RestoreDialog.java | 2 +- .../update/ui/dialog/RestoreResultDialog.java | 2 +- .../update/ui/dialog/UpdateMainDialog.java | 86 ++++++++++++------- .../java/com/fr/design/upm/UpmFinder.java | 2 +- 5 files changed, 59 insertions(+), 89 deletions(-) delete mode 100644 designer-base/src/main/java/com/fr/design/update/domain/UpdateConstants.java diff --git a/designer-base/src/main/java/com/fr/design/update/domain/UpdateConstants.java b/designer-base/src/main/java/com/fr/design/update/domain/UpdateConstants.java deleted file mode 100644 index 54522c5f7..000000000 --- a/designer-base/src/main/java/com/fr/design/update/domain/UpdateConstants.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.fr.design.update.domain; - -/** - * Created by XINZAI on 2018/8/21. - */ - - -import java.awt.Color; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -/** - * 更新升级的常量 - */ -public interface UpdateConstants { - - String APPS_FOLDER_NAME = "webapps"; - - int CONNECTION_TIMEOUT = 1000 * 5; - Color BAR_COLOR = new Color(0x3384F0); - - String CHANGELOG_X_START = "2018-07-11"; - - String DEFAULT_APP_NAME = "FineReport"; - String DESIGNER_BACKUP_DIR = "designerbackup"; - - String UPDATE_CACHE_CONFIG_X = "updateCacheConfig10"; - String UPDATE_CACHE_INFO_X = "updateCacheInfo10"; - - String JXBROWSER = "jxbrowser"; - - List JARS_FOR_SERVER_X = Collections.unmodifiableList(Arrays.asList(new String[]{ - "fine-activator-10.0.jar", - "fine-core-10.0.jar", - "fine-report-engine-10.0.jar", - "fine-decision-10.0.jar", - "fine-decision-report-10.0.jar", - "fine-schedule-10.0.jar", - "fine-schedule-report-10.0.jar", - "fine-swift-log-adaptor-10.0.jar", - "fine-webui-10.0.jar", - "fine-datasource-10.0.jar", - "fine-third-10.0.jar", - "fine-accumulator-10.0.jar" - })); - - List JARS_FOR_DESIGNER_X = Collections.unmodifiableList(Arrays.asList(new String[]{ - "fine-report-designer-10.0.jar", - "aspectjrt.jar" - })); - List LOG_TYPE = Collections.unmodifiableList(Arrays.asList(new String[]{ - "REPORT", "MOBILE", "CHART", "PFC", "BI" - })); - -} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreDialog.java index 402df06b8..8ffe8d4a4 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreDialog.java @@ -1,9 +1,9 @@ package com.fr.design.update.ui.dialog; +import com.fr.decision.update.data.UpdateConstants; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.update.domain.UpdateConstants; import com.fr.design.update.factory.DirectoryOperationFactory; import com.fr.design.update.ui.widget.ColorfulCellRender; import com.fr.design.utils.gui.GUICoreUtils; diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java index 5f325a1d9..76e256af5 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java @@ -1,10 +1,10 @@ package com.fr.design.update.ui.dialog; +import com.fr.decision.update.data.UpdateConstants; import com.fr.design.RestartHelper; import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.update.domain.UpdateConstants; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; import com.fr.stable.ProductConstants; diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 17400a213..6b9dc22e3 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -1,5 +1,7 @@ package com.fr.design.update.ui.dialog; +import com.fr.decision.update.data.UpdateConstants; +import com.fr.decision.update.exception.UpdateException; import com.fr.decision.update.info.UpdateCallBack; import com.fr.decision.update.info.UpdateProgressCallBack; import com.fr.design.RestartHelper; @@ -14,7 +16,6 @@ import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; import com.fr.design.update.actions.FileProcess; -import com.fr.design.update.domain.UpdateConstants; import com.fr.design.update.domain.UpdateInfoCachePropertyManager; import com.fr.design.update.factory.DirectoryOperationFactory; import com.fr.design.update.ui.widget.LoadingLabel; @@ -29,13 +30,8 @@ import com.fr.general.http.HttpToolbox; import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; -import com.fr.stable.ArrayUtils; -import com.fr.stable.EncodeConstants; -import com.fr.stable.ProductConstants; -import com.fr.stable.StableUtils; -import com.fr.stable.StringUtils; +import com.fr.stable.*; import com.fr.stable.project.ProjectConstants; -import com.fr.third.org.apache.http.ProtocolException; import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; import com.fr.third.org.apache.http.client.methods.HttpGet; import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; @@ -590,43 +586,73 @@ public class UpdateMainDialog extends UIDialog { updateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - backup(); - int a = JOptionPane.showConfirmDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Information"),Toolkit.i18nText("Fine-Design_Update_Info_Title"), JOptionPane.OK_CANCEL_OPTION); - if (a == 0) { - progressBar.setVisible(true); - progressBar.setString(Toolkit.i18nText("Fine-Design_Update_Info_Wait_Message")); - UpdateCallBack callBack = new UpdateProgressCallBack(progressBar); - updateButton.setEnabled(false); - updateLabel.setVisible(false); - new FileProcess(callBack) { - @Override - public void onDownloadSuccess() { - updateButton.setEnabled(true); - progressBar.setVisible(false); - RestartHelper.restart(); - } - @Override - public void onDownloadFailed() { - progressBar.setVisible(false); - JOptionPane.showMessageDialog(getParent(),Toolkit.i18nText("Fine-Design_Update_Info_Failed_Message")); - RestartHelper.restart(); - } - }.execute(); + if (backup()) { + int a = JOptionPane.showConfirmDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Information"),Toolkit.i18nText("Fine-Design_Update_Info_Title"), JOptionPane.OK_CANCEL_OPTION); + if (a == 0) { + progressBar.setVisible(true); + progressBar.setString(Toolkit.i18nText("Fine-Design_Update_Info_Wait_Message")); + UpdateCallBack callBack = new UpdateProgressCallBack(progressBar); + updateButton.setEnabled(false); + updateLabel.setVisible(false); + new FileProcess(callBack) { + @Override + public void onDownloadSuccess() { + progressBar.setVisible(false); + deleteForDesignerUpdate(); + RestartHelper.restart(); + } + @Override + public void onDownloadFailed() { + progressBar.setVisible(false); + try { + IOUtils.copyFilesInDirByPath(StableUtils.pathJoin(StableUtils.getInstallHome(),UpdateConstants.DESIGNERBACKUPPATH), + StableUtils.pathJoin(StableUtils.getInstallHome(),ProjectConstants.LIB_NAME)); + } catch (IOException e) { + UpdateException exception = new UpdateException(e.getMessage()); + FineLoggerFactory.getLogger().error(exception.getMessage() + "recover for design failed"); + } finally { + deleteForDesignerUpdate(); + } + JOptionPane.showMessageDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Failed_Message")); + RestartHelper.restart(); + } + }.execute(); + } + } else { + JOptionPane.showMessageDialog(getParent(),Toolkit.i18nText("Fine-Design_Update_Info_Backup_Message")); } } }); } + private void deleteForDesignerUpdate() { + File designerBackup = new File(StableUtils.pathJoin(StableUtils.getInstallHome(),UpdateConstants.DESIGNERBACKUPPATH)); + CommonUtils.deleteFile(designerBackup); + File downloadForDesigner = new File(StableUtils.pathJoin(StableUtils.getInstallHome(),UpdateConstants.DOWNLOADPATH)); + CommonUtils.deleteFile(downloadForDesigner); + } + /** * Jar还原按钮兼容 */ - private void backup() { + private boolean backup() { String installHome = StableUtils.getInstallHome(); //jar包备份文件的目录为"backup/"+jar包当前版本号 String todayBackupDir = StableUtils.pathJoin(installHome, getBackupDirectory(), (GeneralUtils.readBuildNO())); backupFilesFromInstallEnv(installHome, todayBackupDir); backupFilesFromInstallLib(installHome, todayBackupDir); jarCurrentLabel.setText(downloadFileConfig.optString("buildNO")); + try { + File file = new File(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOADPATH)); + CommonUtils.mkdirs(file); + IOUtils.copyFilesInDirByPath(StableUtils.pathJoin(installHome,ProjectConstants.LIB_NAME), + StableUtils.pathJoin(installHome, UpdateConstants.DESIGNERBACKUPPATH)); + return true; + }catch (IOException e) { + UpdateException exception = new UpdateException("Backup Exception for designer" + e.getMessage()); + FineLoggerFactory.getLogger().error(exception.getMessage(),exception); + return false; + } } private void backupFilesFromInstallEnv(String installHome, String todayBackupDir) { diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java index 0b4d6c720..0c1f7cd52 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java @@ -1,10 +1,10 @@ package com.fr.design.upm; import com.fr.base.FRContext; +import com.fr.decision.update.data.UpdateConstants; import com.fr.design.dialog.UIDialog; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; -import com.fr.design.update.domain.UpdateConstants; import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.event.Event; import com.fr.event.EventDispatcher; From 3167f4339aa8ed5223af6234de8c742d93b3fdb1 Mon Sep 17 00:00:00 2001 From: author Date: Wed, 9 Oct 2019 11:38:35 +0800 Subject: [PATCH 23/28] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1,sonar?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../fr/design/designer/creator/cardlayout/XCardAddButton.java | 3 +++ .../main/java/com/fr/design/form/layout/FRTitleLayout.java | 4 ++-- .../java/com/fr/design/mainframe/EditingMouseListener.java | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java index a25ca0504..7f43c57df 100644 --- a/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java +++ b/designer-form/src/main/java/com/fr/design/designer/creator/cardlayout/XCardAddButton.java @@ -92,6 +92,9 @@ public class XCardAddButton extends XButton { if(cardLayout == null && tagLayout ==null ){ initRelateLayout(); } + if (cardLayout == null) { + throw new IllegalArgumentException("cardLayout can not be null"); + } int index = cardLayout.toData().getWidgetCount(); //添加新的tab,并将原来的设为未选中状态 diff --git a/designer-form/src/main/java/com/fr/design/form/layout/FRTitleLayout.java b/designer-form/src/main/java/com/fr/design/form/layout/FRTitleLayout.java index 413cbf242..65f037b04 100644 --- a/designer-form/src/main/java/com/fr/design/form/layout/FRTitleLayout.java +++ b/designer-form/src/main/java/com/fr/design/form/layout/FRTitleLayout.java @@ -126,9 +126,9 @@ public class FRTitleLayout implements FRLayoutManager, LayoutManager{ int titleH = title==null ? 0 : WTitleLayout.TITLE_HEIGHT; for (int i=0; i< target.getComponentCount(); i++) { Component comp = target.getComponent(i); - if (comp == title) { + if (comp != null && comp == title) { comp.setBounds(0, 0, width, WTitleLayout.TITLE_HEIGHT); - } else if (comp == body) { + } else if (comp != null && comp == body) { int y = titleH+gap; comp.setBounds(0, y, width, height-y); } diff --git a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java index 3c03ba38d..07cb7f93a 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/EditingMouseListener.java @@ -573,8 +573,8 @@ public class EditingMouseListener extends MouseInputAdapter { GUICoreUtils.showPopupMenu(cellPopupMenu, designer, e.getX(), e.getY()); } } + creator.doLayout(); } - creator.doLayout(); LayoutUtils.layoutRootContainer(designer.getRootComponent()); } From 733a6f28257c86e696699057c6c1bedd12fcd0d0 Mon Sep 17 00:00:00 2001 From: author Date: Wed, 9 Oct 2019 12:29:06 +0800 Subject: [PATCH 24/28] =?UTF-8?q?=E6=97=A0jira=E4=BB=BB=E5=8A=A1,sonar?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/fr/design/form/layout/FRTitleLayout.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/designer-form/src/main/java/com/fr/design/form/layout/FRTitleLayout.java b/designer-form/src/main/java/com/fr/design/form/layout/FRTitleLayout.java index 65f037b04..0ba996258 100644 --- a/designer-form/src/main/java/com/fr/design/form/layout/FRTitleLayout.java +++ b/designer-form/src/main/java/com/fr/design/form/layout/FRTitleLayout.java @@ -126,11 +126,13 @@ public class FRTitleLayout implements FRLayoutManager, LayoutManager{ int titleH = title==null ? 0 : WTitleLayout.TITLE_HEIGHT; for (int i=0; i< target.getComponentCount(); i++) { Component comp = target.getComponent(i); - if (comp != null && comp == title) { - comp.setBounds(0, 0, width, WTitleLayout.TITLE_HEIGHT); - } else if (comp != null && comp == body) { - int y = titleH+gap; - comp.setBounds(0, y, width, height-y); + if (comp != null) { + if (comp == title) { + comp.setBounds(0, 0, width, WTitleLayout.TITLE_HEIGHT); + } else if (comp == body) { + int y = titleH + gap; + comp.setBounds(0, y, width, height-y); + } } } } From 7f84ec2d299fc6e9799e77420218485e32a6c19c Mon Sep 17 00:00:00 2001 From: Bryant Date: Wed, 9 Oct 2019 14:26:37 +0800 Subject: [PATCH 25/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../update/ui/dialog/RestoreResultDialog.java | 38 ++++--- .../update/ui/dialog/UpdateMainDialog.java | 106 ++++-------------- 2 files changed, 45 insertions(+), 99 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java index 76e256af5..83ffbe5fe 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/RestoreResultDialog.java @@ -7,10 +7,10 @@ import com.fr.design.gui.ilable.UILabel; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.general.ComparatorUtils; -import com.fr.stable.ProductConstants; import com.fr.stable.StableUtils; import com.fr.stable.StringUtils; import com.fr.stable.project.ProjectConstants; +import com.fr.workspace.WorkContext; import javax.swing.AbstractAction; import javax.swing.BorderFactory; @@ -45,7 +45,7 @@ public class RestoreResultDialog extends JDialog { initCommonComponents(); } - public RestoreResultDialog(Frame parent, boolean modal, String jarDir) { + RestoreResultDialog(Frame parent, boolean modal, String jarDir) { super(parent, modal); this.jarRestoreDir = jarDir; if (ComparatorUtils.equals(jarDir, com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Restore_Old_Version"))) { @@ -100,7 +100,7 @@ public class RestoreResultDialog extends JDialog { this.setTitle(com.fr.design.i18n.Toolkit.i18nText("Fine-Design_Updater_Jar_Restore")); } - public static boolean deletePreviousPropertyFile() { + static boolean deletePreviousPropertyFile() { File moveFile = new File(RestartHelper.MOVE_FILE); File delFile = new File(RestartHelper.RECORD_FILE); if (StableUtils.mkdirs(moveFile) && StableUtils.mkdirs(delFile)) { @@ -159,7 +159,7 @@ public class RestoreResultDialog extends JDialog { private void putJarBackupFiles() { Map map = new HashMap<>(); - java.util.List list = new ArrayList<>(); + List list = new ArrayList<>(); String installHome = StableUtils.getInstallHome(); putJarBackupFilesToInstallLib(installHome, map, list); @@ -168,23 +168,29 @@ public class RestoreResultDialog extends JDialog { RestartHelper.saveFilesWhichToDelete(list.toArray(new String[list.size()])); } - private void putJarBackupFilesToInstallLib(String installHome, Map map, java.util.List list) { - List files = UpdateConstants.JARS_FOR_DESIGNER_X; + private void putJarBackupFilesToInstallLib(String installHome, Map map, List list) { String backupDir = UpdateConstants.DESIGNER_BACKUP_DIR; - for (String file : files) { - map.put(StableUtils.pathJoin(installHome, backupDir, jarRestoreDir, file), - StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)); - list.add(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)); + File installLib = new File(StableUtils.pathJoin(installHome, backupDir, jarRestoreDir, UpdateConstants.DESIGNERBACKUPPATH)); + File[] files = installLib.listFiles(); + if (files != null) { + for (File file : files) { + map.put(file.getAbsolutePath(), + StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file.getName())); + list.add(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file.getName())); + } } } - private void putJarBackupFilesToInstallEnv(String installHome, Map map, java.util.List list) { - List files = UpdateConstants.JARS_FOR_SERVER_X; + private void putJarBackupFilesToInstallEnv(String installHome, Map map, List list) { String backupDir = UpdateConstants.DESIGNER_BACKUP_DIR; - for (String file : files) { - map.put(StableUtils.pathJoin(installHome, backupDir, jarRestoreDir, file), - StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)); - list.add(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)); + File installEnv = new File(StableUtils.pathJoin(installHome, backupDir, jarRestoreDir, UpdateConstants.BACKUPPATH)); + File[] files = installEnv.listFiles(); + if (files != null) { + for (File file : files) { + map.put(file.getAbsolutePath(), + StableUtils.pathJoin(WorkContext.getCurrent().getPath(), ProjectConstants.LIB_NAME, file.getName())); + list.add(StableUtils.pathJoin(WorkContext.getCurrent().getPath(), ProjectConstants.LIB_NAME, file.getName())); + } } } } \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 6b9dc22e3..50329a46f 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -1,7 +1,6 @@ package com.fr.design.update.ui.dialog; import com.fr.decision.update.data.UpdateConstants; -import com.fr.decision.update.exception.UpdateException; import com.fr.decision.update.info.UpdateCallBack; import com.fr.decision.update.info.UpdateProgressCallBack; import com.fr.design.RestartHelper; @@ -31,7 +30,6 @@ import com.fr.json.JSONArray; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.stable.*; -import com.fr.stable.project.ProjectConstants; import com.fr.third.org.apache.http.client.methods.CloseableHttpResponse; import com.fr.third.org.apache.http.client.methods.HttpGet; import com.fr.third.org.apache.http.impl.client.CloseableHttpClient; @@ -586,40 +584,29 @@ public class UpdateMainDialog extends UIDialog { updateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - if (backup()) { - int a = JOptionPane.showConfirmDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Information"),Toolkit.i18nText("Fine-Design_Update_Info_Title"), JOptionPane.OK_CANCEL_OPTION); - if (a == 0) { - progressBar.setVisible(true); - progressBar.setString(Toolkit.i18nText("Fine-Design_Update_Info_Wait_Message")); - UpdateCallBack callBack = new UpdateProgressCallBack(progressBar); - updateButton.setEnabled(false); - updateLabel.setVisible(false); - new FileProcess(callBack) { - @Override - public void onDownloadSuccess() { - progressBar.setVisible(false); - deleteForDesignerUpdate(); - RestartHelper.restart(); - } - @Override - public void onDownloadFailed() { - progressBar.setVisible(false); - try { - IOUtils.copyFilesInDirByPath(StableUtils.pathJoin(StableUtils.getInstallHome(),UpdateConstants.DESIGNERBACKUPPATH), - StableUtils.pathJoin(StableUtils.getInstallHome(),ProjectConstants.LIB_NAME)); - } catch (IOException e) { - UpdateException exception = new UpdateException(e.getMessage()); - FineLoggerFactory.getLogger().error(exception.getMessage() + "recover for design failed"); - } finally { - deleteForDesignerUpdate(); - } - JOptionPane.showMessageDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Failed_Message")); - RestartHelper.restart(); - } - }.execute(); - } - } else { - JOptionPane.showMessageDialog(getParent(),Toolkit.i18nText("Fine-Design_Update_Info_Backup_Message")); + jarCurrentLabel.setText(downloadFileConfig.optString("buildNO")); + int a = JOptionPane.showConfirmDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Information"),Toolkit.i18nText("Fine-Design_Update_Info_Title"), JOptionPane.OK_CANCEL_OPTION); + if (a == 0) { + progressBar.setVisible(true); + progressBar.setString(Toolkit.i18nText("Fine-Design_Update_Info_Wait_Message")); + UpdateCallBack callBack = new UpdateProgressCallBack(progressBar); + updateButton.setEnabled(false); + updateLabel.setVisible(false); + new FileProcess(callBack) { + @Override + public void onDownloadSuccess() { + progressBar.setVisible(false); + deleteForDesignerUpdate(); + RestartHelper.restart(); + } + @Override + public void onDownloadFailed() { + progressBar.setVisible(false); + deleteForDesignerUpdate(); + JOptionPane.showMessageDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Failed_Message")); + RestartHelper.restart(); + } + }.execute(); } } }); @@ -632,53 +619,6 @@ public class UpdateMainDialog extends UIDialog { CommonUtils.deleteFile(downloadForDesigner); } - /** - * Jar还原按钮兼容 - */ - private boolean backup() { - String installHome = StableUtils.getInstallHome(); - //jar包备份文件的目录为"backup/"+jar包当前版本号 - String todayBackupDir = StableUtils.pathJoin(installHome, getBackupDirectory(), (GeneralUtils.readBuildNO())); - backupFilesFromInstallEnv(installHome, todayBackupDir); - backupFilesFromInstallLib(installHome, todayBackupDir); - jarCurrentLabel.setText(downloadFileConfig.optString("buildNO")); - try { - File file = new File(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOADPATH)); - CommonUtils.mkdirs(file); - IOUtils.copyFilesInDirByPath(StableUtils.pathJoin(installHome,ProjectConstants.LIB_NAME), - StableUtils.pathJoin(installHome, UpdateConstants.DESIGNERBACKUPPATH)); - return true; - }catch (IOException e) { - UpdateException exception = new UpdateException("Backup Exception for designer" + e.getMessage()); - FineLoggerFactory.getLogger().error(exception.getMessage(),exception); - return false; - } - } - - private void backupFilesFromInstallEnv(String installHome, String todayBackupDir) { - for (String file : UpdateConstants.JARS_FOR_SERVER_X) { - try { - IOUtils.copy( - new File(StableUtils.pathJoin(installHome, UpdateConstants.APPS_FOLDER_NAME, ProductConstants.getAppFolderName(), ProjectConstants.WEBINF_NAME, ProjectConstants.LIB_NAME, file)), - new File(StableUtils.pathJoin(todayBackupDir))); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } - } - } - - private void backupFilesFromInstallLib(String installHome, String todayBackupDir) { - for (String file : UpdateConstants.JARS_FOR_DESIGNER_X) { - try { - IOUtils.copy( - new File(StableUtils.pathJoin(installHome, ProjectConstants.LIB_NAME, file)), - new File(StableUtils.pathJoin(todayBackupDir))); - } catch (IOException e) { - FineLoggerFactory.getLogger().error(e.getMessage()); - } - } - } - //获取备份目录 private String getBackupDirectory() { return UpdateConstants.DESIGNER_BACKUP_DIR; From f2929518ad371019913e4ee584f2eaa12f1bc073 Mon Sep 17 00:00:00 2001 From: "Bruce.Deng" Date: Wed, 9 Oct 2019 17:38:38 +0800 Subject: [PATCH 26/28] =?UTF-8?q?MOBILE-23325=20=E3=80=90=E5=8D=95?= =?UTF-8?q?=E9=80=89=E6=8C=89=E9=92=AE=E6=A0=B7=E5=BC=8F=E3=80=91=E5=9B=BE?= =?UTF-8?q?=E6=96=87=E6=8C=89=E9=92=AE=EF=BC=9A=E4=B8=8A=E4=BC=A0=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=90=8E=EF=BC=8C=E7=A7=BB=E5=8A=A8=E7=AB=AF=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=98=BE=E7=A4=BA=E5=BE=88=E6=A8=A1=E7=B3=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/fr/design/utils/ImageUtils.java | 19 +++++++++++-------- .../com/fr/design/web/CustomIconPane.java | 13 +++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/designer-base/src/main/java/com/fr/design/utils/ImageUtils.java b/designer-base/src/main/java/com/fr/design/utils/ImageUtils.java index 389b9981e..7bd2d406e 100644 --- a/designer-base/src/main/java/com/fr/design/utils/ImageUtils.java +++ b/designer-base/src/main/java/com/fr/design/utils/ImageUtils.java @@ -240,6 +240,7 @@ public class ImageUtils { * @param opacityCompatible 是否处理背景透明 */ public static BufferedImage scale(BufferedImage srcImg, float scale, boolean opacityCompatible) { + int scaleType; if (scale < 0) { // 自动修正负数 scale = -scale; @@ -247,7 +248,15 @@ public class ImageUtils { int width = mul(Integer.toString(srcImg.getWidth(null)), Float.toString(scale)).intValue(); // 得到源图宽 int height = mul(Integer.toString(srcImg.getHeight(null)), Float.toString(scale)).intValue(); // 得到源图长 - return CoreGraphHelper.toBufferedImage(scale(srcImg, width, height, opacityCompatible)); + int srcHeight = srcImg.getHeight(null); + int srcWidth = srcImg.getWidth(null); + if (srcHeight < height || srcWidth < width) { + // 放大图片使用平滑模式 + scaleType = Image.SCALE_SMOOTH; + } else { + scaleType = Image.SCALE_DEFAULT; + } + return CoreGraphHelper.toBufferedImage(scale(srcImg, width, height, opacityCompatible, scaleType)); } private static BigDecimal mul(String v1, String v2) { @@ -268,18 +277,12 @@ public class ImageUtils { * @param opacityCompatible 是否处理背景透明 * @return {@link Image} */ - private static Image scale(BufferedImage srcImg, int width, int height, boolean opacityCompatible) { + public static Image scale(BufferedImage srcImg, int width, int height, boolean opacityCompatible, int scaleType) { int srcHeight = srcImg.getHeight(null); int srcWidth = srcImg.getWidth(null); - int scaleType; if (srcHeight == height && srcWidth == width) { // 源与目标长宽一致返回原图 return srcImg; - } else if (srcHeight < height || srcWidth < width) { - // 放大图片使用平滑模式 - scaleType = Image.SCALE_SMOOTH; - } else { - scaleType = Image.SCALE_DEFAULT; } if (opacityCompatible) {//需要保留透明度背景 BufferedImage toImg = CoreGraphHelper.createBufferedImage(width, height, srcImg.getType()); diff --git a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java index 0231963b9..e4aedd421 100644 --- a/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java +++ b/designer-base/src/main/java/com/fr/design/web/CustomIconPane.java @@ -16,12 +16,12 @@ import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.layout.TableLayout; import com.fr.design.layout.TableLayoutHelper; import com.fr.design.mainframe.DesignerContext; +import com.fr.design.utils.ImageUtils; import com.fr.design.utils.gui.GUICoreUtils; import com.fr.form.ui.WidgetInfoConfig; import com.fr.general.ComparatorUtils; import com.fr.stable.Constants; -import com.fr.stable.CoreGraphHelper; import com.fr.stable.ListMap; import com.fr.stable.StringUtils; import com.fr.transaction.Configurations; @@ -39,6 +39,9 @@ import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; /** * carl:自定义Icon编辑 @@ -452,13 +455,7 @@ public class CustomIconPane extends BasicPane { String path = jf.getSelectedFile().getAbsolutePath(); // 图片存储有最大值48*48限制,没有超过最大值时,按原图大小存储,超过最大值后,压缩至最大值存储 Image image = BaseUtils.readImage(path); - BufferedImage bufferedImage = CoreGraphHelper.createBufferedImage(Math.min(image.getWidth(null), IconManager.MAXSTORAGE_ICONWIDTH), - Math.min(image.getHeight(null), IconManager.MAXSTORAGE_ICONHEIGHT), BufferedImage.TYPE_INT_ARGB); - Graphics2D g2d = bufferedImage.createGraphics(); - g2d.drawImage(image, 0, 0, Math.min(image.getWidth(null), IconManager.MAXSTORAGE_ICONWIDTH), Math.min(image.getHeight(null), IconManager.MAXSTORAGE_ICONHEIGHT), null); - bufferedImage.flush(); - g2d.dispose(); - iconImage = bufferedImage; + iconImage = ImageUtils.scale((BufferedImage) image, Math.min(image.getWidth(null), IconManager.MAXSTORAGE_ICONWIDTH), Math.min(image.getHeight(null), IconManager.MAXSTORAGE_ICONHEIGHT), true, Image.SCALE_SMOOTH); if (iconImage != null) { showImageLabel.setIcon(new ImageIcon(iconImage)); } From e353c546fce449e7948ed1213ab93c58a0d60567 Mon Sep 17 00:00:00 2001 From: Bryant Date: Wed, 9 Oct 2019 18:11:09 +0800 Subject: [PATCH 27/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../update/actions/RecoverForDesigner.java | 79 +++++++++++++++++++ .../update/ui/dialog/UpdateMainDialog.java | 1 - .../java/com/fr/design/upm/UpmFinder.java | 20 ++--- 3 files changed, 84 insertions(+), 16 deletions(-) create mode 100644 designer-base/src/main/java/com/fr/design/update/actions/RecoverForDesigner.java diff --git a/designer-base/src/main/java/com/fr/design/update/actions/RecoverForDesigner.java b/designer-base/src/main/java/com/fr/design/update/actions/RecoverForDesigner.java new file mode 100644 index 000000000..60decb873 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/update/actions/RecoverForDesigner.java @@ -0,0 +1,79 @@ +package com.fr.design.update.actions; + +import com.fr.decision.update.backup.Recover; +import com.fr.decision.update.data.UpdateConstants; +import com.fr.decision.update.exception.UpdateException; +import com.fr.general.GeneralUtils; +import com.fr.general.IOUtils; +import com.fr.log.FineLoggerFactory; +import com.fr.stable.CommonUtils; +import com.fr.stable.StableUtils; +import com.fr.stable.project.ProjectConstants; +import com.fr.workspace.WorkContext; + +import java.io.File; +import java.io.IOException; + +/** + * @author Bryant + * @version 10.0 + * Created by Bryant on 2019-10-09 + */ +public class RecoverForDesigner implements Recover { + + @Override + public boolean recover() { + try{ + IOUtils.copyFilesInDirByPath(StableUtils.pathJoin(StableUtils.getInstallHome(), UpdateConstants.DESIGNERBACKUPPATH), + StableUtils.pathJoin(StableUtils.getInstallHome(), ProjectConstants.LIB_NAME)); + return true; + } catch (IOException ignore) { + FineLoggerFactory.getLogger().error("Recover error for designer"); + return false; + } + } + + @Override + public boolean backup() { + String installHome = StableUtils.getInstallHome(); + //jar包备份文件的目录为"backup/"+jar包当前版本号 + String todayBackupDir = StableUtils.pathJoin(installHome, UpdateConstants.DESIGNER_BACKUP_DIR, (GeneralUtils.readBuildNO())); + backupFilesFromInstallEnv(todayBackupDir); + backupFilesFromInstallLib(installHome, todayBackupDir); + try { + File file = new File(StableUtils.pathJoin(installHome, UpdateConstants.DOWNLOADPATH)); + CommonUtils.mkdirs(file); + IOUtils.copyFilesInDirByPath(StableUtils.pathJoin(installHome,ProjectConstants.LIB_NAME), + StableUtils.pathJoin(installHome, UpdateConstants.DESIGNERBACKUPPATH)); + return true; + }catch (IOException e) { + UpdateException exception = new UpdateException("Backup Exception for designer" + e.getMessage()); + FineLoggerFactory.getLogger().error(exception.getMessage(),exception); + return false; + } + } + + private void backupFilesFromInstallEnv(String todayBackupDir) { + try { + CommonUtils.mkdirs(new File(StableUtils.pathJoin(todayBackupDir,UpdateConstants.BACKUPPATH))); + IOUtils.copyFilesInDirByPath( + StableUtils.pathJoin(WorkContext.getCurrent().getPath(),ProjectConstants.LIB_NAME), + StableUtils.pathJoin(todayBackupDir,UpdateConstants.BACKUPPATH)); + } catch (IOException e) { + UpdateException exception = new UpdateException(e.getMessage()); + FineLoggerFactory.getLogger().error(exception.getMessage() + "backup for Designer recover in env failed"); + } + } + + private void backupFilesFromInstallLib(String installHome, String todayBackupDir) { + try { + CommonUtils.mkdirs(new File(StableUtils.pathJoin(todayBackupDir,UpdateConstants.DESIGNERBACKUPPATH))); + IOUtils.copyFilesInDirByPath( + StableUtils.pathJoin(installHome,ProjectConstants.LIB_NAME), + StableUtils.pathJoin(todayBackupDir,UpdateConstants.DESIGNERBACKUPPATH)); + } catch (IOException e) { + UpdateException exception = new UpdateException(e.getMessage()); + FineLoggerFactory.getLogger().error(exception.getMessage() + "backup for Designer recover in install failed"); + } + } +} diff --git a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java index 50329a46f..a5504c894 100644 --- a/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java +++ b/designer-base/src/main/java/com/fr/design/update/ui/dialog/UpdateMainDialog.java @@ -584,7 +584,6 @@ public class UpdateMainDialog extends UIDialog { updateButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - jarCurrentLabel.setText(downloadFileConfig.optString("buildNO")); int a = JOptionPane.showConfirmDialog(getParent(), Toolkit.i18nText("Fine-Design_Update_Info_Information"),Toolkit.i18nText("Fine-Design_Update_Info_Title"), JOptionPane.OK_CANCEL_OPTION); if (a == 0) { progressBar.setVisible(true); diff --git a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java index 0c1f7cd52..cf7716aa3 100644 --- a/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java +++ b/designer-base/src/main/java/com/fr/design/upm/UpmFinder.java @@ -1,7 +1,6 @@ package com.fr.design.upm; import com.fr.base.FRContext; -import com.fr.decision.update.data.UpdateConstants; import com.fr.design.dialog.UIDialog; import com.fr.design.i18n.Toolkit; import com.fr.design.mainframe.DesignerContext; @@ -9,9 +8,7 @@ import com.fr.design.update.ui.dialog.UpdateMainDialog; import com.fr.event.Event; import com.fr.event.EventDispatcher; import com.fr.event.Listener; -import com.fr.log.FineLoggerFactory; import com.fr.stable.StableUtils; -import com.fr.stable.project.ProjectConstants; import com.fr.workspace.Workspace; import com.fr.workspace.WorkspaceEvent; @@ -56,18 +53,11 @@ public class UpmFinder { } public static void showUPMDialog() { - boolean flag = false; - File file = new File(StableUtils.pathJoin(StableUtils.getInstallHome(), ProjectConstants.LIB_NAME)); - File[] files = file.listFiles(); - if (files != null) { - for (File file1 : files) { - if (file1.getName().contains(UpdateConstants.JXBROWSER)) { - flag = true; - break; - } - } - }else { - FineLoggerFactory.getLogger().error("Designer lib can not be null"); + boolean flag = true; + try { + Class.forName("com.teamdev.jxbrowser.chromium.Browser"); + } catch (ClassNotFoundException e) { + flag = false; } if (flag) { UpmShowPane upmPane = new UpmShowPane(); From fdf29340a770451dd8bcb527a070a3facd6ed707 Mon Sep 17 00:00:00 2001 From: Bryant Date: Wed, 9 Oct 2019 18:11:44 +0800 Subject: [PATCH 28/28] =?UTF-8?q?KERNEL-418=20=E6=9B=B4=E6=96=B0=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/com/fr/start/module/DesignerActivator.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java index 822a332f3..4cee65f25 100644 --- a/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java +++ b/designer-realize/src/main/java/com/fr/start/module/DesignerActivator.java @@ -8,6 +8,7 @@ import com.fr.base.passport.FinePassportManager; import com.fr.base.process.ProcessOperator; import com.fr.chart.chartattr.ChartCollection; import com.fr.config.MarketConfig; +import com.fr.decision.update.backup.RecoverManager; import com.fr.design.DesignerEnvManager; import com.fr.design.ExtraDesignClassManager; import com.fr.design.actions.NewFormAction; @@ -57,6 +58,7 @@ import com.fr.design.module.DesignModuleFactory; import com.fr.design.parameter.FormParameterReader; import com.fr.design.parameter.ParameterPropertyPane; import com.fr.design.parameter.WorkBookParameterReader; +import com.fr.design.update.actions.RecoverForDesigner; import com.fr.design.widget.ui.btn.FormSubmitButtonDetailPane; import com.fr.form.stable.ElementCaseThumbnailProcessor; import com.fr.general.xml.GeneralXMLTools; @@ -128,6 +130,7 @@ public class DesignerActivator extends Activator { UserInfoPane.getInstance().updateBBSUserInfo(); storePassport(); AlphaFineHelper.switchConfig4Locale(); + RecoverManager.register(new RecoverForDesigner()); } @Override