ad_base_dn=DC=intra,DC=echotv,DC=hu\r
ad_admin_map=G_ECH_U_INFORMATIKUSOK,G_ECH_U_MUSZAKVEZETOK,ECH-ISILON-ADMINS\r
local_users=user:password;kuka:kuka\r
-local_admins=root:password\r
+local_admins=root:password:vasary@elgekko.net\r
local_jobsubmitters=lebony:lebony
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate name="Archivált anyag visszatöltése">\r
+<jobtemplate name="Archivált anyag visszatöltése" multiInstance="true">\r
<declarations>\r
<parameters>\r
<parameter name="trafficOutputPath" type="java.lang.String" />\r
private static final String LONGNAMEID = "longnameid";\r
private static final String ARCHIVEDRUNDOWNS = "archivedrundowns";\r
private static final String ID = "id";\r
- private static final String MEDIATYPE = "Octopus bejátszó";\r
+ private static final String MEDIATYPE = "Hír bejátszó";\r
private OctopusAPI octopusAPI;\r
private IItemManager manager;\r
\r
import java.util.Calendar;\r
import java.util.Date;\r
import java.util.List;\r
+import java.util.TimeZone;\r
\r
import org.apache.commons.lang.StringUtils;\r
import org.apache.commons.net.ftp.FTP;\r
logger.warn(systemMarker, "A '{}' fájl neve nem időbélyeggel kezdődik, ezért nem archiválható.", clipName);\r
return null;\r
}\r
- return CalendarUtils.createCalendar(CalendarUtils.createCalendar(recordDate), timePart).getTime();\r
+ Calendar dateCal = CalendarUtils.createCalendar(recordDate);\r
+ dateCal.setTimeZone(TimeZone.getTimeZone("Europe/Budapest"));\r
+ Calendar wholeCal = CalendarUtils.createCalendar(CalendarUtils.createCalendar(recordDate), timePart);\r
+ wholeCal.setTimeZone(TimeZone.getTimeZone("Europe/Budapest"));\r
+ return wholeCal.getTime();\r
}\r
\r
private String getTargetFileName(RundownArchive rundownArchive, String sourceFileName) {\r
return null;\r
}\r
\r
- if (clipName.startsWith("1900")) {\r
- Calendar cal = CalendarUtils.createCalendar(scheduledStart);\r
- cal.add(Calendar.MINUTE, 5);\r
- rundown = octopusAPI.getRundown(cal.getTime());\r
+ if (clipName.startsWith("1900_")) {\r
+ String clipNameNext = clipName.replace("1900_", "1905_");\r
+ scheduledStart = getScheduledStart(clipNameNext, recordDate);\r
+ rundown = octopusAPI.getRundown(scheduledStart);\r
if (rundown == null) {\r
logger.error(systemMarker, "A '{}' anyaghoz nem található tükör '{}' kezdéssel, ezért nem archiválható.", clipName, scheduledStart);\r
return null;\r
if (mosObjects == null || mosObjects.isEmpty())\r
continue;\r
\r
+ boolean foundAnyClip = false;\r
for (BasicDBObject mosObject : mosObjects) {\r
String clipName = NoSQLUtils.asString(mosObject, IOctopusAPI.OBJ_ID);\r
if (clipName != null && clipName.length() > 0) {\r
BasicDBObject clip = (BasicDBObject) clipCollection.findOne(new BasicDBObject(LONGNAMEID, clipName));\r
if (clip != null) {\r
long duration = NoSQLUtils.asLong(clip, DURATION);\r
- if (duration > 0)\r
+ if (duration > 0) {\r
mosObject.put("duration", duration);\r
+ foundAnyClip = true;\r
+ }\r
}\r
}\r
}\r
+ if (!foundAnyClip)\r
+ continue;\r
\r
List<BasicDBObject> rdList = NoSQLUtils.asList(story, IOctopusAPI.REF_RUNDOWN);\r
story.put(IOctopusAPI.REF_RUNDOWN, rdList == null ? 0 : rdList.size());\r
}\r
\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
- dailyHistory.put("rawData", list);\r
- for (BasicDBObject story : stories) {\r
- list.add(story);\r
- }\r
- dailyHistory.put("typeStat", typeStat);\r
- dailyHistory.put("planStat", planStat);\r
- dailyHistory.put("reporterStat", reporterStat);\r
+ try {\r
+ BasicDBObject dailyHistory = new BasicDBObject();\r
+ dailyHistory.put("dateTime", scheduledDate.getTime());\r
+ BasicDBList list = new BasicDBList();\r
+ dailyHistory.put("rawData", list);\r
+ for (BasicDBObject story : stories) {\r
+ list.add(story);\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
- DBCollection collection = db.getCollection("daily_news_history");\r
- collection.remove(new BasicDBObject("dateTime", scheduledDate.getTime()));\r
- collection.save(dailyHistory);\r
+ } catch (Exception e) {\r
+ logger.error(e);\r
+ throw e;\r
+ }\r
}\r
\r
private void storeStories(Calendar scheduledDate, Map<Long, BasicDBObject> stories) {\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
+ if (!mos.containsKey("duration"))\r
+ continue;\r
+\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
processed.add(key);\r
\r
String label = NoSQLUtils.asString(mos, IOctopusAPI.LABEL);\r
+ if (label == null) {\r
+ logger.error(marker, "Az anyag MOS objektuma nem tartalmaz formátum meghatározást, feldolgozása nem lehetséges. Részletek:");\r
+ logger.error(marker, "STORY: {}", story.toString());\r
+ logger.error(marker, "MOS: {}", mos.toString());\r
+ continue;\r
+ }\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
--- /dev/null
+select * from itemtype\r
+insert into itemtype (name, description, isstatic) values('Hír bejátszó','Hír bejátszó','N') \r
+\r
+update media set itemtypeid=(select id from itemtype where name='Visszarögzített') where ID in (select mediaid from vw_items where itemtitle like '%Echo TV%' and itemtitle like '2%' and mediatitle like '%PGM%')\r
+update media set itemtypeid=(select id from itemtype where name='Hír bejátszó') where ID in (select mediaid from vw_items where itemtitle like '%Echo TV%' and itemtitle like '2%' and mediatitle not like '%CLN%' and mediatitle not like '%PGM%')\r
+\r
+select * from vw_items where itemtitle like '%Echo TV%' and itemtitle like '2%' and mediatitle not like '%CLN%' and mediatitle not like '%PGM%'
\ No newline at end of file
--- /dev/null
+package user.jobengine.db;\r
+\r
+import java.sql.ResultSet;\r
+import java.sql.SQLException;\r
+\r
+public interface IResultSetConsumer {\r
+\r
+ void process(ResultSet resultSet) throws SQLException;\r
+\r
+}\r
--- /dev/null
+package user.jobengine.db;\r
+\r
+import java.sql.PreparedStatement;\r
+import java.sql.SQLException;\r
+\r
+public interface IStatementDecorator {\r
+\r
+ void decorate(PreparedStatement statement) throws SQLException;\r
+\r
+}\r
package user.jobengine.db;\r
\r
+import java.io.File;\r
import java.nio.charset.Charset;\r
import java.nio.file.Files;\r
import java.nio.file.Path;\r
\r
protected static IItemManager manager = null;\r
\r
+ private static final String LOWRES_ROOT = "//10.10.1.27/mclowres/www/video";\r
+\r
+ private static final long[] duplicateLength = { 0 };\r
+\r
@BeforeClass\r
static public void setUpConnection() {\r
System.setProperty("jobengine.nosql.db.url", "jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;");\r
\r
}\r
\r
+ private void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator) {\r
+ ResultSet rs = null;\r
+ PreparedStatement st = null;\r
+ DefaultContext context = ((ItemManager) manager).getDbContext();\r
+ Connection connection = context.getConnection();\r
+ try {\r
+ st = connection.prepareStatement(query);\r
+ if (decorator != null)\r
+ decorator.decorate(st);\r
+ rs = st.executeQuery();\r
+ while (rs.next()) {\r
+ consumer.process(rs);\r
+ }\r
+\r
+ connection.commit();\r
+ } catch (Exception e) {\r
+ try {\r
+ connection.rollback();\r
+ } catch (Exception e1) {\r
+ }\r
+ } finally {\r
+ try {\r
+ if (rs != null)\r
+ rs.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ try {\r
+ if (st != null)\r
+ st.close();\r
+ } catch (Exception e1) {\r
+ }\r
+ ((ItemManager) manager).putDbContext(context);\r
+ }\r
+ }\r
+\r
@Test\r
public void generateMissingRecordingsList() throws Exception {\r
// select itemtitle, mediafilehouseid from vw_items where itemtitle like '%Echo TV%' and itemtitle like '2%' and mediatitle like '%PGM%' order by itemtitle, mediafilehouseid\r
lines.add(key + ";" + recordings.get(key) + ";");\r
System.out.println(key + "\t" + recordings.get(key));\r
}\r
- Files.write(Paths.get("c:\\temp\\recordings.csv"), lines, Charset.forName("UTF-8"), StandardOpenOption.CREATE_NEW);\r
+ Path out = Paths.get("c:\\temp\\recordings.csv");\r
+ if (Files.exists(out))\r
+ Files.delete(out);\r
+ Files.write(out, lines, Charset.forName("UTF-8"), StandardOpenOption.CREATE_NEW);\r
\r
}\r
\r
return result;\r
}\r
\r
+ private void processLowresDuplicateGroup(String fileName) {\r
+ System.out.println("*** Processing: " + fileName);\r
+ String query = "select mediafileid, mediafilehouseid, relativepath from vw_items_rd_lh where filename = ?";\r
+ IStatementDecorator decorator = st -> {\r
+ st.setString(1, fileName);\r
+ };\r
+\r
+ MediaFile[] masterMediaFile = { null };\r
+\r
+ IResultSetConsumer consumer = rs -> {\r
+ long mediaFileId = rs.getLong("mediafileid");\r
+ MediaFile mediaFile = (MediaFile) manager.get(MediaFile.class, mediaFileId);\r
+ String mediaFileHouseId = rs.getString("mediafilehouseid");\r
+ if (masterMediaFile[0] == null) {\r
+ masterMediaFile[0] = mediaFile;\r
+ System.out.println("Skipping: " + mediaFileHouseId);\r
+ return;\r
+ }\r
+\r
+ String path = rs.getString("relativepath");\r
+ // System.out.println("Inspecting: " + path + " filename " + fileName + " mediaFileHouseId " + mediaFileHouseId);\r
+\r
+ File file = Paths.get(LOWRES_ROOT, path).toFile();\r
+ duplicateLength[0] += file.length();\r
+ System.out.println("Inspecting: " + mediaFileHouseId + " now available " + duplicateLength[0]);\r
+\r
+ };\r
+ executeQuery(query, consumer, decorator);\r
+ }\r
+\r
+ @Test\r
+ public void processLowresDuplicates() {\r
+ String query = "select filename from vw_items_rd_dup order by filecount";\r
+ IResultSetConsumer consumer = rs -> {\r
+ String fileName = rs.getString("filename");\r
+ processLowresDuplicateGroup(fileName);\r
+ };\r
+ executeQuery(query, consumer, null);\r
+ System.out.println("Available will " + duplicateLength[0]);\r
+ }\r
+\r
private List<String> query(Connection con) throws Exception {\r
List<String> result = new ArrayList<>();\r
\r
}\r
\r
.listbox-odd-style{\r
- background: #ebebeb;\r
+ background: white;\r
}\r
\r
.attributedeflistbox .z-listcell-content {\r
}\r
\r
.z-row .z-row-inner, .z-row .z-cell {\r
- border-left: 0px;\r
+ border: 0px;\r
}\r
\r
.z-east-splitter, .z-west-splitter, .z-north-splitter, .z-south-splitter{\r
\r
.listbox-normal-style .z-listitem .z-listcell {\r
border-left: 1px solid gray;\r
- border-bottom: 1px solid gray;\r
+ border-bottom: 1px solid blue;\r
}\r
\r
.z-treerow, .z-tree-body{\r
<custom-attributes org.zkoss.zul.image.preload="true" />\r
<borderlayout width="${myWidth}" height="${myHeight}">\r
<north border="0">\r
- <div id="divMenu" apply="org.zkoss.bind.BindComposer" viewModel="@id('mvm') @init('user.jobengine.zk.model.MenuModel')">\r
+ <div id="divMenu" apply="org.zkoss.bind.BindComposer">\r
<borderlayout height="50px">\r
<west border="0">\r
<hbox height="100%" width="100%" align="center" pack="center" style="background: #008AC8;">\r
<east border="0">\r
<hbox height="100%" width="100%" align="bottom" pack="center" style="background: #008AC8;">\r
<div style="margin-right: 10px">\r
- <label style="color:#e3e3e3;font-size:12px;font-weight:bold" value="Bejelentkezve: ${sessionScope.userPrincipal.displayName}" tooltip="emailPopup, at_pointer" />\r
+ <label style="color:#e3e3e3;font-size:12px;font-weight:bold" value="Bejelentkezve: ${sessionScope.userPrincipal.displayName}" /> \r
+ <attribute name="tooltip" if="${not empty sessionScope.userPrincipal.email}">\r
+ emailPopup, at_pointer\r
+ </attribute> \r
<popup id="emailPopup">\r
<vlayout>\r
<label value="${sessionScope.userPrincipal.email}"/>\r
<!-- <center> -->\r
<listbox id="lbJobList" sizedByContent="false" model="@load(jlm.jobList)" multiple="true" pagingPosition="top" mold="paging" autopaging="true"\r
vflex="true" checkmark="true" style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style"\r
- emptyMessage="Nincs futó folyamat." selectedItems="@bind(jlm.selectedJobs)">\r
+ emptyMessage="Nincs futó folyamat" selectedItems="@bind(jlm.selectedJobs)">\r
<listhead>\r
<listheader label="Id" hflex="min" align="left" sort="auto" />\r
<listheader label="Indítás" hflex="min" align="left" sort="auto" />\r
<!-- <menuitem sclass="rozsda" label="Test" onClick='includeContent.src="/pages/database.zul"' disabled="${not sessionScope.userPrincipal.jobSubmitter or sessionScope.userPrincipal.anonymous}" /> -->\r
</menupopup>\r
</menu>\r
-\r
- <menu sclass="whitemenu" label="Statisztikák" >\r
+ <menu sclass="whitemenu" label="Statisztikák">\r
<menupopup>\r
- <menuitem sclass="rozsda" label="Folyamat statisztikák" onClick='includeContent.src="/pages/statistics.zul"' disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
- <menuitem sclass="rozsda" label="Híranyag történet" onClick='includeContent.src="/pages/newshistory.zul"' disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
+ <menuitem sclass="rozsda" label="Folyamat tevékenységek" onClick='includeContent.src="/pages/statistics.zul"' disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
+ <menuitem sclass="rozsda" label="Híranyag gyártás" onClick='includeContent.src="/pages/newshistory.zul"' disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
</menupopup>\r
</menu>\r
\r
<menuitem sclass="rozsda" label="${labels.menu_version}" href="/resource/help.html" target="_blank" />\r
</menupopup>\r
</menu>\r
- <menuitem sclass="whitemenu" style="float: right" label="Kilépés" onClick="@command('doLogout',window=zkwindow)" disabled="false" />\r
+ <menuitem id="basketIMenuItem" image="/img/ic_shopping_cart_black_24dp.png" sclass="whitemenu" style="float: right" label="@load(lm.basketMenuLabel)" onClick="@command('showBasket')" disabled="false" />\r
+ <menuitem sclass="whitemenu" style="float: right" label="Kilépés" onClick="@command('doLogout')" disabled="false" />\r
</menubar>\r
</div>\r
</zk>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<window id="wndRetrieveBatch" title="Visszatöltés" width="700px" border="normal" apply="org.zkoss.bind.BindComposer"\r
+ viewModel="@id('jlm') @init('user.jobengine.zk.model.RetrieveBatchSelectorModel')" onCancel="wndRetrieveBatch.detach()">\r
+ <grid>\r
+ <columns>\r
+ <column width="120px" />\r
+ <column width="100%" />\r
+ </columns>\r
+ <rows>\r
+ <row>\r
+ <label value="Azonosító:" />\r
+ <textbox value="@load(jlm.houseId) @save(jlm.houseId,before='execute')" width="100%" tabindex="1" forward="onOK=execute.onClick"\r
+ constraint="no empty: Kérem adjon meg egy azonosítót (Traffic, Octopus, Egyéb)." />\r
+ </row>\r
+ <row>\r
+ <label value="Értesítési cím:" />\r
+ <textbox value="@load(jlm.email) @save(jlm.email,before='execute')" width="100%" tabindex="2" forward="onOK=execute.onClick"\r
+ constraint="/.+@.+\.[a-z]+/: Kérem adjon meg egy email címet!" />\r
+ </row>\r
+ <row>\r
+ <cell colspan="2">\r
+ <listbox id="basketList" height="200px" sizedByContent="false" model="@load(jlm.basketItems)" multiple="true"\r
+ style="border: none; background: #e3e3e3 !important;" oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" emptyMessage="Üres">\r
+ <listhead>\r
+ <listheader label="Azonosító" hflex="min" align="left" sort="auto" />\r
+ <listheader label="Cím" hflex="min" align="left" sort="auto" />\r
+ <listheader label="Filenév" hflex="min" align="left" sort="auto" />\r
+ </listhead>\r
+\r
+ <template name="model">\r
+ <listitem>\r
+ <listcell label="@load(each.media.id)" />\r
+ <listcell label="@load(each.media.title)" />\r
+ <listcell label="@load(each.media.mediaFilesName)">></listcell>\r
+ </listitem>\r
+ </template>\r
+ </listbox>\r
+ </cell>\r
+ </row>\r
+ </rows>\r
+ </grid>\r
+ <vbox>\r
+\r
+ </vbox>\r
+ <hbox width="100%" pack="center">\r
+ <button id="cancel" label="Mégsem" autodisable="execute,cancel" onClick="wndRetrieveBatch.detach()" />\r
+ <button id="execute" label="Végrehajtás" autodisable="execute,cancel" onClick="@command('execute')" />\r
+ </hbox>\r
+</window>\r
.heavy {\r
font-weight:bold;\r
}\r
-div.z-row-content .rating {\r
- font-weight:bold;\r
- color: #0093f9;\r
-}\r
\r
.details {\r
padding: 5px;\r
line-height: 1.5em;\r
+ font-size: 10px;\r
+ border-bottom: 1px solid #ebebeb;\r
+}\r
+.relevant {\r
+ padding: 8px;\r
+ font-size: 10px;\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
</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
+ <grid id="itemsGrid" sizedByContent="false" span="true" vflex="true" hflex="true" mold="paging" autopaging="false"\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
+ onAfterRender="@command('onPaging')"\r
+ style="border: none; background: white !important;" oddRowSclass="listbox-odd-style">\r
<columns>\r
<column hflex="min">\r
- <checkbox checked="@bind(vm.rowsExpanded)"/>\r
+ <checkbox checked="@bind(vm.rowsExpanded)" />\r
+ </column>\r
+ <column hflex="min">\r
+ <checkbox checked="@bind(vm.allSelected)" />\r
</column>\r
<column label="ID" hflex="min" align="left" />\r
<column label="Cím" align="left" />\r
</columns>\r
<rows id="rows">\r
<template name="model">\r
- <row>\r
- <detail open="@load(vm.rowsExpanded)">\r
+ <row onClick="@command('selectMediaArchive', selectedObject=each)">\r
+<!-- <attribute name="style" if="${vm.isSelected(each)}"> -->\r
+<!-- background: green; -->\r
+<!-- </attribute> -->\r
+<!-- <attribute name="style" if="${not vm.isSelected(each)}"> -->\r
+<!-- background: white; -->\r
+<!-- </attribute> -->\r
+ <detail open="@load(vm.rowsExpanded)" style="border-bottom: 1px solid gray">\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')" onClick="@command('selectMediaArchive', selectedObject=each)" />\r
+ <image tooltiptext="Kattints a lejátszáshoz!" width="140px" height="90px" \r
+ sclass="myimg" content="@load(each.media.poster) @converter('user.jobengine.zk.model.ByToImageConverter')" \r
+ onClick="@command('selectMediaArchive', selectedObject=each)" />\r
<div sclass="details">\r
<div>\r
- <label value="Típus:" sclass="heavy" />\r
- <label value="@load(each.media.itemType.name)" />\r
- </div>\r
- <div>\r
- <label value="Gyűjtő:" sclass="heavy" />\r
- <label value="@load(each.item.title)" />\r
- </div>\r
- <div>\r
- <label value="@load(each.relevant)" />\r
+ <label style="border-left: 1px solid #008AC8; border-bottom: 1px solid #008AC8; padding: 4px; margin: 2px" value="@load(each.media.itemType.name)" />\r
+ <label style="font: 20px Century Gothic; color: #008AC8;" value="@load(each.item.title)" />\r
</div>\r
+ <html sclass="relevant">\r
+ <![CDATA[\r
+ <div>${each.relevant}</div>\r
+ ]]>\r
+ </html> \r
</div>\r
</hlayout>\r
</detail>\r
+ <checkbox checked="@save(vm.itemSelected) @validator(vm.itemSelectedValidator, arg=each)" />\r
<label value="@load(each.media.houseId)" />\r
<label value="@load(each.media.title)" />\r
<label value="@load(each.media.houseId)" />\r
</center>\r
</borderlayout>\r
\r
-\r
</div>\r
</zk>
\ No newline at end of file
-version=2.3.1\r
+version=2.3.3\r
footer=2016 © Copyright User Rendszerház Kft.\r
\r
login_info=Információ\r
package user.jobengine.zk.model;\r
\r
-import org.zkoss.bind.annotation.BindingParam;\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.zkoss.bind.BindUtils;\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.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.Include;\r
+import org.zkoss.zul.Menuitem;\r
import org.zkoss.zul.Window;\r
\r
+import user.jobengine.db.ArchivedMedia;\r
import user.jobengine.zk.util.SessionUtil;\r
\r
public class MenuModel extends BaseModel {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String PAGES_RETRIEVEBATCHSELECTOR_ZUL = "/pages/retrievebatchselector.zul";\r
+ private String basketMenuLabel = "(0)";\r
\r
@Wire\r
Include includeContent;\r
+ private List<ArchivedMedia> basketItems;\r
+\r
+ @Wire\r
+ Menuitem basketIMenuItem;\r
\r
public MenuModel() {\r
- //Messagebox.setTemplate("/pages/messagebox.zul");\r
+ SessionUtil.setAttribute(SessionUtil.MENUMODEL, this);\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
+ //Clients.showNotification("Új funkció, kötegelt visszaigényléshez.", "info", basketIMenuItem, "end_center", 3000);\r
}\r
\r
@Command\r
- public void doLogout(@BindingParam("window") Window window) {\r
+ public void doLogout() {\r
SessionUtil.logout();\r
- // SessionUtil.setAttribute(SessionUtil.USERPROFILE, null);\r
- //window.detach();\r
Executions.sendRedirect("/");\r
- //includeContent.setSrc("/pages/joblist.zul");\r
}\r
\r
- public String getHeaderUser() {\r
- return "Media archivum user"; //String.format(Labels.getLabel("header.userformat"), SessionUtil.getUserProfile().getDisplayName(), SessionUtil.getUserProfile().getUserName().toUpperCase());\r
+ public String getBasketMenuLabel() {\r
+ return basketMenuLabel;\r
}\r
\r
- public void redirectToDocs() {\r
- String serverName = Executions.getCurrent().getLocalAddr();\r
- String serverName1 = Executions.getCurrent().getRemoteAddr();\r
- String serverName2 = Executions.getCurrent().getBrowser();\r
+ public List<ArchivedMedia> getBasketItems() {\r
+ return basketItems;\r
+ }\r
+\r
+ @NotifyChange("basketMenuLabel")\r
+ public void selectArchivedMedia(ArchivedMedia item, boolean select) {\r
+ if (item == null) {\r
+ logger.warn("Item to select is null");\r
+ return;\r
+ }\r
+ if (basketItems == null)\r
+ basketItems = new ArrayList<>();\r
+ if (select) {\r
+ if (!basketItems.contains(item))\r
+ basketItems.add(item);\r
+ } else {\r
+ if (basketItems.contains(item))\r
+ basketItems.remove(item);\r
+ }\r
+ logger.info("SelectedItems: {}", basketItems.size());\r
+ basketMenuLabel = String.format("(%d)", basketItems.size());\r
+ BindUtils.postNotifyChange(null, null, this, "basketMenuLabel");\r
+ }\r
\r
+ @Command\r
+ public void showBasket() {\r
+ Map<String, Object> arguments = new HashMap<String, Object>();\r
+ arguments.put("selectedItems", basketItems);\r
+ Window window = (Window) Executions.createComponents(PAGES_RETRIEVEBATCHSELECTOR_ZUL, null, arguments);\r
+ window.doModal();\r
}\r
\r
}
\ No newline at end of file
private static final String IMPORT_DISABLED = "importDisabled";\r
private static final String IMPORT_TEMPLATE = "import-morpheus-missing-materials.xml";\r
private static final String RETRIEVE_TEMPLATE = "retrieve-missing-material.xml";\r
+ private static final String TEMPLATE = "template";\r
private ListModelList<BasicDBObject> jobList = new ListModelList<BasicDBObject>();\r
private Set<BasicDBObject> selectedJobs;\r
private IJobEngine jobEngine = null;\r
List<BasicDBObject> jobs = NoSQLUtils.asList(scheduler.getScheduleJobs());\r
BasicDBObject importJob = null;\r
for (BasicDBObject job : jobs) {\r
- if (isImportJob(job.getString(IMPORT_TEMPLATE))) {\r
+ if (isImportJob(job.getString(TEMPLATE))) {\r
importJob = job;\r
//logger.info(job.toString());\r
break;\r
--- /dev/null
+package user.jobengine.zk.model;\r
+\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.annotation.AfterCompose;\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.Init;\r
+import org.zkoss.util.resource.Labels;\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.Window;\r
+\r
+import user.commons.ListUtils;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.JobEngine;\r
+import user.jobengine.zk.util.SessionUtil;\r
+\r
+public class RetrieveBatchSelectorModel extends BaseModel {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String KILLDATEDAYS = "killDateDays";\r
+ private static final String MEDIACUBEMEDIA = "mediaCubeMedia";\r
+ private static final String SUCCESSRECIPIENT = "successRecipient";\r
+ private static final String GENERICOUTPUTPATH = "genericOutputPath";\r
+ private static final String OCTOPUSOUTPUTPATH = "octopusOutputPath";\r
+ private static final String TRAFFICOUTPUTPATH = "trafficOutputPath";\r
+ private static final String HOUSEID = "houseId";\r
+ private static final String RESTORE = "Visszatöltés";\r
+ private static final String JOBTEMPLATE = "retrieve-ondemand.xml";\r
+\r
+ @Wire()\r
+ private Window wndRetrieveBatch;\r
+ private Media selectedMedia;\r
+ private String houseId;\r
+ private String email;\r
+\r
+ @AfterCompose\r
+ public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
+ Selectors.wireComponents(view, this, false);\r
+ }\r
+\r
+ @Command\r
+ public void close() {\r
+ wndRetrieveBatch.detach();\r
+ }\r
+\r
+ @Command\r
+ public void execute() {\r
+ try {\r
+ if (StringUtils.isBlank(houseId))\r
+ throw new Exception("Az azonosító megadása kötelező!");\r
+ if (StringUtils.isBlank(email))\r
+ throw new Exception("Az értesítési cím megadása kötelező!");\r
+ String trafficOutputPath = "/mnt/ISILON/PLAYOUT_NLE";\r
+ String octopusOutputPath = "/mnt/ISILON/OCTOPUS";\r
+ String genericOutputPath = "/mnt/ISILON/ARCHIVE_RESTORE";\r
+ Map<String, Object> parameters = ListUtils.asMap(TRAFFICOUTPUTPATH, trafficOutputPath, OCTOPUSOUTPUTPATH, octopusOutputPath, GENERICOUTPUTPATH,\r
+ genericOutputPath, MEDIACUBEMEDIA, this.selectedMedia, HOUSEID, houseId, SUCCESSRECIPIENT, email, KILLDATEDAYS, 7);\r
+ IJobEngine jobEngine = JobEngine.getInstance();\r
+ IJobRuntime runtime1 = jobEngine.submit(JOBTEMPLATE, RESTORE, parameters);\r
+ close();\r
+ } catch (Exception e) {\r
+ Messagebox.show(e.getMessage(), Labels.getLabel("dialogger.warning"), Messagebox.OK, Messagebox.ERROR, defaultOKEventListener);\r
+ logger.catching(e);\r
+ }\r
+\r
+ }\r
+\r
+ public List<ArchivedMedia> getBasketItems() {\r
+ MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL);\r
+ return model.getBasketItems();\r
+ }\r
+\r
+ public String getEmail() {\r
+ return email;\r
+ }\r
+\r
+ public String getHouseId() {\r
+ return houseId;\r
+ }\r
+\r
+ @Init\r
+ public void init() {\r
+ Map<?, ?> args = Executions.getCurrent().getArg();\r
+ this.selectedMedia = (Media) args.get(MEDIACUBEMEDIA);\r
+ setEmail(SessionUtil.getUserPrincipal().getEmail());\r
+ }\r
+\r
+ public void setEmail(String email) {\r
+ this.email = email;\r
+ }\r
+\r
+ public void setHouseId(String houseId) {\r
+ this.houseId = houseId;\r
+ }\r
+}
\ No newline at end of file
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.Checkbox;\r
+import org.zkoss.zul.Grid;\r
import org.zkoss.zul.Messagebox;\r
+import org.zkoss.zul.Row;\r
import org.zkoss.zul.Rows;\r
import org.zkoss.zul.Window;\r
\r
import user.jobengine.db.Media;\r
import user.jobengine.db.MediaFile;\r
import user.jobengine.db.Store;\r
+import user.jobengine.zk.util.SessionUtil;\r
\r
public class SearchModel extends AsyncBaseModel {\r
private static final Logger logger = LogManager.getLogger();\r
private CachedListModel searchResult = null;\r
private ArchivedMedia selectedObject = null;\r
private Validator allFilterCheckedValidator;\r
+ private Validator itemSelectedValidator;\r
private Map<String, Object> typeFilters;\r
private boolean allChecked = true;\r
private int activePage;\r
private boolean rowsExpanded = true;\r
+ private boolean allSelected;\r
+ private boolean itemSelected;\r
+\r
@Wire\r
Rows rows;\r
+ @Wire\r
+ Grid itemsGrid;\r
\r
public SearchModel() {\r
typeFilters = new LinkedHashMap<>();\r
updateAllChecked();\r
}\r
};\r
+\r
+ itemSelectedValidator = new Validator() {\r
+ @Override\r
+ public void validate(ValidationContext ctx) {\r
+ try {\r
+\r
+ ArchivedMedia item = (ArchivedMedia) ctx.getValidatorArg("arg");\r
+ boolean select = (boolean) ctx.getProperty().getValue();\r
+ MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL);\r
+ model.selectArchivedMedia(item, select);\r
+ } catch (Exception e) {\r
+\r
+ }\r
+ updateAllChecked();\r
+ }\r
+ };\r
}\r
\r
@AfterCompose\r
return selectedObject != null;\r
}\r
\r
+ public Validator getItemSelectedValidator() {\r
+ return itemSelectedValidator;\r
+ }\r
+\r
public String getLowresMediaFilePath() throws Exception {\r
String ret = PAGES_MEDIAPLAYER;\r
Media media = getMedia();\r
return allChecked;\r
}\r
\r
+ public boolean isAllSelected() {\r
+ return allSelected;\r
+ }\r
+\r
+ public boolean isItemSelected() {\r
+ return itemSelected;\r
+ }\r
+\r
public boolean isRowsExpanded() {\r
return rowsExpanded;\r
}\r
// Clients.scrollIntoView(rows);\r
}\r
\r
+ // public void rowSelected(@BindingParam("item") Object media, @BindingParam("isChecked") boolean isChecked) {\r
+ @Command\r
+ public void rowSelected(@BindingParam("isChecked") boolean isChecked) {\r
+ logger.info(isChecked);\r
+ }\r
+\r
@NotifyChange({ "selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath" })\r
public void selectedMediaArchive(ArchivedMedia selectedObject) {\r
this.selectedObject = selectedObject;\r
this.allFilterCheckedValidator = allFilterCheckedValidator;\r
}\r
\r
+ public void setAllSelected(boolean allSelected) {\r
+ this.allSelected = allSelected;\r
+ //itemsGrid.renderAll();\r
+ List<Component> components = itemsGrid.getRows().getChildren();\r
+ for (Component obj : components) {\r
+ Row row = (Row) obj;\r
+ List<Component> children = row.getChildren();\r
+ if (children.size() < 2)\r
+ continue;\r
+ Component component = children.get(1);\r
+ if (!(component instanceof Checkbox))\r
+ continue;\r
+ Checkbox ck = (Checkbox) component;\r
+ ck.setChecked(allSelected);\r
+ MenuModel model = (MenuModel) SessionUtil.getAttribute(SessionUtil.MENUMODEL);\r
+ model.selectArchivedMedia(row.getValue(), allSelected);\r
+ }\r
+\r
+ }\r
+\r
+ public void setItemSelected(boolean itemSelected) {\r
+ this.itemSelected = itemSelected;\r
+ }\r
+\r
+ public void setItemSelectedValidator(Validator itemSelectedValidator) {\r
+ this.itemSelectedValidator = itemSelectedValidator;\r
+ }\r
+\r
public void setRowsExpanded(boolean rowsExpanded) {\r
this.rowsExpanded = rowsExpanded;\r
}\r
import user.jobengine.server.JobEngine;\r
\r
public class SessionUtil {\r
+ private static final String SELECTED_ARCHIVED_MEDIAS = "selectedArchivedMedias";\r
private static Logger logger = LogManager.getLogger();\r
private static final String AUTH_ENABLED = "auth_enabled";\r
private static final String LOCAL_USERS = "local_users";\r
private static final String USERPRINCIPAL = "userPrincipal";\r
private static final String AUTH_LOCATION = "mediacube.auth.location";\r
public static final String JOBLISTENER = "joblistener";\r
-\r
- static public void registerJobChangedListener(IJobChangedListener listener) {\r
- cleanup();\r
- JobEngine.getInstance().addJobChangedEventListener(listener);\r
- setAttribute(JOBLISTENER, listener);\r
- }\r
+ public static final String MENUMODEL = "menuModel";\r
\r
public static boolean authenticate(String account, String password) {\r
Properties cfg = getConfiguration();\r
UserPrincipal userPrincipal = null;\r
- if (authenticateLocal(account, password, cfg, LOCAL_ADMINS)) {\r
- userPrincipal = new UserPrincipal(account, true, true, false);\r
+ String localUsers = cfg.getProperty(LOCAL_ADMINS);\r
+ if (authenticateLocal(account, password, localUsers)) {\r
+ userPrincipal = createLocalPrincipal(account, password, true, true, false, localUsers);\r
} else {\r
- if (authenticateLocal(account, password, cfg, LOCAL_JOBSUBMITTERS)) {\r
- userPrincipal = new UserPrincipal(account, false, true, false);\r
+ localUsers = cfg.getProperty(LOCAL_JOBSUBMITTERS);\r
+ if (authenticateLocal(account, password, localUsers)) {\r
+ userPrincipal = createLocalPrincipal(account, password, false, true, false, localUsers);\r
} else {\r
- if (authenticateLocal(account, password, cfg, LOCAL_USERS)) {\r
- userPrincipal = new UserPrincipal(account, false, false, false);\r
+ localUsers = cfg.getProperty(LOCAL_USERS);\r
+ if (authenticateLocal(account, password, localUsers)) {\r
+ userPrincipal = createLocalPrincipal(account, password, false, false, false, localUsers);\r
} else {\r
LDAPHandler h = new LDAPHandler(account, password, cfg);\r
userPrincipal = h.getUserPrincipal();\r
return true;\r
}\r
\r
- private static boolean authenticateLocal(String account, String password, Properties cfg, String usersKey) {\r
+ private static boolean authenticateLocal(String account, String password, String users) {\r
if (StringUtils.isBlank(account) || account.length() < 3)\r
return false;\r
if (StringUtils.isBlank(password) || password.length() < 3)\r
return false;\r
\r
- String users = cfg.getProperty(usersKey);\r
if (StringUtils.isBlank(users) || users.length() < 7)\r
return false;\r
\r
JobEngine.getInstance().removeJobChangedEventListener(listener);\r
setAttribute(SessionUtil.JOBLISTENER, null);\r
}\r
+ //setAttribute(SessionUtil.MENUMODEL, null);\r
+ //setAttribute(SessionUtil.USERPRINCIPAL, null);\r
+ }\r
+\r
+ private static UserPrincipal createLocalPrincipal(String account, String password, boolean isAdmin, boolean isJobSubmitter, boolean isAnonymous,\r
+ String users) {\r
+ UserPrincipal result = new UserPrincipal(account, isAdmin, isJobSubmitter, isAnonymous);\r
+ String[] userList = users.split(";");\r
+ for (String user : userList) {\r
+ if (!authenticateLocal(account, password, user))\r
+ continue;\r
+ String[] userInfo = user.split(":");\r
+ if (userInfo.length > 2)\r
+ result.setEmail(userInfo[2]);\r
+ }\r
+ return result;\r
}\r
\r
static public Object getAttribute(String name) {\r
setAttribute(SessionUtil.USERPRINCIPAL, null);\r
}\r
\r
+ static public void registerJobChangedListener(IJobChangedListener listener) {\r
+ cleanup();\r
+ JobEngine.getInstance().addJobChangedEventListener(listener);\r
+ setAttribute(JOBLISTENER, listener);\r
+ }\r
+\r
static public void setAttribute(String name, Object obj) {\r
//HttpSession session = (HttpSession) (Executions.getCurrent()).getDesktop().getSession().getNativeSession();\r
Session zkSession = Sessions.getCurrent();\r