"template": "import-statistics.xml",\r
"cronexpression": "0 0 0/1 1/1 * ? *",\r
"parameters": [ \r
- {"name": "daysBeforeNow", "value": 6, "type": "java.lang.Integer"}\r
+ {"name": "daysBeforeNow", "value": 1, "type": "java.lang.Integer"}\r
]\r
},\r
{\r
return result;\r
}\r
\r
+ private BasicDBObject createStory(BasicDBObject story, String label, String objId, long duration, long rdCount, long sfCount, long parentStoryId,\r
+ String reporters) {\r
+ BasicDBObject raw = new BasicDBObject();\r
+ raw.put(IOctopusAPI.ID, NoSQLUtils.asLong(story, IOctopusAPI.ID));\r
+ raw.put(IOctopusAPI.NAME, NoSQLUtils.asString(story, IOctopusAPI.NAME));\r
+ raw.put(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
+ raw.put(IOctopusAPI.REPORTERS, reporters);\r
+ raw.put(IOctopusAPI.OBJ_ID, objId);\r
+ raw.put(IOctopusAPI.LABEL, label);\r
+ raw.put("duration", duration);\r
+ raw.put(IOctopusAPI.REF_RUNDOWN, rdCount);\r
+ raw.put(IOctopusAPI.REF_STORYFOLDER, sfCount);\r
+ return raw;\r
+ }\r
+\r
@StepEntry\r
public Object[] execute(int daysBeforeNow, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
marker = jobRuntime.getMarker();\r
stories.putAll(folderStories);\r
logger.info(jobRuntime.getMarker(), "Gyűjtőkben megtalálható anyagok száma {}", stories.size());\r
\r
- BasicDBObject planStat = new BasicDBObject();\r
-\r
- BasicDBObject typeStat = new BasicDBObject();\r
- BasicDBObject typeStatRawData = new BasicDBObject();\r
- typeStat.put("rawData", typeStatRawData);\r
- long sumDuration = 0;\r
- long sumIngestDuration = 0;\r
- long sumIngestCount = 0;\r
- long sumArchiveDuration = 0;\r
- long sumArchiveCount = 0;\r
-\r
- List<BasicDBObject> rawData = new ArrayList<>();\r
- for (BasicDBObject story : stories.values()) {\r
- List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
- for (BasicDBObject mos : mosObjects) {\r
- String label = NoSQLUtils.asString(mos, IOctopusAPI.LABEL);\r
- long duration = NoSQLUtils.asLong(mos, "duration");\r
- long rdCount = NoSQLUtils.asLong(story, IOctopusAPI.REF_RUNDOWN);\r
- long sfCount = NoSQLUtils.asLong(story, IOctopusAPI.REF_STORYFOLDER);\r
- long parentStoryId = NoSQLUtils.asLong(story, IOctopusAPI.PARENT_STORY_ID);\r
-\r
- BasicDBObject raw = new BasicDBObject();\r
- raw.put(IOctopusAPI.ID, NoSQLUtils.asLong(story, IOctopusAPI.ID));\r
- raw.put(IOctopusAPI.NAME, NoSQLUtils.asString(story, IOctopusAPI.NAME));\r
- raw.put(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
- raw.put(IOctopusAPI.REPORTERS, NoSQLUtils.asString(story, IOctopusAPI.REPORTERS));\r
- raw.put(IOctopusAPI.OBJ_ID, NoSQLUtils.asString(mos, IOctopusAPI.OBJ_ID));\r
- raw.put(IOctopusAPI.LABEL, label);\r
- raw.put("duration", duration);\r
- raw.put(IOctopusAPI.REF_RUNDOWN, rdCount);\r
- raw.put(IOctopusAPI.REF_STORYFOLDER, sfCount);\r
-\r
- long ingestCount = 0;\r
- long ingestDuration = 0;\r
- BasicDBObject ingestInfo = manager.getIngestInfo(scheduledDate, String.valueOf(parentStoryId));\r
- if (ingestInfo != null) {\r
- ingestCount = ingestInfo.getLong("count");\r
- ingestDuration = ingestInfo.getLong("duration");\r
- raw.put("ingest_count", ingestCount);\r
- raw.put("ingest_duration", ingestDuration);\r
- sumIngestCount += ingestCount;\r
- sumIngestDuration += ingestDuration;\r
- }\r
-\r
- long archiveCount = 0;\r
- long archiveDuration = 0;\r
- BasicDBObject archiveInfo = manager.getArchiveInfo(scheduledDate, String.valueOf(parentStoryId));\r
- if (archiveInfo != null) {\r
- archiveCount = archiveInfo.getLong("count");\r
- archiveDuration = archiveInfo.getLong("duration");\r
- raw.put("archive_count", archiveCount);\r
- raw.put("archive_duration", archiveDuration);\r
- sumArchiveCount += archiveCount;\r
- sumArchiveDuration += archiveDuration;\r
- }\r
-\r
- rawData.add(raw);\r
-\r
- //planStat\r
- if (sfCount > 0 && rdCount == 0) {\r
- NoSQLUtils.addLong(planStat, "skip_count", 1);\r
- NoSQLUtils.addLong(planStat, "skip_duration", duration);\r
- }\r
- if (rdCount > 0) {\r
- NoSQLUtils.addLong(planStat, "onair_count", 1);\r
- NoSQLUtils.addLong(planStat, "onair_duration", duration);\r
-\r
- //typeStat\r
- sumDuration += duration;\r
- if (typeStatRawData.containsKey(label)) {\r
- BasicDBObject dbo = NoSQLUtils.asDBObject(typeStatRawData, label);\r
- dbo.put("count", dbo.getInt("count") + 1);\r
- dbo.put("duration", dbo.getInt("duration") + duration);\r
- } else\r
- typeStatRawData.put(label, new BasicDBObject("count", 1).append("duration", duration));\r
- }\r
- }\r
- }\r
-\r
- planStat.put("all_count", rawData.size());\r
- planStat.put("all_duration", sumDuration);\r
- planStat.put("archive_count", sumArchiveCount);\r
- planStat.put("archive_duration", sumArchiveDuration);\r
- planStat.put("ingest_count", sumIngestCount);\r
- planStat.put("ingest_duration", sumIngestDuration);\r
-\r
- store(scheduledDate, rawData, typeStat, planStat);\r
+ storeStories(scheduledDate, stories);\r
return null;\r
}\r
\r
String reporterNames = "";\r
if (reporters != null && reporters.size() > 0) {\r
for (BasicDBObject reporter : reporters) {\r
- String userName = NoSQLUtils.asString(reporter, "userName");\r
+ String userName = NoSQLUtils.asString(reporter, "longName");\r
if (userName != null) {\r
if (reporterNames.length() > 0)\r
reporterNames += ", ";\r
return result;\r
}\r
\r
- private void store(Calendar scheduledDate, List<BasicDBObject> stories, BasicDBObject typeStat, BasicDBObject planStat) {\r
+ private void store(Calendar scheduledDate, List<BasicDBObject> stories, BasicDBObject typeStat, BasicDBObject planStat, BasicDBObject reporterStat) {\r
BasicDBObject dailyHistory = new BasicDBObject();\r
dailyHistory.put("dateTime", scheduledDate.getTime());\r
BasicDBList list = new BasicDBList();\r
}\r
dailyHistory.put("typeStat", typeStat);\r
dailyHistory.put("planStat", planStat);\r
+ dailyHistory.put("reporterStat", reporterStat);\r
\r
DBCollection collection = db.getCollection("daily_news_history");\r
collection.remove(new BasicDBObject("dateTime", scheduledDate.getTime()));\r
collection.save(dailyHistory);\r
}\r
\r
+ private void storeStories(Calendar scheduledDate, Map<Long, BasicDBObject> stories) {\r
+ BasicDBObject planStat = new BasicDBObject();\r
+ BasicDBObject typeStat = new BasicDBObject();\r
+ BasicDBObject reporterStat = new BasicDBObject();\r
+\r
+ List<BasicDBObject> rawData = new ArrayList<>();\r
+ List<String> processed = new ArrayList<>();\r
+\r
+ for (BasicDBObject story : stories.values()) {\r
+ List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
+ for (BasicDBObject mos : mosObjects) {\r
+ String objId = NoSQLUtils.asString(mos, IOctopusAPI.OBJ_ID);\r
+ long parentStoryId = NoSQLUtils.asLong(story, IOctopusAPI.PARENT_STORY_ID);\r
+ String key = String.format("%d-%s", parentStoryId, objId);\r
+ if (processed.contains(key))\r
+ continue;\r
+ processed.add(key);\r
+\r
+ String label = NoSQLUtils.asString(mos, IOctopusAPI.LABEL);\r
+ long duration = NoSQLUtils.asLong(mos, "duration");\r
+ long rdCount = NoSQLUtils.asLong(story, IOctopusAPI.REF_RUNDOWN);\r
+ long sfCount = NoSQLUtils.asLong(story, IOctopusAPI.REF_STORYFOLDER);\r
+ String reporters = NoSQLUtils.asString(story, IOctopusAPI.REPORTERS);\r
+\r
+ BasicDBObject raw = createStory(story, label, objId, duration, rdCount, sfCount, parentStoryId, reporters);\r
+ rawData.add(raw);\r
+\r
+ NoSQLUtils.addLong(planStat, "all_count", 1);\r
+ NoSQLUtils.addLong(planStat, "all_duration", duration);\r
+\r
+ BasicDBObject perTypeStat = NoSQLUtils.asDBObjectOrCreate(typeStat, label);\r
+ NoSQLUtils.addLong(perTypeStat, "all_count", 1);\r
+ NoSQLUtils.addLong(perTypeStat, "all_duration", duration);\r
+\r
+ BasicDBObject perReporterStat = NoSQLUtils.asDBObjectOrCreate(reporterStat, reporters);\r
+ NoSQLUtils.addLong(perReporterStat, "all_count", 1);\r
+ NoSQLUtils.addLong(perReporterStat, "all_duration", duration);\r
+\r
+ BasicDBObject ingestInfo = manager.getIngestInfo(scheduledDate, String.valueOf(parentStoryId));\r
+ if (ingestInfo != null) {\r
+ long ingestCount = ingestInfo.getLong("count");\r
+ long ingestDuration = ingestInfo.getLong("duration");\r
+ raw.put("ingest_count", ingestCount);\r
+ raw.put("ingest_duration", ingestDuration);\r
+ NoSQLUtils.addLong(planStat, "ingest_count", ingestCount);\r
+ NoSQLUtils.addLong(planStat, "ingest_duration", ingestDuration);\r
+ NoSQLUtils.addLong(perTypeStat, "ingest_count", ingestCount);\r
+ NoSQLUtils.addLong(perTypeStat, "ingest_duration", ingestDuration);\r
+ NoSQLUtils.addLong(perReporterStat, "ingest_count", ingestCount);\r
+ NoSQLUtils.addLong(perReporterStat, "ingest_duration", ingestDuration);\r
+ }\r
+\r
+ BasicDBObject archiveInfo = manager.getArchiveInfo(scheduledDate, String.valueOf(parentStoryId));\r
+ if (archiveInfo != null) {\r
+ long archiveCount = archiveInfo.getLong("count");\r
+ long archiveDuration = archiveInfo.getLong("duration");\r
+ raw.put("archive_count", archiveCount);\r
+ raw.put("archive_duration", archiveDuration);\r
+ NoSQLUtils.addLong(planStat, "archive_count", archiveCount);\r
+ NoSQLUtils.addLong(planStat, "archive_duration", archiveDuration);\r
+ NoSQLUtils.addLong(perTypeStat, "archive_count", archiveCount);\r
+ NoSQLUtils.addLong(perTypeStat, "archive_duration", archiveDuration);\r
+ NoSQLUtils.addLong(perReporterStat, "archive_count", archiveCount);\r
+ NoSQLUtils.addLong(perReporterStat, "archive_duration", archiveDuration);\r
+ }\r
+\r
+ //skipped\r
+ if (sfCount > 0 && rdCount == 0) {\r
+ NoSQLUtils.addLong(planStat, "skip_count", 1);\r
+ NoSQLUtils.addLong(planStat, "skip_duration", duration);\r
+ NoSQLUtils.addLong(perTypeStat, "skip_count", 1);\r
+ NoSQLUtils.addLong(perTypeStat, "skip_duration", duration);\r
+ NoSQLUtils.addLong(perReporterStat, "skip_count", 1);\r
+ NoSQLUtils.addLong(perReporterStat, "skip_duration", duration);\r
+ }\r
+\r
+ //onair\r
+ if (rdCount > 0) {\r
+ NoSQLUtils.addLong(planStat, "onair_count", 1);\r
+ NoSQLUtils.addLong(planStat, "onair_duration", duration);\r
+ NoSQLUtils.addLong(perTypeStat, "onair_count", 1);\r
+ NoSQLUtils.addLong(perTypeStat, "onair_duration", duration);\r
+ NoSQLUtils.addLong(perReporterStat, "onair_count", 1);\r
+ NoSQLUtils.addLong(perReporterStat, "onair_duration", duration);\r
+ }\r
+\r
+ }\r
+ }\r
+\r
+ store(scheduledDate, rawData, typeStat, planStat, reporterStat);\r
+ }\r
+\r
}\r
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
FileVisitResult result = FileVisitResult.SKIP_SUBTREE;\r
\r
- if (dir.equals(Paths.get(sourcePath)) || "HIRADO".equals(dir.toFile().getName().toUpperCase())\r
- || "NAPIAKT".equals(dir.toFile().getName().toUpperCase()))\r
+ if (dir.equals(Paths.get(sourcePath)) || "2017".equals(dir.toFile().getName().toUpperCase())\r
+ || "2018".equals(dir.toFile().getName().toUpperCase()))\r
result = FileVisitResult.CONTINUE;\r
else {\r
- if ("HIRADO".equals(dir.getParent().toFile().getName().toUpperCase())\r
- || "NAPIAKT".equals(dir.getParent().toFile().getName().toUpperCase())) {\r
+ if ("2017".equals(dir.getParent().toFile().getName().toUpperCase())\r
+ || "2018".equals(dir.getParent().toFile().getName().toUpperCase())) {\r
try {\r
startDateformat.parse(dir.toFile().getName());\r
result = FileVisitResult.CONTINUE;\r
return result;\r
}\r
\r
+ public static BasicDBObject asDBObjectOrCreate(BasicDBObject obj, String name) {\r
+ BasicDBObject result = asDBObject(obj, name);\r
+ if (result == null) {\r
+ result = new BasicDBObject();\r
+ obj.put(name, result);\r
+ }\r
+ return result;\r
+ }\r
+\r
public static List<BasicDBObject> asList(BasicDBList obj) {\r
List<BasicDBObject> result = null;\r
if (obj != null && obj.size() > 0)\r
assertNotNull(stepClass);\r
}\r
\r
+ // @Test\r
+ // public void test7() throws Exception {\r
+ // String x = "aaaassss";\r
+ // System.out.println(x.substring(0, 200));\r
+ // }\r
+\r
@Test\r
public void testClient() {\r
ResteasyWebTarget webTarget = new ResteasyClientBuilder().build().target("http://10.10.1.28/services/rest/octopus/");\r
public class ArchivedMedia {\r
private Item item;\r
private Media media;\r
+ private String relevant;\r
\r
public Item getItem() {\r
return item;\r
return media;\r
}\r
\r
+ public String getRelevant() {\r
+ return relevant;\r
+ }\r
+\r
public void setItem(Item item) {\r
this.item = item;\r
}\r
this.media = media;\r
}\r
\r
+ public void setRelevant(String relevant) {\r
+ this.relevant = relevant;\r
+ }\r
+\r
}\r
*/\r
IEntityBase retrieveCached(Class<? extends IEntityBase> baseClass, Object key);\r
\r
- SearchResult<ArchivedMedia> search(String criteria, int fromResult, int toResult);\r
+ SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, int fromResult, int toResult);\r
\r
/**\r
* A bemeneti paraméterként kapott keresési feltételeknek megfelelő Anyagokat lekéri az adatbázisból és SearchResult objektumba csomagolva visszatér.\r
import java.sql.Connection;\r
import java.sql.PreparedStatement;\r
import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
import java.util.ArrayList;\r
import java.util.Formatter;\r
import java.util.List;\r
return resultQuery.toString();\r
}\r
\r
+ private PreparedStatement createArchiveMediaSearchStatement(Connection connection, String criteria, List<String> typeIDs) throws SQLException {\r
+ StringBuilder typeCriteria = new StringBuilder();\r
+ if (typeIDs != null) {\r
+ typeCriteria.append("(");\r
+ for (int i = 0; i < typeIDs.size(); i++) {\r
+ typeCriteria.append(typeIDs.get(i));\r
+ if (i < typeIDs.size() - 1)\r
+ typeCriteria.append(",");\r
+ }\r
+ typeCriteria.append(")");\r
+ }\r
+\r
+ StringBuilder sql = new StringBuilder();\r
+ sql.append("SELECT * FROM ((");\r
+ sql.append("SELECT DISTINCT m.id, m.title FROM ITEM i, MEDIA m, MEDIAFILE mf");\r
+ sql.append(" WHERE ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1)) AND m.itemid = i.id AND mf.mediaid = m.id");\r
+ if (typeIDs != null)\r
+ sql.append(" AND m.itemtypeid IN ").append(typeCriteria.toString());\r
+ sql.append(")UNION(");\r
+ sql.append("SELECT DISTINCT m2.id,m2.title FROM ITEM i2, MEDIA m2, MEDIAFILE mf2");\r
+ sql.append(" WHERE ((CONTAINS(m2.title, ?) >= 1) OR (CONTAINS(m2.description, ?) >= 1)) AND m2.itemid = i2.id AND mf2.mediaid = m2.id");\r
+ if (typeIDs != null)\r
+ sql.append(" AND m2.itemtypeid IN ").append(typeCriteria.toString());\r
+ sql.append(")UNION(");\r
+ sql.append("SELECT DISTINCT m3.id,m3.title FROM ITEM i3, MEDIA m3, MEDIAFILE mf3");\r
+ sql.append(" WHERE (CONTAINS(mf3.houseId, ?) >= 1) AND m3.itemid = i3.id AND mf3.mediaid = m3.id");\r
+ if (typeIDs != null)\r
+ sql.append(" AND m3.itemtypeid IN ").append(typeCriteria.toString());\r
+ sql.append(")) ORDER BY title");\r
+\r
+ String query = sql.toString();\r
+ PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
+\r
+ for (int s = 1; s <= 5; s++) {\r
+ st.setString(s, criteria);\r
+ }\r
+ return st;\r
+ }\r
+\r
private List<SearchResult> getResultHeaders(Connection connection, QueryObject queryObject, String innerQuery) {\r
List<SearchResult> results = new ArrayList<SearchResult>();\r
String typeQuery;\r
return results;\r
}\r
\r
+ private List<String> getTypeIDs(List<String> searchFilters) {\r
+ List<String> result = null;\r
+ if (searchFilters != null) {\r
+ for (String typeName : searchFilters) {\r
+ ItemType itemType = manager.getItemType(typeName);\r
+ if (itemType == null)\r
+ continue;\r
+ if (result == null)\r
+ result = new ArrayList<>();\r
+ result.add(String.valueOf(itemType.getId()));\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
public List<Media> getUntranscodedMedias() {\r
List<Media> result = null;\r
\r
return result;\r
}\r
\r
- public SearchResult<ArchivedMedia> searchArchivedMedia(String criteria, int fromResult, int toResult) {\r
+ public SearchResult<ArchivedMedia> searchArchivedMedia(String criteria, List<String> searchFilters, int fromResult, int toResult) {\r
SearchResult<ArchivedMedia> result = new SearchResult<>();\r
\r
+ List<String> typeIDs = getTypeIDs(searchFilters);\r
+\r
ResultSet rs = null;\r
PreparedStatement st = null;\r
DefaultContext context = manager.getDbContext();\r
Connection connection = context.getConnection();\r
-\r
try {\r
- StringBuffer sql = new StringBuffer();\r
\r
- sql.append("SELECT * FROM ((");\r
- sql.append("SELECT DISTINCT m.id,m.title FROM ITEM i, MEDIA m, MEDIAFILE mf");\r
- sql.append(" WHERE ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1)) AND m.itemid = i.id AND mf.mediaid = m.id");\r
- sql.append(")UNION(");\r
- sql.append("SELECT DISTINCT m2.id,m2.title FROM ITEM i2, MEDIA m2, MEDIAFILE mf2");\r
- sql.append(" WHERE ((CONTAINS(m2.title, ?) >= 1) OR (CONTAINS(m2.description, ?) >= 1)) AND m2.itemid = i2.id AND mf2.MEDIAID = m2.id");\r
- sql.append(")UNION(");\r
- sql.append("SELECT DISTINCT m3.id,m3.title FROM ITEM i3, MEDIA m3, MEDIAFILE mf3");\r
- sql.append(" WHERE (CONTAINS(mf3.houseId, ?) >= 1) AND m3.itemid = i3.id AND mf3.mediaid = m3.id");\r
- sql.append(")) ORDER BY title");\r
-\r
- String query = sql.toString();\r
- st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
- for (int s = 1; s <= 5; s++) {\r
- st.setString(s, criteria);\r
- }\r
+ st = createArchiveMediaSearchStatement(connection, criteria, typeIDs);\r
rs = st.executeQuery();\r
rs.last();\r
result.setItemCount(rs.getRow());\r
}\r
} else {\r
if (result.getItemCount() > 0) {\r
- throw new Exception("Invalid searchResult 'from' position: " + fromResult + " total records: " + result.getItemCount() + " " + query);\r
+ throw new Exception("Invalid searchResult 'from' position: " + fromResult + " total records: " + result.getItemCount());\r
}\r
}\r
} else {\r
\r
int maxRecords = toResult - fromResult;\r
\r
+ String[] criterias = criteria.replace("*", "").replace("+", " ").split(" ");\r
+ if (criteria.startsWith("\"") && criteria.endsWith("\""))\r
+ criterias = new String[] { criteria.replace("\"", "") };\r
List<ArchivedMedia> resultList = null;\r
logger.info("Processing query result, maxRecords {}", maxRecords);\r
while (rs.next() && maxRecords > 0) {\r
am.setMedia(media);\r
Item item = manager.getItem(media.getItemId());\r
am.setItem(item);\r
+\r
if (resultList == null)\r
resultList = new ArrayList<>();\r
resultList.add(am);\r
+\r
+ setRelevant(criterias, am, media.getDescription());\r
+ if (am.getRelevant() == null)\r
+ setRelevant(criterias, am, item.getDescription());\r
+\r
+ //media.setTitle(media.getTitle().replace("hirado", "<html><![CDATA[]]></html>"));\r
maxRecords--;\r
}\r
logger.info("Query result processed");\r
\r
return result;\r
}\r
+\r
+ private void setRelevant(String[] criterias, ArchivedMedia am, String content) {\r
+ if (content == null)\r
+ return;\r
+ for (String c : criterias) {\r
+ if (c != null && c.length() > 2) {\r
+\r
+ int pos = content.toLowerCase().indexOf(c.toLowerCase());\r
+ if (pos > -1) {\r
+ int start = 0;\r
+ if (pos > 100)\r
+ start = pos - 100;\r
+ else\r
+ start = 0;\r
+ int end = pos + 200;\r
+ if (end > content.length() - 1)\r
+ end = content.length() - 1;\r
+\r
+ String relevant = content.substring(start, pos) + "<b>" + content.substring(pos, pos + c.length()) + "</b>"\r
+ + content.substring(pos + c.length(), end);\r
+\r
+ if (start > 0)\r
+ relevant = "..." + relevant;\r
+ if (end < content.length() - 1)\r
+ relevant = relevant + "...";\r
+\r
+ am.setRelevant(relevant);\r
+ break;\r
+ }\r
+\r
+ }\r
+ }\r
+ }\r
}\r
}\r
\r
@Override\r
- public SearchResult<ArchivedMedia> search(String criteria, int fromResult, int toResult) {\r
+ public SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, int fromResult, int toResult) {\r
traceIn();\r
SearchResult<ArchivedMedia> result = null;\r
ItemDAOEx itemDb = new ItemDAOEx(this);\r
- result = itemDb.searchArchivedMedia(criteria, fromResult, toResult);\r
+ result = itemDb.searchArchivedMedia(criteria, searchFilters, fromResult, toResult);\r
traceOut();\r
return result;\r
}\r
<script>\r
\r
function frameToTC(value) {\r
- console.log('frameToTC ' + value)\r
+ //console.log('frameToTC ' + value)\r
var reminder = value;\r
var hour = Math.floor(reminder / (60 * 60 * 25));\r
reminder = reminder % (60 * 60 * 25);\r
}\r
</style>\r
<div id="scdiv" width="100%" height="100%" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.SearchModel')">\r
+ <timer id="timer" delay="100" repeats="true" onTimer="@command('uiTick')" />\r
<borderlayout>\r
<west border="none" size="60%" splittable="true" minsize="250">\r
<div height="100%" width="100%">\r
tooltiptext="Gépelje be a keresendő kifejezést és nyomja meg az Enter-t." onOK="@command('doSearch')" />\r
<toolbar vflex="min" style="font-size:8px">\r
<checkbox checked="@bind(vm.allChecked)" />\r
- <toolbarbutton label="Hír bejátszó" mode="toggle" checked="@bind(vm.newsFeedChecked)" />\r
- <toolbarbutton label="Hír nyersanyag" mode="toggle" checked="@bind(vm.newsRawChecked)" />\r
- <toolbarbutton label="Műsor" mode="toggle" checked="@bind(vm.materialChecked)" />\r
- <toolbarbutton label="Műsor nyersanyag" mode="toggle" checked="@bind(vm.materialRawChecked)" />\r
- <toolbarbutton label="Promo" mode="toggle" checked="@bind(vm.promoChecked)" />\r
- <toolbarbutton label="Promo nyersanyag" mode="toggle" checked="@bind(vm.promoRawChecked)" />\r
- <toolbarbutton label="Reklám" mode="toggle" checked="@bind(vm.adChecked)" />\r
- <toolbarbutton label="Reklám nyersanyag" mode="toggle" checked="@bind(vm.adRawChecked)" />\r
- <toolbarbutton label="Visszarögzített" mode="toggle" checked="@bind(vm.recordingChecked) " />\r
- <toolbarbutton label="Egyéb" mode="toggle" checked="@bind(vm.otherChecked)" />\r
+ <forEach items="@load(vm.typeFilterNames)" >\r
+ <toolbarbutton label="@load(each)" mode="toggle" checked="@bind(vm.typeFilters[each]) @validator(vm.allFilterCheckedValidator)" />\r
+ </forEach> \r
</toolbar>\r
</groupbox>\r
<groupbox vflex="true" closable="false">\r
<grid id="itemResults" sizedByContent="false" span="true" vflex="true" hflex="true" mold="paging" autopaging="false"\r
- model="@load(vm.searchResult)" activePage="@bind(vm.activePage)" selectedItem="@bind(vm.selectedObject)"\r
- style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" emptyMessage="Nincs találat!">\r
+ model="@load(vm.searchResult)" activePage="@bind(vm.activePage)" emptyMessage="Nincs találat!"\r
+ style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style"\r
+ onAfterRender="@command('onPaging')">\r
<columns>\r
<column hflex="min">\r
<checkbox checked="@bind(vm.rowsExpanded)"/>\r
<column label="Fájlnév" hflex="min" align="left" />\r
<column label="Megtekinthető" hflex="min" align="right" />\r
</columns>\r
- <rows>\r
+ <rows id="rows">\r
<template name="model">\r
<row>\r
<detail open="@load(vm.rowsExpanded)">\r
<hlayout>\r
- <image tooltiptext="Kattints a lejátszáshoz!" width="140px" height="90px" sclass="myimg" content="@load(each.media.poster) @converter('user.jobengine.zk.model.ByToImageConverter')" />\r
+ <image tooltiptext="Kattints a lejátszáshoz!" width="140px" height="90px" sclass="myimg" content="@load(each.media.poster) @converter('user.jobengine.zk.model.ByToImageConverter')" onClick="@command('selectMediaArchive', selectedObject=each)" />\r
<div sclass="details">\r
<div>\r
<label value="Típus:" sclass="heavy" />\r
<label value="@load(each.item.title)" />\r
</div>\r
<div>\r
- <label value="@load(each.media.description)" maxlength="200" />\r
+ <label value="@load(each.relevant)" />\r
</div>\r
</div>\r
</hlayout>\r
\r
function statisticsYValue(value, series) {\r
var options = series[value - 1];\r
- console.log("statisticsYValue", series.name, value, series);\r
+ //console.log("statisticsYValue", series.name, value, series);\r
return options == null ? "" : options.userOptions.name;\r
}\r
</script>\r
+ <style>\r
+ .highcharts-axis-labels {\r
+ background-color: red;\r
+ } \r
+ </style>\r
<vlayout vflex="1" hflex="1" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsModel')">\r
<hbox height="40px" align="center">\r
<space bar="false" />\r
<radio label="Műsorok" />\r
</radiogroup>\r
</hbox>\r
- <div vflex="1" hflex="1" style="overflow:auto;" onAfterSize='chart.setWidth(new Integer(event.getWidth() - 20))'>\r
+ <div width="100%" height="70px" onAfterSize='legendChart.setWidth(new Integer(event.getWidth()));legendChart.setHeight(new Integer(event.getHeight()));'>\r
+ <charts id="legendChart" type="column" />\r
+ </div>\r
+ <div hflex="1" vflex="1" style="overflow:auto;" onAfterSize='chart.setWidth(new Integer(event.getWidth() - 20));'>\r
<charts id="chart" type="spline" zoomType="x" />\r
</div>\r
</vlayout>\r
<window id="wnd" title="Anyag életút" width="900px" sizable="true" border="normal" apply="org.zkoss.bind.BindComposer"\r
viewModel="@id('vm') @init('user.jobengine.zk.model.StatisticsDetailsModel')" forward="onCancel=closeButton.onClick">\r
<hlayout height="450px">\r
- <grid sizedByContent="true" model="@load(vm.events)" vflex="true" hflex="true" style="border: none; background: #e3e3e3 !important;">\r
+ <grid id="grid" sizedByContent="true" model="@load(vm.events)" vflex="true" hflex="true" style="border: none; background: #e3e3e3 !important;">\r
<columns sizable="true">\r
<column forEach="${vm.columnList}" label="${each}"></column>\r
</columns>\r
- <rows>\r
+ <rows id="rows">\r
<template name="model" var="r">\r
<row>\r
- <label forEach="${vm.columnList}" value="${r.get(each)}">\r
+ <label forEach="${vm.columnList}" value="${r.get(each)}" >\r
<attribute name="style" if="${vm.isSelected(r)}">\r
- color: green;\r
+ font-weight: bold;\r
+ </attribute> \r
+ <attribute name="style" if="${each eq 'Tag'}">\r
+ background: ${r.get('Color')};\r
</attribute> \r
</label>\r
</row>\r
\r
private ArrayList<EventListener> eventListenerList = new ArrayList<EventListener>();\r
private IItemManager itemManager = null;\r
+ private List<String> searchFilters;\r
\r
- public CachedListModel(String _searchValue) {\r
- this.searchValue = _searchValue;\r
+ public CachedListModel(String searchValue, List<String> searchFilters) {\r
+ this.searchValue = searchValue;\r
+ this.searchFilters = searchFilters;\r
this.itemManager = ItemManager.getInstance();\r
//this.setMultiple(true);\r
reinit();\r
}\r
}\r
\r
+ private String formatSearchValue(String value) {\r
+ String[] specials = new String[] { ":", "?", "%", "(", ")" };\r
+ String result = value;\r
+ for (String c : specials) {\r
+ result = result.replace(c, "\\" + c);\r
+ }\r
+ if (!(result.startsWith("\"") && result.endsWith("\"")))\r
+ result += "*";\r
+ return result;\r
+ }\r
+\r
public int getCacheEnd() {\r
return cacheEnd;\r
}\r
int endPos = (startPos + rowLimit);\r
endPos = ((this.resultSetSize < 0) || (endPos <= this.resultSetSize)) ? endPos : this.resultSetSize;\r
\r
- SearchResult<ArchivedMedia> sr = this.itemManager.search(searchValue + "*", startPos, endPos);\r
+ SearchResult<ArchivedMedia> sr = this.itemManager.search(formatSearchValue(searchValue), searchFilters, startPos, endPos);\r
\r
if (sr != null) {\r
if (this.resultSetSize < 0) {\r
\r
private static void fill(Charts charts, BasicDBObject datas, String member) {\r
Point maxPoint = null;\r
- BasicDBObject rawData = (BasicDBObject) datas.get("rawData");\r
- for (String name : rawData.keySet()) {\r
- BasicDBObject dbo = NoSQLUtils.asDBObject(rawData, name);\r
+ for (String name : datas.keySet()) {\r
+ BasicDBObject dbo = NoSQLUtils.asDBObject(datas, name);\r
Number y = dbo.getLong(member);\r
Point point = new Point(name, y);\r
charts.getSeries().addPoint(point);\r
init(charts);\r
charts.setTitle("Adásbejátszók száma típus szerint");\r
charts.getSeries().getDataLabels().setFormat("{point.name} {point.y} db");\r
- fill(charts, datas, "count");\r
+ fill(charts, datas, "onair_count");\r
}\r
\r
static public void initTypeDuration(Charts charts, BasicDBObject datas) {\r
init(charts);\r
charts.setTitle("Adásbejátszók hossza típus szerint");\r
charts.getSeries().getDataLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return this.point.name + ' ' + frameToTC(this.y); }"));\r
- fill(charts, datas, "duration");\r
+ fill(charts, datas, "onair_duration");\r
}\r
\r
}\r
@AfterCompose\r
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
Selectors.wireComponents(view, this, false);\r
- setSelectedDate(new Date());\r
+ Calendar calendar = CalendarUtils.createZeroCalendar();\r
+ calendar.add(Calendar.DAY_OF_YEAR, -1);\r
+ setSelectedDate(calendar.getTime());\r
}\r
\r
private void clearChart(Charts charts) {\r
\r
import java.net.URL;\r
import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
import java.util.HashMap;\r
+import java.util.LinkedHashMap;\r
import java.util.List;\r
import java.util.Map;\r
\r
import org.apache.commons.lang.StringUtils;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
+import org.zkoss.bind.ValidationContext;\r
+import org.zkoss.bind.Validator;\r
+import org.zkoss.bind.annotation.AfterCompose;\r
+import org.zkoss.bind.annotation.BindingParam;\r
import org.zkoss.bind.annotation.Command;\r
+import org.zkoss.bind.annotation.ContextParam;\r
+import org.zkoss.bind.annotation.ContextType;\r
import org.zkoss.bind.annotation.NotifyChange;\r
+import org.zkoss.zk.ui.Component;\r
import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.select.Selectors;\r
+import org.zkoss.zk.ui.select.annotation.Wire;\r
import org.zkoss.zul.Messagebox;\r
+import org.zkoss.zul.Rows;\r
import org.zkoss.zul.Window;\r
\r
import user.commons.StoreUri;\r
import user.jobengine.db.MediaFile;\r
import user.jobengine.db.Store;\r
\r
-public class SearchModel extends BaseModel {\r
+public class SearchModel extends AsyncBaseModel {\r
private static final Logger logger = LogManager.getLogger();\r
private static final String MEDIACUBEMEDIA = "mediaCubeMedia";\r
private static final String PAGES_RETRIEVESELECTOR_ZUL = "/pages/retrieveselector.zul";\r
private static final String PAGES_MEDIAPLAYER = "/pages/mediaplayer.jsp?mediaurl=";\r
-\r
+ private List<String> typeFilterNames;\r
private String searchValue = null;\r
private CachedListModel searchResult = null;\r
private ArchivedMedia selectedObject = null;\r
- private boolean newsFeedChecked = true;\r
+ private Validator allFilterCheckedValidator;\r
+ private Map<String, Object> typeFilters;\r
private boolean allChecked = true;\r
- private boolean newsRawChecked = true;\r
- private boolean materialChecked = true;\r
- private boolean materialRawChecked = true;\r
- private boolean promoChecked = true;\r
- private boolean promoRawChecked = true;\r
- private boolean adChecked = true;\r
- private boolean adRawChecked = true;\r
- private boolean recordingChecked = true;\r
- private boolean otherChecked = true;\r
private int activePage;\r
private boolean rowsExpanded = true;\r
+ @Wire\r
+ Rows rows;\r
+\r
+ public SearchModel() {\r
+ typeFilters = new LinkedHashMap<>();\r
+ typeFilters.put("Hír bejátszó", true);\r
+ typeFilters.put("Hír nyersanyag", true);\r
+ typeFilters.put("Műsor", true);\r
+ typeFilters.put("Műsor nyersanyag", true);\r
+ typeFilters.put("Promo", true);\r
+ typeFilters.put("Promo nyersanyag", true);\r
+ typeFilters.put("Reklám", true);\r
+ typeFilters.put("Reklám nyersanyag", true);\r
+ typeFilters.put("Visszarögzített", true);\r
+ typeFilters.put("Egyéb", true);\r
+ typeFilterNames = new ArrayList<>(typeFilters.keySet());\r
+\r
+ allFilterCheckedValidator = new Validator() {\r
+ @Override\r
+ public void validate(ValidationContext ctx) {\r
+ try {\r
+\r
+ String label = ctx.getProperty().getProperty();\r
+ boolean isChecked = (boolean) ctx.getProperty().getValue();\r
+ typeFilters.put(label, isChecked);\r
+ //logger.info("{} {}", label, isChecked);\r
+ } catch (Exception e) {\r
+\r
+ }\r
+ updateAllChecked();\r
+ }\r
+ };\r
+ }\r
+\r
+ @AfterCompose\r
+ public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+ Selectors.wireComponents(view, this, false);\r
+ Selectors.wireEventListeners(view, this);\r
+ }\r
\r
@Command\r
@NotifyChange({ "activePage", "searchResult", "selectedObject", "hasLowresMediaFile" })\r
this.selectedObject = null;\r
if (StringUtils.isBlank(searchValue) || searchValue.length() < 3)\r
throw new Exception("Legalább 3 karakter megadása kötelező!");\r
- searchResult = new CachedListModel(searchValue);\r
+\r
+ List<String> searchFilters = getSelectedFilters();\r
+\r
+ searchResult = new CachedListModel(searchValue, searchFilters);\r
} catch (Exception e) {\r
Messagebox.show(e.getMessage());\r
logger.catching(e);\r
return activePage;\r
}\r
\r
+ public Validator getAllFilterCheckedValidator() {\r
+ return allFilterCheckedValidator;\r
+ }\r
+\r
public boolean getHasLowresMediaFile() {\r
boolean ret = false;\r
Media media = getMedia();\r
return searchValue;\r
}\r
\r
+ private List<String> getSelectedFilters() {\r
+ List<String> result = null;\r
+ if (!allChecked) {\r
+ for (String label : typeFilters.keySet()) {\r
+ boolean isChecked = (boolean) typeFilters.get(label);\r
+ if (!isChecked)\r
+ continue;\r
+ if (result == null)\r
+ result = new ArrayList<>();\r
+ result.add(label);\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
public ArchivedMedia getSelectedObject() {\r
return selectedObject;\r
}\r
return ret;\r
}\r
\r
- public boolean isAdChecked() {\r
- return adChecked;\r
+ public List<String> getTypeFilterNames() {\r
+ return typeFilterNames;\r
}\r
\r
- public boolean isAdRawChecked() {\r
- return adRawChecked;\r
+ public Map<String, Object> getTypeFilters() {\r
+ return typeFilters;\r
}\r
\r
public boolean isAllChecked() {\r
return allChecked;\r
}\r
\r
- public boolean isMaterialChecked() {\r
- return materialChecked;\r
- }\r
-\r
- public boolean isMaterialRawChecked() {\r
- return materialRawChecked;\r
- }\r
-\r
- public boolean isNewsFeedChecked() {\r
- return newsFeedChecked;\r
- }\r
-\r
- public boolean isNewsRawChecked() {\r
- return newsRawChecked;\r
- }\r
-\r
- public boolean isOtherChecked() {\r
- return otherChecked;\r
- }\r
-\r
- public boolean isPromoChecked() {\r
- return promoChecked;\r
- }\r
-\r
- public boolean isPromoRawChecked() {\r
- return promoRawChecked;\r
- }\r
-\r
- public boolean isRecordingChecked() {\r
- return recordingChecked;\r
- }\r
-\r
public boolean isRowsExpanded() {\r
return rowsExpanded;\r
}\r
\r
- public void setActivePage(int activePage) {\r
- this.activePage = activePage;\r
- }\r
-\r
- public void setAdChecked(boolean adChecked) {\r
- this.adChecked = adChecked;\r
- }\r
-\r
- public void setAdRawChecked(boolean adRawChecked) {\r
- this.adRawChecked = adRawChecked;\r
- }\r
-\r
- @NotifyChange({ "newsFeedChecked", "newsRawChecked", "materialChecked", "materialRawChecked", "promoChecked", "promoRawChecked", "adChecked",\r
- "adRawChecked", "recordingChecked", "otherChecked" })\r
- public void setAllChecked(boolean allFeedChecked) {\r
- this.allChecked = allFeedChecked;\r
- newsFeedChecked = allChecked;\r
- newsRawChecked = allChecked;\r
- materialChecked = allChecked;\r
- materialRawChecked = allChecked;\r
- promoChecked = allChecked;\r
- promoRawChecked = allChecked;\r
- adChecked = allChecked;\r
- adRawChecked = allChecked;\r
- recordingChecked = allChecked;\r
- otherChecked = allChecked;\r
- }\r
-\r
- public void setMaterialChecked(boolean materialChecked) {\r
- this.materialChecked = materialChecked;\r
- }\r
-\r
- public void setMaterialRawChecked(boolean materialRawChecked) {\r
- this.materialRawChecked = materialRawChecked;\r
- }\r
-\r
- public void setNewsFeedChecked(boolean newsFeedChecked) {\r
- this.newsFeedChecked = newsFeedChecked;\r
+ @Command\r
+ public void onPaging() {\r
+ // if (rows != null)\r
+ // Clients.scrollIntoView(rows);\r
}\r
\r
- public void setNewsRawChecked(boolean newsRawChecked) {\r
- this.newsRawChecked = newsRawChecked;\r
+ @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" })\r
+ public void selectedMediaArchive(ArchivedMedia selectedObject) {\r
+ this.selectedObject = selectedObject;\r
}\r
\r
- public void setOtherChecked(boolean otherChecked) {\r
- this.otherChecked = otherChecked;\r
+ @Command\r
+ @NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" })\r
+ public void selectMediaArchive(@BindingParam("selectedObject") ArchivedMedia selectedObject) {\r
+ this.selectedObject = selectedObject;\r
}\r
\r
- public void setPromoChecked(boolean promoChecked) {\r
- this.promoChecked = promoChecked;\r
+ public void setActivePage(int activePage) {\r
+ this.activePage = activePage;\r
}\r
\r
- public void setPromoRawChecked(boolean promoRawChecked) {\r
- this.promoRawChecked = promoRawChecked;\r
+ @NotifyChange("*")\r
+ public void setAllChecked(boolean allChecked) {\r
+ this.allChecked = allChecked;\r
+ for (String key : typeFilters.keySet())\r
+ typeFilters.put(key, allChecked);\r
}\r
\r
- public void setRecordingChecked(boolean recordingChecked) {\r
- this.recordingChecked = recordingChecked;\r
+ public void setAllFilterCheckedValidator(Validator allFilterCheckedValidator) {\r
+ this.allFilterCheckedValidator = allFilterCheckedValidator;\r
}\r
\r
public void setRowsExpanded(boolean rowsExpanded) {\r
this.selectedObject = selectedObject;\r
}\r
\r
+ public void setTypeFilterNames(List<String> typeFilterNames) {\r
+ this.typeFilterNames = typeFilterNames;\r
+ }\r
+\r
+ public void setTypeFilters(Map<String, Object> typeFilters) {\r
+ this.typeFilters = typeFilters;\r
+ }\r
+\r
+ public void updateAllChecked() {\r
+ final boolean[] check = { true };\r
+ for (String key : typeFilters.keySet()) {\r
+ if (!(boolean) typeFilters.get(key)) {\r
+ check[0] = false;\r
+ break;\r
+ }\r
+ }\r
+\r
+ registerTask(() -> {\r
+ allChecked = check[0];\r
+ NotifyChange("allChecked");\r
+ });\r
+ }\r
}\r
import java.util.Arrays;\r
import java.util.List;\r
\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
import org.zkoss.bind.annotation.AfterCompose;\r
import org.zkoss.bind.annotation.Command;\r
import org.zkoss.bind.annotation.ContextParam;\r
import org.zkoss.chart.Series;\r
import org.zkoss.zk.ui.Component;\r
import org.zkoss.zk.ui.Executions;\r
+import org.zkoss.zk.ui.event.Event;\r
import org.zkoss.zk.ui.select.Selectors;\r
+import org.zkoss.zk.ui.select.annotation.Listen;\r
import org.zkoss.zk.ui.select.annotation.Wire;\r
+import org.zkoss.zk.ui.util.Clients;\r
+import org.zkoss.zul.Grid;\r
+import org.zkoss.zul.Row;\r
+import org.zkoss.zul.Rows;\r
import org.zkoss.zul.Window;\r
\r
import com.ibm.nosql.json.JSONUtil;\r
import com.ibm.nosql.json.api.BasicDBObject;\r
\r
public class StatisticsDetailsModel extends BaseModel {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
@Wire("#wnd")\r
private Window wnd;\r
+ @Wire("#rows")\r
+ private Rows rows;\r
private List<BasicDBObject> events;\r
private List<String> columnList = Arrays.asList("Touched", "Started", "Finished", "Tag", "Successful", "UserName", "Source", "Destination");\r
private BasicDBObject selectedEvent;\r
@AfterCompose\r
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
Selectors.wireComponents(view, this, false);\r
+ Selectors.wireEventListeners(view, this);\r
+\r
Series series = (Series) Executions.getCurrent().getArg().get("series");\r
wnd.setTitle(series.getName());\r
Point selectedPoint = (Point) Executions.getCurrent().getArg().get("point");\r
return event.equals(selectedEvent);\r
}\r
\r
+ @Listen("onAfterRender = #grid")\r
+ public void onAfterRender(Event event) {\r
+ Grid grid = (Grid) event.getTarget();\r
+ grid.renderAll();\r
+\r
+ List<Component> children = rows.getChildren();\r
+ for (Component child : children) {\r
+ Row row = (Row) child;\r
+ if (row == null)\r
+ continue;\r
+ BasicDBObject value = row.getValue();\r
+ if (value == null)\r
+ continue;\r
+ logger.info("{}", value);\r
+ if (isSelected(value)) {\r
+ Clients.scrollIntoView(child);\r
+ break;\r
+ }\r
+\r
+ }\r
+\r
+ }\r
+\r
public void setColumnList(List<String> columnList) {\r
this.columnList = columnList;\r
}\r
package user.jobengine.zk.model;\r
\r
-import java.util.ArrayList;\r
import java.util.Calendar;\r
import java.util.Date;\r
-import java.util.HashMap;\r
+import java.util.LinkedHashMap;\r
import java.util.List;\r
import java.util.Locale;\r
import java.util.Map;\r
import org.zkoss.bind.annotation.AfterCompose;\r
import org.zkoss.bind.annotation.ContextParam;\r
import org.zkoss.bind.annotation.ContextType;\r
-import org.zkoss.chart.AxisLabels;\r
import org.zkoss.chart.Charts;\r
import org.zkoss.chart.ChartsEvent;\r
import org.zkoss.chart.Color;\r
import org.zkoss.chart.Lang;\r
+import org.zkoss.chart.Legend;\r
import org.zkoss.chart.Marker;\r
import org.zkoss.chart.Options;\r
import org.zkoss.chart.Point;\r
import org.zkoss.chart.Series;\r
import org.zkoss.chart.XAxis;\r
import org.zkoss.chart.YAxis;\r
+import org.zkoss.chart.plotOptions.ColumnPlotOptions;\r
import org.zkoss.chart.plotOptions.PlotOptions;\r
import org.zkoss.chart.plotOptions.SplinePlotOptions;\r
import org.zkoss.json.JavaScriptValue;\r
public class StatisticsModel {\r
private static final Logger logger = LogManager.getLogger();\r
private static final int XCOUNT = 60 * 24;\r
- private static Map<String, Color> colors = new HashMap<>();\r
+ private static Map<String, Color> colors = new LinkedHashMap<>();\r
static {\r
- colors.put("INGEST", new Color("red"));\r
- colors.put("Betöltés", new Color("green"));\r
colors.put("Adáskész", new Color("blue"));\r
colors.put("Archiválás", new Color("orange"));\r
+ colors.put("Betöltés", new Color("green"));\r
+ colors.put("Nexio", new Color("red"));\r
+ colors.put("Online", new Color("yellow"));\r
+ colors.put("PLayout", new Color("lightblue"));\r
colors.put("Újravágás", new Color("brown"));\r
}\r
\r
private Date selectedDate;\r
private int selectedType;\r
\r
- @Wire\r
+ @Wire("#chart")\r
Charts chart;\r
+ @Wire("#legendChart")\r
+ Charts legendChart;\r
\r
public StatisticsModel() {\r
this.itemManager = JobEngine.getStaticItemManager();\r
}\r
\r
+ private Series addLegendSeries(int index, String name, Color color, boolean show) {\r
+ Series result = legendChart.getSeries(index);\r
+ result.setColor(color);\r
+ //result.getPlotOptions().setShowInLegend(show);\r
+ result.setName(name);\r
+ //marker.setLineColor(color);\r
+ //marker.setSymbol("square");\r
+ //marker.setRadius(3);\r
+ //marker.setLineWidth(0);\r
+ return result;\r
+ }\r
+\r
private void addPoint(Series series, int x, int y, String data, Color color) {\r
Point p = new Point(x, y);\r
p.setName(data);\r
data.put("Tag", action.getTag());\r
data.put("Successful", action.isSuccessful());\r
data.put("UserName", action.getUserName());\r
+ data.put("Color", color == null ? "black" : color.stringValue());\r
addPoint(series, x, y, data.toString(), color);\r
}\r
\r
+ // private void clearChart() {\r
+ // int size = chart.getSeriesSize();\r
+ // for (int i = 0; i < size; i++)\r
+ // chart.getSeries(i).setData(new ArrayList<Integer>());\r
+ // size = legendChart.getSeriesSize();\r
+ // for (int i = 0; i < size; i++)\r
+ // legendChart.getSeries(i).setData(new ArrayList<Integer>());\r
+ // }\r
+\r
@AfterCompose\r
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
Selectors.wireComponents(view, this, false);\r
setSelectedDate(new Date());\r
}\r
\r
- private void clearChart() {\r
- int size = chart.getSeriesSize();\r
- for (int i = 0; i < size; i++)\r
- chart.getSeries(i).setData(new ArrayList<Integer>());\r
+ private void clearChart(Charts charts) {\r
+ int seriesSize = charts.getSeriesSize();\r
+ for (int i = 0; i < seriesSize; i++) {\r
+ charts.getSeries(0).remove();\r
+ }\r
+\r
+ int axisSize = charts.getyAxisSize();\r
+ for (int i = 0; i < axisSize; i++) {\r
+ charts.getYAxis(0).remove();\r
+ }\r
+\r
+ charts.setTitle("");\r
+ charts.setSubtitle("");\r
}\r
\r
private void configureChart() {\r
+\r
Options options = chart.getOptions();\r
if (options == null)\r
options = new Options();\r
-\r
Lang lang = options.getLang();\r
if (lang == null)\r
lang = new Lang();\r
lang.setResetZoom("Nagyítás vége");\r
chart.getTooltip().setEnabled(false);\r
chart.getExporting().setEnabled(false);\r
+ chart.setTitle("");\r
\r
- chart.setTitle("Anyagok élettörténete");\r
- chart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(selectedDate), new Locale("hu")));\r
+ // chart.setTheme(Theme.GRAY);\r
+ //chart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(selectedDate), new Locale("hu")));\r
chart.getLegend().setEnabled(false);\r
+\r
PlotOptions plotOptions = chart.getPlotOptions();\r
plotOptions.getSeries().setAllowPointSelect(true);\r
+\r
SplinePlotOptions soptions = plotOptions.getSpline();\r
soptions.setLineWidth(0);\r
soptions.setAnimation(false);\r
marker.setSymbol("square");\r
}\r
\r
+ private void configureLegend() {\r
+ Options options = legendChart.getOptions();\r
+ if (options == null)\r
+ options = new Options();\r
+ Lang lang = options.getLang();\r
+ if (lang == null)\r
+ lang = new Lang();\r
+\r
+ options.setLang(lang);\r
+ legendChart.setOptions(options);\r
+ lang.setNoData("");\r
+\r
+ legendChart.setTitle("Anyagok élettörténete");\r
+ legendChart.setSubtitle(CalendarUtils.toDateWithDayString(CalendarUtils.createCalendar(selectedDate), new Locale("hu")));\r
+ //legendChart.setShowAxes(false);\r
+ legendChart.getXAxis().setShowEmpty(false);\r
+ legendChart.getXAxis().setLineWidth(0);\r
+ legendChart.getYAxis().setTitle("");\r
+ legendChart.getYAxis().setShowEmpty(false);\r
+\r
+ Legend legend = legendChart.getLegend();\r
+ legend.setEnabled(true);\r
+ legend.setVerticalAlign("bottom");\r
+ legend.setAlign("right");\r
+ legend.setBorderWidth(0);\r
+\r
+ legendChart.getTooltip().setEnabled(false);\r
+ legendChart.getExporting().setEnabled(false);\r
+ ColumnPlotOptions plot = legendChart.getPlotOptions().getColumn();\r
+ plot.setAnimation(false);\r
+ plot.setEnableMouseTracking(false);\r
+ plot.setAllowPointSelect(true);\r
+\r
+ int index = 0;\r
+ for (String name : colors.keySet()) {\r
+ addLegendSeries(index++, name, colors.get(name), true);\r
+ }\r
+\r
+ }\r
+\r
private int fillData(List<WorkflowAction> actions) {\r
int result = 0;\r
String lastHouseId = null;\r
return selectedType;\r
}\r
\r
+ @Listen("onPlotLegendItemClick = #legendChart")\r
+ public void onPlotLegendItemClick(ChartsEvent event) {\r
+ logger.info("{} {} {}", event.isChecked(), event.getSeries(), event.getSeries());\r
+ }\r
+\r
@Listen("onPlotSelect = #chart")\r
public void onPlotSelect(ChartsEvent event) {\r
Point point = event.getPoint();\r
}\r
\r
private void setupXAxis() {\r
- XAxis xAxis = chart.getXAxis();\r
- xAxis.setTickInterval(30);\r
- xAxis.setMin(0);\r
- xAxis.setMax(XCOUNT);\r
- AxisLabels xLabels = xAxis.getLabels();\r
- xLabels.setRotation(-45);\r
- xAxis.getLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return statisticsXValue(this.value); }"));\r
+ XAxis xAxisDown = chart.getXAxis(0);\r
+ xAxisDown.setTickInterval(30);\r
+ xAxisDown.setMin(0);\r
+ xAxisDown.setMax(XCOUNT);\r
+ xAxisDown.getLabels().setRotation(-70);\r
+ xAxisDown.getLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return statisticsXValue(this.value); }"));\r
+\r
+ XAxis xAxisUp = chart.getXAxis(1);\r
+ xAxisUp.setTickInterval(30);\r
+ xAxisUp.setMin(0);\r
+ xAxisUp.setMax(XCOUNT);\r
+ xAxisUp.getLabels().setRotation(-70);\r
+ xAxisUp.getLabels().addExtraAttr("formatter", new JavaScriptValue("function () { return statisticsXValue(this.value); }"));\r
+ xAxisUp.setOpposite(true);\r
}\r
\r
private void setupYAxis(int distinctCount) {\r
} else {\r
yAxis.setGridLineWidth(1);\r
//Solid, ShortDash, ShortDot, ShortDashDot, ShortDashDotDot, Dot , Dash, LongDash, DashDot, LongDashDot, and LongDashDotDot\r
- yAxis.setGridLineDashStyle("LongDashDot");\r
+ yAxis.setGridLineDashStyle("Solid");\r
yAxis.setGridLineColor(new Color("lightgray"));\r
}\r
\r
}\r
\r
public void showChart() {\r
- clearChart();\r
+ clearChart(legendChart);\r
+ configureLegend();\r
+\r
+ clearChart(chart);\r
configureChart();\r
+\r
setupXAxis();\r
List<WorkflowAction> actions = itemManager.getWorkflowActions(selectedDate);\r
if (actions == null || actions.size() == 0) {\r