diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java index 415ff948c6..9708dcb65a 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JTemplate.java @@ -34,8 +34,8 @@ import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.gui.itree.filetree.TemplateFileTree; import com.fr.design.i18n.Toolkit; import com.fr.design.layout.FRGUIPaneFactory; -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; -import com.fr.design.mainframe.templateinfo.TemplateProcessInfo; +import com.fr.design.mainframe.template.info.TemplateInfoCollector; +import com.fr.design.mainframe.template.info.TemplateProcessInfo; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.mainframe.toolbar.VcsScene; import com.fr.design.menu.MenuDef; @@ -78,6 +78,7 @@ import java.util.regex.Pattern; public abstract class JTemplate> extends TargetComponent implements ToolBarMenuDockPlus, DesignerProxy { // TODO ALEX_SEP editingFILE这个属性一定要吗?如果非要不可,有没有可能保证不为null private static final int PREFIX_NUM = 3000; + private static final int ONE_THOUSAND = 1000; private FILE editingFILE = null; // alex:初始状态为saved,这样不管是新建模板,还是打开模板,如果未做任何操作直接关闭,不提示保存 private boolean saved = true; @@ -92,8 +93,6 @@ public abstract class JTemplate> private DesignModelAdapter designModel; private PreviewProvider previewType; private long openTime = 0L; // 打开模板的时间点(包括新建模板) - private TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); - private StringBuilder process = new StringBuilder(""); // 制作模板的过程 public int resolution = ScreenResolution.getScreenResolution(); public JTemplate() { @@ -125,11 +124,9 @@ public abstract class JTemplate> this.undoState = createUndoState(); designModel = createDesignModel(); // 如果不是新建模板,并且在收集列表中 - if (!isNewFile && tic.inList(t)) { + if (!isNewFile && TemplateInfoCollector.getInstance().contains(t.getTemplateID())) { openTime = System.currentTimeMillis(); - process.append(tic.loadProcess(t)); } - } // 刷新右侧属性面板 @@ -148,12 +145,17 @@ public abstract class JTemplate> } private void collectInfo() { // 执行收集操作 + collectInfo(StringUtils.EMPTY); + } + + private void collectInfo(String originID) { // 执行收集操作 if (openTime == 0) { // 旧模板,不收集数据 return; } long saveTime = System.currentTimeMillis(); // 保存模板的时间点 try { - tic.collectInfo(template, this, openTime, saveTime); + long timeConsume = ((saveTime - openTime) / ONE_THOUSAND); // 制作模板耗时(单位:s) + TemplateInfoCollector.getInstance().collectInfo(template.getTemplateID(), originID, getProcessInfo(), (int)timeConsume); } catch (Throwable th) { // 不管收集过程中出现任何异常,都不应该影响模版保存 } openTime = saveTime; // 更新 openTime,准备下一次计算 @@ -161,16 +163,6 @@ public abstract class JTemplate> public abstract TemplateProcessInfo getProcessInfo(); - // 追加过程记录 - public void appendProcess(String s) { - process.append(s); - } - - // 获取过程记录 - public String getProcess() { - return process.toString(); - } - public U getUndoState() { return undoState; } @@ -617,15 +609,20 @@ public abstract class JTemplate> } } + // 保存新模板时会进入此方法(新建模板直接保存,或者另存为) protected boolean saveNewFile(FILE editingFILE, String oldName) { + String originID = StringUtils.EMPTY; + if (StringUtils.isNotEmpty(this.template.getTemplateID())) { + originID = this.template.getTemplateID(); + } // 在保存之前,初始化 templateID - initForCollect(); // 如果保存新模板(新建模板直接保存,或者另存为),则添加 templateID + initForCollect(); this.editingFILE = editingFILE; boolean result = this.saveFile(); if (result) { DesignerFrameFileDealerPane.getInstance().refresh(); - collectInfo(); + collectInfo(originID); } //更换最近打开 DesignerEnvManager.getEnvManager().replaceRecentOpenedFilePath(oldName, this.getPath()); diff --git a/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java b/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java index cea1088920..2c18186147 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/JVirtualTemplate.java @@ -7,7 +7,7 @@ import com.fr.design.file.HistoryTemplateListPane; import com.fr.design.gui.frpane.HyperlinkGroupPane; import com.fr.design.gui.frpane.HyperlinkGroupPaneActionProvider; import com.fr.design.gui.imenu.UIMenuItem; -import com.fr.design.mainframe.templateinfo.TemplateProcessInfo; +import com.fr.design.mainframe.template.info.TemplateProcessInfo; import com.fr.design.menu.ShortCut; import com.fr.design.menu.ToolBarDef; import com.fr.file.FILE; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/template/info/SendHelper.java b/designer-base/src/main/java/com/fr/design/mainframe/template/info/SendHelper.java new file mode 100644 index 0000000000..1f7aeec63d --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/template/info/SendHelper.java @@ -0,0 +1,44 @@ +package com.fr.design.mainframe.template.info; + +import com.fr.design.mainframe.SiteCenterToken; +import com.fr.general.CloudCenter; +import com.fr.general.ComparatorUtils; +import com.fr.general.http.HttpToolbox; +import com.fr.json.JSONObject; + +import java.io.IOException; +import java.util.HashMap; + +/** + * 负责向服务器发送信息 + * Created by plough on 2019/4/18. + */ +class SendHelper { + private static final String CONSUMING_URL = CloudCenter.getInstance().acquireUrlByKind("tempinfo.consuming") + "/single"; + private static final String PROCESS_URL = CloudCenter.getInstance().acquireUrlByKind("tempinfo.process") + "/single"; + + private static boolean sendConsumingInfo(String content) { + return sendSingleTemplateInfo(CONSUMING_URL, content); + } + + private static boolean sendProcessInfo(String content) { + return sendSingleTemplateInfo(PROCESS_URL, content); + } + + static boolean sendTemplateInfo(TemplateInfo templateInfo) { + return SendHelper.sendConsumingInfo(templateInfo.getConsumingMapJsonString()) && SendHelper.sendProcessInfo(templateInfo.getProcessMapJsonString()); + } + + private static boolean sendSingleTemplateInfo(String url, String content) { + HashMap para = new HashMap<>(); + para.put("token", SiteCenterToken.generateToken()); + para.put("content", content); + + try { + String res = HttpToolbox.get(url, para); + return ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); + } catch (IOException ignore) { + } + return false; + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfo.java b/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfo.java new file mode 100644 index 0000000000..af644a1e81 --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfo.java @@ -0,0 +1,248 @@ +package com.fr.design.mainframe.template.info; + +import com.fr.config.MarketConfig; +import com.fr.design.DesignerEnvManager; +import com.fr.general.GeneralUtils; +import com.fr.json.JSONObject; +import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLReadable; +import com.fr.stable.xml.XMLWriter; +import com.fr.stable.xml.XMLableReader; + +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +/** + * 对应一张模版的记录 + * Created by plough on 2019/4/18. + */ +class TemplateInfo implements XMLReadable, XMLWriter { + static final String XML_TAG = "TemplateInfo"; + + private static final String XML_PROCESS_MAP = "processMap"; + private static final String XML_CONSUMING_MAP = "consumingMap"; + private static final String ATTR_DAY_COUNT = "day_count"; + private static final String ATTR_TEMPLATE_ID = "templateID"; + private static final String ATTR_ORIGIN_ID = "originID"; + private static final String ATTR_PROCESS = "process"; + private static final String ATTR_FLOAT_COUNT = "float_count"; + private static final String ATTR_WIDGET_COUNT = "widget_count"; + private static final String ATTR_CELL_COUNT = "cell_count"; + private static final String ATTR_BLOCK_COUNT = "block_count"; + private static final String ATTR_REPORT_TYPE = "report_type"; + private static final String ATTR_ACTIVITYKEY = "activitykey"; + private static final String ATTR_JAR_TIME = "jar_time"; + private static final String ATTR_CREATE_TIME = "create_time"; + private static final String ATTR_UUID = "uuid"; + private static final String ATTR_TIME_CONSUME = "time_consume"; + private static final String ATTR_ORIGIN_TIME = "originTime"; + private static final String ATTR_VERSION = "version"; + private static final String ATTR_USERNAME = "username"; + + private static final int VALID_CELL_COUNT = 5; // 有效报表模板的格子数 + private static final int VALID_WIDGET_COUNT = 5; // 有效报表模板的控件数 + private static final int COMPLETE_DAY_COUNT = 15; // 判断模板是否完成的天数 + + private int idleDayCount; // 到现在为止,模版闲置(上次保存后没有再编辑过)的天数 + private String templateID = StringUtils.EMPTY; + private String originID = StringUtils.EMPTY; + // todo: processMap 和 consumingMap 还可以再拆解为小类,以后继续重构 + private Map processMap = new HashMap<>(); + private Map consumingMap = new HashMap<>(); + + private TemplateInfo() { + } + + private TemplateInfo(String templateID, String originID) { + this.templateID = templateID; + this.originID = originID; + } + + static TemplateInfo newInstanceByRead(XMLableReader reader) { + TemplateInfo templateInfo = new TemplateInfo(); + reader.readXMLObject(templateInfo); + return templateInfo; + } + + static TemplateInfo newInstance(String templateID) { + return newInstance(templateID, StringUtils.EMPTY, 0); + } + + static TemplateInfo newInstance(String templateID, String originID, int originTime) { + HashMap consumingMap = new HashMap<>(); + + String username = MarketConfig.getInstance().getBbsUsername(); + String uuid = DesignerEnvManager.getEnvManager().getUUID(); + String activitykey = DesignerEnvManager.getEnvManager().getActivationKey(); + String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(Calendar.getInstance().getTime()); + String jarTime = GeneralUtils.readBuildNO(); + String version = ProductConstants.VERSION; + consumingMap.put(ATTR_USERNAME, username); + consumingMap.put(ATTR_UUID, uuid); + consumingMap.put(ATTR_ACTIVITYKEY, activitykey); + consumingMap.put(ATTR_TEMPLATE_ID, templateID); + consumingMap.put(ATTR_ORIGIN_ID, originID); + consumingMap.put(ATTR_CREATE_TIME, createTime); + consumingMap.put(ATTR_TIME_CONSUME, originTime); // timeConsume 在原来模版的基础上累加 + consumingMap.put(ATTR_ORIGIN_TIME, originTime); + consumingMap.put(ATTR_JAR_TIME, jarTime); + consumingMap.put(ATTR_VERSION, version); + + TemplateInfo templateInfo = new TemplateInfo(templateID, originID); + templateInfo.consumingMap = consumingMap; + + return templateInfo; + } + + String getTemplateID() { + return templateID; + } + + int getTimeConsume() { + return (int)consumingMap.get(ATTR_TIME_CONSUME); + } + + public void writeXML(XMLPrintWriter writer) { + writer.startTAG(XML_TAG); + if (StringUtils.isNotEmpty(templateID)) { + writer.attr(ATTR_TEMPLATE_ID, this.templateID); + } + if (StringUtils.isNotEmpty(originID)) { + writer.attr(ATTR_ORIGIN_ID, this.originID); + } + if (idleDayCount >= 0) { + writer.attr(ATTR_DAY_COUNT, this.idleDayCount); + } + writeProcessMap(writer); + writeConsumingMap(writer); + + writer.end(); + } + + private void writeProcessMap(XMLPrintWriter writer) { + writer.startTAG(XML_PROCESS_MAP); + writer.attr(ATTR_PROCESS, (String) processMap.get(ATTR_PROCESS)); + writer.attr(ATTR_FLOAT_COUNT, (int) processMap.get(ATTR_FLOAT_COUNT)); + writer.attr(ATTR_WIDGET_COUNT, (int) processMap.get(ATTR_WIDGET_COUNT)); + writer.attr(ATTR_CELL_COUNT, (int) processMap.get(ATTR_CELL_COUNT)); + writer.attr(ATTR_BLOCK_COUNT, (int) processMap.get(ATTR_BLOCK_COUNT)); + writer.attr(ATTR_REPORT_TYPE, (int) processMap.get(ATTR_REPORT_TYPE)); + writer.end(); + } + + private void writeConsumingMap(XMLPrintWriter writer) { + writer.startTAG(XML_CONSUMING_MAP); + writer.attr(ATTR_ACTIVITYKEY, (String) consumingMap.get(ATTR_ACTIVITYKEY)); + writer.attr(ATTR_JAR_TIME, (String) consumingMap.get(ATTR_JAR_TIME)); + writer.attr(ATTR_CREATE_TIME, (String) consumingMap.get(ATTR_CREATE_TIME)); + writer.attr(ATTR_UUID, (String) consumingMap.get(ATTR_UUID)); + writer.attr(ATTR_TIME_CONSUME, (int)consumingMap.get(ATTR_TIME_CONSUME)); + writer.attr(ATTR_ORIGIN_TIME, (int)consumingMap.get(ATTR_ORIGIN_TIME)); + writer.attr(ATTR_VERSION, (String) consumingMap.get(ATTR_VERSION)); + writer.attr(ATTR_USERNAME, (String) consumingMap.get(ATTR_USERNAME)); + writer.end(); + } + + public void readXML(XMLableReader reader) { + if (!reader.isChildNode()) { + idleDayCount = reader.getAttrAsInt(ATTR_DAY_COUNT, 0); + templateID = reader.getAttrAsString(ATTR_TEMPLATE_ID, StringUtils.EMPTY); + originID = reader.getAttrAsString(ATTR_ORIGIN_ID, StringUtils.EMPTY); + } else { + try { + String name = reader.getTagName(); + if (XML_PROCESS_MAP.equals(name)) { + processMap.put(ATTR_PROCESS, reader.getAttrAsString(ATTR_PROCESS, StringUtils.EMPTY)); + processMap.put(ATTR_FLOAT_COUNT, reader.getAttrAsInt(ATTR_FLOAT_COUNT, 0)); + processMap.put(ATTR_WIDGET_COUNT, reader.getAttrAsInt(ATTR_WIDGET_COUNT, 0)); + processMap.put(ATTR_CELL_COUNT, reader.getAttrAsInt(ATTR_CELL_COUNT, 0)); + processMap.put(ATTR_BLOCK_COUNT, reader.getAttrAsInt(ATTR_BLOCK_COUNT, 0)); + processMap.put(ATTR_REPORT_TYPE, reader.getAttrAsInt(ATTR_REPORT_TYPE, 0)); + processMap.put(ATTR_TEMPLATE_ID, templateID); + } else if (XML_CONSUMING_MAP.equals(name)) { + consumingMap.put(ATTR_ACTIVITYKEY, reader.getAttrAsString(ATTR_ACTIVITYKEY, StringUtils.EMPTY)); + consumingMap.put(ATTR_JAR_TIME, reader.getAttrAsString(ATTR_JAR_TIME, StringUtils.EMPTY)); + consumingMap.put(ATTR_CREATE_TIME, reader.getAttrAsString(ATTR_CREATE_TIME, StringUtils.EMPTY)); + consumingMap.put(ATTR_TEMPLATE_ID, templateID); + consumingMap.put(ATTR_ORIGIN_ID, originID); + consumingMap.put(ATTR_UUID, reader.getAttrAsString(ATTR_UUID, StringUtils.EMPTY)); + consumingMap.put(ATTR_TIME_CONSUME, reader.getAttrAsInt(ATTR_TIME_CONSUME, 0)); + consumingMap.put(ATTR_ORIGIN_TIME, reader.getAttrAsInt(ATTR_ORIGIN_TIME, 0)); + consumingMap.put(ATTR_VERSION, reader.getAttrAsString(ATTR_VERSION, "8.0")); + consumingMap.put(ATTR_USERNAME, reader.getAttrAsString(ATTR_USERNAME, StringUtils.EMPTY)); + } + } catch (Exception ex) { + // 什么也不做,使用默认值 + } + } + } + + boolean isTestTemplate() { + if (!isComplete()) { + return false; + } + + int reportType = (int) processMap.get(ATTR_REPORT_TYPE); + int cellCount = (int) processMap.get(ATTR_CELL_COUNT); + int floatCount = (int) processMap.get(ATTR_FLOAT_COUNT); + int blockCount = (int) processMap.get(ATTR_BLOCK_COUNT); + int widgetCount = (int) processMap.get(ATTR_WIDGET_COUNT); + boolean isTestTemplate; + if (reportType == 0) { // 普通报表 + isTestTemplate = cellCount <= VALID_CELL_COUNT && floatCount <= 1 && widgetCount <= VALID_WIDGET_COUNT; + } else if (reportType == 1) { // 聚合报表 + isTestTemplate = blockCount <= 1 && widgetCount <= VALID_WIDGET_COUNT; + } else { // 表单(reportType == 2) + isTestTemplate = widgetCount <= 1; + } + return isTestTemplate; + } + + boolean isComplete() { + return idleDayCount > COMPLETE_DAY_COUNT; + } + + String getConsumingMapJsonString() { + return new JSONObject(consumingMap).toString(); + } + + String getProcessMapJsonString() { + return new JSONObject(processMap).toString(); + } + + boolean isReadyForSend() { + return isComplete() && !isTestTemplate(); + } + + void addTimeConsume(int timeConsume) { + timeConsume += (int)consumingMap.get(ATTR_TIME_CONSUME); // 加上之前的累计编辑时间 + consumingMap.put(ATTR_TIME_CONSUME, timeConsume); + } + + void updateProcessMap(TemplateProcessInfo processInfo) { + HashMap processMap = new HashMap<>(); + + // 暂不支持模版制作过程的收集 + processMap.put(ATTR_PROCESS, StringUtils.EMPTY); + + processMap.put(ATTR_REPORT_TYPE, processInfo.getReportType()); + processMap.put(ATTR_CELL_COUNT, processInfo.getCellCount()); + processMap.put(ATTR_FLOAT_COUNT, processInfo.getFloatCount()); + processMap.put(ATTR_BLOCK_COUNT, processInfo.getBlockCount()); + processMap.put(ATTR_WIDGET_COUNT, processInfo.getWidgetCount()); + + this.processMap = processMap; + } + + void resetIdleDayCount() { + this.idleDayCount = 0; + } + + void addIdleDayCountByOne() { + this.idleDayCount += 1; + } +} \ No newline at end of file diff --git a/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java b/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java new file mode 100644 index 0000000000..5d5e5dd5bc --- /dev/null +++ b/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateInfoCollector.java @@ -0,0 +1,251 @@ +package com.fr.design.mainframe.template.info; + +import com.fr.base.FRContext; +import com.fr.design.DesignerEnvManager; +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.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLReadable; +import com.fr.stable.xml.XMLTools; +import com.fr.stable.xml.XMLWriter; +import com.fr.stable.xml.XMLableReader; +import com.fr.third.javax.xml.stream.XMLStreamException; +import com.fr.workspace.WorkContext; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.HashMap; +import java.util.Map; + +/** + * 做模板的过程和耗时收集,辅助类 + * Created by plough on 2017/2/21. + */ +public class TemplateInfoCollector implements XMLReadable, XMLWriter { + private static final String XML_TAG = "TplInfo"; + private static final String XML_DESIGNER_OPEN_DATE = "DesignerOpenDate"; + private static final String XML_TEMPLATE_INFO_LIST = "TemplateInfoList"; + private static final String XML_FILE_NAME = "tpl.info"; + private static TemplateInfoCollector instance; + private Map templateInfoMap; + private String designerOpenDate; //设计器最近一次打开日期 + + private TemplateInfoCollector() { + init(); + } + + public static TemplateInfoCollector getInstance() { + if (instance == null) { + instance = new TemplateInfoCollector(); + } + return instance; + } + + /** + * 根据模板ID是否在收集列表中,判断是否需要收集当前模板的信息 + */ + public boolean contains(String templateID) { + return StringUtils.isNotEmpty(templateID) && templateInfoMap.containsKey(templateID); + } + + /** + * 收集模板信息。如果之前没有记录,则新增;如果已有记录,则更新。 + * 同时将最新数据保存到文件中。 + * @param templateID 模版id + * @param originID 模版的原始id,仅对另存为的模版有效,对于非另存为的模版,值总是为空 + * @param processInfo 包含模版的一些基本信息(如模版类型、包含控件数量等) + * @param timeConsume 本次制作耗时,单位为 s + */ + public void collectInfo(String templateID, String originID, TemplateProcessInfo processInfo, int timeConsume) { + if (!shouldCollectInfo()) { + return; + } + + TemplateInfo templateInfo; + if (this.contains(templateID)) { + templateInfo = templateInfoMap.get(templateID); + } else if (!this.contains(originID)) { + templateInfo = TemplateInfo.newInstance(templateID); + templateInfoMap.put(templateID, templateInfo); + } else { + int originTime = templateInfoMap.get(originID).getTimeConsume(); + templateInfo = TemplateInfo.newInstance(templateID, originID, originTime); + templateInfoMap.put(templateID, templateInfo); + } + + // 收集制作耗时 + templateInfo.addTimeConsume(timeConsume); + // 收集模版基本信息 + templateInfo.updateProcessMap(processInfo); + // 刷新闲置日计数器 + templateInfo.resetIdleDayCount(); + + // 每次更新之后,都同步到暂存文件中 + saveInfo(); + } + + /** + * 发送本地模板信息到服务器,并清空已发送模版的本地记录 + */ + public void sendTemplateInfo() { + addIdleDayCount(); + + removeTestTemplates(); + + for (String key : templateInfoMap.keySet()) { + TemplateInfo templateInfo = templateInfoMap.get(key); + if (templateInfo.isReadyForSend()) { + if (SendHelper.sendTemplateInfo(templateInfo)) { + // 清空记录 + removeFromTemplateInfoList(templateInfo.getTemplateID()); + } + } + } + + saveInfo(); + } + + /** + * 获取缓存文件存放路径 + */ + private static File getInfoFile() { + return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), XML_FILE_NAME)); + } + + private void init() { + templateInfoMap = new HashMap<>(); + setDesignerOpenDate(); + + loadFromFile(); + } + + void loadFromFile() { + if (!getInfoFile().exists()) { + return; + } + try { + XMLableReader xmlReader = XMLableReader.createXMLableReader(new FileReader(getInfoFile())); + xmlReader.readXMLObject(this); + } catch (XMLStreamException e) { + FineLoggerFactory.getLogger().error(e.getMessage(), e); + } catch (FileNotFoundException e) { + // do nothing + } + } + + TemplateInfo getOrCreateTemplateInfoByID(String templateID) { + if (templateInfoMap.containsKey(templateID)) { + return templateInfoMap.get(templateID); + } + TemplateInfo templateInfo = TemplateInfo.newInstance(templateID); + templateInfoMap.put(templateID, templateInfo); + return templateInfo; + } + + /** + * 把设计器最近打开日期设定为当前日期 + */ + private void setDesignerOpenDate() { + designerOpenDate = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); + } + + /** + * 判断今天是否第一次打开设计器,为了防止同一天内,多次 addIdleDayCount + */ + private boolean designerOpenFirstTime() { + String today = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); + return !ComparatorUtils.equals(today, designerOpenDate); + } + + private boolean shouldCollectInfo() { + //只收集本地环境的 + if (!WorkContext.getCurrent().isLocal()) { + return false; + } + return DesignerEnvManager.getEnvManager().isJoinProductImprove() && FRContext.isChineseEnv(); + } + + /** + * 将包含所有信息的对象保存到文件 + */ + private void saveInfo() { + try { + FileOutputStream out = new FileOutputStream(getInfoFile()); + XMLTools.writeOutputStreamXML(this, out); + } catch (Exception ex) { + FineLoggerFactory.getLogger().error(ex.getMessage()); + } + } + + /** + * 更新 day_count:打开设计器却未编辑模板的连续日子 + */ + private void addIdleDayCount() { + if (designerOpenFirstTime()) { + for (TemplateInfo templateInfo : templateInfoMap.values()) { + templateInfo.addIdleDayCountByOne(); + } + setDesignerOpenDate(); + } + } + + // 删除所有已完成的测试模版 + private void removeTestTemplates() { + ArrayList testTemplateKeys = new ArrayList<>(); // 保存测试模板的key + for (String key : templateInfoMap.keySet()) { + if (templateInfoMap.get(key).isTestTemplate()) { + testTemplateKeys.add(key); + } + } + // 删除测试模板 + for (String key : testTemplateKeys) { + removeFromTemplateInfoList(key); + } + } + + private void removeFromTemplateInfoList(String key) { + templateInfoMap.remove(key); + } + + @Override + public void readXML(XMLableReader reader) { + if (reader.isChildNode()) { + try { + String name = reader.getTagName(); + if (XML_DESIGNER_OPEN_DATE.equals(name)) { + this.designerOpenDate = reader.getElementValue(); + } else if (TemplateInfo.XML_TAG.equals(name)) { + TemplateInfo templateInfo = TemplateInfo.newInstanceByRead(reader); + templateInfoMap.put(templateInfo.getTemplateID(), templateInfo); + } + } catch (Exception ex) { + // 什么也不做,使用默认值 + } + } + } + + @Override + public void writeXML(XMLPrintWriter writer) { + writer.startTAG(XML_TAG); + + writer.startTAG(XML_DESIGNER_OPEN_DATE); + writer.textNode(designerOpenDate); + writer.end(); + + writer.startTAG(XML_TEMPLATE_INFO_LIST); + for (TemplateInfo templateInfo : templateInfoMap.values()) { + templateInfo.writeXML(writer); + } + writer.end(); + + writer.end(); + } +} diff --git a/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateProcessInfo.java b/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateProcessInfo.java similarity index 74% rename from designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateProcessInfo.java rename to designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateProcessInfo.java index 0307e4fd6d..427d48c73b 100644 --- a/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateProcessInfo.java +++ b/designer-base/src/main/java/com/fr/design/mainframe/template/info/TemplateProcessInfo.java @@ -1,10 +1,14 @@ -package com.fr.design.mainframe.templateinfo; +package com.fr.design.mainframe.template.info; import com.fr.base.io.BaseBook; /** * Created by plough on 2017/3/17. */ +// todo: 重构 +// 1. 命名不好,表意不清晰。 +// 2. 逻辑混乱,到底是一个 Info 类,还是一个 InfoCollector 类? +// 3. 耦合太强,用组合替代继承 public abstract class TemplateProcessInfo { protected T template; diff --git a/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java b/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java deleted file mode 100644 index 57ff2ce8a9..0000000000 --- a/designer-base/src/main/java/com/fr/design/mainframe/templateinfo/TemplateInfoCollector.java +++ /dev/null @@ -1,550 +0,0 @@ -package com.fr.design.mainframe.templateinfo; - -import com.fr.base.FRContext; -import com.fr.base.io.BaseBook; -import com.fr.config.MarketConfig; -import com.fr.design.DesignerEnvManager; -import com.fr.design.mainframe.DesignerContext; -import com.fr.design.mainframe.JTemplate; -import com.fr.design.mainframe.SiteCenterToken; -import com.fr.general.CloudCenter; -import com.fr.general.ComparatorUtils; -import com.fr.general.GeneralUtils; -import com.fr.general.IOUtils; -import com.fr.general.http.HttpClient; -import com.fr.json.JSONObject; -import com.fr.log.FineLoggerFactory; -import com.fr.stable.EncodeConstants; -import com.fr.stable.ProductConstants; -import com.fr.stable.StableUtils; -import com.fr.stable.StringUtils; -import com.fr.stable.xml.XMLPrintWriter; -import com.fr.stable.xml.XMLReadable; -import com.fr.stable.xml.XMLTools; -import com.fr.stable.xml.XMLWriter; -import com.fr.stable.xml.XMLableReader; -import com.fr.third.javax.xml.stream.XMLStreamException; -import com.fr.workspace.WorkContext; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.ObjectInputStream; -import java.io.Serializable; -import java.io.UnsupportedEncodingException; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.HashMap; -import java.util.Map; - -/** - * 做模板的过程和耗时收集,辅助类 - * Created by plough on 2017/2/21. - */ -public class TemplateInfoCollector implements Serializable, XMLReadable, XMLWriter { - static final long serialVersionUID = 2007L; - private static final String FILE_NAME = "tpl.info"; - private static final String OBJECT_FILE_NAME = "tplInfo.ser"; - private static final int VALID_CELL_COUNT = 5; // 有效报表模板的格子数 - private static final int VALID_WIDGET_COUNT = 5; // 有效报表模板的控件数 - private static final int COMPLETE_DAY_COUNT = 15; // 判断模板是否完成的天数 - private static final int ONE_THOUSAND = 1000; - private static final String XML_DESIGNER_OPEN_DATE = "DesignerOpenDate"; - private static final String XML_TEMPLATE_INFO_LIST = "TemplateInfoList"; - private static final String XML_TEMPLATE_INFO = "TemplateInfo"; - private static final String XML_PROCESS_MAP = "processMap"; - private static final String XML_CONSUMING_MAP = "consumingMap"; - private static final String ATTR_DAY_COUNT = "day_count"; - private static final String ATTR_TEMPLATE_ID = "templateID"; - private static final String ATTR_PROCESS = "process"; - private static final String ATTR_FLOAT_COUNT = "float_count"; - private static final String ATTR_WIDGET_COUNT = "widget_count"; - private static final String ATTR_CELL_COUNT = "cell_count"; - private static final String ATTR_BLOCK_COUNT = "block_count"; - private static final String ATTR_REPORT_TYPE = "report_type"; - private static final String ATTR_ACTIVITYKEY = "activitykey"; - private static final String ATTR_JAR_TIME = "jar_time"; - private static final String ATTR_CREATE_TIME = "create_time"; - private static final String ATTR_UUID = "uuid"; - private static final String ATTR_TIME_CONSUME = "time_consume"; - private static final String ATTR_VERSION = "version"; - private static final String ATTR_USERNAME = "username"; - private static final String JSON_CONSUMING_MAP = "jsonConsumingMap"; - private static final String JSON_PROCESS_MAP = "jsonProcessMap"; - private static TemplateInfoCollector instance; - private Map> templateInfoList; - private String designerOpenDate; //设计器最近一次打开日期 - - - @SuppressWarnings("unchecked") - private TemplateInfoCollector() { - templateInfoList = new HashMap<>(); - setDesignerOpenDate(); - } - - /** - * 获取缓存文件存放路径 - */ - private static File getInfoFile() { - return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); - } - - private static File getObjectInfoFile() { - return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), OBJECT_FILE_NAME)); - } - - public static TemplateInfoCollector getInstance() { - if (instance == null) { - instance = new TemplateInfoCollector(); - readXMLFile(instance, getInfoFile()); - // 兼容过渡。如果没有新文件,则从老文件读取数据。以后都是读写新的 xml 文件 - if (!getInfoFile().exists() && getObjectInfoFile().exists()) { - try { - ObjectInputStream is = new ObjectInputStream(new FileInputStream(getObjectInfoFile())); - instance = (TemplateInfoCollector) is.readObject(); - } catch (Exception ex) { - // 什么也不做,instance 使用新值 - } - } - } - return instance; - } - - private static void readXMLFile(XMLReadable xmlReadable, File xmlFile) { - if (xmlFile == null || !xmlFile.exists()) { - return; - } - String charset = EncodeConstants.ENCODING_UTF_8; - try { - String fileContent = getFileContent(xmlFile); - InputStream xmlInputStream = new ByteArrayInputStream(fileContent.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 getFileContent(File xmlFile) throws FileNotFoundException, UnsupportedEncodingException { - InputStream is = new FileInputStream(xmlFile); - return IOUtils.inputStream2String(is); - } - - public static void main(String[] args) { - TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); - tic.sendTemplateInfo(); - } - - /** - * 把设计器最近打开日期设定为当前日期 - */ - private void setDesignerOpenDate() { - designerOpenDate = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); - } - - /** - * 判断今天是否第一次打开设计器 - */ - private boolean designerOpenFirstTime() { - String today = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); - return !ComparatorUtils.equals(today, designerOpenDate); - } - - private boolean shouldCollectInfo() { - //只收集本地环境的 - if (!WorkContext.getCurrent().isLocal()) { - return false; - } - return DesignerEnvManager.getEnvManager().isJoinProductImprove() && FRContext.isChineseEnv(); - } - - public void appendProcess(String log) { - if (!shouldCollectInfo()) { - return; - } - // 获取当前编辑的模板 - JTemplate jt = DesignerContext.getDesignerFrame().getSelectedJTemplate(); - // 追加过程记录 - jt.appendProcess(log); - } - - /** - * 加载已经存储的模板过程 - */ - @SuppressWarnings("unchecked") - public String loadProcess(T t) { - HashMap processMap = (HashMap) templateInfoList.get(t.getTemplateID()).get(XML_PROCESS_MAP); - return (String) processMap.get(ATTR_PROCESS); - } - - /** - * 根据模板ID是否在收集列表中,判断是否需要收集当前模板的信息 - */ - public boolean inList(T t) { - return templateInfoList.containsKey(t.getTemplateID()); - } - - /** - * 将包含所有信息的对象保存到文件 - */ - private void saveInfo() { - try { - FileOutputStream out = new FileOutputStream(getInfoFile()); - XMLTools.writeOutputStreamXML(this, out); - } catch (Exception ex) { - FineLoggerFactory.getLogger().error(ex.getMessage()); - } - } - - /** - * 更新 day_count:打开设计器却未编辑模板的连续日子 - */ - private void addDayCount() { - if (designerOpenFirstTime()) { - for (String key : templateInfoList.keySet()) { - HashMap templateInfo = templateInfoList.get(key); - int dayCount = (int) templateInfo.get(ATTR_DAY_COUNT) + 1; - templateInfo.put(ATTR_DAY_COUNT, dayCount); - } - setDesignerOpenDate(); - } - } - - /** - * 收集模板信息。如果之前没有记录,则新增;如果已有记录,则更新。 - * 同时将最新数据保存到文件中。 - */ - @SuppressWarnings("unchecked") - public void collectInfo(T t, JTemplate jt, long openTime, long saveTime) { - if (!shouldCollectInfo()) { - return; - } - - HashMap templateInfo; - - long timeConsume = ((saveTime - openTime) / ONE_THOUSAND); // 制作模板耗时(单位:s) - String templateID = t.getTemplateID(); - - if (inList(t)) { // 已有记录 - templateInfo = templateInfoList.get(templateID); - // 更新 conusmingMap - HashMap consumingMap = (HashMap) templateInfo.get(XML_CONSUMING_MAP); - timeConsume += (long) consumingMap.get(ATTR_TIME_CONSUME); // 加上之前的累计编辑时间 - consumingMap.put(ATTR_TIME_CONSUME, timeConsume); - } else { // 新增 - templateInfo = new HashMap<>(); - templateInfo.put(XML_CONSUMING_MAP, getNewConsumingMap(templateID, openTime, timeConsume)); - } - - // 直接覆盖 processMap - templateInfo.put(XML_PROCESS_MAP, getProcessMap(templateID, jt)); - - // 保存模板时,让 day_count 归零 - templateInfo.put(ATTR_DAY_COUNT, 0); - - templateInfoList.put(templateID, templateInfo); - - saveInfo(); // 每次更新之后,都同步到暂存文件中 - } - - private HashMap getNewConsumingMap(String templateID, long openTime, long timeConsume) { - HashMap consumingMap = new HashMap<>(); - - String username = MarketConfig.getInstance().getBbsUsername(); - String uuid = DesignerEnvManager.getEnvManager().getUUID(); - String activitykey = DesignerEnvManager.getEnvManager().getActivationKey(); - String createTime = new SimpleDateFormat("yyyy-MM-dd HH:mm").format(Calendar.getInstance().getTime()); - String jarTime = GeneralUtils.readBuildNO(); - String version = ProductConstants.VERSION; - consumingMap.put(ATTR_USERNAME, username); - consumingMap.put(ATTR_UUID, uuid); - consumingMap.put(ATTR_ACTIVITYKEY, activitykey); - consumingMap.put(ATTR_TEMPLATE_ID, templateID); - consumingMap.put(ATTR_CREATE_TIME, createTime); - consumingMap.put(ATTR_TIME_CONSUME, timeConsume); - consumingMap.put(ATTR_JAR_TIME, jarTime); - consumingMap.put(ATTR_VERSION, version); - - return consumingMap; - } - - private HashMap getProcessMap(String templateID, JTemplate jt) { - HashMap processMap = new HashMap<>(); - - processMap.put(ATTR_TEMPLATE_ID, templateID); - processMap.put(ATTR_PROCESS, jt.getProcess()); - - TemplateProcessInfo info = jt.getProcessInfo(); - processMap.put(ATTR_REPORT_TYPE, info.getReportType()); - processMap.put(ATTR_CELL_COUNT, info.getCellCount()); - processMap.put(ATTR_FLOAT_COUNT, info.getFloatCount()); - processMap.put(ATTR_BLOCK_COUNT, info.getBlockCount()); - processMap.put(ATTR_WIDGET_COUNT, info.getWidgetCount()); - - return processMap; - } - - /** - * 发送本地模板信息到服务器 - */ - public void sendTemplateInfo() { - addDayCount(); - String consumingUrl = CloudCenter.getInstance().acquireUrlByKind("tempinfo.consuming") + "/single"; - String processUrl = CloudCenter.getInstance().acquireUrlByKind("tempinfo.process") + "/single"; - ArrayList> completeTemplatesInfo = getCompleteTemplatesInfo(); - for (HashMap templateInfo : completeTemplatesInfo) { - String jsonConsumingMap = templateInfo.get(JSON_CONSUMING_MAP); - String jsonProcessMap = templateInfo.get(JSON_PROCESS_MAP); - if (sendSingleTemplateInfo(consumingUrl, jsonConsumingMap) && sendSingleTemplateInfo(processUrl, jsonProcessMap)) { - // 清空记录 - removeFromTemplateInfoList(templateInfo.get(ATTR_TEMPLATE_ID)); - } - } - saveInfo(); - } - - private boolean sendSingleTemplateInfo(String url, String content) { - HashMap para = new HashMap<>(); - para.put("token", SiteCenterToken.generateToken()); - para.put("content", content); - HttpClient httpClient = new HttpClient(url, para, true); - httpClient.setTimeout(5000); - httpClient.asGet(); - - if (!httpClient.isServerAlive()) { - return false; - } - - String res = httpClient.getResponseText(); - boolean success; - try { - success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); - } catch (Exception ex) { - success = false; - } - return success; - } - - /** - * 返回已完成的模板信息 - */ - @SuppressWarnings("unchecked") - private ArrayList> getCompleteTemplatesInfo() { - ArrayList> completeTemplatesInfo = new ArrayList<>(); - ArrayList testTemplateKeys = new ArrayList<>(); // 保存测试模板的key - for (String key : templateInfoList.keySet()) { - HashMap templateInfo = templateInfoList.get(key); - if ((int) templateInfo.get(ATTR_DAY_COUNT) <= COMPLETE_DAY_COUNT) { // 未完成模板 - continue; - } - if (isTestTemplate(templateInfo)) { - testTemplateKeys.add(key); - continue; - } - HashMap consumingMap = (HashMap) templateInfo.get(XML_CONSUMING_MAP); - HashMap processMap = (HashMap) templateInfo.get(XML_PROCESS_MAP); - String jsonConsumingMap = new JSONObject(consumingMap).toString(); - String jsonProcessMap = new JSONObject(processMap).toString(); - HashMap jsonTemplateInfo = new HashMap<>(); - jsonTemplateInfo.put(JSON_CONSUMING_MAP, jsonConsumingMap); - jsonTemplateInfo.put(JSON_PROCESS_MAP, jsonProcessMap); - jsonTemplateInfo.put(ATTR_TEMPLATE_ID, key); - completeTemplatesInfo.add(jsonTemplateInfo); - } - // 删除测试模板 - for (String key : testTemplateKeys) { - removeFromTemplateInfoList(key); - } - return completeTemplatesInfo; - } - - private void removeFromTemplateInfoList(String key) { - templateInfoList.remove(key); - } - - @SuppressWarnings("unchecked") - private boolean isTestTemplate(HashMap templateInfo) { - HashMap processMap = (HashMap) templateInfo.get(XML_PROCESS_MAP); - int reportType = (int) processMap.get(ATTR_REPORT_TYPE); - int cellCount = (int) processMap.get(ATTR_CELL_COUNT); - int floatCount = (int) processMap.get(ATTR_FLOAT_COUNT); - int blockCount = (int) processMap.get(ATTR_BLOCK_COUNT); - int widgetCount = (int) processMap.get(ATTR_WIDGET_COUNT); - boolean isTestTemplate = false; - if (reportType == 0) { // 普通报表 - isTestTemplate = cellCount <= VALID_CELL_COUNT && floatCount <= 1 && widgetCount <= VALID_WIDGET_COUNT; - } else if (reportType == 1) { // 聚合报表 - isTestTemplate = blockCount <= 1 && widgetCount <= VALID_WIDGET_COUNT; - } else { // 表单(reportType == 2) - isTestTemplate = widgetCount <= 1; - } - return isTestTemplate; - } - - @SuppressWarnings("unchecked") - @Override - public void readXML(XMLableReader reader) { - if (reader.isChildNode()) { - try { - String name = reader.getTagName(); - if (XML_DESIGNER_OPEN_DATE.equals(name)) { - this.designerOpenDate = reader.getElementValue(); - } else if (XML_TEMPLATE_INFO_LIST.equals(name)) { - readTemplateInfoList(reader); - } - } catch (Exception ex) { - // 什么也不做,使用默认值 - } - } - } - - private void readTemplateInfoList(XMLableReader reader) { - reader.readXMLObject(new XMLReadable() { - public void readXML(XMLableReader reader) { - if (XML_TEMPLATE_INFO.equals(reader.getTagName())) { - TemplateInfo templateInfo = new TemplateInfo(); - reader.readXMLObject(templateInfo); - templateInfoList.put(templateInfo.getTemplateID(), templateInfo.getTemplateInfo()); - } - } - }); - } - - @Override - public void writeXML(XMLPrintWriter writer) { - writer.startTAG("TplInfo"); - - writer.startTAG(XML_DESIGNER_OPEN_DATE); - writer.textNode(designerOpenDate); - writer.end(); - - writeTemplateInfoList(writer); - - writer.end(); - } - - private void writeTemplateInfoList(XMLPrintWriter writer) { - //启停 - writer.startTAG(XML_TEMPLATE_INFO_LIST); - for (String templateID : templateInfoList.keySet()) { - new TemplateInfo(templateInfoList.get(templateID)).writeXML(writer); - } - writer.end(); - } - - private class TemplateInfo implements XMLReadable, XMLWriter { - - private int dayCount; - private String templateID; - private HashMap processMap = new HashMap<>(); - private HashMap consumingMap = new HashMap<>(); - - @SuppressWarnings("unchecked") - public TemplateInfo(HashMap templateInfo) { - this.dayCount = (int) templateInfo.get(ATTR_DAY_COUNT); - this.processMap = (HashMap) templateInfo.get(XML_PROCESS_MAP); - this.consumingMap = (HashMap) templateInfo.get(XML_CONSUMING_MAP); - this.templateID = (String) processMap.get(ATTR_TEMPLATE_ID); - } - - public TemplateInfo() { - } - - public String getTemplateID() { - return templateID; - } - - public HashMap getTemplateInfo() { - HashMap templateInfo = new HashMap<>(); - templateInfo.put(XML_PROCESS_MAP, processMap); - templateInfo.put(XML_CONSUMING_MAP, consumingMap); - templateInfo.put(ATTR_DAY_COUNT, dayCount); - return templateInfo; - } - - public void writeXML(XMLPrintWriter writer) { - writer.startTAG(XML_TEMPLATE_INFO); - if (StringUtils.isNotEmpty(templateID)) { - writer.attr(ATTR_TEMPLATE_ID, this.templateID); - } - if (dayCount >= 0) { - writer.attr(ATTR_DAY_COUNT, this.dayCount); - } - writeProcessMap(writer); - writeConsumingMap(writer); - - writer.end(); - } - - private void writeProcessMap(XMLPrintWriter writer) { - writer.startTAG(XML_PROCESS_MAP); - writer.attr(ATTR_PROCESS, (String) processMap.get(ATTR_PROCESS)); - writer.attr(ATTR_FLOAT_COUNT, (int) processMap.get(ATTR_FLOAT_COUNT)); - writer.attr(ATTR_WIDGET_COUNT, (int) processMap.get(ATTR_WIDGET_COUNT)); - writer.attr(ATTR_CELL_COUNT, (int) processMap.get(ATTR_CELL_COUNT)); - writer.attr(ATTR_BLOCK_COUNT, (int) processMap.get(ATTR_BLOCK_COUNT)); - writer.attr(ATTR_REPORT_TYPE, (int) processMap.get(ATTR_REPORT_TYPE)); - writer.end(); - } - - private void writeConsumingMap(XMLPrintWriter writer) { - writer.startTAG(XML_CONSUMING_MAP); - writer.attr(ATTR_ACTIVITYKEY, (String) consumingMap.get(ATTR_ACTIVITYKEY)); - writer.attr(ATTR_JAR_TIME, (String) consumingMap.get(ATTR_JAR_TIME)); - writer.attr(ATTR_CREATE_TIME, (String) consumingMap.get(ATTR_CREATE_TIME)); - writer.attr(ATTR_UUID, (String) consumingMap.get(ATTR_UUID)); - writer.attr(ATTR_TIME_CONSUME, (long) consumingMap.get(ATTR_TIME_CONSUME)); - writer.attr(ATTR_VERSION, (String) consumingMap.get(ATTR_VERSION)); - writer.attr(ATTR_USERNAME, (String) consumingMap.get(ATTR_USERNAME)); - writer.end(); - } - - public void readXML(XMLableReader reader) { - if (!reader.isChildNode()) { - dayCount = reader.getAttrAsInt(ATTR_DAY_COUNT, 0); - templateID = reader.getAttrAsString(ATTR_TEMPLATE_ID, StringUtils.EMPTY); - } else { - try { - String name = reader.getTagName(); - if (XML_PROCESS_MAP.equals(name)) { - processMap.put(ATTR_PROCESS, reader.getAttrAsString(ATTR_PROCESS, StringUtils.EMPTY)); - processMap.put(ATTR_FLOAT_COUNT, reader.getAttrAsInt(ATTR_FLOAT_COUNT, 0)); - processMap.put(ATTR_WIDGET_COUNT, reader.getAttrAsInt(ATTR_WIDGET_COUNT, 0)); - processMap.put(ATTR_CELL_COUNT, reader.getAttrAsInt(ATTR_CELL_COUNT, 0)); - processMap.put(ATTR_BLOCK_COUNT, reader.getAttrAsInt(ATTR_BLOCK_COUNT, 0)); - processMap.put(ATTR_REPORT_TYPE, reader.getAttrAsInt(ATTR_REPORT_TYPE, 0)); - processMap.put(ATTR_TEMPLATE_ID, templateID); - } else if (XML_CONSUMING_MAP.equals(name)) { - consumingMap.put(ATTR_ACTIVITYKEY, reader.getAttrAsString(ATTR_ACTIVITYKEY, StringUtils.EMPTY)); - consumingMap.put(ATTR_JAR_TIME, reader.getAttrAsString(ATTR_JAR_TIME, StringUtils.EMPTY)); - consumingMap.put(ATTR_CREATE_TIME, reader.getAttrAsString(ATTR_CREATE_TIME, StringUtils.EMPTY)); - consumingMap.put(ATTR_TEMPLATE_ID, templateID); - consumingMap.put(ATTR_UUID, reader.getAttrAsString(ATTR_UUID, StringUtils.EMPTY)); - consumingMap.put(ATTR_TIME_CONSUME, reader.getAttrAsLong(ATTR_TIME_CONSUME, 0)); - consumingMap.put(ATTR_VERSION, reader.getAttrAsString(ATTR_VERSION, "8.0")); - consumingMap.put(ATTR_USERNAME, reader.getAttrAsString(ATTR_USERNAME, StringUtils.EMPTY)); - } - } catch (Exception ex) { - // 什么也不做,使用默认值 - } - } - } - - } -} diff --git a/designer-base/src/main/resources/com/fr/aspectj/designerbase/TemplateProcessTracker.aj b/designer-base/src/main/resources/com/fr/aspectj/designerbase/TemplateProcessTracker.aj deleted file mode 100644 index 1ab23100b1..0000000000 --- a/designer-base/src/main/resources/com/fr/aspectj/designerbase/TemplateProcessTracker.aj +++ /dev/null @@ -1,58 +0,0 @@ -package com.fr.aspectj.designerbase; - -/** - * 记录模板过程 - * Created by plough on 2017/3/3. - */ - -import org.aspectj.lang.reflect.SourceLocation; - -import java.awt.event.ActionEvent; -import java.awt.event.MouseEvent; - -public aspect TemplateProcessTracker { - //声明一个pointcut,匹配你需要的方法 - pointcut onMouseClicked(MouseEvent e): - execution(* mouseClicked(MouseEvent)) && args(e); - pointcut onMousePressed(MouseEvent e): - execution(* mousePressed(MouseEvent)) && args(e); - pointcut onMouseReleased(MouseEvent e): - execution(* mouseReleased(MouseEvent)) && args(e); - pointcut onActionPerformed(ActionEvent e): - execution(* actionPerformed(ActionEvent)) && args(e); - pointcut onSetValueAt(Object v, int r, int c): - execution(* setValueAt(java.lang.Object, int, int)) && args(v, r, c); - - //before表示之前的意思 - //这整个表示在MouseAdapter的public void mouseXXX(MouseEvent)方法调用之前,你想要执行的代码 - before(MouseEvent e): onMouseClicked(e) || onMousePressed(e) || onMouseReleased(e) { - SourceLocation sl = thisJoinPoint.getSourceLocation();//切面对应的代码位置 - - //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); - String log = ""; - //TemplateInfoCollector.appendProcess(log); - } - //同上 - before(ActionEvent e): onActionPerformed(e) { - SourceLocation sl = thisJoinPoint.getSourceLocation(); - // !within(LogHandlerBar) 没用, 手动过滤 - if (e != null && e.getSource().toString().contains("javax.swing.Timer")) { - return; - } - - //String log = String.format("%s:\n%s\n%s\n%s\n\n", new Date(), sl, e, e.getSource()); - String log = ""; - //TemplateInfoCollector.appendProcess(log); - - } - //同上 - before(Object v, int r, int c): onSetValueAt(v, r, c) { - SourceLocation sl = thisJoinPoint.getSourceLocation(); - - //String log getSourceLocation= String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); - String log = ""; - // TemplateInfoCollector.appendProcess(log); - } - - -} diff --git a/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoCollectorTest.java b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoCollectorTest.java new file mode 100644 index 0000000000..eb9aa23468 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoCollectorTest.java @@ -0,0 +1,153 @@ +package com.fr.design.mainframe.template.info; + +import com.fr.config.MarketConfig; +import com.fr.general.GeneralUtils; +import com.fr.invoke.Reflect; +import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; +import com.fr.third.org.apache.commons.io.FileUtils; +import org.easymock.EasyMock; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.api.easymock.PowerMock; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.File; +import java.io.IOException; +import java.util.Map; + +import static com.fr.design.mainframe.template.info.TemplateInfoTestHelper.assertJsonStringEquals; +import static com.fr.design.mainframe.template.info.TemplateInfoTestHelper.setUpMockForNewInstance; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +/** + * Created by plough on 2019/4/18. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({ProductConstants.class, MarketConfig.class, ProductConstants.class, GeneralUtils.class}) +public class TemplateInfoCollectorTest { + private String filePath; + private String initialFileContent; + private TemplateProcessInfo mockProcessInfo; + + @Before + public void setUp() throws IOException { + PowerMock.mockStatic(ProductConstants.class); + + filePath = getClass().getResource("tpl.info").getPath(); + String dirPath = filePath.substring(0, filePath.indexOf("tpl.info")); + EasyMock.expect(ProductConstants.getEnvHome()).andReturn(dirPath).anyTimes(); + EasyMock.replay(); + PowerMock.replayAll(); + + mockProcessInfo = EasyMock.mock(TemplateProcessInfo.class); + EasyMock.expect(mockProcessInfo.getBlockCount()).andReturn(3).anyTimes(); + EasyMock.expect(mockProcessInfo.getCellCount()).andReturn(13).anyTimes(); + EasyMock.expect(mockProcessInfo.getFloatCount()).andReturn(1).anyTimes(); + EasyMock.expect(mockProcessInfo.getReportType()).andReturn(0).anyTimes(); + EasyMock.expect(mockProcessInfo.getWidgetCount()).andReturn(0).anyTimes(); + EasyMock.replay(mockProcessInfo); + + // 缓存 tpl.info + initialFileContent = FileUtils.readFileToString(new File(filePath), "utf-8"); + + Reflect.on(TemplateInfoCollector.class).set("instance", null); + } + + @After + public void tearDown() throws IOException { + // 恢复 tpl.info + FileUtils.writeStringToFile(new File(filePath), initialFileContent, "utf-8"); + } + + @Test + public void testReadXML() { + TemplateInfoCollector collector = TemplateInfoCollector.getInstance(); + assertEquals("2019-04-18", Reflect.on(collector).field("designerOpenDate").get()); + assertEquals(7, ((Map) Reflect.on(collector).field("templateInfoMap").get()).size()); + } + + @Test + public void testCollectInfo() { + TemplateInfoCollector collector = TemplateInfoCollector.getInstance(); + + String templateID = "16a988ce-8529-42f5-b17c-2ee849355071"; + int timeConsume = 200; + + collector.collectInfo(templateID, StringUtils.EMPTY, mockProcessInfo, timeConsume); + + // 检查是否写入成功 + collector.loadFromFile(); + TemplateInfo templateInfo = collector.getOrCreateTemplateInfoByID(templateID); + + assertJsonStringEquals("{\"process\":\"\",\"float_count\":1,\"widget_count\":0," + + "\"cell_count\":13,\"block_count\":3,\"report_type\":0," + + "\"templateID\":\"16a988ce-8529-42f5-b17c-2ee849355071\"}",templateInfo.getProcessMapJsonString()); + + assertJsonStringEquals("{\"activitykey\":\"2e0ea413-fa9c241e0-9723-4354fce51e81\"," + + "\"jar_time\":\"不是安装版本\",\"create_time\":\"2019-03-26 16:13\"," + + "\"templateID\":\"16a988ce-8529-42f5-b17c-2ee849355071\",\"originID\":\"\"," + + "\"uuid\":\"476ca2cc-f789-4c5d-8e89-ef146580775c\",\"time_consume\":329,\"originTime\":0," + + "\"version\":\"10.0\",\"username\":\"plough\"}", templateInfo.getConsumingMapJsonString()); + } + + @Test + public void testCollectInfoForNewTemplate() throws Exception { + setUpMockForNewInstance(); + + TemplateInfoCollector collector = TemplateInfoCollector.getInstance(); + + String templateID = "73a97777-8jnk-47cd-b57c-2ee89991279796"; + int timeConsume = 200; + + collector.collectInfo(templateID, StringUtils.EMPTY, mockProcessInfo, timeConsume); + + // 检查是否写入成功 + collector.loadFromFile(); + assertTrue(collector.contains(templateID)); + + TemplateInfo templateInfo = collector.getOrCreateTemplateInfoByID(templateID); + assertEquals(templateID, templateInfo.getTemplateID()); + + assertJsonStringEquals("{\"process\":\"\",\"float_count\":1,\"widget_count\":0," + + "\"cell_count\":13,\"block_count\":3,\"report_type\":0," + + "\"templateID\":\"73a97777-8jnk-47cd-b57c-2ee89991279796\"}",templateInfo.getProcessMapJsonString()); + + Map consumingMap = Reflect.on(templateInfo).field("consumingMap").get(); + assertEquals(templateID, consumingMap.get("templateID")); + assertEquals(StringUtils.EMPTY, consumingMap.get("originID")); + assertEquals(200, consumingMap.get("time_consume")); + assertEquals(0, consumingMap.get("originTime")); + } + + @Test + public void testCollectInfoWhenSaveAs() throws Exception { + setUpMockForNewInstance(); + + TemplateInfoCollector collector = TemplateInfoCollector.getInstance(); + + String templateID = "423238d4-5223-22vj-vlsj-42jc49245iw3"; + String originID = "16a988ce-8529-42f5-b17c-2ee849355071"; + int timeConsume = 200; + + collector.collectInfo(templateID, originID, mockProcessInfo, timeConsume); + + // 检查是否写入成功 + collector.loadFromFile(); + TemplateInfo templateInfo = collector.getOrCreateTemplateInfoByID(templateID); + + assertJsonStringEquals("{\"process\":\"\",\"float_count\":1,\"widget_count\":0," + + "\"cell_count\":13,\"block_count\":3,\"report_type\":0," + + "\"templateID\":\"423238d4-5223-22vj-vlsj-42jc49245iw3\"}", templateInfo.getProcessMapJsonString()); + + Map consumingMap = Reflect.on(templateInfo).field("consumingMap").get(); + assertEquals(templateID, consumingMap.get("templateID")); + assertEquals(originID, consumingMap.get("originID")); + assertEquals(329, consumingMap.get("time_consume")); + assertEquals(129, consumingMap.get("originTime")); + } +} diff --git a/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTest.java b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTest.java new file mode 100644 index 0000000000..19f6066ff8 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTest.java @@ -0,0 +1,125 @@ +package com.fr.design.mainframe.template.info; + +import com.fr.config.MarketConfig; +import com.fr.general.GeneralUtils; +import com.fr.invoke.Reflect; +import com.fr.stable.ProductConstants; +import com.fr.stable.StringUtils; +import com.fr.stable.xml.XMLableReader; +import com.fr.third.javax.xml.stream.XMLStreamException; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.io.StringReader; +import java.util.Map; + +import static com.fr.design.mainframe.template.info.TemplateInfoTestHelper.assertJsonStringEquals; +import static com.fr.design.mainframe.template.info.TemplateInfoTestHelper.setUpMockForNewInstance; +import static org.junit.Assert.assertEquals; + +/** + * Created by plough on 2019/4/19. + */ +@RunWith(PowerMockRunner.class) +@PrepareForTest({MarketConfig.class, ProductConstants.class, GeneralUtils.class}) +public class TemplateInfoTest { + + private static final String NORMAL_INFO = "\n" + + "\n" + + "\n" + + ""; + + private static final String SAVE_AS_INFO = "\n" + + "\n" + + "\n" + + ""; + + private TemplateInfo templateInfo; + private TemplateInfo templateInfoSaveAs; // 另存为的模版记录 + + @Before + public void setUp() throws XMLStreamException { + templateInfo = createTemplateInfo(NORMAL_INFO); + templateInfoSaveAs = createTemplateInfo(SAVE_AS_INFO); + } + + @Test + public void testNewInstance() throws Exception { + setUpMockForNewInstance(); + + String templateID = "24avc8n2-1iq8-iuj2-wx24-8yy0i8132302"; + TemplateInfo templateInfo = TemplateInfo.newInstance(templateID); + assertEquals(templateID, templateInfo.getTemplateID()); + assertEquals(StringUtils.EMPTY, Reflect.on(templateInfo).field("originID").get()); + assertEquals(0, Reflect.on(templateInfo).field("idleDayCount").get()); + assertEquals("{}", templateInfo.getProcessMapJsonString()); + + Map consumingMap = Reflect.on(templateInfo).field("consumingMap").get(); + assertEquals(templateID, consumingMap.get("templateID")); + assertEquals(0, consumingMap.get("originTime")); + assertEquals(StringUtils.EMPTY, consumingMap.get("originID")); + assertEquals(0, consumingMap.get("time_consume")); + assertEquals("不是安装版本", consumingMap.get("jar_time")); + assertEquals("plough", consumingMap.get("username")); + assertEquals("10.0", consumingMap.get("version")); + } + + @Test + public void testNewInstanceWithMoreArgs() throws Exception { + setUpMockForNewInstance(); + + String templateID = "24121212-u2c8-ncd2-82nx-8ud0i8138888"; + String originID = "24avc8n2-1iq8-iuj2-wx24-8yy0i8132302"; + int originTime = 100; + TemplateInfo templateInfo = TemplateInfo.newInstance(templateID, originID, originTime); + assertEquals(templateID, templateInfo.getTemplateID()); + assertEquals(originID, Reflect.on(templateInfo).field("originID").get()); + assertEquals(0, Reflect.on(templateInfo).field("idleDayCount").get()); + assertEquals("{}", templateInfo.getProcessMapJsonString()); + + Map consumingMap = Reflect.on(templateInfo).field("consumingMap").get(); + assertEquals(templateID, consumingMap.get("templateID")); + assertEquals(originTime, consumingMap.get("originTime")); + assertEquals(originID, consumingMap.get("originID")); + assertEquals(originTime, consumingMap.get("time_consume")); + assertEquals("不是安装版本", consumingMap.get("jar_time")); + assertEquals("plough", consumingMap.get("username")); + assertEquals("10.0", consumingMap.get("version")); + } + + @Test + public void testGetTemplateID() { + assertEquals("16a988ce-8529-42f5-b17c-2ee849355071", templateInfo.getTemplateID()); + assertEquals("49avd2c4-1104-92j2-wx24-3dd0k2136080", templateInfoSaveAs.getTemplateID()); + } + + @Test + public void testGetConsumingMapJsonString() { + assertJsonStringEquals("{\"activitykey\":\"2e0ea413-fa9c241e0-9723-4354fce51e81\",\"jar_time\":\"不是安装版本\"," + + "\"create_time\":\"2019-03-26 16:13\",\"templateID\":\"16a988ce-8529-42f5-b17c-2ee849355071\",\"originID\":\"\"," + + "\"uuid\":\"476ca2cc-f789-4c5d-8e89-ef146580775c\",\"time_consume\":129,\"originTime\":0,\"version\":\"10.0\"," + + "\"username\":\"plough\"}", templateInfo.getConsumingMapJsonString()); + + assertJsonStringEquals("{\"activitykey\":\"2e0ea413-fa9c241e0-9723-4354fce51e81\",\"jar_time\":\"不是安装版本\"," + + "\"create_time\":\"2019-03-26 16:13\",\"templateID\":\"49avd2c4-1104-92j2-wx24-3dd0k2136080\",\"originID\":\"16a988ce-8529-42f5-b17c-2ee849355071\"," + + "\"uuid\":\"476ca2cc-f789-4c5d-8e89-ef146580775c\",\"time_consume\":429,\"originTime\":129,\"version\":\"10.0\"," + + "\"username\":\"plough\"}", templateInfoSaveAs.getConsumingMapJsonString()); + } + + @Test + public void testGetProcessMapJsonString() { + assertJsonStringEquals("{\"process\":\"\",\"float_count\":0,\"widget_count\":0,\"cell_count\":1," + + "\"block_count\":0,\"report_type\":0,\"templateID\":\"16a988ce-8529-42f5-b17c-2ee849355071\"}", templateInfo.getProcessMapJsonString()); + assertJsonStringEquals("{\"process\":\"\",\"float_count\":0,\"widget_count\":0,\"cell_count\":1," + + "\"block_count\":0,\"report_type\":0,\"templateID\":\"49avd2c4-1104-92j2-wx24-3dd0k2136080\"}", templateInfoSaveAs.getProcessMapJsonString()); + } + + private TemplateInfo createTemplateInfo(String xmlContent) throws XMLStreamException { + StringReader sr = new StringReader(xmlContent); + XMLableReader xmlReader = XMLableReader.createXMLableReader(sr); + return TemplateInfo.newInstanceByRead(xmlReader); + } +} diff --git a/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTestHelper.java b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTestHelper.java new file mode 100644 index 0000000000..be2b589892 --- /dev/null +++ b/designer-base/src/test/java/com/fr/design/mainframe/template/info/TemplateInfoTestHelper.java @@ -0,0 +1,49 @@ +package com.fr.design.mainframe.template.info; + +import com.fr.config.MarketConfig; +import com.fr.general.ComparatorUtils; +import com.fr.general.GeneralUtils; +import com.fr.json.JSONObject; +import com.fr.stable.ProductConstants; +import org.easymock.EasyMock; +import org.powermock.api.easymock.PowerMock; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +import static org.junit.Assert.assertTrue; + +/** + * Created by plough on 2019/4/19. + */ +class TemplateInfoTestHelper { + static void assertJsonStringEquals(String jo1, String jo2) { + // HashMap 是无序的,所以不能直接比较它生成的 json 字符串 + assertTrue(ComparatorUtils.equals(new JSONObject(jo1), new JSONObject(jo2))); + } + + private static void setFinalStatic(Field field, Object newValue) throws Exception { + field.setAccessible(true); + // remove final modifier from field + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, newValue); + } + + static void setUpMockForNewInstance() throws Exception { + MarketConfig mockMarketConfig = EasyMock.mock(MarketConfig.class); + EasyMock.expect(mockMarketConfig.getBbsUsername()).andReturn("plough").anyTimes(); + + PowerMock.mockStatic(MarketConfig.class); + EasyMock.expect(MarketConfig.getInstance()).andReturn(mockMarketConfig).anyTimes(); + + PowerMock.mockStatic(GeneralUtils.class); + EasyMock.expect(GeneralUtils.readBuildNO()).andReturn("不是安装版本").anyTimes(); + + setFinalStatic(ProductConstants.class.getDeclaredField("VERSION"), "10.0"); + + EasyMock.replay(mockMarketConfig); + PowerMock.replayAll(); + } +} diff --git a/designer-base/src/test/resources/com/fr/design/mainframe/template/info/tpl.info b/designer-base/src/test/resources/com/fr/design/mainframe/template/info/tpl.info new file mode 100644 index 0000000000..39bec00067 --- /dev/null +++ b/designer-base/src/test/resources/com/fr/design/mainframe/template/info/tpl.info @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/designer-chart/src/main/resources/com/fr/aspectj/designerchart/TemplateProcessTracker.aj b/designer-chart/src/main/resources/com/fr/aspectj/designerchart/TemplateProcessTracker.aj index 89ed91033f..a2d2fb7b48 100644 --- a/designer-chart/src/main/resources/com/fr/aspectj/designerchart/TemplateProcessTracker.aj +++ b/designer-chart/src/main/resources/com/fr/aspectj/designerchart/TemplateProcessTracker.aj @@ -4,13 +4,10 @@ package com.fr.aspectj.designerchart; * Created by plough on 2017/3/3. */ import com.fr.chart.chartattr.Chart; -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import org.aspectj.lang.reflect.SourceLocation; -import javax.swing.event.ListSelectionEvent; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; -import java.util.Date; public aspect TemplateProcessTracker { //声明一个pointcut,匹配你需要的方法 diff --git a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java index d25ba6feee..bcf761fac5 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/JForm.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/JForm.java @@ -37,8 +37,8 @@ import com.fr.design.gui.xpane.FormHyperlinkGroupPaneNoPop; import com.fr.design.layout.FRGUIPaneFactory; import com.fr.design.mainframe.form.FormECCompositeProvider; import com.fr.design.mainframe.form.FormECDesignerProvider; -import com.fr.design.mainframe.templateinfo.JFormProcessInfo; -import com.fr.design.mainframe.templateinfo.TemplateProcessInfo; +import com.fr.design.mainframe.template.info.JFormProcessInfo; +import com.fr.design.mainframe.template.info.TemplateProcessInfo; import com.fr.design.mainframe.toolbar.ToolBarMenuDock; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.menu.KeySetUtils; diff --git a/designer-form/src/main/java/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java b/designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java similarity index 95% rename from designer-form/src/main/java/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java rename to designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java index 15f501b138..fce5ab8090 100644 --- a/designer-form/src/main/java/com/fr/design/mainframe/templateinfo/JFormProcessInfo.java +++ b/designer-form/src/main/java/com/fr/design/mainframe/template/info/JFormProcessInfo.java @@ -1,4 +1,4 @@ -package com.fr.design.mainframe.templateinfo; +package com.fr.design.mainframe.template.info; import com.fr.form.main.Form; import com.fr.form.ui.container.WLayout; diff --git a/designer-form/src/main/resources/com/fr/aspectj/designerform/TemplateProcessTracker.aj b/designer-form/src/main/resources/com/fr/aspectj/designerform/TemplateProcessTracker.aj index 3be1a77fa7..9daec50091 100644 --- a/designer-form/src/main/resources/com/fr/aspectj/designerform/TemplateProcessTracker.aj +++ b/designer-form/src/main/resources/com/fr/aspectj/designerform/TemplateProcessTracker.aj @@ -3,12 +3,10 @@ package com.fr.aspectj.designerform; /** * Created by plough on 2017/3/3. */ -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import org.aspectj.lang.reflect.SourceLocation; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; -import java.util.Date; public aspect TemplateProcessTracker { //声明一个pointcut,匹配你需要的方法 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 7a3966c175..61f39b81db 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 @@ -8,7 +8,7 @@ import com.fr.config.MarketConfig; import com.fr.design.DesignerEnvManager; import com.fr.design.mainframe.errorinfo.ErrorInfoUploader; import com.fr.design.mainframe.messagecollect.impl.FocusPointMessageUploader; -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; +import com.fr.design.mainframe.template.info.TemplateInfoCollector; import com.fr.general.CloudCenter; import com.fr.general.ComparatorUtils; import com.fr.general.DateUtils; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java index 44becbd9cc..07136bc1ef 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/JWorkBook.java @@ -41,8 +41,8 @@ import com.fr.design.gui.ibutton.UIButton; import com.fr.design.gui.icontainer.UIModeControlContainer; import com.fr.design.gui.imenu.UIMenuItem; import com.fr.design.mainframe.cell.QuickEditorRegion; -import com.fr.design.mainframe.templateinfo.JWorkBookProcessInfo; -import com.fr.design.mainframe.templateinfo.TemplateProcessInfo; +import com.fr.design.mainframe.template.info.JWorkBookProcessInfo; +import com.fr.design.mainframe.template.info.TemplateProcessInfo; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.menu.KeySetUtils; import com.fr.design.menu.MenuDef; diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java index c8ecd93036..044a484b16 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/alphafine/component/AlphaFineDialog.java @@ -33,15 +33,12 @@ import com.fr.design.mainframe.alphafine.search.manager.impl.RecentSearchManager import com.fr.design.mainframe.alphafine.search.manager.impl.RecommendSearchManager; import com.fr.design.mainframe.alphafine.search.manager.impl.SegmentationManager; import com.fr.design.mainframe.alphafine.search.manager.impl.SimilarSearchManager; -import com.fr.design.mainframe.errorinfo.ErrorInfoUploader; -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.form.main.Form; import com.fr.form.main.FormIO; import com.fr.general.ComparatorUtils; import com.fr.general.http.HttpClient; import com.fr.io.TemplateWorkBookIO; import com.fr.io.exporter.ImageExporter; -import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.log.FineLoggerFactory; import com.fr.main.impl.WorkBook; @@ -958,8 +955,6 @@ public class AlphaFineDialog extends UIDialog { RecentSearchManager searchManager = RecentSearchManager.getInstance(); searchManager.addModel(storeText, cellModel); sendDataToServer(storeText, cellModel); - TemplateInfoCollector.getInstance().sendTemplateInfo(); - ErrorInfoUploader.getInstance().sendErrorInfo(); } } }); diff --git a/designer-realize/src/main/java/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java b/designer-realize/src/main/java/com/fr/design/mainframe/template/info/JWorkBookProcessInfo.java similarity index 98% rename from designer-realize/src/main/java/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java rename to designer-realize/src/main/java/com/fr/design/mainframe/template/info/JWorkBookProcessInfo.java index 306c6b0d11..eec7773282 100644 --- a/designer-realize/src/main/java/com/fr/design/mainframe/templateinfo/JWorkBookProcessInfo.java +++ b/designer-realize/src/main/java/com/fr/design/mainframe/template/info/JWorkBookProcessInfo.java @@ -1,4 +1,4 @@ -package com.fr.design.mainframe.templateinfo; +package com.fr.design.mainframe.template.info; import com.fr.base.parameter.ParameterUI; import com.fr.main.impl.WorkBook; diff --git a/designer-realize/src/main/java/com/fr/start/Designer.java b/designer-realize/src/main/java/com/fr/start/Designer.java index b66ba090ca..15098ce2d5 100644 --- a/designer-realize/src/main/java/com/fr/start/Designer.java +++ b/designer-realize/src/main/java/com/fr/start/Designer.java @@ -29,7 +29,7 @@ import com.fr.design.mainframe.JWorkBook; import com.fr.design.mainframe.alphafine.component.AlphaFinePane; import com.fr.design.mainframe.bbs.UserInfoLabel; import com.fr.design.mainframe.bbs.UserInfoPane; -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; +import com.fr.design.mainframe.template.info.TemplateInfoCollector; import com.fr.design.mainframe.toolbar.ToolBarMenuDockPlus; import com.fr.design.mainframe.toolbar.VcsConfig; import com.fr.design.mainframe.vcs.proxy.VcsCacheFileNodeFileProxy; diff --git a/designer-realize/src/main/resources/com/fr/aspectj/designer/TemplateProcessTracker.aj b/designer-realize/src/main/resources/com/fr/aspectj/designer/TemplateProcessTracker.aj index 8e4eeb7164..2c54338186 100644 --- a/designer-realize/src/main/resources/com/fr/aspectj/designer/TemplateProcessTracker.aj +++ b/designer-realize/src/main/resources/com/fr/aspectj/designer/TemplateProcessTracker.aj @@ -5,13 +5,11 @@ package com.fr.aspectj.designer; * Created by plough on 2017/3/3. */ -import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.grid.Grid; import org.aspectj.lang.reflect.SourceLocation; import java.awt.event.ActionEvent; import java.awt.event.MouseEvent; -import java.util.Date; public aspect TemplateProcessTracker { //声明一个pointcut,匹配你需要的方法