git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 24 Jun 2020 12:56:00 +0000 (12:56 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 24 Jun 2020 12:56:00 +0000 (12:56 +0000)
66 files changed:
server/-configuration/AMC/scheduledjobs.json [new file with mode: 0644]
server/-configuration/log4j2-test.xml
server/-configuration/run-mediacube-server-hirtv.launch
server/-configuration/run-mediacube-server-mv.launch
server/-configuration/run-mediacube-server-user.launch
server/-configuration/scheduledjobs.json
server/-dependencies/jobengine.target
server/-dependencies/libs/db2jcc4.jar
server/-dependencies/libs/db2jcc4.jar.old [new file with mode: 0644]
server/-dependencies/libs/db2jcc_license_cu.jar
server/-dependencies/libs/db2jcc_license_cu.jar.old [new file with mode: 0644]
server/-dependencies/pom.xml
server/-product/mediacube.product
server/hu.user.mediacube.executors.tests/tsmapi-1.1.dll [new file with mode: 0644]
server/user.jobengine.executors/config/config-worker.xml
server/user.jobengine.executors/config/config.xml
server/user.jobengine.executors/config/scheduledjobs.json
server/user.jobengine.executors/jobtemplates/create-lowres-ondemand.xml
server/user.jobengine.executors/jobtemplates/fork-validate-and-archive.xml
server/user.jobengine.executors/jobtemplates/fork-validate-and-restore.xml [new file with mode: 0644]
server/user.jobengine.executors/jobtemplates/generic-archive-checker.xml
server/user.jobengine.executors/jobtemplates/harris-missingmaterial-checker.xml [moved from server/user.jobengine.executors/jobtemplates/nexio-missingmaterial-checker.xml with 81% similarity]
server/user.jobengine.executors/jobtemplates/nexio-archive-checker.xml
server/user.jobengine.executors/jobtemplates/peablebeach-missingmaterial-checker.xml [new file with mode: 0644]
server/user.jobengine.executors/jobtemplates/test-fork-cancelable.xml [moved from server/user.jobengine.executors/jobtemplates/fake-noparams.xml with 56% similarity]
server/user.jobengine.executors/jobtemplates/validate-and-archive.xml
server/user.jobengine.executors/jobtemplates/validate-and-restore.xml [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/CancelableStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/EscortFiles.java
server/user.jobengine.executors/src/user/jobengine/server/steps/FileValidatorStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/ForkByStatusFileStep.java [moved from server/user.jobengine.executors/src/user/jobengine/server/steps/ForkValidateAndArchiveStep.java with 57% similarity]
server/user.jobengine.executors/src/user/jobengine/server/steps/GenericArchiveCheckerStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/HarrisMissingMaterialCheckerStep.java [moved from server/user.jobengine.executors/src/user/jobengine/server/steps/NEXIOMissingMaterialCheckerStep.java with 64% similarity]
server/user.jobengine.executors/src/user/jobengine/server/steps/MetadataPersisterStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/NEXIOArchiveCheckerStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/PBMissingMaterialCheckerStep.java [deleted file]
server/user.jobengine.executors/src/user/jobengine/server/steps/PeableBeachMissingMaterialCheckerStep.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/TestForkCancelableStep.java [moved from server/user.jobengine.executors/src/user/jobengine/server/steps/FakeNoParamsStep.java with 91% similarity]
server/user.jobengine.executors/src/user/jobengine/server/steps/TransferFromTSMStep.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/TransferStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TransferToTSMStep.java [new file with mode: 0644]
server/user.jobengine.osgi.commons/.classpath
server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF
server/user.jobengine.osgi.commons/src/user/commons/DownloadableMedia.java
server/user.jobengine.osgi.commons/src/user/commons/UploadableMedia.java [deleted file]
server/user.jobengine.osgi.commons/src/user/commons/mediatool/MediaInfo.java
server/user.jobengine.osgi.commons/src/user/commons/peablebeach/MarinaAPI.wsdl [new file with mode: 0644]
server/user.jobengine.osgi.commons/src/user/commons/peablebeach/MediaUsageComparator.java [new file with mode: 0644]
server/user.jobengine.osgi.commons/src/user/commons/peablebeach/PBMissingMaterialSrc.java [new file with mode: 0644]
server/user.jobengine.osgi.commons/src/user/commons/peablebeach/include/MarinaTypes.xsd [new file with mode: 0644]
server/user.jobengine.osgi.commons/src/user/commons/remotestore/TSMLister.java
server/user.jobengine.osgi.db/META-INF/MANIFEST.MF
server/user.jobengine.osgi.db/build-db-module.launch [moved from server/user.jobengine.osgi.db/deploy.launch with 100% similarity]
server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java
server/user.jobengine.osgi.db/src/user/jobengine/db/Store.java
server/user.jobengine.osgi.db/src/user/jobengine/search/MediaFinder.java
server/user.jobengine.osgi.server/WEB-INF/web.xml
server/user.jobengine.osgi.server/src/user/jobengine/osgi/server/Activator.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobRuntime.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/CachedListModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/SearchModel.java
server/user.jobengine.osgi.server/test/user/jobengine/server/IT/AMCTests.java
server/user.jobengine.osgi.services/WEB-INF/web.xml
server/user.mediacube.metadata/META-INF/MANIFEST.MF

diff --git a/server/-configuration/AMC/scheduledjobs.json b/server/-configuration/AMC/scheduledjobs.json
new file mode 100644 (file)
index 0000000..35fa1db
--- /dev/null
@@ -0,0 +1,315 @@
+{"joblist":[\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+      "cronexpression": "0/10 * * * * ? *",\r
+      "template": "worker-keepalive.xml",\r
+      "parameters": [ \r
+       {"name": "masterAddress", "value": "localhost", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+      "template": "cancelable.xml"\r
+       },      \r
+       {\r
+      "template": "submit-child.xml"\r
+       },      \r
+       {\r
+         "name" : "Proxy pótlása",\r
+      "template": "create-lowres-ondemand.xml",\r
+      "parameters": [ \r
+       {"name": "globalRetrievePath", "value": "file://isilon.intra.echotv.hu", "type": "java.lang.String"},\r
+       {"name": "localRetrievePath", "value": "/mnt/ISILON", "type": "java.lang.String"},\r
+       {"name": "localHiresPath", "value": "/mediacube/data/lowres/", "type": "java.lang.String" },\r
+       {"name": "globalHiresPath", "value": "L:\\", "type": "java.lang.String" },\r
+       {"name": "localLowresPath", "value": "/mnt/FIXTRANSCODER/OUTPUT", "type": "java.lang.String" },\r
+       {"name": "transcoderAddress", "value": "http://10.10.1.74:65445/api/json/v1/", "type": "java.lang.String"},\r
+       {"name": "transcoderTemplateName", "value": "MAM_proxy", "type": "java.lang.String"},\r
+       {"name": "webPath", "value": "/mediacube/data/lowres/www/video/", "type": "java.lang.String" }\r
+      ]\r
+       },      \r
+       {\r
+         "name" : "sys: Migrate HSM",\r
+      "template": "migrate-hsm.xml",\r
+      "parameters": [ \r
+       {"name": "sourceLocation", "value": "//10.11.1.89", "type": "java.lang.String"},\r
+       {"name": "targetLocation", "value": "c:/_video", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "SYS: recreate-lowres",\r
+      "template": "sys-recreate-lowres.xml",\r
+      "parameters": [ \r
+       {"name": "localHiresPath", "value": "", "type": "java.lang.String" },\r
+       {"name": "globalRetrievePath", "value": "", "type": "java.lang.String" }\r
+      ]\r
+       },\r
+       {\r
+         "name" : "SYS: batch-retrieve-ondemand",\r
+      "template": "batch-retrieve-ondemand.xml"\r
+       },\r
+       {\r
+         "name" : "SYS: retrieve-ondemand",\r
+      "template": "retrieve-ondemand.xml",\r
+      "parameters": [ \r
+       {"name": "globalRetrievePath", "value": "c:\\temp", "type": "java.lang.String"},\r
+       {"name": "localRetrievePath", "value": "c:\\temp", "type": "java.lang.String"},\r
+       {"name": "materialOutputFolder", "value": "PLAYOUT_NLE", "type": "java.lang.String"},\r
+       {"name": "promoOutputFolder", "value": "PROMO_NLE", "type": "java.lang.String"},\r
+       {"name": "advertisementOutputFolder", "value": "REKLAM_NLE", "type": "java.lang.String"},\r
+       {"name": "octopusOutputFolder", "value": "OCTOPUS", "type": "java.lang.String"},\r
+       {"name": "genericOutputFolder", "value": "ARCHIVE_RESTORE", "type": "java.lang.String"},\r
+       {"name": "onlineOutputFolder", "value": "ONLINE", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "value": 7, "type": "java.lang.Integer"},\r
+       {"name": "nexioAgency", "value": "ARCHIVE_RESTORE", "type": "java.lang.String"},\r
+       {"name": "nexioPort", "value": 2098, "type": "java.lang.Integer"},\r
+       {"name": "nexioUserName", "value": "administrator", "type": "java.lang.String"},\r
+       {"name": "nexioPassword", "value": "system", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Multiparam",\r
+      "template": "test-multiparam.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "p1", "value": 1, "type": "java.lang.Long"},\r
+       {"name": "p2", "value": "x", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Visszarögzített anyagok utólagos archiválása",\r
+      "template": "archive-recording.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "\\\\10.10.254.74\\temp_isilon\\NEXIO", "type": "java.lang.String"},\r
+       {"name": "targetPath", "value": "\\\\10.10.1.74\\MAM-Proxy_input", "type": "java.lang.String"},\r
+       {"name": "nexioPort", "value": 2098, "type": "java.lang.Integer"},\r
+       {"name": "nexioUserName", "value": "administrator", "type": "java.lang.String"},\r
+       {"name": "nexioPassword", "value": "system", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Híranyag statisztika importálása",\r
+      "template": "import-statistics.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "daysBeforeNow", "value": 7, "type": "java.lang.Integer"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "MORPHEUS 'missing materials' importálása",\r
+      "template": "sys-import-morpheus-missing-materials.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "csvFilePath", "value": "c:\\temp\\__", "type": "java.lang.String"},\r
+       {"name": "processedFolder", "value": "DONE", "type": "java.lang.String"},\r
+       {"name": "targetPath", "value": "/mnt/ISILON/ARCHIVE_RESTORE", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Archiválás az ISILON/ARCHIVE mappából",\r
+      "template": "archive-ondemand.xml",\r
+      "cronexpression": "0 0 23 * * ?",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mnt/ISILON/ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "globalSourcePath", "value": "\\\\10.10.1.100\\BRAAVOS\\ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "transcoderTargetPath", "value": "/mnt/SELENIO", "type": "java.lang.String"},\r
+       {"name": "webPath", "value": "/mediacube/data/lowres/www/video", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "value": 1, "type": "java.lang.Integer"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Egy archiválás",\r
+      "template": "archive-ondemand.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mnt/ISILON/ARCHIVE/ONE", "type": "java.lang.String"},\r
+       {"name": "globalSourcePath", "value": "\\\\10.10.1.100\\BRAAVOS\\ARCHIVE\\ONE", "type": "java.lang.String"},\r
+       {"name": "transcoderTargetPath", "value": "/mnt/SELENIO", "type": "java.lang.String"},\r
+       {"name": "webPath", "value": "/mediacube/data/lowres/www/video", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "value": 1, "type": "java.lang.Integer"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "NEXIO bejátszók másolása az ISILON/ARCHIVE mappába",\r
+      "template": "copyforarchive-nexio-materials.xml",\r
+      "cronexpression": "0 0 10 * * ?",\r
+      "parameters": [ \r
+       {"name": "nexioPort", "value": 2098, "type": "java.lang.Integer"},\r
+       {"name": "nexioUserName", "value": "administrator", "type": "java.lang.String"},\r
+       {"name": "nexioPassword", "value": "system", "type": "java.lang.String"},\r
+       {"name": "archiveFtp", "value": "ftp://10.10.1.100/ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "archiveUserName", "value": "mediacube", "type": "java.lang.String"},\r
+       {"name": "archivePassword", "value": "Broadca5T", "type": "java.lang.String"},\r
+       {"name": "daysBeforeNow", "value": 1, "type": "java.lang.Integer"},\r
+       {"name": "nexioKillDateDays", "value": 7, "type": "java.lang.Integer"},\r
+       {"name": "nexioAgency", "value": "ARCHIVED", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "NEXIO visszarögzített anyagok másolása az ISILON/ARCHIVE mappába",\r
+      "template": "copyforarchive-nexio-recordings.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "nexioPort", "value": 2098, "type": "java.lang.Integer"},\r
+       {"name": "nexioUserName", "value": "administrator", "type": "java.lang.String"},\r
+       {"name": "nexioPassword", "value": "system", "type": "java.lang.String"},\r
+       {"name": "archiveFtp", "value": "ftp://10.10.1.100/ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "archiveUserName", "value": "mediacube", "type": "java.lang.String"},\r
+       {"name": "archivePassword", "value": "Broadca5T", "type": "java.lang.String"},\r
+       {"name": "filterAgencies", "value": "schedule-rec", "type": "java.lang.String"},\r
+       {"name": "limit", "value": 10, "type": "java.lang.Integer"},\r
+       {"name": "nexioKillDateDays", "value": 7, "type": "java.lang.Integer"},\r
+       {"name": "nexioAgency", "value": "ARCHIVED", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Lejárt NEXIO anyagok törlése",\r
+      "template": "delete-nexio-materials.xml",\r
+      "cronexpression": "0 0 10 * * ?",\r
+      "parameters": [ \r
+       {"name": "port", "value": 2098, "type": "java.lang.Integer"},\r
+       {"name": "userName", "value": "administrator", "type": "java.lang.String"},\r
+       {"name": "password", "value": "system", "type": "java.lang.String"},\r
+       {"name": "filterAgencies", "value": "ARCHIVED", "type": "java.lang.String"},\r
+       {"name": "gracePeriodDays", "value": 1, "type": "java.lang.Integer"},\r
+       {"name": "notificationOnly", "value": true, "type": "java.lang.Boolean"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "TRAFFIC anyagok visszatöltése",\r
+      "template": "retrieve-traffic-missing-materials.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [\r
+       {"name": "dbUrl", "value": "jdbc:sqlserver://10.10.1.45\\sql16;databaseName=PA_Echo;", "type": "java.lang.String"},\r
+       {"name": "userName", "value": "MAM", "type": "java.lang.String"},\r
+       {"name": "password", "value": "Echotv.hu", "type": "java.lang.String"},\r
+       {"name": "lookupDays", "value": 7, "type": "java.lang.Integer"},\r
+       {"name": "targetPath", "value": "/mnt/ISILON/PLAYOUT/IceGateway/Input", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "value": 10, "type": "java.lang.Integer"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "MORPHEUS anyagok visszatöltése",\r
+      "template": "retrieve-morpheus-missing-materials.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [\r
+       {"name": "sourcePath", "value": "/mnt/MORPHEUS", "type": "java.lang.String"},\r
+       {"name": "targetPath", "value": "/mnt/ISILON/PLAYOUT/IceGateway/Input", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "value": 10, "type": "java.lang.Integer"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Lejárt ISISLON/ARCHIVE anyagok törlése",\r
+      "template": "delete-materials.xml",\r
+      "cronexpression": "0 0 5 * * ?",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mnt/ISILON/ARCHIVE", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "OCTOPUS adatok szinkronizálása",\r
+      "template": "sync-octopus.xml",\r
+      "cronexpression": "0/20 * * * * ?",\r
+      "parameters": [\r
+       {"name": "includeArchived", "value": false, "type": "java.lang.Boolean"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "OCTOPUS adatok szinkronizálása archivált tükrökkel együtt",\r
+      "template": "sync-octopus.xml",\r
+      "cronexpression": "0/30 * * * * ?",\r
+      "parameters": [\r
+       {"name": "includeArchived", "value": true, "type": "java.lang.Boolean"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Párhuzamosított teszt folyamat",\r
+      "template": "fake-concurrent.xml",\r
+      "cronexpression": "0/10 * * ? * *",\r
+      "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Teszt folyamat (nincs paraméter)",\r
+      "template": "fake-noparams.xml",\r
+      "cronexpression": "0 40 22 * * ?",\r
+      "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Teszt folyamat",\r
+      "template": "fake.xml",\r
+      "cronexpression": "0/20 * * * * ?",\r
+      "parameters": [ \r
+       {"name": "itemID", "value": 1, "type": "java.lang.Long"},\r
+       {"name": "iter", "value": ["a", "b", "c"], "type": "java.lang.Iterable"}\r
+       ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "",\r
+      "cronexpression": "",\r
+      "template": "retrieve-ondemand.xml",\r
+      "parameters": [ \r
+       {"name": "trafficOutputPath", "value": "/mnt/ISILON/PLAYOUT_NLE", "type": "java.lang.String"}, \r
+       {"name": "octopusOutputPath", "value": "/mnt/ISILON/OCTOPUS", "type": "java.lang.String"}, \r
+       {"name": "genericOutputPath", "value": "/mnt/ISILON/ARCHIVE_RESTORE", "type": "java.lang.String"},\r
+       {"name": "basket", "type": "java.lang.ArrayList"},\r
+       {"name": "houseId", "type": "java.lang.String"},\r
+       {"name": "successRecipient", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "type": "java.lang.Integer"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Common file copy",\r
+      "template": "common-copy.xml",\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "10.10.1.100/ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "targetPath", "value": "10.10.1.100/TEMP", "type": "java.lang.String"},\r
+       {"name": "sourceFileName", "value": "akarmi.mp4", "type": "java.lang.String"},\r
+       {"name": "targetFileName", "value": "barmi.mp4", "type": "java.lang.String"},\r
+       {"name": "sourceProtocol", "value": "http://", "type": "java.lang.String"},\r
+       {"name": "targetProtocol", "value": "http://", "type": "java.lang.String"},\r
+      ]\r
+       }\r
+]}\r
+\r
index dd800b0ad3a0bb4fa386b2ec0970f5bcdc41419a..a076d04d21ccdf3894b14c821fb41996959dab75 100644 (file)
@@ -7,10 +7,25 @@
                        </Filters>\r
                        <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %msg (%F:%L) %n" />\r
                </Console>\r
+               <Console name="MarkeredConsole" target="SYSTEM_ERR">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %marker - %msg (%F:%L) %n" />\r
+               </Console>\r
+               <HTMLMailAppender name="MarkeredMail" subject="[localhost] MediaCube rendszerüzenet" to="shray.tarum@gmail.com" from="mediacubeserver@gmail.com" smtpHost="smtp.gmail.com"\r
+                       smtpPort="465" smtpProtocol="smtps" smtpUsername="mediacubeserver@gmail.com" smtpPassword="salabakter" ignoreExceptions="false" bufferSize="1">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss} %level - %msg %n" />\r
+               </HTMLMailAppender>\r
        </Appenders>\r
        <Loggers>\r
                <Root level="INFO">\r
                        <AppenderRef ref="Console" />\r
+                       <AppenderRef ref="MarkeredConsole" />\r
+                       <AppenderRef ref="MarkeredMail" />\r
                </Root>\r
        </Loggers>\r
 </Configuration>
\ No newline at end of file
index 7cf76446026eb909a0aee7eaf77268f3d19ccf30..835b327ea165ee7c6278767cdfd737c4616b4968 100644 (file)
@@ -22,7 +22,7 @@
 <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/bin&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.jobsteps.config=&quot;${workspace_loc}/user.jobengine.executors/config/config.xml&quot;&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;&#13;&#10;-Djobengine.nexio.db.user=sa&#13;&#10;-Djobengine.nexio.db.password=resolve&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Djobengine.nexio.name=testnexioclips&#13;&#10;-Dnexio.useMOSGateway=true&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders&#13;&#10;-Djobengine.octopus.stories.name=stories&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;&#13;&#10;-Djobengine.mediacube.config=&quot;${workspace_loc}/-configuration/mediacube.json&quot;&#13;&#10;-Djobengine.mediacube.service.proxyroot=&quot;/opt&quot;&#13;&#10;-Djobengine.randomize.archives=false"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
 <booleanAttribute key="show_selected_only" value="false"/>\r
-<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs-api@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
+<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.ibm.db2.jcc@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,groovy@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs-api@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
 <booleanAttribute key="tracing" value="false"/>\r
 <booleanAttribute key="useCustomFeatures" value="false"/>\r
 <booleanAttribute key="useDefaultConfigArea" value="true"/>\r
index 4b613aeae02c495f037add3a4b605b2dcb207156..f7f6d9f0178736a45ca517d6187a960767482c6b 100644 (file)
 <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.11.1.90:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.11.1.90:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.transcoder.address=http://10.11.1.111:65445/api/json/v1/&#13;&#10;-Djobengine.transcoder.template=MP4&#13;&#10;-Djobengine.transcoder.version=1&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;&#13;&#10;-Djobengine.nexio.db.user=sa&#13;&#10;-Djobengine.nexio.db.password=resolve&#13;&#10;-Djobengine.planair.db.url=jdbc:sqlserver://10.11.254.86;databaseName=PA_Vivantis;&#13;&#10;-Djobengine.planair.db.user=MAM&#13;&#10;-Djobengine.planair.db.password=VDani&#13;&#10;-Dnexio.host=192.168.0.12&#13;&#10;-Djobengine.nexio.name=testnexioclips&#13;&#10;-Dnexio.useMOSGateway=false&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns181026&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders181026&#13;&#10;-Djobengine.octopus.stories.name=stories181026&#13;&#10;-Djobengine.maestro.config=&quot;${workspace_loc}/-configuration/maestro.json&quot;&#13;&#10;-Djobengine.mediacube.config=&quot;${workspace_loc}/-configuration/mediacube.json&quot;&#13;&#10;-Dgui.statistics.disable=true&#13;&#10;-Dgui.help.disable=true&#13;&#10;-Dgui.editor.disable=true&#13;&#10;-Djobengine.mediafinder.external=false&#13;&#10;-Djobengine.mediacube.service.proxyroot=&quot;/opt&quot;&#13;&#10;-Djobengine.randomize.archives=true"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/bin&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.11.1.90:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.11.1.90:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.transcoder.address=http://10.11.1.111:65445/api/json/v1/&#13;&#10;-Djobengine.transcoder.template=MP4&#13;&#10;-Djobengine.transcoder.version=1&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;&#13;&#10;-Djobengine.nexio.db.user=sa&#13;&#10;-Djobengine.nexio.db.password=resolve&#13;&#10;-Djobengine.planair.db.url=jdbc:sqlserver://10.11.254.86;databaseName=PA_Vivantis;&#13;&#10;-Djobengine.planair.db.user=MAM&#13;&#10;-Djobengine.planair.db.password=VDani&#13;&#10;-Dnexio.host=192.168.0.12&#13;&#10;-Djobengine.nexio.name=testnexioclips&#13;&#10;-Dnexio.useMOSGateway=false&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns181026&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders181026&#13;&#10;-Djobengine.octopus.stories.name=stories181026&#13;&#10;-Djobengine.maestro.config=&quot;${workspace_loc}/-configuration/maestro.json&quot;&#13;&#10;-Djobengine.mediacube.config=&quot;${workspace_loc}/-configuration/mediacube.json&quot;&#13;&#10;-Dgui.statistics.disable=true&#13;&#10;-Dgui.help.disable=true&#13;&#10;-Dgui.editor.disable=true&#13;&#10;-Djobengine.mediafinder.external=false&#13;&#10;-Djobengine.mediacube.service.proxyroot=&quot;/opt&quot;&#13;&#10;-Djobengine.randomize.archives=true&#13;&#10;-Djobengine.jobsteps.config=&quot;${workspace_loc}/user.jobengine.executors/config/config.xml&quot;"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
 <booleanAttribute key="show_selected_only" value="false"/>\r
-<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs-api@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
+<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.ibm.db2.jcc@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,groovy@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs-api@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
 <booleanAttribute key="tracing" value="false"/>\r
 <booleanAttribute key="useCustomFeatures" value="false"/>\r
 <booleanAttribute key="useDefaultConfigArea" value="true"/>\r
index 6168aa1953488a2cbcc84ca72258560924d0b59a..2d084b11adce65d8ddbc0784e3c488ad03c79662 100644 (file)
@@ -22,7 +22,7 @@
 <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/bin&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.transcoder.address=http://10.11.1.111:65445/api/json/v1/&#13;&#10;-Djobengine.transcoder.template=MP4&#13;&#10;-Djobengine.transcoder.version=1&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;&#13;&#10;-Djobengine.nexio.db.user=sa&#13;&#10;-Djobengine.nexio.db.password=resolve&#13;&#10;-Djobengine.planair.db.url=jdbc:sqlserver://10.11.254.86;databaseName=PA_Vivantis;&#13;&#10;-Djobengine.planair.db.user=MAM&#13;&#10;-Djobengine.planair.db.password=VDani&#13;&#10;-Dnexio.host=192.168.0.12&#13;&#10;-Djobengine.nexio.name=testnexioclips&#13;&#10;-Dnexio.useMOSGateway=false&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns181026&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders181026&#13;&#10;-Djobengine.octopus.stories.name=stories181026&#13;&#10;-Djobengine.maestro.config=&quot;${workspace_loc}/-configuration/maestro.json&quot;&#13;&#10;-Djobengine.mediacube.config=&quot;${workspace_loc}/-configuration/mediacube.json&quot;&#13;&#10;-Dgui.statistics.disable=true&#13;&#10;-Dgui.help.disable=true&#13;&#10;-Dgui.editor.disable=true&#13;&#10;-Djobengine.mediafinder.external=false&#13;&#10;-Djobengine.mediacube.service.proxyroot=&quot;/opt&quot;&#13;&#10;-Djobengine.scheduledexecution.disabled=false&#13;&#10;-Djobengine.randomize.archives=false&#13;&#10;-Djobengine.jobsteps.config=&quot;${workspace_loc}/user.jobengine.executors/config/config.xml&quot;&#13;&#10;-Djobengine.jobsteps.groovy.root=&quot;${workspace_loc}/user.jobengine.executors/src/user/jobengine/server/steps&quot;"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
 <booleanAttribute key="show_selected_only" value="false"/>\r
-<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,groovy@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
+<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.ibm.db2.jcc@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,groovy@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
 <booleanAttribute key="tracing" value="false"/>\r
 <booleanAttribute key="useCustomFeatures" value="false"/>\r
 <booleanAttribute key="useDefaultConfigArea" value="true"/>\r
index 35fa1db5d19e034afaf31bcb7ac8ef2b201bca7e..948c87783e8bc9f9c22886917d86c850286873a5 100644 (file)
@@ -1,5 +1,18 @@
 {"joblist":[\r
        {\r
+      "template": "harris-missingmaterial-checker.xml",\r
+      "parameters": [ \r
+       {"name": "vicFiles", "value": ["/opt/PASA-DB/VIC/EDIT 10.VIC"], "type": "java.lang.Iterable"}, \r
+       {"name": "escortStoreName", "value": "LOCAL", "type": "java.lang.String"}, \r
+       {"name": "targetStoreName", "value": "LOCAL", "type": "java.lang.String"}, \r
+       {"name": "targetProtocol", "value": "FTP", "type": "java.lang.String"} \r
+      ]\r
+       },\r
+       {\r
+      "template": "test-fork-cancelable.xml",\r
+      "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
+       },\r
+       {\r
       "active": false,\r
       "executeimmediate": false,\r
       "cronexpression": "0/10 * * * * ? *",\r
index a8e09167efdb430b17db0b6f125ad1aea2e67ea4..78bd12662653d64502d91218da9fb3970955760c 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<?pde version="3.8"?><target name="JobEngine" sequenceNumber="309">\r
+<?pde version="3.8"?><target name="JobEngine" sequenceNumber="313">\r
 <locations>\r
 <location path="${eclipse_home}" type="Profile"/>\r
 <location path="${workspace_loc}/-dependencies/target/repository/plugins" type="Directory"/>\r
@@ -13,7 +13,7 @@
 <plugin id="com.fasterxml.jackson.jaxrs.jackson-jaxrs-base" version="2.4.5"/>\r
 <plugin id="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" version="2.4.5"/>\r
 <plugin id="com.fasterxml.jackson.module.jackson-module-jaxb-annotations" version="2.4.5"/>\r
-<plugin id="com.ibm.db2jcc4"/>\r
+<plugin id="com.ibm.db2.jcc"/>\r
 <plugin id="com.ibm.nosql"/>\r
 <plugin id="com.microsoft.sqlserver.sqljdbc"/>\r
 <plugin id="commons-logging"/>\r
index ab7516fa0d730f065680c381f4b8037f7093b242..2bffab14637b48b262cdf6abbd11a94829d822f0 100644 (file)
Binary files a/server/-dependencies/libs/db2jcc4.jar and b/server/-dependencies/libs/db2jcc4.jar differ
diff --git a/server/-dependencies/libs/db2jcc4.jar.old b/server/-dependencies/libs/db2jcc4.jar.old
new file mode 100644 (file)
index 0000000..ab7516f
Binary files /dev/null and b/server/-dependencies/libs/db2jcc4.jar.old differ
index aae778fce53396583822f92ff3d785e11d3b9dbb..3156fa046d5951a9259abda01b583f9759317e42 100644 (file)
Binary files a/server/-dependencies/libs/db2jcc_license_cu.jar and b/server/-dependencies/libs/db2jcc_license_cu.jar differ
diff --git a/server/-dependencies/libs/db2jcc_license_cu.jar.old b/server/-dependencies/libs/db2jcc_license_cu.jar.old
new file mode 100644 (file)
index 0000000..aae778f
Binary files /dev/null and b/server/-dependencies/libs/db2jcc_license_cu.jar.old differ
index 0cc4847faf9d0d6f42fe5a878dfc584e0ea1ae70..971c11c91ba73aac3ab13d95fb83b19f060d6b5c 100644 (file)
@@ -36,7 +36,7 @@
                                                        <file>libs/db2jcc4.jar</file>\r
                                                        <groupId>com.ibm</groupId>\r
                                                        <artifactId>db2jcc4</artifactId>\r
-                                                       <version>4.19.26</version>\r
+                                                       <version>4.26.14</version>\r
                                                        <packaging>jar</packaging>\r
                                                </configuration>\r
                                        </execution>\r
                                                                        <id>com.ibm:nosql:4.19.26</id>\r
                                                                </artifact>\r
                                                                <artifact>\r
-                                                                       <id>com.ibm:db2jcc4:4.19.26</id>\r
+                                                                       <id>com.ibm:db2jcc4:4.26.14</id>\r
                                                                </artifact>\r
                                                                <artifact>\r
                                                                        <id>org.slf4j:slf4j-simple:1.6.3</id>\r
index c6a83a88ef14710f6995e888350f83d9f31433b6..6abffb7ba938e6ce796db2016244cf628707756c 100644 (file)
       <plugin id="com.fasterxml.jackson.jaxrs.jackson-jaxrs-base" version="2.4.5"/>\r
       <plugin id="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" version="2.4.5"/>\r
       <plugin id="com.fasterxml.jackson.module.jackson-module-jaxb-annotations"/>\r
-      <plugin id="com.ibm.db2jcc4"/>\r
+      <plugin id="com.ibm.db2.jcc"/>\r
       <plugin id="com.ibm.nosql"/>\r
       <plugin id="com.microsoft.sqlserver.sqljdbc"/>\r
       <plugin id="commons-logging"/>\r
diff --git a/server/hu.user.mediacube.executors.tests/tsmapi-1.1.dll b/server/hu.user.mediacube.executors.tests/tsmapi-1.1.dll
new file mode 100644 (file)
index 0000000..b92868b
Binary files /dev/null and b/server/hu.user.mediacube.executors.tests/tsmapi-1.1.dll differ
index 8dcc0d3a5e98797882fdca1839737dfb0fbc5bfd..97f24d8790aad70a2879358a0a8fc1a0145233b3 100644 (file)
@@ -3,12 +3,14 @@
        <executor className="CancelableStep.java" maxConcurrent="1" isRemote="true" />\r
        <executor className="FakeStep.java" maxConcurrent="1" />\r
        <executor className="NEXIOArchiveCheckerStep.java" maxConcurrent="1" />\r
-       <executor className="ForkValidateAndArchiveStep.java" maxConcurrent="1" />\r
+       <executor className="ForkByStatusFileStep.java" maxConcurrent="1" />\r
        <executor className="TransferStep.java" maxConcurrent="1" />\r
+       <executor className="TransferToTSMStep.java" maxConcurrent="1" />\r
+       <executor className="TransferFromTSMStep.java" maxConcurrent="1" />\r
        <executor className="FileValidatorStep.java" maxConcurrent="1" />\r
        <executor className="MetadataPersisterStep.java" maxConcurrent="1" />\r
        <executor className="FileCleanupStep.java" maxConcurrent="1" />\r
        <executor className="GenericArchiveCheckerStep.java" maxConcurrent="1" />\r
-       <executor className="NEXIOMissingMaterialCheckerStep.java" maxConcurrent="1" />\r
+       <executor className="HarrisMissingMaterialCheckerStep.java" maxConcurrent="1" />\r
        \r
 </executors>
\ No newline at end of file
index e0183cdef2511311d04a51fe9b23337779fd9526..6f70a96dbf9e519dcaced08787fce7cba980df5b 100644 (file)
@@ -1,8 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <executors>\r
+\r
+       <executor className="HarrisMissingMaterialCheckerStep.java" maxConcurrent="1" isRemote="false" />\r
        <executor className="CancelableStep.java" maxConcurrent="20" isRemote="false" />\r
        <executor className="FakeStep.java" maxConcurrent="20" isRemote="false" />\r
        <executor className="MergeStep.java" maxConcurrent="20" isRemote="false" />\r
+       <executor className="TestForkCancelableStep.java" maxConcurrent="1" isRemote="false" />\r
        <executor className="user.jobengine.server.steps.ArchiveListBuilderStep" maxConcurrent="1" isRemote="false" />\r
        <executor className="user.jobengine.server.steps.ArchiveMaterialSubmitStep" maxConcurrent="1" isRemote="false" />\r
        <executor className="user.jobengine.server.steps.BatchRetrieveForkStep" maxConcurrent="10" isRemote="false" />\r
@@ -20,7 +23,6 @@
        <executor className="user.jobengine.server.steps.DeleteFileStep" maxConcurrent="100" isRemote="false" />\r
        <executor className="user.jobengine.server.steps.DownloadRecordingFromNexioStep" maxConcurrent="1" isRemote="false" />\r
        <executor className="user.jobengine.server.steps.DuplicateRemoverStep" maxConcurrent="1" isRemote="false" />\r
-       <executor className="user.jobengine.server.steps.FakeNoParamsStep" maxConcurrent="20" isRemote="false" />\r
        <executor className="user.jobengine.server.steps.FakeStep" maxConcurrent="20" isRemote="false" />\r
        <executor className="user.jobengine.server.steps.FileCopyStep" maxConcurrent="10" isRemote="false" />\r
        <executor className="user.jobengine.server.steps.GenerateMorpheusMetadataStep" maxConcurrent="10" isRemote="false" />\r
index 412824966b1775bed07463d2b8ee3103f2578018..040a1579a9ec233f4992650510c8b4027dd65e73 100644 (file)
@@ -1,4 +1,8 @@
 {"joblist":[\r
+       {\r
+      "template": "test-fork-cancelable.xml",\r
+      "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
+       },\r
        {\r
          "name" : "Proxy pótlása",\r
       "template": "create-lowres-ondemand.xml",\r
          "name" : "Teszt folyamat",\r
       "template": "fake.xml",\r
       "cronexpression": "0/10 * * ? * *",\r
-      "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
-       },\r
-       {\r
-      "active": false,\r
-      "executeimmediate": false,\r
-         "name" : "Teszt fork-párhuzamosított folyamat",\r
-      "template": "fake-noparams.xml",\r
-      "cronexpression": "0 40 22 * * ?",\r
       "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
        },\r
        {\r
index c00193cc7784481030d9f8d00e712b31fd53a285..5dbdeb86f5ebe0c0fabffdbf4eef390ac899f395 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate name="Hiányzó PROXY videók pótlása">\r
+<jobtemplate>\r
        <declarations>\r
                <parameters>\r
                        <parameter name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
index a612bf78cfcb6dab47210e8f4a318f248bf80096..d4461a872d374378c42089e5d0b3a6200fad4cc2 100644 (file)
@@ -2,20 +2,32 @@
 <jobtemplate>\r
        <declarations>\r
                <parameters>\r
-                       <parameter name="storeName" type="java.lang.String" />\r
+                       <parameter name="sourceStoreName" type="java.lang.String" />\r
+                       <parameter name="targetStoreName" type="java.lang.String" />\r
+                       <parameter name="targetProtocol" type="java.lang.String"/>\r
                        <parameter name="template" type="java.lang.String"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
                        <parameter name="limit" type="java.lang.Integer" />\r
                </parameters>\r
        </declarations>\r
        <commands>\r
-               <calljobstep type="ForkValidateAndArchiveStep.java" weight="1">\r
+               <calljobstep type="ForkByStatusFileStep.java" weight="1">\r
                        <inputs>\r
                                <input>\r
-                                       <parameter name="storeName" />\r
+                                       <parameter name="sourceStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetProtocol" />\r
                                </input>\r
                                <input>\r
                                        <parameter name="template" />\r
                                </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace"/>\r
+                               </input>\r
                                <input>\r
                                        <parameter name="limit" />\r
                                </input>\r
diff --git a/server/user.jobengine.executors/jobtemplates/fork-validate-and-restore.xml b/server/user.jobengine.executors/jobtemplates/fork-validate-and-restore.xml
new file mode 100644 (file)
index 0000000..63d2cb2
--- /dev/null
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreName" type="java.lang.String" />\r
+                       <parameter name="targetStoreName" type="java.lang.String" />\r
+                       <parameter name="targetProtocol" type="java.lang.String"/>\r
+                       <parameter name="template" type="java.lang.String"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="ForkByStatusFileStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetProtocol" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="template" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
index 1252a67b7359bd697820dd07c8fef196d995f69e..c321bee579a19c268e6b87923a82ebf45bf3cbf7 100644 (file)
@@ -3,10 +3,10 @@
 <jobtemplate multiInstance="true">\r
 <declarations>\r
        <parameters>\r
-               <parameter name="storeName" type="java.lang.String"/>\r
+               <parameter name="sourceStoreName" type="java.lang.String"/>\r
                <parameter name="protocol" type="java.lang.String"/>\r
                <parameter name="wildCard" type="java.lang.String"/>\r
-               <parameter name="outputPath" type="java.lang.String"/>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
                <parameter name="limit" type="java.lang.Integer"/>\r
        </parameters>\r
 </declarations>\r
@@ -14,7 +14,7 @@
        <calljobstep type="GenericArchiveCheckerStep.java" weight="1">\r
                <inputs>\r
                        <input>\r
-                               <parameter name="storeName" />\r
+                               <parameter name="sourceStoreName" />\r
                        </input>\r
                        <input>\r
                                <parameter name="protocol" />\r
@@ -23,7 +23,7 @@
                                <parameter name="wildCard" />\r
                        </input>\r
                        <input>\r
-                               <parameter name="outputPath" />\r
+                               <parameter name="escortStoreName" />\r
                        </input>\r
                        <input>\r
                                <parameter name="limit" />\r
similarity index 81%
rename from server/user.jobengine.executors/jobtemplates/nexio-missingmaterial-checker.xml
rename to server/user.jobengine.executors/jobtemplates/harris-missingmaterial-checker.xml
index 19cddfec9a285c336a5c0487c250da294e7be443..060ecc31d2165ea69fa67142a55ace6b5c634212 100644 (file)
@@ -3,14 +3,14 @@
 <jobtemplate multiInstance="true">\r
 <declarations>\r
        <parameters>\r
-               <parameter name="vicFiles" type="java.lang.Iterable"/>\r
+               <parameter name="vicFiles" type="com.ibm.nosql.json.api.BasicDBList"/>\r
                <parameter name="escortStoreName" type="java.lang.String"/>\r
                <parameter name="targetStoreName" type="java.lang.String"/>\r
                <parameter name="targetProtocol" type="java.lang.String"/>\r
        </parameters>\r
 </declarations>\r
 <commands>\r
-       <calljobstep type="NEXIOMissingMaterialCheckerStep.java" weight="1">\r
+       <calljobstep type="HarrisMissingMaterialCheckerStep.java" weight="1">\r
                <inputs>\r
                        <input>\r
                                <parameter name="vicFiles" />\r
index 6d9240b2a2bca3d4172fcf9053c98d37a3c003d6..063c4be1c2d7e2374813143c5b5986c22accc1ce 100644 (file)
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<!-- A NEXIO servert vegigolvasva, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt.  -->\r
+<!-- A NEXIO server-t lekerdezve, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt.  -->\r
 <jobtemplate multiInstance="true">\r
 <declarations>\r
        <parameters>\r
-               <parameter name="storeName" type="java.lang.String"/>\r
-               <parameter name="outputPath" type="java.lang.String"/>\r
+               <parameter name="sourceStoreName" type="java.lang.String"/>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="lastModifiedHours" type="java.lang.Integer"/>\r
                <parameter name="limit" type="java.lang.Integer"/>\r
        </parameters>\r
 </declarations>\r
        <calljobstep type="NEXIOArchiveCheckerStep.java" weight="1">\r
                <inputs>\r
                        <input>\r
-                               <parameter name="storeName" />\r
+                               <parameter name="sourceStoreName" />\r
                        </input>\r
                        <input>\r
-                               <parameter name="outputPath" />\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="lastModifiedHours" />\r
                        </input>\r
                        <input>\r
                                <parameter name="limit" />\r
diff --git a/server/user.jobengine.executors/jobtemplates/peablebeach-missingmaterial-checker.xml b/server/user.jobengine.executors/jobtemplates/peablebeach-missingmaterial-checker.xml
new file mode 100644 (file)
index 0000000..f1fae0b
--- /dev/null
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!-- A PB API hivasok alapjan a hianyzo media fajlok nevebol kepez statusz fajlokat.  -->\r
+<jobtemplate>\r
+<declarations>\r
+       <parameters>\r
+               <parameter name="escortStoreName" type="java.lang.String"/>\r
+               <parameter name="targetStoreName" type="java.lang.String"/>\r
+               <parameter name="targetProtocol" type="java.lang.String"/>\r
+               <parameter name="primaryEndPoint" type="java.lang.String"/>\r
+               <parameter name="primaryUserName" type="java.lang.String"/>\r
+               <parameter name="primaryPassword" type="java.lang.String"/>\r
+               <parameter name="secondaryEndPoint" type="java.lang.String"/>\r
+               <parameter name="secondaryUserName" type="java.lang.String"/>\r
+               <parameter name="secondaryPassword" type="java.lang.String"/>\r
+               <parameter name="rangeForwardHours" type="java.lang.Integer"/>\r
+       </parameters>\r
+</declarations>\r
+<commands>\r
+       <calljobstep type="PeableBeachMissingMaterialCheckerStep.java" weight="1">\r
+               <inputs>\r
+                       <input>\r
+                               <parameter name="escortStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="targetStoreName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="targetProtocol" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="primaryEndPoint" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="primaryUserName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="primaryPassword" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="secondaryEndPoint" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="secondaryUserName" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="secondaryPassword" />\r
+                       </input>\r
+                       <input>\r
+                               <parameter name="rangeForwardHours" />\r
+                       </input>\r
+               </inputs>\r
+       </calljobstep>\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
similarity index 56%
rename from server/user.jobengine.executors/jobtemplates/fake-noparams.xml
rename to server/user.jobengine.executors/jobtemplates/test-fork-cancelable.xml
index aaab8a3cc2981e45142771db4f7d0c05743aa9ef..f3d21d6efaf74858850af0d19f75827afc5293d3 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <jobtemplate multiInstance="true">\r
 <commands>\r
-       <calljobstep type="user.jobengine.server.steps.FakeNoParamsStep" weight="1" />\r
+       <calljobstep type="TestForkCancelableStep.java" weight="1" />\r
 </commands>\r
 </jobtemplate>
\ No newline at end of file
index 099aeb1ac385a456c527355b12e95c8d79e6d890..9882f40e16ab1d61ee37df8bba346275c926a432 100644 (file)
@@ -3,11 +3,12 @@
        <declarations>\r
                <parameters>\r
                        <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
-                       <parameter name="sourceFileName" type="java.lang.String"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
                        <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
-                       <parameter name="tsmStoreUri" type="user.commons.StoreUri"/>\r
-                       <parameter name="tsmFileName" type="java.lang.String"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
                        <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
                        <parameter name="escortFile" type="java.lang.String"/>\r
                </parameters>\r
        </declarations>\r
                                        <parameter name="sourceStoreUri" />\r
                                </input>\r
                                <input>\r
-                                       <parameter name="sourceFileName" />\r
+                                       <parameter name="fileName" />\r
                                </input>\r
                                <input>\r
                                        <parameter name="tempStoreUri" />\r
                                </input>\r
                                <input>\r
-                                       <parameter name="sourceFileName" />\r
+                                       <parameter name="fileName" />\r
                                </input>\r
                        </inputs>\r
                </calljobstep>\r
                                        <parameter name="tempStoreUri" />\r
                                </input>\r
                                <input>\r
-                                       <parameter name="sourceFileName" />\r
+                                       <parameter name="fileName" />\r
                                </input>\r
                                <input>\r
                                        <parameter name="expectedFrameNumber" />\r
                                </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
                                <input>\r
                                        <parameter name="escortFile" />\r
                                </input>\r
                        </inputs>\r
                </calljobstep>\r
-               <calljobstep type="TransferStep.java" weight="5">\r
+               <calljobstep type="TransferToTSMStep.java" weight="5">\r
                        <inputs>\r
                                <input>\r
                                        <parameter name="tempStoreUri" />\r
                                </input>\r
                                <input>\r
-                                       <parameter name="sourceFileName" />\r
+                                       <parameter name="fileName" />\r
                                </input>\r
                                <input>\r
-                                       <parameter name="tsmStoreUri" />\r
+                                       <parameter name="targetStoreUri" />\r
                                </input>\r
                                <input>\r
-                                       <parameter name="tsmFileName" />\r
+                                       <parameter name="fileName" />\r
                                </input>\r
                        </inputs>\r
                </calljobstep>\r
                <calljobstep type="MetadataPersisterStep.java" weight="5">\r
                        <inputs>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
                                <input>\r
                                        <parameter name="escortFile" />\r
                                </input>\r
@@ -73,7 +83,7 @@
                                        <parameter name="tempStoreUri" />\r
                                </input>\r
                                <input>\r
-                                       <parameter name="sourceFileName" />\r
+                                       <parameter name="fileName" />\r
                                </input>\r
                                <input>\r
                                        <parameter name="escortFile" />\r
diff --git a/server/user.jobengine.executors/jobtemplates/validate-and-restore.xml b/server/user.jobengine.executors/jobtemplates/validate-and-restore.xml
new file mode 100644 (file)
index 0000000..99e6e04
--- /dev/null
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="fileName" type="java.lang.String"/>\r
+                       <parameter name="tempStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="targetStoreUri" type="user.commons.StoreUri"/>\r
+                       <parameter name="expectedFrameNumber" type="java.lang.Long"/>\r
+                       <parameter name="expectedSize" type="java.lang.Long"/>\r
+                       <parameter name="expectedColorSpace" type="java.lang.String"/>\r
+                       <parameter name="escortFile" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TransferFromTSMStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="FileValidatorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedFrameNumber" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedSize" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="expectedColorSpace" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="TransferStep.java" weight="5">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+<!--           <calljobstep type="MetadataPersisterStep.java" weight="5"> -->\r
+<!--                   <inputs> -->\r
+<!--                           <input> -->\r
+<!--                                   <parameter name="escortFile" /> -->\r
+<!--                           </input> -->\r
+<!--                   </inputs> -->\r
+<!--           </calljobstep> -->\r
+               <calljobstep type="FileCleanupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="tempStoreUri" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="fileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="escortFile" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
index 67abe1424e5f8e47363d2dd54f071d0e212dfd0b..10c9ddd9c5479fc9ae45598703b536b78192a462 100644 (file)
@@ -29,11 +29,14 @@ public class CancelableStep extends JobStep {
                        for (int i = 0; i < count; i++) {\r
                                if (getJobRuntime().isWaitingCancel())\r
                                        break;\r
-                               Thread.sleep(100);\r
+                               Thread.sleep(1000);\r
                                setProgress((i + 1) * count);\r
+                               //                              if (i == 5)\r
+                               //                                      throw new Exception("Test");\r
                        }\r
                } catch (Exception e) {\r
                        e.printStackTrace();\r
+                       throw e;\r
                }\r
 \r
                //              Path filePath = Paths.get("/mnt/ISILON/ARCHIVE_RESTORE/XXX/xxx-ARCH-209740793_2-207990326.MXF");\r
index 6cb3dfb39978f67b855c82e5714870372eb4d93d..5c7a0251c0bb39b06506a367a118261e98d1cc87 100644 (file)
@@ -39,7 +39,7 @@ import user.commons.StoreUri;
 import user.commons.remotestore.FtpDirectoryLister;\r
 \r
 public class EscortFiles {\r
-       private static final String DOT_JSON = ".json";\r
+       public static final String DOT_JSON = ".json";\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final String EXTENDEDAGENCY = "ExtendedAgency";\r
        private static final String EXTENDEDDESCRIPTION = "ExtendedDescription";\r
@@ -207,4 +207,8 @@ public class EscortFiles {
                        targetUri.cleanUp();\r
                }\r
        }\r
+\r
+       public static void createFellow(String escortFile, String extension) throws IOException {\r
+               Files.copy(Paths.get(escortFile), Paths.get(escortFile + "." + extension));\r
+       }\r
 }\r
index b5cbd15870fce78b43a503980e26157865971bae..fc17afb5e742b70074430c856282e1995768b90a 100644 (file)
@@ -4,6 +4,7 @@ import java.io.FileNotFoundException;
 import java.nio.file.Path;\r
 import java.nio.file.Paths;\r
 \r
+import org.apache.commons.lang.StringUtils;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
@@ -12,6 +13,7 @@ import user.commons.mediatool.MediaInfo;
 import user.commons.remotestore.RemoteStoreProtocol;\r
 \r
 public class FileValidatorStep extends JobStep {\r
+       private static final String COLORSPACE = "COLORSPACE";\r
        private static final Logger logger = LogManager.getLogger();\r
 \r
        private void deleteSilently(Path file) {\r
@@ -23,37 +25,57 @@ public class FileValidatorStep extends JobStep {
        }\r
 \r
        @StepEntry\r
-       public Object[] execute(StoreUri sourceStoreUri, String fileName, long expectedFrameNumber, long expectedSize, String escortFile) throws Exception {\r
+       public Object[] execute(StoreUri sourceStoreUri, String fileName, long expectedFrameNumber, long expectedSize, String exceptedColorSpace, String escortFile)\r
+                       throws Exception {\r
                if (!RemoteStoreProtocol.LOCAL.equals(sourceStoreUri.getProtocol()))\r
                        throw new Exception("Store URI protocol must be local.");\r
                Path filePath = Paths.get(sourceStoreUri.toString(true), fileName);\r
                if (!filePath.toFile().exists())\r
                        throw new FileNotFoundException("File not exists: " + filePath.toString());\r
 \r
-               if (expectedFrameNumber > 0)\r
-                       validateFrameNumber(filePath, expectedFrameNumber, escortFile);\r
+               if (expectedFrameNumber > 0 || StringUtils.isNotBlank(exceptedColorSpace))\r
+                       validateMedia(filePath, expectedFrameNumber, exceptedColorSpace, escortFile);\r
+\r
                if (expectedSize > 0)\r
                        validateSize(filePath, expectedSize, escortFile);\r
+\r
+               logger.info(getMarker(), "{} passed validation", fileName);\r
                return null;\r
        }\r
 \r
-       private void validateFrameNumber(Path filePath, long expectedFrameNumber, String escortFile) throws Exception {\r
+       private void validateMedia(Path filePath, long expectedFrameNumber, String exceptedColorSpace, String escortFile) throws Exception {\r
                MediaInfo mi = null;\r
                try {\r
                        mi = new MediaInfo(filePath);\r
                        mi.process();\r
-                       long frames = mi.getFrames();\r
-                       if (frames != expectedFrameNumber) {\r
-                               deleteSilently(filePath);\r
-                               if (escortFile != null) {\r
-                                       Path escortFilePath = Paths.get(escortFile);\r
-                                       deleteSilently(escortFilePath);\r
+\r
+                       if (expectedFrameNumber > 0) {\r
+                               long frames = mi.getFrames();\r
+                               if (frames != expectedFrameNumber) {\r
+                                       deleteSilently(filePath);\r
+                                       if (escortFile != null) {\r
+                                               Path escortFilePath = Paths.get(escortFile);\r
+                                               deleteSilently(escortFilePath);\r
+                                       }\r
+                                       throw new Exception("Length mismatch in " + filePath + ". Expected: " + expectedFrameNumber + ", found: " + frames);\r
+                               }\r
+                       }\r
+\r
+                       if (StringUtils.isNotBlank(exceptedColorSpace)) {\r
+                               String colorSpace = mi.getColorSpace();\r
+                               if (colorSpace == null) {\r
+                                       EscortFiles.createFellow(escortFile, COLORSPACE);\r
+                                       throw new Exception("Can not determine color space in " + filePath);\r
+                               }\r
+\r
+                               if (!colorSpace.equals(exceptedColorSpace)) {\r
+                                       EscortFiles.createFellow(escortFile, COLORSPACE);\r
+                                       throw new Exception("Expected color space is " + exceptedColorSpace + ", but found " + colorSpace);\r
                                }\r
-                               throw new Exception("Length mismatch. Expected: " + expectedFrameNumber + ", found: " + frames);\r
                        }\r
 \r
                } catch (Exception e) {\r
-                       logger.error(e.getMessage());\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
                        throw e;\r
                }\r
        }\r
@@ -65,7 +87,7 @@ public class FileValidatorStep extends JobStep {
                                throw new Exception("Size mismatch. Expected: " + expectedSize + ", found: " + length);\r
 \r
                } catch (Exception e) {\r
-                       logger.error(e.getMessage());\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
                        throw e;\r
                }\r
        }\r
similarity index 57%
rename from server/user.jobengine.executors/src/user/jobengine/server/steps/ForkValidateAndArchiveStep.java
rename to server/user.jobengine.executors/src/user/jobengine/server/steps/ForkByStatusFileStep.java
index 2ac8fc821b333353b7a551e2ec59eb752103d653..c9858b96dc0841fb12b5aaf353e47236bc30c0da 100644 (file)
@@ -10,33 +10,28 @@ import java.util.Map;
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
 \r
 import user.commons.DownloadableMedia;\r
 import user.commons.StoreUri;\r
 import user.commons.remotestore.RemoteStoreProtocol;\r
-import user.jobengine.db.Store;\r
 import user.jobengine.server.IJobRuntime;\r
 \r
-public class ForkValidateAndArchiveStep extends JobStep {\r
+public class ForkByStatusFileStep extends JobStep {\r
        private static final Logger logger = LogManager.getLogger();\r
 \r
        @StepEntry\r
-       public Object[] execute(String storeName, String template, int limit) {\r
+       public Object[] execute(String tempStoreName, String targetStoreName, String targetProtocol, String template, String expectedColorSpace, int limit)\r
+                       throws Exception {\r
                DirectoryStream<Path> directoryStream = null;\r
                int count = limit;\r
                try {\r
-                       Store store = getManager().getStore(storeName);\r
-                       if (store == null)\r
-                               throw new NullPointerException("Store not exists: " + storeName);\r
-                       StoreUri sourceStoreUri = store.getTargetStoreUri(RemoteStoreProtocol.LOCAL);\r
-                       if (sourceStoreUri == null)\r
-                               throw new NullPointerException("LOCAL store URI not available on: " + storeName);\r
-\r
-                       Store systemStore = getManager().getSystemStore(false);\r
-                       StoreUri tsmStoreUri = systemStore.getTargetStoreUri(RemoteStoreProtocol.TSM);\r
+                       StoreUri tempStoreUri = getManager().getStoreUri(tempStoreName, RemoteStoreProtocol.LOCAL);\r
+                       StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
 \r
                        if (getJobRuntime().forkPrepare()) {\r
-                               Path path = Paths.get(sourceStoreUri.toString(true), ".STATUS");\r
+                               Path path = Paths.get(tempStoreUri.toString(true), ".STATUS");\r
                                directoryStream = Files.newDirectoryStream(path);\r
                                if (directoryStream != null) {\r
                                        for (Path escortFile : directoryStream) {\r
@@ -46,14 +41,13 @@ public class ForkValidateAndArchiveStep extends JobStep {
                                                        break;\r
                                                }\r
 \r
-                                               if (processPathItem(sourceStoreUri, tsmStoreUri, template, escortFile))\r
+                                               if (processPathItem(tempStoreUri, targetStoreUri, template, escortFile))\r
                                                        count--;\r
 \r
                                                if (count == 0)\r
                                                        break;\r
                                        }\r
                                }\r
-\r
                                if (count == limit)\r
                                        getJobRuntime().cancelForkPrepare();\r
                                else\r
@@ -63,6 +57,7 @@ public class ForkValidateAndArchiveStep extends JobStep {
                        setProgress(100);\r
                } catch (Exception e) {\r
                        logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
                } finally {\r
                        if (directoryStream != null) {\r
                                try {\r
@@ -75,10 +70,19 @@ public class ForkValidateAndArchiveStep extends JobStep {
                return null;\r
        }\r
 \r
-       private boolean processPathItem(StoreUri tempStoreUri, StoreUri tsmStoreUri, String template, Path escortFile) throws IOException {\r
+       private boolean processPathItem(StoreUri tempStoreUri, StoreUri targetStoreUri, String template, Path escortFile) throws IOException {\r
                if (escortFile.toFile().isDirectory())\r
                        return false;\r
 \r
+               //ami nem JSON azt nem kezeljuk\r
+               if (!escortFile.getFileName().toString().toLowerCase().endsWith(EscortFiles.DOT_JSON))\r
+                       return false;\r
+\r
+               //aminek van COLORSPACE kiterjesztésű\r
+               Path colorspaceFile = Paths.get(escortFile.toString() + ".colorspace");\r
+               if (colorspaceFile.toFile().exists())\r
+                       return false;\r
+\r
                String fileName = escortFile.getFileName().toString();\r
                //minimum 3 karakter: STORENAME.FILENAME.MXF.JSON\r
                long dotCount = fileName.chars().filter(ch -> ch == '.').count();\r
@@ -93,19 +97,22 @@ public class ForkValidateAndArchiveStep extends JobStep {
 \r
                        Map<String, Object> parameters = new HashMap<>();\r
                        parameters.put("sourceStoreUri", sourceStoreUri);\r
+                       parameters.put("fileName", downloadable.getString("fileName"));\r
                        parameters.put("tempStoreUri", tempStoreUri);\r
-                       parameters.put("tsmStoreUri", tsmStoreUri);\r
-                       parameters.put("sourceFileName", downloadable.getString("fileName"));\r
-                       parameters.put("tsmFileName", downloadable.getString("fileName"));\r
+                       parameters.put("targetStoreUri", targetStoreUri);\r
                        parameters.put("expectedFrameNumber", downloadable.getLong("frames"));\r
+                       parameters.put("expectedSize", downloadable.getLong("size"));\r
+                       parameters.put("expectedColorSpace", downloadable.getString("colorSpace"));\r
                        parameters.put("escortFile", escortFile.toAbsolutePath().toString());\r
 \r
-                       IJobRuntime child = getEngine().submit(template, "Archiválás", parameters);\r
+                       IJobRuntime child = getEngine().submit(getJobRuntime(), null, template, "Archiválás", parameters);\r
                        if (child == null)\r
                                throw new Exception("Submit error.");\r
 \r
                } catch (Exception e) {\r
-                       logger.error(e.getMessage());\r
+                       Message m = new ParameterizedMessage(e.getMessage());\r
+                       logger.error(getMarker(), m, e);\r
+                       logger.error(getSessionMarker(), m);\r
                        return false;\r
                }\r
 \r
index 8fd14dc8018969d627afd6e56fe7d903f8bd06af..10f5a76efdc312e5986fc8b160009e87da8f7822 100644 (file)
@@ -1,6 +1,7 @@
 package user.jobengine.server.steps;\r
 \r
 import java.io.IOException;\r
+import java.nio.file.Paths;\r
 import java.sql.Timestamp;\r
 import java.util.List;\r
 \r
@@ -12,7 +13,6 @@ import user.commons.RemoteFile;
 import user.commons.StoreUri;\r
 import user.commons.remotestore.RemoteStoreProtocol;\r
 import user.jobengine.db.Media;\r
-import user.jobengine.db.Store;\r
 \r
 public class GenericArchiveCheckerStep extends JobStep {\r
        private static final String DOT_MXF = ".MXF";\r
@@ -26,22 +26,19 @@ public class GenericArchiveCheckerStep extends JobStep {
        }\r
 \r
        @StepEntry\r
-       public Object[] execute(String storeName, String protocol, String wildCard, String outputPath, int limit) throws Exception {\r
-               Store store = getManager().getStore(storeName);\r
-               if (store == null)\r
-                       throw new NullPointerException("Store not available: " + storeName);\r
-\r
-               StoreUri storeUri = store.getSourceStoreUri(Enum.valueOf(RemoteStoreProtocol.class, protocol));\r
-               if (storeUri == null)\r
-                       throw new NullPointerException("StoreUri not available on " + storeName + " for protocol " + protocol);\r
-\r
+       public Object[] execute(String sourceStoreName, String protocol, String wildCard, String escortStoreName, int limit) throws Exception {\r
+               StoreUri storeUri = null;\r
                int count = limit;\r
 \r
                try {\r
+                       storeUri = getManager().getStoreUri(sourceStoreName, Enum.valueOf(RemoteStoreProtocol.class, protocol));\r
+                       StoreUri escortSoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       String outputPath = Paths.get(escortSoreUri.toString(true)).toString();\r
+\r
                        //az FTP store nem tamogatja az asszinkron listazast\r
                        List<RemoteFile> remoteFiles = storeUri.getRemoteFiles(wildCard);\r
                        for (RemoteFile remoteFile : remoteFiles) {\r
-                               if (processClip(storeName, remoteFile, storeUri.getId(), outputPath))\r
+                               if (processClip(sourceStoreName, remoteFile, storeUri.getId(), outputPath))\r
                                        count--;\r
 \r
                                if (count == 0) {\r
@@ -53,6 +50,8 @@ public class GenericArchiveCheckerStep extends JobStep {
                } catch (Exception e) {\r
                        throw e;\r
                } finally {\r
+                       if (storeUri != null)\r
+                               storeUri.cleanUp();\r
                }\r
 \r
                return null;\r
similarity index 64%
rename from server/user.jobengine.executors/src/user/jobengine/server/steps/NEXIOMissingMaterialCheckerStep.java
rename to server/user.jobengine.executors/src/user/jobengine/server/steps/HarrisMissingMaterialCheckerStep.java
index ff4d2a07d9caa57a7c778b84be7b94776e522bcf..1acca884cab065907bff34ae88e0439ecc2982f4 100644 (file)
@@ -8,29 +8,32 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.commons.DownloadableMedia;\r
 import user.commons.StoreUri;\r
-import user.commons.UploadableMedia;\r
 import user.commons.harris.HarrisRecord;\r
 import user.commons.harris.VICFileParser;\r
 import user.commons.remotestore.RemoteStoreProtocol;\r
 import user.jobengine.db.Media;\r
 \r
-public class NEXIOMissingMaterialCheckerStep extends JobStep {\r
+public class HarrisMissingMaterialCheckerStep extends JobStep {\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final String lineFormat = System.getProperty("harris.vic.lineformat",\r
                        "A TTTTTTTT     LLLLLLLLLLL MMMMMMMMMMMMMMMMMMMMMMM X   DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");\r
        private static final String validTypeCodes = System.getProperty("harris.vic.validtypecodes", "SPACE,E");\r
-       private static final String appendExtension = System.getProperty("harris.vic.appendextension", ".mxf");\r
+       private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
 \r
        @StepEntry\r
-       public Object[] execute(String[] vicFiles, String escortStoreName, String targetStoreName, String targetProtocol) throws Exception {\r
+       public Object[] execute(BasicDBList vicFiles, String escortStoreName, String targetStoreName, String targetProtocol) throws Exception {\r
                StoreUri escortStoreUri = null;\r
                try {\r
                        escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
                        StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
                        List<HarrisRecord> records = null;\r
-                       for (String vicFile : vicFiles) {\r
-                               Path vicFilePath = Paths.get(vicFile);\r
+                       for (Object vicFile : vicFiles) {\r
+                               Path vicFilePath = Paths.get(String.valueOf(vicFile));\r
+                               logger.info("Processing {} (exists: {})", vicFilePath, vicFilePath.toFile().exists());\r
                                VICFileParser parser = new VICFileParser(vicFilePath, lineFormat, validTypeCodes);\r
                                if (records == null)\r
                                        records = parser.getRecords();\r
@@ -48,6 +51,7 @@ public class NEXIOMissingMaterialCheckerStep extends JobStep {
 \r
                } catch (Exception e) {\r
                        logger.error(getSessionMarker(), e.getMessage());\r
+                       logger.error(e.getMessage());\r
                        throw e;\r
                } finally {\r
                        if (escortStoreUri != null)\r
@@ -65,16 +69,20 @@ public class NEXIOMissingMaterialCheckerStep extends JobStep {
                        fileName += appendExtension;\r
 \r
                if (media == null) {\r
-                       logger.error(getSessionMarker(), "File {} not archived yet", fileName);\r
+                       logger.warn(getSessionMarker(), "File is not available in archive {}", fileName);\r
                        return;\r
                }\r
 \r
-               UploadableMedia uploadable = UploadableMedia.create(record.getFileName(), fileName, targetStoreUri.getId(), media.getId());\r
-               String escortFileName = targetStoreName + "." + uploadable.getString("fileName");\r
+               DownloadableMedia downloadable = DownloadableMedia.create(media.getTitle(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+                               targetStoreUri.getId(), media.getId());\r
+               String escortFileName = targetStoreName + "." + downloadable.getString("fileName");\r
                String outputPath = null;\r
                try {\r
                        outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
-                       EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, uploadable.toPrettyString(""));\r
+                       if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString("")))\r
+                               logger.info(getSessionMarker(), "Status file created {}", escortFileName);\r
+                       else\r
+                               logger.info(getSessionMarker(), "Status file already exists {}", escortFileName);\r
                } catch (Exception e) {\r
                        logger.error("Can't create escort file {}", Paths.get(outputPath.toString(), escortFileName));\r
                }\r
index 769c5df62e5e4570a8f74cb1f0fd52b48d2e4339..66813d008def3679e335c2d43926d43afa6222f8 100644 (file)
@@ -2,11 +2,14 @@ package user.jobengine.server.steps;
 \r
 import java.nio.file.Path;\r
 import java.nio.file.Paths;\r
+import java.sql.Timestamp;\r
+import java.time.Instant;\r
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
 import user.commons.DownloadableMedia;\r
+import user.commons.StoreUri;\r
 import user.jobengine.db.IItemManager;\r
 import user.jobengine.db.Item;\r
 import user.jobengine.db.Media;\r
@@ -17,14 +20,14 @@ public class MetadataPersisterStep extends JobStep {
        private static final Logger logger = LogManager.getLogger();\r
 \r
        @StepEntry\r
-       public Object[] execute(String escortFile) throws Exception {\r
+       public Object[] execute(StoreUri targetStoreUri, String escortFile) throws Exception {\r
                try {\r
 \r
                        Path escortFilePath = Paths.get(escortFile);\r
                        //ha nem ment at a letoltott file az ellenorzesen, akkor már torolve lett\r
                        if (escortFilePath.toFile().exists()) {\r
                                String escortFileName = escortFilePath.getFileName().toString();\r
-                               String storeName = escortFileName.substring(0, escortFileName.indexOf("."));\r
+                               String sourceStoreName = escortFileName.substring(0, escortFileName.indexOf("."));\r
                                DownloadableMedia downloadable = EscortFiles.decode(escortFilePath);\r
                                String title = downloadable.getString("title");\r
                                String fileName = downloadable.getString("fileName");\r
@@ -32,20 +35,22 @@ public class MetadataPersisterStep extends JobStep {
 \r
                                IItemManager manager = getManager();\r
 \r
+                               String targetStoreName = getManager().getStore(targetStoreUri.getStoreId()).getName();\r
                                //ez elszallhat, mert nincs filetype vagy store\r
-                               MediaFile mediaFile = manager.createMediaFile(fileName, fileTypeName, storeName);\r
+                               MediaFile mediaFile = manager.createMediaFile(fileName, fileTypeName, targetStoreName);\r
                                //ez elszallhat, mert nincs itemtype\r
-                               Item item = manager.createItem(GENERIC, title, storeName, null);\r
+                               Item item = manager.createItem(GENERIC, title, sourceStoreName, null);\r
                                //ez elszallhat, mert nincs itemtype\r
-                               Media media = manager.createMedia(GENERIC, title, storeName, null);\r
+                               Media media = manager.createMedia(GENERIC, title, sourceStoreName, null);\r
 \r
                                //TODO megoldani  egy tranzakcioban\r
                                item.add();\r
                                media.setItemId(item.getId());\r
+                               media.setLength(downloadable.getLong("frames"));\r
+                               media.setArchived(Timestamp.from(Instant.now()));\r
                                media.add();\r
                                mediaFile.setMediaId(media.getId());\r
                                mediaFile.add();\r
-\r
                        }\r
                } catch (Exception e) {\r
                        logger.error(e.getMessage());\r
index f6b6a5ae2be77bba2be2cd87956c09f856aa2cf3..5d34da6918b0e1a2f0f827bffc74e749a083aeb1 100644 (file)
@@ -1,7 +1,10 @@
 package user.jobengine.server.steps;\r
 \r
 import java.io.IOException;\r
+import java.nio.file.Paths;\r
 import java.sql.Timestamp;\r
+import java.time.Duration;\r
+import java.time.Instant;\r
 import java.util.Iterator;\r
 \r
 import org.apache.logging.log4j.LogManager;\r
@@ -18,7 +21,7 @@ import user.commons.remotestore.RemoteStoreProtocol;
 import user.jobengine.db.Media;\r
 \r
 public class NEXIOArchiveCheckerStep extends JobStep {\r
-       private static final String DOT_MXF = ".MXF";\r
+       private static final String DOT_MXF = ".mxf";\r
        private static final Logger logger = LogManager.getLogger();\r
 \r
        private boolean check(Timestamp modified, Timestamp created, int duration, Media media) {\r
@@ -31,19 +34,24 @@ public class NEXIOArchiveCheckerStep extends JobStep {
        }\r
 \r
        @StepEntry\r
-       public Object[] execute(String storeName, String outputPath, int limit) throws Exception {\r
-               StoreUri storeUri = getManager().getStoreUri(storeName, RemoteStoreProtocol.NEXIO);\r
+       public Object[] execute(String sourceStoreName, String escortStoreName, int lastModifiedHours, int limit) throws Exception {\r
                Controller controller = null;\r
 \r
                try {\r
-                       if (storeUri.getPortNumber() == 0)\r
-                               controller = new Controller(storeUri.getUri(), storeUri.getPortNumber());\r
+                       StoreUri nexioStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.NEXIO);\r
+                       StoreUri downloadStoreUri = getManager().getStoreUri(sourceStoreName, RemoteStoreProtocol.FTP);\r
+                       StoreUri escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+\r
+                       if (nexioStoreUri.getPortNumber() == 0)\r
+                               controller = new Controller(nexioStoreUri.getUri(), nexioStoreUri.getPortNumber());\r
                        else\r
-                               controller = new Controller(storeUri.getUri());\r
+                               controller = new Controller(nexioStoreUri.getUri());\r
                        controller.connect();\r
                        Mediabase mediabase = controller.getMediabase();\r
+\r
                        Iterator<Clip> clips = mediabase.getClips();\r
-                       processClips(storeName, storeUri.getId(), outputPath, limit, clips);\r
+                       processClips(sourceStoreName, downloadStoreUri.getId(), outputPath, limit, clips, lastModifiedHours);\r
                } catch (Exception e) {\r
                        logger.error(getSessionMarker(), e.getMessage());\r
                        throw e;\r
@@ -55,7 +63,7 @@ public class NEXIOArchiveCheckerStep extends JobStep {
                return null;\r
        }\r
 \r
-       private void processClips(String storeName, long storeUriId, String outputPath, int limit, Iterator<Clip> clips)\r
+       private void processClips(String storeName, long storeUriId, String outputPath, int limit, Iterator<Clip> clips, int lastModifiedHours)\r
                        throws ClipNotFoundException, IOException, ProtocolException {\r
                int count = limit;\r
                while (clips.hasNext()) {\r
@@ -67,28 +75,39 @@ public class NEXIOArchiveCheckerStep extends JobStep {
 \r
                        Clip clip = clips.next();\r
                        String title = clip.getXid().get();\r
-                       Timestamp modified = Timestamp.from(clip.getModifiedTimestamp().toInstant());\r
+                       Instant clipModified = clip.getModifiedTimestamp().toInstant();\r
+                       Timestamp modified = Timestamp.from(clipModified);\r
                        Timestamp created = Timestamp.from(clip.getRecordDateTimestamp().toInstant());\r
                        int frames = clip.getDuration();\r
 \r
-                       //TODO a rogzites alatt allo klippeket kiszurni\r
-\r
                        Media media = getManager().getMedia(title);\r
 \r
                        boolean createEscort = check(modified, created, frames, media);\r
 \r
                        if (createEscort) {\r
-                               long mediaId = media == null ? 0 : media.getId();\r
+                               long mediaId = 0;\r
+\r
+                               //lastModifiedHours oran belul modositott anyagokat beken hagyjuk\r
+                               if (media != null) {\r
+                                       //negativ ha a masodik az elso elott van\r
+                                       long modifiedHours = Duration.between(clipModified, Instant.now()).toHours();\r
+                                       if (modifiedHours > lastModifiedHours) {\r
+                                               logger.info(getSessionMarker(), "Modification time is too cloose for {}");\r
+                                               continue;\r
+                                       }\r
+                                       mediaId = media.getId();\r
+                               }\r
+\r
                                String fileName = title + DOT_MXF;\r
                                DownloadableMedia downloadable = DownloadableMedia.create(title, fileName, modified, created, frames, 0, storeUriId, mediaId);\r
-                               //letezik : mar hozzadva\r
-\r
                                String escortFileName = storeName + "." + downloadable.getString("fileName");\r
-                               if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString("")))\r
+                               if (EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString(""))) {\r
+                                       logger.info(getSessionMarker(), "Archive status file created for {}", fileName);\r
                                        count--;\r
+                               }\r
                        }\r
 \r
-                       //vegtelen : limit=-1\r
+                       //vegtelen : limit<=0\r
                        if (count == 0) {\r
                                logger.info("Limit reached: {}", limit);\r
                                break;\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/PBMissingMaterialCheckerStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/PBMissingMaterialCheckerStep.java
deleted file mode 100644 (file)
index b524906..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-package user.jobengine.server.steps;\r
-\r
-import java.nio.file.Path;\r
-import java.nio.file.Paths;\r
-import java.util.List;\r
-\r
-import org.apache.commons.lang.StringUtils;\r
-import org.apache.logging.log4j.LogManager;\r
-import org.apache.logging.log4j.Logger;\r
-\r
-import user.commons.StoreUri;\r
-import user.commons.UploadableMedia;\r
-import user.commons.harris.HarrisRecord;\r
-import user.commons.harris.VICFileParser;\r
-import user.commons.remotestore.RemoteStoreProtocol;\r
-import user.jobengine.db.Media;\r
-\r
-public class PBMissingMaterialCheckerStep extends JobStep {\r
-       private static final Logger logger = LogManager.getLogger();\r
-       private static final String lineFormat = System.getProperty("harris.vic.lineformat",\r
-                       "A TTTTTTTT     LLLLLLLLLLL MMMMMMMMMMMMMMMMMMMMMMM X   DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");\r
-       private static final String validTypeCodes = System.getProperty("harris.vic.validtypecodes", "SPACE,E");\r
-       private static final String appendExtension = System.getProperty("harris.vic.appendextension", ".mxf");\r
-\r
-       @StepEntry\r
-       public Object[] execute(String[] vicFiles, String escortStoreName, String targetStoreName, String targetProtocol) throws Exception {\r
-               StoreUri escortStoreUri = null;\r
-               try {\r
-                       escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
-                       StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
-                       for (String vicFile : vicFiles) {\r
-                               Path vicFilePath = Paths.get(vicFile);\r
-                               VICFileParser parser = new VICFileParser(vicFilePath, lineFormat, validTypeCodes);\r
-                               List<HarrisRecord> records = parser.getRecords();\r
-                               for (HarrisRecord record : records)\r
-                                       processRecord(record, targetStoreName, targetStoreUri, escortStoreUri);\r
-\r
-                       }\r
-               } catch (Exception e) {\r
-                       logger.error(getSessionMarker(), e.getMessage());\r
-                       throw e;\r
-               } finally {\r
-                       if (escortStoreUri != null)\r
-                               escortStoreUri.cleanUp();\r
-               }\r
-\r
-               return null;\r
-       }\r
-\r
-       private void processRecord(HarrisRecord record, String targetStoreName, StoreUri targetStoreUri, StoreUri escortStoreUri) {\r
-               Media media = getManager().getMedia(record.getFileName());\r
-\r
-               String fileName = record.getFileName();\r
-               if (StringUtils.isNotBlank(appendExtension))\r
-                       fileName += appendExtension;\r
-\r
-               if (media == null) {\r
-                       logger.error(getSessionMarker(), "File {} not archived yet", fileName);\r
-                       return;\r
-               }\r
-\r
-               UploadableMedia uploadable = UploadableMedia.create(record.getFileName(), fileName, targetStoreUri.getId(), media.getId());\r
-               String escortFileName = targetStoreName + "." + uploadable.getString("fileName");\r
-               String outputPath = null;\r
-               try {\r
-                       outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
-                       EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, uploadable.toPrettyString(""));\r
-               } catch (Exception e) {\r
-                       logger.error("Can't create escort file {}", Paths.get(outputPath.toString(), escortFileName));\r
-               }\r
-\r
-       }\r
-\r
-}\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/PeableBeachMissingMaterialCheckerStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/PeableBeachMissingMaterialCheckerStep.java
new file mode 100644 (file)
index 0000000..3c53af0
--- /dev/null
@@ -0,0 +1,86 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\r
+import java.util.ArrayList;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.DownloadableMedia;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.peablebeach.PBMissingMaterialSrc;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Media;\r
+\r
+public class PeableBeachMissingMaterialCheckerStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
+\r
+       @StepEntry\r
+       public Object[] execute(String escortStoreName, String targetStoreName, String targetProtocol, String primaryEndPoint, String primaryUserName,\r
+                       String primaryPassword, String secondaryEndPoint, String secondaryUserName, String secondaryPassword, int rangeForwardHours) throws Exception {\r
+               StoreUri escortStoreUri = null;\r
+               try {\r
+                       escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
+                       StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
+\r
+                       PBMissingMaterialSrc source = new PBMissingMaterialSrc();\r
+                       source.init(primaryEndPoint, primaryUserName, primaryPassword, secondaryEndPoint, secondaryUserName, secondaryPassword, rangeForwardHours);\r
+\r
+                       List<RemoteFile> remoteFiles = targetStoreUri.getRemoteFiles();\r
+\r
+                       List<String> poolContent = new ArrayList<>();\r
+                       remoteFiles.forEach(i -> {\r
+                               String fileName = i.getName();\r
+                               String title = fileName.substring(0, fileName.lastIndexOf("."));\r
+                               poolContent.add(title);\r
+                       });\r
+                       logger.info("Pool contains {} items", poolContent.size());\r
+                       LinkedHashSet<String> fileNames = source.getPossibelMissingMaterialNames(poolContent);\r
+                       logger.info("API returns {} items", fileNames.size());\r
+\r
+                       for (String fileName : fileNames) {\r
+                               processRecord(fileName, targetStoreName, targetStoreUri, escortStoreUri);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (escortStoreUri != null)\r
+                               escortStoreUri.cleanUp();\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private void processRecord(String fileName, String targetStoreName, StoreUri targetStoreUri, StoreUri escortStoreUri) {\r
+               String title = fileName.substring(0, fileName.lastIndexOf("."));\r
+\r
+               Media media = getManager().getMedia(title);\r
+\r
+               if (StringUtils.isNotBlank(appendExtension))\r
+                       fileName += appendExtension;\r
+\r
+               if (media == null) {\r
+                       logger.error(getSessionMarker(), "File {} not archived yet", fileName);\r
+                       return;\r
+               }\r
+\r
+               DownloadableMedia downloadable = DownloadableMedia.create(title, fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
+                               targetStoreUri.getId(), media.getId());\r
+               String escortFileName = targetStoreName + "." + downloadable.getString("fileName");\r
+               String outputPath = null;\r
+               try {\r
+                       outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
+                       EscortFiles.createMetadataIfNotExists(outputPath, escortFileName, downloadable.toPrettyString(""));\r
+               } catch (Exception e) {\r
+                       logger.error("Can't create escort file {}", Paths.get(outputPath.toString(), escortFileName));\r
+               }\r
+\r
+       }\r
+\r
+}\r
similarity index 91%
rename from server/user.jobengine.executors/src/user/jobengine/server/steps/FakeNoParamsStep.java
rename to server/user.jobengine.executors/src/user/jobengine/server/steps/TestForkCancelableStep.java
index 1c17c973019ba46837b2e2d307fde7de2241f5c5..6d0e20570db3e9a0781f9c9822374de9b2e65ec9 100644 (file)
@@ -6,7 +6,7 @@ import org.apache.logging.log4j.Logger;
 import user.jobengine.server.IJobEngine;\r
 import user.jobengine.server.IJobRuntime;\r
 \r
-public class FakeNoParamsStep extends JobStep {\r
+public class TestForkCancelableStep extends JobStep {\r
        private static final String CHILD_TITLE = "Párhuzamosított alfolyamat";\r
        //      private static final String CHILD_TEMPLATE = "fake-concurrent.xml";\r
        private static final String CHILD_TEMPLATE = "cancelable.xml";\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/TransferFromTSMStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/TransferFromTSMStep.java
new file mode 100644 (file)
index 0000000..a74c02b
--- /dev/null
@@ -0,0 +1,11 @@
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class TransferFromTSMStep extends TransferStep {\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+       }\r
+}\r
index eb7ce500d6d0bb2987290dfeceeaa0ce1e926762..ac3823685a0c958984c4e24dcafa9f13114a8f4f 100644 (file)
@@ -1,5 +1,7 @@
 package user.jobengine.server.steps;\r
 \r
+import java.nio.file.Paths;\r
+\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
@@ -13,14 +15,17 @@ public class TransferStep extends JobStep {
        @StepEntry\r
        public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
                try {\r
-                       logger.info("Transfering {} from {} to {}", sourceFileName, sourceStoreUri, targetStoreUri);\r
-                       if (!(symulateTransferToTSM && RemoteStoreProtocol.TSM.equals(targetStoreUri.getProtocol()))) {\r
+                       String description = Paths.get(sourceStoreUri.toString(true), sourceFileName).toString();\r
+                       getJobRuntime().setDescription(description);\r
+                       if (isSimulateTSMWrite(sourceStoreUri, targetStoreUri)) {\r
+                               logger.info(getSessionMarker(), "Skipping real TSM write of {} from {} to {}", sourceFileName, sourceStoreUri, targetStoreUri);\r
+                       } else {\r
                                sourceStoreUri.addProgressListener(e -> setProgress(e.getProgress()));\r
                                sourceStoreUri.transferFrom(targetStoreUri, sourceFileName, targetFileName);\r
+                               logger.info(getSessionMarker(), "Transfer of {} completed from {} to {}", sourceFileName, sourceStoreUri, targetStoreUri);\r
                        }\r
-                       logger.info("Transfer completed");\r
                } catch (Exception e) {\r
-                       logger.catching(e);\r
+                       logger.error(getSessionMarker(), "Error in transfer of {} when copying from {} to {}", sourceFileName, sourceStoreUri, targetStoreUri);\r
                        throw e;\r
                } finally {\r
                        if (sourceStoreUri != null)\r
@@ -30,4 +35,8 @@ public class TransferStep extends JobStep {
                }\r
                return null;\r
        }\r
+\r
+       private boolean isSimulateTSMWrite(StoreUri sourceStoreUri, StoreUri targetStoreUri) {\r
+               return symulateTransferToTSM && (RemoteStoreProtocol.TSM.equals(targetStoreUri.getProtocol()));\r
+       }\r
 }\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/TransferToTSMStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/TransferToTSMStep.java
new file mode 100644 (file)
index 0000000..64a6e53
--- /dev/null
@@ -0,0 +1,11 @@
+package user.jobengine.server.steps;\r
+\r
+import user.commons.StoreUri;\r
+\r
+public class TransferToTSMStep extends TransferStep {\r
+       @Override\r
+       @StepEntry\r
+       public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
+               return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+       }\r
+}\r
index 5774abd31c5f7d9aea00f7b55e696fa50294cedc..32848218672967e71543863fb91533c4aaf2e231 100644 (file)
@@ -4,5 +4,11 @@
        <classpathentry kind="src" path="src"/>\r
        <classpathentry kind="src" path="test"/>\r
        <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
+       <classpathentry kind="lib" path="C:/Programs/eclipse.neon.light/plugins/org.apache.axis_1.4.0.v201411182030/lib/axis.jar"/>\r
+       <classpathentry kind="lib" path="C:/Programs/eclipse.neon.light/plugins/org.apache.commons.discovery_0.2.0.v201004190315/lib/commons-discovery-0.2.jar"/>\r
+       <classpathentry kind="lib" path="C:/Programs/eclipse.neon.light/plugins/javax.xml.rpc_1.1.0.v201209140446/lib/jaxrpc.jar"/>\r
+       <classpathentry kind="lib" path="C:/Programs/eclipse.neon.light/plugins/javax.xml.soap_1.2.0.v201005080501/lib/saaj.jar"/>\r
+       <classpathentry kind="lib" path="C:/Programs/eclipse.neon.light/plugins/javax.wsdl_1.6.2.v201012040545.jar"/>\r
+       <classpathentry kind="lib" path="C:/Programs/eclipse.neon.light/plugins/org.apache.commons.logging_1.1.1.v201101211721.jar"/>\r
        <classpathentry kind="output" path="bin"/>\r
 </classpath>\r
index 8237d82e471f26a6a18020c5a58b7b5ec1a18edd..b147adf7d0faab5ac6e824caa42eb9b6c991404a 100644 (file)
@@ -33,6 +33,7 @@ Export-Package: user.commons,
  user.commons.nexio.server.protocol,
  user.commons.nosql,
  user.commons.octopus,
+ user.commons.peablebeach,
  user.commons.rcc,
  user.commons.remotestore,
  user.commons.rest,
@@ -54,10 +55,10 @@ Require-Bundle: org.apache.commons.lang;bundle-version="2.4.0",
  com.ibm.nosql;bundle-version="4.19.26",
  joda-time;bundle-version="2.2.0",
  javax.ws.rs-api;bundle-version="2.0.1",
- com.ibm.db2jcc4;bundle-version="4.19.26",
  com.microsoft.sqlserver.sqljdbc;bundle-version="6.0.8112",
  javax.annotation-api;bundle-version="1.2.0",
  org.apache.httpcomponents.httpclient;bundle-version="4.2.6",
  org.apache.httpcomponents.httpcore;bundle-version="4.2.5",
  org.apache.commons.logging;bundle-version="1.1.1",
- org.apache.commons.io;bundle-version="2.2.0"
+ org.apache.commons.io;bundle-version="2.2.0",
+ com.ibm.db2.jcc;bundle-version="1.4.0"
index 1b67f59fd5a59e83de63fffb3cd58c4b1d558e6b..9304a4034d2aef0ea6028366413b07c33884a2a5 100644 (file)
@@ -6,7 +6,7 @@ import com.ibm.nosql.json.api.BasicDBObject;
 \r
 public class DownloadableMedia extends BasicDBObject {\r
 \r
-       public static DownloadableMedia create(String title, String fileName, Timestamp modified, Timestamp created, int frames, long size, long storeUriId,\r
+       public static DownloadableMedia create(String title, String fileName, Timestamp modified, Timestamp created, long frames, long size, long storeUriId,\r
                        long mediaId) {\r
                DownloadableMedia archive = new DownloadableMedia();\r
                archive.put("title", title);\r
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/UploadableMedia.java b/server/user.jobengine.osgi.commons/src/user/commons/UploadableMedia.java
deleted file mode 100644 (file)
index 80c05db..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-package user.commons;\r
-\r
-import com.ibm.nosql.json.api.BasicDBObject;\r
-\r
-public class UploadableMedia extends BasicDBObject {\r
-\r
-       public static UploadableMedia create(String title, String fileName, long storeUriId, long mediaId) {\r
-               UploadableMedia archive = new UploadableMedia();\r
-               archive.put("title", title);\r
-               archive.put("fileName", fileName);\r
-               archive.put("storeUriId", storeUriId);\r
-               archive.put("mediaId", mediaId);\r
-               return archive;\r
-       }\r
-\r
-}\r
index 7a46ad5ce4b88cf3c6f5c328dada97bbf2134307..4ccac3f354fda0be2bb071ea7e753fca75f47738 100644 (file)
@@ -16,6 +16,9 @@ public class MediaInfo {
        private long frames;\r
        private Path filePath;\r
        private int bitRate;\r
+       private String colorSpace;\r
+       private int audioStreams;\r
+       private int videoStreams;\r
 \r
        public MediaInfo(Path filePath) {\r
                this.filePath = filePath;\r
@@ -42,18 +45,23 @@ public class MediaInfo {
                                final DemuxerStream stream = demuxer.getStream(i);\r
                                final Decoder decoder = stream.getDecoder();\r
 \r
-                               if (decoder != null && decoder.getCodecType() == MediaDescriptor.Type.MEDIA_VIDEO) {\r
-                                       videoStreamId = i;\r
-                                       frames = stream.getNumFrames();\r
+                               if (decoder != null) {\r
+                                       if (decoder.getCodecType() == MediaDescriptor.Type.MEDIA_VIDEO) {\r
+                                               videoStreams++;\r
+                                               videoStreamId = i;\r
+                                               frames = stream.getNumFrames();\r
 \r
-                                       if (frames == 0)\r
-                                               frames = stream.getDuration();\r
-\r
-                                       break;\r
+                                               if (frames == 0)\r
+                                                       frames = stream.getDuration();\r
+                                               colorSpace = decoder.getPixelFormat().toString();\r
+                                       }\r
+                                       if (decoder.getCodecType() == MediaDescriptor.Type.MEDIA_AUDIO) {\r
+                                               audioStreams++;\r
+                                       }\r
                                }\r
                        }\r
                        if (videoStreamId == -1)\r
-                               throw new RuntimeException("could not find video stream in container: " + filePath);\r
+                               throw new RuntimeException("Could not find video stream in " + filePath);\r
 \r
                } catch (Exception e) {\r
                        logger.catching(e);\r
@@ -68,4 +76,16 @@ public class MediaInfo {
                }\r
        }\r
 \r
+       public String getColorSpace() {\r
+               return colorSpace;\r
+       }\r
+\r
+       public int getAudioStreams() {\r
+               return audioStreams;\r
+       }\r
+\r
+       public int getVideoStreams() {\r
+               return videoStreams;\r
+       }\r
+\r
 }\r
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/peablebeach/MarinaAPI.wsdl b/server/user.jobengine.osgi.commons/src/user/commons/peablebeach/MarinaAPI.wsdl
new file mode 100644 (file)
index 0000000..d35ffb3
--- /dev/null
@@ -0,0 +1,1402 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<!--\r
+*****************************************************************\r
+# $Logfile: /Marina_1_1_0/source/xml/API/MarinaAPI.wsdl $\r
+# $Revision: 35 $\r
+# $Date: 2014-09-17 16:09:31+01:00 $\r
+# $Author: sarah.wright $ \r
+***************************************************************** \r
+-->\r
+<!-- edited with XMLSpy v2010 rel. 2 (http://www.altova.com) by Pebble Beach Systems Ltd (Pebble Beach Systems Ltd) -->\r
+<wsdl:definitions xmlns:pbs="http://www.pebble.tv/MarinaAPI" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://www.pebble.tv/MarinaAPI">\r
+       <wsdl:types>\r
+               <xsi:schema xmlns:xsi="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.pebble.tv/MarinaAPI" elementFormDefault="unqualified" attributeFormDefault="unqualified">\r
+                       <xsi:import schemaLocation="include/MarinaTypes.xsd"/>\r
+                       <xsi:element name="lastModifiedDateTimeRangeContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'lastModifiedDateTimeRange'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="lastModifiedDateTimeRange" type="lastModifiedDateTimeRange"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:simpleType name="eventIdType">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>The event id type can only be one of the valid listed types used in retrieval of events.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:restriction base="xsi:string">\r
+                                       <xsi:minLength value="1"/>\r
+                                       <xsi:maxLength value="32"/>\r
+                                       <xsi:enumeration value="SERVER_UID"/>\r
+                                       <xsi:enumeration value="POSITION"/>\r
+                               </xsi:restriction>\r
+                       </xsi:simpleType>\r
+                       <xsi:simpleType name="eventIdPositionEnum">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Valid position enums that can be used in an event id for event retrieval.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:restriction base="xsi:string">\r
+                                       <xsi:enumeration value="FIRST"/>\r
+                                       <xsi:enumeration value="LAST"/>\r
+                                       <xsi:enumeration value="FOCUS"/>\r
+                               </xsi:restriction>\r
+                       </xsi:simpleType>\r
+                       <xsi:simpleType name="eventIdValue" final="union">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>The event id value can either be a specific UID or position enum.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:union memberTypes="pbs:eventIdPositionEnum xsi:integer"/>\r
+                       </xsi:simpleType>\r
+                       <xsi:simpleType name="PlaylistEventXMLConfigurableFields">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>One or more of the configurable fields can be set.and are used to retrieve extra config information</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:restriction base="xsi:string">\r
+                                       <xsi:enumeration value="ESTIMATED_START_TIME"/>\r
+                                       <xsi:enumeration value="SCHEDULED_START_TIME"/>\r
+                                       <xsi:enumeration value="START_TIME_STATE"/>\r
+                               </xsi:restriction>\r
+                       </xsi:simpleType>\r
+                       <xsi:simpleType name="configType">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Specifies the component to retrieve the extra config from</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:restriction base="xsi:string">\r
+                                       <xsi:enumeration value="PLAYLIST_EVENT_XML"/>\r
+                               </xsi:restriction>\r
+                       </xsi:simpleType>\r
+                       <xsi:complexType name="eventId">\r
+                               <xsi:attribute name="type" type="pbs:eventIdType" use="required"/>\r
+                               <xsi:attribute name="value" type="pbs:eventIdValue" use="required"/>\r
+                       </xsi:complexType>\r
+                       <xsi:element name="configRequestListContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container that encapsulates the request to "get config" message to send to API</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="configRequestList">\r
+                                                       <xsi:complexType>\r
+                                                               <xsi:all>\r
+                                                                       <xsi:element name="configType" type="pbs:configType"/>\r
+                                                               </xsi:all>\r
+                                                       </xsi:complexType>\r
+                                               </xsi:element>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="config">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container encapsulating the request to set config and response to the "getConfig" </xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:all>\r
+                                               <xsi:element name="playListEventXML">\r
+                                                       <xsi:complexType>\r
+                                                               <xsi:sequence>\r
+                                                                       <xsi:element name="enabledFields">\r
+                                                                               <xsi:complexType>\r
+                                                                                       <xsi:choice maxOccurs="unbounded">\r
+                                                                                               <xsi:element name="field" type="pbs:PlaylistEventXMLConfigurableFields" maxOccurs="unbounded"/>\r
+                                                                                       </xsi:choice>\r
+                                                                               </xsi:complexType>\r
+                                                                       </xsi:element>\r
+                                                               </xsi:sequence>\r
+                                                       </xsi:complexType>\r
+                                               </xsi:element>\r
+                                       </xsi:all>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="mediaMetadataContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'media'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="media" type="media"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="configContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'config'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:all>\r
+                                               <xsi:element ref="pbs:config"/>\r
+                                       </xsi:all>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="mediaUsageListContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'mediaUsageList'</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="mediaUsageList" type="mediaUsageList"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="deleteMediaInstanceContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'deleteMedia'</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="deleteMedia" type="deleteMedia"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="mediaKeyContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'media'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="media" type="media"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="mediaUsageMediaKeyContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'media'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="media" type="media"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="deleteMediaInstanceKeyContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'media'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="media" type="media"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="dateTimecodeRangeContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'dateTimecodeRange'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="dateTimecodeRange" type="dateTimecodeRange"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="jobStateDateTimecodeRangeContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'dateTimecodeRange'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="dateTimecodeRange" type="dateTimecodeRange"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="scheduledJobStateDateTimecodeRangeContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'dateTimecodeRange'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="dateTimecodeRange" type="dateTimecodeRange"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="mediaUsageContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'mediaUsage'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="mediaUsage" type="mediaUsage"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="mediaInstanceKeyContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'MediaInstance'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="media">\r
+                                                       <xsi:complexType>\r
+                                                       <xsi:all>\r
+                                                               <xsi:element name="mediaInstance" type="mediaInstance"/>\r
+                                                       </xsi:all>\r
+                                                       <xsi:attribute  name="mediaName" type="xsi:string"></xsi:attribute>\r
+                                                       <xsi:attribute  name="mediaType" type="xsi:string"></xsi:attribute>\r
+                                                       </xsi:complexType>\r
+                                               </xsi:element>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="bAvailableMedia" type="xsi:boolean">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Used to return information on available media.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="bUnavailableMedia" type="xsi:boolean">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Used to return information on unavailable media.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="nHeartbeatId" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Heartbeat id used to track heartbeat responses.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="strListName" type="xsi:string">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>String used to hold list name for list query commands. Can also be a channel name from which the active list will be used.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="nEventCount" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Event count of queried lists or number of events to return.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="nEventCountDeleted" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Event count of queried lists or number of events to return.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="nEventCountNonQueried" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Event count of queried lists or number of events to return.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="nEventCountNoAuxXml" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Event count of queried events with no aux xml to return.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="eventContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'playlistPrimaryEvent'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="event" type="playlistPrimaryEvent"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="nEventPosition" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Position of the event to query.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="nEventKey" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Key of the event to query.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="eventListContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container for an event list.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="eventList" type="playlistPrimaryEventList"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="jobContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'job'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="job" type="job"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="scheduledJobContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'scheduled job'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="job" type="scheduledJob"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="nJobId" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Id of an automation job.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="nScheduledJobId" type="xsi:int">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Id of a scheduled automation job.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="bMoreEventsAvailable" type="xsi:boolean">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Flag used to indicate there are more events after the last event in an event list returned by a call that returns multiple events.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="eventId" type="pbs:eventId">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Event id used to retrieve events.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="nextEventId" type="pbs:eventId">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Next event id returned by command.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="eventIdList">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>A list of event ids.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element ref="pbs:eventId" minOccurs="0" maxOccurs="unbounded"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="eventIdListContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for an event id list.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element ref="pbs:eventIdList" minOccurs="0"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="eventIdListContainerDeleted">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container for an event id list for events that have been deleted.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element ref="pbs:eventIdList"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="eventIdListContainerNonQueried">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container for an event id list for events that have not been queried.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element ref="pbs:eventIdList"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="bIncludeChildEvents" type="xsi:boolean">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>For events that return event XML set this flag to true for child events to be returned.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="componentTagContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to type 'componentTag'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="componentTag" type="componentTag"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="bIncludeUnhostedComponents" type="xsi:boolean">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>For events that return component information set this flag to true to include active objects that aren't hosted.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="componentListContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Conforms to complex type 'componentList'.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="componentList" type="componentList"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="eventUpdateType">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>An enumeration of different update types performed on an event.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:simpleType>\r
+                                       <xsi:restriction base="xsi:string">\r
+                                               <xsi:minLength value="1"/>\r
+                                               <xsi:maxLength value="32"/>\r
+                                               <xsi:enumeration value="Insert"/>\r
+                                               <xsi:enumeration value="Update"/>\r
+                                               <xsi:enumeration value="Delete"/>\r
+                                       </xsi:restriction>\r
+                               </xsi:simpleType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getContiguousListEventsOutput">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Object containing all parameters returned by the getContiguousListEvents method.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element ref="pbs:nEventCount">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>The number of events contained in the event list container.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:eventListContainer">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>A list of events returned using the passed in query parameters.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:bMoreEventsAvailable">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>A flag to indicate whether there are more events available after the last event returned in the event list container.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:nextEventId" minOccurs="0">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>The event id key for the next event in the list after the last event contained in the event list container.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getNonContiguousListEventsOutput">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Object containing all parameters returned by the getNonContiguousListEvents method.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element ref="pbs:eventListContainer">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>A list of events returned using the passed in query parameters.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:nEventCount">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>The number of events contained in the event list container.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:eventIdListContainerDeleted">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>A list of event id's for events that have been deleted from the list of events to query.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:nEventCountDeleted">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>The number of events contained in the deleted events event id list container.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:eventIdListContainerNonQueried">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>A list of event id's for events that were not queried this will always be a subset of the list of event id's passed in to query.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:nEventCountNonQueried">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>The number of events contained in the non-queried events event id list container.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getListEventChangesOutput">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Object containing all parameters returned by the getListEventChanges method.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element ref="pbs:eventIdListContainer">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>A list of event id's for events that have changed and meet the filters provided.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                               <xsi:element ref="pbs:nEventCount">\r
+                                                       <xsi:annotation>\r
+                                                               <xsi:documentation>The number of events contained in the returned event id list container.</xsi:documentation>\r
+                                                       </xsi:annotation>\r
+                                               </xsi:element>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getListEventChangesAuxXMLOutput">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Object containing all parameters returned by the getListEventChangesAuxXML method.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element ref="pbs:eventListContainer"/>\r
+                                               <xsi:element ref="pbs:nEventCount"/>\r
+                                               <xsi:element ref="pbs:eventIdListContainer"/>\r
+                                               <xsi:element ref="pbs:nEventCountNoAuxXml"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="bIncludeEmptyAuxXmlEvents" type="xsi:boolean">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>When set to true we return back to the caller a list of all events that contained no aux xml.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                       </xsi:element>\r
+                       <xsi:element name="mediaListContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for a list of media items.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element minOccurs="1" name="mediaList" maxOccurs="1" type="mediaList"/>\r
+                                               <xsi:element type="moreResults" minOccurs="1" maxOccurs="1" name="moreResults"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="jobListContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for a list of jobs.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element minOccurs="1" name="jobList" maxOccurs="1" type="jobList"/>\r
+                                               <xsi:element type="moreResults" minOccurs="1" maxOccurs="1" name="moreResults"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="scheduledJobListContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for a list of scheduled jobs.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element minOccurs="1" name="jobList" maxOccurs="1" type="scheduledJobList"/>\r
+                                               <xsi:element type="moreResults" minOccurs="1" maxOccurs="1" name="moreResults"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getJobsForMediaRequestContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for a media item relating to jobs.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="media" type="media"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getScheduledJobsForMediaRequestContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for a media item relating to scheduled jobs.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="media" type="media"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>                  \r
+                       <xsi:element name="getJobRequestContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for the get job request.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="job" type="job"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getScheduledJobRequestContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for the get scheduled job request.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="job" type="scheduledJob"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getCustomViewRequestContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Container element for the get Custom View request.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element name="marinaCustomAPI">\r
+                                                       <xsi:complexType>\r
+                                                               <xsi:attribute name="view" type="xsi:string" use="required"></xsi:attribute>\r
+                                                       </xsi:complexType>\r
+                                               </xsi:element>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+                       <xsi:element name="getCustomViewResponseContainer">\r
+                               <xsi:annotation>\r
+                                       <xsi:documentation>Contains a list of media from the get Custom View request.</xsi:documentation>\r
+                               </xsi:annotation>\r
+                               <xsi:complexType>\r
+                                       <xsi:sequence>\r
+                                               <xsi:element minOccurs="1" name="mediaList" maxOccurs="1" type="mediaList"/>\r
+                                       </xsi:sequence>\r
+                               </xsi:complexType>\r
+                       </xsi:element>\r
+               </xsi:schema>\r
+       </wsdl:types>\r
+       <wsdl:message name="insertUpdateMediaMetadataRequest">\r
+               <wsdl:part name="metadata" element="pbs:mediaMetadataContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="insertUpdateMediaMetadataResponse"/>\r
+       <wsdl:message name="getMediaMetadataRequest">\r
+               <wsdl:part name="mediaKey" element="pbs:mediaKeyContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaMetadataResponse">\r
+               <wsdl:part name="metadata" element="pbs:mediaMetadataContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaInstanceMetadataRequest">\r
+               <wsdl:part name="mediaKey" element="pbs:mediaInstanceKeyContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaInstanceMetadataResponse">\r
+               <wsdl:part name="metadata" element="pbs:mediaMetadataContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaMetadataChangedRequest">\r
+               <wsdl:part name="range" element="pbs:lastModifiedDateTimeRangeContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaMetadataChangedResponse">\r
+               <wsdl:part name="metadata" element="pbs:mediaListContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaUsageRequest">\r
+               <wsdl:part name="mediaKey" element="pbs:mediaUsageMediaKeyContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaUsageResponse">\r
+               <wsdl:part name="mediaUsage" element="pbs:mediaUsageContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaUsageByUTRangeRequest">\r
+               <wsdl:part name="range" element="pbs:dateTimecodeRangeContainer"/>\r
+               <wsdl:part name="availableMedia" element="pbs:bAvailableMedia"/>\r
+               <wsdl:part name="unavailableMedia" element="pbs:bUnavailableMedia"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getMediaUsageByUTRangeResponse">\r
+               <wsdl:part name="mediaUsageList" element="pbs:mediaUsageListContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="deleteMediaInstanceRequest">\r
+               <wsdl:part name="mediaKey" element="pbs:deleteMediaInstanceKeyContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="deleteMediaInstanceResponse">\r
+               <wsdl:part name="deleteMediaInstanceContainer" element="pbs:deleteMediaInstanceContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="heartbeatRequest">\r
+               <wsdl:part name="Id" element="pbs:nHeartbeatId"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="heartbeatResponse">\r
+               <wsdl:part name="Id" element="pbs:nHeartbeatId"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="listGetEventCountRequest">\r
+               <wsdl:part name="listName" element="pbs:strListName"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="listGetEventCountResponse">\r
+               <wsdl:part name="eventCount" element="pbs:nEventCount"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getListEventRequest">\r
+               <wsdl:part name="eventKey" element="pbs:eventId"/>\r
+               <wsdl:part name="listName" element="pbs:strListName"/>\r
+               <wsdl:part name="includeChildEvents" element="pbs:bIncludeChildEvents"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getListEventResponse">\r
+               <wsdl:part name="queriedPlaylistPrimaryEvent" element="pbs:eventContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getContiguousListEventsRequest">\r
+               <wsdl:part name="eventCount" element="pbs:nEventCount"/>\r
+               <wsdl:part name="eventKey" element="pbs:eventId"/>\r
+               <wsdl:part name="listName" element="pbs:strListName"/>\r
+               <wsdl:part name="includeChildEvents" element="pbs:bIncludeChildEvents"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getContiguousListEventsResponse">\r
+               <wsdl:part name="getContiguousListEventsOutput" element="pbs:getContiguousListEventsOutput"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getListEventChangesRequest">\r
+               <wsdl:part name="eventTypeFilter" element="pbs:eventUpdateType"/>\r
+               <wsdl:part name="range" element="pbs:dateTimecodeRangeContainer"/>\r
+               <wsdl:part name="listName" element="pbs:strListName"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getListEventChangesResponse">\r
+               <wsdl:part name="getListEventChangesOutput" element="pbs:getListEventChangesOutput"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="insertUpdateJobRequest">\r
+               <wsdl:part name="job" element="pbs:jobContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="insertUpdateJobResponse">\r
+               <wsdl:part name="jobId" element="pbs:nJobId"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="insertUpdateScheduledJobRequest">\r
+               <wsdl:part name="job" element="pbs:scheduledJobContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="insertUpdateScheduledJobResponse">\r
+               <wsdl:part name="jobId" element="pbs:nScheduledJobId"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="deleteJobRequest">\r
+               <wsdl:part name="jobId" element="pbs:nJobId"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="deleteJobResponse"/>\r
+       <wsdl:message name="deleteScheduledJobRequest">\r
+               <wsdl:part name="jobId" element="pbs:nScheduledJobId"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="deleteScheduledJobResponse"/>\r
+       <wsdl:message name="getComponentListResponse">\r
+               <wsdl:part name="componentList" element="pbs:componentListContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getComponentListRequest">\r
+               <wsdl:part name="componentTag" element="pbs:componentTagContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getNonContiguousListEventsRequest">\r
+               <wsdl:part name="eventIdList" element="pbs:eventIdListContainer"/>\r
+               <wsdl:part name="listName" element="pbs:strListName"/>\r
+               <wsdl:part name="includeChildEvents" element="pbs:bIncludeChildEvents"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getNonContiguousListEventsResponse">\r
+               <wsdl:part name="getNonContiguousListEventsOutput" element="pbs:getNonContiguousListEventsOutput"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getListEventChangesAuxXMLRequest">\r
+               <wsdl:part name="includeEmptyAuxXmlEvents" element="pbs:bIncludeEmptyAuxXmlEvents"/>\r
+               <wsdl:part name="eventIdList" element="pbs:eventIdListContainer"/>\r
+               <wsdl:part name="listName" element="pbs:strListName"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getListEventChangesAuxXMLResponse">\r
+               <wsdl:part name="getListEventChangesAuxXMLOutput" element="pbs:getListEventChangesAuxXMLOutput"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="setConfigurationRequest">\r
+               <wsdl:part name="setConfig" element="pbs:configContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="setConfigurationResponse"/>\r
+       <wsdl:message name="getConfigurationRequest">\r
+               <wsdl:part name="Config" element="pbs:configRequestListContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getConfigurationResponse">\r
+               <wsdl:part name="config" element="pbs:configContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getJobStateChangesRequest">\r
+               <wsdl:part name="range" element="pbs:jobStateDateTimecodeRangeContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getJobStateChangesResponse">\r
+               <wsdl:part name="jobList" element="pbs:jobListContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getScheduledJobStateChangesRequest">\r
+               <wsdl:part name="range" element="pbs:scheduledJobStateDateTimecodeRangeContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getScheduledJobStateChangesResponse">\r
+               <wsdl:part name="jobList" element="pbs:scheduledJobListContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getJobsForMediaRequest">\r
+               <wsdl:part name="media" element="pbs:getJobsForMediaRequestContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getJobsForMediaResponse">\r
+               <wsdl:part name="jobListContainer" element="pbs:jobListContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getScheduledJobsForMediaRequest">\r
+               <wsdl:part name="media" element="pbs:getScheduledJobsForMediaRequestContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getScheduledJobsForMediaResponse">\r
+               <wsdl:part name="scheduledJobListContainer" element="pbs:scheduledJobListContainer"/>\r
+       </wsdl:message> \r
+       <wsdl:message name="getJobRequest">\r
+               <wsdl:part name="job" element="pbs:getJobRequestContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getJobResponse">\r
+               <wsdl:part name="job" element="pbs:jobContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getScheduledJobRequest">\r
+               <wsdl:part name="job" element="pbs:getScheduledJobRequestContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getScheduledJobResponse">\r
+               <wsdl:part name="job" element="pbs:scheduledJobContainer"/>\r
+       </wsdl:message> \r
+       <wsdl:message name="getCustomViewRequest">\r
+               <wsdl:part name="marinaCustomAPI" element="pbs:getCustomViewRequestContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:message name="getCustomViewResponse">\r
+               <wsdl:part name="mediaList" element="pbs:getCustomViewResponseContainer"/>\r
+       </wsdl:message>\r
+       <wsdl:portType name="PBSMarinaAPI">\r
+               <wsdl:operation name="insertUpdateMediaMetadata">\r
+                       <wsdl:documentation>Inserts or updates media and/or media instance metadata in the marina database.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:insertUpdateMediaMetadataRequest"/>\r
+                       <wsdl:output message="pbs:insertUpdateMediaMetadataResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaMetadata">\r
+                       <wsdl:documentation>Returns metadata for the specified media/media instances.  See definition of pbs:media.  \r
+The media key must be specified and optionally media instance keys (mediaSets).  \r
+If no media instances are requested, metadata for all instances are returned.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getMediaMetadataRequest"/>\r
+                       <wsdl:output message="pbs:getMediaMetadataResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaUsage">\r
+                       <wsdl:documentation>Returns playout usage of the specified media.  \r
+The media key must be specified and optionally media instance keys (media sets).  \r
+If no instances are specified the usage of all instances of that media are returned.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getMediaUsageRequest"/>\r
+                       <wsdl:output message="pbs:getMediaUsageResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaUsageByUTRange">\r
+                       <wsdl:documentation>Returns the playout usage for all media within a specified timecode range.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getMediaUsageByUTRangeRequest"/>\r
+                       <wsdl:output message="pbs:getMediaUsageByUTRangeResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="heartbeat">\r
+                       <wsdl:documentation>The heartbeat ID is client generated and is echoed back to the caller by the PBS API.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:heartbeatRequest"/>\r
+                       <wsdl:output message="pbs:heartbeatResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getListEventCount">\r
+                       <wsdl:input message="pbs:listGetEventCountRequest"/>\r
+                       <wsdl:output message="pbs:listGetEventCountResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getListEvent">\r
+                       <wsdl:documentation>Returns the 'event' event with the queried event id and list.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getListEventRequest"/>\r
+                       <wsdl:output message="pbs:getListEventResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getContiguousListEvents">\r
+                       <wsdl:documentation>Returns the 'playlistPrimaryEvent' event with an event id of 'eventKey' including the \r
+next 'nEventCount'  events in an 'eventList'.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getContiguousListEventsRequest"/>\r
+                       <wsdl:output message="pbs:getContiguousListEventsResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getNonContiguousListEvents">\r
+                       <wsdl:documentation>Returns a list of events specified in 'eventIdList'.\r
+Deleted/missing events are returned in the 'deletedEvents' eventIdList.\r
+If more events are queried than the maximum configured amount then non-queried \r
+events are returned in the 'nonQueriedEvents' eventIdList getNonContiguousListEvents\r
+can then be called again passing in the list. When this list is empty all events were \r
+queried.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getNonContiguousListEventsRequest"/>\r
+                       <wsdl:output message="pbs:getNonContiguousListEventsResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getListEventChanges">\r
+                       <wsdl:documentation>Returns a list of event ids for all events that have changed in the specified list \r
+between the specified dates/times filtered by an event type.\r
+Note: It is possible this method will return more events than is supported by\r
+getNonContiguousListEvents.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getListEventChangesRequest"/>\r
+                       <wsdl:output message="pbs:getListEventChangesResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getComponentList">\r
+                       <wsdl:documentation>Returns a list of components that meet the filter requirements.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getComponentListRequest"/>\r
+                       <wsdl:output message="pbs:getComponentListResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="insertUpdateJob">\r
+                       <wsdl:documentation>Returns the job id of the created/updated job on success.\r
+Note: You must send the job uid on an update.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:insertUpdateJobRequest"/>\r
+                       <wsdl:output message="pbs:insertUpdateJobResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="insertUpdateScheduledJob">\r
+                       <wsdl:documentation>\r
+        Returns the job id of the created/updated scheduled job on success.\r
+        Note: You must send the job uid on an update.\r
+      </wsdl:documentation>\r
+                       <wsdl:input message="pbs:insertUpdateScheduledJobRequest"/>\r
+                       <wsdl:output message="pbs:insertUpdateScheduledJobResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="deleteJob">\r
+                       <wsdl:documentation>Delete a job using the id returned by 'insertUpdateJob'.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:deleteJobRequest"/>\r
+                       <wsdl:output message="pbs:deleteJobResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="deleteScheduledJob">\r
+                       <wsdl:documentation>Delete a job using the id returned by 'insertUpdateJob'.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:deleteScheduledJobRequest"/>\r
+                       <wsdl:output message="pbs:deleteScheduledJobResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="deleteMediaInstance">\r
+                       <wsdl:documentation>Delete a media instance (or multiple media instances). \r
+The media key must be specified and optionally media instance keys (media sets).  \r
+If no instances are specified, all instances of that media will be deleted from all the media sets.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:deleteMediaInstanceRequest"/>\r
+                       <wsdl:output message="pbs:deleteMediaInstanceResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getListEventChangesAuxXML">\r
+                       <wsdl:documentation>Return the updated jobs database auxillary XML. At the moment this is just used for\r
+returning reconcile keys for a given list of deleted event UIDs. Events with no aux \r
+xml stored for them can be returned by setting the include empty aux xml events flag\r
+and will be returned in an event id list.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getListEventChangesAuxXMLRequest"/>\r
+                       <wsdl:output message="pbs:getListEventChangesAuxXMLResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="setConfiguration">\r
+                       <wsdl:input message="pbs:setConfigurationRequest"/>\r
+                       <wsdl:output message="pbs:setConfigurationResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getConfiguration">\r
+                       <wsdl:input message="pbs:getConfigurationRequest"/>\r
+                       <wsdl:output message="pbs:getConfigurationResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaMetadataChanged">\r
+                       <wsdl:input message="pbs:getMediaMetadataChangedRequest"/>\r
+                       <wsdl:output message="pbs:getMediaMetadataChangedResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getJobStateChanges">\r
+                       <wsdl:documentation>Returns a job list of all jobs whose state has changed between the dates/times.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getJobStateChangesRequest"/>\r
+                       <wsdl:output message="pbs:getJobStateChangesResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getScheduledJobStateChanges">\r
+                       <wsdl:documentation>Returns a job list of all scheduled jobs whose state has changed between the dates/times.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getScheduledJobStateChangesRequest"/>\r
+                       <wsdl:output message="pbs:getScheduledJobStateChangesResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getJobsForMedia">\r
+                       <wsdl:documentation>Returns a list of all the automation jobs and their current state relating to the media.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getJobsForMediaRequest"/>\r
+                       <wsdl:output message="pbs:getJobsForMediaResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getScheduledJobsForMedia">\r
+                       <wsdl:documentation>Returns a list of all the scheduled jobs and their current state relating to the media.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getScheduledJobsForMediaRequest"/>\r
+                       <wsdl:output message="pbs:getScheduledJobsForMediaResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getJob">\r
+                       <wsdl:documentation>Returns the job with the queried job id and type.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getJobRequest"/>\r
+                       <wsdl:output message="pbs:getJobResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getScheduledJob">\r
+                       <wsdl:documentation>Returns the scheduled job with the queried job id and type.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getScheduledJobRequest"/>\r
+                       <wsdl:output message="pbs:getScheduledJobResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaInstanceMetadata">\r
+                       <wsdl:documentation>Returns metadata for the specified media instance.  See definition of pbs:mediaInstance.  \r
+The media key must be specified and optionally media instance keys (mediaSets).  \r
+If no media instances are requested, metadata for all instances are returned.</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getMediaInstanceMetadataRequest"/>\r
+                       <wsdl:output message="pbs:getMediaInstanceMetadataResponse"/>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getCustomView">\r
+                       <wsdl:documentation>Returns a medialist of rows returned by the specified custom view</wsdl:documentation>\r
+                       <wsdl:input message="pbs:getCustomViewRequest"/>\r
+                       <wsdl:output message="pbs:getCustomViewResponse"/>\r
+               </wsdl:operation>\r
+       </wsdl:portType>\r
+       <wsdl:binding name="PBSMarinaAPIBindingSOAP" type="pbs:PBSMarinaAPI">\r
+               <soap12:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>\r
+               <wsdl:operation name="insertUpdateMediaMetadata">\r
+                       <soap12:operation soapAction="/insertUpdateMediaMetadata" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaMetadata">\r
+                       <soap12:operation soapAction="/getMediaMetadata" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaUsage">\r
+                       <soap12:operation soapAction="/getMediaUsage" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaUsageByUTRange">\r
+                       <soap12:operation soapAction="/getMediaUsageByUTRange" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="deleteMediaInstance">\r
+                       <soap12:operation soapAction="/deleteMediaInstance" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="heartbeat">\r
+                       <soap12:operation soapAction="/heartbeat" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getListEventCount">\r
+                       <soap12:operation soapAction="/getListEventCount" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getListEvent">\r
+                       <soap12:operation soapAction="/getListEvent" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getContiguousListEvents">\r
+                       <soap12:operation soapAction="/getContiguousListEvents" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getNonContiguousListEvents">\r
+                       <soap12:operation soapAction="/getNonContiguousListEvents" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getListEventChanges">\r
+                       <soap12:operation soapAction="/getListEventChanges" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getComponentList">\r
+                       <soap12:operation soapAction="/getComponentList" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="insertUpdateJob">\r
+                       <soap12:operation soapAction="/insertUpdateJob" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="insertUpdateScheduledJob">\r
+                       <soap12:operation soapAction="/insertUpdateScheduledJob" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="deleteJob">\r
+                       <soap12:operation soapAction="/deleteJob" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="deleteScheduledJob">\r
+                       <soap12:operation soapAction="/deleteScheduledJob" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getListEventChangesAuxXML">\r
+                       <soap12:operation soapAction="/getListEventChangesAuxXML" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="setConfiguration">\r
+                       <soap12:operation soapAction="/setConfiguration" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getConfiguration">\r
+                       <soap12:operation soapAction="/getConfiguration" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaMetadataChanged">\r
+                       <soap12:operation soapAction="/getMediaMetadataChanged" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getJobStateChanges">\r
+                       <soap12:operation soapAction="/getJobStateChanges" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getScheduledJobStateChanges">\r
+                       <soap12:operation soapAction="/getScheduledJobStateChanges" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getJobsForMedia">\r
+                       <soap12:operation soapAction="/getJobsForMedia" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getScheduledJobsForMedia">\r
+                       <soap12:operation soapAction="/getScheduledJobsForMedia" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getJob">\r
+                       <soap12:operation soapAction="/getJob" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getScheduledJob">\r
+                       <soap12:operation soapAction="/getScheduledJob" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getMediaInstanceMetadata">\r
+                       <soap12:operation soapAction="/getMediaInstanceMetadata" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+               <wsdl:operation name="getCustomView">\r
+                       <soap12:operation soapAction="/getCustomView" soapActionRequired="true"/>\r
+                       <wsdl:input>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:input>\r
+                       <wsdl:output>\r
+                               <soap12:body use="literal"/>\r
+                       </wsdl:output>\r
+               </wsdl:operation>\r
+       </wsdl:binding>\r
+       <wsdl:service name="PBSMarinaAPIService">\r
+               <wsdl:port name="PBSMarinaAPISOAPPort" binding="pbs:PBSMarinaAPIBindingSOAP">\r
+                       <soap12:address location="http://127.0.0.1:18083"/>\r
+               </wsdl:port>\r
+       </wsdl:service>\r
+</wsdl:definitions>\r
+<!--\r
+*****************************************************************\r
+# $History: /Marina_1_1_0/source/xml/API/MarinaAPI.wsdl $\r
+# \r
+# ****************** Version 35 ****************** \r
+# User: sarah.wright   Date: 2014-09-17   Time: 16:09:31+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/API \r
+# Added new API function called getMediaInstanceMetadata \r
+# \r
+# ****************** Version 34 ****************** \r
+# User: Edward.Thurman   Date: 2014-07-18   Time: 17:38:19+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/API \r
+# getJobForMedia and getScheduledJobForMedia commands added to retrieve jobs \r
+# of a particular media name and type, and getJob and getScheduledJob \r
+# commands added to retrieve the queried job details. \r
+# \r
+# ****************** Version 33 ****************** \r
+# User: Edward.Thurman   Date: 2014-06-20   Time: 15:53:23+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/API \r
+# Removed a duplicate message definition that was causing the wsdl to fail \r
+# validation. \r
+# \r
+# ****************** Version 32 ****************** \r
+# User: ignazio.castrogiovanni   Date: 2014-03-29   Time: 09:33:13+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/API \r
+# XML changes for the inserUpdateScheduledJob API \r
+# \r
+# ****************** Version 31 ****************** \r
+# User: Edward.Thurman   Date: 2014-03-27   Time: 17:25:56+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/API \r
+# Added state change notifications for automated and scheduled jobs, in \r
+# addition to the API getters for such state changes. \r
+# \r
+# ****************** Version 30 ****************** \r
+# User: jose.valencia   Date: 2013-11-21   Time: 15:31:42+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/API \r
+# Added a new deleteMediaInstance operation. \r
+# \r
+# ****************** Version 29 ****************** \r
+# User: michael.cullen   Date: 2013-10-17   Time: 17:00:47+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/API \r
+# MAR-6685 - getMediaMetadataChanged fixes \r
+# \r
+# ****************** Version 28 ****************** \r
+# User: jacopo.vezzosi   Date: 2013-07-03   Time: 09:24:25+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/API \r
+# Additional command getMediaMetadataChanged supported in the API for \r
+# MediaGenix. \r
+# \r
+# ****************** Version 26 ****************** \r
+# User: james.mbowa   Date: 2012-08-23   Time: 16:16:06+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Added two new function getConfiguration and setConfiguration. bug No. 12712 \r
+# \r
+# ****************** Version 25 ****************** \r
+# User: phil.lee   Date: 2012-05-25   Time: 11:01:49+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Changed an event UID from an xs:int to an xs:integer to allow for a 64 bit \r
+# number. \r
+# \r
+# ****************** Version 24 ****************** \r
+# User: phil.lee   Date: 2011-11-03   Time: 15:48:22+00:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Added new getListEventChangesAuxXML function. \r
+# \r
+# ****************** Version 23 ****************** \r
+# User: phil.lee   Date: 2011-06-27   Time: 10:02:38+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Updated the following schema types getContiguousListEventsOutput, \r
+# getNonContiguousListEventsOutput and getListEventChangesOutput to bring \r
+# in-line with the API responses. All return types should now validate \r
+# against the schema types. \r
+# \r
+# ****************** Version 22 ****************** \r
+# User: peter.brown   Date: 2011-06-20   Time: 16:18:12+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# fixed urn#: soap actions for getNonContiguouseveents and deleteJob commands \r
+# \r
+# ****************** Version 21 ****************** \r
+# User: phil.lee   Date: 2011-06-20   Time: 15:10:42+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Renamed parameter 1 on the method getContiguousListEvents from \r
+# getContiguousListEventsInput to eventCount. \r
+# \r
+# ****************** Version 20 ****************** \r
+# User: phil.lee   Date: 2011-06-17   Time: 13:06:15+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Updated so that input parameters are not longer stored in one type. Added a \r
+# new type nextEventId to prevent any confusion. \r
+# \r
+# ****************** Version 19 ****************** \r
+# User: phil.lee   Date: 2011-06-10   Time: 14:55:32+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Updated after changes to make API work with VS .NET. \r
+# \r
+# ****************** Version 18 ****************** \r
+# User: phil.lee   Date: 2011-06-09   Time: 11:38:03+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Updated to use SOAP v1.2. \r
+# \r
+# ****************** Version 17 ****************** \r
+# User: phil.lee   Date: 2011-05-23   Time: 11:02:39+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Renamed Holder to Container. \r
+# \r
+# ****************** Version 16 ****************** \r
+# User: phil.lee   Date: 2011-05-19   Time: 16:15:29+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Update getNonContiguousListEvents method so that the return parameters were \r
+# unique types in order to get gSoap code to compile. \r
+# \r
+# ****************** Version 15 ****************** \r
+# User: phil.lee   Date: 2011-05-18   Time: 10:21:34+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# First pass of the Marina API upgrade. Still to be finished \r
+# getNonContiguousListEvents, getListEventChanges, insertUpdateJob and \r
+# deleteJob. There is some configuration options, currently hardcoded, to be \r
+# added as well. \r
+# \r
+# ****************** Version 14 ****************** \r
+# User: phil.lee   Date: 2010-10-21   Time: 10:12:30+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Updated to put all messages and types in a 'pbs' namespace. \r
+# \r
+# ****************** Version 13 ****************** \r
+# User: peter.brown   Date: 2010-09-16   Time: 10:34:34+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# \r
+# ****************** Version 12 ****************** \r
+# User: peter.brown   Date: 2010-09-14   Time: 16:03:26+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# simple reformatted some of the annotations so the diagrams look prettier \r
+# when auto generated. \r
+# \r
+# ****************** Version 11 ****************** \r
+# User: phil.lee   Date: 2010-09-13   Time: 16:48:16+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# \r
+# ****************** Version 10 ****************** \r
+# User: phil.lee   Date: 2010-09-13   Time: 16:06:18+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# Added new Heartbeat method to WSDL file. \r
+# \r
+# ****************** Version 9 ****************** \r
+# User: phil.lee   Date: 2010-05-19   Time: 15:50:43+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# \r
+# ****************** Version 8 ****************** \r
+# User: phil.lee   Date: 2010-05-19   Time: 12:25:55+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# \r
+# ****************** Version 7 ****************** \r
+# User: phil.lee   Date: 2010-05-12   Time: 17:13:44+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# \r
+# ****************** Version 6 ****************** \r
+# User: phil.lee   Date: 2010-04-19   Time: 16:53:46+01:00 \r
+# Updated in: /Marina/source/xml/API \r
+# \r
+# ****************** Version 4 ****************** \r
+# User: paul.hatcher   Date: 2010-03-22   Time: 18:36:54+00:00 \r
+# Updated in: /Marina/source/xml/API \r
+*****************************************************************\r
+-->\r
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/peablebeach/MediaUsageComparator.java b/server/user.jobengine.osgi.commons/src/user/commons/peablebeach/MediaUsageComparator.java
new file mode 100644 (file)
index 0000000..5645149
--- /dev/null
@@ -0,0 +1,42 @@
+package user.commons.peablebeach;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Comparator;\r
+import java.util.List;\r
+\r
+import pb.wsclient.MediaInstanceUsage;\r
+import pb.wsclient.MediaUsage;\r
+import pb.wsclient.MediaUsage.MediaInstancesUsage;\r
+\r
+class MediaUsageComparator<T> implements Comparator<MediaUsage> {\r
+\r
+       //Compares its two arguments for order.\r
+       @Override\r
+       public int compare(MediaUsage mu1, MediaUsage mu2) {\r
+               String mu1FirstTime = getEarliestUsageTime(mu1);\r
+               String mu2FirstTime = getEarliestUsageTime(mu2);\r
+               return mu1FirstTime.compareTo(mu2FirstTime);\r
+       }\r
+\r
+       //Indicates whether some other object is "equal to" this comparator.\r
+       @Override\r
+       public boolean equals(Object obj) {\r
+               return false;\r
+       }\r
+\r
+       private String getEarliestUsageTime(MediaUsage mu) {\r
+               MediaInstancesUsage muUsage = mu.getMediaInstancesUsage();\r
+               List<MediaInstanceUsage> muUsageList = muUsage.getMediaInstanceUsage();\r
+               List<String> sortedEarliest = new ArrayList<String>();\r
+               for (MediaInstanceUsage usage : muUsageList) {\r
+                       sortedEarliest.add(usage.getEarliestUsageTime());\r
+               }\r
+               Collections.sort(sortedEarliest);\r
+               if (sortedEarliest.size() > 0) {\r
+                       return sortedEarliest.get(0);\r
+               } else {\r
+                       return null;\r
+               }\r
+       }\r
+}
\ No newline at end of file
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/peablebeach/PBMissingMaterialSrc.java b/server/user.jobengine.osgi.commons/src/user/commons/peablebeach/PBMissingMaterialSrc.java
new file mode 100644 (file)
index 0000000..860d13a
--- /dev/null
@@ -0,0 +1,202 @@
+package user.commons.peablebeach;\r
+\r
+//import pb.wsclient;\r
+import java.net.URL;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Calendar;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.LinkedHashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import javax.xml.ws.BindingProvider;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import pb.wsclient.DateTimecodeRange;\r
+import pb.wsclient.DateTimecodeRangeContainer;\r
+import pb.wsclient.GetCustomViewRequestContainer;\r
+import pb.wsclient.GetCustomViewResponseContainer;\r
+import pb.wsclient.Media;\r
+import pb.wsclient.MediaList;\r
+import pb.wsclient.MediaType;\r
+import pb.wsclient.MediaUsage;\r
+import pb.wsclient.MediaUsageList;\r
+import pb.wsclient.MediaUsageListContainer;\r
+import pb.wsclient.PBClientTest;\r
+import pb.wsclient.PBSMarinaAPI;\r
+import pb.wsclient.PBSMarinaAPIService;\r
+\r
+/**\r
+ * PebbleBeach missing material source. Soap ws hivasokkal kerdezi le a hianyzo allomanyokat.\r
+ */\r
+public class PBMissingMaterialSrc {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private SimpleDateFormat sdf_range = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:'00'");\r
+       private URL wsdlURL = null;\r
+       private PBSMarinaAPI primaryMarinaAPI = null;\r
+       private PBSMarinaAPI secondaryMarinaAPI = null;\r
+       private int rangeForwardHours = 24;\r
+\r
+       private PBSMarinaAPI createPBMarinaAPI(String endPointUrl, URL wsdlURL, String soapUserId, String soapUserPassword) throws Exception {\r
+               PBSMarinaAPIService api = new PBSMarinaAPIService(wsdlURL);\r
+               PBSMarinaAPI bpsPort = api.getPBSMarinaAPISOAPPort();\r
+               BindingProvider bindingProvider = (BindingProvider) bpsPort;\r
+\r
+               Map<String, Object> context = bindingProvider.getRequestContext();\r
+               context.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endPointUrl);\r
+\r
+               if (StringUtils.isNotBlank(soapUserId) && StringUtils.isNotBlank(soapUserPassword)) {\r
+                       context.put(BindingProvider.USERNAME_PROPERTY, soapUserId); //pbs\r
+                       context.put(BindingProvider.PASSWORD_PROPERTY, soapUserPassword); //pbs\r
+               }\r
+               return bpsPort;\r
+       }\r
+\r
+       /***\r
+        * A PeableBeach altal lehetseges missing material statuszu mediak nevei, amik nincsenek a BeachPool-ban\r
+        *\r
+        * @param poolContent\r
+        *            Egyszintu BeachPool lista\r
+        * @throws Exception\r
+        */\r
+       public LinkedHashSet<String> getPossibelMissingMaterialNames(List<String> poolContent) throws Exception {\r
+               //get sortable\r
+               List<MediaUsage> sortedMediaUsages = querySortableMedias();\r
+               //sort by earliestusagetime\r
+               Collections.sort(sortedMediaUsages, new MediaUsageComparator<MediaUsage>());\r
+               //normalize\r
+               LinkedHashSet<String> result = normalizeName(sortedMediaUsages);\r
+               //collect more\r
+               LinkedHashSet<String> otherMedias = queryOtherMedias(result);\r
+               result.addAll(otherMedias);\r
+               //get only realy missing\r
+               if (poolContent != null)\r
+                       result.removeAll(poolContent);\r
+               return result;\r
+\r
+       }\r
+\r
+       public void init(String primaryEndPoint, String primaryUserName, String primaryPassword, String secondaryEndPoint, String secondaryUserName,\r
+                       String secondaryPassword, int rangeForwardHours) throws Exception {\r
+               this.wsdlURL = PBClientTest.class.getClassLoader().getResource("MarinaAPI.wsdl");\r
+               this.primaryMarinaAPI = createPBMarinaAPI(primaryEndPoint, this.wsdlURL, primaryUserName, primaryPassword);\r
+               if (StringUtils.isNotBlank(secondaryEndPoint))\r
+                       this.secondaryMarinaAPI = createPBMarinaAPI(secondaryEndPoint, this.wsdlURL, secondaryUserName, secondaryPassword);\r
+\r
+               this.rangeForwardHours = rangeForwardHours;\r
+       }\r
+\r
+       /***\r
+        * A nem ures media neveket kisbetusse konvertalja\r
+        *\r
+        * @param mediaUsages\r
+        * @return\r
+        */\r
+       private LinkedHashSet<String> normalizeName(List<MediaUsage> mediaUsages) {\r
+               LinkedHashSet<String> result = new LinkedHashSet<String>();\r
+               for (MediaUsage mediaUsage : mediaUsages) {\r
+                       String name = normalizeName(mediaUsage.getMediaName());\r
+                       if (StringUtils.isNotBlank(name))\r
+                               result.add(name);\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private String normalizeName(String mediaName) {\r
+               String result = null;\r
+               if (StringUtils.isNotBlank(mediaName)) {\r
+                       result = mediaName.trim().toLowerCase();\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private LinkedHashSet<String> queryOtherMedias(LinkedHashSet<String> missingMediaFileNames) throws Exception {\r
+\r
+               LinkedHashSet<String> ret = new LinkedHashSet<String>();\r
+\r
+               //SOAP Request\r
+               GetCustomViewRequestContainer cvReqContainer = new GetCustomViewRequestContainer();\r
+               GetCustomViewRequestContainer.MarinaCustomAPI customApi = new GetCustomViewRequestContainer.MarinaCustomAPI();\r
+               cvReqContainer.setMarinaCustomAPI(customApi);\r
+               customApi.setView("cxvMissingMediaPlaylistCache"); //config +++++\r
+\r
+               GetCustomViewResponseContainer cvContainer = null;\r
+               try {\r
+                       //call ws\r
+                       cvContainer = primaryMarinaAPI.getCustomView(cvReqContainer);\r
+               } catch (Exception e) {\r
+                       logger.error("", e);\r
+                       if (secondaryMarinaAPI != null) {\r
+                               cvContainer = secondaryMarinaAPI.getCustomView(cvReqContainer);\r
+                       }\r
+               }\r
+\r
+               //remove existing media files from list\r
+               if (cvContainer != null) {\r
+                       MediaList mediaList = cvContainer.getMediaList();\r
+                       if (mediaList != null) {\r
+                               for (Media media : mediaList.getMedia()) {\r
+                                       //CI12345 -> ci12345.mxf\r
+                                       String mediaName = media.getMediaName();\r
+\r
+                                       if (StringUtils.isNotBlank(mediaName)) {\r
+                                               mediaName = normalizeName(mediaName);\r
+                                               if (!missingMediaFileNames.contains(mediaName)) {\r
+                                                       ret.add(mediaName);\r
+                                               }\r
+                                       } else {\r
+                                               logger.error("PBMissingMaterialSrc.getCustomViewMediaList empty filename: " + media.getMediaName());\r
+                                       }\r
+\r
+                               }\r
+                       }\r
+               }\r
+               return ret;\r
+       }\r
+\r
+       private List<MediaUsage> querySortableMedias() throws Exception {\r
+               List<MediaUsage> result = new ArrayList<MediaUsage>();\r
+\r
+               DateTimecodeRangeContainer rangec = new DateTimecodeRangeContainer();\r
+               DateTimecodeRange range = new DateTimecodeRange();\r
+\r
+               long now = System.currentTimeMillis();\r
+               Calendar cal = Calendar.getInstance();\r
+               cal.setTimeInMillis(now);\r
+               cal.add(Calendar.HOUR_OF_DAY, this.rangeForwardHours); //24\r
+\r
+               String fromDateStr = sdf_range.format(new Date(now));\r
+               String toDateStr = sdf_range.format(cal.getTime());\r
+\r
+               //1. SOAP query missing media list\r
+\r
+               range.setStart(fromDateStr); //now                              "2019-03-26T10:00:00:00"\r
+               range.setEnd(toDateStr); //now + x hours                "2019-03-29T10:00:00:00"\r
+               rangec.setDateTimecodeRange(range);\r
+\r
+               MediaUsageListContainer mulc = null;\r
+               try {\r
+                       mulc = primaryMarinaAPI.getMediaUsageByUTRange(rangec, false, true);\r
+               } catch (Exception e) {\r
+                       logger.error("", e);\r
+                       if (secondaryMarinaAPI != null) {\r
+                               mulc = secondaryMarinaAPI.getMediaUsageByUTRange(rangec, false, true);\r
+                       }\r
+               }\r
+\r
+               MediaUsageList mul = mulc.getMediaUsageList();\r
+\r
+               List<MediaUsage> mediaList = mul.getMediaUsage();\r
+               for (MediaUsage mu : mediaList) {\r
+                       if (MediaType.VIDEO.equals(mu.getMediaType()))\r
+                               result.add(mu);\r
+               }\r
+               return result;\r
+       }\r
+\r
+}\r
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/peablebeach/include/MarinaTypes.xsd b/server/user.jobengine.osgi.commons/src/user/commons/peablebeach/include/MarinaTypes.xsd
new file mode 100644 (file)
index 0000000..3861a9d
--- /dev/null
@@ -0,0 +1,4510 @@
+<!-- edited with XMLSpy v2016 rel. 2 sp1 (x64) (http://www.altova.com) by Duncan Browne (Pebble Beach Systems Ltd) -->\r
+<!--\r
+*****************************************************************\r
+# $Logfile: /Marina_1_1_0/source/xml/include/MarinaTypes.xsd $\r
+# $Revision: 134 $\r
+# $Date: 2017-04-05 11:00:00+00:00 $\r
+# $Author: Edward.Thurman $ \r
+***************************************************************** \r
+\r
+*****************************************************************\r
+# $History: /Marina_1_1_0/source/xml/include/MarinaTypes.xsd $\r
+#\r
+# ****************** Version 137 ****************** \r
+# User: Javier.Torres   Date: 2017-10-06   Time: 12:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Fixed incompatibilities with current version of SQL Server.\r
+# cgProperties reworked and auxDataProperties type removed.\r
+#\r
+# ****************** Version 136 ****************** \r
+# User: Javier.Torres   Date: 2017-10-05   Time: 16:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added status and timecode into playlist properties.\r
+#\r
+# ****************** Version 135 ****************** \r
+# User: Filipe.Oliveira   Date: 2017-08-04   Time: 14:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added new fields deleteMediaRecord and crossDomain in delete\r
+# and also added field directoryId in mediaInstance.\r
+#\r
+# ****************** Version 134 ****************** \r
+# User: Edward.Thurman   Date: 2017-04-05   Time: 11:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Updating the documented creationTime format to YYYY-MM-DDTHH:MM:SS.\r
+#\r
+# ****************** Version 133 ****************** \r
+# User: Edward.Thurman   Date: 2017-03-03   Time: 10:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Updated automationStateType enums to replace deprecated values\r
+# with the new values used in Marina.\r
+#\r
+# ****************** Version 132 ****************** \r
+# User: Edward.Thurman   Date: 2016-12-13   Time: 17:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added the 'None' enum value to the Subtitle Caption Mode.\r
+#\r
+# ****************** Version 131 ****************** \r
+# User: Ammar.Alkadi   Date: 2016-10-03   Time: 10:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added new field alternateId in mediaBaseAttributes.\r
+#  \r
+# ****************** Version 130 ****************** \r
+# User: Matt.Davis   Date: 2016-08-16   Time: 10:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added new data type for three part animations.\r
+#\r
+# ****************** Version 129 ****************** \r
+# User: Sarah.Wright   Date: 2016-07-08   Time: 10:00:00+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Updated the datatype of attribute NativeSize to be an unsigned long (unsigned 64 bit)\r
+# Updated xsd's for the new audio format.\r
+#\r
+# ****************** Version 128 ****************** \r
+# User: Edward.Thurman   Date: 2016-03-24   Time: 15:31:47+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added the setting attribute to subtitle properties. \r
+# \r
+# ****************** Version 127 ****************** \r
+# User: Edward.Thurman   Date: 2015-01-05   Time: 10:56:47+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added eventPlayCount to media attributes. \r
+# \r
+# ****************** Version 126 ****************** \r
+# User: Edward.Thurman   Date: 2014-11-12   Time: 11:00:41+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added a 'confirmed' attribute to the job property's 'delete' element to \r
+# bring the schema into line with Marina. \r
+# \r
+# ****************** Version 125 ****************** \r
+# User: rob.dipaolo   Date: 2014-09-22   Time: 10:57:46+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added first/lastEventPlayTime \r
+# \r
+# ****************** Version 124 ****************** \r
+# User: clement.lavolle   Date: 2014-07-30   Time: 10:56:41+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added autoassociate to classification \r
+# \r
+# ****************** Version 123 ****************** \r
+# User: clement.lavolle   Date: 2014-07-30   Time: 10:55:00+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Sorting the components \r
+# \r
+# ****************** Version 122 ****************** \r
+# User: Edward.Thurman   Date: 2014-07-16   Time: 16:32:00+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# XSD corrected for the video properties to be job specific rather than \r
+# different for all media streams. \r
+# \r
+# ****************** Version 121 ****************** \r
+# User: ignazio.castrogiovanni   Date: 2014-03-29   Time: 09:33:13+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# XML changes for the inserUpdateScheduledJob API \r
+# \r
+# ****************** Version 120 ****************** \r
+# User: Edward.Thurman   Date: 2014-03-27   Time: 17:22:39+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added the automationStateType element, in addition to the jobState element \r
+# to a automation/scheduled job. \r
+# \r
+# ****************** Version 119 ****************** \r
+# User: Edward.Thurman   Date: 2014-02-04   Time: 17:47:36+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Update to the mediaBaseAttributes and mediaInstanceBaseAttributes to \r
+# conform to the record data returned by marina. \r
+# \r
+# ****************** Version 118 ****************** \r
+# User: mark.chettle   Date: 2014-01-10   Time: 16:38:44+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added Markup configXML and new asRun fields for channelID and channel name. \r
+# \r
+# ****************** Version 117 ****************** \r
+# User: Edward.Thurman   Date: 2013-12-13   Time: 15:18:51+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added languages type to the xml schema. \r
+# \r
+# ****************** Version 116 ****************** \r
+# User: Edward.Thurman   Date: 2013-12-13   Time: 14:57:09+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Updates to correct the schema for channelProperties, playlistPrimaryEvent \r
+# and playlistSecondaryEvent. \r
+# \r
+# ****************** Version 115 ****************** \r
+# User: jose.valencia   Date: 2013-11-21   Time: 15:31:35+00:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added a new deleteMedia type. \r
+# \r
+# ****************** Version 114 ****************** \r
+# User: michael.cullen   Date: 2013-10-17   Time: 17:00:46+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# MAR-6685 - getMediaMetadataChanged fixes \r
+# \r
+# ****************** Version 113 ****************** \r
+# User: Edward.Thurman   Date: 2013-10-04   Time: 16:40:07+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Added manualSecondary attribute to event. \r
+# \r
+# ****************** Version 112 ****************** \r
+# User: jacopo.vezzosi   Date: 2013-08-07   Time: 16:25:42+01:00 \r
+# Updated in: /Marina_1_1_0/source/xml/include \r
+# Restored the lastModifiedDateTimecodeRange type into the XSD file. \r
+# \r
+# ****************** Version 110 ****************** \r
+# User: james.mbowa   Date: 2012-11-05   Time: 16:08:21+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Add new complex type called "state" and added state to the \r
+# playlistPrimaryEvent, playlistSecondaryEvent and playlistActionEvent. \r
+# \r
+# ****************** Version 109 ****************** \r
+# User: matt.kaczynski   Date: 2012-09-05   Time: 16:53:05+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added an optional mediaLocation node to request properties xml. It is used \r
+# to specify the fields required by the RML resource allocation manager. \r
+# \r
+# ****************** Version 108 ****************** \r
+# User: phil.lee   Date: 2012-06-20   Time: 10:58:11+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added support for days into a timecode. The days component is optional so \r
+# timecodes can be in the format DDD:HH:MM:SS:FF or for backward \r
+# compatability HH:MM:SS:FF. \r
+# \r
+# ****************** Version 106 ****************** \r
+# User: david.mcdonald   Date: 2012-06-06   Time: 09:42:49+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated switcher effect "type" attribute values to match the enum in the \r
+# code, see bug 12116. \r
+# \r
+# ****************** Version 105 ****************** \r
+# User: david.mcdonald   Date: 2012-05-21   Time: 11:09:25+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Changed JobList XML to allow multiple transfer "destination" nodes. This is \r
+# needed for Cache Ingest. \r
+# \r
+# ****************** Version 104 ****************** \r
+# User: nick.dedekind   Date: 2012-04-10   Time: 10:52:47+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# 11699 - Multi-system database bridge support \r
+# \r
+# ****************** Version 103 ****************** \r
+# User: nick.dedekind   Date: 2012-02-08   Time: 15:49:08+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added scheduled record xml spec. \r
+# \r
+# ****************** Version 102 ****************** \r
+# User: peter.brown   Date: 2011-12-16   Time: 11:20:00+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# switch effect properties for source and destination are now optional (these \r
+# can be set via default properties in marina) \r
+# \r
+# ****************** Version 101 ****************** \r
+# User: peter.brown   Date: 2011-12-07   Time: 10:20:35+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# fixed up mediaSetLoose and some annotations for keeplist \r
+# \r
+# ****************** Version 100 ****************** \r
+# User: peter.brown   Date: 2011-12-02   Time: 16:49:14+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated following initial review \r
+# \r
+# ****************** Version 99 ****************** \r
+# User: peter.brown   Date: 2011-11-30   Time: 17:19:54+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# initial draft changes for keep List support \r
+# \r
+# ****************** Version 98 ****************** \r
+# User: david.mcdonald   Date: 2011-11-25   Time: 16:14:17+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Made "properties" node of asRunJob optional. Added source/destination \r
+# allocation attributes to asRunData node. \r
+# \r
+# ****************** Version 97 ****************** \r
+# User: peter.brown   Date: 2011-11-24   Time: 16:40:41+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added extra enum to errors for api and changes the sequence mode for the \r
+# switch child elements so that they can appear in any order \r
+# \r
+# ****************** Version 96 ****************** \r
+# User: rob.dipaolo   Date: 2011-09-19   Time: 20:27:14+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Fixed auxDataProperties type. \r
+# \r
+# ****************** Version 95 ****************** \r
+# User: david.mcdonald   Date: 2011-09-06   Time: 15:57:55+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated effectProperties so that the device/port allocation is now \r
+# contained in a switchAllocation element called "port". \r
+# \r
+# ****************** Version 94 ****************** \r
+# User: david.mcdonald   Date: 2011-08-01   Time: 13:55:29+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added "LoadOnly" option to CG properties. \r
+# \r
+# ****************** Version 93 ****************** \r
+# User: david.mcdonald   Date: 2011-07-27   Time: 18:58:24+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added direction to the mediaStream/cg/transition node. \r
+# \r
+# ****************** Version 91 ****************** \r
+# User: david.mcdonald   Date: 2011-06-27   Time: 14:54:31+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated switch properties for better handling of auto allocation and \r
+# logical ports. \r
+# \r
+# ****************** Version 90 ****************** \r
+# User: david.mcdonald   Date: 2011-06-14   Time: 11:41:43+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added a separate device attribute for outputs in the switchProperties xml. \r
+# \r
+# ****************** Version 89 ****************** \r
+# User: david.mcdonald   Date: 2011-06-13   Time: 15:23:26+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added attribute "disableRouting" in videoProperties. Updated annotations \r
+# and added "backupOutputPort" & "backupDevice" in the switchProperties XML. \r
+# \r
+# ****************** Version 88 ****************** \r
+# User: gavin.smith   Date: 2011-06-02   Time: 10:34:10+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added filesize attribute for mediainstances - see bug #8587 (this feature \r
+# is not complete/fully-implemented). \r
+# \r
+# ****************** Version 87 ****************** \r
+# User: mark.chettle   Date: 2011-05-25   Time: 16:54:32+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated xsd + AutomationDefs, changed the geestring for "Key Frame \r
+# generator" to "Thumbnail" and renamed "Marina Assistant" to "Assistant". \r
+# \r
+# ****************** Version 86 ****************** \r
+# User: peter.brown   Date: 2011-05-20   Time: 15:18:22+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# rolled back to v83 (removed the extra job type optional attributes that are \r
+# not needed) \r
+# \r
+# ****************** Version 83 ****************** \r
+# User: david.mcdonald   Date: 2011-05-17   Time: 09:52:58+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added "duration" attribute to dve effect properties. \r
+# \r
+# ****************** Version 82 ****************** \r
+# User: peter.brown   Date: 2011-05-16   Time: 16:36:23+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# made keyer element optional within effect properties; along with making \r
+# jobs optional in asRun element. Brings back in line with v80 which included \r
+# these bits; but dropped out when merging v81 \r
+# \r
+# ****************** Version 81 ****************** \r
+# User: phil.lee   Date: 2011-05-16   Time: 14:46:00+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added new types required by the Marina API upgrade. \r
+# \r
+# ****************** Version 80 ****************** \r
+# User: peter.brown   Date: 2011-05-16   Time: 11:58:20+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added new pgmPercent attribute to AudioOver effects. This is to allow the \r
+# main Program audio level to be adjusted when an audioOver effect is \r
+# applied. \r
+# \r
+# ****************** Version 79 ****************** \r
+# User: rob.dipaolo   Date: 2011-05-10   Time: 11:08:57+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# - Made embedded AsRun job xml optional. \r
+# - Added asRunJobProperties that combines Pri&Sec properties. \r
+# - Added activeRedundancyRole to asRunData. \r
+# - Added redundancyRole to asRunJob \r
+# - Updated Result & State enums to match proposed new values. \r
+# - Added 'message' attribute to 'error' element in asRun. \r
+# - Updated error enum to match latest set of event errors. \r
+# \r
+# ****************** Version 78 ****************** \r
+# User: phil.lee   Date: 2011-05-03   Time: 13:21:57+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated properties\event\comment to have a minimum length of 0. \r
+# \r
+# ****************** Version 77 ****************** \r
+# User: rob.dipaolo   Date: 2011-04-21   Time: 14:25:20+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated version type so it can handle 2-4 numbers. \r
+# \r
+# ****************** Version 76 ****************** \r
+# User: david.mcdonald   Date: 2011-04-06   Time: 11:28:38+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 72 ****************** \r
+# User: david.mcdonald   Date: 2011-04-01   Time: 08:58:53+01:00 \r
+# Updated in: /MarinaRedundantObjectsDev/source/xml/include \r
+# \r
+# ****************** Version 75 ****************** \r
+# User: david.mcdonald   Date: 2011-04-06   Time: 09:21:53+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 74 ****************** \r
+# User: peter.brown   Date: 2011-03-18   Time: 11:14:54+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added dolphinGraphic element to actions. \r
+# \r
+# ****************** Version 73 ****************** \r
+# User: rob.dipaolo   Date: 2011-03-17   Time: 14:38:54+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added validationMode to event, mediaStream and AudioShuffle properties. \r
+# \r
+# ****************** Version 72 ****************** \r
+# User: mark.chettle   Date: 2011-03-07   Time: 15:12:44+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added correct types for dolphinGraphicsProperties. \r
+# \r
+# ****************** Version 71 ****************** \r
+# User: mark.chettle   Date: 2011-03-04   Time: 18:29:55+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 70 ****************** \r
+# User: david.mcdonald   Date: 2011-02-22   Time: 09:15:12+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Fixed audio shuffle inputs and outputs are now strings instead of integers \r
+# to allow for names or numbers. \r
+# \r
+# ****************** Version 69 ****************** \r
+# User: peter.brown   Date: 2011-02-21   Time: 18:30:44+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated orderNo so that it is 1 based in both markup and mediaStream \r
+# elements. \r
+# \r
+# ****************** Version 68 ****************** \r
+# User: david.mcdonald   Date: 2011-02-16   Time: 09:29:28+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Fixed audioShuffle outputNo & inputNo are now "output" and "input" so they \r
+# can be defined as a port name or number. \r
+# \r
+# ****************** Version 67 ****************** \r
+# User: david.mcdonald   Date: 2011-02-15   Time: 12:28:04+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Changed the macro element in effectProperties->audioShuffle to uses the \r
+# macroProperties type and added an effect element to the feature properties. \r
+# \r
+# ****************** Version 66 ****************** \r
+# User: peter.brown   Date: 2011-01-27   Time: 15:06:07+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added: \r
+# 1. new fieldList element to features. This allows for support of custom \r
+# device drivers which may need to have additional parameters passed to the \r
+# device via the playlist. \r
+# 2. added new eventUsage types: CommercialBlock, BlockStart, BlockEnd \r
+# 3. added new block element beneath properties for scheduling commercial \r
+# blocks. \r
+# \r
+# ****************** Version 65 ****************** \r
+# User: rob.dipaolo   Date: 2011-01-25   Time: 16:41:13+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# - Added Channel info to playlist properties. \r
+# - Added 'auxData' element to all properties for custom bits. \r
+# - Added additional attributes to asRun error list to support error history. \r
+# - Added 'userObservation' element to asRunPrimaryEventList. \r
+# - Added 'txList' attribute to asRun data. \r
+# \r
+# ****************** Version 64 ****************** \r
+# User: peter.brown   Date: 2011-01-25   Time: 11:49:38+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# 1. Added "Bypass" to list of available enums for aspectRatio \r
+# 2. Changed segmentNo to orderNo to resolve inconsistency from media markup \r
+# to mediaStream markup in event. \r
+# \r
+# ****************** Version 63 ****************** \r
+# User: peter.brown   Date: 2011-01-20   Time: 13:54:26+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added houseID to eventProperties (requested by zdf). \r
+# \r
+# ****************** Version 62 ****************** \r
+# User: peter.brown   Date: 2011-01-04   Time: 11:03:52+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated: \r
+# feature: effect: dve attribute-> effect, \r
+# afd aspectRation attribute -> type \r
+# vps datetimetype attribute -> vpscodetype \r
+# markupItem/@som is now optional \r
+# added cg template field ('f') optional name attribute. \r
+# \r
+# ****************** Version 61 ****************** \r
+# User: peter.brown   Date: 2010-12-21   Time: 12:34:40+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# changed PriVideo enum to PrimaryVideo; and lyr to layer \r
+# \r
+# ****************** Version 60 ****************** \r
+# User: peter.brown   Date: 2010-12-20   Time: 18:26:31+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated asRun state/error to remove "for future use" \r
+# \r
+# ****************** Version 59 ****************** \r
+# User: peter.brown   Date: 2010-12-20   Time: 15:42:23+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# removed restriction element. The specific design of how this restriction \r
+# will work is as yet TBD and so it has been removed to avoid confusion. \r
+# \r
+# ****************** Version 58 ****************** \r
+# User: rob.dipaolo   Date: 2010-12-20   Time: 10:05:41+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added duration back to mediaStream properties for ingest. \r
+# \r
+# ****************** Version 56 ****************** \r
+# User: peter.brown   Date: 2010-12-16   Time: 17:26:17+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added AFD to typeEnum, and also removed teh "unused" elements which were \r
+# for future use. Finally; removed duration from mediaStream after \r
+# discussions about that being available in the schedule element. \r
+# \r
+# ****************** Version 55 ****************** \r
+# User: rob.dipaolo   Date: 2010-12-16   Time: 15:37:50+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added aspect ratio and TOD record bits. \r
+# \r
+# ****************** Version 54 ****************** \r
+# User: peter.brown   Date: 2010-12-15   Time: 18:14:50+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated effects element for dave. and added a slot and slotEnum type with \r
+# union to make the configuration of slots easier. \r
+# \r
+# ****************** Version 53 ****************** \r
+# User: rob.dipaolo   Date: 2010-12-15   Time: 15:19:27+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added VPS properties. \r
+# \r
+# ****************** Version 52 ****************** \r
+# User: peter.brown   Date: 2010-12-15   Time: 12:30:22+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updating annotations \r
+# \r
+# ****************** Version 51 ****************** \r
+# User: peter.brown   Date: 2010-12-14   Time: 13:46:57+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated PBSDolphinGraphicElement and mediaStream allocation sections. \r
+# \r
+# ****************** Version 50 ****************** \r
+# User: peter.brown   Date: 2010-12-13   Time: 18:42:01+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# fixed spelling mistakes \r
+# \r
+# ****************** Version 49 ****************** \r
+# User: peter.brown   Date: 2010-12-13   Time: 08:47:51+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# fixed spelling mistakes \r
+# \r
+# ****************** Version 48 ****************** \r
+# User: mark.chettle   Date: 2010-12-10   Time: 16:12:14+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated job with new types, Keyframe Generator, demo and Marina Assistant. \r
+# \r
+# ****************** Version 47 ****************** \r
+# User: rob.dipaolo   Date: 2010-12-10   Time: 15:24:52+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Removed references to teriary events and fixed some spelling mistakes. \r
+# \r
+# ****************** Version 46 ****************** \r
+# User: mark.chettle   Date: 2010-12-08   Time: 17:08:47+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 45 ****************** \r
+# User: rob.dipaolo   Date: 2010-12-08   Time: 14:09:55+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated switch properties for live event and removed allocationProperties. \r
+# \r
+# ****************** Version 43 ****************** \r
+# User: david.mcdonald   Date: 2010-11-29   Time: 09:43:44+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Created a new complex type for layers so that it is possible to remove them \r
+# from the switch properties xml in one call. \r
+# \r
+# ****************** Version 42 ****************** \r
+# User: eric.openshaw   Date: 2010-11-23   Time: 12:27:38-07:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated for features f/w \r
+# \r
+# ****************** Version 41 ****************** \r
+# User: nick.dedekind   Date: 2010-11-13   Time: 17:25:41+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# changed subtitle "mode" to "captionMode" \r
+# \r
+# ****************** Version 40 ****************** \r
+# User: eric.openshaw   Date: 2010-11-08   Time: 13:02:39-07:00 \r
+# Updated in: /Marina/source/xml/include \r
+# features/feature@type = global type "playlistEventType" \r
+# \r
+# ****************** Version 39 ****************** \r
+# User: eric.openshaw   Date: 2010-11-08   Time: 09:41:54-07:00 \r
+# Updated in: /Marina/source/xml/include \r
+# tweaks for trigger properties \r
+# \r
+# ****************** Version 38 ****************** \r
+# User: rob.dipaolo   Date: 2010-11-05   Time: 16:34:17+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added feature xml \r
+# \r
+# ****************** Version 37 ****************** \r
+# User: eric.openshaw   Date: 2010-11-04   Time: 16:35:59-06:00 \r
+# Updated in: /Marina/source/xml/include \r
+# changes for asRun \r
+# \r
+# ****************** Version 36 ****************** \r
+# User: nick.dedekind   Date: 2010-11-04   Time: 10:30:07+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated subtitle properties \r
+# \r
+# ****************** Version 35 ****************** \r
+# User: peter.brown   Date: 2010-11-02   Time: 18:43:34+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# first pass update of marinaTypes to include newer style xml asRun elements. \r
+# This brings the asRun log inline with the use of this #include file. this \r
+# is pending review, and is likely to have a few changes made. \r
+# \r
+# ****************** Version 34 ****************** \r
+# User: david.mcdonald   Date: 2010-11-02   Time: 16:28:11+00:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added transition type "<none>" as it makes sense for some switch effects to \r
+# have no transition or rate settings. \r
+# \r
+# ****************** Version 33 ****************** \r
+# User: peter.brown   Date: 2010-10-13   Time: 12:00:32+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated the comments referencing the mediaUsage element \r
+# \r
+# ****************** Version 32 ****************** \r
+# User: rob.dipaolo   Date: 2010-09-20   Time: 14:18:38+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# txList -> playlist take 2! \r
+# \r
+# ****************** Version 31 ****************** \r
+# User: rob.dipaolo   Date: 2010-09-20   Time: 10:27:44+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# txList -> playlist \r
+# \r
+# ****************** Version 30 ****************** \r
+# User: peter.brown   Date: 2010-09-16   Time: 15:26:35+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# updated annotations for jobList \r
+# \r
+# ****************** Version 29 ****************** \r
+# User: peter.brown   Date: 2010-09-16   Time: 12:45:09+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# fixed header/footer SCC blocks \r
+# \r
+# ****************** Version 28 ****************** \r
+# User: rob.dipaolo   Date: 2010-09-16   Time: 12:19:42+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added Joblist types. \r
+# \r
+# ****************** Version 27 ****************** \r
+# User: kirk.larkin   Date: 2010-09-16   Time: 10:25:21+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 26 ****************** \r
+# User: kirk.larkin   Date: 2010-09-16   Time: 09:54:36+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 25 ****************** \r
+# User: peter.brown   Date: 2010-09-15   Time: 19:30:59+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added comments to the top of the file \r
+# \r
+# ****************** Version 24 ****************** \r
+# User: peter.brown   Date: 2010-09-15   Time: 15:46:44+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added extra annotation for debug event type \r
+# \r
+# ****************** Version 23 ****************** \r
+# User: rob.dipaolo   Date: 2010-09-15   Time: 11:33:41+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Changed list event properties/childEvents model to sequence to make it \r
+# easier to parse. \r
+# \r
+# ****************** Version 22 ****************** \r
+# User: rob.dipaolo   Date: 2010-09-15   Time: 10:07:20+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# made scheduled end type optional is it's not required for marker events. \r
+# \r
+# ****************** Version 21 ****************** \r
+# User: peter.brown   Date: 2010-09-13   Time: 17:15:44+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added Event type = "Live" for the txPlaylistEvent. Rob OKd this. \r
+# \r
+# ****************** Version 20 ****************** \r
+# User: phil.lee   Date: 2010-09-13   Time: 17:00:50+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 19 ****************** \r
+# User: phil.lee   Date: 2010-09-13   Time: 16:05:26+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added new custom XML functionality. \r
+# \r
+# ****************** Version 18 ****************** \r
+# User: rob.dipaolo   Date: 2010-08-24   Time: 17:58:21+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Updated txList spec based on comments. \r
+# \r
+# ****************** Version 17 ****************** \r
+# User: rob.dipaolo   Date: 2010-08-24   Time: 09:23:06+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# Added types for txList events \r
+# \r
+# ****************** Version 16 ****************** \r
+# User: eric.openshaw   Date: 2010-08-05   Time: 17:42:49-06:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added ListStream allocation type attr and made ListStreamNo optional \r
+# \r
+# ****************** Version 15 ****************** \r
+# User: rob.dipaolo   Date: 2010-08-03   Time: 15:21:04+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 13 ****************** \r
+# User: phil.lee   Date: 2010-07-27   Time: 14:46:09+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 12 ****************** \r
+# User: rob.dipaolo   Date: 2010-07-26   Time: 21:00:04+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# First draft properties & media sync schemas \r
+# \r
+# ****************** Version 11 ****************** \r
+# User: phil.lee   Date: 2010-07-05   Time: 15:00:10+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 10 ****************** \r
+# User: phil.lee   Date: 2010-06-09   Time: 16:57:26+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 8 ****************** \r
+# User: eric.openshaw   Date: 2010-06-02   Time: 11:39:09-06:00 \r
+# Updated in: /Marina/source/xml/include \r
+# fixed tc regexp, legalised empty mediaUsageList \r
+# \r
+# ****************** Version 7 ****************** \r
+# User: eric.openshaw   Date: 2010-05-18   Time: 11:32:41-06:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added complete attr to markup element \r
+# \r
+# ****************** Version 6 ****************** \r
+# User: eric.openshaw   Date: 2010-05-14   Time: 09:43:48-06:00 \r
+# Updated in: /Marina/source/xml/include \r
+# added markups to media schema \r
+# \r
+# ****************** Version 5 ****************** \r
+# User: phil.lee   Date: 2010-04-19   Time: 16:54:18+01:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+# ****************** Version 3 ****************** \r
+# User: eric.openshaw   Date: 2010-03-22   Time: 12:42:28-06:00 \r
+# Updated in: /Marina/source/xml/include \r
+# \r
+*****************************************************************\r
+-->\r
+<xs:schema xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified" attributeFormDefault="unqualified">\r
+       <xs:complexType name="actionScheduleProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Scheduling properties for an action.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="startType" type="scheduledStartType" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Enumerated Start Type.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="startOffset" type="dateTimecodeOrTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>For Fixed starts this is a date time for Parent Start and End this is a timecode span offset.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="aspectRatio">\r
+               <xs:annotation>\r
+                       <xs:documentation>Aspect Ratio</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="4:3"/>\r
+                       <xs:enumeration value="4:3 Full"/>\r
+                       <xs:enumeration value="14:9 Letterbox Centred"/>\r
+                       <xs:enumeration value="14:9 Letterbox Top"/>\r
+                       <xs:enumeration value="14:9 Full Height"/>\r
+                       <xs:enumeration value="16:9"/>\r
+                       <xs:enumeration value="16:9 Letterbox Centred"/>\r
+                       <xs:enumeration value="16:9 Letterbox Top"/>\r
+                       <xs:enumeration value="16:9 Letterbox Deep"/>\r
+                       <xs:enumeration value="16:9 Anamorphic"/>\r
+                       <xs:enumeration value="Bypass"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="aspectRatioProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for Aspect Ratio</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="type" type="aspectRatio" use="required"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunActionEvent">\r
+               <xs:annotation>\r
+                       <xs:documentation>AsRun Action Event</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:complexContent>\r
+                       <xs:extension base="asRunEventTemplate">\r
+                               <xs:sequence>\r
+                                       <xs:element name="properties" type="playlistActionEventProperties"/>\r
+                                       <xs:element name="childEvents" type="asRunSecondaryEventList" minOccurs="0"/>\r
+                               </xs:sequence>\r
+                       </xs:extension>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunData">\r
+               <xs:annotation>\r
+                       <xs:documentation>AsRun related values</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="errors" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>List of errors </xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:element name="error" minOccurs="0" maxOccurs="unbounded">\r
+                                                       <xs:complexType>\r
+                                                               <xs:attribute name="name" use="required">\r
+                                                                       <xs:annotation>\r
+                                                                               <xs:documentation>The name of the error.</xs:documentation>\r
+                                                                       </xs:annotation>\r
+                                                                       <xs:simpleType>\r
+                                                                               <xs:restriction base="xs:string">\r
+                                                                                       <xs:enumeration value="Lost OnAir Job"/>\r
+                                                                                       <xs:enumeration value="Missing Media"/>\r
+                                                                                       <xs:enumeration value="Lost XPoint Path"/>\r
+                                                                                       <xs:enumeration value="Media Stream Error"/>\r
+                                                                                       <xs:enumeration value="Macro Not Found"/>\r
+                                                                                       <xs:enumeration value="Invalid Trigger Parameter"/>\r
+                                                                                       <xs:enumeration value="Lost Switch Effect"/>\r
+                                                                                       <xs:enumeration value="Slave Processor Error"/>\r
+                                                                                       <xs:enumeration value="Media Stream Error"/>\r
+                                                                                       <xs:enumeration value="Media Already Exists"/>\r
+                                                                                       <xs:enumeration value="Dependency Error"/>\r
+                                                                                       <xs:enumeration value="Cue Timeout"/>\r
+                                                                                       <xs:enumeration value="End Timeout"/>\r
+                                                                                       <xs:enumeration value="Lost Switch Effect"/>\r
+                                                                                       <xs:enumeration value="Invalid Media Segment"/>\r
+                                                                                       <xs:enumeration value="Invalid Audio Shuffle"/>\r
+                                                                                       <xs:enumeration value="Invalid Media Metadata"/>\r
+                                                                                       <xs:enumeration value="SOM Extent"/>\r
+                                                                               </xs:restriction>\r
+                                                                       </xs:simpleType>\r
+                                                               </xs:attribute>\r
+                                                               <xs:attribute name="time" type="dateTimecode" use="required">\r
+                                                                       <xs:annotation>\r
+                                                                               <xs:documentation>The time the state changed.</xs:documentation>\r
+                                                                       </xs:annotation>\r
+                                                               </xs:attribute>\r
+                                                               <xs:attribute name="state" use="required">\r
+                                                                       <xs:annotation>\r
+                                                                               <xs:documentation>The state off the error (On or Off)</xs:documentation>\r
+                                                                       </xs:annotation>\r
+                                                                       <xs:simpleType>\r
+                                                                               <xs:restriction base="xs:string">\r
+                                                                                       <xs:enumeration value="On"/>\r
+                                                                                       <xs:enumeration value="Off"/>\r
+                                                                               </xs:restriction>\r
+                                                                       </xs:simpleType>\r
+                                                               </xs:attribute>\r
+                                                               <xs:attribute name="message" type="xs:string">\r
+                                                                       <xs:annotation>\r
+                                                                               <xs:documentation>Optional message providing more information.</xs:documentation>\r
+                                                                       </xs:annotation>\r
+                                                               </xs:attribute>\r
+                                                       </xs:complexType>\r
+                                               </xs:element>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="startTime" type="dateTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The time the event or job started, if it ran.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="endTime" type="dateTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The time the event or job ended, if it ran.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="duration" type="timecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The time the event or duration ran for.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="result" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The final result of the event or job. Either "Completed" or another descriptive string to describe what the result was.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Completed"/>\r
+                                       <xs:enumeration value="Descheduled"/>\r
+                                       <xs:enumeration value="Missed"/>\r
+                                       <xs:enumeration value="User Next"/>\r
+                                       <xs:enumeration value="List Next"/>\r
+                                       <xs:enumeration value="User Abort"/>\r
+                                       <xs:enumeration value="List Abort"/>\r
+                                       <xs:enumeration value="List Preempt"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="state">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Either "done" or "disabled". For most events the state will always be "done". For events disabled in the UI they will always have a state of "done". </xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Done"/>\r
+                                       <xs:enumeration value="Disabled"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="activeRedundancyRole" type="redundancyRole">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The redundancy role used for the OnAir job.  e.g. Main.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="allocatedDevice" type="xs:string">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The device which was used by this event or job to fulfill it's function (e.g. video stream).</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="allocatedSourceDevice">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The source device which was used by this event or job to fulfill it's function (e.g. router).</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="allocatedSourcePort">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The source port which was used by this event or job to fulfill it's function (e.g. router port).</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="allocatedDestinationDevice">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The destination device which was used by this event or job to fulfill it's function (e.g. router).</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="allocatedDestinationPort">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The destination port which was used by this event or job to fulfill it's function (e.g. router port).</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="txList">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the TxList that this event was played out on. </xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="txListID">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The ID of the list that  this event was played out on.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="channel">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the channel this event was played out on, if redundancy is being used this will be the reudnant list object name. </xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="channelID">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The ID of the channel this event was played out on, if redundancy is being used this will be the reudnant list ID. </xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunEventTemplate">\r
+               <xs:annotation>\r
+                       <xs:documentation>Template for an asrun event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="asRun">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The asRunData for this event. i.e. What really happened</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:complexContent>\r
+                                               <xs:extension base="asRunData">\r
+                                                       <xs:sequence minOccurs="0">\r
+                                                               <xs:element name="jobs" type="asRunJobList" minOccurs="0"/>\r
+                                                       </xs:sequence>\r
+                                               </xs:extension>\r
+                                       </xs:complexContent>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="playlistEventAttributes"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunJob">\r
+               <xs:annotation>\r
+                       <xs:documentation>Information about a job that was created to service a list event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="asRun">\r
+                               <xs:complexType>\r
+                                       <xs:complexContent>\r
+                                               <xs:extension base="asRunData"/>\r
+                                       </xs:complexContent>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="properties" type="asRunJobProperties" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The properties used by the embedded job. These may be a subset of the event's properties, or they may have been calculated by the implementation of the job.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of this job, e.g. Media, Effect, etc</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="redundancyRole" type="redundancyRole">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The role of this job in a redundant pair.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="featurePath">\r
+                       <xs:annotation>\r
+                               <xs:documentation>XPath for the feature properties element for which this job was created. The XPath is relative from the root 'event' element.  This attribute may be missing if the job was not created to fulfill a feature.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunJobList">\r
+               <xs:annotation>\r
+                       <xs:documentation>A list of all the jobs created to service a list event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence minOccurs="0" maxOccurs="unbounded">\r
+                       <xs:element name="job" type="asRunJob"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunJobProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of an asrun job.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="schedule" type="secondaryScheduleProperties" minOccurs="0"/>\r
+                       <xs:element name="mediaStream" type="mediaStreamProperties" minOccurs="0"/>\r
+                       <xs:element name="event" type="eventProperties" minOccurs="0"/>\r
+                       <xs:element name="switch" type="switchProperties" minOccurs="0"/>\r
+                       <xs:element name="trigger" type="triggerProperties" minOccurs="0"/>\r
+                       <xs:element name="effect" type="effectProperties" minOccurs="0"/>\r
+                       <xs:element name="media" type="mediaSimple" minOccurs="0"/>\r
+                       <xs:element name="features" type="featuresProperties" minOccurs="0"/>\r
+                       <xs:element name="block" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="name" use="required"/>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="macro" type="macroProperties" minOccurs="0"/>\r
+                       <xs:element name="dolphinGraphic" type="dolphinGraphicProperties" minOccurs="0"/>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunPrimaryEvent">\r
+               <xs:annotation>\r
+                       <xs:documentation>AsRun Primary Event</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:complexContent>\r
+                       <xs:extension base="asRunEventTemplate">\r
+                               <xs:sequence>\r
+                                       <xs:element name="properties" type="playlistPrimaryEventProperties"/>\r
+                                       <xs:element name="childEvents" type="asRunSecondaryEventList" minOccurs="0"/>\r
+                               </xs:sequence>\r
+                       </xs:extension>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunPrimaryEventList">\r
+               <xs:annotation>\r
+                       <xs:documentation>AsRun Event List - contains multiple asRunEvents</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence minOccurs="0" maxOccurs="unbounded">\r
+                       <xs:choice minOccurs="0" maxOccurs="unbounded">\r
+                               <xs:element name="event" type="asRunPrimaryEvent"/>\r
+                               <xs:element name="userObservation" type="asRunUserObservation"/>\r
+                       </xs:choice>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunSecondaryEvent">\r
+               <xs:annotation>\r
+                       <xs:documentation>AsRun Secondary Event</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:complexContent>\r
+                       <xs:extension base="asRunEventTemplate">\r
+                               <xs:sequence>\r
+                                       <xs:element name="properties" type="playlistSecondaryEventProperties"/>\r
+                                       <xs:element name="childEvents" type="asRunSecondaryEventList" minOccurs="0"/>\r
+                               </xs:sequence>\r
+                       </xs:extension>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunSecondaryEventList">\r
+               <xs:annotation>\r
+                       <xs:documentation>AsRun Secondary Event List</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence maxOccurs="unbounded">\r
+                       <xs:choice>\r
+                               <xs:element name="event" type="asRunSecondaryEvent"/>\r
+                               <xs:element name="action" type="asRunActionEvent"/>\r
+                       </xs:choice>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="asRunUserObservation">\r
+               <xs:annotation>\r
+                       <xs:documentation>Observations by operators or users.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="comment" type="xs:string">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The comment typed in by the user.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="time" type="dateTimecode" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The time the observation was made.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="userName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the user that made the observation.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="client" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the client pc that the observation was made from. e.g. MCRClient1</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="audio">\r
+               <xs:annotation>\r
+                       <xs:documentation>Supersedes audioTracks, represents both groups and tracks.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="tracks">\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:element name="track" maxOccurs="unbounded">\r
+                                                       <xs:complexType>\r
+                                                               <xs:sequence minOccurs="0">\r
+                                                                       <xs:element name="encodingConfig" minOccurs="0">\r
+                                                                               <xs:annotation>\r
+                                                                                       <xs:documentation>Configuration parameters for encoding. This is free form for now but will be formalised later.</xs:documentation>\r
+                                                                               </xs:annotation>\r
+                                                                               <xs:complexType>\r
+                                                                                       <xs:anyAttribute namespace="##any" processContents="skip"/>\r
+                                                                               </xs:complexType>\r
+                                                                       </xs:element>\r
+                                                                       <xs:element name="tags" minOccurs="0">\r
+                                                                               <xs:annotation>\r
+                                                                                       <xs:documentation>Any number of free form tags.</xs:documentation>\r
+                                                                               </xs:annotation>\r
+                                                                               <xs:complexType>\r
+                                                                                       <xs:sequence minOccurs="0">\r
+                                                                                               <xs:element name="tag" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>\r
+                                                                                       </xs:sequence>\r
+                                                                               </xs:complexType>\r
+                                                                       </xs:element>\r
+                                                               </xs:sequence>\r
+                                                               <xs:attribute name="encoding" use="required">\r
+                                                                       <xs:annotation>\r
+                                                                               <xs:documentation>The encoding format used for this track.</xs:documentation>\r
+                                                                       </xs:annotation>\r
+                                                                       <xs:simpleType>\r
+                                                                               <xs:restriction base="xs:string">\r
+                                                                                       <xs:enumeration value="UNKNOWN"/>\r
+                                                                                       <xs:enumeration value="ADPCM"/>\r
+                                                                                       <xs:enumeration value="DOL_E"/>\r
+                                                                                       <xs:enumeration value="DOL_D"/>\r
+                                                                                       <xs:enumeration value="DOL_D_PLUS"/>\r
+                                                                                       <xs:enumeration value="MP1L1"/>\r
+                                                                                       <xs:enumeration value="MP1L2"/>\r
+                                                                                       <xs:enumeration value="MP1L3"/>\r
+                                                                                       <xs:enumeration value="MP2P3"/>\r
+                                                                                       <xs:enumeration value="AAC"/>\r
+                                                                                       <xs:enumeration value="PCM"/>\r
+                                                                                       <xs:enumeration value="OGG"/>\r
+                                                                                       <xs:enumeration value="WMA"/>\r
+                                                                               </xs:restriction>\r
+                                                                       </xs:simpleType>\r
+                                                               </xs:attribute>\r
+                                                       </xs:complexType>\r
+                                               </xs:element>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="groups" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:element name="group" minOccurs="0" maxOccurs="unbounded">\r
+                                                       <xs:complexType>\r
+                                                               <xs:sequence>\r
+                                                                       <xs:element name="tags" minOccurs="0">\r
+                                                                               <xs:complexType>\r
+                                                                                       <xs:sequence minOccurs="0">\r
+                                                                                               <xs:element name="tag" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>\r
+                                                                                       </xs:sequence>\r
+                                                                               </xs:complexType>\r
+                                                                       </xs:element>\r
+                                                                       <xs:element name="tracks">\r
+                                                                               <xs:complexType>\r
+                                                                                       <xs:sequence>\r
+                                                                                               <xs:element name="track" maxOccurs="255">\r
+                                                                                                       <xs:complexType>\r
+                                                                                                               <xs:attribute name="index" use="required">\r
+                                                                                                                       <xs:annotation>\r
+                                                                                                                               <xs:documentation>1 based track index,</xs:documentation>\r
+                                                                                                                       </xs:annotation>\r
+                                                                                                                       <xs:simpleType>\r
+                                                                                                                               <xs:restriction base="xs:unsignedByte">\r
+                                                                                                                                       <xs:minInclusive value="1"/>\r
+                                                                                                                                       <xs:maxInclusive value="255"/>\r
+                                                                                                                               </xs:restriction>\r
+                                                                                                                       </xs:simpleType>\r
+                                                                                                               </xs:attribute>\r
+                                                                                                       </xs:complexType>\r
+                                                                                               </xs:element>\r
+                                                                                       </xs:sequence>\r
+                                                                               </xs:complexType>\r
+                                                                       </xs:element>\r
+                                                               </xs:sequence>\r
+                                                               <xs:attribute name="name" use="required">\r
+                                                                       <xs:annotation>\r
+                                                                               <xs:documentation>Uniique name for this group.</xs:documentation>\r
+                                                                       </xs:annotation>\r
+                                                               </xs:attribute>\r
+                                                       </xs:complexType>\r
+                                               </xs:element>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="audioTrack">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of an audio track</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="trackNum" type="xs:unsignedShort" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>0 based audio track number</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="channels" type="xs:unsignedByte" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Number of channels of audio within this track</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="sampleRate" type="xs:unsignedShort" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Sample rate of audio encoding in kHz</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="format" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Encoding format of the audio track (see enum)</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="32"/>\r
+                                       <xs:enumeration value="PCM"/>\r
+                                       <xs:enumeration value="DolbyDigital"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="bits" type="xs:unsignedShort" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Encoding resolution</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="lang" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Language of audio track</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="32"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="audioTracks">\r
+               <xs:annotation>\r
+                       <xs:documentation>Collection of audio tracks</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="audioTrack" type="audioTrack" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:simpleType name="automationStateType">\r
+               <xs:annotation>\r
+                       <xs:documentation>Enumeration of automation job states.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Null"/>\r
+                       <xs:enumeration value="Initialising"/>\r
+                       <xs:enumeration value="Initialised"/>\r
+                       <xs:enumeration value="Cueing"/>\r
+                       <xs:enumeration value="Allocating Device"/>\r
+                       <xs:enumeration value="Device Allocated"/>\r
+                       <xs:enumeration value="Waiting Validation"/>\r
+                       <xs:enumeration value="Validation Succeeded"/>\r
+                       <xs:enumeration value="Validation Failed"/>\r
+                       <xs:enumeration value="Allocating Stream"/>\r
+                       <xs:enumeration value="Stream Allocated"/>\r
+                       <xs:enumeration value="Stream Cueing"/>\r
+                       <xs:enumeration value="Cued"/>\r
+                       <xs:enumeration value="Preroll"/>\r
+                       <xs:enumeration value="Running"/>\r
+                       <xs:enumeration value="Overrunning"/>\r
+                       <xs:enumeration value="Pausing"/>\r
+                       <xs:enumeration value="Paused"/>\r
+                       <xs:enumeration value="Ending"/>\r
+                       <xs:enumeration value="Running"/>\r
+                       <xs:enumeration value="Aborting"/>\r
+                       <xs:enumeration value="Aborted"/>\r
+                       <xs:enumeration value="Postroll"/>\r
+                       <xs:enumeration value="Done"/>\r
+                       <xs:enumeration value="Disabled"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="cgProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties used by CG media devices</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="f" minOccurs="0" maxOccurs="30">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Template fields go here if required.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:simpleContent>\r
+                                               <xs:extension base="xs:string">\r
+                                                       <xs:attribute name="name"/>\r
+                                               </xs:extension>\r
+                                       </xs:simpleContent>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="passThrough" minOccurs="0" maxOccurs="1">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Required when the type is PassThrough. For some devices this can be used to specify a command to pass directly to the device.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="command" use="required"/>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="transition" minOccurs="0" maxOccurs="1">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Required when the type is Transition. For example, can be used to fade up/down a logo.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="type" type="CGTransitionUnion" use="required"/>\r
+                                       <xs:attribute name="rate" type="switchRate" use="optional"/>\r
+                                       <xs:attribute name="direction" type="direction" use="optional"/>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="stopAnimation" minOccurs="0" maxOccurs="1">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="enabled" type="xs:boolean" use="optional"/>\r
+                                       <xs:attribute name="stopTimeType" type="CGTPATimeTypeEnum" use="optional"/>\r
+                                       <xs:attribute name="stopTimeOffset" type="timecode" use="optional"/>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="PBSDolphinGraphicElement" type="dolphinCGProperties" minOccurs="0" maxOccurs="1">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Optional properties for dolphin devices.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Page"/>\r
+                                       <xs:enumeration value="Sequence"/>\r
+                                       <xs:enumeration value="Template"/>\r
+                                       <xs:enumeration value="Transition"/>\r
+                                       <xs:enumeration value="PassThrough"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="layer">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional Layer</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="loadOnly" type="xs:boolean">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Option to load at start time instead of loading at cue time and fading up at start time.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="CGTPATimeTypeEnum">\r
+               <xs:annotation>\r
+                       <xs:documentation>Three Part Animation stop type enum</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="0"/>\r
+                       <xs:enumeration value="1"/>\r
+                       <xs:enumeration value="+EventStart"/>\r
+                       <xs:enumeration value="-EventEnd"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="CGTransitionEnum">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Cut"/>\r
+                       <xs:enumeration value="Fade"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="CGTransitionUnion" final="union">\r
+               <xs:union memberTypes="CGTransitionEnum switchTransition"/>\r
+       </xs:simpleType>\r
+       <xs:complexType name="changeCounts">\r
+               <xs:attribute name="del" type="xs:integer"/>\r
+               <xs:attribute name="update" type="xs:integer"/>\r
+               <xs:attribute name="add" type="xs:integer"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="channelProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for a transmission channel.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="name">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional name of the channel this list should be played on.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="comment" type="xs:string">\r
+                       <xs:annotation>\r
+                               <xs:documentation>An optional comment describing what this list is intended for or what it contains.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="txTime" type="dateTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional date/time that the list should be aired.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="timeOffset" type="xs:string">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional time offset name this list was saved in</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="timeOffsetValue" type="dateTimecodeOrTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional time offset value this list was saved in. This is a timecode span.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="classification">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a classification of an "object" (e.g. media, mediaInstance, mediaSet)</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="autoAssociate" type="xs:boolean" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>If true, all the media in the DB and all the one you will create will be given the default category as value. If false, they won't have any category assigned.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="classification" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the classification e.g. "Program Type" or "Rating"</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="category" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the category within this classification e.g. "Trailer", "Advertisement" or "18+"</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="classifications">\r
+               <xs:annotation>\r
+                       <xs:documentation>Collection of classifications</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="classification" type="classification" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="component">\r
+               <xs:annotation>\r
+                       <xs:documentation>A representation of a component.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="health" type="healthList" minOccurs="0"/>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="componentAttributes"/>\r
+               <xs:attribute name="isRedundantObject" type="xs:boolean" use="optional"/>\r
+               <xs:attribute name="redundantParentId" type="xs:int" use="optional"/>\r
+               <xs:attribute name="redundantParentName" type="xs:string" use="optional"/>\r
+       </xs:complexType>\r
+       <xs:attributeGroup name="componentAttributes">\r
+               <xs:annotation>\r
+                       <xs:documentation>Required attributes for a component.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="componentId" type="xs:integer" use="required"/>\r
+               <xs:attribute name="componentName" type="componentName" use="required"/>\r
+       </xs:attributeGroup>\r
+       <xs:simpleType name="componentHealth">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:maxLength value="64"/>\r
+                       <xs:minLength value="1"/>\r
+                       <xs:enumeration value="Object not found!"/>\r
+                       <xs:enumeration value="Proxy exception!"/>\r
+                       <xs:enumeration value="Server node not found!"/>\r
+                       <xs:enumeration value="Server component not found!"/>\r
+                       <xs:enumeration value="Server exception!"/>\r
+                       <xs:enumeration value="Device disconnected!"/>\r
+                       <xs:enumeration value="Card not found!"/>\r
+                       <xs:enumeration value="Unable to open device!"/>\r
+                       <xs:enumeration value="Invalid config!"/>\r
+                       <xs:enumeration value="Device error!"/>\r
+                       <xs:enumeration value="Device automation disabled!"/>\r
+                       <xs:enumeration value="API interface failed!"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="componentList">\r
+               <xs:annotation>\r
+                       <xs:documentation>A list of components.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="component" type="component" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:simpleType name="componentName">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:minLength value="1"/>\r
+                       <xs:maxLength value="64"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="componentTag">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:minLength value="1"/>\r
+                       <xs:maxLength value="128"/>\r
+                       <xs:enumeration value="TxList"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="dateTime">\r
+               <xs:annotation>\r
+                       <xs:documentation>PBS date time that excludes timezone.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:pattern value="2\d\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])(T)([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]"/>\r
+                       <xs:pattern value="$INHERIT$"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="dateTimecode">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:pattern value="2\d\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])(T)([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]:([0-1][0-9]|2[0-4])"/>\r
+                       <xs:pattern value="2\d\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])(T)([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9];[0-2][0-9]"/>\r
+                       <xs:pattern value="$INHERIT$"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="dateTimecodeOrTimecode">\r
+               <xs:annotation>\r
+                       <xs:documentation>Can either be a dateTimecode or a Timecode</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:pattern value="2\d\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])(T)([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]:([0-1][0-9]|2[0-4])"/>\r
+                       <xs:pattern value="2\d\d\d-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])(T)([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9];[0-2][0-9]"/>\r
+                       <xs:pattern value="([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]:([0-1][0-9]|2[0-4])"/>\r
+                       <xs:pattern value="([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9];[0-2][0-9]"/>\r
+                       <xs:pattern value="$INHERIT$"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="dateTimecodeRange">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a timecode range (start -> end)</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="start" type="dateTimecode" use="required"/>\r
+               <xs:attribute name="end" type="dateTimecode" use="required"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="deleteMedia">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a delete media request</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="deleteMediaInstances" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Collection of deleted media instances</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:element name="deleteMediaInstance" type="deleteMediaInstance" maxOccurs="unbounded">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>Delete information for a media instance</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:element>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="mediaKey"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="deleteMediaInstance">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a delete media instance request</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaSetName" type="mediaSetName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Name of server or tape on which this instance is located</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="output" type="xs:string" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Indicates whether the media instance was successfully deleted or not</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="direction">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Up"/>\r
+                       <xs:enumeration value="Down"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="dolphinCGProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for Dolphin CG jobs.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Media name of CG event to display.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="0"/>\r
+                                       <xs:maxLength value="255"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="posX">\r
+                       <xs:annotation>\r
+                               <xs:documentation>X Position in percent (60.7pc) or pixels (100pi)</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="posY">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Y Position in percent (60.7pc) or pixels (100pi)</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="scaleX" type="xs:float">\r
+                       <xs:annotation>\r
+                               <xs:documentation>X dimension scale. For example 1.0 is image size, 2.0 twice size, 0.5 half size.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="scaleY" type="xs:float">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Y dimension scale. For example 1.0 is image size, 2.0 twice size, 0.5 half size.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="opacity" type="xs:float">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Maximum opacity level when on 0.0 less than nOpacity less than or equal to 1.0</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="priority" type="xs:int">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Graphic layer priority. Default is 1. Higher priority graphic elements will be displayed over the top of lower ones.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="onTransitionType" type="switchTransition">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Enumerated value includes values such as Cut, Cut Fade, Mix, Wipe, U-Fade etc.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="onTransitionTime">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Transition time in frames from opacity 0 (off) to n (on) </xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:int">\r
+                                       <xs:minInclusive value="0"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="offTransitionType" type="switchTransition">\r
+                       <xs:annotation>\r
+                               <xs:documentation>As per onTransitionType enum but for the off transition.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="offTransitionTime">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Transition time in frames from opacity n (on) to 0 (off).</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="dolphinGraphicProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Dolphin graphic properties</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="param" minOccurs="0" maxOccurs="unbounded">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="value" type="xs:string" use="required"/>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="startTime" type="timecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>the defered start time</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="latency" type="timecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>latency between list and dolphin device</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="name" type="xs:string">\r
+                       <xs:annotation>\r
+                               <xs:documentation>name of dolphin CG</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="state">\r
+                       <xs:annotation>\r
+                               <xs:documentation>on or off</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="on"/>\r
+                                       <xs:enumeration value="off"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="effectProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for effects</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="port" type="switchAllocation">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The device port the effect will occur on</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:choice>\r
+                               <xs:element name="keyer" minOccurs="0">\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="transition" type="switchTransition" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>the type of transition required (cut, mix etc)</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="rate" type="switchRate" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>how fast should the transition be? </xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                               <xs:element name="audioOver">\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="transition" type="switchTransition" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>the type of transition required (cut, mix etc)</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="rate" type="switchRate" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>how fast should the transition be? </xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="percent" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>0% is off, 100% is fully on.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:integer">\r
+                                                                       <xs:minInclusive value="0"/>\r
+                                                                       <xs:maxInclusive value="100"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="pgmPercent">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>optional. Can be used alongside other rules to adjust the PGM volume when adding an audio over.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:integer">\r
+                                                                       <xs:minInclusive value="0"/>\r
+                                                                       <xs:maxInclusive value="100"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                               <xs:element name="logo">\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="transition" type="switchTransition" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>the type of transition required (cut, mix etc)</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="rate" type="switchRate" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>how fast should the transition be? </xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="logo" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>this can be a specific logo name or logo number as used in the physical device.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:minLength value="1"/>\r
+                                                                       <xs:maxLength value="64"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                               <xs:element name="audioMode">\r
+                                       <xs:annotation>\r
+                                               <xs:documentation>M2100 specific effect</xs:documentation>\r
+                                       </xs:annotation>\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="bus" use="required">\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:enumeration value="PGM"/>\r
+                                                                       <xs:enumeration value="PST"/>\r
+                                                                       <xs:enumeration value="AP1"/>\r
+                                                                       <xs:enumeration value="AP2"/>\r
+                                                                       <xs:enumeration value="AP3"/>\r
+                                                                       <xs:enumeration value="AP4"/>\r
+                                                                       <xs:enumeration value="AP5"/>\r
+                                                                       <xs:enumeration value="AP6"/>\r
+                                                                       <xs:enumeration value="AP7"/>\r
+                                                                       <xs:enumeration value="AP8"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="mode" use="required">\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:enumeration value="NoChange"/>\r
+                                                                       <xs:enumeration value="Stereo"/>\r
+                                                                       <xs:enumeration value="LeftMono"/>\r
+                                                                       <xs:enumeration value="RightMono"/>\r
+                                                                       <xs:enumeration value="Custom1"/>\r
+                                                                       <xs:enumeration value="Custom2"/>\r
+                                                                       <xs:enumeration value="Custom3"/>\r
+                                                                       <xs:enumeration value="Custom4"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="phase" use="required">\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:enumeration value="NoChange"/>\r
+                                                                       <xs:enumeration value="Normal"/>\r
+                                                                       <xs:enumeration value="Reverse"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                               <xs:element name="dve">\r
+                                       <xs:annotation>\r
+                                               <xs:documentation>digital video effects properties</xs:documentation>\r
+                                       </xs:annotation>\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="effect" type="xs:string" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>the dve sequence name, number or id to be used.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="duration" type="timecode">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>option to override the dve's configured duration if supported by the device.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                               <xs:element name="audioShuffle">\r
+                                       <xs:complexType>\r
+                                               <xs:choice>\r
+                                                       <xs:element name="macro" type="macroProperties"/>\r
+                                                       <xs:element name="fixed">\r
+                                                               <xs:complexType>\r
+                                                                       <xs:sequence>\r
+                                                                               <xs:element name="shuffle" maxOccurs="unbounded">\r
+                                                                                       <xs:complexType>\r
+                                                                                               <xs:attribute name="output" type="xs:string" use="required"/>\r
+                                                                                               <xs:attribute name="input" type="xs:string" use="required"/>\r
+                                                                                       </xs:complexType>\r
+                                                                               </xs:element>\r
+                                                                       </xs:sequence>\r
+                                                               </xs:complexType>\r
+                                                       </xs:element>\r
+                                               </xs:choice>\r
+                                               <xs:attribute name="type" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>based on type selected the appropriate child element should be completed</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:enumeration value="Macro"/>\r
+                                                                       <xs:enumeration value="Fixed"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="validationMode" type="validationMode">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>Option to override the defualt list validation of these properties. Off turns off all validation.  Warn sets warnings when errors are found.  Update will update the properties with the correct data if it's wrong.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                               <xs:element name="audioClip">\r
+                                       <xs:annotation>\r
+                                               <xs:documentation>M2100 specific effect</xs:documentation>\r
+                                       </xs:annotation>\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="transition" type="switchTransition" use="optional">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>the type of transition required (cut, mix etc)</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="rate" type="switchRate" use="optional">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>how fast should the transition be? </xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="percent" use="optional">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>0% is off, 100% is fully on.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:integer">\r
+                                                                       <xs:minInclusive value="0"/>\r
+                                                                       <xs:maxInclusive value="100"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="file">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>audio clip file to load as understood by the M2100</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                       </xs:choice>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>the type of effect that is required. The matchin child element then also needs to be completed. </xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Keyer"/>\r
+                                       <xs:enumeration value="Audio Over"/>\r
+                                       <xs:enumeration value="Logo"/>\r
+                                       <xs:enumeration value="Audio Mode"/>\r
+                                       <xs:enumeration value="DVE"/>\r
+                                       <xs:enumeration value="Audio Shuffle"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="name">\r
+                       <xs:annotation>\r
+                               <xs:documentation>the name of the effect that is to be triggered. For example "AudioOver1, AudioOver2, DVE". These names are sourced from the third party device itself and are not configurable.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="0"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="eventClassification">\r
+               <xs:annotation>\r
+                       <xs:documentation>Classification used in a list event where 'AutoAssociate' doesn't make sense.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:complexContent>\r
+                       <xs:restriction base="classification"/>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="eventClassifications">\r
+               <xs:annotation>\r
+                       <xs:documentation>Collection of event classifications</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:complexContent>\r
+                       <xs:restriction base="classifications">\r
+                               <xs:sequence>\r
+                                       <xs:element name="classification" type="eventClassification" maxOccurs="unbounded"/>\r
+                               </xs:sequence>\r
+                       </xs:restriction>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="eventProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for automation list events.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all minOccurs="0">\r
+                       <xs:element name="comment" minOccurs="0">\r
+                               <xs:simpleType>\r
+                                       <xs:restriction base="xs:string">\r
+                                               <xs:minLength value="0"/>\r
+                                               <xs:maxLength value="255"/>\r
+                                       </xs:restriction>\r
+                               </xs:simpleType>\r
+                       </xs:element>\r
+                       <xs:element name="classifications" type="eventClassifications" minOccurs="0"/>\r
+               </xs:all>\r
+               <xs:attribute name="title" use="optional">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="reconcileKey" type="reconcileKey" use="optional"/>\r
+               <xs:attribute name="houseId">\r
+                       <xs:annotation>\r
+                               <xs:documentation>the houseID is a media level piece of data. However in many cases the PBS database may not be populated with this houseID information. This attribute allows the houseId to be displayed in the playlist UI. Note that it does NOT get updated into the database; or used in any way. It is for visual purposes only.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="validationMode" type="validationMode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Option to override the defualt list validation of these properties. Off turns off all validation.  Warn sets warnings when errors are found.  Update will update the properties with the correct data if it's wrong.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="eventType">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Insert"/>\r
+                       <xs:enumeration value="Update"/>\r
+                       <xs:enumeration value="Delete"/>\r
+                       <xs:enumeration value="Handshake"/>\r
+                       <xs:enumeration value="Heartbeat"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="featuresProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties allowed for an event feature.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="feature" maxOccurs="unbounded">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>You can have any number of additional features but only one of each type.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:element name="properties" minOccurs="0">\r
+                                                       <xs:complexType>\r
+                                                               <xs:all>\r
+                                                                       <xs:element name="media" type="mediaSimple" minOccurs="0"/>\r
+                                                                       <xs:element name="mediaStream" type="mediaStreamProperties" minOccurs="0"/>\r
+                                                                       <xs:element name="macro" type="macroProperties" minOccurs="0"/>\r
+                                                                       <xs:element name="vps" type="vpsProperties" minOccurs="0"/>\r
+                                                                       <xs:element name="aspectRatio" type="aspectRatioProperties" minOccurs="0"/>\r
+                                                                       <xs:element name="fieldList" minOccurs="0">\r
+                                                                               <xs:complexType>\r
+                                                                                       <xs:sequence maxOccurs="unbounded">\r
+                                                                                               <xs:element name="field">\r
+                                                                                                       <xs:complexType>\r
+                                                                                                               <xs:attribute name="name" type="xs:string" use="required">\r
+                                                                                                                       <xs:annotation>\r
+                                                                                                                               <xs:documentation>custom field name</xs:documentation>\r
+                                                                                                                       </xs:annotation>\r
+                                                                                                               </xs:attribute>\r
+                                                                                                               <xs:attribute name="value" type="xs:string" use="required">\r
+                                                                                                                       <xs:annotation>\r
+                                                                                                                               <xs:documentation>value associated with the custom field name</xs:documentation>\r
+                                                                                                                       </xs:annotation>\r
+                                                                                                               </xs:attribute>\r
+                                                                                                       </xs:complexType>\r
+                                                                                               </xs:element>\r
+                                                                                       </xs:sequence>\r
+                                                                               </xs:complexType>\r
+                                                                       </xs:element>\r
+                                                                       <xs:element name="effect" type="effectProperties" minOccurs="0"/>\r
+                                                               </xs:all>\r
+                                                       </xs:complexType>\r
+                                               </xs:element>\r
+                                       </xs:sequence>\r
+                                       <xs:attribute name="type" type="usageType" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>The type of this feature. The properties valid for a feature depend on its type.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="healthFlag">\r
+               <xs:annotation>\r
+                       <xs:documentation>A instance of a health flag applicable to a component.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="name" type="componentHealth"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="healthList">\r
+               <xs:annotation>\r
+                       <xs:documentation>A list of all health flags applicable to a component</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="healthFlag" type="healthFlag" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="heartbeat">\r
+               <xs:annotation>\r
+                       <xs:documentation>A representation of a connection heartbeat</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="auxXML" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Concession for custom metadata</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="historyProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for keeping track of object history.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="created" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="author" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>Name of the user that created this object.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="1"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="time" type="xs:dateTime" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>Date and Time of creation.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="comment">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>Optional comment by author.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="modified" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="author" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>Name of the user that modified this object.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="1"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="time" type="xs:dateTime" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>Date and Time of modification.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="comment">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>Optional comment by author.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:all>\r
+               <xs:attribute name="source">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional source identifier.  This could be the original filename for example.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="ingestProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties used by ingest jobs</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="reviewJob" type="xs:boolean" use="required"/>\r
+               <xs:attribute name="reviewOffset" type="timecode" use="required"/>\r
+               <xs:attribute name="abortOnReviewFailure" type="xs:boolean" use="required"/>\r
+               <xs:attribute name="switchOnPrepare" type="xs:boolean" use="required"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="job">\r
+               <xs:annotation>\r
+                       <xs:documentation>A single job</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="state" type="jobState" minOccurs="0"/>\r
+                       <xs:element name="properties" type="jobProperties" minOccurs="0"/>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of this job.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Transfer"/>\r
+                                       <xs:enumeration value="Delete"/>\r
+                                       <xs:enumeration value="Thumbnail"/>\r
+                                       <xs:enumeration value="Demo"/>\r
+                                       <xs:enumeration value="Assistant"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="uid">\r
+                       <xs:annotation>\r
+                               <xs:documentation>This is the internal id for the event which is useful for debugging.  It is ignored when loading the list.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="jobList">\r
+               <xs:annotation>\r
+                       <xs:documentation>A List of jobs.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="job" type="job" minOccurs="0" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="jobListProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a job list.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="history" type="historyProperties" minOccurs="0"/>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="jobProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a job.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="secondaries" type="secondaries" minOccurs="0"/>\r
+                       <xs:element name="media" type="media" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>For jobs that operate on media.  \r
+\r
+You must at least specify the MediaName and Media type, however you can specify much more information if required.  \r
+\r
+For example\r
+1.) if you want to delete all instances of a piece of media the just specify the MediaName and MediaType, then set "global" to true on the delete element.\r
+2.) if you want to delete specific instances of a piece of media then specify which ones using the mediaInstances element. \r
+\r
+When ingesting material the meta data specified here is used to update the media database.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="transfer" type="transfer" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Can be specified for transfer jobs.  \r
+\r
+If the transfer is an ingest job this gives a hint as to the final destination of the media but can be overridden by the operators.  \r
+\r
+For all other types of transfer this MUST be specified.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="delete" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Must be specified for delete jobs. \r
+\r
+At present there are no individual delete properties but an empty element must exist.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="confirmed" type="xs:boolean" use="optional">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>States whether the job is confirmed for deletion.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="global" type="xs:boolean" use="optional">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>States whether the job will delete all media instances across the system.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="deleteMediaRecord" type="xs:boolean" use="optional">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>States whether the job will delete the media record.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="crossDomain" type="xs:boolean">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>Informs whether the delete job is a cross domain one.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="priority" type="priority" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>You can use this to specify the priority of the job, \r
+\r
+It's not used for all type of job and is assumed to be low priority if it's omitted.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="mediaStream" type="mediaStreamIngestProperties" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>For ingest transfer jobs you can specify the som, duration and video properties where the jobType will always be record.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="jobState">\r
+               <xs:annotation>\r
+                       <xs:documentation>State of a job.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="state" type="automationStateType" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The job's current state.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="stateHint" type="xs:string" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>A hint describing the job's state.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="stateModifiedTime" type="dateTimecode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>DateTime the job's state was last modified by the system.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="keepItem">\r
+               <xs:annotation>\r
+                       <xs:documentation>A single item to keep</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="properties" type="keepItemProperties"/>\r
+               </xs:sequence>\r
+               <xs:attribute name="uid">\r
+                       <xs:annotation>\r
+                               <xs:documentation>This is the internal id for the keep item which is useful for debugging.  It is ignored when loading the list.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="keepItemProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a keepItem</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="media" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The media name/type of the item that needs to be kept</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:complexContent>\r
+                                               <xs:extension base="mediaSimpleLoose">\r
+                                                       <xs:sequence>\r
+                                                               <xs:element name="mediaInstances" minOccurs="0">\r
+                                                                       <xs:complexType>\r
+                                                                               <xs:sequence>\r
+                                                                                       <xs:element name="mediaInstance" maxOccurs="unbounded">\r
+                                                                                               <xs:complexType>\r
+                                                                                                       <xs:attributeGroup ref="mediaInstanceKeyLoose"/>\r
+                                                                                               </xs:complexType>\r
+                                                                                       </xs:element>\r
+                                                                               </xs:sequence>\r
+                                                                       </xs:complexType>\r
+                                                               </xs:element>\r
+                                                       </xs:sequence>\r
+                                               </xs:extension>\r
+                                       </xs:complexContent>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="expiry" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>For how long must the item(s) be kept? this expiry time denotes when the item no longer needs to be forcibly kept above other rules in the system.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="time" type="dateTime"/>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="keepList">\r
+               <xs:annotation>\r
+                       <xs:documentation>A List of items to keep</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence maxOccurs="unbounded">\r
+                       <xs:element name="keepItem" type="keepItem"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="keepListProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a keep list.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:complexContent>\r
+                       <xs:extension base="jobListProperties"/>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="languages">\r
+               <xs:annotation>\r
+                       <xs:documentation>A representation of a group of languages.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="lang" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="lastModifiedDateTimeRange">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a last update time timecode range (start -> end)</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="start" type="dateTime" use="required"/>\r
+               <xs:attribute name="end" type="dateTime" use="required"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="layers">\r
+               <xs:annotation>\r
+                       <xs:documentation>Collection of layers</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="layer" maxOccurs="10">\r
+                               <xs:simpleType>\r
+                                       <xs:restriction base="xs:string">\r
+                                               <xs:minLength value="1"/>\r
+                                               <xs:maxLength value="64"/>\r
+                                       </xs:restriction>\r
+                               </xs:simpleType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="listStreamAllocation">\r
+               <xs:annotation>\r
+                       <xs:documentation>Date for list stream allocation</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Fixed"/>\r
+                                       <xs:enumeration value="Auto"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="listStreamNo" use="optional">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:int">\r
+                                       <xs:minInclusive value="0"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="listStreamAllocationProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties used by automation lists for allocation</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:choice minOccurs="0">\r
+                       <xs:element name="listStream" type="listStreamAllocation">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>if type = listStream then this must be completed</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:choice>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="ListStream"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="macroProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for a macro event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="value" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The value of the macro.  e.g. If the event type is Logo this may be LogoOn or LogoOff.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="markup">\r
+               <xs:annotation>\r
+                       <xs:documentation>A named collection of markup items</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence minOccurs="0" maxOccurs="unbounded">\r
+                       <xs:element name="markupItem" type="markupItem">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Representation of a segment or keyframe</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="name" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the markup to which the markupItems belong.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="complete" type="xs:boolean" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Indicates whether the markup item data represents the complete markup, or only an incremental update.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="markupItem">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a segment or keyframe.  Presence of a valid duration indicates a segment, otherwise interpreted as a keyframe.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of the markup item.  If "Template" the item represents an item in a predefined template.  If "Dynamic" the item is not part of a template.  It is possible to mix dynamic and template items in a single markup.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Dynamic"/>\r
+                                       <xs:enumeration value="Template"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="orderNo" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The 1 based position of the item within the markup.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:unsignedByte">\r
+                                       <xs:minInclusive value="1"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="name" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the item (e.g. "Part1", "Break")</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="som" type="timecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The timecode of the start of a segment or the position of a keyframe.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="duration" type="timecode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The duration of a segment.  This attribute should be absent when specifying a keyframe.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="comment" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>A user defined comment that may be displayed in certain user interfaces.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="256"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="offset" type="xs:int" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>For non-thumbnail types this value stores the offset from the SOM for the thumbnail.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="markups">\r
+               <xs:annotation>\r
+                       <xs:documentation>Collection of markup elements</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence maxOccurs="unbounded">\r
+                       <xs:element name="markup" type="markup">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>A named collection of markupItems</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="media">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a piece of media with associated metadata. Make sure the creationTime is in the format 2017-03-23T14:11:00 [YYYY-MM-DD]T[HH:MM:SS] otherwise XML validation will fail.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="auxXML" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Concession for custom metadata</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>\r
+                                       </xs:sequence>\r
+                                       <xs:attribute name="processor" use="optional">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="1"/>\r
+                                                               <xs:maxLength value="255"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="properties" type="mediaProperties" minOccurs="0"/>\r
+                       <xs:element name="mediaInstances" type="mediaInstanceList" minOccurs="0"/>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="mediaKey"/>\r
+               <xs:attributeGroup ref="mediaBaseAttributes"/>\r
+       </xs:complexType>\r
+       <xs:attributeGroup name="mediaBaseAttributes">\r
+               <xs:attribute name="title" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional title for media</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="origSOM" type="timecode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Original SOM where media was located on tape (only used if media is scheduled by OrigSOM)</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="creationTime" type="dateTime" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>DateTime this media was first seen by the system</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="modifiedTime" type="dateTime" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>DateTime this media was last modified by the system</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="mediaId" type="xs:int" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Internal Marina media UID</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="houseId" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional house Id for media</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:maxLength value="64"/>\r
+                                       <xs:minLength value="1"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="alternateId" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Optional alternate Id for media</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:maxLength value="64"/>\r
+                                       <xs:minLength value="1"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="validityStartTime" type="dateTime" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Date and time media becomes valid</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="validityEndTime" type="dateTime" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Date and time media becomes invalid</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="eventPlayCount" type="xs:int" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The number of times this media has been played to air.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="firstEventPlayTime" type="dateTimecode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The date and time that this media was first played to air.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="lastEventPlayTime" type="dateTimecode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The date and time of the last time this media was played to air.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="notes" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Free text field for any media notes</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="255"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:attributeGroup>\r
+       <xs:complexType name="mediaInstance">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of the metadata for an instance of a piece of media.  This type is intended to be embedded inside an element with a specified mediaKey</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="auxXML" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Concession for custom metadata</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="properties" type="mediaInstanceProperties" minOccurs="0"/>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="mediaInstanceKey"/>\r
+               <xs:attributeGroup ref="mediaInstanceBaseAttributes"/>\r
+       </xs:complexType>\r
+       <xs:attributeGroup name="mediaInstanceBaseAttributes">\r
+               <xs:attribute name="versionHint" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Textual hint for this version</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="0"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="duration" type="timecode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Duration of this instance</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="creationStartTime" type="dateTimecode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Time at which this instance started creation</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="creationEndTime" type="dateTimecode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Time at which this instance ended creation</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="creationHint" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Textual hint set during the creation process</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="0"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="origSOM" type="timecode" use="optional"/>\r
+               <xs:attribute name="mediaInstanceId" type="xs:int" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Internal Marina media instance UID</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="nativeSize" type="xs:unsignedLong" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Size of the media in bytes</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="sourceURL" type="xs:string" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Source url of the media instance</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="destURL" type="xs:string" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Destination URL of the media instance</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="deleteAll" type="xs:boolean" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>When deleting media, set this to true to delete all instances in the specified mediaSet. For example, on a device supporting subdirectories, delete from all subdirectories.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:attributeGroup>\r
+       <xs:attributeGroup name="mediaInstanceKey">\r
+               <xs:annotation>\r
+                       <xs:documentation>Composite Key for MediaInstance</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaSetName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Name of server or tape on which this instance is located</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="version" type="xs:int" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Version number of media instance</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="position" type="xs:string" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Position of this instance on a data tape, OR the instanceSOM for a tape/server instance</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="directory" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Directory in which this instance is located (only used for raw file systems e.g. NAS, FTP). If not specified defaults to the root of the device.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="0"/>\r
+                                       <xs:maxLength value="255"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="filename" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Filename of this instance on the file system (only used for raw file systems e.g. NAS, FTP)</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="directoryId" type="xs:integer">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The internal Id of the directory containing the media instance.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:attributeGroup>\r
+       <xs:attributeGroup name="mediaInstanceKeyLoose">\r
+               <xs:annotation>\r
+                       <xs:documentation>Composite Key for MediaInstance but where all attributes are optional</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaSetName" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Name of server or tape on which this instance is located</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="version" type="xs:int" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Version number of media instance</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="position" type="xs:string" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Position of this instance on a data tape, OR the instanceSOM for a tape/server instance</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="directory" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Directory in which this instance is located (only used for raw file systems e.g. NAS, FTP)</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="0"/>\r
+                                       <xs:maxLength value="255"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="filename" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Filename of this instance on the file system (only used for raw file systems e.g. NAS, FTP)</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:attributeGroup>\r
+       <xs:complexType name="mediaInstanceList">\r
+               <xs:annotation>\r
+                       <xs:documentation>Collection of media instances</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="mediaInstance" type="mediaInstance" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="mediaInstanceProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a media instance</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="audioTracks" type="audioTracks" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>This is depreciated use the audio tag instead.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="audio" type="audio" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Audio and Audio Group metadata.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="classifications" type="classifications" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Collection of classifications</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="mediaInstanceUsage">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of the usage of a media instance</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaSetName" type="mediaSetName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Name of server or tape on which this instance is located</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="available" type="xs:boolean" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Flag to indicate that the media instance exists on the specified media set</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="lastUsageTime" type="dateTimecode" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The latest time at which this media instance is required for playout.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="lastUsageList" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The media instance last usage tx list name.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="lastUsageListUID" type="xs:integer" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The last usage event UID assigned by the list.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="earliestUsageTime" type="dateTimecode" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The earliest time at which this media instance is required for playout.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="earliestUsageList" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The media instance earliest usage tx list name.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:maxLength value="64"/>\r
+                                       <xs:minLength value="1"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="earliestUsageListUID" type="xs:integer" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The earliest usage event UID assigned by the list.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="listMediaUsageId" type="xs:int" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The unique instance id for this usage instance.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:attributeGroup name="mediaKey">\r
+               <xs:annotation>\r
+                       <xs:documentation>Composite key for media</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaName" type="mediaName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Textual identifier for a piece of media (e.g. server id)</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="mediaType" type="mediaType" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Type of media (see enum)</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:attributeGroup>\r
+       <xs:complexType name="mediaList">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a collection of media.  0 or more instances may also be specified</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="media" type="media" minOccurs="0" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:simpleType name="mediaName">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:minLength value="1"/>\r
+                       <xs:maxLength value="64"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="mediaProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a piece of media.  Does not include properties of instances of that media</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="classifications" type="classifications" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Collection of classifications</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="markups" type="markups" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Collection of markups</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="mediaSegmentationProperites">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for segmenting media.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="markup" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="name" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>The name of the item (e.g. "Part1", "Break")</xs:documentation>\r
+                                               </xs:annotation>\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="1"/>\r
+                                                               <xs:maxLength value="64"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="orderNo" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>The 1 based position of the item within the markup.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:unsignedByte">\r
+                                                               <xs:minInclusive value="1"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="User"/>\r
+                                       <xs:enumeration value="Media"/>\r
+                                       <xs:enumeration value="Markup"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="validationMode" type="validationMode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Option to override the defualt list validation of these properties. Off turns off all validation.  Warn sets warnings when errors are found.  Update will update the properties with the correct data if it's wrong.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="mediaSet">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a piece of media with associated metadata. Make sure the creationTime is in the format 2017-03-23T14:11:00 [YYYY-MM-DD]T[HH:MM:SS] otherwise XML validation will fail.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="auxXML" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Concession for custom metadata</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="mediaSetKey"/>\r
+               <xs:attribute name="serialNumber" type="xs:string"/>\r
+               <xs:attribute name="model" type="xs:string"/>\r
+               <xs:attribute name="capacity" type="xs:string"/>\r
+               <xs:attribute name="firstWritePosition" type="xs:string"/>\r
+               <xs:attribute name="lastWritePosition" type="xs:string"/>\r
+               <xs:attribute name="gapSize" type="xs:string"/>\r
+               <xs:attribute name="nextWritePosition" type="xs:string"/>\r
+               <xs:attribute name="freeSpace" type="xs:string"/>\r
+               <xs:attribute name="fragmentationMetric" type="xs:int"/>\r
+               <xs:attribute name="mountCount" type="xs:int"/>\r
+               <xs:attribute name="lastUsedTime" type="xs:string"/>\r
+               <xs:attribute name="performance" type="xs:int"/>\r
+               <xs:attribute name="textColour" type="xs:int"/>\r
+               <xs:attribute name="backColour" type="xs:int"/>\r
+               <xs:attribute name="formFactor" type="xs:string"/>\r
+               <xs:attribute name="mediaSetLocationType" type="xs:string"/>\r
+               <xs:attribute name="mediaSetLocation" type="xs:string"/>\r
+               <xs:attribute name="mediaSetLocationAddress" type="xs:string"/>\r
+               <xs:attribute name="previousMediaSetLocationType" type="xs:string"/>\r
+               <xs:attribute name="previousMediaSetLocationAddress" type="xs:string"/>\r
+               <xs:attribute name="previousMediaSetLocation" type="xs:string"/>\r
+       </xs:complexType>\r
+       <xs:attributeGroup name="mediaSetKey">\r
+               <xs:annotation>\r
+                       <xs:documentation>Composite key for media set</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaSetName" type="mediaSetName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Textual identifier for a media set (e.g. server name)</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="mediaSetType" type="mediaSetType" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Type of media set (see enum)</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:attributeGroup>\r
+       <xs:simpleType name="mediaSetName">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:minLength value="1"/>\r
+                       <xs:maxLength value="64"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="mediaSetType">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:minLength value="1"/>\r
+                       <xs:maxLength value="32"/>\r
+                       <xs:enumeration value="Disk"/>\r
+                       <xs:enumeration value="Unknown Tape"/>\r
+                       <xs:enumeration value="SingleSpot Tape"/>\r
+                       <xs:enumeration value="MultiSpot Tape"/>\r
+                       <xs:enumeration value="Archive Tape"/>\r
+                       <xs:enumeration value="Foreign Tape"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="mediaSimple">\r
+               <xs:annotation>\r
+                       <xs:documentation>A simple representation of a piece of media, used in the list and other places where only the key is required.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaName" type="mediaName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The unique name for the media, also know as MediaId.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="mediaType" type="mediaType" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of the media, e.g. Video or Subtitle.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="mediaSimpleLoose">\r
+               <xs:annotation>\r
+                       <xs:documentation>A simple representation of a piece of media, but where all attributes are optional. Used in the keep list</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaName" type="mediaName" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The unique name for the media, also know as MediaId.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="mediaType" type="mediaType" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of the media, e.g. Video or Subtitle.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="mediaStreamIngestProperties">\r
+               <xs:complexContent>\r
+                       <xs:extension base="mediaStreamProperties">\r
+                               <xs:attribute name="duration"/>\r
+                       </xs:extension>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="mediaStreamProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Media Stream Job Properties</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:choice minOccurs="0">\r
+                               <xs:element name="video" type="videoProperties"/>\r
+                               <xs:element name="cg" type="cgProperties"/>\r
+                               <xs:element name="subtitle" type="subtitleProperties"/>\r
+                       </xs:choice>\r
+                       <xs:element name="allocation" type="listStreamAllocationProperties" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Allocation is not used in all lists.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="segment" type="mediaSegmentationProperites" minOccurs="0"/>\r
+               </xs:sequence>\r
+               <xs:attribute name="som" type="timecode" use="optional"/>\r
+       </xs:complexType>\r
+       <xs:simpleType name="mediaType">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:minLength value="1"/>\r
+                       <xs:maxLength value="32"/>\r
+                       <xs:enumeration value="Video"/>\r
+                       <xs:enumeration value="CG"/>\r
+                       <xs:enumeration value="Subtitle"/>\r
+                       <xs:enumeration value="Audio"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="mediaUsage">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a piece of media's usage and availability in the system</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="mediaInstancesUsage" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Collection of media instance usage records. This is only returned if the media is actually being used in a playlist.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:element name="mediaInstanceUsage" type="mediaInstanceUsage" maxOccurs="unbounded">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>Usage information for a media instance</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:element>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="mediaKey"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="mediaUsageList">\r
+               <xs:annotation>\r
+                       <xs:documentation>Representation of a collection of media usage elements</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="mediaUsage" type="mediaUsage" minOccurs="0" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:simpleType name="moreResults">\r
+               <xs:annotation>\r
+                       <xs:documentation>Used in media and job lists to show if there are more results than could be returned</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:boolean"/>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="objectType">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Media"/>\r
+                       <xs:enumeration value="MediaInstance"/>\r
+                       <xs:enumeration value="MediaSet"/>\r
+                       <xs:enumeration value="ListEvent"/>\r
+                       <xs:enumeration value="TxSegment"/>\r
+                       <xs:enumeration value="WorkflowTask"/>\r
+                       <xs:enumeration value="Category"/>\r
+                       <xs:enumeration value="Classification"/>\r
+                       <xs:enumeration value="ActiveObject"/>\r
+                       <xs:enumeration value="User"/>\r
+                       <xs:enumeration value="UserGroup"/>\r
+                       <xs:enumeration value="System"/>\r
+                       <xs:enumeration value="Class"/>\r
+                       <xs:enumeration value="Field"/>\r
+                       <xs:enumeration value="Host"/>\r
+                       <xs:enumeration value="Node"/>\r
+                       <xs:enumeration value="Layout"/>\r
+                       <xs:enumeration value="MediaStream"/>\r
+                       <xs:enumeration value="MediaMarkupItem"/>\r
+                       <xs:enumeration value="UsageTypeAuListXref"/>\r
+                       <xs:enumeration value="Directory"/>\r
+                       <xs:enumeration value="Tag"/>\r
+                       <xs:enumeration value="Markup"/>\r
+                       <xs:enumeration value="MarkupItem"/>\r
+                       <xs:enumeration value="AutomationJob"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="playlistActionEvent">\r
+               <xs:annotation>\r
+                       <xs:documentation>An action is a single shot event that performs one task only.  It has no duration and no monitoring.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="properties" type="playlistActionEventProperties">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The properties required for an event depend on its type.  See the playlist documentation for more details.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="childEvents" type="playlistSecondaryEventList" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The are the events secondaries.  Marina supports a maximum of three levels from the root (primary) event so you can have two levels of secondary events.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="state" type="state" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>optional state node</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="playlistEventAttributes"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="playlistActionEventEffectProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for effects in the context of a playlistActionEvent</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:complexContent>\r
+                       <xs:extension base="effectProperties">\r
+                               <xs:attribute name="status" type="statusEnum" use="required">\r
+                                       <xs:annotation>\r
+                                               <xs:documentation>The status of the effect, i.e. On or Off</xs:documentation>\r
+                                       </xs:annotation>\r
+                               </xs:attribute>\r
+                       </xs:extension>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="playlistActionEventProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties allowed for an action event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="schedule" type="actionScheduleProperties" minOccurs="0"/>\r
+                       <xs:element name="event" type="eventProperties" minOccurs="0"/>\r
+                       <xs:element name="switch" type="switchProperties" minOccurs="0"/>\r
+                       <xs:element name="trigger" type="triggerProperties" minOccurs="0"/>\r
+                       <xs:element name="effect" type="playlistActionEventEffectProperties" minOccurs="0"/>\r
+                       <xs:element name="macro" type="macroProperties" minOccurs="0"/>\r
+                       <xs:element name="dolphinGraphic" type="dolphinGraphicProperties" minOccurs="0"/>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:attributeGroup name="playlistEventAttributes">\r
+               <xs:annotation>\r
+                       <xs:documentation>Attributes for a playlist event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="type" type="usageType" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of this event, this could be one of the default enumerations or a custom type for a specific customer or site.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="enabled" type="xs:boolean" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>A disabled event is ignored by the list.  If omitted this value is assumed to be true.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="timerMarker" type="xs:boolean" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>If true the event can be used as a maker for list timers.  If omitted it is assumed to be false.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="uid" type="xs:integer" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The internal Id of the event. Useful for debugging and is ignored on list load.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="manualSecondary" type="xs:boolean" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Manual Secondary event tag. Useful for catching such jobs. If omitted it is assumed to be false</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:attributeGroup>\r
+       <xs:complexType name="playlistPrimaryEvent">\r
+               <xs:annotation>\r
+                       <xs:documentation>A single playlist event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="state" type="state" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Optional state node</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="properties" type="playlistPrimaryEventProperties">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The properties required for an event depend on it's type.  See the playlist documentation for more details.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="childEvents" type="playlistSecondaryEventList" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The child events are this event's secondaries.  Marina supports a maximum of three levels from the root event.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="playlistEventAttributes"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="playlistPrimaryEventList">\r
+               <xs:annotation>\r
+                       <xs:documentation>A List of primary events.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="event" type="playlistPrimaryEvent" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="playlistPrimaryEventProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a playlist event</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="schedule" type="primaryScheduleProperties" minOccurs="0"/>\r
+                       <xs:element name="mediaStream" type="mediaStreamProperties" minOccurs="0"/>\r
+                       <xs:element name="event" type="eventProperties" minOccurs="0"/>\r
+                       <xs:element name="switch" type="switchProperties" minOccurs="0"/>\r
+                       <xs:element name="trigger" type="triggerProperties" minOccurs="0"/>\r
+                       <xs:element name="effect" type="effectProperties" minOccurs="0"/>\r
+                       <xs:element name="media" type="mediaSimple" minOccurs="0"/>\r
+                       <xs:element name="features" type="featuresProperties" minOccurs="0"/>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+                       <xs:element name="block" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="name" use="required"/>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="playlistProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a playlist</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="history" type="historyProperties" minOccurs="0"/>\r
+                       <xs:element name="channel" type="channelProperties" minOccurs="0"/>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+                       <xs:element name="status" type="statusProperties" minOccurs="0"/>\r
+                       <xs:element name="timecode" type="timecodeProperties" minOccurs="0"/>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="playlistSecondaryEvent">\r
+               <xs:annotation>\r
+                       <xs:documentation>A secondary event, can have a start, end or start and end.  This allows starting an event (logo on) with one secondary and stopping it (logo off) with another secondary.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="state" type="state" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Optional state node</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="properties" type="playlistSecondaryEventProperties">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The properties required for an event depend on its type. See the playlist documentation for more details.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="childEvents" type="playlistSecondaryEventList" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The are the events secondaries.  Marina supports a maximum of three levels from the root (primary) event so you can have two levels of secondary events.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attributeGroup ref="playlistEventAttributes"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="playlistSecondaryEventList">\r
+               <xs:annotation>\r
+                       <xs:documentation>A List of secondary events and actions.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence minOccurs="0" maxOccurs="unbounded">\r
+                       <xs:choice>\r
+                               <xs:element name="event" type="playlistSecondaryEvent"/>\r
+                               <xs:element name="action" type="playlistActionEvent"/>\r
+                       </xs:choice>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="playlistSecondaryEventProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a secondary event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="schedule" type="secondaryScheduleProperties" minOccurs="0"/>\r
+                       <xs:element name="mediaStream" type="mediaStreamProperties" minOccurs="0"/>\r
+                       <xs:element name="event" type="eventProperties" minOccurs="0"/>\r
+                       <xs:element name="switch" type="switchProperties" minOccurs="0"/>\r
+                       <xs:element name="trigger" type="triggerProperties" minOccurs="0"/>\r
+                       <xs:element name="effect" type="effectProperties" minOccurs="0"/>\r
+                       <xs:element name="media" type="mediaSimple" minOccurs="0"/>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="primaryScheduleProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Scheduling properties for a primary event</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:complexContent>\r
+                       <xs:extension base="actionScheduleProperties">\r
+                               <xs:attribute name="endType" type="scheduledEndType">\r
+                                       <xs:annotation>\r
+                                               <xs:documentation>Enumerated End Type</xs:documentation>\r
+                                       </xs:annotation>\r
+                               </xs:attribute>\r
+                               <xs:attribute name="endOffset" type="timecode">\r
+                                       <xs:annotation>\r
+                                               <xs:documentation>Offset or Duration</xs:documentation>\r
+                                       </xs:annotation>\r
+                               </xs:attribute>\r
+                       </xs:extension>\r
+               </xs:complexContent>\r
+       </xs:complexType>\r
+       <xs:complexType name="priority">\r
+               <xs:annotation>\r
+                       <xs:documentation>Internal properties for a priority.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:choice>\r
+                       <xs:element name="requiredTime" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="time" type="dateTimecode" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>The time for which the request is required by.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="relative" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="priority" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>The priority level (Low, Medium or High).</xs:documentation>\r
+                                               </xs:annotation>\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:enumeration value="Low"/>\r
+                                                               <xs:enumeration value="Medium"/>\r
+                                                               <xs:enumeration value="High"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:choice>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of the priority (RequiredTime or Relative).</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="RequiredTime"/>\r
+                                       <xs:enumeration value="Relative"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="reconcileKey">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:minLength value="1"/>\r
+                       <xs:maxLength value="64"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="recordSourceProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties used by automation lists for record sources</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:choice>\r
+                       <xs:element name="auto">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="type" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>Specifies a type of automatic record, e.g. PrimaryVideo</xs:documentation>\r
+                                               </xs:annotation>\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string"/>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:choice>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>If "Auto" is selected the auto child element should be completed, otherwise an explicit source can be defined in the switch properties of the event.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Auto"/>\r
+                                       <xs:enumeration value="Explicit"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="redundancyRole">\r
+               <xs:annotation>\r
+                       <xs:documentation>Redundancy Role</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Main"/>\r
+                       <xs:enumeration value="Backup"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="requestProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Resource request parameters</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="requester">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Information about who is making the request.  Most of the attributes are for the UI renderers.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="type" use="required">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:enumeration value="TxList"/>\r
+                                                               <xs:enumeration value="TxListUI"/>\r
+                                                               <xs:enumeration value="StreamControllerUI"/>\r
+                                                               <xs:enumeration value="DebugUI"/>\r
+                                                               <xs:enumeration value="DBMediaCache"/>\r
+                                                               <xs:enumeration value="ListMacroProcessor"/>\r
+                                                               <xs:enumeration value="CommercialList"/>\r
+                                                               <xs:enumeration value="LiveIngest"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="comment">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="1"/>\r
+                                                               <xs:maxLength value="64"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="odid">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:integer">\r
+                                                               <xs:minInclusive value="0"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="bucketId">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:integer">\r
+                                                               <xs:minInclusive value="0"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="username">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="0"/>\r
+                                                               <xs:maxLength value="64"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="userId">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:integer">\r
+                                                               <xs:minInclusive value="0"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="uid">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="0"/>\r
+                                                               <xs:maxLength value="64"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="mediaLocation" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Used for RML requests, controlled by parent's type attribute.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="resourceType" type="xs:string" use="required"/>\r
+                                       <xs:attribute name="resourceName" type="xs:string" use="required">\r
+                                               <xs:annotation>\r
+                                                       <xs:documentation>The name of the requested resource. Media set name in case of tape, Media Set Location Address Id in case of bin and device name in case of RML device.</xs:documentation>\r
+                                               </xs:annotation>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>For requests of type 'Media' the media properties must also be filled in.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="MediaStream"/>\r
+                                       <xs:enumeration value="Media"/>\r
+                                       <xs:enumeration value="TxList"/>\r
+                                       <xs:enumeration value="TxListControl"/>\r
+                                       <xs:enumeration value="MoverList"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="lockType" use="required">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Shared"/>\r
+                                       <xs:enumeration value="Exclusive"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="expiryPeriod" type="timecode"/>\r
+               <xs:attribute name="system" type="xs:boolean"/>\r
+               <xs:attribute name="comment">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="restrictionProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of restricting xml loading.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="channel">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The name of the channel the list has been created for.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="scheduledEndType">\r
+               <xs:annotation>\r
+                       <xs:documentation>End Type for a scheduled event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Duration"/>\r
+                       <xs:enumeration value="Hold"/>\r
+                       <xs:enumeration value="+ParentStart"/>\r
+                       <xs:enumeration value="-ParentStart"/>\r
+                       <xs:enumeration value="+ParentEnd"/>\r
+                       <xs:enumeration value="-ParentEnd"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="scheduledJob">\r
+               <xs:annotation>\r
+                       <xs:documentation>A single scheduled job</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="state" type="jobState" minOccurs="0"/>\r
+                       <xs:element name="properties" type="scheduledJobProperties" minOccurs="0"/>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of this job.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Scheduled Record"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="uid">\r
+                       <xs:annotation>\r
+                               <xs:documentation>This is the internal id for the event which is useful for debugging.  It is ignored when loading the list.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="scheduledJobList">\r
+               <xs:annotation>\r
+                       <xs:documentation>A List of scheduled jobs.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="job" type="scheduledJob" minOccurs="0" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="scheduledJobProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties of a scheduled job.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="schedule" type="scheduledJobScheduleProperties" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Contains data which is used to control the scheduling of this job.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="media" type="media" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>For jobs that operate on media.  \r
+When ingesting material the meta data specified here is used to update the media database.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="source" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Typically this would be an input on a router, but could also be a media stream.</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:choice>\r
+                                               <xs:element name="switch" type="switchAllocation">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>Here you can specify the source to be switched to the destination media streams.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:element>\r
+                                               <xs:element name="mediaStream" type="mediaStreamIngestProperties">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>If the source is video. Here you can specify the som, duration and video properties for the source media. The jobType should always be Play.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                               </xs:element>\r
+                                       </xs:choice>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="destination" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:choice>\r
+                                               <xs:element name="mediaStreams">\r
+                                                       <xs:complexType>\r
+                                                               <xs:sequence>\r
+                                                                       <xs:choice>\r
+                                                                               <xs:element name="video" type="videoProperties"/>\r
+                                                                               <xs:element name="cg" type="cgProperties"/>\r
+                                                                               <xs:element name="subtitle" type="subtitleProperties"/>\r
+                                                                       </xs:choice>\r
+                                                                       <xs:element name="mediaStream" type="mediaStreamIngestProperties" maxOccurs="unbounded">\r
+                                                                               <xs:annotation>\r
+                                                                                       <xs:documentation>Here you can specify the som, duration and video properties for each destination stream. The jobType should always be Record.</xs:documentation>\r
+                                                                               </xs:annotation>\r
+                                                                       </xs:element>\r
+                                                               </xs:sequence>\r
+                                                               <xs:attribute name="overwrite">\r
+                                                                       <xs:annotation>\r
+                                                                               <xs:documentation>Control default overwrite behaviour.</xs:documentation>\r
+                                                                       </xs:annotation>\r
+                                                               </xs:attribute>\r
+                                                               <xs:attribute name="recordSOMType">\r
+                                                                       <xs:annotation>\r
+                                                                               <xs:documentation>Only valid when jobType="record". If omitted explicit is assumed. Explicit uses the SOM set in the mediaStreamElement. TimeOfDay uses the house timecode of when the recording started.</xs:documentation>\r
+                                                                       </xs:annotation>\r
+                                                                       <xs:simpleType>\r
+                                                                               <xs:restriction base="xs:string">\r
+                                                                                       <xs:enumeration value="Explicit"/>\r
+                                                                                       <xs:enumeration value="TimeOfDay"/>\r
+                                                                               </xs:restriction>\r
+                                                                       </xs:simpleType>\r
+                                                               </xs:attribute>\r
+                                                               <xs:attribute name="som" type="timecode" use="optional"/>\r
+                                                       </xs:complexType>\r
+                                               </xs:element>\r
+                                       </xs:choice>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="review" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:choice>\r
+                                               <xs:element name="mediaStreams">\r
+                                                       <xs:complexType>\r
+                                                               <xs:sequence maxOccurs="unbounded">\r
+                                                                       <xs:element name="mediaStream" type="mediaStreamIngestProperties">\r
+                                                                               <xs:annotation>\r
+                                                                                       <xs:documentation>Here you can specify the som, duration and video properties for each review stream. The jobType should always be Play.</xs:documentation>\r
+                                                                               </xs:annotation>\r
+                                                                       </xs:element>\r
+                                                               </xs:sequence>\r
+                                                       </xs:complexType>\r
+                                               </xs:element>\r
+                                       </xs:choice>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="auxData" type="xs:anyType" minOccurs="0"/>\r
+                       <xs:element name="ingest" type="ingestProperties" minOccurs="0"/>\r
+               </xs:all>\r
+       </xs:complexType>\r
+       <xs:complexType name="scheduledJobScheduleProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Scheduling properties for a scheduled job</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="startType" type="scheduledStartType">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Enumerated Start Type.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="startOffset" type="dateTimecodeOrTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>For Fixed starts this is a date time for Parent Start and End this is a timecode span offset.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="endType" type="scheduledEndType">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Enumerated End Type</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="endOffset" type="timecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Offset or Duration</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="scheduledStartType">\r
+               <xs:annotation>\r
+                       <xs:documentation>Start Type for a scheduled event.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Fixed"/>\r
+                       <xs:enumeration value="Manual"/>\r
+                       <xs:enumeration value="Sequential"/>\r
+                       <xs:enumeration value="+ParentStart"/>\r
+                       <xs:enumeration value="-ParentStart"/>\r
+                       <xs:enumeration value="+ParentEnd"/>\r
+                       <xs:enumeration value="-ParentEnd"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="secondaries">\r
+               <xs:annotation>\r
+                       <xs:documentation>A List of secondary jobs.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:element name="secondary" type="job" minOccurs="0" maxOccurs="unbounded"/>\r
+               </xs:sequence>\r
+       </xs:complexType>\r
+       <xs:complexType name="secondaryScheduleProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Scheduling properties for a secondary event</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="startType" type="scheduledStartType">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Start type is optional and is used to turn an event on.  Specify only the end type to turn an event off.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="startOffset" type="dateTimecodeOrTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>For Fixed starts this is a date time for Parent Start and End this is a timecode span offset.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="endType" type="scheduledEndType">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Set this if you want to turn off a secondary event.  If you specify both a startType and an endType you can turn an event on/off in a single event.  It is not valid to have an end type of Duration if you have not specified a startType.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="endOffset" type="timecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Offset or Duration</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="slot">\r
+               <xs:annotation>\r
+                       <xs:documentation>The slot name can be one of the default enumerations or customers can have site specific slot names for GPI card slots.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:union memberTypes="slotEnum">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:union>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="slotEnum">\r
+               <xs:annotation>\r
+                       <xs:documentation>Enumeration of the default slot types.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Cue"/>\r
+                       <xs:enumeration value="Play"/>\r
+                       <xs:enumeration value="Crash Next"/>\r
+                       <xs:enumeration value="Recue"/>\r
+                       <xs:enumeration value="Pause"/>\r
+                       <xs:enumeration value="Uncue"/>\r
+                       <xs:enumeration value="Next"/>\r
+                       <xs:enumeration value="Resume"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="startTimeState">\r
+               <xs:annotation>\r
+                       <xs:documentation>Enumeration of time status of an event</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="ROLLING"/>\r
+                       <xs:enumeration value="FIXED_AND_COMMITTED"/>\r
+                       <xs:enumeration value="FIXED_AND_UNCOMMITTED"/>\r
+                       <xs:enumeration value="NULL"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="state">\r
+               <xs:attribute name="startTimeState" type="startTimeState" use="optional"/>\r
+               <xs:attribute name="scheduleStartTime" type="dateTimecode"/>\r
+               <xs:attribute name="estimatedStartTime" type="dateTimecode"/>\r
+       </xs:complexType>\r
+       <xs:simpleType name="statusEnum">\r
+               <xs:annotation>\r
+                       <xs:documentation>Enumeration of status types.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="On"/>\r
+                       <xs:enumeration value="Off"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="statusProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for the status of the playlist when the mpl was created.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="listChangeCounts" type="changeCounts" minOccurs="0"/>\r
+                       <xs:element name="changeCounts" type="changeCounts" minOccurs="0"/>\r
+               </xs:all>\r
+               <xs:attribute name="activeRegion" type="xs:string">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Size of the active region.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="eventCount" type="xs:integer">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Number of events in the playlist.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="prefMediaRedundancyRole" type="redundancyRole">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Prefered redundancy role for media.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="prefLiveRedundancyRole" type="redundancyRole">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Prefered redundancy role for live.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="focusIndex" type="xs:integer">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Focus index.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="listState" type="xs:string">\r
+                       <xs:annotation>\r
+                               <xs:documentation>State of the TxList, as flags separated by an OR operator |. E.g. listState="Primary Prepared|Primary Running|Primary OnAir".</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="subtitleCaptionMode">\r
+               <xs:annotation>\r
+                       <xs:documentation>Subtitle Captioning Mode.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:minLength value="1"/>\r
+                       <xs:maxLength value="32"/>\r
+                       <xs:enumeration value="Open"/>\r
+                       <xs:enumeration value="Closed"/>\r
+                       <xs:enumeration value="Mixed"/>\r
+                       <xs:enumeration value="None"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="subtitleProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties used for subtitle parameters.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all minOccurs="0">\r
+                       <xs:element name="auxXML" minOccurs="0">\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded"/>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="languages" type="languages" minOccurs="0"/>\r
+               </xs:all>\r
+               <xs:attribute name="source">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Set's the subtitle source such as File or Live.  If omitted File will be assumed.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="File"/>\r
+                                       <xs:enumeration value="File+Live"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="captionMode" type="subtitleCaptionMode" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Sets the subtilers captioning mode.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="setting" type="xs:integer" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Profile number sent to Subtitle device under the guise of setting. This recalls profiles on the device to apply to the subtitle output i.e. HD/SD, font, colour, etc.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="switchAllocation">\r
+               <xs:annotation>\r
+                       <xs:documentation>Allocation properties for a switch</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence>\r
+                       <xs:choice>\r
+                               <xs:element name="auto">\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="type" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>The type of auto allocation. i.e. "MediaStream".</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:minLength value="1"/>\r
+                                                                       <xs:maxLength value="64"/>\r
+                                                                       <xs:enumeration value="MediaStream"/>\r
+                                                                       <xs:enumeration value="PGM"/>\r
+                                                                       <xs:enumeration value="Parent"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                               <xs:element name="logical">\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="name" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>A name of a preconfigured allocation.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:minLength value="1"/>\r
+                                                                       <xs:maxLength value="64"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                               <xs:element name="fixed">\r
+                                       <xs:complexType>\r
+                                               <xs:attribute name="device" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>The name of the device to switch. </xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:minLength value="1"/>\r
+                                                                       <xs:maxLength value="64"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                               <xs:attribute name="port" use="required">\r
+                                                       <xs:annotation>\r
+                                                               <xs:documentation>Port on the device to switch. This can either be the port name or number.</xs:documentation>\r
+                                                       </xs:annotation>\r
+                                                       <xs:simpleType>\r
+                                                               <xs:restriction base="xs:string">\r
+                                                                       <xs:minLength value="1"/>\r
+                                                                       <xs:maxLength value="64"/>\r
+                                                               </xs:restriction>\r
+                                                       </xs:simpleType>\r
+                                               </xs:attribute>\r
+                                       </xs:complexType>\r
+                               </xs:element>\r
+                       </xs:choice>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Indicates the appropriate child element should be created.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                                       <xs:enumeration value="Auto"/>\r
+                                       <xs:enumeration value="Logical"/>\r
+                                       <xs:enumeration value="Fixed"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="switchProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for jobs that contain switches</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="layers" type="layers" minOccurs="0"/>\r
+                       <xs:element name="source" type="switchAllocation" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Source is mandatory however this can be specified using default properties in Marina and is therefore optional for a playlist.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="destination" type="switchAllocation" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Destination is mandatory however this can be specified using default properties in Marina and is therefore optional for a playlist.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+                       <xs:element name="backupSource" type="switchAllocation" minOccurs="0"/>\r
+                       <xs:element name="backupDestination" type="switchAllocation" minOccurs="0"/>\r
+               </xs:all>\r
+               <xs:attribute name="transition" type="switchTransition" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The transition type.  Usually only master control switchers support transitions, if you set a transition that is not supported or you don't set a transition a Cut will be used.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="rate" type="switchRate" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The rate of the transition.  Usually only master control switchers support transitions, if you set a rate that is not supported or you don't set a rate Fast will be used.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="switchRate">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="[none]"/>\r
+                       <xs:enumeration value="Fast"/>\r
+                       <xs:enumeration value="Medium"/>\r
+                       <xs:enumeration value="Slow"/>\r
+                       <xs:enumeration value="Custom"/>\r
+                       <xs:enumeration value="$INHERIT$"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="switchTransition">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="[none]"/>\r
+                       <xs:enumeration value="Cut"/>\r
+                       <xs:enumeration value="Cut Fade"/>\r
+                       <xs:enumeration value="Fade Cut"/>\r
+                       <xs:enumeration value="U-Fade"/>\r
+                       <xs:enumeration value="V-Fade"/>\r
+                       <xs:enumeration value="Mix"/>\r
+                       <xs:enumeration value="Wipe"/>\r
+                       <xs:enumeration value="Custom1"/>\r
+                       <xs:enumeration value="Custom2"/>\r
+                       <xs:enumeration value="Custom3"/>\r
+                       <xs:enumeration value="Custom4"/>\r
+                       <xs:enumeration value="Custom5"/>\r
+                       <xs:enumeration value="$INHERIT$"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="system">\r
+               <xs:annotation>\r
+                       <xs:documentation>A representation of a system object</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="systemName" type="xs:string" use="required"/>\r
+               <xs:attribute name="systemId" type="xs:int" use="required"/>\r
+       </xs:complexType>\r
+       <xs:simpleType name="timecode">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:pattern value="([0-9][0-9][0-9]:)?([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]:([0-1][0-9]|2[0-4])"/>\r
+                       <xs:pattern value="([0-9][0-9][0-9]:)?([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9];[0-2][0-9]"/>\r
+                       <xs:pattern value="$INHERIT$"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="timecodeProperties">\r
+               <xs:attribute name="localTimeOffset" type="dateTimecodeOrTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Offset for the Local Time.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="houseTime" type="dateTimecode">\r
+                       <xs:annotation>\r
+                               <xs:documentation>House Time.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="transfer">\r
+               <xs:annotation>\r
+                       <xs:documentation>Internal properties for a transfer.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:sequence maxOccurs="unbounded">\r
+                       <xs:element name="destination" type="transferDestination">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>The transfer's destination.</xs:documentation>\r
+                               </xs:annotation>\r
+                       </xs:element>\r
+               </xs:sequence>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of the transfer (Copy or Move).</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Copy"/>\r
+                                       <xs:enumeration value="Move"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="transferDestination">\r
+               <xs:annotation>\r
+                       <xs:documentation>Internal properties for a transfer destination.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="mediaSetName" type="mediaSetName" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The mediaSet for the destination.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="mediaName" type="xs:string" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The mediaName as created on the destination.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="overwrite" type="xs:boolean" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Whether or not an existing destination instance should be overwritten.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="triggerProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for trigger jobs</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:choice>\r
+                       <xs:element name="macro">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="name" use="required">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="0"/>\r
+                                                               <xs:maxLength value="64"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+                       <xs:element name="fixed">\r
+                               <xs:complexType>\r
+                                       <xs:attribute name="slotCollectionName" use="required">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="0"/>\r
+                                                               <xs:maxLength value="64"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                                       <xs:attribute name="slot" use="required"/>\r
+                                       <xs:attribute name="level" type="xs:boolean" use="required"/>\r
+                                       <xs:attribute name="pulse" use="optional">\r
+                                               <xs:simpleType>\r
+                                                       <xs:restriction base="xs:string">\r
+                                                               <xs:minLength value="8"/>\r
+                                                               <xs:maxLength value="8"/>\r
+                                                       </xs:restriction>\r
+                                               </xs:simpleType>\r
+                                       </xs:attribute>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:choice>\r
+               <xs:attribute name="type" use="required">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Macro"/>\r
+                                       <xs:enumeration value="Fixed"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:simpleType name="usageType">\r
+               <xs:annotation>\r
+                       <xs:documentation>The usage type can be one of the default enumerations or customers can have site specific usage types.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:union memberTypes="usageTypeEnum">\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:minLength value="1"/>\r
+                                       <xs:maxLength value="64"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:union>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="usageTypeEnum">\r
+               <xs:annotation>\r
+                       <xs:documentation>Enumeration of the default usage types.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="PrimaryVideo"/>\r
+                       <xs:enumeration value="SecVideo"/>\r
+                       <xs:enumeration value="SecRecord"/>\r
+                       <xs:enumeration value="CG"/>\r
+                       <xs:enumeration value="Subtitle"/>\r
+                       <xs:enumeration value="Live"/>\r
+                       <xs:enumeration value="Comment"/>\r
+                       <xs:enumeration value="Marker"/>\r
+                       <xs:enumeration value="VPS"/>\r
+                       <xs:enumeration value="AFD"/>\r
+                       <xs:enumeration value="CommercialBlock"/>\r
+                       <xs:enumeration value="BlockStart"/>\r
+                       <xs:enumeration value="BlockEnd"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="user">\r
+               <xs:annotation>\r
+                       <xs:documentation>A representation of a user object.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="auxXML" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Concession for custom metadata</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:all>\r
+               <xs:attribute name="username" type="xs:string" use="required"/>\r
+               <xs:attribute name="firstName" type="xs:string"/>\r
+               <xs:attribute name="lastName" type="xs:string"/>\r
+               <xs:attribute name="password" type="xs:string"/>\r
+               <xs:attribute name="language" type="xs:int"/>\r
+               <xs:attribute name="stylesheet" type="xs:int"/>\r
+               <xs:attribute name="userGroupName" type="xs:string"/>\r
+       </xs:complexType>\r
+       <xs:complexType name="userGroup">\r
+               <xs:annotation>\r
+                       <xs:documentation>A representation of a user group object.</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:all>\r
+                       <xs:element name="auxXML" minOccurs="0">\r
+                               <xs:annotation>\r
+                                       <xs:documentation>Concession for custom metadata</xs:documentation>\r
+                               </xs:annotation>\r
+                               <xs:complexType>\r
+                                       <xs:sequence>\r
+                                               <xs:any namespace="##any" processContents="skip" minOccurs="0" maxOccurs="unbounded"/>\r
+                                       </xs:sequence>\r
+                               </xs:complexType>\r
+                       </xs:element>\r
+               </xs:all>\r
+               <xs:attribute name="userGroupName" type="xs:string" use="required"/>\r
+       </xs:complexType>\r
+       <xs:simpleType name="validationMode">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties Validation Mode</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:restriction base="xs:string">\r
+                       <xs:enumeration value="Off"/>\r
+                       <xs:enumeration value="Warn"/>\r
+                       <xs:enumeration value="Update"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:simpleType name="version">\r
+               <xs:restriction base="xs:string">\r
+                       <xs:pattern value="(-?\d+\.?){2,4}"/>\r
+               </xs:restriction>\r
+       </xs:simpleType>\r
+       <xs:complexType name="videoProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties used by video media devices</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="tapeName" type="mediaSetName" use="optional">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Used for ingest and tape playout in the playlist.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="jobType" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Play or Record</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Play"/>\r
+                                       <xs:enumeration value="Record"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="overwrite" type="xs:boolean">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Only valid when jobType="record"</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="recordSOMType">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Only valid when jobType="record". If omitted explicit is assumed. Explicit uses the SOM set in the mediaStreamElement. TimeOfDay uses the house timecode of when the recording started.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="Explicit"/>\r
+                                       <xs:enumeration value="TimeOfDay"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="recordInstanceSOMType">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Controls how the SOM is written to the media during a record.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="OrigSOM"/>\r
+                                       <xs:enumeration value="ZeroSOM"/>\r
+                                       <xs:enumeration value="Explicit"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="disableRouting" type="xs:boolean">\r
+                       <xs:annotation>\r
+                               <xs:documentation>When set to true auto routing will be disabled and any explicit routing in the switchProperties xml will be ignored.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+       <xs:complexType name="vpsProperties">\r
+               <xs:annotation>\r
+                       <xs:documentation>Properties for a VPS event</xs:documentation>\r
+               </xs:annotation>\r
+               <xs:attribute name="aspectRatio" type="aspectRatio" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Aspect ratio of video.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="channelIdent" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>4 characters max with optional padded whitespace.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:whiteSpace value="preserve"/>\r
+                                       <xs:minLength value="1" fixed="false"/>\r
+                                       <xs:maxLength value="4"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="child" type="xs:boolean" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Suitable for children true/false.</xs:documentation>\r
+                       </xs:annotation>\r
+               </xs:attribute>\r
+               <xs:attribute name="vpsCodeType" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>The type of time to send. If set to 'time' you must sepcify the dateTime attribute.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="time"/>\r
+                                       <xs:enumeration value="LC"/>\r
+                                       <xs:enumeration value="UC"/>\r
+                                       <xs:enumeration value="SC"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="dateTime">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Date and time in the format 'dd-mmThh:mm'</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:pattern value="[0-3][0-9]-[0-1][0-9]T[0-2][0-9]:[0-6][0-9]"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+               <xs:attribute name="audio" use="required">\r
+                       <xs:annotation>\r
+                               <xs:documentation>Type of audio.</xs:documentation>\r
+                       </xs:annotation>\r
+                       <xs:simpleType>\r
+                               <xs:restriction base="xs:string">\r
+                                       <xs:enumeration value="stereo"/>\r
+                                       <xs:enumeration value="mono"/>\r
+                                       <xs:enumeration value="2channel"/>\r
+                               </xs:restriction>\r
+                       </xs:simpleType>\r
+               </xs:attribute>\r
+       </xs:complexType>\r
+</xs:schema>\r
index 82eecdf748ca16a31e4d890875a6e3cd31817db0..a7ffedd5ce8c39cce946ff612325c8677ce8ae38 100644 (file)
@@ -17,8 +17,8 @@ import user.tsm.client.TSMBufferedClient;
 \r
 public class TSMLister implements IDirectoryLister {\r
 \r
-       private static final String FSNAME = File.separator + "JOBENGINE";\r
-       private static final String HLNAME = File.separator + "JOBENGINE";\r
+       private static final String FSNAME = File.separator + System.getProperty("tsm.fsname", "JOBENGINE");\r
+       private static final String HLNAME = File.separator + System.getProperty("tsm.hlname", "JOBENGINE");\r
        private static final Logger logger = LogManager.getLogger();\r
        private TSMBufferedClient client;\r
 \r
index dae95dba1d8416b430763294dec3746a28844c2f..03d3ebc7a2a3c05c9c844c9f973f660505ee7a48 100644 (file)
@@ -6,18 +6,20 @@ Bundle-Version: 1.0.0
 DynamicImport-Package: *
 Bundle-ClassPath: .
 Require-Bundle: user.jobengine.osgi.commons;bundle-version="1.0.0",
- com.ibm.db2jcc4;bundle-version="4.19.26",
  com.ibm.nosql;bundle-version="4.19.26";visibility:=reexport,
  org.jmock.junit4;bundle-version="2.6.0",
  org.junit;bundle-version="4.12.0",
- org.jmock;bundle-version="2.6.0"
+ org.jmock;bundle-version="2.6.0",
+ com.ibm.db2.jcc;bundle-version="1.4.0"
 Service-Component: OSGI-INF/component.xml
 Bundle-ActivationPolicy: lazy
 Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
+ com.ibm.db2.jcc,
  javax.ws.rs.client,
  javax.ws.rs.core,
  org.apache.commons.io;version="2.2.0",
- org.apache.logging.log4j;version="2.8.2"
+ org.apache.logging.log4j;version="2.8.2",
+ sqlj.runtime.ref
 Export-Package: user.jobengine.db,
  user.jobengine.search
 
index 9f80794c286cafeacae7b1be25e2068e50b4c7f6..ec8c788e38d373ed6c586152ac89983318f9ac2c 100644 (file)
@@ -102,6 +102,8 @@ public interface IItemManager extends IEntityPersister {
 \r
        void disconnect();\r
 \r
+       StoreUri ensureUri(String storeName, String uri, boolean isSystem, boolean isLowres, RemoteStoreProtocol protocol);\r
+\r
        void executeQuery(Connection connection, String query, IResultSetConsumer consumer, IStatementDecorator decorator);\r
 \r
        void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator);\r
@@ -127,6 +129,8 @@ public interface IItemManager extends IEntityPersister {
         */\r
        List<IEntityBase> getAll(Class<? extends IEntityBase> type, long id);\r
 \r
+       // long getExistingRundownMedia(String houseid);\r
+\r
        /**\r
         * Visszaadja egy átmeneti tárolóban tárolt entitás listáját.\r
         *\r
@@ -135,8 +139,6 @@ public interface IItemManager extends IEntityPersister {
         */\r
        List<IEntityBase> getAllCached(Class<? extends IEntityBase> baseClass);\r
 \r
-       // long getExistingRundownMedia(String houseid);\r
-\r
        /**\r
         * Visszaadja az entitásnak megfelelő DAO objektumot.\r
         *\r
index a7038b68e3dccdb0ac1283dd81c19d7a90293bd7..52c4849f5a3c756978311b2fedfa6140c5523b6d 100644 (file)
@@ -452,6 +452,27 @@ public class ItemManager extends MemoryCache implements IItemManager {
                traceOut();\r
        }\r
 \r
+       @Override\r
+       public StoreUri ensureUri(String storeName, String uri, boolean isSystem, boolean isLowres, RemoteStoreProtocol protocol) {\r
+               Store store = getStore(storeName);\r
+               StoreUri result = null;\r
+               if (store == null) {\r
+                       store = createStore(storeName, isSystem, isLowres);\r
+                       store.add();\r
+               } else\r
+                       result = store.getStoreUri(protocol);\r
+\r
+               if (result == null) {\r
+                       result = createStoreUri(protocol, uri);\r
+                       result.setSource(true);\r
+                       result.setTarget(true);\r
+                       result.setStoreId(store.getId());\r
+                       result.add();\r
+               }\r
+               result.setPersister(this);\r
+               return result;\r
+       }\r
+\r
        @Override\r
        public void executeQuery(Connection connection, String query, IResultSetConsumer consumer, IStatementDecorator decorator) {\r
                ResultSet rs = null;\r
@@ -1210,8 +1231,8 @@ public class ItemManager extends MemoryCache implements IItemManager {
                                message = e.getClass().getName();\r
                        StackTraceElement element = Thread.currentThread().getStackTrace()[2];\r
                        message += String.format(", source: %1$s.%2$s", element.getClassName(), element.getMethodName());\r
-                       if (logger != null)\r
-                               logger.error(message, e);\r
+                       //                      if (logger != null)\r
+                       //                              logger.error(message, e);\r
                        throw new ItemManagerException(message);\r
                }\r
        }\r
index 167eb6d301a149de7a907145348f6680233ca88e..ee580d3ef5c03fb5f8459347859f0f3e5d30637e 100644 (file)
@@ -29,9 +29,25 @@ public class Store extends EntityBase implements Serializable {
        public StoreUri getSourceStoreUri(RemoteStoreProtocol protocol) {
                StoreUri result = null;
                List<StoreUri> uris = getStoreUris();
-               for (StoreUri uri : uris) {
-                       if (uri.getProtocol().equals(protocol)) {
-                               if (uri.isSource()) {
+               if (uris != null) {
+                       for (StoreUri uri : uris) {
+                               if (uri.getProtocol().equals(protocol)) {
+                                       if (uri.isSource()) {
+                                               result = uri;
+                                               break;
+                                       }
+                               }
+                       }
+               }
+               return result;
+       }
+
+       public StoreUri getStoreUri(RemoteStoreProtocol protocol) {
+               StoreUri result = null;
+               List<StoreUri> uris = getStoreUris();
+               if (uris != null) {
+                       for (StoreUri uri : uris) {
+                               if (uri.getProtocol().equals(protocol)) {
                                        result = uri;
                                        break;
                                }
index 61909434643aca79f9acc60b34aa9eee34c6e458..3152ba10982ca49cdda67d633bfa5f703e263a1b 100644 (file)
@@ -3,7 +3,6 @@ package user.jobengine.search;
 import java.sql.Connection;\r
 import java.sql.PreparedStatement;\r
 import java.sql.ResultSet;\r
-import java.sql.SQLException;\r
 import java.text.SimpleDateFormat;\r
 import java.util.ArrayList;\r
 import java.util.List;\r
@@ -28,9 +27,8 @@ public class MediaFinder implements IMediaFinder {
                this.manager = manager;\r
        }\r
 \r
-       private PreparedStatement createStatement(Connection connection, String criteria, List<String> typeIDs, SearchOptions options) throws SQLException {\r
+       private PreparedStatement createStatement(Connection connection, String criteria, List<String> typeIDs, SearchOptions options) throws Exception {\r
                StringBuilder typeCriteria = getTypeCriterias(typeIDs);\r
-\r
                String criteriasPattern = getCriteriasRegexPattern(criteria);\r
 \r
                StringBuilder sql = new StringBuilder();\r
@@ -56,7 +54,7 @@ public class MediaFinder implements IMediaFinder {
                }\r
 \r
                if (criteria != null && criteria.trim().length() > 0)\r
-                       sql.append(" AND CONTAINS(md.description, ?) >= 1");\r
+                       sql.append(" AND CONTAINS(md.description, '" + criteria + "') >= 1");\r
 \r
                if (options.getSearchFrom() != null) {\r
                        sql.append(String.format(" AND m.archived > '%s'", df.format(options.getSearchFrom())));\r
@@ -80,8 +78,11 @@ public class MediaFinder implements IMediaFinder {
                logger.info(query);\r
                PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
 \r
-               if (criteria != null && criteria.trim().length() > 0)\r
-                       st.setString(1, criteria);\r
+               //      Ettol elszall a 11.5-on a kereses\r
+               //              if (criteria != null && criteria.trim().length() > 0) {\r
+               //                      st.setString(1, criteria);\r
+               //                      logger.info("Parameter is {}", criteria);\r
+               //              }\r
                return st;\r
        }\r
 \r
index 6caf8c811681401c5f16dbcd9b21c7a3dfcfd0d0..38cff511b946f421d9abcd0b6aa31a4563899034 100644 (file)
@@ -1,9 +1,14 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">\r
-<web-app id="WebApp">\r
+<!-- <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> -->\r
+<!-- <web-app id="WebApp"> -->\r
+<web-app version="2.5" \r
+       xmlns="http://java.sun.com/xml/ns/j2ee" \r
+       xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" \r
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd">\r
+       \r
        <display-name>Media Archivum</display-name>\r
 \r
-       <!-- ZK -->\r
        <servlet>\r
                <servlet-name>zkLoader</servlet-name>\r
                <description>ZK loader for ZUML pages</description>\r
        </servlet>\r
 \r
        <!-- ZK -->\r
-       <servlet-mapping>\r
-               <servlet-name>zkLoader</servlet-name>\r
-               <url-pattern>*.zul</url-pattern>\r
-       </servlet-mapping>\r
+<!--   <servlet-mapping> -->\r
+<!--           <servlet-name>zkLoader</servlet-name> -->\r
+<!--           <url-pattern>*.zul</url-pattern> -->\r
+<!--   </servlet-mapping> -->\r
 \r
-       <servlet-mapping>\r
-               <servlet-name>zkLoader</servlet-name>\r
-               <url-pattern>*.zhtml</url-pattern>\r
-       </servlet-mapping>\r
+<!--   <servlet-mapping> -->\r
+<!--           <servlet-name>zkLoader</servlet-name> -->\r
+<!--           <url-pattern>*.zhtml</url-pattern> -->\r
+<!--   </servlet-mapping> -->\r
 \r
-       <servlet-mapping>\r
-               <servlet-name>auEngine</servlet-name>\r
-               <url-pattern>/zkau/*</url-pattern>\r
-       </servlet-mapping>\r
+<!--   <servlet-mapping> -->\r
+<!--           <servlet-name>auEngine</servlet-name> -->\r
+<!--           <url-pattern>/zkau/*</url-pattern> -->\r
+<!--   </servlet-mapping> -->\r
 \r
        <servlet-mapping>\r
                <servlet-name>action-route</servlet-name>\r
                <url-pattern>/actions/*</url-pattern>\r
        </servlet-mapping>\r
 \r
-<!--   <servlet-mapping> -->\r
-<!--           <servlet-name>zkLoader</servlet-name> -->\r
-<!--           <url-pattern>/test</url-pattern> -->\r
-<!--   </servlet-mapping> -->\r
-\r
        <session-config>\r
                <!-- percben -->\r
                <session-timeout>60</session-timeout>\r
@@ -69,6 +69,8 @@
                <welcome-file>default.jsp</welcome-file>\r
                <welcome-file>index.zhtml</welcome-file>\r
        </welcome-file-list>\r
+\r
+\r
 <!-- Enable http to https redirect \r
        <security-constraint>\r
                <web-resource-collection>\r
index 75b67fbacea003918192d61a50ae8e5328d47cd3..8c092858f01b216978dda84d4819f9221ba5d183 100644 (file)
@@ -27,7 +27,7 @@ public class Activator implements BundleActivator {
                //              } catch (Exception exc) {\r
                //                      logger.error("", exc);\r
                //              }\r
-               /*              \r
+               /*\r
                        tracker = new ServiceTracker<Object, Object>(context, IItemManager.class.getName(), null) {\r
                                @Override\r
                                        public Object addingService(ServiceReference<Object> reference) {\r
@@ -45,7 +45,7 @@ public class Activator implements BundleActivator {
                                                }\r
                                        return super.addingService(reference);\r
                                        }\r
-                               \r
+\r
                                        @Override\r
                                    public void removedService(ServiceReference<Object> reference, Object service) {\r
                                        if (jobEngine != null)\r
@@ -62,7 +62,7 @@ public class Activator implements BundleActivator {
 \r
        @Override\r
        public void stop(BundleContext context) throws Exception {\r
-               /*              \r
+               /*\r
                                if (tracker != null)\r
                                        tracker.close();\r
                */\r
index d6430e7e3d639c01e2a6efffcb0de0a21c415813..805a02d1c73dff6d9b22cbea535bc9186d68c535 100644 (file)
@@ -694,7 +694,7 @@ public class JobEngine implements IJobEngine {
                                InputStream stream = null;
                                try {
                                        String filePath = templateRoot + name;
-                                       logger.info("Loading template: " + name);
+                                       logger.info("Loading template {}", name);
                                        //                                      System.out.println(name);
                                        stream = new FileInputStream(filePath);
                                        Parser parser = new Parser(stream);
@@ -707,7 +707,7 @@ public class JobEngine implements IJobEngine {
                                        jobTemplates.add(jobTemplate);
                                        sb.append(name + " ");
                                } catch (Exception e) {
-                                       logger.error(name + " compile error: " + e.getMessage());
+                                       logger.error("Compile error in {}", name);
                                } finally {
                                        if (stream != null)
                                                stream.close();
index 623b5a21e3b4cf358a57c1775d7cb4b69e298b9b..ba62f2f98205bc4797c05460c1d92cdf6e42a566 100644 (file)
@@ -290,6 +290,7 @@ public class JobRuntime extends Job implements IJobRuntime {
                                        logger.info("Child {} notification", child.getId());
                                        switch (event.getSignalType()) {
                                        case UPDATE:
+                                               //TODO calculate progress
                                                if (JobStatus.SUSPENDED.equals(child.getStatus()))
                                                        forkSempahore.release();
                                                break;
@@ -407,6 +408,8 @@ public class JobRuntime extends Job implements IJobRuntime {
        @Override
        public Marker getMarker() {
                if (sessionMarker == null) {
+                       //                      Marker parentMarker = MarkerManager.getMarker(template);
+                       //                      sessionMarker.setParents(parentMarker);
                        sessionMarker = new MediaCubeMarker();
                        sessionMarker.setSessionID(getParentJobId() == 0 ? String.valueOf(getId()) : String.valueOf(getParentJobId()));
                        sessionMarker.setSessionName(name);
@@ -434,6 +437,8 @@ public class JobRuntime extends Job implements IJobRuntime {
                        result = parameters.get(name);
                } catch (Exception e) {
                        logger.error(e);
+                       //TODO test!
+                       throw e;
                }
                return result;
        }
index 3f7c217b87e04ff72f810813f552f59ee4b6a898..025a743473f049bdc858771acd3a6be638dd9223 100644 (file)
@@ -51,7 +51,6 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
        }\r
 \r
        public void clearAndReset() {\r
-               this.resultSetSize = -1;\r
                this.resultSetSize = -1;\r
                this.cacheStart = 0;\r
                this.cacheEnd = 0;\r
@@ -76,8 +75,7 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
                fireEvent(ListDataEvent.STRUCTURE_CHANGED, -1, -1);\r
        }\r
 \r
-       private void fireLoadCacheEvent() {\r
-               Event evt = new Event(Events.ON_SCROLL);\r
+       private void fireCacheEvent(Event evt) {\r
                for (EventListener el : eventListenerList) {\r
                        try {\r
                                el.onEvent(evt);\r
@@ -102,7 +100,7 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
 \r
        @Override\r
        public ArchivedMedia getElementAt(int index) {\r
-               // logger.debug("CachedListMode.getElementAt(): " + index);\r
+               logger.info("getElementAt {}", index);\r
                ArchivedMedia ret = cache.get(index);\r
                if (ret == null) {\r
                        loadCache(index);\r
@@ -114,15 +112,11 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
                return ret;\r
        }\r
 \r
-       // ListModelList method felulirva\r
-       // after 1. search ++++++++++\r
        @Override\r
        public int getSize() {\r
-               if (this.resultSetSize < 0) {\r
+               if (resultSetSize < 0)\r
                        loadCache(0);\r
-                       // logger.debug("CachedListMode.getSize(): " + this.resultSetSize);\r
-               }\r
-               return this.resultSetSize;\r
+               return resultSetSize == -1 ? 0 : resultSetSize;\r
        }\r
 \r
        /*\r
@@ -130,42 +124,50 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
         * indexhez kepest\r
         */\r
        private void loadCache(int forIndex) {\r
-               clearCache();\r
-               int halfSize = this.cacheSize / 2;\r
-               int rowLimit = this.cacheSize; // 200\r
-               int startPos = 0;\r
-               if ((forIndex - halfSize) > 0) { // forIndex=60 startPos=0\r
-                                                                                               // cache=0-200, forIndex=150\r
-                                                                                       // startPos=50 cache=50-250\r
-                       startPos = (forIndex - halfSize);\r
-               }\r
+               try {\r
+                       //                      logger.info("Loading {}", forIndex);\r
+                       clearCache();\r
+                       int halfSize = this.cacheSize / 2;\r
+                       int rowLimit = this.cacheSize; // 200\r
+                       int startPos = 0;\r
+                       if ((forIndex - halfSize) > 0) { // forIndex=60 startPos=0\r
+                                                                                                       // cache=0-200, forIndex=150\r
+                                                                                               // startPos=50 cache=50-250\r
+                               startPos = (forIndex - halfSize);\r
+                       }\r
 \r
-               int endPos = (startPos + rowLimit);\r
-               endPos = ((this.resultSetSize < 0) || (endPos <= this.resultSetSize)) ? endPos : this.resultSetSize;\r
+                       int endPos = (startPos + rowLimit);\r
+                       endPos = ((this.resultSetSize < 0) || (endPos <= this.resultSetSize)) ? endPos : this.resultSetSize;\r
 \r
-               SearchResult<ArchivedMedia> sr = createSearchResult(startPos, endPos);\r
+                       SearchResult<ArchivedMedia> sr = createSearchResult(startPos, endPos);\r
 \r
-               if (sr != null) {\r
+                       if (sr != null) {\r
 \r
-                       if (this.resultSetSize < 0) {\r
-                               this.resultSetSize = (int) sr.getItemCount();\r
-                       }\r
+                               if (this.resultSetSize < 0) {\r
+                                       this.resultSetSize = (int) sr.getItemCount();\r
+                               }\r
 \r
-                       List<ArchivedMedia> resList = sr.getItems();\r
-                       if (resList != null) {\r
-                               for (int c = 0; c < resList.size(); c++) {\r
-                                       cache.put(startPos + c, resList.get(c));\r
-                                       cache.put(startPos + c, resList.get(c));\r
-                                       // logger.debug("CachedListMode.cached idx: " +\r
-                                       // (startPos + c));\r
+                               List<ArchivedMedia> resList = sr.getItems();\r
+                               if (resList != null) {\r
+                                       for (int c = 0; c < resList.size(); c++) {\r
+                                               cache.put(startPos + c, resList.get(c));\r
+                                               cache.put(startPos + c, resList.get(c));\r
+                                               // logger.debug("CachedListMode.cached idx: " +\r
+                                               // (startPos + c));\r
+                                       }\r
                                }\r
+                               // logger.debug("CachedListMode.cacheSize: " + cache.size());\r
+\r
+                               cacheStart = startPos + 1;\r
+                               cacheEnd = cacheStart + (cache.size() == 0 ? 0 : (cache.size() - 1));\r
+                               BindUtils.postNotifyChange(null, null, this, "*");\r
+                               fireCacheEvent(new Event(Events.ON_SCROLL));\r
                        }\r
-                       // logger.debug("CachedListMode.cacheSize: " + cache.size());\r
 \r
-                       cacheStart = startPos + 1;\r
-                       cacheEnd = cacheStart + (cache.size() == 0 ? 0 : (cache.size() - 1));\r
-                       BindUtils.postNotifyChange(null, null, this, "*");\r
-                       fireLoadCacheEvent();\r
+               } catch (Exception e) {\r
+                       fireCacheEvent(new Event(Events.ON_ERROR, null, e));\r
+                       //ki kell nullazni, egybkent tobbszeros lekerdezes van\r
+                       resultSetSize = 0;\r
                }\r
 \r
        }\r
index fb87296cfe351708afeb72f1cb9cc1d9346b7a42..4a3343f91459c5d79b54bacce6d8749d4ba8daa8 100644 (file)
@@ -33,6 +33,7 @@ import org.zkoss.json.JSONObject;
 import org.zkoss.zk.ui.Component;\r
 import org.zkoss.zk.ui.Executions;\r
 import org.zkoss.zk.ui.event.Event;\r
+import org.zkoss.zk.ui.event.Events;\r
 import org.zkoss.zk.ui.event.KeyEvent;\r
 import org.zkoss.zk.ui.event.MouseEvent;\r
 import org.zkoss.zk.ui.event.SortEvent;\r
@@ -83,7 +84,7 @@ public class SearchModel extends AsyncBaseModel {
        private Map<String, TypeFilter> typeFilters;\r
        private Map<String, String> columnHeaders;\r
        private String searchValue = null;\r
-       private ListModelList<ArchivedMedia> searchResult = null;\r
+       private CachedListModel searchResult = null;\r
        private ArchivedMedia selectedObject = null;\r
        private Validator allFilterCheckedValidator;\r
        private Validator itemSelectedValidator;\r
@@ -179,19 +180,24 @@ public class SearchModel extends AsyncBaseModel {
 \r
        @AfterCompose\r
        public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
-               Selectors.wireComponents(view, this, false);\r
-               Selectors.wireEventListeners(view, this);\r
-               configureSearchResultGrid();\r
-               showExternalMediaID();\r
-               searchHistory = new ListModelList<>(SessionUtil.getUserSearchHistory());\r
-               if (SessionUtil.getUserPageSize() != 0)\r
-                       itemsGrid.setPageSize(SessionUtil.getUserPageSize());\r
-               setSettingsPageSize(itemsGrid.getPageSize());\r
-               if (!allChecked)\r
-                       Clients.showNotification(String.format("Figyelem!<br><br><span style='white-space:nowrap'> A keresési paraméterek megváltoztak! </span>"),\r
-                                       "warning", searchFiltersMenu, "end_center", 3000);\r
+               try {\r
+                       Selectors.wireComponents(view, this, false);\r
+                       Selectors.wireEventListeners(view, this);\r
+                       configureSearchResultGrid();\r
+                       showExternalMediaID();\r
+                       searchHistory = new ListModelList<>(SessionUtil.getUserSearchHistory());\r
+                       if (SessionUtil.getUserPageSize() != 0)\r
+                               itemsGrid.setPageSize(SessionUtil.getUserPageSize());\r
+                       setSettingsPageSize(itemsGrid.getPageSize());\r
+                       if (!allChecked)\r
+                               Clients.showNotification(String.format("Figyelem!<br><br><span style='white-space:nowrap'> A keresési paraméterek megváltoztak! </span>"),\r
+                                               "warning", searchFiltersMenu, "end_center", 3000);\r
+\r
+                       Clients.evalJavaScript("addTags(['aaa', 'aaab', 'aaabb', 'aaabc', 'aaabd', 'aaabe', 'aaac', 'aaacc', 'teszt'], ['aaa', 'aaab']);");\r
+               } catch (Exception e) {\r
+                       handleSearchError(e);\r
+               }\r
 \r
-               Clients.evalJavaScript("addTags(['aaa', 'aaab', 'aaabb', 'aaabc', 'aaabd', 'aaabe', 'aaac', 'aaacc', 'teszt'], ['aaa', 'aaab']);");\r
        }\r
 \r
        private void clearAllFilters() {\r
@@ -266,11 +272,7 @@ public class SearchModel extends AsyncBaseModel {
                        search.select();\r
                        searchResult = null;\r
                        itemsGrid.setActivePage(0);\r
-                       searchValue = search.getText();\r
                        setSelectedObject(null);\r
-                       if ((StringUtils.isBlank(searchValue) || searchValue.length() < 3) && searchFrom == null && searchTo == null && !missingProxy) {\r
-                               throw new Exception("Legalább 3 karakter keresőszöveg, a 'hiányzó proxy' beállítás vagy egy dátum kitöltése szükséges!");\r
-                       }\r
 \r
                        List<String> searchFilters = getSelectedFilters();\r
                        if (SessionUtil.getUserColumnOrder() != null) {\r
@@ -278,23 +280,39 @@ public class SearchModel extends AsyncBaseModel {
                                orderAscending = columnOrder.entrySet().iterator().next().getValue().equals("ascending");\r
                        }\r
 \r
-                       SearchOptions options = new SearchOptions(searchValue, searchFilters, searchFrom, searchTo, missingProxy, orderBy, orderAscending);\r
-                       searchResult = new CachedListModel(options);\r
-                       setSelectedObject(null);\r
-\r
                        if (!searchHistory.contains(searchValue)) {\r
                                searchHistory.add(0, searchValue);\r
                                SessionUtil.putUserSearchHistory(searchHistory);\r
                        }\r
 \r
                        SessionUtil.putUserSearchFilter(searchFilters);\r
+\r
+                       searchValue = search.getText();\r
+                       if ((StringUtils.isBlank(searchValue) || searchValue.length() < 3) && searchFrom == null && searchTo == null && !missingProxy) {\r
+                               throw new Exception("Legalább 3 karakter keresőszöveg, a 'hiányzó proxy' beállítás vagy egy dátum kitöltése szükséges!");\r
+                       }\r
+\r
+                       SearchOptions options = new SearchOptions(searchValue, searchFilters, searchFrom, searchTo, missingProxy, orderBy, orderAscending);\r
+                       searchResult = new CachedListModel(options);\r
+                       searchResult.addEventListener(e -> {\r
+                               if (e.getName().equals(Events.ON_ERROR)) {\r
+                                       Exception ex = (Exception) e.getData();\r
+                                       handleSearchError(ex);\r
+                               }\r
+                       });\r
+                       //TODO miert kell meg1x\r
+                       //setSelectedObject(null);\r
+\r
                } catch (Exception e) {\r
-                       Clients.showNotification(e.getMessage(), "error", search, "start_center", 2000);\r
-                       //Messagebox.show(e.getMessage(), "Hiba", Messagebox.OK, Messagebox.ERROR);\r
-                       logger.error(e);\r
+                       handleSearchError(e);\r
                }\r
        }\r
 \r
+       private void handleSearchError(Exception e) {\r
+               Clients.showNotification(e.getMessage(), "error", search, "start_center", 2000);\r
+               logger.error(e);\r
+       }\r
+\r
        public void doSort(Event event) throws Exception {\r
                itemsGrid.getColumns().getChildren().forEach(c -> ((Column) c).setSortDirection("natural"));\r
                SortEvent evt = (SortEvent) event;\r
@@ -524,23 +542,31 @@ public class SearchModel extends AsyncBaseModel {
 \r
        @Command\r
        public void onAfterRenderGrid() {\r
-               String mediaID = SessionUtil.getQueryParameter(MEDIA_ID);\r
-               if (mediaID != null) {\r
-                       selectedObject = searchResult.getElementAt(0);\r
-                       highlight(selectedObject, true);\r
-                       notifyChange("selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath");\r
-                       return;\r
-               }\r
+               //aszinkron fut le, kulon kezelendo a hiba\r
+               try {\r
+                       if (searchResult != null)\r
+                               logger.info("isempty {}", searchResult.isEmpty());\r
 \r
-               if (preventAfterRender)\r
-                       return;\r
-               preventAfterRender = true;\r
-               logger.info("onAfterRenderGrid");\r
+                       String mediaID = SessionUtil.getQueryParameter(MEDIA_ID);\r
+                       if (mediaID != null) {\r
+                               selectedObject = searchResult.getElementAt(0);\r
+                               highlight(selectedObject, true);\r
+                               notifyChange("selectedObject", "hasLowresMediaFile", "hasTSMMediaFile", "lowresMediaFilePath");\r
+                               return;\r
+                       }\r
+\r
+                       if (preventAfterRender)\r
+                               return;\r
+                       preventAfterRender = true;\r
+                       logger.info("onAfterRenderGrid");\r
 \r
-               if (positionToScroll != -1) {\r
-                       ensureVisible(positionToScroll);\r
-               } else\r
-                       ensureVisible(itemsGrid.getPageSize() * itemsGrid.getActivePage());\r
+                       if (positionToScroll != -1) {\r
+                               ensureVisible(positionToScroll);\r
+                       } else\r
+                               ensureVisible(itemsGrid.getPageSize() * itemsGrid.getActivePage());\r
+               } catch (Exception e) {\r
+                       handleSearchError(e);\r
+               }\r
        }\r
 \r
        @Command\r
index af911e9000cec32e5cba8075544304caee4616ba..b74a6555873037841907974875f70f57c6996a71 100644 (file)
@@ -27,16 +27,17 @@ import user.jobengine.db.IItemManager;
 import user.jobengine.db.Item;
 import user.jobengine.db.ItemManager;
 import user.jobengine.db.Media;
-import user.jobengine.db.Store;
 import user.jobengine.server.IJobEngine;
 import user.jobengine.server.IJobRuntime;
 import user.jobengine.server.JobEngine;
 import user.jobengine.server.JobEngineException;
+import user.jobengine.server.JobRuntime;
 
 public class AMCTests {
        private static IItemManager manager;
        private static IJobEngine jobEngine;
-       private static final String output = "/opt/NEXIO";;
+       private static final String output = "/opt/NEXIO";
+       private static StoreUri tempUri;
 
        @BeforeClass
        public static void initialize() throws Exception {
@@ -49,88 +50,49 @@ public class AMCTests {
 
                manager = new ItemManager();
                manager.connect();
+               tempUri = manager.ensureUri("LOCAL", output, false, false, RemoteStoreProtocol.LOCAL);
        }
 
        @AfterClass
        public static void terminate() throws Exception {
+               tempUri.remove();
                manager.disconnect();
-       }
 
-       StoreUri ensureUri(String storeName, String uri, boolean isSystem, boolean isLowres, RemoteStoreProtocol protocol) {
-               Store store = manager.getStore(storeName);
-               StoreUri result = null;
-               if (store == null) {
-                       store = manager.createStore(storeName, isSystem, isLowres);
-                       store.add();
-
-                       result = manager.createStoreUri(protocol, uri);
-                       result.setSource(true);
-                       result.setTarget(true);
-                       result.setStoreId(store.getId());
-                       result.add();
-               } else {
-                       result = store.getSourceStoreUri(protocol);
-                       result.setPersister(manager);
-                       store.setPersister(manager);
-               }
-               return result;
        }
 
        @Test
-       public void testForkValidateAndArchive() throws Exception {
-               Path statusPath = Paths.get(output, ".STATUS");
-               Files.createDirectories(statusPath);
-
-               StoreUri nexioUri = ensureUri("NEXIO", System.getProperty("nexio.host"), false, false, RemoteStoreProtocol.FTP);
-               StoreUri tempUri = ensureUri("LOCAL", output, false, false, RemoteStoreProtocol.LOCAL);
-               StoreUri tsmUri = ensureUri("TSM", "xxx", true, false, RemoteStoreProtocol.TSM);
-               DownloadableMedia downloadable = new DownloadableMedia();
-               String fileName = "fileName.MXF";
-               long frames = 1000;
-               Path escortFile = Paths.get(statusPath.toString(), "NEXIO.TEST-DANI.MXF.json");
-
-               downloadable.put("fileName", fileName);
-               downloadable.put("frames", frames);
-               downloadable.put("storeUriId", nexioUri.getId());
-               Files.write(escortFile, downloadable.toPrettyString("").getBytes());
-
-               String childTemplate = "validate-and-archive.xml";
-               jobEngine = new JobEngine() {
-                       @Override
-                       public IJobRuntime submit(String template, String name, Map<String, Object> parameters) throws JobEngineException {
-                               if (childTemplate.equals(template)) {
-                                       assertEquals(nexioUri.getId(), ((StoreUri) parameters.get("sourceStoreUri")).getId());
-                                       assertEquals(tempUri.getId(), ((StoreUri) parameters.get("tempStoreUri")).getId());
-                                       assertEquals(tsmUri.getId(), ((StoreUri) parameters.get("tsmStoreUri")).getId());
-                                       assertEquals(fileName, parameters.get("sourceFileName"));
-                                       assertEquals(fileName, parameters.get("tsmFileName"));
-                                       assertEquals(frames, parameters.get("expectedFrameNumber"));
-                                       assertEquals(escortFile.toAbsolutePath().toString(), parameters.get("escortFile"));
-                                       return null;
-                               }
-                               return super.submit(template, name, parameters);
-                       }
+       public void testNexioArchiveChecker() throws Exception {
+               //Tesztelni a HirTV-n lehet
 
-               };
+               jobEngine = new JobEngine();
                jobEngine.startup();
                jobEngine.bindItemManagerService(manager);
 
+               String sourceStoreName = "NEXIO";
+               manager.ensureUri(sourceStoreName, System.getProperty("nexio.host"), false, false, RemoteStoreProtocol.NEXIO);
+
+               Files.createDirectories(Paths.get(output));
+
                Map<String, Object> jobParams = new HashMap<>();
-               jobParams.put("storeName", "LOCAL");
-               jobParams.put("template", childTemplate);
+               jobParams.put("sourceStoreName", sourceStoreName);
+               jobParams.put("escortStoreName", "LOCAL");
                jobParams.put("limit", 1);
-               CountDownLatch finishLatch = new CountDownLatch(1);
 
+               CountDownLatch finishLatch = new CountDownLatch(1);
                IJobRuntime jobRuntime = jobEngine.submit(null, e -> {
                        if (e.isRuntimeTerminated())
                                finishLatch.countDown();
-               }, "fork-validate-and-archive.xml", "Fork validate and archive", jobParams);
+               }, "nexio-archive-checker.xml", "NEXIO archive check", jobParams);
 
                if (jobRuntime != null)
                        finishLatch.await();
 
                FileUtils.deleteDirectory(Paths.get(output).toFile());
                jobEngine.shutdown();
+
+               assertNotNull(jobRuntime);
+               assertEquals(JobStatus.FINISHED, jobRuntime.getStatus());
+
        }
 
        @Test
@@ -141,9 +103,9 @@ public class AMCTests {
                jobEngine.startup();
                jobEngine.bindItemManagerService(manager);
 
-               String storeName = "Local FTP";
-               StoreUri storeUri = ensureUri(storeName, "localhost", false, false, RemoteStoreProtocol.FTP);
-               if (!"admin".equals(storeUri.getUserName())) {
+               String sourceStoreName = "Local FTP";
+               StoreUri storeUri = manager.ensureUri(sourceStoreName, "localhost", false, false, RemoteStoreProtocol.FTP);
+               if (!"dani".equals(storeUri.getUserName())) {
                        storeUri.setUserName("dani");
                        storeUri.setPassword("dani");
                        storeUri.modify();
@@ -152,16 +114,13 @@ public class AMCTests {
                Files.createDirectories(Paths.get(output));
 
                Map<String, Object> jobParams = new HashMap<>();
-               jobParams.put("storeName", storeName);
+               jobParams.put("sourceStoreName", sourceStoreName);
                jobParams.put("protocol", "FTP");
                jobParams.put("wildCard", ".mxf|.mov");
-               jobParams.put("outputPath", output);
-               jobParams.put("limit", 0);
+               jobParams.put("escortStoreName", "LOCAL");
+               jobParams.put("limit", 1);
 
                CountDownLatch finishLatch = new CountDownLatch(1);
-               jobEngine.addJobChangedEventListener(e -> {
-               });
-
                IJobRuntime jobRuntime = jobEngine.submit(null, e -> {
                        if (e.isRuntimeTerminated())
                                finishLatch.countDown();
@@ -179,41 +138,119 @@ public class AMCTests {
        }
 
        @Test
-       public void testNexioArchiveChecker() throws Exception {
-               //Tesztelni a HirTV-n lehet
+       public void testForkValidateAndArchive() throws Exception {
+               //Tesztelni egy helyi FTP-n lehet
+               Path statusPath = Paths.get(output, ".STATUS");
+               Files.createDirectories(statusPath);
 
-               jobEngine = new JobEngine();
-               jobEngine.startup();
-               jobEngine.bindItemManagerService(manager);
+               StoreUri sourceStoreUri = manager.ensureUri("Local FTP", "localhost", false, false, RemoteStoreProtocol.FTP);
+               StoreUri targetStoreUri = manager.ensureUri("TSM", "xxx", true, false, RemoteStoreProtocol.TSM);
+               DownloadableMedia downloadable = new DownloadableMedia();
+               String fileName = "HOSSZ_TEST.MXF";
+               long frames = 24;
+               Path escortFile = Paths.get(statusPath.toString(), "Local FTP.HOSSZ_TEST.MXF.json");
 
-               String storeName = "NEXIO";
-               ensureUri(storeName, System.getProperty("nexio.host"), false, false, RemoteStoreProtocol.NEXIO);
+               downloadable.put("fileName", fileName);
+               downloadable.put("frames", frames);
+               downloadable.put("size", 0);
+               downloadable.put("storeUriId", sourceStoreUri.getId());
 
-               Files.createDirectories(Paths.get(output));
+               Files.write(escortFile, downloadable.toPrettyString("").getBytes());
+
+               String childTemplate = "validate-and-archive.xml";
+
+               CountDownLatch finishLatch = new CountDownLatch(1);
+
+               jobEngine = new JobEngine() {
+                       @Override
+                       public IJobRuntime submit(String template, String name, Map<String, Object> parameters) throws JobEngineException {
+                               if (childTemplate.equals(template)) {
+                                       assertEquals(sourceStoreUri.getId(), ((StoreUri) parameters.get("sourceStoreUri")).getId());
+                                       assertEquals(tempUri.getId(), ((StoreUri) parameters.get("tempStoreUri")).getId());
+                                       assertEquals(targetStoreUri.getId(), ((StoreUri) parameters.get("targetStoreUri")).getId());
+                                       assertEquals(fileName, parameters.get("sourceFileName"));
+                                       assertEquals(frames, parameters.get("expectedFrameNumber"));
+                                       assertEquals(0L, parameters.get("expectedSize"));
+                                       assertEquals(escortFile.toAbsolutePath().toString(), parameters.get("escortFile"));
+                                       finishLatch.countDown();
+                                       return new JobRuntime();
+                               }
+                               return super.submit(template, name, parameters);
+                       }
+
+               };
+               jobEngine.startup();
+               jobEngine.bindItemManagerService(manager);
 
                Map<String, Object> jobParams = new HashMap<>();
-               jobParams.put("storeName", storeName);
-               jobParams.put("outputPath", output);
+               jobParams.put("sourceStoreName", "LOCAL");
+               jobParams.put("targetStoreName", "TSM");
+               jobParams.put("targetProtocol", "TSM");
+               jobParams.put("template", childTemplate);
                jobParams.put("limit", 1);
 
+               IJobRuntime jobRuntime = jobEngine.submit(null, e -> {
+               }, "fork-validate-and-archive.xml", "Fork validate and archive", jobParams);
+
+               if (jobRuntime != null)
+                       finishLatch.await();
+
+               FileUtils.deleteDirectory(Paths.get(output).toFile());
+               jobEngine.shutdown();
+               //assertEquals(jobRuntime.getStatus())
+
+       }
+
+       @Test
+       public void testValidateAndArchive() throws Exception {
+               Path statusPath = Paths.get(output, ".STATUS");
+               Files.createDirectories(statusPath);
+               String fileName = "HOSSZ_TEST.MXF";
+               Path escortFile = Paths.get(statusPath.toString(), "Local FTP." + fileName + ".json");
+
+               StoreUri storeUri = manager.ensureUri("Local FTP", "localhost", false, false, RemoteStoreProtocol.FTP);
+               if (!"dani".equals(storeUri.getUserName())) {
+                       storeUri.setUserName("dani");
+                       storeUri.setPassword("dani");
+                       storeUri.modify();
+               }
+               StoreUri tempUri = manager.ensureUri("LOCAL", output, false, false, RemoteStoreProtocol.LOCAL);
+               StoreUri targetStoreUri = manager.ensureUri("TEST TARGET", output + "/target", false, false, RemoteStoreProtocol.LOCAL);
+               DownloadableMedia downloadable = new DownloadableMedia();
+
+               long frames = 514;
+               downloadable.put("title", fileName);
+               downloadable.put("fileName", fileName);
+               downloadable.put("frames", frames);
+               downloadable.put("size", 0L);
+               downloadable.put("storeUriId", storeUri.getId());
+               Files.write(escortFile, downloadable.toPrettyString("").getBytes());
+
+               jobEngine = new JobEngine();
+               jobEngine.startup();
+               jobEngine.bindItemManagerService(manager);
+
+               Map<String, Object> jobParams = new HashMap<>();
+               jobParams.put("sourceStoreUri", storeUri);
+               jobParams.put("tempStoreUri", tempUri);
+               jobParams.put("targetStoreUri", targetStoreUri);
+               jobParams.put("fileName", fileName);
+               jobParams.put("expectedFrameNumber", frames);
+               jobParams.put("expectedSize", 0L);
+               //jobParams.put("expectedColorSpace", null);
+               jobParams.put("escortFile", escortFile.toAbsolutePath().toString());
                CountDownLatch finishLatch = new CountDownLatch(1);
-               jobEngine.addJobChangedEventListener(e -> {
-               });
 
                IJobRuntime jobRuntime = jobEngine.submit(null, e -> {
                        if (e.isRuntimeTerminated())
                                finishLatch.countDown();
-               }, "nexio-archive-checker.xml", "NEXIO archive check", jobParams);
+               }, "validate-and-archive.xml", "Validate and archive", jobParams);
 
                if (jobRuntime != null)
                        finishLatch.await();
 
                FileUtils.deleteDirectory(Paths.get(output).toFile());
                jobEngine.shutdown();
-
-               assertNotNull(jobRuntime);
-               assertEquals(JobStatus.FINISHED, jobRuntime.getStatus());
-
        }
 
        @Test
@@ -236,9 +273,9 @@ public class AMCTests {
                media.add();
 
                String escortStoreName = "LOCAL";
-               ensureUri(escortStoreName, output, false, false, RemoteStoreProtocol.LOCAL);
+               manager.ensureUri(escortStoreName, output, false, false, RemoteStoreProtocol.LOCAL);
                String targetStoreName = "NEXIO";
-               ensureUri(targetStoreName, System.getProperty("nexio.host"), false, false, RemoteStoreProtocol.FTP);
+               manager.ensureUri(targetStoreName, System.getProperty("nexio.host"), false, false, RemoteStoreProtocol.FTP);
 
                Files.createDirectories(Paths.get(output));
 
@@ -253,7 +290,7 @@ public class AMCTests {
                IJobRuntime jobRuntime = jobEngine.submit(null, e -> {
                        if (e.isRuntimeTerminated())
                                finishLatch.countDown();
-               }, "nexio-missingmaterial-checker.xml", "NEXIO missing material check", jobParams);
+               }, "harris-missingmaterial-checker.xml", "NEXIO missing material check", jobParams);
 
                if (jobRuntime != null)
                        finishLatch.await();
@@ -270,31 +307,91 @@ public class AMCTests {
        }
 
        @Test
-       public void testValidateAndArchive() throws Exception {
-               System.out.println(System.getProperty("user.dir"));
+       public void testForkValidateAndRestore() throws Exception {
+               Path statusPath = Paths.get(output, ".STATUS");
+               Files.createDirectories(statusPath);
+
+               StoreUri videoStoreUri = manager.ensureUri("TEST SOURCE", "/_video", false, false, RemoteStoreProtocol.LOCAL);
+               StoreUri targetStoreUri = manager.ensureUri("TEST TARGET", output, false, false, RemoteStoreProtocol.LOCAL);
+               DownloadableMedia downloadable = new DownloadableMedia();
+               String fileName = "HOSSZ_TEST.MXF";
+               long frames = 24;
+               Path escortFile = Paths.get(statusPath.toString(), "NEXIO.HOSSZ_TEST.MXF.json");
+
+               downloadable.put("fileName", fileName);
+               downloadable.put("frames", frames);
+               downloadable.put("size", 0);
+               downloadable.put("storeUriId", videoStoreUri.getId());
+               Files.write(escortFile, downloadable.toPrettyString("").getBytes());
 
+               CountDownLatch finishLatch = new CountDownLatch(1);
+               String childTemplate = "validate-and-restore.xml";
+               jobEngine = new JobEngine() {
+                       @Override
+                       public IJobRuntime submit(String template, String name, Map<String, Object> parameters) throws JobEngineException {
+                               if (childTemplate.equals(template)) {
+                                       assertEquals(videoStoreUri.getId(), ((StoreUri) parameters.get("sourceStoreUri")).getId());
+                                       assertEquals(tempUri.getId(), ((StoreUri) parameters.get("tempStoreUri")).getId());
+                                       assertEquals(targetStoreUri.getId(), ((StoreUri) parameters.get("targetStoreUri")).getId());
+                                       assertEquals(fileName, parameters.get("sourceFileName"));
+                                       assertEquals(frames, parameters.get("expectedFrameNumber"));
+                                       assertEquals(0L, parameters.get("expectedSize"));
+                                       assertEquals(escortFile.toAbsolutePath().toString(), parameters.get("escortFile"));
+                                       finishLatch.countDown();
+                                       return new JobRuntime();
+                               }
+                               return super.submit(template, name, parameters);
+                       }
+
+               };
+               jobEngine.startup();
+               jobEngine.bindItemManagerService(manager);
+
+               Map<String, Object> jobParams = new HashMap<>();
+               jobParams.put("sourceStoreName", "LOCAL");
+               jobParams.put("targetStoreName", "TEST TARGET");
+               jobParams.put("targetProtocol", "LOCAL");
+               jobParams.put("template", childTemplate);
+               jobParams.put("limit", 1);
+
+               IJobRuntime jobRuntime = jobEngine.submit(null, e -> {
+                       //                      if (e.isRuntimeTerminated())
+                       //                              finishLatch.countDown();
+               }, "fork-validate-and-restore.xml", "Fork validate and archive", jobParams);
+
+               if (jobRuntime != null)
+                       finishLatch.await();
+
+               FileUtils.deleteDirectory(Paths.get(output).toFile());
+               jobEngine.shutdown();
+               //assertEquals(jobRuntime.getStatus())
+
+       }
+
+       @Test
+       public void testValidateAndRestore() throws Exception {
                Path statusPath = Paths.get(output, ".STATUS");
                Files.createDirectories(statusPath);
-               Path escortFile = Paths.get(statusPath.toString(), "NEXIO.test-dani.mxf.json");
-
-               StoreUri nexioUri = ensureUri("NEXIO", System.getProperty("nexio.host"), false, false, RemoteStoreProtocol.FTP);
-               if (nexioUri.getPortNumber() != 2098) {
-                       nexioUri.setUserName("ftp");
-                       nexioUri.setPassword("ftp");
-                       nexioUri.setPortNumber(2098);
-                       nexioUri.modify();
+
+               String fileName = "HOSSZ_TEST.MXF";
+               Path escortFile = Paths.get(statusPath.toString(), "Local FTP." + fileName + ".json");
+
+               StoreUri sourceStoreUri = manager.ensureUri("Local FTP", "localhost", false, false, RemoteStoreProtocol.FTP);
+               if (!"dani".equals(sourceStoreUri.getUserName())) {
+                       sourceStoreUri.setUserName("dani");
+                       sourceStoreUri.setPassword("dani");
+                       sourceStoreUri.modify();
                }
-               StoreUri tempUri = ensureUri("LOCAL", output, false, false, RemoteStoreProtocol.LOCAL);
-               StoreUri tsmUri = ensureUri("TSM", "xxx", true, false, RemoteStoreProtocol.TSM);
+               StoreUri tempStoreUri = manager.ensureUri("LOCAL", output, false, false, RemoteStoreProtocol.LOCAL);
+               StoreUri targetStoreUri = manager.ensureUri("TEST TARGET", output + "/target", false, false, RemoteStoreProtocol.LOCAL);
                DownloadableMedia downloadable = new DownloadableMedia();
 
-               String title = "test-dani";
-               String fileName = title + ".mxf";
-               long frames = 24;
+               long frames = 514;
                downloadable.put("title", fileName);
                downloadable.put("fileName", fileName);
                downloadable.put("frames", frames);
-               downloadable.put("storeUriId", nexioUri.getId());
+               downloadable.put("size", 0L);
+               downloadable.put("storeUriId", sourceStoreUri.getId());
                Files.write(escortFile, downloadable.toPrettyString("").getBytes());
 
                jobEngine = new JobEngine();
@@ -302,24 +399,28 @@ public class AMCTests {
                jobEngine.bindItemManagerService(manager);
 
                Map<String, Object> jobParams = new HashMap<>();
-               jobParams.put("sourceStoreUri", nexioUri);
-               jobParams.put("tempStoreUri", tempUri);
-               jobParams.put("tsmStoreUri", tsmUri);
-               jobParams.put("sourceFileName", fileName);
-               jobParams.put("tsmFileName", "fileName");
+               jobParams.put("sourceStoreUri", sourceStoreUri);
+               jobParams.put("tempStoreUri", tempStoreUri);
+               jobParams.put("targetStoreUri", targetStoreUri);
+               jobParams.put("fileName", fileName);
                jobParams.put("expectedFrameNumber", frames);
+               jobParams.put("expectedSize", 0L);
+               jobParams.put("expectedColorSpace", "PIX_FMT_YUV422P");
                jobParams.put("escortFile", escortFile.toAbsolutePath().toString());
                CountDownLatch finishLatch = new CountDownLatch(1);
 
                IJobRuntime jobRuntime = jobEngine.submit(null, e -> {
                        if (e.isRuntimeTerminated())
                                finishLatch.countDown();
-               }, "validate-and-archive.xml", "Fork validate and archive", jobParams);
+               }, "validate-and-restore.xml", "Validate and restore", jobParams);
 
                if (jobRuntime != null)
                        finishLatch.await();
 
                FileUtils.deleteDirectory(Paths.get(output).toFile());
+               sourceStoreUri.remove();
+               tempStoreUri.remove();
+               targetStoreUri.remove();
                jobEngine.shutdown();
        }
 
index fac36c853a04b4590354222a46772443d4557d55..7739c9da359bf1b3742f66904782873bfac5c68c 100644 (file)
@@ -1,6 +1,9 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>\r
-<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
-       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">\r
+<web-app version="2.4" \r
+       xmlns="http://java.sun.com/xml/ns/j2ee" \r
+       xmlns:j2ee="http://java.sun.com/xml/ns/j2ee" \r
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\r
+       xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">\r
 \r
        <!--    REST SERVICES -->\r
        <!--    http://docs.jboss.org/resteasy/docs/1.0.0.GA/userguide/html/Installation_Configuration.html -->\r
index ce18ea2c60c4878cff84e6ae2b54b84c6c4151d8..9e6b6ca5ef4a57c5f4a56f8d446092446c0f8ee7 100644 (file)
@@ -11,7 +11,7 @@ DynamicImport-Package: *
 Require-Bundle: org.mybatis.mybatis;bundle-version="3.5.2",
  org.junit;bundle-version="4.12.0",
  com.microsoft.sqlserver.sqljdbc,
- com.ibm.db2jcc4;bundle-version="4.19.26"
+ com.ibm.db2.jcc;bundle-version="1.4.0"
 Bundle-ActivationPolicy: lazy
 Import-Package: com.ibm.nosql.bson,
  com.ibm.nosql.json.api,