forked from fanruan/design
Browse Source
* commit '47fe2434180fab8f939e05a140640bd21d2da0f1': 调整代码 调整代码 REPORT-1916 做模板的过程和耗时收集=》把统计格子数量的功能分离为单独的类;调整代码 REPORT-1916 做模板的过程和耗时收集=》若未加入产品改良计划,则不收集本地数据 REPORT-1916 做模板的过程和耗时收集=》把 reportletsid 改成 templateID REPORT-1916 做模板的过程和耗时收集=》上传数据前,判断是否为测试模板 REPORT-1916 做模板的过程和耗时收集=》调整代码 REPORT-1916 做模板的过程和耗时收集=》上传模板数据前,判断模板是否完成 REPORT-1916 做模板的过程和耗时收集=》重构代码,将process和consuming分离,暂时不记录模板过程 REPORT-1916 做模板的过程和耗时收集=》修改获取单元格编辑信息的方式 REPORT-1916 做模板的过程和耗时收集=》完成所有信息的本地存取 REPORT-1916 做模板的过程和耗时收集=》完成基本信息的本地存取master
superman
8 years ago
14 changed files with 787 additions and 6 deletions
@ -0,0 +1,73 @@ |
|||||||
|
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,匹配你需要的方法 |
||||||
|
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); |
||||||
|
pointcut onSetValue4EditingElement(Grid g, Object v) : |
||||||
|
call(* setValue4EditingElement(java.lang.Object)) && target(g) && args(v); |
||||||
|
|
||||||
|
//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.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 = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); |
||||||
|
String log = ""; |
||||||
|
TemplateInfoCollector.appendProcess(log); |
||||||
|
|
||||||
|
} |
||||||
|
//同上 |
||||||
|
before(Grid g, Object v) : onSetValue4EditingElement(g, v) { |
||||||
|
SourceLocation sl = thisJoinPoint.getSourceLocation(); |
||||||
|
|
||||||
|
// String v = "test"; |
||||||
|
//String log = String.format("%s:\n%s\nset value: %s at %s\n\n", new Date(), sl, v, g.getEditingCellElement()); |
||||||
|
String log = ""; |
||||||
|
TemplateInfoCollector.appendProcess(log); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,60 @@ |
|||||||
|
package com.fr.aspectj.designerbase; |
||||||
|
|
||||||
|
/** |
||||||
|
* 记录模板过程 |
||||||
|
* 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,匹配你需要的方法 |
||||||
|
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.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 = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); |
||||||
|
String log = ""; |
||||||
|
TemplateInfoCollector.appendProcess(log); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
@ -0,0 +1,42 @@ |
|||||||
|
package com.fr.design.mainframe.templateinfo; |
||||||
|
|
||||||
|
import com.fr.form.main.Form; |
||||||
|
import com.fr.form.ui.container.WFitLayout; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2017/3/17. |
||||||
|
*/ |
||||||
|
public class JFormProcessInfo extends TemplateProcessInfo<Form> { |
||||||
|
public JFormProcessInfo(Form form) { |
||||||
|
super(form); |
||||||
|
} |
||||||
|
|
||||||
|
// 获取模板类型
|
||||||
|
public int getReportType() { |
||||||
|
return 2; |
||||||
|
} |
||||||
|
|
||||||
|
// 获取模板格子数
|
||||||
|
public int getCellCount() { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
// 获取模板悬浮元素个数
|
||||||
|
public int getFloatCount() { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
// 获取模板聚合块个数
|
||||||
|
public int getBlockCount() { |
||||||
|
return 0; |
||||||
|
} |
||||||
|
// 获取模板控件数
|
||||||
|
public int getWidgetCount() { |
||||||
|
int widgetCount = 0; |
||||||
|
for (int i = 0; i < template.getContainer().getWidgetCount(); i++) { |
||||||
|
WFitLayout wf = (WFitLayout) template.getContainer().getWidget(i); |
||||||
|
widgetCount += wf.getWidgetCount(); |
||||||
|
} |
||||||
|
int a = 1; |
||||||
|
int b = 2; |
||||||
|
return widgetCount; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,75 @@ |
|||||||
|
package com.fr.design.mainframe.templateinfo; |
||||||
|
|
||||||
|
import com.fr.base.io.IOFile; |
||||||
|
import com.fr.base.parameter.ParameterUI; |
||||||
|
import com.fr.main.impl.WorkBook; |
||||||
|
import com.fr.report.cellcase.CellCase; |
||||||
|
import com.fr.report.poly.PolyWorkSheet; |
||||||
|
import com.fr.report.worksheet.WorkSheet; |
||||||
|
|
||||||
|
import java.util.Iterator; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2017/3/17. |
||||||
|
*/ |
||||||
|
public class JWorkBookProcessInfo extends TemplateProcessInfo<WorkBook> { |
||||||
|
|
||||||
|
public JWorkBookProcessInfo(WorkBook wb) { |
||||||
|
super(wb); |
||||||
|
} |
||||||
|
|
||||||
|
// 获取模板类型
|
||||||
|
public int getReportType() { |
||||||
|
return template.isElementCaseBook() ? 0 : 1; |
||||||
|
} |
||||||
|
|
||||||
|
// 获取模板格子数
|
||||||
|
public int getCellCount() { |
||||||
|
int cellCount = 0; |
||||||
|
if (template.isElementCaseBook()) { // 如果是普通报表
|
||||||
|
for (int i = 0; i < template.getReportCount(); i++) { |
||||||
|
WorkSheet r = (WorkSheet) template.getReport(i); |
||||||
|
CellCase cc = r.getBlock().getCellCase(); |
||||||
|
for (int j = 0; j < cc.getRowCount(); j++) { |
||||||
|
Iterator iter = cc.getRow(j); |
||||||
|
while (iter.hasNext()) { |
||||||
|
cellCount ++; |
||||||
|
iter.next(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return cellCount; |
||||||
|
} |
||||||
|
// 获取模板悬浮元素个数
|
||||||
|
public int getFloatCount() { |
||||||
|
int chartCount = 0; |
||||||
|
if (template.isElementCaseBook()) { // 如果是普通报表
|
||||||
|
for (int i = 0; i < template.getReportCount(); i++) { |
||||||
|
WorkSheet r = (WorkSheet) template.getReport(i); |
||||||
|
Iterator fiter = r.getBlock().floatIterator(); |
||||||
|
while (fiter.hasNext()) { |
||||||
|
chartCount ++; |
||||||
|
fiter.next(); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
return chartCount; |
||||||
|
} |
||||||
|
// 获取模板聚合块个数
|
||||||
|
public int getBlockCount() { |
||||||
|
int blockCount = 0; |
||||||
|
if (!template.isElementCaseBook()) { // 如果是聚合报表
|
||||||
|
for (int i = 0; i < template.getReportCount(); i++) { |
||||||
|
PolyWorkSheet r = (PolyWorkSheet) template.getReport(i); |
||||||
|
blockCount += r.getBlockCount(); |
||||||
|
} |
||||||
|
} |
||||||
|
return blockCount; |
||||||
|
} |
||||||
|
// 获取模板控件数
|
||||||
|
public int getWidgetCount() { |
||||||
|
ParameterUI pui = template.getReportParameterAttr().getParameterUI(); |
||||||
|
return pui == null ? 0 : (pui.getAllWidgets().length - 1); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,309 @@ |
|||||||
|
package com.fr.design.mainframe.templateinfo; |
||||||
|
|
||||||
|
import com.fr.base.FRContext; |
||||||
|
import com.fr.base.io.IOFile; |
||||||
|
import com.fr.design.DesignerEnvManager; |
||||||
|
import com.fr.design.mainframe.DesignerContext; |
||||||
|
import com.fr.design.mainframe.JTemplate; |
||||||
|
import com.fr.general.ComparatorUtils; |
||||||
|
import com.fr.general.FRLogger; |
||||||
|
import com.fr.general.GeneralUtils; |
||||||
|
import com.fr.general.SiteCenter; |
||||||
|
import com.fr.general.http.HttpClient; |
||||||
|
import com.fr.stable.*; |
||||||
|
import org.json.JSONObject; |
||||||
|
|
||||||
|
import java.io.*; |
||||||
|
import java.text.SimpleDateFormat; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Calendar; |
||||||
|
import java.util.HashMap; |
||||||
|
|
||||||
|
/** |
||||||
|
* 做模板的过程和耗时收集,辅助类 |
||||||
|
* Created by plough on 2017/2/21. |
||||||
|
*/ |
||||||
|
public class TemplateInfoCollector<T extends IOFile> implements Serializable { |
||||||
|
private static final String FILE_NAME = "tplInfo.ser"; |
||||||
|
private static TemplateInfoCollector instance; |
||||||
|
private HashMap<String, HashMap<String, Object>> templateInfoList; |
||||||
|
private String designerOpenDate; //设计器最近一次打开日期
|
||||||
|
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; |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
private TemplateInfoCollector() { |
||||||
|
templateInfoList = new HashMap<>(); |
||||||
|
setDesignerOpenDate(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 把设计器最近打开日期设定为当前日期 |
||||||
|
*/ |
||||||
|
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 static File getInfoFile() { |
||||||
|
return new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FILE_NAME)); |
||||||
|
} |
||||||
|
|
||||||
|
public static TemplateInfoCollector getInstance() { |
||||||
|
if (instance == null) { |
||||||
|
// 先尝试从文件读取
|
||||||
|
try{ |
||||||
|
ObjectInputStream is = new ObjectInputStream(new FileInputStream(getInfoFile())); |
||||||
|
instance = (TemplateInfoCollector) is.readObject(); |
||||||
|
} catch (FileNotFoundException ex) { |
||||||
|
// 如果之前没有存储过,则创建新对象
|
||||||
|
instance = new TemplateInfoCollector(); |
||||||
|
} catch (Exception ex) { |
||||||
|
FRLogger.getLogger().error(ex.getMessage(), ex); |
||||||
|
} |
||||||
|
} |
||||||
|
return instance; |
||||||
|
} |
||||||
|
|
||||||
|
private static boolean shouldCollectInfo() { |
||||||
|
return DesignerEnvManager.getEnvManager().isJoinProductImprove() && FRContext.isChineseEnv(); |
||||||
|
} |
||||||
|
|
||||||
|
public static void appendProcess(String log) { |
||||||
|
if (!shouldCollectInfo()) { |
||||||
|
return; |
||||||
|
} |
||||||
|
// 获取当前编辑的模板
|
||||||
|
JTemplate jt = DesignerContext.getDesignerFrame().getSelectedJTemplate(); |
||||||
|
// 追加过程记录
|
||||||
|
jt.appendProcess(log); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 加载已经存储的模板过程 |
||||||
|
*/ |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public String loadProcess(T t) { |
||||||
|
HashMap<String, Object> processMap = (HashMap<String, Object>) templateInfoList.get(t.getTemplateID()).get("processMap"); |
||||||
|
return (String)processMap.get("process"); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 根据模板ID是否在收集列表中,判断是否需要收集当前模板的信息 |
||||||
|
*/ |
||||||
|
public boolean inList(T t) { |
||||||
|
return templateInfoList.containsKey(t.getTemplateID()); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 将包含所有信息的对象保存到文件 |
||||||
|
*/ |
||||||
|
private void saveInfo() { |
||||||
|
try { |
||||||
|
ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(getInfoFile())); |
||||||
|
FRLogger.getLogger().info("writing: " + instance.templateInfoList); |
||||||
|
os.writeObject(instance); |
||||||
|
os.close(); |
||||||
|
} catch (Exception ex) { |
||||||
|
FRLogger.getLogger().error(ex.getMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 更新 day_count:打开设计器却未编辑模板的连续日子 |
||||||
|
*/ |
||||||
|
private void addDayCount() { |
||||||
|
if (designerOpenFirstTime()) { |
||||||
|
for (String key : templateInfoList.keySet()) { |
||||||
|
HashMap<String, Object> templateInfo = templateInfoList.get(key); |
||||||
|
int dayCount = (int)templateInfo.get("day_count") + 1; |
||||||
|
templateInfo.put("day_count", dayCount); |
||||||
|
} |
||||||
|
setDesignerOpenDate(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 收集模板信息。如果之前没有记录,则新增;如果已有记录,则更新。 |
||||||
|
* 同时将最新数据保存到文件中。 |
||||||
|
*/ |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
public void collectInfo(T t, JTemplate jt, long openTime, long saveTime) { |
||||||
|
if (!shouldCollectInfo()) { |
||||||
|
return; |
||||||
|
} |
||||||
|
|
||||||
|
HashMap<String, Object> templateInfo; |
||||||
|
|
||||||
|
long timeConsume = ((saveTime - openTime) / ONE_THOUSAND); // 制作模板耗时(单位:s)
|
||||||
|
String templateID = t.getTemplateID(); |
||||||
|
|
||||||
|
if (inList(t)) { // 已有记录
|
||||||
|
templateInfo = templateInfoList.get(t.getTemplateID()); |
||||||
|
// 更新 conusmingMap
|
||||||
|
HashMap<String, Object> consumingMap = (HashMap<String, Object>) templateInfo.get("consumingMap"); |
||||||
|
timeConsume += (long)consumingMap.get("time_consume"); // 加上之前的累计编辑时间
|
||||||
|
consumingMap.put("time_consume", timeConsume); |
||||||
|
} |
||||||
|
else { // 新增
|
||||||
|
templateInfo = new HashMap<>(); |
||||||
|
templateInfo.put("consumingMap", getNewConsumingMap(templateID, openTime, timeConsume)); |
||||||
|
} |
||||||
|
|
||||||
|
// 直接覆盖 processMap
|
||||||
|
templateInfo.put("processMap", getProcessMap(templateID, jt)); |
||||||
|
|
||||||
|
// 保存模板时,让 day_count 归零
|
||||||
|
templateInfo.put("day_count", 0); |
||||||
|
|
||||||
|
|
||||||
|
templateInfoList.put(templateID, templateInfo); |
||||||
|
|
||||||
|
saveInfo(); // 每次更新之后,都同步到暂存文件中
|
||||||
|
} |
||||||
|
|
||||||
|
private HashMap<String, Object> getNewConsumingMap(String templateID, long openTime, long timeConsume) { |
||||||
|
HashMap<String, Object> consumingMap = new HashMap<>(); |
||||||
|
|
||||||
|
String username = DesignerEnvManager.getEnvManager().getBBSName(); |
||||||
|
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("username", username); |
||||||
|
consumingMap.put("uuid", uuid); |
||||||
|
consumingMap.put("activitykey", activitykey); |
||||||
|
consumingMap.put("templateID", templateID); |
||||||
|
consumingMap.put("create_time", createTime); |
||||||
|
consumingMap.put("time_consume", timeConsume); |
||||||
|
consumingMap.put("jar_time", jarTime); |
||||||
|
consumingMap.put("version", version); |
||||||
|
|
||||||
|
return consumingMap; |
||||||
|
} |
||||||
|
|
||||||
|
private HashMap<String, Object> getProcessMap(String templateID, JTemplate jt) { |
||||||
|
HashMap<String, Object> processMap = new HashMap<>(); |
||||||
|
|
||||||
|
processMap.put("templateID", templateID); |
||||||
|
processMap.put("process", jt.getProcess()); |
||||||
|
|
||||||
|
TemplateProcessInfo info = jt.getProcessInfo(); |
||||||
|
processMap.put("report_type", info.getReportType()); |
||||||
|
processMap.put("cell_count", info.getCellCount()); |
||||||
|
processMap.put("float_count", info.getFloatCount()); |
||||||
|
processMap.put("block_count", info.getBlockCount()); |
||||||
|
processMap.put("widget_count", info.getWidgetCount()); |
||||||
|
|
||||||
|
return processMap; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 发送本地模板信息到服务器 |
||||||
|
*/ |
||||||
|
public void sendTemplateInfo() { |
||||||
|
addDayCount(); |
||||||
|
String consumingUrl = SiteCenter.getInstance().acquireUrlByKind("tempinfo.consuming") + "/single"; |
||||||
|
String processUrl = SiteCenter.getInstance().acquireUrlByKind("tempinfo.process") + "/single"; |
||||||
|
ArrayList<HashMap<String, String>> completeTemplatesInfo = getCompleteTemplatesInfo(); |
||||||
|
for (HashMap<String, String> templateInfo : completeTemplatesInfo) { |
||||||
|
String jsonConsumingMap = templateInfo.get("jsonConsumingMap"); |
||||||
|
String jsonProcessMap = templateInfo.get("jsonProcessMap"); |
||||||
|
if (sendSingleTemplateInfo(consumingUrl, jsonConsumingMap) && sendSingleTemplateInfo(processUrl, jsonProcessMap)) { |
||||||
|
// 清空记录
|
||||||
|
FRLogger.getLogger().info("successfully send " + templateInfo.get("templateID")); |
||||||
|
templateInfoList.remove(templateInfo.get("templateID")); |
||||||
|
} |
||||||
|
} |
||||||
|
saveInfo(); |
||||||
|
} |
||||||
|
|
||||||
|
private boolean sendSingleTemplateInfo(String url, String content) { |
||||||
|
HashMap<String, String> para = new HashMap<>(); |
||||||
|
String date = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); |
||||||
|
para.put("token", CodeUtils.md5Encode(date, "", "MD5")); |
||||||
|
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 = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); |
||||||
|
return success; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* 返回已完成的模板信息 |
||||||
|
*/ |
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
private ArrayList<HashMap<String, String>> getCompleteTemplatesInfo() { |
||||||
|
ArrayList<HashMap<String, String>> completeTemplatesInfo = new ArrayList<>(); |
||||||
|
ArrayList<String> testTemplateKeys = new ArrayList<>(); // 保存测试模板的key
|
||||||
|
for (String key : templateInfoList.keySet()) { |
||||||
|
HashMap<String, Object> templateInfo = templateInfoList.get(key); |
||||||
|
if ((int)templateInfo.get("day_count") <= COMPLETE_DAY_COUNT) { // 未完成模板
|
||||||
|
continue; |
||||||
|
} |
||||||
|
if (isTestTemplate(templateInfo)) { |
||||||
|
testTemplateKeys.add(key); |
||||||
|
continue; |
||||||
|
} |
||||||
|
HashMap<String, Object> consumingMap = (HashMap<String, Object>) templateInfo.get("consumingMap"); |
||||||
|
HashMap<String, Object> processMap = (HashMap<String, Object>) templateInfo.get("processMap"); |
||||||
|
String jsonConsumingMap = new JSONObject(consumingMap).toString(); |
||||||
|
String jsonProcessMap = new JSONObject(processMap).toString(); |
||||||
|
HashMap<String, String> jsonTemplateInfo = new HashMap<>(); |
||||||
|
jsonTemplateInfo.put("jsonConsumingMap", jsonConsumingMap); |
||||||
|
jsonTemplateInfo.put("jsonProcessMap", jsonProcessMap); |
||||||
|
jsonTemplateInfo.put("templateID", key); |
||||||
|
completeTemplatesInfo.add(jsonTemplateInfo); |
||||||
|
} |
||||||
|
// 删除测试模板
|
||||||
|
for (String key : testTemplateKeys) { |
||||||
|
templateInfoList.remove(key); |
||||||
|
// System.out.println(key + " is removed...");
|
||||||
|
} |
||||||
|
return completeTemplatesInfo; |
||||||
|
} |
||||||
|
|
||||||
|
@SuppressWarnings("unchecked") |
||||||
|
private boolean isTestTemplate(HashMap<String, Object> templateInfo) { |
||||||
|
HashMap<String, Object> processMap = (HashMap<String, Object>) templateInfo.get("processMap"); |
||||||
|
int reportType = (int)processMap.get("report_type"); |
||||||
|
int cellCount = (int)processMap.get("cell_count"); |
||||||
|
int floatCount = (int)processMap.get("float_count"); |
||||||
|
int blockCount = (int)processMap.get("block_count"); |
||||||
|
int widgetCount = (int)processMap.get("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; |
||||||
|
} |
||||||
|
|
||||||
|
public static void main(String[] args) { |
||||||
|
TemplateInfoCollector tic = TemplateInfoCollector.getInstance(); |
||||||
|
tic.sendTemplateInfo(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package com.fr.design.mainframe.templateinfo; |
||||||
|
|
||||||
|
import com.fr.base.io.IOFile; |
||||||
|
|
||||||
|
/** |
||||||
|
* Created by plough on 2017/3/17. |
||||||
|
*/ |
||||||
|
public abstract class TemplateProcessInfo<T extends IOFile> { |
||||||
|
|
||||||
|
protected T template; |
||||||
|
|
||||||
|
public TemplateProcessInfo(T template) { |
||||||
|
this.template = template; |
||||||
|
} |
||||||
|
|
||||||
|
// 获取模板类型。0 代表普通报表,1 代表聚合报表,2 代表表单
|
||||||
|
public abstract int getReportType(); |
||||||
|
// 获取模板格子数
|
||||||
|
public abstract int getCellCount(); |
||||||
|
// 获取模板悬浮元素个数
|
||||||
|
public abstract int getFloatCount(); |
||||||
|
// 获取模板聚合块个数
|
||||||
|
public abstract int getBlockCount(); |
||||||
|
// 获取模板控件数
|
||||||
|
public abstract int getWidgetCount(); |
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
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,匹配你需要的方法 |
||||||
|
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 onChartUpdate(Chart c) : |
||||||
|
execution(* update(Chart)) && args(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.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(Chart c) : onChartUpdate(c) { |
||||||
|
SourceLocation sl = thisJoinPoint.getSourceLocation(); |
||||||
|
//String log = String.format("%s:\n%s\n插入新图表:%s\n\n", new Date(), sl, c.getChartName()); |
||||||
|
String log = ""; |
||||||
|
TemplateInfoCollector.appendProcess(log); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,59 @@ |
|||||||
|
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,匹配你需要的方法 |
||||||
|
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.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 = String.format("%s:\n%s\nset value: %s at (%d, %d)\n\n", new Date(), sl, v, r, c); |
||||||
|
String log = ""; |
||||||
|
TemplateInfoCollector.appendProcess(log); |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue