import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
-import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Serializable;
out.flush();
} finally {
try {
- out.close();
- in.close();
- inputLister.cleanUp();
- outputLister.cleanUp();
- } catch (IOException e) {
+ if (out != null)
+ out.close();
+ if (in != null)
+ in.close();
+ if (inputLister != null)
+ inputLister.cleanUp();
+ if (outputLister != null)
+ outputLister.cleanUp();
+ } catch (Exception e) {
+ logger.error("Additional error!", e);
}
}
result.setSize(uploadedBytes);
\r
public interface IMetadataProvider {\r
\r
+ List<String> getColumnNames(MetadataType type);\r
+\r
List<IMetadata> list(IMetadataListOptions options) throws Exception;\r
}\r
--- /dev/null
+package user.mediacube.metadata.interfaces;\r
+\r
+public interface IMetadataProviderFactory {\r
+\r
+ IMetadataProvider getProvider(MetadataProviderType type);\r
+\r
+}
\ No newline at end of file
-package user.mediabube.metadata.planair;\r
+package user.mediacube.metadata.interfaces;\r
\r
public enum MetadataType {\r
Material, Promo, AD\r
-package user.mediabube.metadata.planair;\r
+package user.mediacube.metadata.interfaces;\r
\r
import java.util.Date;\r
\r
-import user.mediacube.metadata.interfaces.IMetadataListOptions;\r
-import user.mediacube.metadata.interfaces.MetadataType;\r
-\r
public class PlanAirMetadataListOptions implements IMetadataListOptions {\r
private Date broadcastDay;\r
private boolean problematic;\r
<center border="true">\r
<panel width="100%" border="normal" title="Traffic" vflex="true">\r
<panelchildren style="padding:5px;">\r
- <include src="/pages/planner.zul" />\r
+ <include src="/pages/planair.zul" />\r
</panelchildren>\r
</panel>\r
</center>\r
<menu sclass="whitemenu" label="Archívum" >\r
<menupopup>\r
<menuitem sclass="rozsda" label="Keresés" onClick="@command('navigate', action='/')" disabled="false" />\r
- <menuitem sclass="rozsda" label="Maestro" onClick="@command('navigate', action='maestro')" disabled="false" />\r
+ <menuitem sclass="rozsda" label="Maestro" onClick="@command('navigate', action='maestro')" visible="${lm.maestroAvailable}" />\r
<menuitem sclass="rozsda" label="Folyamatok" onClick="@command('navigate', action='jobs')" disabled="${not sessionScope.userPrincipal.admin or sessionScope.userPrincipal.anonymous}" />\r
<menuitem sclass="rozsda" label="Hiányzó anyagok" onClick="@command('navigate', action='missingmaterials')" disabled="${not sessionScope.userPrincipal.submitter or sessionScope.userPrincipal.anonymous}" />\r
</menupopup>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<zk xmlns:w="http://www.zkoss.org/2005/zk/client">\r
+ <window id="zkwindow" border="true" width="100%" height="100%" contentStyle="padding:0;" apply="org.zkoss.bind.BindComposer"\r
+ viewModel="@id('vm') @init('user.jobengine.zk.model.PlannerListModel')">\r
+ <custom-attributes org.zkoss.zul.image.preload="true" />\r
+\r
+ <vbox>\r
+ <checkbox label="Csak a hiányosak" checked="@bind(vm.problematic)" />\r
+\r
+ <hbox>\r
+ <checkbox onCheck="searchDate.disabled=!self.checked" checked="@bind(vm.searchDateEnabled)" />\r
+ <datebox id="searchDate" format="short" value="@bind(vm.searchDate)" onOK="@command('refresh')" />\r
+ <textbox id="searchText" value="@bind(vm.searchText)" onOK="@command('refresh')" />\r
+ <button image="/img/baseline_close_black_18dp.png" onClick="searchText.text = null" />\r
+ <button id="refresh" image="/img/baseline_refresh_black_18dp.png" onClick="@command('refresh')" />\r
+ </hbox>\r
+ </vbox>\r
+\r
+ <tabbox vflex="true" selectedIndex="@bind(vm.selectedTabIndex)">\r
+ <tabs id="tabs">\r
+ <tab label="Műsor" />\r
+ <tab label="Promo" />\r
+ <tab label="Reklám" />\r
+ </tabs>\r
+ <tabpanels>\r
+ <tabpanel>\r
+ <listbox vflex="true" sizedByContent="true" checkmark="true" model="@load(vm.materialList)"\r
+ emptyMessage="Nincs találat! Kattintson a frissítés gombra.">\r
+ <custom-attributes org.zkoss.zul.listbox.selectOnHighlight.disabled="true" />\r
+ <listhead sizable="true">\r
+ <listheader label="Azonosító" hflex="min" align="left" />\r
+ <listheader label="OK" hflex="min" align="left" />\r
+ <listheader label="Szegmens" hflex="min" align="left" />\r
+ <listheader label="Cím" hflex="min" align="left" />\r
+ <listheader label="Epizódszám" hflex="min" align="left" />\r
+ <listheader label="Epizód azonosító" hflex="min" align="left" />\r
+ <listheader label="Első adás" hflex="min" align="left" />\r
+ <listheader label="Következő adás" hflex="min" align="left" />\r
+ <listheader label="Epizódcím" hflex="min" align="left" />\r
+ </listhead>\r
+ <template name="model">\r
+ <listitem>\r
+ <listcell>\r
+ <label value="@load(each.mediaID)" />\r
+ </listcell>\r
+ <listcell>\r
+ <checkbox checked="@load(each.okForAir)" disabled="true" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.segment)" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.progTitle)" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.episode)" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.episodeID)" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.firstBroadcastDate)" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.nextBroadcastDate)" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.epTitle)" />\r
+ </listcell>\r
+ </listitem>\r
+ </template>\r
+ <listfoot>\r
+ <listfooter> \r
+ <label value="@load(vm.materialList eq null ? 0 : vm.materialList.size())" /><label value=" találat" />\r
+ </listfooter>\r
+ </listfoot>\r
+ </listbox>\r
+ </tabpanel>\r
+ <tabpanel>\r
+ <listbox vflex="true" sizedByContent="true" checkmark="true" model="@load(vm.promoList)"\r
+ emptyMessage="Nincs találat! Kattintson a frissítés gombra.">\r
+ <custom-attributes org.zkoss.zul.listbox.selectOnHighlight.disabled="true" />\r
+ <listhead sizable="true">\r
+ <listheader label="Azonosító" hflex="min" align="left" />\r
+ <listheader label="OK" hflex="min" align="left" />\r
+ <listheader label="Cím" hflex="max" align="left" />\r
+ <listheader label="Epizódcím" hflex="min" align="left" />\r
+ </listhead>\r
+ <template name="model">\r
+ <listitem>\r
+ <listcell>\r
+ <label value="@load(each.mediaID)" />\r
+ </listcell>\r
+ <listcell>\r
+ <checkbox checked="@load(each.okForAir)" disabled="true" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.title)" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.progTitle)" />\r
+ </listcell>\r
+ </listitem>\r
+ </template>\r
+ <listfoot>\r
+ <listfooter> \r
+ <label value="@load(vm.promoList eq null ? 0 : vm.promoList.size())" /><label value=" találat" />\r
+ </listfooter>\r
+ </listfoot>\r
+ </listbox>\r
+ </tabpanel>\r
+ <tabpanel>\r
+\r
+ <listbox vflex="true" sizedByContent="true" checkmark="true" model="@load(vm.adList)"\r
+ emptyMessage="Nincs találat! Kattintson a frissítés gombra.">\r
+ <custom-attributes org.zkoss.zul.listbox.selectOnHighlight.disabled="true" />\r
+ <listhead sizable="true">\r
+ <listheader label="Azonosító" hflex="min" align="left" />\r
+ <listheader label="OK" hflex="min" align="left" />\r
+ <listheader label="Cím" hflex="max" align="left" />\r
+ </listhead>\r
+ <template name="model">\r
+ <listitem>\r
+ <listcell>\r
+ <label value="@load(each.mediaID)" />\r
+ </listcell>\r
+ <listcell>\r
+ <checkbox checked="@load(each.okForAir)" disabled="true" />\r
+ </listcell>\r
+ <listcell>\r
+ <label value="@load(each.title)" />\r
+ </listcell>\r
+ </listitem>\r
+ </template>\r
+ <listfoot>\r
+ <listfooter> \r
+ <label value="@load(vm.adList eq null ? 0 : vm.adList.size())" /><label value=" találat" />\r
+ </listfooter>\r
+ </listfoot>\r
+ </listbox>\r
+ </tabpanel>\r
+ </tabpanels>\r
+ </tabbox>\r
+\r
+ </window>\r
+</zk>\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<zk xmlns:w="http://www.zkoss.org/2005/zk/client">\r
-<window id="zkwindow" border="true" width="100%" height="100%" contentStyle="padding:0;" \r
- apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.PlannerListModel')">\r
- <custom-attributes org.zkoss.zul.image.preload="true" />\r
- <!-- Keresés menü -->\r
- <hbox>\r
- <button id="back" image="/img/baseline_arrow_back_black_18dp.png">\r
- <attribute w:name="onClick"><![CDATA[\r
- var ts = zk.Widget.$(jq('$search')),\r
- val = "";\r
- ts.setValue(val);\r
- ts.smartUpdate('value', val);\r
- ]]></attribute>\r
- </button>\r
- <textbox id="search" />\r
- <button id="resetSearch" image="/img/baseline_close_black_18dp.png">\r
- <attribute w:name="onClick"><![CDATA[\r
- var ts = zk.Widget.$(jq('$search')),\r
- val = "";\r
- ts.setValue(val);\r
- ts.smartUpdate('value', val);\r
- ]]></attribute>\r
- </button>\r
- <button id="refresh" image="/img/baseline_refresh_black_18dp.png">\r
- </button>\r
- </hbox>\r
- <!-- Gombok -->\r
- <hbox pack="left" align="top" id="searchFiltersMenu">\r
- <vlayout>\r
- <toolbar class="toolbar">\r
- <forEach items="@load(vm.topTypeFilterNames)">\r
- <toolbarbutton label="@load(each)" mode="toggle" \r
- checked="@bind(vm.typeFilters[each].checked) @validator(vm.allFilterCheckedValidator)" />\r
- </forEach>\r
- </toolbar>\r
- </vlayout>\r
- </hbox>\r
- <!-- Cél file lista -->\r
- <listbox id="lbox" vflex="true" \r
- oddRowSclass="listbox-odd-style" sclass="listbox-normal-style" style="border: none; background: #e3e3e3 !important;"\r
- onAfterRender="lbox.focus()">\r
- <listhead>\r
- <listheader label="Tételek" />\r
- </listhead>\r
-\r
- <template name="model" hflex="max">\r
- <listitem >\r
- <listcell> label="Tételek" /></listcell>\r
- </listitem>\r
- </template>\r
- </listbox> \r
-\r
-</window>\r
-</zk>\r
private static final Logger logger = LogManager.getLogger();\r
private String page;\r
private Map<String, Object> pathMap = ListUtils.asMap("/", "searchitems", "jobs", "joblist", "missingmaterials", "missingmaterials", "newshistory",\r
- "newshistory", "statistics", "statistics");\r
+ "newshistory", "statistics", "statistics", "maestro", "maestro");\r
\r
@AfterCompose\r
public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
import org.zkoss.zul.Window;\r
\r
import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.osgi.server.ComponentBinder;\r
import user.jobengine.zk.util.SessionUtil;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\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
private List<ArchivedMedia> basketItems = new ArrayList<>();\r
-\r
@Wire\r
Menuitem basketIMenuItem;\r
\r
return basketMenuLabel;\r
}\r
\r
+ public boolean isMaestroAvailable() {\r
+ return ComponentBinder.getMetadataProviderFactory() != null\r
+ && ComponentBinder.getMetadataProviderFactory().getProvider(MetadataProviderType.PLANAIR) != null;\r
+\r
+ }\r
+\r
@Command\r
public void navigate(@BindingParam("action") String action) {\r
IndexModel indexModel = (IndexModel) SessionUtil.getAttribute(IndexModel.class.getCanonicalName());\r
logger.warn("Item to select is null");\r
return;\r
}\r
- \r
+\r
if (select) {\r
if (!basketItems.contains(item)) {\r
basketItems.add(item);\r
package user.jobengine.zk.model;\r
\r
-import java.util.LinkedHashMap;\r
-import java.util.Map;\r
+import java.util.Date;\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.BindUtils;\r
+import org.zkoss.bind.Validator;\r
+import org.zkoss.bind.annotation.Command;\r
import org.zkoss.bind.annotation.Init;\r
+import org.zkoss.zul.Column;\r
+import org.zkoss.zul.ListModelList;\r
\r
import user.commons.config.JSONConfig;\r
+import user.jobengine.osgi.server.ComponentBinder;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
\r
public class PlannerListModel {\r
- private MaestroConfig config = null;\r
private static final Logger logger = LogManager.getLogger();\r
- private static final String PROGRAM = "Műsor";\r
- private static final String PROMO = "Promó";\r
- private static final String AD = "Reklám";\r
- private String[] topTypeFilterNames;\r
- private Map<String, TypeFilter> typeFilters;\r
- \r
+ private MaestroConfig config = null;\r
+ private Validator filterCheckedValidator;\r
+ private List<Column> columns;\r
+ private ListModelList<IMetadata> materialList;\r
+ private ListModelList<IMetadata> promoList;\r
+ private ListModelList<IMetadata> adList;\r
+ private int selectedTabIndex;\r
+ private IMetadataProvider provider;\r
+ private boolean searchDateEnabled = true;\r
+ private boolean problematic;\r
+ private String searchText;\r
+ private Date searchDate = new Date();\r
+\r
+ public ListModelList<IMetadata> getAdList() {\r
+ return adList;\r
+ }\r
+\r
+ public List<Column> getColumns() {\r
+ return columns;\r
+ }\r
+\r
+ public Validator getFilterCheckedValidator() {\r
+ return filterCheckedValidator;\r
+ }\r
+\r
+ public ListModelList<IMetadata> getMaterialList() {\r
+ return materialList;\r
+ }\r
+\r
+ public ListModelList<IMetadata> getPromoList() {\r
+ return promoList;\r
+ }\r
+\r
+ public Date getSearchDate() {\r
+ return searchDate;\r
+ }\r
+\r
+ public String getSearchText() {\r
+ return searchText;\r
+ }\r
+\r
+ public int getSelectedTabIndex() {\r
+ return selectedTabIndex;\r
+ }\r
+\r
@Init\r
public void init() {\r
- typeFilters = new LinkedHashMap<>();\r
- addTypeFilter(TypeFilter.as(PROGRAM, "RED200", "ic_language_black_18dp.png"));\r
- addTypeFilter(TypeFilter.as(PROMO, "RED100", "ic_perm_camera_mic_black_18dp.png"));\r
- addTypeFilter(TypeFilter.as(AD, "TEAL200", "ic_theaters_black_18dp.png"));\r
- setTopTypeFilterNames(new String[] { PROGRAM, PROMO, AD });\r
- \r
String key = "jobengine.maestro.config";\r
try {\r
config = JSONConfig.read(key, MaestroConfig.class);\r
} catch (Exception e) {\r
logger.error("Hiba a config file beállításánál {}", e.getMessage());\r
}\r
+\r
+ IMetadataProviderFactory factory = ComponentBinder.getMetadataProviderFactory();\r
+ provider = factory.getProvider(MetadataProviderType.PLANAIR);\r
}\r
- \r
- private void addTypeFilter(TypeFilter typeFilter) {\r
- typeFilters.put(typeFilter.getName(), typeFilter);\r
+\r
+ public boolean isProblematic() {\r
+ return problematic;\r
}\r
- \r
- public String[] getTopTypeFilterNames() {\r
- return topTypeFilterNames;\r
+\r
+ public boolean isSearchDateEnabled() {\r
+ return searchDateEnabled;\r
}\r
\r
- public void setTopTypeFilterNames(String[] topTypeFilterNames) {\r
- this.topTypeFilterNames = topTypeFilterNames;\r
+ @Command\r
+ public void refresh() {\r
+ PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+ if (searchDateEnabled)\r
+ opt.setBroadcastDay(searchDate);\r
+ opt.setProblematic(problematic);\r
+ if (searchText != null && searchText.trim().length() > 3)\r
+ opt.setSearch(searchText);\r
+ try {\r
+ switch (selectedTabIndex) {\r
+ case 0:\r
+ opt.setType(MetadataType.Material);\r
+ materialList = new ListModelList<>(provider.list(opt));\r
+ BindUtils.postNotifyChange(null, null, this, "materialList");\r
+ break;\r
+ case 1:\r
+ opt.setType(MetadataType.Promo);\r
+ promoList = new ListModelList<>(provider.list(opt));\r
+ BindUtils.postNotifyChange(null, null, this, "promoList");\r
+ break;\r
+ case 2:\r
+ opt.setType(MetadataType.AD);\r
+ adList = new ListModelList<>(provider.list(opt));\r
+ BindUtils.postNotifyChange(null, null, this, "adList");\r
+ break;\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(e);\r
+ }\r
}\r
- \r
- public Map<String, TypeFilter> getTypeFilters() {\r
- return typeFilters;\r
+\r
+ public void setProblematic(boolean problematic) {\r
+ this.problematic = problematic;\r
+ }\r
+\r
+ public void setSearchDate(Date searchDate) {\r
+ this.searchDate = searchDate;\r
+ }\r
+\r
+ public void setSearchDateEnabled(boolean searchDateEnabled) {\r
+ this.searchDateEnabled = searchDateEnabled;\r
+ }\r
+\r
+ public void setSearchText(String searchText) {\r
+ this.searchText = searchText;\r
+ }\r
+\r
+ public void setSelectedTabIndex(int selectedTabIndex) {\r
+ this.selectedTabIndex = selectedTabIndex;\r
+ materialList = null;\r
+ promoList = null;\r
+ adList = null;\r
+ BindUtils.postNotifyChange(null, null, this, "materialList");\r
+ BindUtils.postNotifyChange(null, null, this, "promoList");\r
+ BindUtils.postNotifyChange(null, null, this, "adList");\r
}\r
\r
}\r
return new TypeFilter(name, color, icon);\r
}\r
\r
+ static public TypeFilter as(String name, String color, String icon, boolean chacked) {\r
+ return new TypeFilter(name, color, icon, chacked);\r
+ }\r
+\r
private String name;\r
private String color;\r
private String icon;\r
private boolean checked;\r
\r
TypeFilter(String name, String color, String icon) {\r
+ this(name, color, icon, true);\r
+ }\r
+\r
+ TypeFilter(String name, String color, String icon, boolean checked) {\r
this.name = name;\r
this.color = color;\r
this.icon = icon;\r
- this.checked = true;\r
+ this.checked = checked;\r
}\r
\r
public String getColor() {\r
@Select(value = MATERIAL_SQL)\r
@Options(statementType = StatementType.CALLABLE)\r
@Results(value = { @Result(property = "episodeID", column = "v_EpisodeID"), @Result(property = "variantID", column = "v_VariantID"),\r
- @Result(property = "mediaID", column = "v_MediaID"), @Result(property = "progTitle", column = "v_ProgTitle"),\r
+ @Result(property = "mediaID", column = "v_VariantMediaID"), @Result(property = "progTitle", column = "v_ProgTitle"),\r
@Result(property = "epTitle", column = "v_EpTitle"), @Result(property = "episode", column = "v_Episode"),\r
@Result(property = "variantNrSegments", column = "v_VariantNrSegments"), @Result(property = "firstBroadcastDate", column = "v_FirstBroadcastDate"),\r
@Result(property = "nextBroadcastDate", column = "v_NextBroadcastDate"), @Result(property = "okForAir", column = "v_OkForAir"),\r