Browse Source
* commit '23e5b5a1ddd5b22aed4976f1c36ad03d5e896714': CHART-12746 埋点接口 CHART-12746 CHART-12746 CHART-12746 CHART-12746 CHART-12746 修改map value类型,创建时间的用法 CHART-12746 图表埋点feature/big-screen
Bjorn
5 years ago
21 changed files with 971 additions and 268 deletions
@ -0,0 +1,130 @@
|
||||
package com.fr.design.mainframe.burying.point; |
||||
|
||||
import com.fr.base.FRContext; |
||||
import com.fr.base.io.XMLReadHelper; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.mainframe.template.info.SendHelper; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.stable.xml.XMLPrintWriter; |
||||
import com.fr.stable.xml.XMLTools; |
||||
import com.fr.stable.xml.XMLableReader; |
||||
import com.fr.third.javax.xml.stream.XMLStreamException; |
||||
import com.fr.third.org.apache.commons.io.FileUtils; |
||||
|
||||
import java.io.ByteArrayOutputStream; |
||||
import java.io.File; |
||||
import java.io.FileInputStream; |
||||
import java.io.FileNotFoundException; |
||||
import java.io.IOException; |
||||
import java.io.InputStream; |
||||
import java.nio.charset.StandardCharsets; |
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.Map; |
||||
import java.util.concurrent.ConcurrentHashMap; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-02-21 |
||||
*/ |
||||
public abstract class AbstractPointCollector<T extends AbstractPointInfo> implements BasePointCollector { |
||||
|
||||
protected Map<String, T> pointInfoMap; |
||||
|
||||
private static final int MAX_SIZE = 512 * 1024 * 1024; |
||||
|
||||
public AbstractPointCollector() { |
||||
pointInfoMap = new ConcurrentHashMap<>(); |
||||
loadFromFile(); |
||||
} |
||||
|
||||
/** |
||||
* 获取是否满足触发埋点的要求 |
||||
*/ |
||||
protected boolean shouldCollectInfo() { |
||||
return FileUtils.sizeOf(getInfoFile()) <= MAX_SIZE && DesignerEnvManager.getEnvManager().isJoinProductImprove() && FRContext.isChineseEnv(); |
||||
} |
||||
|
||||
@Override |
||||
public void sendPointInfo() { |
||||
|
||||
addIdleDayCount(); |
||||
|
||||
List<String> removeList = new ArrayList<>(); |
||||
List<String> sendList = new ArrayList<>(); |
||||
|
||||
for (String key : pointInfoMap.keySet()) { |
||||
AbstractPointInfo pointInfo = pointInfoMap.get(key); |
||||
pointInfo.selectPoint(removeList, sendList); |
||||
} |
||||
|
||||
// 发送记录
|
||||
for (String key : sendList) { |
||||
if(SendHelper.sendPointInfo(pointInfoMap.get(key))){ |
||||
removeList.add(key); |
||||
} |
||||
} |
||||
|
||||
// 清空记录
|
||||
for (String key : removeList) { |
||||
pointInfoMap.remove(key); |
||||
} |
||||
|
||||
saveInfo(); |
||||
} |
||||
|
||||
/** |
||||
* 从文件中读取埋点信息 |
||||
*/ |
||||
protected void loadFromFile() { |
||||
if (!getInfoFile().exists()) { |
||||
return; |
||||
} |
||||
|
||||
XMLableReader reader = null; |
||||
try (InputStream in = new FileInputStream(getInfoFile())) { |
||||
// XMLableReader 还是应该考虑实现 Closable 接口的,这样就能使用 try-with 语句了
|
||||
reader = XMLReadHelper.createXMLableReader(in, XMLPrintWriter.XML_ENCODER); |
||||
if (reader == null) { |
||||
return; |
||||
} |
||||
reader.readXMLObject(this); |
||||
} catch (FileNotFoundException e) { |
||||
// do nothing
|
||||
} catch (XMLStreamException | IOException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} finally { |
||||
try { |
||||
if (reader != null) { |
||||
reader.close(); |
||||
} |
||||
} catch (XMLStreamException e) { |
||||
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
||||
} |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 保存埋点信息到文件中 |
||||
*/ |
||||
protected void saveInfo() { |
||||
try { |
||||
ByteArrayOutputStream out = new ByteArrayOutputStream(); |
||||
XMLTools.writeOutputStreamXML(this, out); |
||||
out.flush(); |
||||
out.close(); |
||||
String fileContent = new String(out.toByteArray(), StandardCharsets.UTF_8); |
||||
FileUtils.writeStringToFile(getInfoFile(), fileContent, StandardCharsets.UTF_8); |
||||
} catch (Exception ex) { |
||||
FineLoggerFactory.getLogger().error(ex.getMessage()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 获取缓存文件存放路径 |
||||
*/ |
||||
protected abstract File getInfoFile(); |
||||
|
||||
protected abstract void addIdleDayCount(); |
||||
} |
@ -0,0 +1,55 @@
|
||||
package com.fr.design.mainframe.burying.point; |
||||
|
||||
import java.util.List; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-02-21 |
||||
*/ |
||||
public abstract class AbstractPointInfo implements BasePointInfo { |
||||
|
||||
protected int idleDayCount; // 到现在为止,埋点闲置的天数
|
||||
|
||||
@Override |
||||
public void resetIdleDayCount() { |
||||
this.idleDayCount = 0; |
||||
} |
||||
|
||||
@Override |
||||
public void addIdleDayCountByOne() { |
||||
this.idleDayCount += 1; |
||||
} |
||||
|
||||
/** |
||||
* 上传前判断该埋点,是否需要被上传,或者删除,或者什么都不做。 |
||||
*/ |
||||
@Override |
||||
public void selectPoint(List<String> removeList, List<String> sendList) { |
||||
//埋点还未完成,直接返回
|
||||
if (!isComplete()) { |
||||
return; |
||||
} |
||||
//属于测试模板,直接删除,否则发送信息
|
||||
if (isTestTemplate()) { |
||||
removeList.add(key()); |
||||
} else { |
||||
sendList.add(key()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 是否为测试模板 |
||||
*/ |
||||
protected abstract boolean isTestTemplate(); |
||||
|
||||
/** |
||||
* 是否已经制作完成 |
||||
*/ |
||||
protected abstract boolean isComplete(); |
||||
|
||||
/** |
||||
* 埋点记录的主键 |
||||
*/ |
||||
protected abstract String key(); |
||||
} |
@ -0,0 +1,23 @@
|
||||
package com.fr.design.mainframe.burying.point; |
||||
|
||||
import com.fr.design.mainframe.template.info.TemplateProcessInfo; |
||||
import com.fr.stable.xml.XMLReadable; |
||||
import com.fr.stable.xml.XMLWriter; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-02-21 |
||||
*/ |
||||
public interface BasePointCollector extends XMLReadable, XMLWriter { |
||||
|
||||
/** |
||||
* 发送埋点信息到服务器 |
||||
*/ |
||||
public void sendPointInfo(); |
||||
|
||||
/** |
||||
* 保存埋点的信息到本地 |
||||
*/ |
||||
public void collectInfo(String templateID, String originID, TemplateProcessInfo processInfo, int timeConsume); |
||||
} |
@ -0,0 +1,35 @@
|
||||
package com.fr.design.mainframe.burying.point; |
||||
|
||||
import com.fr.stable.xml.XMLReadable; |
||||
import com.fr.stable.xml.XMLWriter; |
||||
|
||||
import java.util.List; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-02-21 |
||||
*/ |
||||
public interface BasePointInfo extends XMLReadable, XMLWriter { |
||||
|
||||
/** |
||||
* 重置埋点的未编辑天数 |
||||
*/ |
||||
void resetIdleDayCount(); |
||||
|
||||
/** |
||||
* 增加一天埋点的未编辑天数 |
||||
*/ |
||||
void addIdleDayCountByOne(); |
||||
|
||||
/** |
||||
* 上传前判断该埋点,是否需要被上传,或者删除,或者什么都不做。 |
||||
*/ |
||||
void selectPoint(List<String> removeList, List<String> sendList); |
||||
|
||||
/** |
||||
* 获取要上传的内容,key→上传路径,value→上传内容 |
||||
*/ |
||||
Map<String, String> getSendInfo(); |
||||
} |
@ -0,0 +1,252 @@
|
||||
package com.fr.design.mainframe.chart.info; |
||||
|
||||
import com.fr.base.io.BaseBook; |
||||
import com.fr.config.MarketConfig; |
||||
import com.fr.design.DesignModelAdapter; |
||||
import com.fr.design.DesignerEnvManager; |
||||
import com.fr.design.file.HistoryTemplateListCache; |
||||
import com.fr.design.mainframe.burying.point.AbstractPointInfo; |
||||
import com.fr.general.CloudCenter; |
||||
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.XMLableReader; |
||||
import com.fr.third.joda.time.DateTime; |
||||
|
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-02-17 |
||||
*/ |
||||
public class ChartInfo extends AbstractPointInfo { |
||||
public static final String XML_TAG = "ChartInfo"; |
||||
private static final String CHART_CONSUMING_URL = CloudCenter.getInstance().acquireUrlByKind("chartinfo.consuming") + "/single"; |
||||
|
||||
|
||||
private static final String XML_CHART_CONSUMING_MAP = "chartConsumingMap"; |
||||
private static final String ATTR_TEST_TEMPLATE = "testTemplate"; |
||||
private static final String ATTR_DAY_COUNT = "day_count"; |
||||
private static final String ATTR_USERNAME = "username"; |
||||
private static final String ATTR_UUID = "uuid"; |
||||
private static final String ATTR_ACTIVITYKEY = "activityKey"; |
||||
private static final String ATTR_TEMPLATE_ID = "templateID"; |
||||
private static final String ATTR_REPORT_TYPE = "type"; |
||||
private static final String ATTR_CHART_ID = "chartId"; |
||||
private static final String ATTR_CHART_TYPE = "chartType"; |
||||
private static final String ATTR_CHART_CREATE_TIME = "chartCreateTime"; |
||||
private static final String ATTR_CHART_TYPE_TIME = "chartTypeTime"; |
||||
private static final String ATTR_CHART_PROPERTY_FIRST_TIME = "chartPropertyFirstTime"; |
||||
private static final String ATTR_CHART_PROPERTY_END_TIME = "chartPropertyEndTime"; |
||||
private static final String ATTR_JAR_TIME = "jarTime"; |
||||
private static final String ATTR_VERSION = "version"; |
||||
|
||||
private static final int COMPLETE_DAY_COUNT = 3; // 判断图表是否可以上传的天数
|
||||
|
||||
private String chartId = StringUtils.EMPTY; |
||||
|
||||
private String templateId = StringUtils.EMPTY; |
||||
|
||||
private Map<String, String> chartConsumingMap = new HashMap<>(); |
||||
|
||||
private BaseBook book; |
||||
|
||||
private boolean testTemplate; |
||||
|
||||
private int idleDayCount; // 到现在为止,埋点闲置的天数
|
||||
|
||||
private ChartInfo() { |
||||
} |
||||
|
||||
private ChartInfo(String chartId, String templateId, BaseBook book) { |
||||
this.chartId = chartId; |
||||
this.templateId = templateId; |
||||
this.book = book; |
||||
} |
||||
|
||||
public String getChartId() { |
||||
return chartId; |
||||
} |
||||
|
||||
@Override |
||||
protected String key() { |
||||
return chartId; |
||||
} |
||||
|
||||
public String getTemplateId() { |
||||
return templateId; |
||||
} |
||||
|
||||
public void setTemplateId(String templateId) { |
||||
this.templateId = templateId; |
||||
this.chartConsumingMap.put(ATTR_TEMPLATE_ID, templateId); |
||||
} |
||||
|
||||
|
||||
public BaseBook getBook() { |
||||
return book; |
||||
} |
||||
|
||||
@Override |
||||
public boolean isTestTemplate() { |
||||
return testTemplate; |
||||
} |
||||
|
||||
public void setTestTemplate(boolean testTemplate) { |
||||
this.testTemplate = testTemplate; |
||||
} |
||||
|
||||
static ChartInfo newInstanceByRead(XMLableReader reader) { |
||||
ChartInfo chartInfo = new ChartInfo(); |
||||
reader.readXMLObject(chartInfo); |
||||
return chartInfo; |
||||
} |
||||
|
||||
public static ChartInfo newInstance(String chartId, String chartType) { |
||||
return newInstance(chartId, chartType, null); |
||||
} |
||||
|
||||
public static ChartInfo newInstance(String chartId, String chartType, String createTime) { |
||||
HashMap<String, String> chartConsumingMap = new HashMap<>(); |
||||
|
||||
String username = MarketConfig.getInstance().getBbsUsername(); |
||||
String uuid = DesignerEnvManager.getEnvManager().getUUID(); |
||||
String activityKey = DesignerEnvManager.getEnvManager().getActivationKey(); |
||||
|
||||
BaseBook book = DesignModelAdapter.getCurrentModelAdapter().getBook(); |
||||
String templateId = book.getTemplateID(); |
||||
int reportType = HistoryTemplateListCache.getInstance().getCurrentEditingTemplate().getProcessInfo().getReportType(); |
||||
|
||||
String typeTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); |
||||
|
||||
createTime = createTime == null ? typeTime : createTime; |
||||
|
||||
String jarTime = GeneralUtils.readBuildNO(); |
||||
String version = ProductConstants.VERSION; |
||||
chartConsumingMap.put(ATTR_USERNAME, username); |
||||
chartConsumingMap.put(ATTR_UUID, uuid); |
||||
chartConsumingMap.put(ATTR_ACTIVITYKEY, activityKey); |
||||
chartConsumingMap.put(ATTR_TEMPLATE_ID, templateId); |
||||
chartConsumingMap.put(ATTR_REPORT_TYPE, String.valueOf(reportType)); |
||||
chartConsumingMap.put(ATTR_CHART_ID, chartId); |
||||
chartConsumingMap.put(ATTR_CHART_TYPE, chartType); |
||||
chartConsumingMap.put(ATTR_CHART_CREATE_TIME, createTime); |
||||
chartConsumingMap.put(ATTR_CHART_TYPE_TIME, typeTime); |
||||
chartConsumingMap.put(ATTR_CHART_PROPERTY_FIRST_TIME, ""); |
||||
chartConsumingMap.put(ATTR_CHART_PROPERTY_END_TIME, ""); |
||||
chartConsumingMap.put(ATTR_JAR_TIME, jarTime); |
||||
chartConsumingMap.put(ATTR_VERSION, version); |
||||
|
||||
ChartInfo chartInfo = new ChartInfo(chartId, templateId, book); |
||||
chartInfo.chartConsumingMap = chartConsumingMap; |
||||
|
||||
return chartInfo; |
||||
} |
||||
|
||||
@Override |
||||
public void writeXML(XMLPrintWriter writer) { |
||||
writer.startTAG(XML_TAG); |
||||
if (StringUtils.isNotEmpty(chartId)) { |
||||
writer.attr(ATTR_CHART_ID, this.chartId); |
||||
} |
||||
if (StringUtils.isNotEmpty(templateId)) { |
||||
writer.attr(ATTR_TEMPLATE_ID, this.templateId); |
||||
} |
||||
if (idleDayCount >= 0) { |
||||
writer.attr(ATTR_DAY_COUNT, this.idleDayCount); |
||||
} |
||||
writer.attr(ATTR_TEST_TEMPLATE, this.testTemplate); |
||||
writer.startTAG(XML_CHART_CONSUMING_MAP); |
||||
writer.attr(ATTR_USERNAME, chartConsumingMap.get(ATTR_USERNAME)); |
||||
writer.attr(ATTR_UUID, chartConsumingMap.get(ATTR_UUID)); |
||||
writer.attr(ATTR_ACTIVITYKEY, chartConsumingMap.get(ATTR_ACTIVITYKEY)); |
||||
writer.attr(ATTR_REPORT_TYPE, chartConsumingMap.get(ATTR_REPORT_TYPE)); |
||||
writer.attr(ATTR_CHART_TYPE, chartConsumingMap.get(ATTR_CHART_TYPE)); |
||||
writer.attr(ATTR_CHART_CREATE_TIME, chartConsumingMap.get(ATTR_CHART_CREATE_TIME)); |
||||
writer.attr(ATTR_CHART_TYPE_TIME, chartConsumingMap.get(ATTR_CHART_TYPE_TIME)); |
||||
writer.attr(ATTR_CHART_PROPERTY_FIRST_TIME, chartConsumingMap.get(ATTR_CHART_PROPERTY_FIRST_TIME)); |
||||
writer.attr(ATTR_CHART_PROPERTY_END_TIME, chartConsumingMap.get(ATTR_CHART_PROPERTY_END_TIME)); |
||||
writer.attr(ATTR_JAR_TIME, chartConsumingMap.get(ATTR_JAR_TIME)); |
||||
writer.attr(ATTR_VERSION, chartConsumingMap.get(ATTR_VERSION)); |
||||
writer.end(); |
||||
writer.end(); |
||||
} |
||||
|
||||
@Override |
||||
public void readXML(XMLableReader reader) { |
||||
|
||||
if (!reader.isChildNode()) { |
||||
idleDayCount = reader.getAttrAsInt(ATTR_DAY_COUNT, 0); |
||||
chartId = reader.getAttrAsString(ATTR_CHART_ID, StringUtils.EMPTY); |
||||
templateId = reader.getAttrAsString(ATTR_TEMPLATE_ID, StringUtils.EMPTY); |
||||
testTemplate = reader.getAttrAsBoolean(ATTR_TEST_TEMPLATE, true); |
||||
} else { |
||||
String name = reader.getTagName(); |
||||
if (XML_CHART_CONSUMING_MAP.equals(name)) { |
||||
chartConsumingMap.put(ATTR_USERNAME, reader.getAttrAsString(ATTR_USERNAME, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_UUID, reader.getAttrAsString(ATTR_UUID, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_ACTIVITYKEY, reader.getAttrAsString(ATTR_ACTIVITYKEY, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_TEMPLATE_ID, templateId); |
||||
chartConsumingMap.put(ATTR_REPORT_TYPE, reader.getAttrAsString(ATTR_REPORT_TYPE, "0")); |
||||
chartConsumingMap.put(ATTR_CHART_ID, chartId); |
||||
chartConsumingMap.put(ATTR_CHART_TYPE, reader.getAttrAsString(ATTR_CHART_TYPE, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_CHART_CREATE_TIME, reader.getAttrAsString(ATTR_CHART_CREATE_TIME, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_CHART_TYPE_TIME, reader.getAttrAsString(ATTR_CHART_TYPE_TIME, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_CHART_PROPERTY_FIRST_TIME, reader.getAttrAsString(ATTR_CHART_PROPERTY_FIRST_TIME, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_CHART_PROPERTY_END_TIME, reader.getAttrAsString(ATTR_CHART_PROPERTY_END_TIME, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_JAR_TIME, reader.getAttrAsString(ATTR_JAR_TIME, StringUtils.EMPTY)); |
||||
chartConsumingMap.put(ATTR_VERSION, reader.getAttrAsString(ATTR_VERSION, "8.0")); |
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public boolean isComplete() { |
||||
// 连续3天打开了设计器但是没有编辑
|
||||
return idleDayCount > COMPLETE_DAY_COUNT; |
||||
} |
||||
|
||||
@Override |
||||
public Map<String, String> getSendInfo() { |
||||
Map<String, String> sendMap = new HashMap<>(); |
||||
sendMap.put(CHART_CONSUMING_URL, new JSONObject(chartConsumingMap).toString()); |
||||
return sendMap; |
||||
} |
||||
|
||||
public void updatePropertyTime() { |
||||
String propertyTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); |
||||
|
||||
if (StringUtils.isEmpty(chartConsumingMap.get(ATTR_CHART_PROPERTY_FIRST_TIME))) { |
||||
chartConsumingMap.put(ATTR_CHART_PROPERTY_FIRST_TIME, propertyTime); |
||||
} |
||||
chartConsumingMap.put(ATTR_CHART_PROPERTY_END_TIME, propertyTime); |
||||
} |
||||
|
||||
public void updateChartType(String chartType) { |
||||
String typeTime = DateTime.now().toString("yyyy-MM-dd HH:mm:ss"); |
||||
|
||||
chartConsumingMap.put(ATTR_CHART_TYPE_TIME, typeTime); |
||||
chartConsumingMap.put(ATTR_CHART_TYPE, chartType); |
||||
chartConsumingMap.put(ATTR_CHART_PROPERTY_FIRST_TIME, ""); |
||||
chartConsumingMap.put(ATTR_CHART_PROPERTY_END_TIME, ""); |
||||
} |
||||
|
||||
@Override |
||||
public ChartInfo clone() { |
||||
ChartInfo chartInfo = new ChartInfo(); |
||||
chartInfo.chartId = this.chartId; |
||||
chartInfo.idleDayCount = this.idleDayCount; |
||||
chartInfo.templateId = this.templateId; |
||||
chartInfo.testTemplate = this.testTemplate; |
||||
Map<String, String> chartConsumingMap = new HashMap<>(); |
||||
for (Map.Entry<String, String> entry : this.chartConsumingMap.entrySet()) { |
||||
chartConsumingMap.put(entry.getKey(), entry.getValue()); |
||||
} |
||||
chartInfo.chartConsumingMap = chartConsumingMap; |
||||
return chartInfo; |
||||
} |
||||
} |
@ -0,0 +1,249 @@
|
||||
package com.fr.design.mainframe.chart.info; |
||||
|
||||
import com.fr.base.io.BaseBook; |
||||
import com.fr.chartx.attr.ChartProvider; |
||||
import com.fr.design.mainframe.burying.point.AbstractPointCollector; |
||||
import com.fr.design.mainframe.template.info.TemplateInfo; |
||||
import com.fr.design.mainframe.template.info.TemplateProcessInfo; |
||||
import com.fr.general.ComparatorUtils; |
||||
import com.fr.log.FineLoggerFactory; |
||||
import com.fr.plugin.chart.vanchart.VanChart; |
||||
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.XMLableReader; |
||||
|
||||
import java.io.File; |
||||
import java.text.SimpleDateFormat; |
||||
import java.util.Calendar; |
||||
import java.util.HashMap; |
||||
import java.util.Map; |
||||
|
||||
/** |
||||
* @author Bjorn |
||||
* @version 10.0 |
||||
* Created by Bjorn on 2020-02-18 |
||||
*/ |
||||
public class ChartInfoCollector extends AbstractPointCollector<ChartInfo> { |
||||
private static final String XML_TAG = "ChartInfoCollector"; |
||||
private static final String XML_LAST_EDIT_DAY = "lastEditDay"; |
||||
|
||||
private static final String XML_CHART_INFO_LIST = "ChartInfoList"; |
||||
private static final String XML_FILE_NAME = "chart.info"; |
||||
|
||||
private static ChartInfoCollector instance; |
||||
|
||||
private Map<String, ChartInfo> chartInfoCacheMap; |
||||
|
||||
private String lastEditDay = StringUtils.EMPTY; |
||||
|
||||
private ChartInfoCollector() { |
||||
init(); |
||||
} |
||||
|
||||
private void init() { |
||||
chartInfoCacheMap = new HashMap<>(); |
||||
} |
||||
|
||||
public static ChartInfoCollector getInstance() { |
||||
if (instance == null) { |
||||
instance = new ChartInfoCollector(); |
||||
} |
||||
return instance; |
||||
} |
||||
|
||||
public void collection(ChartProvider chartProvider, String createTime) { |
||||
if (chartProvider instanceof VanChart) { |
||||
VanChart vanChart = (VanChart) chartProvider; |
||||
collection(vanChart.getUuid(), vanChart.getID(), createTime); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 新建图表,保存状态 |
||||
*/ |
||||
public void collection(String chartId, String chartType, String createTime) { |
||||
if (!shouldCollectInfo()) { |
||||
return; |
||||
} |
||||
|
||||
ChartInfo chartInfo = ChartInfo.newInstance(chartId, chartType, createTime); |
||||
chartInfoCacheMap.put(chartId, chartInfo); |
||||
} |
||||
|
||||
public void updateChartPropertyTime(ChartProvider chartProvider) { |
||||
if (chartProvider instanceof VanChart) { |
||||
VanChart vanChart = (VanChart) chartProvider; |
||||
updateChartPropertyTime(vanChart.getUuid(), vanChart.getID()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 图表编辑,更新编辑时间 |
||||
*/ |
||||
public void updateChartPropertyTime(String chartId, String chartType) { |
||||
if (!shouldCollectInfo()) { |
||||
return; |
||||
} |
||||
ChartInfo chartInfo = getOrCreateChartInfo(chartId, chartType); |
||||
|
||||
//更新编辑时间
|
||||
chartInfo.updatePropertyTime(); |
||||
|
||||
//重置计数
|
||||
chartInfo.resetIdleDayCount(); |
||||
} |
||||
|
||||
public void updateChartTypeTime(ChartProvider chartProvider) { |
||||
if (chartProvider instanceof VanChart) { |
||||
VanChart vanChart = (VanChart) chartProvider; |
||||
updateChartTypeTime(vanChart.getUuid(), vanChart.getID()); |
||||
} |
||||
} |
||||
|
||||
/** |
||||
* 图表类型变化,更新类型和类型确认时间 |
||||
*/ |
||||
public void updateChartTypeTime(String chartId, String chartType) { |
||||
if (!shouldCollectInfo()) { |
||||
return; |
||||
} |
||||
|
||||
ChartInfo chartInfo = getOrCreateChartInfo(chartId, chartType); |
||||
|
||||
//更新类型确认时间和类型
|
||||
chartInfo.updateChartType(chartType); |
||||
|
||||
//重置计数
|
||||
chartInfo.resetIdleDayCount(); |
||||
} |
||||
|
||||
private ChartInfo getOrCreateChartInfo(String chartId, String chartType) { |
||||
//缓存中有从缓存中拿
|
||||
if (chartInfoCacheMap.containsKey(chartId)) { |
||||
return chartInfoCacheMap.get(chartId); |
||||
} |
||||
//缓存中没有从文件中读取的信息中拷贝到缓存
|
||||
if (pointInfoMap.containsKey(chartId)) { |
||||
ChartInfo chartInfo = pointInfoMap.get(chartId).clone(); |
||||
chartInfoCacheMap.put(chartId, chartInfo); |
||||
return chartInfo; |
||||
} |
||||
//都有的话创建一个并加入到缓存中
|
||||
ChartInfo chartInfo = ChartInfo.newInstance(chartId, chartType); |
||||
chartInfoCacheMap.put(chartId, chartInfo); |
||||
return chartInfo; |
||||
} |
||||
|
||||
/** |
||||
* 保存模板的时候将该模板中的图表埋点信息保存 |
||||
*/ |
||||
@Override |
||||
public void collectInfo(String templateId, String originID, TemplateProcessInfo processInfo, int timeConsume) { |
||||
if (!shouldCollectInfo()) { |
||||
return; |
||||
} |
||||
if (StringUtils.isEmpty(originID)) { |
||||
originID = templateId; |
||||
} |
||||
boolean testTemplate = isTestTemplate(processInfo); |
||||
|
||||
for (ChartInfo chartInfo : pointInfoMap.values()) { |
||||
if (originID.equals(chartInfo.getTemplateId())) { |
||||
chartInfo.setTemplateId(templateId); |
||||
chartInfo.setTestTemplate(testTemplate); |
||||
} |
||||
} |
||||
|
||||
for (ChartInfo chartInfo : chartInfoCacheMap.values()) { |
||||
BaseBook book = chartInfo.getBook(); |
||||
if ((book != null && templateId.equals(book.getTemplateID())) || |
||||
originID.equals(chartInfo.getTemplateId())) { |
||||
chartInfo.setTemplateId(templateId); |
||||
chartInfo.setTestTemplate(testTemplate); |
||||
pointInfoMap.put(chartInfo.getChartId(), chartInfo); |
||||
} |
||||
} |
||||
|
||||
// 每次更新之后,都同步到暂存文件中
|
||||
saveInfo(); |
||||
} |
||||
|
||||
private boolean isTestTemplate(TemplateProcessInfo processInfo) { |
||||
int reportType = processInfo.getReportType(); |
||||
int cellCount = processInfo.getCellCount(); |
||||
int floatCount = processInfo.getFloatCount(); |
||||
int blockCount = processInfo.getBlockCount(); |
||||
int widgetCount = processInfo.getWidgetCount(); |
||||
|
||||
return TemplateInfo.isTestTemplate(reportType, cellCount, floatCount, blockCount, widgetCount); |
||||
} |
||||
|
||||
/** |
||||
* 更新 day_count:打开设计器却未编辑图表的连续日子 |
||||
*/ |
||||
@Override |
||||
protected void addIdleDayCount() { |
||||
// 判断今天是否第一次打开设计器,为了防止同一天内,多次 addIdleDayCount
|
||||
String today = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); |
||||
if (ComparatorUtils.equals(today, lastEditDay)) { |
||||
return; |
||||
} |
||||
for (ChartInfo chartInfo : pointInfoMap.values()) { |
||||
chartInfo.addIdleDayCountByOne(); |
||||
} |
||||
lastEditDay = today; |
||||
} |
||||
|
||||
|
||||
/** |
||||
* 获取缓存文件存放路径 |
||||
*/ |
||||
@Override |
||||
protected File getInfoFile() { |
||||
File file = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), XML_FILE_NAME)); |
||||
try { |
||||
if (!file.exists()) { |
||||
file.createNewFile(); |
||||
} |
||||
} catch (Exception ex) { |
||||
FineLoggerFactory.getLogger().error(ex.getMessage(), ex); |
||||
} |
||||
return file; |
||||
} |
||||
|
||||
@Override |
||||
public void readXML(XMLableReader reader) { |
||||
if (reader.isChildNode()) { |
||||
try { |
||||
String name = reader.getTagName(); |
||||
if (ChartInfo.XML_TAG.equals(name)) { |
||||
ChartInfo chartInfo = ChartInfo.newInstanceByRead(reader); |
||||
pointInfoMap.put(chartInfo.getChartId(), chartInfo); |
||||
} else if (XML_LAST_EDIT_DAY.equals(name)) { |
||||
lastEditDay = reader.getElementValue(); |
||||
} |
||||
} catch (Exception ex) { |
||||
// 什么也不做,使用默认值
|
||||
} |
||||
} |
||||
} |
||||
|
||||
@Override |
||||
public void writeXML(XMLPrintWriter writer) { |
||||
writer.startTAG(XML_TAG); |
||||
|
||||
writer.startTAG(XML_LAST_EDIT_DAY); |
||||
writer.textNode(lastEditDay); |
||||
writer.end(); |
||||
|
||||
writer.startTAG(XML_CHART_INFO_LIST); |
||||
for (ChartInfo chartInfo : pointInfoMap.values()) { |
||||
chartInfo.writeXML(writer); |
||||
} |
||||
writer.end(); |
||||
|
||||
writer.end(); |
||||
} |
||||
} |
Loading…
Reference in new issue