From b6133084e326db3194e8f73ca73a4aab2ccf7bf6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?V=C3=A1s=C3=A1ry=20D=C3=A1niel?= Date: Wed, 7 Aug 2019 11:35:39 +0000 Subject: [PATCH] git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube;C31468 --- .../MXFFileParser/Properties/AssemblyInfo.cs | 4 +- ....json => -UJ-configuration-tqc-check.json} | 0 ...- Copy.json => -configuration - Copy.json} | 0 ...configuration.json => -configuration.json} | 0 .../ACTIVE-configuration-promo.json | 140 ++++++++++++++++++ .../Configuration/dani-teszt-vezerlo.json | 93 ++++++++++++ client/Maestro/Maestro.csproj | 12 +- client/Maestro/MaestroForm.resx | 2 +- client/Maestro/Properties/AssemblyInfo.cs | 4 +- .../run-mediacube-server.launch | 2 +- server/-dependencies/jobengine.target | 3 +- server/-dependencies/pom.xml | 4 + server/-modules/pom.xml | 1 + .../user/commons/nexio/NexioDispatcher.java | 60 ++++---- .../commons/nexio/api/ClipEventListener.java | 2 +- .../user/commons/nexio/api/MediaListener.java | 49 +++--- .../api/samples/ListMetabaseContents.java | 73 +++++---- .../nexio/server/protocol/TCPConnection.java | 41 ++--- .../WEB-INF/web.xml | 4 +- .../user.jobengine.osgi.server/pages/menu.zul | 1 + .../user/jobengine/zk/model/JobListModel.java | 18 ++- server/user.mediacube.metadata/.classpath | 8 + server/user.mediacube.metadata/.project | 28 ++++ .../.settings/org.eclipse.jdt.core.prefs | 7 + .../META-INF/MANIFEST.MF | 11 ++ .../user.mediacube.metadata/build.properties | 4 + server/user.mediacube.metadata/pom.xml | 15 ++ .../user/mediabube/metadata/IMetadata.java | 5 + .../metadata/IMetadataListOptions.java | 5 + .../mediabube/metadata/IMetadataProvider.java | 8 + .../metadata/MetadataProviderFactory.java | 22 +++ .../metadata/MetadataProviderType.java | 5 + .../metadata/planair/IPlanAirADMapper.java | 36 +++++ .../planair/IPlanAirMaterialMapper.java | 36 +++++ .../metadata/planair/IPlanAirPromoMapper.java | 36 +++++ .../metadata/planair/MetadataType.java | 5 + .../metadata/planair/PlanAirMaterial.java | 98 ++++++++++++ .../planair/PlanAirMetadataListOptions.java | 45 ++++++ .../planair/PlanAirMetadataProvider.java | 74 +++++++++ .../metadata/PlanAirMetadataTest.java | 41 +++++ 40 files changed, 887 insertions(+), 115 deletions(-) rename client/Maestro/Configuration/{UJ-configuration-tqc-check.json => -UJ-configuration-tqc-check.json} (100%) rename client/Maestro/Configuration/{configuration - Copy.json => -configuration - Copy.json} (100%) rename client/Maestro/Configuration/{configuration.json => -configuration.json} (100%) create mode 100644 client/Maestro/Configuration/ACTIVE-configuration-promo.json create mode 100644 client/Maestro/Configuration/dani-teszt-vezerlo.json create mode 100644 server/user.mediacube.metadata/.classpath create mode 100644 server/user.mediacube.metadata/.project create mode 100644 server/user.mediacube.metadata/.settings/org.eclipse.jdt.core.prefs create mode 100644 server/user.mediacube.metadata/META-INF/MANIFEST.MF create mode 100644 server/user.mediacube.metadata/build.properties create mode 100644 server/user.mediacube.metadata/pom.xml create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadata.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadataListOptions.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadataProvider.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/MetadataProviderFactory.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/MetadataProviderType.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirADMapper.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirMaterialMapper.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirPromoMapper.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/planair/MetadataType.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMaterial.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMetadataListOptions.java create mode 100644 server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMetadataProvider.java create mode 100644 server/user.mediacube.metadata/test/user/mediabube/metadata/PlanAirMetadataTest.java diff --git a/client/MXFFileParser/Properties/AssemblyInfo.cs b/client/MXFFileParser/Properties/AssemblyInfo.cs index 95a916f9..7bf29ca6 100644 --- a/client/MXFFileParser/Properties/AssemblyInfo.cs +++ b/client/MXFFileParser/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.2.0.5")] -[assembly: AssemblyFileVersion("2.2.0.5")] +[assembly: AssemblyVersion("2.2.0.6")] +[assembly: AssemblyFileVersion("2.2.0.6")] diff --git a/client/Maestro/Configuration/UJ-configuration-tqc-check.json b/client/Maestro/Configuration/-UJ-configuration-tqc-check.json similarity index 100% rename from client/Maestro/Configuration/UJ-configuration-tqc-check.json rename to client/Maestro/Configuration/-UJ-configuration-tqc-check.json diff --git a/client/Maestro/Configuration/configuration - Copy.json b/client/Maestro/Configuration/-configuration - Copy.json similarity index 100% rename from client/Maestro/Configuration/configuration - Copy.json rename to client/Maestro/Configuration/-configuration - Copy.json diff --git a/client/Maestro/Configuration/configuration.json b/client/Maestro/Configuration/-configuration.json similarity index 100% rename from client/Maestro/Configuration/configuration.json rename to client/Maestro/Configuration/-configuration.json diff --git a/client/Maestro/Configuration/ACTIVE-configuration-promo.json b/client/Maestro/Configuration/ACTIVE-configuration-promo.json new file mode 100644 index 00000000..30d4f399 --- /dev/null +++ b/client/Maestro/Configuration/ACTIVE-configuration-promo.json @@ -0,0 +1,140 @@ +{ + "title": "PROMO SZAKOSZTÁLY", + "active": true, + "startInTray": false, + "enableCustomMetadataId": true, + "defaultWindowColor": "#4DB6AC", + "partialWindowColor": "#00796B", + "player": { + "enabled": true, + "autoStart": false, + "segmentEditor": true + }, + "source": { + "$type": "UNCSource", + "filter": "avi,wav,mxf", + "foldersAutoExpand": true, + "local": { + "address": "file://c:/_video" + } + }, + "metadatas": [ + { + "$type": "OctopusMetadata", + "disableStoryCheck": true, + "server": { + "address": "http://10.10.1.27/services/rest/octopus/", + "timeout": 1000 + }, + "projectSettings": { + "templateRoot": { + "address": "file://10.10.1.105/BRAAVOS/.MAESTRO", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + }, + "templateName": "ALAPTIMELINE.ezp", + "target": { + "label": "Projekt létrehozása", + "processor": "UNCTargetProcessor", + "killDateDays": 14, + "outputFormat": "%ID%", + "subFolderFormat": "%IDROOT%-%TEXT%/PROJECT", + "disableFileVersioning": true, + "remote": { + "address": "file://c:/_video/PROJECTS", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + }, + "disableOpenProject": false, + "disableOpenSourceFolder": false + } + }, + { + "$type": "TrafficMetadata", + "server": { + "address": "Data Source=10.10.1.45;Initial Catalog=PA_Echo;Persist Security Info=True;", + "userName": "MAM", + "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ", + "timeout": 1000 + }, + "projectSettings": { + "templateRoot": { + "address": "file://10.10.1.105/BRAAVOS/PROMO_NLE/!PROMO_MINTATIMELINE_190404/", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + }, + "templateName": "PROMO_MINTATIMELINE_190404.ezp", + "target": { + "label": "Projekt létrehozása", + "processor": "UNCTargetProcessor", + "outputFormat": "%ID%", + "subFolderFormat": "%IDROOT%-%TEXT%/PROJECT", + "disableFileVersioning": true, + "killDateDays": 14, + "remote": { + "address": "file://c:/_video/PROJECTS", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + }, + "disableOpenProject": false, + "disableOpenSourceFolder": false + } + }, + { + "$type": "MediaCubeMetadata", + "server": { + "address": "http://10.10.1.27/services/rest/jobengine/", + "timeout": 1000 + } + } + ], + "targets": [ + { + "label": "TQC promo", + "processor": "FTPTargetProcessor", + "outputFormat": "%ID%-%SOURCENAME%", + "tag": "Betöltés", + "killDateDays": 0, + "saveArchiveMetadata": false, + "remote": { + "address": "ftp://10.10.1.105/TQC/PROMO", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + }, + { + "label": "TQC reklám", + "processor": "FTPTargetProcessor", + "outputFormat": "%ID%-%SOURCENAME%", + "tag": "Betöltés", + "killDateDays": 0, + "saveArchiveMetadata": false, + "remote": { + "address": "ftp://10.10.1.105/TQC/REKLAM", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + }, + { + "label": "Archiválás", + "processor": "FTPTargetProcessor", + "outputFormat": "%ID%-%SOURCENAME%", + "tag": "Archiválás", + "saveArchiveMetadata": true, + "remote": { + "address": "ftp://10.10.1.105/ARCHIVE", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + } + ] +} diff --git a/client/Maestro/Configuration/dani-teszt-vezerlo.json b/client/Maestro/Configuration/dani-teszt-vezerlo.json new file mode 100644 index 00000000..a9ac65b5 --- /dev/null +++ b/client/Maestro/Configuration/dani-teszt-vezerlo.json @@ -0,0 +1,93 @@ +{ + "title": "Vezérlő", + "active": true, + "startInTray": false, + "enableCustomMetadataId": true, + "filter": "avi", + "player": { + }, + "source": { + "$type": "NEXIOSource", + "local": { + "address": "ws://10.10.1.27/services/nexio" + }, + "remote": { + "address": "ftp://10.10.1.55:2098", + "userName": "administrator", + "password": "+QtkeQdCTiOvZOgK/kUND4pO4/D+//r7ZIyluwMMdiqMEgO8iJErAG10ooWhPfiljQeXrdeyMzo7gWEZtcWpNSomGeDIbdMyQwtpqmMo1VEM3A27ZfzigY09YD46ECRh" + } + }, + "metadatas": [ + { + "$type": "OctopusMetadata", + "server": { + "address": "http://10.10.1.27/services/rest/octopus", + "timeout": 1000 + } + }, + { + "$type": "TrafficMetadata", + "server": { + "address": "Data Source=10.10.1.45;Initial Catalog=PA_Echo;Persist Security Info=True;", + "userName": "MAM", + "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ", + "timeout": 1000 + } + }, + { + "$type": "MediaCubeMetadata", + "server": { + "address": "http://10.10.1.27/services/rest/jobengine", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + } + ], + "targets": [ + { + "label": "T1", + "processor": "FXPTargetProcessor", + "outputFormat": "%ID%-%SOURCENAME%", + "tag": "Archiválás", + "saveArchiveMetadata": true, + "remote": { + "address": "ftp://10.10.1.105/TESZT", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + }, + { + "label": "Jó Reggelt Archiválás", + "processor": "FXPTargetProcessor", + "outputFormat": "%ID%-%SOURCENAME%", + "sourceNexioAgency": "ARCHIVED_JOREGG", + "sourceNexioKillDateDays": 3, + "tag": "Archiválás", + "saveArchiveMetadata": true, + "remote": { + "address": "ftp://10.10.1.105/TESZT", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + }, + { + "label": "CLEAN Archiválás", + "processor": "FXPTargetProcessor", + "outputFormat": "%ID%-%SOURCENAME%", + "sourceNexioAgency": "ARCHIVED_CLEAN", + "sourceNexioKillDateDays": 8, + "tag": "Archiválás", + "saveArchiveMetadata": true, + "remote": { + "address": "ftp://10.10.1.105/TESZT", + "userName": "mediacube", + "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy", + "timeout": 1000 + } + + } + ] +} diff --git a/client/Maestro/Maestro.csproj b/client/Maestro/Maestro.csproj index a55d12db..1c93d4bc 100644 --- a/client/Maestro/Maestro.csproj +++ b/client/Maestro/Maestro.csproj @@ -288,16 +288,22 @@ Form - + Always - + + Always + + + Always + + Always Always - + Always diff --git a/client/Maestro/MaestroForm.resx b/client/Maestro/MaestroForm.resx index b5bf3046..dafec937 100644 --- a/client/Maestro/MaestroForm.resx +++ b/client/Maestro/MaestroForm.resx @@ -128,7 +128,7 @@ AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0 ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS - CAAAAk1TRnQBSQFMAgEBAgEAAYABAgGAAQIBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo + CAAAAk1TRnQBSQFMAgEBAgEAAZABAgGQAQIBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5 AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA diff --git a/client/Maestro/Properties/AssemblyInfo.cs b/client/Maestro/Properties/AssemblyInfo.cs index da87d941..0bb442fa 100644 --- a/client/Maestro/Properties/AssemblyInfo.cs +++ b/client/Maestro/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("2.0.9.5")] -[assembly: AssemblyFileVersion("2.0.9.5")] +[assembly: AssemblyVersion("2.0.9.6")] +[assembly: AssemblyFileVersion("2.0.9.6")] diff --git a/server/-configuration/run-mediacube-server.launch b/server/-configuration/run-mediacube-server.launch index c0b21572..994fd795 100644 --- a/server/-configuration/run-mediacube-server.launch +++ b/server/-configuration/run-mediacube-server.launch @@ -19,7 +19,7 @@ - + diff --git a/server/-dependencies/jobengine.target b/server/-dependencies/jobengine.target index 61066195..9d95d521 100644 --- a/server/-dependencies/jobengine.target +++ b/server/-dependencies/jobengine.target @@ -1,5 +1,5 @@ - + @@ -119,6 +119,7 @@ + diff --git a/server/-dependencies/pom.xml b/server/-dependencies/pom.xml index 89bfc124..4b89aaca 100644 --- a/server/-dependencies/pom.xml +++ b/server/-dependencies/pom.xml @@ -118,6 +118,10 @@ default-cli + + org.mybatis:mybatis:3.5.2 + + diff --git a/server/-modules/pom.xml b/server/-modules/pom.xml index 7a85d6cb..7dc37ce9 100644 --- a/server/-modules/pom.xml +++ b/server/-modules/pom.xml @@ -7,6 +7,7 @@ 1.0.0 pom + ../user.mediacube.metadata ../user.jobengine.executors ../user.jobengine.osgi.commons ../user.jobengine.osgi.db diff --git a/server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioDispatcher.java b/server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioDispatcher.java index e6c0ddaf..05b5b923 100644 --- a/server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioDispatcher.java +++ b/server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioDispatcher.java @@ -9,6 +9,7 @@ import com.ibm.nosql.json.api.BasicDBObject; import com.ibm.nosql.json.api.DB; import com.ibm.nosql.json.api.DBCollection; +import user.commons.MediaCubeMarker; import user.commons.nexio.api.Clip; import user.commons.nexio.api.ClipEvent; import user.commons.nexio.api.ClipEventListener; @@ -81,6 +82,7 @@ public class NexioDispatcher implements ClipEventListener { } private boolean restartInProgress; + private Object lock = new Object(); private INexioChangeListener nexioChangeListener; private DB db; @@ -127,9 +129,8 @@ public class NexioDispatcher implements ClipEventListener { jsClip.put(ID, evt.getClip().getId().get()); removeDeleted(jsClip); } else if (evt.getEventType() == ClipEventType.LISTENER_RESTART_NEEDED) { - shutdown(); - startup(); - logger.info("Nexio dispatcher restarted"); + logger.info(new MediaCubeMarker(), "In progress {}", isRestartInProgress()); + logger.info(new MediaCubeMarker(), "A kommunikácó a NEXIO eszközzel megszakadt. A szinkronizáció újraindítása szükséges."); } } catch (Exception e) { logger.catching(e); @@ -248,7 +249,6 @@ public class NexioDispatcher implements ClipEventListener { logger.info("Initial clip import completed"); Mediabase mediabase = NexioDispatcher.this.controller.getMediabase(); mediaListener = mediabase.createMediaListener(disabled, NexioDispatcher.this); - setRestartInProgress(false); try { nexioChangeListener.refreshClients(); @@ -257,6 +257,8 @@ public class NexioDispatcher implements ClipEventListener { } mediaListener.startListener(); + setRestartInProgress(false); + logger.info(new MediaCubeMarker(), "Thread progress {}", isRestartInProgress()); } catch (Exception e) { logger.catching(e); @@ -265,8 +267,10 @@ public class NexioDispatcher implements ClipEventListener { worker.start(); } - synchronized public boolean isRestartInProgress() { - return restartInProgress; + public boolean isRestartInProgress() { + synchronized (lock) { + return restartInProgress; + } } /* @@ -303,14 +307,14 @@ public class NexioDispatcher implements ClipEventListener { } /* - + int c = connection.read(buffer, 0, 2); //2 bytes hosszan az idokozben hozzaadott id-k szamossaga if (c < 2) { throw new ProtocolException("c, 2, 2"); } //MSB, LSB - + return nofIds; */ return ret; @@ -342,9 +346,19 @@ public class NexioDispatcher implements ClipEventListener { } @Override - public void restart() { - logger.info("Restart (already in progress {})", restartInProgress); + public int restart() { + if (disabled) { + logger.info("Nexio service is disabled"); + return 1; + } + if (isRestartInProgress()) { + logger.info("Nexio service restart is in progress"); + return 2; + } + setRestartInProgress(true); shutdown(); + startup(); + return controller == null ? 3 : 0; } private void saveClipIntoMongo(BasicDBObject clip) { @@ -382,20 +396,14 @@ public class NexioDispatcher implements ClipEventListener { this.nexioChangeListener = nexioChangeListener; } - synchronized public void setRestartInProgress(boolean restartInProgress) { - this.restartInProgress = restartInProgress; - logger.info("Restart in progress {}", isRestartInProgress()); - } - - public void shutdown() { - if (disabled) - return; - if (isRestartInProgress()) { - return; + public void setRestartInProgress(boolean restartInProgress) { + synchronized (lock) { + this.restartInProgress = restartInProgress; } + } + private void shutdown() { logger.info("Shutting down Nexio service"); - setRestartInProgress(true); if (mediaListener != null) { mediaListener.disconnect(); mediaListener = null; @@ -407,18 +415,14 @@ public class NexioDispatcher implements ClipEventListener { } public void startup() { - if (disabled) { - logger.info("Nexio service is disabled"); - return; - } - logger.info("Starting up Nexio service"); - setRestartInProgress(true); this.controller = new Controller(NEXIO_HOST); try { this.controller.connect(); } catch (Exception e) { - logger.catching(e); + logger.error("Can not start NEXIO sync", e); + this.controller = null; + this.mediaListener = null; setRestartInProgress(false); return; } diff --git a/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/ClipEventListener.java b/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/ClipEventListener.java index a3002c3d..583ad55f 100644 --- a/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/ClipEventListener.java +++ b/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/ClipEventListener.java @@ -3,5 +3,5 @@ package user.commons.nexio.api; public interface ClipEventListener { public void clipEventPerformed(ClipEvent evt); - void restart(); + int restart(); } diff --git a/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/MediaListener.java b/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/MediaListener.java index 52cfbca3..661e56fb 100644 --- a/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/MediaListener.java +++ b/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/MediaListener.java @@ -5,7 +5,6 @@ import java.util.ArrayList; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import user.commons.nexio.server.protocol.Connection; import user.commons.nexio.server.protocol.Id; import user.commons.nexio.server.protocol.TCPConnection; @@ -27,6 +26,8 @@ public class MediaListener { //00 00 00 01 0x00 IDs in Added List BC=0x01, NN=0x00, DATA=none //00 00 00 02 0x01 IDs in Deleted List BC=0x01, NN=0x01, DATA=none static private final byte[] CHANGE_NOTIFICATION_REQ = { (byte) 0xC4, (byte) 0xA5, 0, 0, 0, 0x03 }; //C4A5 + MASK=ADD+DELETE + static private final byte[] PING = { (byte) 0x00, (byte) 0x11 }; //0011 -> 1211 = ok + static private final String PING_OK = "1211"; //10 01 response immediately static private final byte[] ACK = { (byte) 0x10, (byte) 0x01 }; //CF A6 BC NN DATA NN=0 -> IDs are in added list, NN=1 -> IDs are in deleted list @@ -62,7 +63,7 @@ public class MediaListener { private Mediabase mediaBase = null; private int nexioPort = 557; private String nexioHost = null; - private Connection connection = null; + private TCPConnection connection = null; private ArrayList notificationList = new ArrayList(); public MediaListener(Mediabase _mediaBase, String _nexioHost, int _nexioPort) { @@ -100,7 +101,7 @@ public class MediaListener { } private void createNexioConnection() throws Exception { - this.connection = TCPConnection.getInstance(this.nexioHost, this.nexioPort); + this.connection = (TCPConnection) TCPConnection.getInstance(this.nexioHost, this.nexioPort); logger.info("NEXIO MediaListener is connected to " + this.nexioHost + ":" + this.nexioPort); } @@ -132,17 +133,6 @@ public class MediaListener { } } - private void forceRestart() { - logger.info("MediaListener stopping..."); - try { - fireEvent(null, NN_LISTENER_RESTART); - // if (this.connection != null) - // this.connection.disconnect(); - } catch (Exception e) { - logger.catching(e); - } - } - private void handleNotification(int notificationNumber) throws Exception { //LIST_FIRST_ID_LIST /* @@ -166,13 +156,29 @@ public class MediaListener { } + public boolean isAlive() { + boolean result = false; + + try { + writeBytes(PING); + byte[] buffer = readBytes(2); + result = PING_OK.equals(bytesToHex(buffer)); + logger.info("Connection is alive: {}", result); + } catch (Exception e) { + logger.error(e); + } + return result; + } + private void listen() { try { + byte[] buffer; + //SEND CHANGE NOTIFICATION REQ writeBytes(CHANGE_NOTIFICATION_REQ); + buffer = readBytes(2); //ACK - byte[] buffer = readBytes(2); logger.info("NEXIO MediaListener listeninig"); while (true) { @@ -215,9 +221,16 @@ public class MediaListener { } } } catch (Exception e) { - //logger.catching(e); - logger.error(e.getMessage()); - forceRestart(); + logger.catching(e); + notifyRestartNeeded(); + } + } + + public void notifyRestartNeeded() { + try { + fireEvent(null, NN_LISTENER_RESTART); + } catch (Exception e) { + logger.catching(e); } } diff --git a/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/samples/ListMetabaseContents.java b/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/samples/ListMetabaseContents.java index a197e622..7d524786 100644 --- a/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/samples/ListMetabaseContents.java +++ b/server/user.jobengine.osgi.commons/src/user/commons/nexio/api/samples/ListMetabaseContents.java @@ -80,52 +80,52 @@ public class ListMetabaseContents implements ClipEventListener { public static void main(String[] args) throws UnknownHostException, IOException, ProtocolException, ClipNotFoundException { ListMetabaseContents lmc = new ListMetabaseContents(); - /* - - + /* + + //MASK REQ RESP_NOT_NUM //00 00 00 01 0x00 IDs in Added List BC=0x01, NN=0x00, DATA=none //00 00 00 02 0x01 IDs in Deleted List BC=0x01, NN=0x01, DATA=none byte[] CHANGE_NOTIFICATION_REQ = { (byte) 0xC4, (byte)0xA5, 0,0,0,0x03}; //+C4A5 + MASK - + //10 01 response immediately byte[] ACK = { (byte) 0x10, (byte)0x01}; - - //CF A6 BC NN DATA NN=0 -> IDs are in added list, NN=1 -> IDs are in deleted list + + //CF A6 BC NN DATA NN=0 -> IDs are in added list, NN=1 -> IDs are in deleted list byte[] CHANGE_NOTIFICATION_RESP = { (byte) 0xCF, (byte)0xA6}; - - //List First ID List (C1 4C) + + //List First ID List (C1 4C) byte[] LIST_FIRST_ID_LIST_ADDED = { (byte) 0xC1, (byte)0x4C, (byte)0x02}; //2 added, 3 deleted byte[] LIST_FIRST_ID_LIST_DELETED = { (byte) 0xC1, (byte)0x4C, (byte)0x03}; //2 added, 3 deleted - - //List First ID List (C0 4D) + + //List First ID List (C0 4D) byte[] LIST_NEXT_ID_LIST = { (byte) 0xC0, (byte)0x4D}; - - + + Connection connection = TCPConnection.getInstance(NEXIO_HOST, 557); // connection.write(ID_LIST); // connection.flush(); - + connection.write(CHANGE_NOTIFICATION_REQ); connection.flush(); //ACK byte[] buffer = new byte[2]; int c = connection.read(buffer, 0, 2); - - + + while("1".equals("1")){ - + //CHANGE_NOTIFICATION_RESP (blocking read) buffer = new byte[4]; c = connection.read(buffer,0,4); //CFA6 BC NN -> 0=added, 1=deleted System.out.println("change notification resp: " + bytesToHex(buffer)); - + //ACK sending back connection.write(ACK); connection.flush(); - + //LIST_FIRST_ID_LIST - + //0x01 Main ID Handle List D8 4C ID //0x02 ID Handles Added List D8 4C ID //0x03 ID Handles Deleted List D8 4C ID @@ -135,7 +135,7 @@ public class ListMetabaseContents implements ClipEventListener { //0x21 Main ID Handle/Extended ID List DF 4C BC ID XID * //0x22 ID Handles/Extended IDs Added List DF 4C BC ID XID * //0x23 ID Handles/Extended IDs Deleted List DF 4C BC ID XID * - + if(buffer[3] == 0){ connection.write(LIST_FIRST_ID_LIST_ADDED); System.out.println("NN ADDED"); @@ -145,33 +145,33 @@ public class ListMetabaseContents implements ClipEventListener { System.out.println("NN DELETED"); } connection.flush(); - + //READ FIRST ID buffer = new byte[2]; c = connection.read(buffer, 0, 2); if("D84C".equals(bytesToHex(buffer))){ System.out.println("reading first id..."); - + //added or deleted buffer = new byte[8]; c = connection.read(buffer, 0, 8); System.out.println("FIRST ID: " + new String(buffer)); - + //C0 4D List Next ID List connection.write(LIST_NEXT_ID_LIST); connection.flush(); - + buffer = new byte[2]; //D04D amikor elfogy for(connection.read(buffer, 0, 2); bytesToHex(buffer).equals("D84D"); connection.read(buffer, 0, 2)){ - + buffer = new byte[8]; c = connection.read(buffer, 0, 8); System.out.println("NEXT ID: " + new String(buffer)); - + connection.write(LIST_NEXT_ID_LIST); connection.flush(); - + buffer = new byte[2]; } //System.out.println("LIST_NEXT_ID_LIST RESP: " + bytesToHex(buffer)); @@ -182,8 +182,8 @@ public class ListMetabaseContents implements ClipEventListener { System.out.println("Error in list first id list response: " + bytesToHex( buffer)); } } - - + + //int i = connection.read(); connection.disconnect(); */ @@ -207,7 +207,7 @@ public class ListMetabaseContents implements ClipEventListener { createNexioConnection(); this.testAddDelete(); - /* + /* Controller controller = new Controller(nexioHost); controller.connect(); System.out.println("Connected."); @@ -229,11 +229,11 @@ public class ListMetabaseContents implements ClipEventListener { int videoFormat = clip.getVideoFormat(); //Video Bitrate int videoBitrate = clip.getVideoBitrate(); - + System.out.println(String.format("ID = '%s'\tXID = '%s'\tDuration = '%s'\tModified = '%s'\tVideoFormat = '%s'\tVideoBitrate = '%s'", id, xid, duration, modifiedTimestamp.getTime(), videoFormat, videoBitrate)); } - + //Clip clip = mediabase.getClip(new Xid("xdcam-pal-d10-imx30-8")); //long duration2 = clip.getDuration(); //System.out.println(clip + " dur: "+ duration2); @@ -266,9 +266,8 @@ public class ListMetabaseContents implements ClipEventListener { } @Override - public void restart() { - // TODO Auto-generated method stub - + public int restart() { + return 0; } public void testAddDelete() { @@ -317,7 +316,7 @@ public class ListMetabaseContents implements ClipEventListener { buffer = readBytes(2); if (LIST_FIRST_ID_LIST_FOUND.equals(bytesToHex(buffer))) { /* - * //extended id version 0x22, 0x23 + * //extended id version 0x22, 0x23 //found 2, BC 1, ID 8, XID {BC-8} buffer = readBytes(1); int bc = buffer[0]; @@ -387,7 +386,7 @@ public class ListMetabaseContents implements ClipEventListener { private void writeBytes(byte[] toWrite) throws Exception { try { //testcode calc checksum - /* + /* byte[] finalbytes = Arrays.copyOf(toWrite, toWrite.length + 1); long chksum = 0; for(int c=0; cindex.zul index.zhtml - + + diff --git a/server/user.jobengine.osgi.server/pages/menu.zul b/server/user.jobengine.osgi.server/pages/menu.zul index 89283a79..e568daca 100644 --- a/server/user.jobengine.osgi.server/pages/menu.zul +++ b/server/user.jobengine.osgi.server/pages/menu.zul @@ -55,6 +55,7 @@ + diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobListModel.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobListModel.java index e927663f..aa668dca 100644 --- a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobListModel.java +++ b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobListModel.java @@ -185,7 +185,23 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener if (evt.getName().equals("onCancel")) return; try { - dispatcher.restart(); + int ret = dispatcher.restart(); + + switch (ret) { + case 0: + Messagebox.show("A NEXIO kapcsolat újraindítása sikeres volt."); + break; + case 1: + Messagebox.show("A NEXIO kapcsolat le van tiltva."); + break; + case 2: + Messagebox.show("A NEXIO kapcsolat újraindítás már folyamatban van."); + break; + case 3: + Messagebox.show("Nem lehet csatlakozni a NEXIO rendszerhez."); + break; + } + } catch (Exception e) { Messagebox.show(e.getMessage()); } diff --git a/server/user.mediacube.metadata/.classpath b/server/user.mediacube.metadata/.classpath new file mode 100644 index 00000000..069739a5 --- /dev/null +++ b/server/user.mediacube.metadata/.classpath @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/server/user.mediacube.metadata/.project b/server/user.mediacube.metadata/.project new file mode 100644 index 00000000..abaf97fb --- /dev/null +++ b/server/user.mediacube.metadata/.project @@ -0,0 +1,28 @@ + + + user.mediacube.metadata + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + diff --git a/server/user.mediacube.metadata/.settings/org.eclipse.jdt.core.prefs b/server/user.mediacube.metadata/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 00000000..295926d9 --- /dev/null +++ b/server/user.mediacube.metadata/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,7 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/server/user.mediacube.metadata/META-INF/MANIFEST.MF b/server/user.mediacube.metadata/META-INF/MANIFEST.MF new file mode 100644 index 00000000..d0cdd11a --- /dev/null +++ b/server/user.mediacube.metadata/META-INF/MANIFEST.MF @@ -0,0 +1,11 @@ +Manifest-Version: 1.0 +Bundle-ManifestVersion: 2 +Bundle-Name: Metadata +Bundle-SymbolicName: user.mediacube.metadata +Bundle-Version: 1.0.0.qualifier +Bundle-RequiredExecutionEnvironment: JavaSE-1.8 +Export-Package: user.mediabube.metadata +Require-Bundle: org.mybatis.mybatis;bundle-version="3.5.2", + org.junit;bundle-version="4.12.0", + com.microsoft.sqlserver.sqljdbc, + user.jobengine.osgi.commons diff --git a/server/user.mediacube.metadata/build.properties b/server/user.mediacube.metadata/build.properties new file mode 100644 index 00000000..41eb6ade --- /dev/null +++ b/server/user.mediacube.metadata/build.properties @@ -0,0 +1,4 @@ +source.. = src/ +output.. = bin/ +bin.includes = META-INF/,\ + . diff --git a/server/user.mediacube.metadata/pom.xml b/server/user.mediacube.metadata/pom.xml new file mode 100644 index 00000000..5ceca0cf --- /dev/null +++ b/server/user.mediacube.metadata/pom.xml @@ -0,0 +1,15 @@ + + + + ../-modules + user.jobengine + MediaCube + 1.0.0 + + 4.0.0 + user.jobengine.metadata + eclipse-plugin + 1.0.0 + + \ No newline at end of file diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadata.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadata.java new file mode 100644 index 00000000..1aaec720 --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadata.java @@ -0,0 +1,5 @@ +package user.mediabube.metadata; + +public interface IMetadata { + +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadataListOptions.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadataListOptions.java new file mode 100644 index 00000000..bd8431cf --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadataListOptions.java @@ -0,0 +1,5 @@ +package user.mediabube.metadata; + +public interface IMetadataListOptions { + +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadataProvider.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadataProvider.java new file mode 100644 index 00000000..40c443dc --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/IMetadataProvider.java @@ -0,0 +1,8 @@ +package user.mediabube.metadata; + +import java.util.List; + +public interface IMetadataProvider { + + List list(IMetadataListOptions options) throws Exception; +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/MetadataProviderFactory.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/MetadataProviderFactory.java new file mode 100644 index 00000000..54330713 --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/MetadataProviderFactory.java @@ -0,0 +1,22 @@ +package user.mediabube.metadata; + +import java.util.HashMap; +import java.util.Map; + +import user.mediabube.metadata.planair.PlanAirMetadataProvider; + +public class MetadataProviderFactory { + + private static Map providers = new HashMap<>(); + + static { + try { + providers.put(MetadataProviderType.PLANAIR, new PlanAirMetadataProvider()); + } catch (Exception e) { + } + } + + public static IMetadataProvider getProvider(MetadataProviderType type) { + return providers.get(type); + } +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/MetadataProviderType.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/MetadataProviderType.java new file mode 100644 index 00000000..9b5959b8 --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/MetadataProviderType.java @@ -0,0 +1,5 @@ +package user.mediabube.metadata; + +public enum MetadataProviderType { + PLANAIR +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirADMapper.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirADMapper.java new file mode 100644 index 00000000..73ff6c8d --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirADMapper.java @@ -0,0 +1,36 @@ +package user.mediabube.metadata.planair; + +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.mapping.StatementType; + +public interface IPlanAirADMapper { + + // @Operation int, @@@Options int, @@ItemID int, @@IntParam1 int=Null, @@IntParam2 int=Null, @@IntParam3 int=Null, + // @@StrParam1 varchar(200)=Null, @@StrParam2 varchar(max)=Null, @@DateParam1 datetime=Null, @@DateParam2 datetime=Null + static final String MATERIAL_SQL = "{CALL dbo.clIFsp_EC_MAM(1002, #{options, mode=IN, jdbcType=INTEGER}, Null, Null, Null, Null, #{search, mode=IN, jdbcType=VARCHAR}, Null, #{broadcastDay, mode=IN, jdbcType=DATE}, #{broadcastDay, mode=IN, jdbcType=DATE})}";//musorid + // item.v_EpisodeID = ReadString(reader, ref f); + // item.v_VariantID = ReadInt(reader, ref f); + // item.v_MediaID = ReadString(reader, ref f); + // item.v_ProgTitle = ReadString(reader, ref f); + // item.v_EpTitle = ReadString(reader, ref f); + // item.v_Episode = ReadShort(reader, ref f); + // item.v_VariantNrSegments = ReadInt(reader, ref f); + // item.v_FirstBroadcastDate = ReadDateTime(reader, ref f); + // item.v_NextBroadcastDate = ReadDateTime(reader, ref f); + + @Select(value = MATERIAL_SQL) + @Options(statementType = StatementType.CALLABLE) + @Results(value = { @Result(property = "episodeID", column = "v_EpisodeID"), @Result(property = "variantID", column = "v_VariantID"), + @Result(property = "mediaID", column = "v_MediaID"), @Result(property = "progTitle", column = "v_ProgTitle"), + @Result(property = "epTitle", column = "v_EpTitle"), @Result(property = "episode", column = "v_Episode"), + @Result(property = "variantNrSegments", column = "v_VariantNrSegments"), @Result(property = "firstBroadcastDate", column = "v_FirstBroadcastDate"), + @Result(property = "nextBroadcastDate", column = "v_NextBroadcastDate") }) + public List getMaterials(@Param("options") Integer options, @Param("search") String search, @Param("broadcastDay") Date broadcastDay); +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirMaterialMapper.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirMaterialMapper.java new file mode 100644 index 00000000..78907055 --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirMaterialMapper.java @@ -0,0 +1,36 @@ +package user.mediabube.metadata.planair; + +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.mapping.StatementType; + +public interface IPlanAirMaterialMapper { + + // @Operation int, @@@Options int, @@ItemID int, @@IntParam1 int=Null, @@IntParam2 int=Null, @@IntParam3 int=Null, + // @@StrParam1 varchar(200)=Null, @@StrParam2 varchar(max)=Null, @@DateParam1 datetime=Null, @@DateParam2 datetime=Null + static final String MATERIAL_SQL = "{CALL dbo.clIFsp_EC_MAM(1002, #{options, mode=IN, jdbcType=INTEGER}, Null, Null, Null, Null, #{search, mode=IN, jdbcType=VARCHAR}, Null, #{broadcastDay, mode=IN, jdbcType=DATE}, #{broadcastDay, mode=IN, jdbcType=DATE})}";//musorid + // item.v_EpisodeID = ReadString(reader, ref f); + // item.v_VariantID = ReadInt(reader, ref f); + // item.v_MediaID = ReadString(reader, ref f); + // item.v_ProgTitle = ReadString(reader, ref f); + // item.v_EpTitle = ReadString(reader, ref f); + // item.v_Episode = ReadShort(reader, ref f); + // item.v_VariantNrSegments = ReadInt(reader, ref f); + // item.v_FirstBroadcastDate = ReadDateTime(reader, ref f); + // item.v_NextBroadcastDate = ReadDateTime(reader, ref f); + + @Select(value = MATERIAL_SQL) + @Options(statementType = StatementType.CALLABLE) + @Results(value = { @Result(property = "episodeID", column = "v_EpisodeID"), @Result(property = "variantID", column = "v_VariantID"), + @Result(property = "mediaID", column = "v_MediaID"), @Result(property = "progTitle", column = "v_ProgTitle"), + @Result(property = "epTitle", column = "v_EpTitle"), @Result(property = "episode", column = "v_Episode"), + @Result(property = "variantNrSegments", column = "v_VariantNrSegments"), @Result(property = "firstBroadcastDate", column = "v_FirstBroadcastDate"), + @Result(property = "nextBroadcastDate", column = "v_NextBroadcastDate") }) + public List getMaterials(@Param("options") Integer options, @Param("search") String search, @Param("broadcastDay") Date broadcastDay); +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirPromoMapper.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirPromoMapper.java new file mode 100644 index 00000000..2e8879a4 --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/IPlanAirPromoMapper.java @@ -0,0 +1,36 @@ +package user.mediabube.metadata.planair; + +import java.util.Date; +import java.util.List; + +import org.apache.ibatis.annotations.Options; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Result; +import org.apache.ibatis.annotations.Results; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.mapping.StatementType; + +public interface IPlanAirPromoMapper { + + // @Operation int, @@@Options int, @@ItemID int, @@IntParam1 int=Null, @@IntParam2 int=Null, @@IntParam3 int=Null, + // @@StrParam1 varchar(200)=Null, @@StrParam2 varchar(max)=Null, @@DateParam1 datetime=Null, @@DateParam2 datetime=Null + static final String MATERIAL_SQL = "{CALL dbo.clIFsp_EC_MAM(1002, #{options, mode=IN, jdbcType=INTEGER}, Null, Null, Null, Null, #{search, mode=IN, jdbcType=VARCHAR}, Null, #{broadcastDay, mode=IN, jdbcType=DATE}, #{broadcastDay, mode=IN, jdbcType=DATE})}";//musorid + // item.v_EpisodeID = ReadString(reader, ref f); + // item.v_VariantID = ReadInt(reader, ref f); + // item.v_MediaID = ReadString(reader, ref f); + // item.v_ProgTitle = ReadString(reader, ref f); + // item.v_EpTitle = ReadString(reader, ref f); + // item.v_Episode = ReadShort(reader, ref f); + // item.v_VariantNrSegments = ReadInt(reader, ref f); + // item.v_FirstBroadcastDate = ReadDateTime(reader, ref f); + // item.v_NextBroadcastDate = ReadDateTime(reader, ref f); + + @Select(value = MATERIAL_SQL) + @Options(statementType = StatementType.CALLABLE) + @Results(value = { @Result(property = "episodeID", column = "v_EpisodeID"), @Result(property = "variantID", column = "v_VariantID"), + @Result(property = "mediaID", column = "v_MediaID"), @Result(property = "progTitle", column = "v_ProgTitle"), + @Result(property = "epTitle", column = "v_EpTitle"), @Result(property = "episode", column = "v_Episode"), + @Result(property = "variantNrSegments", column = "v_VariantNrSegments"), @Result(property = "firstBroadcastDate", column = "v_FirstBroadcastDate"), + @Result(property = "nextBroadcastDate", column = "v_NextBroadcastDate") }) + public List getMaterials(@Param("options") Integer options, @Param("search") String search, @Param("broadcastDay") Date broadcastDay); +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/MetadataType.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/MetadataType.java new file mode 100644 index 00000000..3f0d530b --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/MetadataType.java @@ -0,0 +1,5 @@ +package user.mediabube.metadata.planair; + +public enum MetadataType { + Material, Promo, AD +} \ No newline at end of file diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMaterial.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMaterial.java new file mode 100644 index 00000000..0399abda --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMaterial.java @@ -0,0 +1,98 @@ +package user.mediabube.metadata.planair; + +import java.util.Date; + +import user.mediabube.metadata.IMetadata; + +public class PlanAirMaterial implements IMetadata { + private String episodeID; + private int variantID; + private String mediaID; + private String epTitle; + private String progTitle; + private short episode; + private boolean okForAir; + private int variantNrSegments; + private Date nextBroadcastDate; + private Date firstBroadcastDate; + + public short getEpisode() { + return episode; + } + + public String getEpisodeID() { + return episodeID; + } + + public String getEpTitle() { + return epTitle; + } + + public Date getFirstBroadcastDate() { + return firstBroadcastDate; + } + + public String getMediaID() { + return mediaID; + } + + public Date getNextBroadcastDate() { + return nextBroadcastDate; + } + + public String getProgTitle() { + return progTitle; + } + + public int getVariantID() { + return variantID; + } + + public int getVariantNrSegments() { + return variantNrSegments; + } + + public boolean isOkForAir() { + return okForAir; + } + + public void setEpisode(short episode) { + this.episode = episode; + } + + public void setEpisodeID(String episodeID) { + this.episodeID = episodeID; + } + + public void setEpTitle(String epTitle) { + this.epTitle = epTitle; + } + + public void setFirstBroadcastDate(Date firstBroadcastDate) { + this.firstBroadcastDate = firstBroadcastDate; + } + + public void setMediaID(String mediaID) { + this.mediaID = mediaID; + } + + public void setNextBroadcastDate(Date nextBroadcastDate) { + this.nextBroadcastDate = nextBroadcastDate; + } + + public void setOkForAir(boolean okForAir) { + this.okForAir = okForAir; + } + + public void setProgTitle(String progTitle) { + this.progTitle = progTitle; + } + + public void setVariantID(int variantID) { + this.variantID = variantID; + } + + public void setVariantNrSegments(int variantNrSegments) { + this.variantNrSegments = variantNrSegments; + } +} \ No newline at end of file diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMetadataListOptions.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMetadataListOptions.java new file mode 100644 index 00000000..c86f121c --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMetadataListOptions.java @@ -0,0 +1,45 @@ +package user.mediabube.metadata.planair; + +import java.util.Date; + +import user.mediabube.metadata.IMetadataListOptions; + +public class PlanAirMetadataListOptions implements IMetadataListOptions { + private Date broadcastDay; + private boolean problematic; + private String search; + private MetadataType type; + + public Date getBroadcastDay() { + return broadcastDay; + } + + public String getSearch() { + return search; + } + + public MetadataType getType() { + return type; + } + + public boolean isProblematic() { + return problematic; + } + + public void setBroadcastDay(Date broadcastDay) { + this.broadcastDay = broadcastDay; + } + + public void setProblematic(boolean problematic) { + this.problematic = problematic; + } + + public void setSearch(String search) { + this.search = search; + } + + public void setType(MetadataType type) { + this.type = type; + } + +} diff --git a/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMetadataProvider.java b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMetadataProvider.java new file mode 100644 index 00000000..2631189f --- /dev/null +++ b/server/user.mediacube.metadata/src/user/mediabube/metadata/planair/PlanAirMetadataProvider.java @@ -0,0 +1,74 @@ +package user.mediabube.metadata.planair; + +import java.util.List; + +import javax.sql.DataSource; + +import org.apache.ibatis.datasource.pooled.PooledDataSource; +import org.apache.ibatis.mapping.Environment; +import org.apache.ibatis.session.Configuration; +import org.apache.ibatis.session.SqlSession; +import org.apache.ibatis.session.SqlSessionFactory; +import org.apache.ibatis.session.SqlSessionFactoryBuilder; +import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory; + +import com.microsoft.sqlserver.jdbc.SQLServerDriver; + +import user.commons.ListUtils; +import user.mediabube.metadata.IMetadata; +import user.mediabube.metadata.IMetadataListOptions; +import user.mediabube.metadata.IMetadataProvider; + +public class PlanAirMetadataProvider implements IMetadataProvider { + private static final String JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; + private static final String JDBC_URL = System.getProperty("jobengine.planair.db.url", "jdbc:sqlserver://10.10.1.45;databaseName=PA_Echo;"); + private static final String JDBC_USER = System.getProperty("jobengine.planair.db.user", "MAM"); + private static final String JDBC_PWD = System.getProperty("jobengine.planair.db.password", "Echotv.hu"); + + private final SqlSessionFactory sqlSessionFactory; + + public PlanAirMetadataProvider() throws Exception { + try { + + Class forName = (Class) Class.forName(JDBC_DRIVER); + sqlSessionFactory = buildqlSessionFactory(); + } catch (Exception e) { + throw e; + } + } + + private SqlSessionFactory buildqlSessionFactory() { + DataSource dataSource = new PooledDataSource(JDBC_DRIVER, JDBC_URL, JDBC_USER, JDBC_PWD); + Environment environment = new Environment("Development", new JdbcTransactionFactory(), dataSource); + Configuration configuration = new Configuration(environment); + configuration.addMapper(IPlanAirMaterialMapper.class); + SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); + return builder.build(configuration); + } + + @Override + public List list(IMetadataListOptions options) throws Exception { + List result = null; + try (SqlSession session = sqlSessionFactory.openSession()) { + PlanAirMetadataListOptions opt = (PlanAirMetadataListOptions) options; + int problematic = opt.isProblematic() ? 1 : 0; + + switch (opt.getType()) { + case AD: + break; + case Material: + IPlanAirMaterialMapper mapper = session.getMapper(IPlanAirMaterialMapper.class); + result = ListUtils.cast(mapper.getMaterials(problematic, opt.getSearch(), opt.getBroadcastDay())); + break; + case Promo: + break; + default: + throw new Exception("Missing metadata type"); + } + } catch (Exception e) { + throw e; + } + return result; + } + +} diff --git a/server/user.mediacube.metadata/test/user/mediabube/metadata/PlanAirMetadataTest.java b/server/user.mediacube.metadata/test/user/mediabube/metadata/PlanAirMetadataTest.java new file mode 100644 index 00000000..8e1a2630 --- /dev/null +++ b/server/user.mediacube.metadata/test/user/mediabube/metadata/PlanAirMetadataTest.java @@ -0,0 +1,41 @@ +package user.mediabube.metadata; + +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.Date; +import java.util.List; + +import org.junit.Test; + +import user.mediabube.metadata.planair.PlanAirMetadataListOptions; + +public class PlanAirMetadataTest { + + @Test + public void testConnection() throws Exception { + // Fixture + // Exercise + IMetadataProvider sut = MetadataProviderFactory.getProvider(MetadataProviderType.PLANAIR); + + // Verify + assertNotNull(sut); + } + + @Test + public void testListMaterialsByBroadcastDay() throws Exception { + // Fixture + IMetadataProvider sut = MetadataProviderFactory.getProvider(MetadataProviderType.PLANAIR); + PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions(); + opt.setBroadcastDay(new Date()); + opt.setProblematic(false); + + // Exercise + List result = sut.list(opt); + + // Verify + assertNotNull(result); + assertTrue(result.size() > 0); + } + +} -- 2.54.0