git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorvasary.daniel <TFS\vasary.daniel>
Wed, 14 Apr 2021 09:39:40 +0000 (09:39 +0000)
committervasary.daniel <TFS\vasary.daniel>
Wed, 14 Apr 2021 09:39:40 +0000 (09:39 +0000)
131 files changed:
server/-configuration/run-mediacube-server-hirtv.launch
server/-configuration/run-mediacube-server-local.launch [new file with mode: 0644]
server/-product/.tpignore
server/-product/production/AMC/configuration/config.ini
server/-product/production/AMC/jobs/executors.xml
server/-product/production/AMC/jobs/schedules.json
server/-product/production/AMC/jobs/steps/PASAPOOLTransferToStep.java
server/-product/production/AMC/jobs/steps/TransferStep.java
server/-product/production/AMC/jobs/steps/VODTransferToStep.java
server/-product/production/HIRTV/configuration/config.ini
server/-product/production/HIRTV/settings/application.yaml
server/-product/production/HIRTV/settings/jetty/http.xml [deleted file]
server/-product/production/HIRTV/settings/jetty/jetty-http.xml [deleted file]
server/-product/production/HIRTV/settings/jetty/jetty-https.xml [deleted file]
server/-product/production/HIRTV/settings/jetty/jetty-ssl-context.xml [deleted file]
server/-product/production/HIRTV/settings/jetty/jetty-ssl.xml [deleted file]
server/-product/production/HIRTV/settings/jetty/jetty.xml [deleted file]
server/-product/production/HIRTV/settings/jetty/localhost.jks [deleted file]
server/-product/production/HIRTV/settings/mediacube.json [deleted file]
server/-product/production/HIRTV/settings/mediacube.yaml [new file with mode: 0644]
server/-product/production/HIRTV/settings/test-jetty/jetty-http.xml [deleted file]
server/-product/production/HIRTV/settings/test-jetty/jetty-https.xml [deleted file]
server/-product/production/HIRTV/settings/test-jetty/jetty-ssl-context.xml [deleted file]
server/-product/production/HIRTV/settings/test-jetty/jetty-ssl.xml [deleted file]
server/-product/production/HIRTV/settings/test-jetty/jetty.xml [deleted file]
server/-product/production/HIRTV/settings/test-jetty/localhost.jks [deleted file]
server/-product/production/LOCAL/configuration/etc/gosh_profile [new file with mode: 0644]
server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/EscortFiles.class [new file with mode: 0644]
server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/ItemManagerExtensions.class [new file with mode: 0644]
server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataType.class [new file with mode: 0644]
server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataTypeDetector$MetadataType.class [new file with mode: 0644]
server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataTypeDetector.class [new file with mode: 0644]
server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep$1.class [new file with mode: 0644]
server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep$2.class [new file with mode: 0644]
server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep.class [new file with mode: 0644]
server/-product/production/LOCAL/jobs/executors.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/schedules.json [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/ArchiveListBuilderStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/ArchiveMaterialSubmitStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/ArchiveRecursive.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/BatchRetrieveForkStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/CancelableStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/CleanupMountedLocationStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/CreateArchiveItemStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/CreateMissingLowresStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/FileCopyStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/FileSearchFilterOptions.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/HSMMigrateStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/MXFCutterStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/MediaToolStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/MetadataTransformStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/OutputPathAndNameSelectorStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/PathItemsCollectorStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/TSMBackupStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/TSMExtendedRetrieveStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/TSMRestoreStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/TSMSimpleRestoreStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/TestForkCancelableStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/TranscodeFFAStranStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/steps/UpdateGhostMediaDataStep.java [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/archive-limited.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/archive-material.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/archive-ondemand.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/archive-recursive.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/batch-retrieve-ondemand.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/cancelable.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/common-copy.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/create-lowres-ondemand.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/delete-materials.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/migrate-hsm.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/retrieve-ondemand.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/retrieve.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/sync-subtitles.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/sys-recreate-lowres.xml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/template1.yaml [new file with mode: 0644]
server/-product/production/LOCAL/jobs/templates/test-fork-cancelable.xml [new file with mode: 0644]
server/-product/production/LOCAL/mediacube.bat [new file with mode: 0644]
server/-product/production/LOCAL/settings/application.yaml [new file with mode: 0644]
server/-product/production/LOCAL/settings/dsm.opt [new file with mode: 0644]
server/-product/production/LOCAL/settings/ffmpeg.yaml [new file with mode: 0644]
server/-product/production/LOCAL/settings/jetty.xml [new file with mode: 0644]
server/-product/production/LOCAL/settings/log4j2.xml [new file with mode: 0644]
server/-product/production/LOCAL/settings/maestro.yaml [new file with mode: 0644]
server/-product/production/LOCAL/settings/mediacube.yaml [new file with mode: 0644]
server/-product/production/MEDIAVIVANTIS/configuration/config.ini
server/-product/production/MEDIAVIVANTIS/jobs/dsm.opt [deleted file]
server/-product/production/MEDIAVIVANTIS/jobs/steps/CreateMissingLowresStep.java
server/-product/production/MEDIAVIVANTIS/jobs/steps/TSMExtendedRetrieveStep.java
server/-product/production/MEDIAVIVANTIS/mediacube.sh
server/-product/production/MEDIAVIVANTIS/settings/application.yaml
server/-product/production/MEDIAVIVANTIS/settings/dsm.opt [new file with mode: 0644]
server/RemoteSystemsTempFiles/.project [new file with mode: 0644]
server/hu.user.mediacube.executors.tests/data/hu/user/mediacube/executors/tests/data/TestChild.java [new file with mode: 0644]
server/hu.user.mediacube.executors.tests/data/hu/user/mediacube/executors/tests/data/TestParent.java [new file with mode: 0644]
server/hu.user.mediacube.executors.tests/jobs/ffmpeg.yaml [new file with mode: 0644]
server/hu.user.mediacube.executors.tests/src/hu/user/mediacube/executors/tests/SmallTests.java
server/user.jobengine.executors/amc/user/jobengine/server/steps/FileSearchFilterOptions.java [new file with mode: 0644]
server/user.jobengine.executors/amc/user/jobengine/server/steps/PathItemsCollectorStep.java [new file with mode: 0644]
server/user.jobengine.executors/mediavivantis/user/jobengine/server/steps/CreateMissingLowresStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/FFMpeg.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TSMExtendedRetrieveStep.java
server/user.jobengine.osgi.commons/src/user/commons/configuration/IConfiguration.java
server/user.jobengine.osgi.commons/src/user/commons/configuration/SystemConfiguration.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioDataMiner.java
server/user.jobengine.osgi.db/migrations/environments/vm.properties [new file with mode: 0644]
server/user.jobengine.osgi.db/migrations/scripts/!006_first_missing_proxy.sql [deleted file]
server/user.jobengine.osgi.db/migrations/scripts/001_create_structure.sql
server/user.jobengine.osgi.db/migrations/scripts/009_add_related_to_job.sql
server/user.jobengine.osgi.db/migrations/scripts/027_create_vod_store.sql
server/user.jobengine.osgi.db/migrations/scripts/028_alter_storeuri_incrase_username.sql
server/user.jobengine.osgi.server/src/user/jobengine/server/IJobRuntime.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngineConfiguration.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobRuntime.java
server/user.jobengine.osgi.server/src/user/jobengine/server/scheduler/ScheduledJob.java
server/user.jobengine.osgi.services/META-INF/MANIFEST.MF
server/user.jobengine.osgi.services/OSGI-INF/TestJobCommandProvider.xml [new file with mode: 0644]
server/user.jobengine.osgi.services/src/user/jobengine/osgi/console/TestJobCommandProvider.java [new file with mode: 0644]
server/user.mediacube.gui/img/outline_theaters_black_18dp.png [new file with mode: 0644]
server/user.mediacube.gui/pages/alternate_retrievebatchselector.zul
server/user.mediacube.gui/pages/jobselector.zul
server/user.mediacube.gui/pages/metadatadetails.zul
server/user.mediacube.gui/pages/retrievebatchselector.zul
server/user.mediacube.gui/pages/searchitems.zul
server/user.mediacube.gui/pages/searchitems/details.zul
server/user.mediacube.gui/pages/searchitems/filters.zul
server/user.mediacube.gui/src/user/jobengine/zk/model/MenuModel.java
server/user.mediacube.gui/src/user/jobengine/zk/model/MetadataDetailsModel.java
server/user.mediacube.gui/src/user/jobengine/zk/model/SearchModel.java
server/user.mediacube.gui/src/user/jobengine/zk/util/SessionUtil.java
server/user.tsm.client/src/user/tsm/client/TSMClient.java

index 45f8f1e948ba2ac0f93872ed5163ba6e9ad225e2..423db869f87e5c905e2fba01497120d9e2fb44c8 100644 (file)
@@ -6,7 +6,7 @@
     <stringAttribute key="bootstrap" value=""/>\r
     <stringAttribute key="checked" value="[NONE]"/>\r
     <booleanAttribute key="clearConfig" value="true"/>\r
-    <stringAttribute key="configLocation" value="${workspace_loc}\-product\productionHIRTV\tmp"/>\r
+    <stringAttribute key="configLocation" value="${workspace_loc}\-product\production\HIRTV\tmp"/>\r
     <booleanAttribute key="default" value="true"/>\r
     <booleanAttribute key="default_auto_start" value="false"/>\r
     <intAttribute key="default_start_level" value="4"/>\r
diff --git a/server/-configuration/run-mediacube-server-local.launch b/server/-configuration/run-mediacube-server-local.launch
new file mode 100644 (file)
index 0000000..049fba2
--- /dev/null
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
+<launchConfiguration type="org.eclipse.pde.ui.EquinoxLauncher">\r
+    <booleanAttribute key="append.args" value="true"/>\r
+    <booleanAttribute key="automaticAdd" value="false"/>\r
+    <booleanAttribute key="automaticValidate" value="true"/>\r
+    <stringAttribute key="bootstrap" value=""/>\r
+    <stringAttribute key="checked" value="[NONE]"/>\r
+    <booleanAttribute key="clearConfig" value="true"/>\r
+    <stringAttribute key="configLocation" value="${workspace_loc}\-product\production\LOCAL\tmp"/>\r
+    <booleanAttribute key="default" value="true"/>\r
+    <booleanAttribute key="default_auto_start" value="false"/>\r
+    <intAttribute key="default_start_level" value="4"/>\r
+    <setAttribute key="deselected_workspace_bundles"/>\r
+    <booleanAttribute key="includeOptional" value="false"/>\r
+    <listAttribute key="org.eclipse.debug.ui.favoriteGroups">\r
+        <listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>\r
+        <listEntry value="org.eclipse.debug.ui.launchGroup.run"/>\r
+    </listAttribute>\r
+    <booleanAttribute key="org.eclipse.jdt.launching.ATTR_USE_START_ON_FIRST_THREAD" value="true"/>\r
+    <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;-Dlog4j.configurationFile=settings/log4j2.xml&#13;&#10;-Djetty.home=settings&#13;&#10;-Djetty.etc.config.urls=jetty.xml&#13;&#10;-Dgosh.home=configuration&#13;&#10;-Djava.io.tmpdir=tmp"/>\r
+    <stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="C:\_workspace\USER\MediaCube\server\-product\production\LOCAL"/>\r
+    <stringAttribute key="pde.version" value="3.3"/>\r
+    <setAttribute key="selected_target_bundles">\r
+        <setEntry value="cglib@default:default"/>\r
+        <setEntry value="com.fasterxml.jackson.core.jackson-annotations@default:default"/>\r
+        <setEntry value="com.fasterxml.jackson.core.jackson-core@default:default"/>\r
+        <setEntry value="com.fasterxml.jackson.core.jackson-databind@default:default"/>\r
+        <setEntry value="com.fasterxml.jackson.dataformat.jackson-dataformat-yaml@default:default"/>\r
+        <setEntry value="com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default"/>\r
+        <setEntry value="com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default"/>\r
+        <setEntry value="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default"/>\r
+        <setEntry value="com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default"/>\r
+        <setEntry value="com.ibm.db2.jcc@default:default"/>\r
+        <setEntry value="com.ibm.nosql@default:default"/>\r
+        <setEntry value="com.microsoft.sqlserver.sqljdbc@default:default"/>\r
+        <setEntry value="com.sun.jna@default:default"/>\r
+        <setEntry value="groovy@default:default"/>\r
+        <setEntry value="io.humble.video-arch-x86_64-pc-linux-gnu6@default:default"/>\r
+        <setEntry value="io.humble.video-arch-x86_64-w64-mingw32@default:default"/>\r
+        <setEntry value="io.humble.video-noarch@default:default"/>\r
+        <setEntry value="javax.annotation-api@default:default"/>\r
+        <setEntry value="javax.mail@default:default"/>\r
+        <setEntry value="javax.servlet-api@default:default"/>\r
+        <setEntry value="javax.ws.rs-api@default:default"/>\r
+        <setEntry value="jcifs@default:default"/>\r
+        <setEntry value="joda-time@default:default"/>\r
+        <setEntry value="junit@default:default"/>\r
+        <setEntry value="org.apache.aries.spifly.dynamic.bundle@default:default"/>\r
+        <setEntry value="org.apache.aries.util@default:default"/>\r
+        <setEntry value="org.apache.commons.beanutils@default:default"/>\r
+        <setEntry value="org.apache.commons.collections@default:default"/>\r
+        <setEntry value="org.apache.commons.digester@default:default"/>\r
+        <setEntry value="org.apache.commons.io@default:default"/>\r
+        <setEntry value="org.apache.commons.lang@default:default"/>\r
+        <setEntry value="org.apache.commons.net@default:default"/>\r
+        <setEntry value="org.apache.felix.gogo.command@default:default"/>\r
+        <setEntry value="org.apache.felix.gogo.runtime@default:default"/>\r
+        <setEntry value="org.apache.felix.gogo.shell@default:default"/>\r
+        <setEntry value="org.apache.httpcomponents.httpclient@default:default"/>\r
+        <setEntry value="org.apache.httpcomponents.httpcore@default:default"/>\r
+        <setEntry value="org.apache.logging.log4j.api@1:true"/>\r
+        <setEntry value="org.apache.logging.log4j.core@default:default"/>\r
+        <setEntry value="org.apache.logging.log4j.slf4j-impl@default:default"/>\r
+        <setEntry value="org.apache.servicemix.bundles.quartz@default:default"/>\r
+        <setEntry value="org.eclipse.equinox.common@2:true"/>\r
+        <setEntry value="org.eclipse.equinox.console@default:default"/>\r
+        <setEntry value="org.eclipse.equinox.ds@1:true"/>\r
+        <setEntry value="org.eclipse.equinox.util@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.deploy@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.http@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.io@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.osgi.boot@default:true"/>\r
+        <setEntry value="org.eclipse.jetty.schemas@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.security@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.server@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.servlet@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.util@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.webapp@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.websocket.api@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.websocket.client@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.websocket.common@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.websocket.server@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.websocket.servlet@default:default"/>\r
+        <setEntry value="org.eclipse.jetty.xml@default:default"/>\r
+        <setEntry value="org.eclipse.osgi.services@default:default"/>\r
+        <setEntry value="org.eclipse.osgi@-1:true"/>\r
+        <setEntry value="org.hamcrest.core@default:default"/>\r
+        <setEntry value="org.jboss.resteasy.client@default:default"/>\r
+        <setEntry value="org.jboss.resteasy.jaxrs-api@default:default"/>\r
+        <setEntry value="org.jboss.resteasy.jaxrs@default:default"/>\r
+        <setEntry value="org.jmock.junit4@default:default"/>\r
+        <setEntry value="org.jmock@default:default"/>\r
+        <setEntry value="org.mybatis.mybatis@default:default"/>\r
+        <setEntry value="org.objectweb.asm.commons@default:default"/>\r
+        <setEntry value="org.objectweb.asm.tree@default:default"/>\r
+        <setEntry value="org.objectweb.asm@default:default"/>\r
+        <setEntry value="org.omnifaces@default:default"/>\r
+        <setEntry value="slf4j.api@default:default"/>\r
+        <setEntry value="slf4j.simple@default:false"/>\r
+    </setAttribute>\r
+    <setAttribute key="selected_workspace_bundles">\r
+        <setEntry value="user.commons.log4j2@default:false"/>\r
+        <setEntry value="user.commons.zk@default:default"/>\r
+        <setEntry value="user.jobengine.osgi.commons@default:true"/>\r
+        <setEntry value="user.jobengine.osgi.db@default:default"/>\r
+        <setEntry value="user.jobengine.osgi.server@default:default"/>\r
+        <setEntry value="user.jobengine.osgi.services@default:default"/>\r
+        <setEntry value="user.mediacube.gui@default:default"/>\r
+        <setEntry value="user.mediacube.metadata@default:default"/>\r
+        <setEntry value="user.tsm.client@default:default"/>\r
+    </setAttribute>\r
+    <booleanAttribute key="show_selected_only" value="false"/>\r
+    <booleanAttribute key="tracing" value="false"/>\r
+    <booleanAttribute key="useCustomFeatures" value="false"/>\r
+    <booleanAttribute key="useDefaultConfigArea" value="false"/>\r
+</launchConfiguration>\r
index ac77a1bc65e8a18bcc477c15cf06fc53947a16d9..51fcdd4ad291fe3c728bfb4af3624bcd243a659b 100644 (file)
@@ -9,3 +9,5 @@
 \Q/production/HIRTV/tmp/\E.*\r
 \Q/production/MEDIAVIVANTIS/log/\E.*\r
 \Q/production/AMC/tmp/\E.*\r
+\Q/production/LOCAL/log/\E.*\r
+\Q/production/LOCAL/tmp/\E.*\r
index fd6901cd72cfc7d29d2db2800a49788f2590d59c..265bf754a360cae19b62a363c9e32b5ec0a32010 100644 (file)
@@ -1,5 +1,5 @@
 #This configuration file was written by: org.eclipse.equinox.internal.frameworkadmin.equinox.EquinoxFwConfigFileParser\r
-#Thu Mar 04 15:26:35 CET 2021\r
+#Thu Mar 11 15:00:06 CET 2021\r
 osgi.bundles=reference\:file\:cglib_2.2.2.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-annotations_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-core_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-databind_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.dataformat.jackson-dataformat-yaml_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.datatype.jackson-datatype-joda_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.jaxrs.jackson-jaxrs-base_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.module.jackson-module-jaxb-annotations_2.4.5.jar@4,reference\:file\:com.ibm.db2.jcc_1.4.0.jar@4,reference\:file\:com.ibm.nosql_4.19.26.jar@4,reference\:file\:com.microsoft.sqlserver.sqljdbc_6.0.8112.100.jar@4,reference\:file\:com.sun.jna_4.2.0.jar@4,reference\:file\:groovy_3.0.3.jar@4,reference\:file\:io.humble.video-arch-x86_64-pc-linux-gnu6_0.2.1.jar@4,reference\:file\:io.humble.video-arch-x86_64-w64-mingw32_0.2.1.jar@4,reference\:file\:io.humble.video-noarch_0.2.1.jar@4,reference\:file\:javax.annotation-api_1.2.0.jar@4,reference\:file\:javax.mail_1.5.0.b01.jar@4,reference\:file\:javax.servlet-api_3.1.0.jar@4,reference\:file\:javax.ws.rs-api_2.0.1.jar@4,reference\:file\:jcifs_1.3.17.jar@4,reference\:file\:joda-time_2.2.0.jar@4,reference\:file\:junit_4.12.0.jar@4,reference\:file\:org.apache.aries.spifly.dynamic.bundle_1.0.8.jar@4,reference\:file\:org.apache.aries.util_1.0.0.jar@4,reference\:file\:org.apache.commons.beanutils_1.8.3.jar@4,reference\:file\:org.apache.commons.collections_3.2.2.jar@4,reference\:file\:org.apache.commons.digester_3.2.0.jar@4,reference\:file\:org.apache.commons.io_2.6.0.jar@4,reference\:file\:org.apache.commons.lang_2.6.0.jar@4,reference\:file\:org.apache.commons.net_3.6.0.jar@4,reference\:file\:org.apache.felix.gogo.command_0.12.0.jar@4,reference\:file\:org.apache.felix.gogo.runtime_0.12.0.jar@4,reference\:file\:org.apache.felix.gogo.shell_0.12.0.jar@4,reference\:file\:org.apache.httpcomponents.httpclient_4.2.6.jar@4,reference\:file\:org.apache.httpcomponents.httpcore_4.2.5.jar@4,reference\:file\:org.apache.logging.log4j.api_2.8.2.jar@1\:start,reference\:file\:org.apache.logging.log4j.core_2.8.2.jar@4,reference\:file\:org.apache.logging.log4j.slf4j-impl_2.8.2.jar@4,reference\:file\:org.apache.servicemix.bundles.quartz_2.3.0.2.jar@4,reference\:file\:org.eclipse.equinox.common_3.8.0.v20160509-1230.jar@2\:start,reference\:file\:org.eclipse.equinox.console_1.1.200.v20150929-1405.jar@4,reference\:file\:org.eclipse.equinox.ds_1.4.400.v20160226-2036.jar@1\:start,reference\:file\:org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar@4,reference\:file\:org.eclipse.equinox.util_1.0.500.v20130404-1337.jar@4,reference\:file\:org.eclipse.jetty.client_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.deploy_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.http_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.io_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.osgi.boot_9.3.9.v20160517.jar@4\:start,reference\:file\:org.eclipse.jetty.schemas_3.1.0.jar@4,reference\:file\:org.eclipse.jetty.security_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.server_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.servlet_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.util_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.webapp_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.api_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.client_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.common_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.server_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.servlet_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.xml_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.osgi.services_3.2.100.v20100503.jar@4,reference\:file\:org.hamcrest.core_1.3.0.jar@4,reference\:file\:org.jboss.resteasy.client_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxb-provider_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxrs_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxrs-api_3.0.11.Final.jar@4,reference\:file\:org.jmock_2.6.0.jar@4,reference\:file\:org.jmock.junit4_2.6.0.jar@4,reference\:file\:org.mybatis.mybatis_3.5.2.jar@4,reference\:file\:org.objectweb.asm_5.0.1.jar@4,reference\:file\:org.objectweb.asm.commons_5.0.1.jar@4,reference\:file\:org.objectweb.asm.tree_5.0.1.jar@4,reference\:file\:org.omnifaces_3.4.1.jar@4,reference\:file\:slf4j.api_1.7.24.jar@4,reference\:file\:slf4j.simple_1.7.2.jar@4,reference\:file\:user.commons.log4j2_1.0.0.jar@4,reference\:file\:user.commons.zk_8.0.3.jar@4,reference\:file\:user.jobengine.osgi.commons_1.0.0.jar@4\:start,reference\:file\:user.jobengine.osgi.db_1.0.0.jar@4,reference\:file\:user.jobengine.osgi.server_1.0.0.jar@4,reference\:file\:user.jobengine.osgi.services_1.0.0.jar@4,reference\:file\:user.mediacube.gui_1.0.0.jar@4,reference\:file\:user.mediacube.metadata_1.0.0.jar@4,reference\:file\:user.tsm.client_1.2.0.jar@4\r
 equinox.use.ds=true\r
 osgi.bundles.defaultStartLevel=4\r
index 0f868e579789bbf63d7b2dba88427cf28be03632..17e610576ae9e70724c726db4e9f0137673bdd70 100644 (file)
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <executors>\r
+       <executor className="ServerStatusReportStep.java" maxConcurrent="1" isRemote="false" />\r
        <executor className="TransferStep.java" maxConcurrent="1" isRemote="false" />\r
        <executor className="TSMTransferToStep.java" maxConcurrent="4" isRemote="false" />\r
        <executor className="TSMTransferFromStep.java" maxConcurrent="8" isRemote="false" />\r
index a6bb1e5d746d1500f387996d85cfab2f1849d6fd..622f4da750b6f34075fc7a82826da5cb63e9264e 100644 (file)
@@ -1,11 +1,10 @@
 {"joblist":[\r
        {\r
-      "template": "test-fork-cancelable.xml",\r
-      "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
-       },\r
-       {\r
-      "template": "validate-dir-mxf.xml",\r
-      "parameters": [ {"name": "source", "value": "h:/TEMP/", "type": "java.lang.String"} ]\r
+      "template": "server-status-report.xml",\r
+         "name" : "MediaCube státusz",\r
+      "active": true,\r
+      "executeimmediate": false,\r
+         "cronexpression": "0 */30 * * * ?"\r
        },\r
        {\r
          "template": "nexio1-archive-checker.xml",\r
index dfe2825dca8d89d94e7ff5deb48cdc18b730d1cd..0c69ee3aa414a02c362edab0a9d0c47f5d680465 100644 (file)
@@ -3,7 +3,6 @@ package user.jobengine.server.steps;
 import java.nio.file.Path;\r
 import java.nio.file.Paths;\r
 \r
-import org.apache.commons.io.FileUtils;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 import org.apache.logging.log4j.Marker;\r
@@ -11,7 +10,8 @@ import org.apache.logging.log4j.MarkerManager;
 \r
 import user.commons.RemoteFile;\r
 import user.commons.StoreUri;\r
-import user.commons.mediatool.MediaInfo;\r
+import user.commons.mediaarea.MediaArea;\r
+import user.commons.strings.FileSizeUtils;\r
 \r
 public class PASAPOOLTransferToStep extends TransferStep {\r
        private static final Logger logger = LogManager.getLogger();\r
@@ -22,13 +22,13 @@ public class PASAPOOLTransferToStep extends TransferStep {
        private static final String DISPLAY_ASPECT_4_3 = "4:3";\r
        private StoreUri sourceStoreUri;\r
        private String sourceFileName;\r
+       private Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
 \r
        @Override\r
        @StepEntry\r
        public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
                this.sourceStoreUri = sourceStoreUri;\r
                this.sourceFileName = sourceFileName;\r
-               logMediaProfile();\r
                long start = System.currentTimeMillis();\r
                Object[] result = super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
                RemoteFile remoteFile = sourceStoreUri.getRemoteFile(targetFileName);\r
@@ -36,119 +36,67 @@ public class PASAPOOLTransferToStep extends TransferStep {
                        long diff = (System.currentTimeMillis() - start) / 1000;\r
                        if (diff > 0) {\r
                                long bytesSpeed = remoteFile.getSize() / diff;\r
-                               String speed = FileUtils.byteCountToDisplaySize(bytesSpeed);\r
-                               logger.info(getMarker(), "{} size is {}, upload speed was {}/sec", targetFileName, FileUtils.byteCountToDisplaySize(remoteFile.getSize()), speed);\r
+                               String speed = FileSizeUtils.sizeAsString(bytesSpeed);\r
+                               logger.info(getMarker(), "{} size is {}, upload speed was {}/sec", targetFileName, FileSizeUtils.sizeAsString(remoteFile.getSize()), speed);\r
                        }\r
                }\r
                return result;\r
        }\r
 \r
-       //      HD\r
-       //      height = 1080\r
-       //      >PEABLEBEACH | \\10.170.100.21\media\BeachPool\r
-       private boolean isHD(MediaInfo mi) {\r
-               return mi.getHeight() == 1080;\r
-       }\r
-\r
-       //      @Override\r
-       //      protected StoreUri getTargetStoreUri() {\r
-       //              StoreUri result = null;\r
-       //              try {\r
-       //                      Path filePath = Paths.get(sourceStoreUri.toString(true), sourceFileName);\r
-       //                      MediaInfo mi = new MediaInfo(filePath);\r
-       //                      mi.process();\r
-       //\r
-       //                      if (isHD(mi)) {\r
-       //                              result = getManager().getStoreUri("PEABLEBEACH", targetStoreUri.getProtocol());\r
-       //                              return result;\r
-       //                      }\r
-       //\r
-       //                      if (isSD_HIGH_16_9(mi)) {\r
-       //                              result = getManager().getStoreUri("SELENIOPOOL_16_9", targetStoreUri.getProtocol());\r
-       //                              return result;\r
-       //                      }\r
-       //\r
-       //                      if (isSD_HIGH_4_3(mi)) {\r
-       //                              result = getManager().getStoreUri("SELENIOPOOL_4_3", targetStoreUri.getProtocol());\r
-       //                              return result;\r
-       //                      }\r
-       //\r
-       //                      if (isSD_MAIN_422(mi)) {\r
-       //                              result = getManager().getStoreUri("PEABLEBEACH", targetStoreUri.getProtocol());\r
-       //                              return result;\r
-       //                      }\r
-       //              } catch (Exception e) {\r
-       //                      logger.error(getSessionMarker(), e.getMessage());\r
-       //                      result = targetStoreUri;\r
-       //              }\r
-       //              return result;\r
-       //      }\r
-\r
-       //       SD - HIGH@HIGH / 16:9\r
-       //      height < 650\r
-       //      profile=High\r
-       //      aspect=16:9\r
-       //      >SELENIOPOOL_16_9 | \\10.170.100.21\media\SelenioPool\16_9\r
-       private boolean isSD_HIGH_16_9(MediaInfo mi) {\r
-               String codecProfileName = mi.getCodecProfileName();\r
-               if (codecProfileName != null)\r
-                       codecProfileName = codecProfileName.toUpperCase();\r
-               return mi.getHeight() < 650 && CODEC_PROFILE_HIGH.equals(codecProfileName) && DISPLAY_ASPECT_16_9.equals(mi.getDisplayAspect());\r
-       }\r
-\r
-       //      SD - HIGH@HIGH / 4:3\r
-       //      height < 650\r
-       //      profile=High\r
-       //      aspect=4:3\r
-       //      >SELENIOPOOL_4_3 | \\10.170.100.21\media\SelenioPool\4_3\r
-       private boolean isSD_HIGH_4_3(MediaInfo mi) {\r
-               String codecProfileName = mi.getCodecProfileName();\r
-               if (codecProfileName != null)\r
-                       codecProfileName = codecProfileName.toUpperCase();\r
-               return mi.getHeight() < 650 && CODEC_PROFILE_HIGH.equals(codecProfileName) && DISPLAY_ASPECT_4_3.equals(mi.getDisplayAspect());\r
-       }\r
-\r
-       //      SD - MAIN/422@HIGH\r
-       //      height < 650\r
-       //      profile=Main || profile=4:2:2\r
-       //      >PEABLEBEACH | \\10.170.100.21\media\BeachPool\r
-       private boolean isSD_MAIN_422(MediaInfo mi) {\r
-               String codecProfileName = mi.getCodecProfileName();\r
-               if (codecProfileName != null)\r
-                       codecProfileName = codecProfileName.toUpperCase();\r
-               return mi.getHeight() < 650 && (CODEC_PROFILE_MAIN.equals(codecProfileName) || CODEC_PROFILE_422.equals(codecProfileName));\r
-       }\r
-\r
-       protected void logMediaProfile() {\r
-               Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
+       @Override\r
+       protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
+               StoreUri result = targetStoreUri;\r
                try {\r
                        Path filePath = Paths.get(sourceStoreUri.toString(true), sourceFileName);\r
-                       MediaInfo mi = new MediaInfo(filePath);\r
+                       MediaArea mi = new MediaArea(filePath);\r
                        mi.process();\r
-                       logger.info(marker, "{} data : {} {} {}", sourceFileName, mi.getCodecProfileName(), mi.getHeight(), mi.getDisplayAspect());\r
 \r
                        if (isHD(mi)) {\r
-                               logger.info(marker, "{} is HD", sourceFileName);\r
-                               return;\r
+                               logger.info(marker, "{} is MOVED_HD", sourceFileName);\r
+                               result = getManager().getStoreUri("PEABLEBEACH", targetStoreUri.getProtocol());\r
+                               return result;\r
                        }\r
 \r
                        if (isSD_HIGH_16_9(mi)) {\r
-                               logger.info(marker, "{} is SD_HIGH_16_9", sourceFileName);\r
-                               return;\r
+                               logger.info(marker, "{} is CONVSD16_9", sourceFileName);\r
+                               result = getManager().getStoreUri("SELENIOPOOL_16_9", targetStoreUri.getProtocol());\r
+                               return result;\r
                        }\r
 \r
                        if (isSD_HIGH_4_3(mi)) {\r
-                               logger.info(marker, "{} is SD_HIGH_4_3", sourceFileName);\r
-                               return;\r
+                               logger.info(marker, "{} is CONVSD4_3", sourceFileName);\r
+                               result = getManager().getStoreUri("SELENIOPOOL_4_3", targetStoreUri.getProtocol());\r
+                               return result;\r
                        }\r
 \r
                        if (isSD_MAIN_422(mi)) {\r
-                               logger.info(marker, "{} is SD_MAIN_422", sourceFileName);\r
-                               return;\r
+                               logger.info(marker, "{} is MOVED_SD", sourceFileName);\r
+                               result = getManager().getStoreUri("PEABLEBEACH", targetStoreUri.getProtocol());\r
+                               return result;\r
                        }\r
                } catch (Exception e) {\r
-                       logger.error(marker, e.getMessage());\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
                }\r
+               return result;\r
+       }\r
+\r
+       private boolean isHD(MediaArea mi) {\r
+               return mi.getHeight() == 1080;\r
+       }\r
+\r
+       private boolean isSD_HIGH_16_9(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_16_9.equals(mi.getDisplayAspect());\r
+       }\r
+\r
+       private boolean isSD_HIGH_4_3(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && formatProfileName.contains(CODEC_PROFILE_HIGH) && DISPLAY_ASPECT_4_3.equals(mi.getDisplayAspect());\r
+       }\r
+\r
+       private boolean isSD_MAIN_422(MediaArea mi) {\r
+               String formatProfileName = mi.getFormatProfileName();\r
+               return mi.getHeight() < 650 && (formatProfileName.contains(CODEC_PROFILE_MAIN) || formatProfileName.contains(CODEC_PROFILE_422));\r
        }\r
 \r
 }\r
index bdf02615f54cca22dfe41f7082506793fe5e9c6b..67cc025c9b5aaae4063e73f3d7a341ebd919030d 100644 (file)
@@ -15,13 +15,10 @@ import user.jobengine.db.Store;
 public class TransferStep extends JobStep {\r
        private static final String DOT_PART = ".part";\r
        private static final Logger logger = LogManager.getLogger();\r
-       private static final boolean simulateTransferToTSM = Boolean.parseBoolean(System.getProperty("test.simulate.transfer.tsm", "false"));\r
-       protected StoreUri targetStoreUri;\r
 \r
        @StepEntry\r
        public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
                try {\r
-                       this.targetStoreUri = targetStoreUri;\r
                        getJobRuntime().setCancelable(false);\r
 \r
                        Store sourceStore = getManager().getStore(sourceStoreUri.getStoreId());\r
@@ -30,30 +27,13 @@ public class TransferStep extends JobStep {
                        String description = String.format("%s -> %s : %s", sourceStore.getName(), targetStore.getName(), sourceFileName);\r
                        getJobRuntime().setDescription(description);\r
 \r
-                       //logger.info(getSessionMarker(), String.valueOf(isSimulateTSMWrite(sourceStoreUri, targetStoreUri)));\r
-                       if (isSimulateTSMWrite(sourceStoreUri, targetStoreUri)) {\r
-                               logger.info(getMarker(), "Skipping real TSM write of {} from {} to {}", sourceFileName, sourceStoreUri, targetStoreUri);\r
-                               return null;\r
-                       }\r
-\r
                        sourceStoreUri.addProgressListener(e -> setProgress(e.getProgress()));\r
 \r
-                       this.targetStoreUri = getTargetStoreUri();\r
-                       tryCopy(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
+                       StoreUri currentTargetStoreUri = getTargetStoreUri(targetStoreUri);\r
+                       tryCopy(sourceStoreUri, sourceFileName, currentTargetStoreUri, targetFileName);\r
                } catch (Exception e) {\r
                        logger.error(getMarker(), "Error in transfer of {} when copying from {} to {}.", sourceFileName, sourceStoreUri, targetStoreUri);\r
                        throw e;\r
-                       //                      logger.error(getMarker(), "Error in transfer of {} when copying from {} to {}. Retrying after 3 seconds.", sourceFileName, sourceStoreUri,\r
-                       //                                      targetStoreUri);\r
-\r
-                       //                      try {\r
-                       //                              Thread.sleep(3000);\r
-                       //                              tryCopy(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
-                       //                      } catch (Exception e1) {\r
-                       //                              logger.error(getSessionMarker(), "Error in transfer of {} when copying from {} to {}. System message is: {}", sourceFileName, sourceStoreUri,\r
-                       //                                              targetStoreUri, e1.getMessage());\r
-                       //                              throw e1;\r
-                       //                      }\r
                } finally {\r
                        if (sourceStoreUri != null)\r
                                sourceStoreUri.cleanUp();\r
@@ -63,7 +43,7 @@ public class TransferStep extends JobStep {
                return null;\r
        }\r
 \r
-       protected StoreUri getTargetStoreUri() {\r
+       protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
                return targetStoreUri;\r
        }\r
 \r
@@ -71,10 +51,6 @@ public class TransferStep extends JobStep {
                return DOT_PART;\r
        }\r
 \r
-       private boolean isSimulateTSMWrite(StoreUri sourceStoreUri, StoreUri targetStoreUri) {\r
-               return simulateTransferToTSM && (RemoteStoreProtocol.TSM.equals(targetStoreUri.getProtocol()));\r
-       }\r
-\r
        private void tryCopy(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String targetFileName) throws Exception {\r
                String currentTargetFileName = targetFileName;\r
 \r
@@ -96,7 +72,7 @@ public class TransferStep extends JobStep {
 \r
                sourceStoreUri.transferFrom(targetStoreUri, sourceFileName, currentTargetFileName);\r
 \r
-               logger.info(getMarker(), "Transfer completed from {} as {} to {} as {}", sourceFileName, sourceStoreUri, targetStoreUri, currentTargetFileName);\r
+               logger.info(getMarker(), "Transfer of {} completed from {} to {}", sourceFileName, sourceStoreUri, currentTargetFileName);\r
 \r
                if (renameAfterCopy) {\r
                        Path tmpTargetFile = Paths.get(targetStoreUri.toString(true), currentTargetFileName);\r
index 7bf240fdc77cf5d69d5a8f7eccb9fdb7582cdf26..d17eaa1e65b6442eefbb00fb287919c3a2233d24 100644 (file)
@@ -5,12 +5,6 @@ import user.commons.StoreUri;
 public class VODTransferToStep extends TransferStep {\r
        private String relativeTargetPath;\r
 \r
-       @Override\r
-       protected StoreUri configureTargetUri(StoreUri targetStoreUri) {\r
-               targetStoreUri.setRootPath(relativeTargetPath);\r
-               return targetStoreUri;\r
-       }\r
-\r
        @StepEntry\r
        public Object[] execute(StoreUri sourceStoreUri, String sourceFileName, StoreUri targetStoreUri, String relativeTargetPath, String targetFileName)\r
                        throws Exception {\r
@@ -18,4 +12,11 @@ public class VODTransferToStep extends TransferStep {
                return super.execute(sourceStoreUri, sourceFileName, targetStoreUri, targetFileName);\r
        }\r
 \r
+       @Override\r
+       protected StoreUri getTargetStoreUri(StoreUri targetStoreUri) {\r
+               StoreUri result = getManager().getStoreUri(targetStoreUri.getId());\r
+               result.setRootPath(relativeTargetPath);\r
+               return result;\r
+       }\r
+\r
 }\r
index fd6901cd72cfc7d29d2db2800a49788f2590d59c..265bf754a360cae19b62a363c9e32b5ec0a32010 100644 (file)
@@ -1,5 +1,5 @@
 #This configuration file was written by: org.eclipse.equinox.internal.frameworkadmin.equinox.EquinoxFwConfigFileParser\r
-#Thu Mar 04 15:26:35 CET 2021\r
+#Thu Mar 11 15:00:06 CET 2021\r
 osgi.bundles=reference\:file\:cglib_2.2.2.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-annotations_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-core_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-databind_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.dataformat.jackson-dataformat-yaml_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.datatype.jackson-datatype-joda_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.jaxrs.jackson-jaxrs-base_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.module.jackson-module-jaxb-annotations_2.4.5.jar@4,reference\:file\:com.ibm.db2.jcc_1.4.0.jar@4,reference\:file\:com.ibm.nosql_4.19.26.jar@4,reference\:file\:com.microsoft.sqlserver.sqljdbc_6.0.8112.100.jar@4,reference\:file\:com.sun.jna_4.2.0.jar@4,reference\:file\:groovy_3.0.3.jar@4,reference\:file\:io.humble.video-arch-x86_64-pc-linux-gnu6_0.2.1.jar@4,reference\:file\:io.humble.video-arch-x86_64-w64-mingw32_0.2.1.jar@4,reference\:file\:io.humble.video-noarch_0.2.1.jar@4,reference\:file\:javax.annotation-api_1.2.0.jar@4,reference\:file\:javax.mail_1.5.0.b01.jar@4,reference\:file\:javax.servlet-api_3.1.0.jar@4,reference\:file\:javax.ws.rs-api_2.0.1.jar@4,reference\:file\:jcifs_1.3.17.jar@4,reference\:file\:joda-time_2.2.0.jar@4,reference\:file\:junit_4.12.0.jar@4,reference\:file\:org.apache.aries.spifly.dynamic.bundle_1.0.8.jar@4,reference\:file\:org.apache.aries.util_1.0.0.jar@4,reference\:file\:org.apache.commons.beanutils_1.8.3.jar@4,reference\:file\:org.apache.commons.collections_3.2.2.jar@4,reference\:file\:org.apache.commons.digester_3.2.0.jar@4,reference\:file\:org.apache.commons.io_2.6.0.jar@4,reference\:file\:org.apache.commons.lang_2.6.0.jar@4,reference\:file\:org.apache.commons.net_3.6.0.jar@4,reference\:file\:org.apache.felix.gogo.command_0.12.0.jar@4,reference\:file\:org.apache.felix.gogo.runtime_0.12.0.jar@4,reference\:file\:org.apache.felix.gogo.shell_0.12.0.jar@4,reference\:file\:org.apache.httpcomponents.httpclient_4.2.6.jar@4,reference\:file\:org.apache.httpcomponents.httpcore_4.2.5.jar@4,reference\:file\:org.apache.logging.log4j.api_2.8.2.jar@1\:start,reference\:file\:org.apache.logging.log4j.core_2.8.2.jar@4,reference\:file\:org.apache.logging.log4j.slf4j-impl_2.8.2.jar@4,reference\:file\:org.apache.servicemix.bundles.quartz_2.3.0.2.jar@4,reference\:file\:org.eclipse.equinox.common_3.8.0.v20160509-1230.jar@2\:start,reference\:file\:org.eclipse.equinox.console_1.1.200.v20150929-1405.jar@4,reference\:file\:org.eclipse.equinox.ds_1.4.400.v20160226-2036.jar@1\:start,reference\:file\:org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar@4,reference\:file\:org.eclipse.equinox.util_1.0.500.v20130404-1337.jar@4,reference\:file\:org.eclipse.jetty.client_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.deploy_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.http_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.io_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.osgi.boot_9.3.9.v20160517.jar@4\:start,reference\:file\:org.eclipse.jetty.schemas_3.1.0.jar@4,reference\:file\:org.eclipse.jetty.security_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.server_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.servlet_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.util_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.webapp_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.api_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.client_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.common_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.server_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.servlet_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.xml_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.osgi.services_3.2.100.v20100503.jar@4,reference\:file\:org.hamcrest.core_1.3.0.jar@4,reference\:file\:org.jboss.resteasy.client_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxb-provider_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxrs_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxrs-api_3.0.11.Final.jar@4,reference\:file\:org.jmock_2.6.0.jar@4,reference\:file\:org.jmock.junit4_2.6.0.jar@4,reference\:file\:org.mybatis.mybatis_3.5.2.jar@4,reference\:file\:org.objectweb.asm_5.0.1.jar@4,reference\:file\:org.objectweb.asm.commons_5.0.1.jar@4,reference\:file\:org.objectweb.asm.tree_5.0.1.jar@4,reference\:file\:org.omnifaces_3.4.1.jar@4,reference\:file\:slf4j.api_1.7.24.jar@4,reference\:file\:slf4j.simple_1.7.2.jar@4,reference\:file\:user.commons.log4j2_1.0.0.jar@4,reference\:file\:user.commons.zk_8.0.3.jar@4,reference\:file\:user.jobengine.osgi.commons_1.0.0.jar@4\:start,reference\:file\:user.jobengine.osgi.db_1.0.0.jar@4,reference\:file\:user.jobengine.osgi.server_1.0.0.jar@4,reference\:file\:user.jobengine.osgi.services_1.0.0.jar@4,reference\:file\:user.mediacube.gui_1.0.0.jar@4,reference\:file\:user.mediacube.metadata_1.0.0.jar@4,reference\:file\:user.tsm.client_1.2.0.jar@4\r
 equinox.use.ds=true\r
 osgi.bundles.defaultStartLevel=4\r
index c8f54ce2975ca2966eeb40c56927bb8a26013659..5fb68d8effbeb93876fea5dbe2ee00656ee440af 100644 (file)
@@ -24,9 +24,9 @@ services:
       proxy-root: /mediacube/data/lowres/www/video\r
    nexio:\r
       host: 10.10.1.55\r
-      collection-name: nexioclips\r
+      collection-name: test_nexioclips\r
       use-mos-gateway: true\r
-      disabled: true\r
+      disabled: false\r
    octopus:\r
       api:\r
          address: http://10.10.1.11/api/v1\r
diff --git a/server/-product/production/HIRTV/settings/jetty/http.xml b/server/-product/production/HIRTV/settings/jetty/http.xml
deleted file mode 100644 (file)
index 95b6398..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure the Jetty Server instance with an ID "Server"       -->
-<!-- by adding a HTTP connector.                                   -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <!-- =========================================================== -->
-  <!-- Add a HTTP Connector.                                       -->
-  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
-  <!-- HttpConnectionFactory instance using the common httpConfig  -->
-  <!-- instance defined in jetty.xml                               -->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <Item>
-              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                <Arg name="config"><Ref refid="httpConfig" /></Arg>
-              </New>
-            </Item>
-          </Array>
-        </Arg>
-        <Set name="host"><Property name="jetty.http.host" /></Set>
-        <Set name="port"><Property name="jetty.http.port" default="8888" /></Set>
-        <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" default="30000"/></Set>
-      </New>
-    </Arg>
-  </Call>
-
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/jetty/jetty-http.xml b/server/-product/production/HIRTV/settings/jetty/jetty-http.xml
deleted file mode 100644 (file)
index 95b6398..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure the Jetty Server instance with an ID "Server"       -->
-<!-- by adding a HTTP connector.                                   -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <!-- =========================================================== -->
-  <!-- Add a HTTP Connector.                                       -->
-  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
-  <!-- HttpConnectionFactory instance using the common httpConfig  -->
-  <!-- instance defined in jetty.xml                               -->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <Item>
-              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                <Arg name="config"><Ref refid="httpConfig" /></Arg>
-              </New>
-            </Item>
-          </Array>
-        </Arg>
-        <Set name="host"><Property name="jetty.http.host" /></Set>
-        <Set name="port"><Property name="jetty.http.port" default="8888" /></Set>
-        <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" default="30000"/></Set>
-      </New>
-    </Arg>
-  </Call>
-
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/jetty/jetty-https.xml b/server/-product/production/HIRTV/settings/jetty/jetty-https.xml
deleted file mode 100644 (file)
index 71a0837..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure a HTTPS connector.                                  -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and jetty-ssl.xml.                                            -->
-<!-- ============================================================= -->
-<Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
-
-  <Call name="addIfAbsentConnectionFactory">
-    <Arg>
-      <New class="org.eclipse.jetty.server.SslConnectionFactory">
-        <Arg name="next">http/1.1</Arg>
-        <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
-      </New>
-    </Arg>
-  </Call>
-
-  <Call name="addConnectionFactory">
-    <Arg>
-      <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-        <Arg name="config"><Ref refid="sslHttpConfig" /></Arg>
-        <Arg name="compliance"><Call class="org.eclipse.jetty.http.HttpCompliance" name="valueOf"><Arg><Property name="jetty.http.compliance" default="RFC7230"/></Arg></Call></Arg>
-      </New>
-    </Arg>
-  </Call>
-  
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/jetty/jetty-ssl-context.xml b/server/-product/production/HIRTV/settings/jetty/jetty-ssl-context.xml
deleted file mode 100644 (file)
index e1edaf0..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- SSL ContextFactory configuration                              -->
-<!-- ============================================================= -->
-
-<!-- 
-  To configure Includes / Excludes for Cipher Suites or Protocols see tweak-ssl.xml example at 
-     https://www.eclipse.org/jetty/documentation/current/configuring-ssl.html#configuring-sslcontextfactory-cipherSuites
--->
-
-<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-  <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.keyStorePath" deprecated="jetty.keystore" default="localhost.jks"/></Set>
-  <Set name="KeyStorePassword"><Property name="jetty.sslContext.keyStorePassword" deprecated="jetty.keystore.password" default="password"/></Set>
-  <Set name="KeyStoreType"><Property name="jetty.sslContext.keyStoreType" default="JKS"/></Set>
-  <Set name="KeyStoreProvider"><Property name="jetty.sslContext.keyStoreProvider"/></Set>
-  <Set name="KeyManagerPassword"><Property name="jetty.sslContext.keyManagerPassword" deprecated="jetty.keymanager.password" default="password"/></Set>
-  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.trustStorePath" deprecated="jetty.truststore" default="localhost.jks"/></Set>
-  <Set name="TrustStorePassword"><Property name="jetty.sslContext.trustStorePassword" deprecated="jetty.truststore.password" default="password"/></Set>
-  <Set name="TrustStoreType"><Property name="jetty.sslContext.trustStoreType"/></Set>
-  <Set name="TrustStoreProvider"><Property name="jetty.sslContext.trustStoreProvider"/></Set>
-  <Set name="EndpointIdentificationAlgorithm"></Set>
-  <Set name="NeedClientAuth"><Property name="jetty.sslContext.needClientAuth" deprecated="jetty.ssl.needClientAuth" default="false"/></Set>
-  <Set name="WantClientAuth"><Property name="jetty.sslContext.wantClientAuth" deprecated="jetty.ssl.wantClientAuth" default="false"/></Set>
-  <Set name="useCipherSuitesOrder"><Property name="jetty.sslContext.useCipherSuitesOrder" default="true"/></Set>
-  <Set name="sslSessionCacheSize"><Property name="jetty.sslContext.sslSessionCacheSize" default="-1"/></Set>
-  <Set name="sslSessionTimeout"><Property name="jetty.sslContext.sslSessionTimeout" default="-1"/></Set>
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/jetty/jetty-ssl.xml b/server/-product/production/HIRTV/settings/jetty/jetty-ssl.xml
deleted file mode 100644 (file)
index a079c1f..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- Base SSL configuration                                        -->
-<!-- This configuration needs to be used together with 1 or more   -->
-<!-- of jetty-https.xml or jetty-http2.xml                         -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <!-- =========================================================== -->
-  <!-- Add a SSL Connector with no protocol factories              -->
-  <!-- =========================================================== -->
-  <Call  name="addConnector">
-    <Arg>
-      <New id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="acceptors" type="int"><Property name="jetty.ssl.acceptors" deprecated="ssl.acceptors" default="-1"/></Arg>
-        <Arg name="selectors" type="int"><Property name="jetty.ssl.selectors" deprecated="ssl.selectors" default="-1"/></Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <!-- uncomment to support proxy protocol
-            <Item>
-              <New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
-            </Item>-->
-          </Array>
-        </Arg>
-
-        <Set name="host"><Property name="jetty.ssl.host" deprecated="jetty.host" /></Set>
-        <Set name="port"><Property name="jetty.ssl.port" deprecated="ssl.port" default="8443" /></Set>
-        <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" deprecated="ssl.timeout" default="30000"/></Set>
-        <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" deprecated="ssl.soLingerTime" default="-1"/></Set>
-        <Set name="acceptorPriorityDelta"><Property name="jetty.ssl.acceptorPriorityDelta" deprecated="ssl.acceptorPriorityDelta" default="0"/></Set>
-        <Set name="acceptQueueSize"><Property name="jetty.ssl.acceptQueueSize" deprecated="ssl.acceptQueueSize" default="0"/></Set>
-      </New>
-    </Arg>
-  </Call>
-
-  <!-- =========================================================== -->
-  <!-- Create a TLS specific HttpConfiguration based on the        -->
-  <!-- common HttpConfiguration defined in jetty.xml               -->
-  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
-  <!-- session information                                         -->
-  <!-- =========================================================== -->
-  <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-    <Arg><Ref refid="httpConfig"/></Arg>
-    <Call name="addCustomizer">
-      <Arg>
-        <New class="org.eclipse.jetty.server.SecureRequestCustomizer">
-          <Arg name="sniHostCheck" type="boolean"><Property name="jetty.ssl.sniHostCheck" default="true"/></Arg>
-          <Arg name="stsMaxAgeSeconds" type="int"><Property name="jetty.ssl.stsMaxAgeSeconds" default="-1"/></Arg>
-          <Arg name="stsIncludeSubdomains" type="boolean"><Property name="jetty.ssl.stsIncludeSubdomains" default="false"/></Arg>
-        </New>
-      </Arg>
-    </Call>
-  </New>
-
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/jetty/jetty.xml b/server/-product/production/HIRTV/settings/jetty/jetty.xml
deleted file mode 100644 (file)
index 0ba3838..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- =============================================================== -->
-<!-- Documentation of this file format can be found at:              -->
-<!-- http://wiki.eclipse.org/Jetty/Reference/jetty.xml_syntax        -->
-<!--                                                                 -->
-<!-- Additional configuration files are available in $JETTY_HOME/etc -->
-<!-- and can be mixed in. See start.ini file for the default         -->
-<!-- configuration files.                                            -->
-<!--                                                                 -->
-<!-- For a description of the configuration mechanism, see the       -->
-<!-- output of:                                                      -->
-<!--   java -jar start.jar -?                                        -->
-<!-- =============================================================== -->
-
-<!-- =============================================================== -->
-<!-- Configure a Jetty Server instance with an ID "Server"           -->
-<!-- Other configuration files may also configure the "Server"       -->
-<!-- ID, in which case they are adding configuration to the same     -->
-<!-- instance.  If other configuration have a different ID, they     -->
-<!-- will create and configure another instance of Jetty.            -->
-<!-- Consult the javadoc of o.e.j.server.Server for all              -->
-<!-- configuration that may be set here.                             -->
-<!-- =============================================================== -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-    <!-- =========================================================== -->
-    <!-- Configure the Server Thread Pool.                           -->
-    <!-- The server holds a common thread pool which is used by      -->
-    <!-- default as the executor used by all connectors and servlet  -->
-    <!-- dispatches.                                                 -->
-    <!--                                                             -->
-    <!-- Configuring a fixed thread pool is vital to controlling the -->
-    <!-- maximal memory footprint of the server and is a key tuning  -->
-    <!-- parameter for tuning.  In an application that rarely blocks -->
-    <!-- then maximal threads may be close to the number of 5*CPUs.  -->
-    <!-- In an application that frequently blocks, then maximal      -->
-    <!-- threads should be set as high as possible given the memory  -->
-    <!-- available.                                                  -->
-    <!--                                                             -->
-    <!-- Consult the javadoc of o.e.j.util.thread.QueuedThreadPool   -->
-    <!-- for all configuration that may be set here.                 -->
-    <!-- =========================================================== -->
-    <!-- uncomment to change type of threadpool
-    <Arg name="threadpool"><New id="threadpool" class="org.eclipse.jetty.util.thread.QueuedThreadPool"/></Arg>
-    -->
-    <Get name="ThreadPool">
-      <Set name="minThreads" type="int"><Property name="jetty.threadPool.minThreads" deprecated="threads.min" default="10"/></Set>
-      <Set name="maxThreads" type="int"><Property name="jetty.threadPool.maxThreads" deprecated="threads.max" default="200"/></Set>
-      <Set name="idleTimeout" type="int"><Property name="jetty.threadPool.idleTimeout" deprecated="threads.timeout" default="60000"/></Set>
-      <Set name="detailedDump">false</Set>
-    </Get>
-
-    <!-- =========================================================== -->
-    <!-- Add shared Scheduler instance                               -->
-    <!-- =========================================================== -->
-    <Call name="addBean">
-      <Arg>
-        <New class="org.eclipse.jetty.util.thread.ScheduledExecutorScheduler"/>
-      </Arg>
-    </Call>
-
-    <!-- =========================================================== -->
-    <!-- Http Configuration.                                         -->
-    <!-- This is a common configuration instance used by all         -->
-    <!-- connectors that can carry HTTP semantics (HTTP, HTTPS, etc.)-->
-    <!-- It configures the non wire protocol aspects of the HTTP     -->
-    <!-- semantic.                                                   -->
-    <!--                                                             -->
-    <!-- This configuration is only defined here and is used by      -->
-    <!-- reference from other XML files such as jetty-http.xml,      -->
-    <!-- jetty-https.xml and other configuration files which         -->
-    <!-- instantiate the connectors.                                 -->
-    <!--                                                             -->
-    <!-- Consult the javadoc of o.e.j.server.HttpConfiguration       -->
-    <!-- for all configuration that may be set here.                 -->
-    <!-- =========================================================== -->
-    <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-      <Set name="secureScheme"><Property name="jetty.httpConfig.secureScheme" default="https" /></Set>
-      <Set name="securePort"><Property name="jetty.httpConfig.securePort" deprecated="jetty.secure.port" default="8443" /></Set>
-      <Set name="outputBufferSize"><Property name="jetty.httpConfig.outputBufferSize" deprecated="jetty.output.buffer.size" default="32768" /></Set>
-      <Set name="outputAggregationSize"><Property name="jetty.httpConfig.outputAggregationSize" deprecated="jetty.output.aggregation.size" default="8192" /></Set>
-      <Set name="requestHeaderSize"><Property name="jetty.httpConfig.requestHeaderSize" deprecated="jetty.request.header.size" default="8192" /></Set>
-      <Set name="responseHeaderSize"><Property name="jetty.httpConfig.responseHeaderSize" deprecated="jetty.response.header.size" default="8192" /></Set>
-      <Set name="sendServerVersion"><Property name="jetty.httpConfig.sendServerVersion" deprecated="jetty.send.server.version" default="true" /></Set>
-      <Set name="sendDateHeader"><Property name="jetty.httpConfig.sendDateHeader" deprecated="jetty.send.date.header" default="false" /></Set>
-      <Set name="headerCacheSize"><Property name="jetty.httpConfig.headerCacheSize" default="512" /></Set>
-      <Set name="delayDispatchUntilContent"><Property name="jetty.httpConfig.delayDispatchUntilContent" deprecated="jetty.delayDispatchUntilContent" default="true"/></Set>
-      <Set name="maxErrorDispatches"><Property name="jetty.httpConfig.maxErrorDispatches" default="10"/></Set>
-      <Set name="blockingTimeout"><Property name="jetty.httpConfig.blockingTimeout" default="-1"/></Set>
-      <Set name="persistentConnectionsEnabled"><Property name="jetty.httpConfig.persistentConnectionsEnabled" default="true"/></Set>
-    </New>
-
-    <!-- =========================================================== -->
-    <!-- Set the default handler structure for the Server            -->
-    <!-- A handler collection is used to pass received requests to   -->
-    <!-- both the ContextHandlerCollection, which selects the next   -->
-    <!-- handler by context path and virtual host, and the           -->
-    <!-- DefaultHandler, which handles any requests not handled by   -->
-    <!-- the context handlers.                                       -->
-    <!-- Other handlers may be added to the "Handlers" collection,   -->
-    <!-- for example the jetty-requestlog.xml file adds the          -->
-    <!-- RequestLogHandler after the default handler                 -->
-    <!-- =========================================================== -->
-    <Set name="handler">
-      <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
-        <Set name="handlers">
-         <Array type="org.eclipse.jetty.server.Handler">
-           <Item>
-             <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
-           </Item>
-           <Item>
-             <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
-           </Item>
-         </Array>
-        </Set>
-      </New>
-    </Set>
-
-    <!-- =========================================================== -->
-    <!-- extra server options                                        -->
-    <!-- =========================================================== -->
-    <Set name="stopAtShutdown"><Property name="jetty.server.stopAtShutdown" default="true"/></Set>
-    <Set name="stopTimeout">5000</Set>
-    <Set name="dumpAfterStart"><Property name="jetty.server.dumpAfterStart" deprecated="jetty.dump.start" default="false"/></Set>
-    <Set name="dumpBeforeStop"><Property name="jetty.server.dumpBeforeStop" deprecated="jetty.dump.stop" default="false"/></Set>
-
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/jetty/localhost.jks b/server/-product/production/HIRTV/settings/jetty/localhost.jks
deleted file mode 100644 (file)
index 95d7f4c..0000000
Binary files a/server/-product/production/HIRTV/settings/jetty/localhost.jks and /dev/null differ
diff --git a/server/-product/production/HIRTV/settings/mediacube.json b/server/-product/production/HIRTV/settings/mediacube.json
deleted file mode 100644 (file)
index d413314..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-{\r
-       "topTypeFilters": [\r
-               {\r
-                       "name": "Hír bejátszó",\r
-                       "color": "RED200",\r
-                       "icon": "ic_language_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Hír nyers",\r
-                       "color": "RED100",\r
-                       "icon": "ic_perm_camera_mic_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "ECHO visszarögzített",\r
-                       "color": "BROWN100",\r
-                       "icon": "ic_group_work_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Visszarögzített",\r
-                       "color": "BROWN100",\r
-                       "icon": "ic_group_work_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Muszter DEMO",\r
-                       "color": "BROWN100",\r
-                       "icon": "ic_group_work_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Műsor CLEAN",\r
-                       "color": "BROWN100",\r
-                       "icon": "ic_group_work_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Egyéb",\r
-                       "color": "YELLOW200",\r
-                       "icon": "ic_view_quilt_black_18dp.png"\r
-               }\r
-       ],\r
-       "bottomTypeFilters": [\r
-               {\r
-                       "name": "ECHO műsor",\r
-                       "color": "TEAL200",\r
-                       "icon": "ic_theaters_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Műsor",\r
-                       "color": "TEAL200",\r
-                       "icon": "ic_theaters_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Műsor nyers",\r
-                       "color": "TEAL100",\r
-                       "icon": "ic_invert_colors_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "ECHO promo",\r
-                       "color": "INDIGO200",\r
-                       "icon": "ic_picture_in_picture_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Promo",\r
-                       "color": "INDIGO200",\r
-                       "icon": "ic_picture_in_picture_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Promo nyers",\r
-                       "color": "INDIGO100",\r
-                       "icon": "ic_bug_report_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "ECHO reklám",\r
-                       "color": "BLUE200",\r
-                       "icon": "ic_picture_in_picture_alt_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Reklám",\r
-                       "color": "BLUE200",\r
-                       "icon": "ic_picture_in_picture_alt_black_18dp.png"\r
-               },\r
-               {\r
-                       "name": "Reklám nyers",\r
-                       "color": "BLUE100",\r
-                       "icon": "ic_settings_brightness_black_18dp.png"\r
-               }\r
-       ],\r
-       "authentication": {\r
-               "authEnabled": true,\r
-               "adHost": "10.10.254.11",\r
-               "adNonSecurePort": 3268,\r
-               "adBaseDn": "DC=intra,DC=echotv,DC=hu",\r
-               "adAdminMap": [\r
-                        "G_ECH_U_INFORMATIKUSOK",\r
-                        "G_ECH_U_MUSZAKVEZETOK",\r
-                        "ECH-ISILON-ADMINS"\r
-               ],\r
-               "adSubmitterMap": [\r
-                       "G_ECH_U_INFORMATIKUSOK",\r
-                       "G_ECH_U_MUSZAKVEZETOK",\r
-                       "ECH-ISILON-ADMINS",\r
-                       "G_ECH_U_PLAYOUT"\r
-               ],\r
-               "adEditorMap": [\r
-                       "G_ECH_U_INFORMATIKUSOK",\r
-                       "G_ECH_U_MUSZAKVEZETOK",\r
-                       "ECH-ISILON-ADMINS",\r
-                       "G_ECH_U_ARCHIVUM"\r
-               ],\r
-               "localAccounts": [\r
-                       {\r
-                               "user" : "user",\r
-                               "password" : "5F4DCC3B5AA765D61D8327DEB882CF99",\r
-                               "email" : null\r
-                       },\r
-                       {\r
-                               "user" : "lebony",\r
-                               "password" : "4E25B117B14D86D7DCECB4E433CF932C",\r
-                               "email" : null\r
-                       },\r
-                       {\r
-                               "user" : "root",\r
-                               "password" : "5F4DCC3B5AA765D61D8327DEB882CF99",\r
-                               "email" : "vasary@elgekko.net"\r
-                       }\r
-               ],\r
-               "localAdmins": [\r
-                       "root",\r
-                       "admin"\r
-               ],\r
-               "localSubmitters": [\r
-                       "lebony"\r
-               ],\r
-               "localEditors": [\r
-                       "editor"\r
-               ]\r
-       }\r
-}\r
-\r
-\r
-\r
diff --git a/server/-product/production/HIRTV/settings/mediacube.yaml b/server/-product/production/HIRTV/settings/mediacube.yaml
new file mode 100644 (file)
index 0000000..e7bcd22
--- /dev/null
@@ -0,0 +1,62 @@
+jobQueuePollInterval: 1000\r
+disableHelp: true\r
+maestroDisabled: false\r
+alternateRetrieveSelector: false\r
+disableStatistics: true\r
+disableEditor: false\r
+topTypeFilters:\r
+- name: Hír bejátszó\r
+- name: Hír nyers\r
+- name: ECHO visszarögzített\r
+- name: Visszarögzített\r
+- name: Muszter DEMO\r
+- name: Műsor CLEAN\r
+- name: Egyéb\r
+bottomTypeFilters:\r
+- name: ECHO műsor\r
+- name: Műsor\r
+- name: Műsor nyers\r
+- name: ECHO promo\r
+- name: Promo\r
+- name: Promo nyers\r
+- name: ECHO reklám\r
+- name: Reklám\r
+- name: Reklám nyers\r
+authentication:\r
+  authEnabled: true\r
+  defaultUser: root\r
+  defaultPassword: password\r
+  adHost: 10.10.254.11\r
+  adNonSecurePort: 3268\r
+  adBaseDn: DC=intra,DC=echotv,DC=hu\r
+  adAdminMap:\r
+  - G_ECH_U_INFORMATIKUSOK\r
+  - G_ECH_U_MUSZAKVEZETOK\r
+  - ECH-ISILON-ADMINS\r
+  adSubmitterMap:\r
+  - G_ECH_U_INFORMATIKUSOK\r
+  - G_ECH_U_MUSZAKVEZETOK\r
+  - ECH-ISILON-ADMINS\r
+  - G_ECH_U_PLAYOUT\r
+  adEditorMap:\r
+  - G_ECH_U_INFORMATIKUSOK\r
+  - G_ECH_U_MUSZAKVEZETOK\r
+  - ECH-ISILON-ADMINS\r
+  - G_ECH_U_ARCHIVUM\r
+  localAccounts:\r
+  - user: user\r
+    password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+    email:\r
+  - user: lebony\r
+    password: 4E25B117B14D86D7DCECB4E433CF932C\r
+    email:\r
+  - user: root\r
+    password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+    email: vasary@elgekko.net\r
+  localAdmins:\r
+  - root\r
+  - admin\r
+  localSubmitters:\r
+  - lebony\r
+  localEditors:\r
+  - editor\r
diff --git a/server/-product/production/HIRTV/settings/test-jetty/jetty-http.xml b/server/-product/production/HIRTV/settings/test-jetty/jetty-http.xml
deleted file mode 100644 (file)
index f4f61bf..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure the Jetty Server instance with an ID "Server"       -->
-<!-- by adding a HTTP connector.                                   -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <!-- =========================================================== -->
-  <!-- Add a HTTP Connector.                                       -->
-  <!-- Configure an o.e.j.server.ServerConnector with a single     -->
-  <!-- HttpConnectionFactory instance using the common httpConfig  -->
-  <!-- instance defined in jetty.xml                               -->
-  <!--                                                             -->
-  <!-- Consult the javadoc of o.e.j.server.ServerConnector and     -->
-  <!-- o.e.j.server.HttpConnectionFactory for all configuration    -->
-  <!-- that may be set here.                                       -->
-  <!-- =========================================================== -->
-  <Call name="addConnector">
-    <Arg>
-      <New class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <Item>
-              <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-                <Arg name="config"><Ref refid="httpConfig" /></Arg>
-              </New>
-            </Item>
-          </Array>
-        </Arg>
-        <Set name="host"><Property name="jetty.http.host" /></Set>
-        <Set name="port"><Property name="jetty.http.port" default="9080" /></Set>
-        <Set name="idleTimeout"><Property name="jetty.http.idleTimeout" default="30000"/></Set>
-      </New>
-    </Arg>
-  </Call>
-
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/test-jetty/jetty-https.xml b/server/-product/production/HIRTV/settings/test-jetty/jetty-https.xml
deleted file mode 100644 (file)
index 71a0837..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- Configure a HTTPS connector.                                  -->
-<!-- This configuration must be used in conjunction with jetty.xml -->
-<!-- and jetty-ssl.xml.                                            -->
-<!-- ============================================================= -->
-<Configure id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
-
-  <Call name="addIfAbsentConnectionFactory">
-    <Arg>
-      <New class="org.eclipse.jetty.server.SslConnectionFactory">
-        <Arg name="next">http/1.1</Arg>
-        <Arg name="sslContextFactory"><Ref refid="sslContextFactory"/></Arg>
-      </New>
-    </Arg>
-  </Call>
-
-  <Call name="addConnectionFactory">
-    <Arg>
-      <New class="org.eclipse.jetty.server.HttpConnectionFactory">
-        <Arg name="config"><Ref refid="sslHttpConfig" /></Arg>
-        <Arg name="compliance"><Call class="org.eclipse.jetty.http.HttpCompliance" name="valueOf"><Arg><Property name="jetty.http.compliance" default="RFC7230"/></Arg></Call></Arg>
-      </New>
-    </Arg>
-  </Call>
-  
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/test-jetty/jetty-ssl-context.xml b/server/-product/production/HIRTV/settings/test-jetty/jetty-ssl-context.xml
deleted file mode 100644 (file)
index e1edaf0..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- SSL ContextFactory configuration                              -->
-<!-- ============================================================= -->
-
-<!-- 
-  To configure Includes / Excludes for Cipher Suites or Protocols see tweak-ssl.xml example at 
-     https://www.eclipse.org/jetty/documentation/current/configuring-ssl.html#configuring-sslcontextfactory-cipherSuites
--->
-
-<Configure id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
-  <Set name="KeyStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.keyStorePath" deprecated="jetty.keystore" default="localhost.jks"/></Set>
-  <Set name="KeyStorePassword"><Property name="jetty.sslContext.keyStorePassword" deprecated="jetty.keystore.password" default="password"/></Set>
-  <Set name="KeyStoreType"><Property name="jetty.sslContext.keyStoreType" default="JKS"/></Set>
-  <Set name="KeyStoreProvider"><Property name="jetty.sslContext.keyStoreProvider"/></Set>
-  <Set name="KeyManagerPassword"><Property name="jetty.sslContext.keyManagerPassword" deprecated="jetty.keymanager.password" default="password"/></Set>
-  <Set name="TrustStorePath"><Property name="jetty.base" default="." />/<Property name="jetty.sslContext.trustStorePath" deprecated="jetty.truststore" default="localhost.jks"/></Set>
-  <Set name="TrustStorePassword"><Property name="jetty.sslContext.trustStorePassword" deprecated="jetty.truststore.password" default="password"/></Set>
-  <Set name="TrustStoreType"><Property name="jetty.sslContext.trustStoreType"/></Set>
-  <Set name="TrustStoreProvider"><Property name="jetty.sslContext.trustStoreProvider"/></Set>
-  <Set name="EndpointIdentificationAlgorithm"></Set>
-  <Set name="NeedClientAuth"><Property name="jetty.sslContext.needClientAuth" deprecated="jetty.ssl.needClientAuth" default="false"/></Set>
-  <Set name="WantClientAuth"><Property name="jetty.sslContext.wantClientAuth" deprecated="jetty.ssl.wantClientAuth" default="false"/></Set>
-  <Set name="useCipherSuitesOrder"><Property name="jetty.sslContext.useCipherSuitesOrder" default="true"/></Set>
-  <Set name="sslSessionCacheSize"><Property name="jetty.sslContext.sslSessionCacheSize" default="-1"/></Set>
-  <Set name="sslSessionTimeout"><Property name="jetty.sslContext.sslSessionTimeout" default="-1"/></Set>
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/test-jetty/jetty-ssl.xml b/server/-product/production/HIRTV/settings/test-jetty/jetty-ssl.xml
deleted file mode 100644 (file)
index db6e2eb..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- ============================================================= -->
-<!-- Base SSL configuration                                        -->
-<!-- This configuration needs to be used together with 1 or more   -->
-<!-- of jetty-https.xml or jetty-http2.xml                         -->
-<!-- ============================================================= -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-  <!-- =========================================================== -->
-  <!-- Add a SSL Connector with no protocol factories              -->
-  <!-- =========================================================== -->
-  <Call  name="addConnector">
-    <Arg>
-      <New id="sslConnector" class="org.eclipse.jetty.server.ServerConnector">
-        <Arg name="server"><Ref refid="Server" /></Arg>
-        <Arg name="acceptors" type="int"><Property name="jetty.ssl.acceptors" deprecated="ssl.acceptors" default="-1"/></Arg>
-        <Arg name="selectors" type="int"><Property name="jetty.ssl.selectors" deprecated="ssl.selectors" default="-1"/></Arg>
-        <Arg name="factories">
-          <Array type="org.eclipse.jetty.server.ConnectionFactory">
-            <!-- uncomment to support proxy protocol
-            <Item>
-              <New class="org.eclipse.jetty.server.ProxyConnectionFactory"/>
-            </Item>-->
-          </Array>
-        </Arg>
-
-        <Set name="host"><Property name="jetty.ssl.host" deprecated="jetty.host" /></Set>
-        <Set name="port"><Property name="jetty.ssl.port" deprecated="ssl.port" default="444" /></Set>
-        <Set name="idleTimeout"><Property name="jetty.ssl.idleTimeout" deprecated="ssl.timeout" default="30000"/></Set>
-        <Set name="soLingerTime"><Property name="jetty.ssl.soLingerTime" deprecated="ssl.soLingerTime" default="-1"/></Set>
-        <Set name="acceptorPriorityDelta"><Property name="jetty.ssl.acceptorPriorityDelta" deprecated="ssl.acceptorPriorityDelta" default="0"/></Set>
-        <Set name="acceptQueueSize"><Property name="jetty.ssl.acceptQueueSize" deprecated="ssl.acceptQueueSize" default="0"/></Set>
-      </New>
-    </Arg>
-  </Call>
-
-  <!-- =========================================================== -->
-  <!-- Create a TLS specific HttpConfiguration based on the        -->
-  <!-- common HttpConfiguration defined in jetty.xml               -->
-  <!-- Add a SecureRequestCustomizer to extract certificate and    -->
-  <!-- session information                                         -->
-  <!-- =========================================================== -->
-  <New id="sslHttpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-    <Arg><Ref refid="httpConfig"/></Arg>
-    <Call name="addCustomizer">
-      <Arg>
-        <New class="org.eclipse.jetty.server.SecureRequestCustomizer">
-          <Arg name="sniHostCheck" type="boolean"><Property name="jetty.ssl.sniHostCheck" default="true"/></Arg>
-          <Arg name="stsMaxAgeSeconds" type="int"><Property name="jetty.ssl.stsMaxAgeSeconds" default="-1"/></Arg>
-          <Arg name="stsIncludeSubdomains" type="boolean"><Property name="jetty.ssl.stsIncludeSubdomains" default="false"/></Arg>
-        </New>
-      </Arg>
-    </Call>
-  </New>
-
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/test-jetty/jetty.xml b/server/-product/production/HIRTV/settings/test-jetty/jetty.xml
deleted file mode 100644 (file)
index c9afdb5..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure_9_3.dtd">
-
-<!-- =============================================================== -->
-<!-- Documentation of this file format can be found at:              -->
-<!-- http://wiki.eclipse.org/Jetty/Reference/jetty.xml_syntax        -->
-<!--                                                                 -->
-<!-- Additional configuration files are available in $JETTY_HOME/etc -->
-<!-- and can be mixed in. See start.ini file for the default         -->
-<!-- configuration files.                                            -->
-<!--                                                                 -->
-<!-- For a description of the configuration mechanism, see the       -->
-<!-- output of:                                                      -->
-<!--   java -jar start.jar -?                                        -->
-<!-- =============================================================== -->
-
-<!-- =============================================================== -->
-<!-- Configure a Jetty Server instance with an ID "Server"           -->
-<!-- Other configuration files may also configure the "Server"       -->
-<!-- ID, in which case they are adding configuration to the same     -->
-<!-- instance.  If other configuration have a different ID, they     -->
-<!-- will create and configure another instance of Jetty.            -->
-<!-- Consult the javadoc of o.e.j.server.Server for all              -->
-<!-- configuration that may be set here.                             -->
-<!-- =============================================================== -->
-<Configure id="Server" class="org.eclipse.jetty.server.Server">
-
-    <!-- =========================================================== -->
-    <!-- Configure the Server Thread Pool.                           -->
-    <!-- The server holds a common thread pool which is used by      -->
-    <!-- default as the executor used by all connectors and servlet  -->
-    <!-- dispatches.                                                 -->
-    <!--                                                             -->
-    <!-- Configuring a fixed thread pool is vital to controlling the -->
-    <!-- maximal memory footprint of the server and is a key tuning  -->
-    <!-- parameter for tuning.  In an application that rarely blocks -->
-    <!-- then maximal threads may be close to the number of 5*CPUs.  -->
-    <!-- In an application that frequently blocks, then maximal      -->
-    <!-- threads should be set as high as possible given the memory  -->
-    <!-- available.                                                  -->
-    <!--                                                             -->
-    <!-- Consult the javadoc of o.e.j.util.thread.QueuedThreadPool   -->
-    <!-- for all configuration that may be set here.                 -->
-    <!-- =========================================================== -->
-    <!-- uncomment to change type of threadpool
-    <Arg name="threadpool"><New id="threadpool" class="org.eclipse.jetty.util.thread.QueuedThreadPool"/></Arg>
-    -->
-    <Get name="ThreadPool">
-      <Set name="minThreads" type="int"><Property name="jetty.threadPool.minThreads" deprecated="threads.min" default="10"/></Set>
-      <Set name="maxThreads" type="int"><Property name="jetty.threadPool.maxThreads" deprecated="threads.max" default="200"/></Set>
-      <Set name="idleTimeout" type="int"><Property name="jetty.threadPool.idleTimeout" deprecated="threads.timeout" default="60000"/></Set>
-      <Set name="detailedDump">false</Set>
-    </Get>
-
-    <!-- =========================================================== -->
-    <!-- Add shared Scheduler instance                               -->
-    <!-- =========================================================== -->
-    <Call name="addBean">
-      <Arg>
-        <New class="org.eclipse.jetty.util.thread.ScheduledExecutorScheduler"/>
-      </Arg>
-    </Call>
-
-    <!-- =========================================================== -->
-    <!-- Http Configuration.                                         -->
-    <!-- This is a common configuration instance used by all         -->
-    <!-- connectors that can carry HTTP semantics (HTTP, HTTPS, etc.)-->
-    <!-- It configures the non wire protocol aspects of the HTTP     -->
-    <!-- semantic.                                                   -->
-    <!--                                                             -->
-    <!-- This configuration is only defined here and is used by      -->
-    <!-- reference from other XML files such as jetty-http.xml,      -->
-    <!-- jetty-https.xml and other configuration files which         -->
-    <!-- instantiate the connectors.                                 -->
-    <!--                                                             -->
-    <!-- Consult the javadoc of o.e.j.server.HttpConfiguration       -->
-    <!-- for all configuration that may be set here.                 -->
-    <!-- =========================================================== -->
-    <New id="httpConfig" class="org.eclipse.jetty.server.HttpConfiguration">
-      <Set name="secureScheme"><Property name="jetty.httpConfig.secureScheme" default="https" /></Set>
-      <Set name="securePort"><Property name="jetty.httpConfig.securePort" deprecated="jetty.secure.port" default="8444" /></Set>
-      <Set name="outputBufferSize"><Property name="jetty.httpConfig.outputBufferSize" deprecated="jetty.output.buffer.size" default="32768" /></Set>
-      <Set name="outputAggregationSize"><Property name="jetty.httpConfig.outputAggregationSize" deprecated="jetty.output.aggregation.size" default="8192" /></Set>
-      <Set name="requestHeaderSize"><Property name="jetty.httpConfig.requestHeaderSize" deprecated="jetty.request.header.size" default="8192" /></Set>
-      <Set name="responseHeaderSize"><Property name="jetty.httpConfig.responseHeaderSize" deprecated="jetty.response.header.size" default="8192" /></Set>
-      <Set name="sendServerVersion"><Property name="jetty.httpConfig.sendServerVersion" deprecated="jetty.send.server.version" default="true" /></Set>
-      <Set name="sendDateHeader"><Property name="jetty.httpConfig.sendDateHeader" deprecated="jetty.send.date.header" default="false" /></Set>
-      <Set name="headerCacheSize"><Property name="jetty.httpConfig.headerCacheSize" default="512" /></Set>
-      <Set name="delayDispatchUntilContent"><Property name="jetty.httpConfig.delayDispatchUntilContent" deprecated="jetty.delayDispatchUntilContent" default="true"/></Set>
-      <Set name="maxErrorDispatches"><Property name="jetty.httpConfig.maxErrorDispatches" default="10"/></Set>
-      <Set name="blockingTimeout"><Property name="jetty.httpConfig.blockingTimeout" default="-1"/></Set>
-      <Set name="persistentConnectionsEnabled"><Property name="jetty.httpConfig.persistentConnectionsEnabled" default="true"/></Set>
-    </New>
-
-    <!-- =========================================================== -->
-    <!-- Set the default handler structure for the Server            -->
-    <!-- A handler collection is used to pass received requests to   -->
-    <!-- both the ContextHandlerCollection, which selects the next   -->
-    <!-- handler by context path and virtual host, and the           -->
-    <!-- DefaultHandler, which handles any requests not handled by   -->
-    <!-- the context handlers.                                       -->
-    <!-- Other handlers may be added to the "Handlers" collection,   -->
-    <!-- for example the jetty-requestlog.xml file adds the          -->
-    <!-- RequestLogHandler after the default handler                 -->
-    <!-- =========================================================== -->
-    <Set name="handler">
-      <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
-        <Set name="handlers">
-         <Array type="org.eclipse.jetty.server.Handler">
-           <Item>
-             <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
-           </Item>
-           <Item>
-             <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
-           </Item>
-         </Array>
-        </Set>
-      </New>
-    </Set>
-
-    <!-- =========================================================== -->
-    <!-- extra server options                                        -->
-    <!-- =========================================================== -->
-    <Set name="stopAtShutdown"><Property name="jetty.server.stopAtShutdown" default="true"/></Set>
-    <Set name="stopTimeout">5000</Set>
-    <Set name="dumpAfterStart"><Property name="jetty.server.dumpAfterStart" deprecated="jetty.dump.start" default="false"/></Set>
-    <Set name="dumpBeforeStop"><Property name="jetty.server.dumpBeforeStop" deprecated="jetty.dump.stop" default="false"/></Set>
-
-</Configure>
diff --git a/server/-product/production/HIRTV/settings/test-jetty/localhost.jks b/server/-product/production/HIRTV/settings/test-jetty/localhost.jks
deleted file mode 100644 (file)
index 95d7f4c..0000000
Binary files a/server/-product/production/HIRTV/settings/test-jetty/localhost.jks and /dev/null differ
diff --git a/server/-product/production/LOCAL/configuration/etc/gosh_profile b/server/-product/production/LOCAL/configuration/etc/gosh_profile
new file mode 100644 (file)
index 0000000..1c659f4
--- /dev/null
@@ -0,0 +1 @@
+prompt=mc>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/EscortFiles.class b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/EscortFiles.class
new file mode 100644 (file)
index 0000000..181784c
Binary files /dev/null and b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/EscortFiles.class differ
diff --git a/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/ItemManagerExtensions.class b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/ItemManagerExtensions.class
new file mode 100644 (file)
index 0000000..ebfd080
Binary files /dev/null and b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/ItemManagerExtensions.class differ
diff --git a/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataType.class b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataType.class
new file mode 100644 (file)
index 0000000..ae205ad
Binary files /dev/null and b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataType.class differ
diff --git a/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataTypeDetector$MetadataType.class b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataTypeDetector$MetadataType.class
new file mode 100644 (file)
index 0000000..488120e
Binary files /dev/null and b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataTypeDetector$MetadataType.class differ
diff --git a/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataTypeDetector.class b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataTypeDetector.class
new file mode 100644 (file)
index 0000000..affbeb6
Binary files /dev/null and b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/MetadataTypeDetector.class differ
diff --git a/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep$1.class b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep$1.class
new file mode 100644 (file)
index 0000000..77dd877
Binary files /dev/null and b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep$1.class differ
diff --git a/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep$2.class b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep$2.class
new file mode 100644 (file)
index 0000000..a433245
Binary files /dev/null and b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep$2.class differ
diff --git a/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep.class b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep.class
new file mode 100644 (file)
index 0000000..59569e0
Binary files /dev/null and b/server/-product/production/LOCAL/jobs/classes/user/jobengine/server/steps/TSMRestoreStep.class differ
diff --git a/server/-product/production/LOCAL/jobs/executors.xml b/server/-product/production/LOCAL/jobs/executors.xml
new file mode 100644 (file)
index 0000000..93765d4
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<executors>\r
+       <executor className="PathItemsCollectorStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TestForkCancelableStep.java" maxConcurrent="3" isRemote="false" />\r
+       <executor className="ArchiveRecursive.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="ArchiveListBuilderStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="ArchiveMaterialSubmitStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="BatchRetrieveForkStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="CancelableStep.java" maxConcurrent="20" isRemote="false" />\r
+       <executor className="CleanupMountedLocationStep.java" maxConcurrent="5" isRemote="false" />\r
+       <executor className="CreateArchiveItemStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="CreateMissingLowresStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="FileCopyStep.java" maxConcurrent="20" isRemote="false" />\r
+       <executor className="HSMMigrateStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="MediaToolStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="MetadataTransformStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="MXFCutterStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="OutputPathAndNameSelectorStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TranscodeFFAStranStep.java" maxConcurrent="2" isRemote="false" />\r
+       <executor className="TSMBackupStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TSMExtendedRetrieveStep.java" maxConcurrent="1"  isRemote="false" />\r
+       <executor className="TSMRestoreStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="TSMSimpleRestoreStep.java" maxConcurrent="1" isRemote="false" />\r
+       <executor className="UpdateGhostMediaDataStep.java" maxConcurrent="1" isRemote="false" />\r
+</executors>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/schedules.json b/server/-product/production/LOCAL/jobs/schedules.json
new file mode 100644 (file)
index 0000000..5c6e7c2
--- /dev/null
@@ -0,0 +1,192 @@
+{"joblist":[\r
+       {\r
+      "template": "sync-subtitles.xml",\r
+      "parameters": [ \r
+       {"name": "sourceFolder", "value": "/windows", "type": "java.lang.String"}, \r
+       {       \r
+               "name": "filter", \r
+               "value": {\r
+                       "fileName": ".*\\.(sh|ini|conf|vhost|xml|php)$"\r
+               }, \r
+               "type": "com.ibm.nosql.json.api.BasicDBObject"\r
+       } \r
+      ]\r
+       },\r
+       {\r
+      "template": "test-fork-cancelable.xml",\r
+      "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
+       },\r
+       {\r
+      "active": true,\r
+      "executeimmediate": true,\r
+         "name" : "Proxy generálás",\r
+      "template": "sys-recreate-lowres.xml",\r
+      "cronexpression": "0 */1 * * * ?",\r
+      "parameters": [ \r
+       {"name": "globalRetrievePath", "value": "file://10.11.1.90/data", "type": "java.lang.String"},\r
+       {"name": "localRetrievePath", "value": "/mediacube/data", "type": "java.lang.String"},\r
+       {"name": "localHiresPath", "value": "/mediacube/data", "type": "java.lang.String" },\r
+       {"name": "globalHiresPath", "value": "\\\\10.11.1.90\\data", "type": "java.lang.String" },\r
+       {"name": "localLowresPath", "value": "/mediacube/data/TRANSCODER_OUT", "type": "java.lang.String" },\r
+       {"name": "transcoderAddress", "value": "http://10.11.1.111:65445/api/json/v1/", "type": "java.lang.String"},\r
+       {"name": "transcoderTemplateName", "value": "MP4", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Rekurzív archiválás a POLC/FINISHED_SHOWS mappából",\r
+      "template": "archive-recursive.xml",\r
+      "cronexpression": "0 */1 * * * ?",\r
+      "parameters": [ \r
+               {"name": "sourcePath", "value": "/mnt/POLC/FINISHED_SHOWS", "type": "java.lang.String"},\r
+               {"name": "killDateDays", "value": 1, "type": "java.lang.Integer"},\r
+               {"name": "limit", "value": 1, "type": "java.lang.Integer"}\r
+         ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": true,\r
+         "name" : "Limitált archiválás az PROMISE/ARCHIVE mappából",\r
+      "template": "archive-limited.xml",\r
+      "cronexpression": "0 */10 * * * ?",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mnt/PROMISE/ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "globalSourcePath", "value": "\\\\10.11.1.100\\PROMISE\\ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "transcoderTargetPath", "value": "/mnt/PROMISE/TRANSCODER/FFASTRANSCODER/Out", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "value": -1, "type": "java.lang.Integer"},\r
+       {"name": "limit", "value": 10, "type": "java.lang.Integer"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Párhuzamosított teszt folyamat",\r
+      "template": "fake-noparams.xml",\r
+      "cronexpression": "0 40 22 * * ?",\r
+      "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
+       },\r
+       {\r
+      "template": "cancelable.xml"\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "HSM migrálás",\r
+      "template": "migrate-hsm.xml",\r
+      "cronexpression": "0 0 */1 * * ?",\r
+      "parameters": [ \r
+       {"name": "sourceLocation", "value": "", "type": "java.lang.String"},\r
+       {"name": "targetLocation", "value": "/mediacube/data/ARCHIVE", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": true,\r
+         "name" : "Limitált archiválás a /mediacube/data/ARCHIVE mappából",\r
+      "template": "archive-limited.xml",\r
+      "cronexpression": "0 */10 * * * ?",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mediacube/data/ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "globalSourcePath", "value": "\\\\10.11.1.90\\data\\ARCHIVE", "type": "java.lang.String"},\r
+       {"name": "transcoderTargetPath", "value": "/mnt/PROMISE/TRANSCODER/FFASTRANSCODER/Out", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "value": -1, "type": "java.lang.Integer"},\r
+       {"name": "limit", "value": 1000, "type": "java.lang.Integer"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": true,\r
+         "name" : "Lejárt /mediacube/data/ARCHIVE anyagok törlése",\r
+      "template": "delete-materials.xml",\r
+      "cronexpression": "0 */10 * * * ?",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mediacube/data/ARCHIVE", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": true,\r
+         "name" : "Lejárt /mediacube/data/OMARCHIVE anyagok törlése",\r
+      "template": "delete-materials.xml",\r
+      "cronexpression": "0 */10 * * * ?",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mediacube/data/OMARCHIVE", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": true,\r
+         "name" : "Lejárt /PROMISE/ARCHIVE anyagok törlése",\r
+      "template": "delete-materials.xml",\r
+      "cronexpression": "0 */10 * * * ?",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mnt/PROMISE/ARCHIVE", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "Lejárt /POLC/FINISHED_SHOWS anyagok törlése",\r
+      "template": "delete-materials.xml",\r
+      "cronexpression": "0 * 11 * * ?",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mnt/POLC/FINISHED_SHOWS", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+         "name" : "SYS: batch-retrieve-ondemand",\r
+      "template": "batch-retrieve-ondemand.xml",\r
+      "active": false,\r
+      "executeimmediate": false\r
+       },\r
+       {\r
+         "name" : "SYS: retrieve-ondemand",\r
+      "template": "retrieve-ondemand.xml",\r
+      "active": false,\r
+      "executeimmediate": false,\r
+      "parameters": [ \r
+       {"name": "globalRetrievePath", "value": "file://10.11.1.100", "type": "java.lang.String"},\r
+       {"name": "localRetrievePath", "value": "/mnt/PROMISE/", "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
+         "name" : "SYS: common-copy",\r
+      "template": "common-copy.xml",\r
+      "active": false,\r
+      "executeimmediate": false\r
+       },\r
+       {\r
+      "template": "create-lowres-ondemand.xml",\r
+      "active": false,\r
+      "executeimmediate": false,\r
+      "parameters": [ \r
+       {"name": "globalRetrievePath", "value": "file://10.11.1.90/data", "type": "java.lang.String"},\r
+       {"name": "localRetrievePath", "value": "/mediacube/data", "type": "java.lang.String"},\r
+       {"name": "localHiresPath", "value": "/mediacube/data", "type": "java.lang.String" },\r
+       {"name": "globalHiresPath", "value": "\\\\10.11.1.90\\data", "type": "java.lang.String" },\r
+       {"name": "localLowresPath", "value": "/mediacube/data/TRANSCODER_OUT", "type": "java.lang.String" },\r
+       {"name": "transcoderAddress", "value": "http://10.11.1.111:65445/api/json/v1/", "type": "java.lang.String"},\r
+       {"name": "transcoderTemplateName", "value": "MP4", "type": "java.lang.String"}\r
+      ]\r
+       },\r
+       {\r
+      "active": false,\r
+      "executeimmediate": false,\r
+      "template": "cancelable.xml",\r
+      "parameters": [ \r
+               {"name": "param", "value": 1, "type": "java.lang.Integer"}\r
+         ]\r
+       }\r
+]}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/ArchiveListBuilderStep.java b/server/-product/production/LOCAL/jobs/steps/ArchiveListBuilderStep.java
new file mode 100644 (file)
index 0000000..b232182
--- /dev/null
@@ -0,0 +1,167 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.LinkedList;\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
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+/**\r
+ * Az archivalhato mediak listazasa MediaFileWrapper objektumokban. A listazott media allomanyokat megjeloli .catched signal allomannyal, hogy a legkozelebbi\r
+ * listazas figyelmen kivul hagyja.\r
+ *\r
+ * @author robi\r
+ */\r
+public class ArchiveListBuilderStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       //      private static final String UTF8 = "utf-8";\r
+       private static final String STATUSFOLDER = ".STATUS";\r
+       private static final String JSONEXT = ".json";\r
+       private static final String CATCHEDEXT = ".catched";\r
+\r
+       public static final String ITEM_TITLE = "itemTitle";\r
+       public static final String ITEM_HOUSEID = "itemHouseId";\r
+       public static final String ITEM_DESCRIPTION = "itemDescription";\r
+       public static final String MEDIA_HOUSEID = "mediaHouseId";\r
+       public static final String MEDIA_TITLE = "mediaTitle";\r
+       public static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+       public static final String MEDIA_TYPE = "mediaType";\r
+       private static final String DURATION = "duration";\r
+       private static final String EXISTING_MEDIAID = "existingMediaId";\r
+       private static final String TAGS = "tags";\r
+\r
+       private Marker marker;\r
+\r
+       private ArchiveItem createArchiveItem(Path jsonFilePath, Path mediaFilePath, Path catchedFilePath) {\r
+               ArchiveItem result = null;\r
+               try {\r
+                       result = ArchiveItem.fromFile(jsonFilePath);\r
+                       result.setMediaFile(mediaFilePath.toString());\r
+                       result.setCatchedFile(catchedFilePath.toString());\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       private void createCatchedFile(Path catchedFilePath) {\r
+               try {\r
+                       Files.createFile(catchedFilePath);\r
+                       //Files.write(catchedFilePath, CATCHED.getBytes(UTF8), StandardOpenOption.CREATE);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourcePath, int limit, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
+               marker = jobRuntime.getSessionMarker();\r
+               List<ArchiveItem> archiveList = new LinkedList<ArchiveItem>();\r
+               DirectoryStream<Path> directoryStream = null;\r
+               try {\r
+                       DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(sourcePath));\r
+                       for (Path p : stream) {\r
+                               processPathItem(p, archiveList);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", e.getMessage());\r
+               } finally {\r
+                       if (directoryStream != null) {\r
+                               try {\r
+                                       directoryStream.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+               }\r
+\r
+               if (limit > 0 && archiveList.size() > limit) {\r
+                       archiveList = archiveList.subList(0, limit);\r
+                       logger.info(marker, "A folyamat alkalmazza a beállított {} limitet.", limit);\r
+               }\r
+\r
+               if (archiveList.size() == 0)\r
+                       logger.info(marker, "Nincs archiválandó anyag.");\r
+               else\r
+                       logger.info(marker, "Az archiváló folyamat {} új anyagot érzékelt.", archiveList == null ? 0 : archiveList.size());\r
+\r
+               for (ArchiveItem archiveItem : archiveList) {\r
+                       createCatchedFile(Paths.get(archiveItem.getCatchedFile()));\r
+               }\r
+\r
+               return new Object[] { archiveList };\r
+       }\r
+\r
+       private boolean processPathItem(Path mediaFilePath, final List<ArchiveItem> archiveList) {\r
+               File mediaFile = mediaFilePath.toFile();\r
+\r
+               //              if (mediaFile.length() > 0)\r
+               //                      return false;\r
+\r
+               if (mediaFile.isDirectory()) {\r
+                       return false;\r
+               }\r
+\r
+               Path dotStorePath = Paths.get(mediaFilePath.getParent().toString(), STATUSFOLDER);\r
+               Path catchedFilePath = Paths.get(dotStorePath.toString(), mediaFile.getName() + CATCHEDEXT);\r
+               File catchedFile = catchedFilePath.toFile();\r
+               if (catchedFile.exists()) {\r
+                       logger.warn("{} file is already catched.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               Path jsonFilePath = Paths.get(dotStorePath.toString(), mediaFile.getName() + JSONEXT);\r
+               File jsonFile = jsonFilePath.toFile();\r
+               if (!jsonFile.exists()) {\r
+                       logger.warn("{} has no json metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               ArchiveItem archiveItem = createArchiveItem(jsonFilePath, mediaFilePath, catchedFilePath);\r
+\r
+               if (archiveItem == null) {\r
+                       logger.warn("{} has no metadata specified.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemHouseId())) {\r
+                       logger.warn("{} has no Item HouseID specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemTitle())) {\r
+                       logger.warn("{} has no Item Title specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaHouseId())) {\r
+                       logger.warn("{} has no Media HouseID specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaTitle())) {\r
+                       logger.warn("{} has no Media Title specified in metadata.", mediaFile.getName());\r
+                       return false;\r
+               }\r
+\r
+               //A tenyleges archivalast vesszuk elore\r
+               if (mediaFile.length() == 0)\r
+                       archiveList.add(archiveItem);\r
+               else\r
+                       archiveList.add(0, archiveItem);\r
+               //createCatchedFile(catchedFilePath);\r
+               return true;\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/ArchiveMaterialSubmitStep.java b/server/-product/production/LOCAL/jobs/steps/ArchiveMaterialSubmitStep.java
new file mode 100644 (file)
index 0000000..f11e3a5
--- /dev/null
@@ -0,0 +1,53 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.ListUtils;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class ArchiveMaterialSubmitStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String JOBTEMPLATE = "archive-material.xml";\r
+       private static final String KILL_DATE_DAYS = "killDateDays";\r
+       private static final String ARCHIVE = "Archiválás";\r
+       private static final String ARCHIVE_ITEM = "archiveItem";\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(List<ArchiveItem> archiveList, int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+               if (archiveList == null || archiveList.size() == 0)\r
+                       return null;\r
+\r
+               if (jobRuntime.forkPrepare()) {\r
+                       for (int i = 0; i < archiveList.size(); i++) {\r
+                               ArchiveItem archiveItem = archiveList.get(i);\r
+                               try {\r
+                                       IJobRuntime runtime = jobEngine.submit(jobRuntime, null, JOBTEMPLATE, ARCHIVE,\r
+                                                       ListUtils.asMap(ARCHIVE_ITEM, archiveItem, KILL_DATE_DAYS, killDateDays));\r
+                                                       \r
+                                       int progress = (i + 1) * 100 / archiveList.size();\r
+                                       setProgress(progress);\r
+                                       if (runtime == null)\r
+                                               throw new Exception("Submit returned null runtime");\r
+                               } catch (Exception e) {\r
+                                       logger.catching(e);\r
+                                       String fileName = new File(archiveItem.getMediaFile()).getName();\r
+                                       logger.error(marker, "Az '{}' állomány archiválási kísérlete sikertelen. A rendszer üzenete: {}", fileName, e.getMessage());\r
+                                       if (!archiveItem.removeCatchedFile())\r
+                                               logger.error(marker, "Az '{}' állomány .catched jelző állománya nem törölhető.", fileName);\r
+                                       throw e;\r
+                               }\r
+                       }\r
+               }\r
+               jobRuntime.forkWaitComplete();\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/ArchiveRecursive.java b/server/-product/production/LOCAL/jobs/steps/ArchiveRecursive.java
new file mode 100644 (file)
index 0000000..6a65d5f
--- /dev/null
@@ -0,0 +1,291 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Arrays;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.commons.io.FilenameUtils;\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+import user.commons.JobStatus;\r
+import user.commons.ListUtils;\r
+import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
+\r
+public class ArchiveRecursive extends JobStep implements FileVisitor<Path> {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String JOBTEMPLATE = "archive-material.xml";\r
+       private static final String ITEM_TITLE = "itemTitle";\r
+       private static final String ITEM_HOUSEID = "itemHouseId";\r
+       private static final String MEDIA_HOUSEID = "mediaHouseId";\r
+       private static final String MEDIA_TITLE = "mediaTitle";\r
+       private static final String MEDIA_DESCRIPTION = "mediaDescription";\r
+       private static final String MEDIA_TYPE = "mediaType";\r
+       private static final String ARCHIVE = "Archiválás";\r
+       private static final String ARCHIVE_ITEM = "archiveItem";\r
+       private static final String KILL_DATE_DAYS = "killDateDays";\r
+       private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");\r
+\r
+       private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", "VASAROLT", EscortFiles.STATUSFOLDER, EscortFiles.CONFLICTFOLDER);\r
+       private int limit;\r
+       private int submitted;\r
+       private int killDateDays;\r
+\r
+       private boolean canReadMediaInfo(Path mediaFilePath) {\r
+               boolean result = false;\r
+               try {\r
+                       MediaInfo mi = new MediaInfo(mediaFilePath);\r
+                       mi.process();\r
+                       result = true;\r
+               } catch (Exception e) {\r
+                       logger.warn(getSessionMarker(), e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private void checkArchiveItem(ArchiveItem archiveItem, Path mediaPath) throws Exception {\r
+               if (archiveItem == null)\r
+                       throw new Exception(mediaPath + " has no metadata specified.");\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemHouseId()))\r
+                       throw new Exception(mediaPath + " has no Item HouseID specified in metadata.");\r
+\r
+               if (StringUtils.isBlank(archiveItem.getItemTitle()))\r
+                       throw new Exception(mediaPath + " has no Item Title specified in metadata.");\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaHouseId()))\r
+                       throw new Exception(mediaPath + " has no Media HouseID specified in metadata.");\r
+\r
+               if (StringUtils.isBlank(archiveItem.getMediaTitle()))\r
+                       throw new Exception(mediaPath + " has no Media Title specified in metadata.");\r
+       }\r
+\r
+       private ArchiveItem createArchiveItem(Path filePath) throws Exception {\r
+               ArchiveItem result = null;\r
+\r
+               String fileName = filePath.getFileName().toString();\r
+               String mediaHouseId = FilenameUtils.removeExtension(fileName);\r
+               try {\r
+                       result = getPlanAirMetadata(mediaHouseId);\r
+               } catch (Exception e) {\r
+\r
+                       logger.error("PlanAir metadata error", e);\r
+                       //nem latja a drivert pl.\r
+                       throw e;\r
+               }\r
+\r
+               if (result == null) {\r
+                       result = new ArchiveItem();\r
+                       BasicFileAttributes attr = Files.readAttributes(filePath, BasicFileAttributes.class);\r
+                       result.setItemHouseId(df.format(attr.lastModifiedTime().toMillis()));\r
+                       result.setItemTitle(filePath.getParent().toString());\r
+                       result.setMediaHouseId(mediaHouseId);\r
+                       result.setMediaTitle(fileName);\r
+                       //TODO kesobb kivenni\r
+                       //result.setMediaDescription("/OMARCHIVE");\r
+                       result.setMediaType("Generic");\r
+               }\r
+\r
+               result.setMediaFile(filePath.toString());\r
+               return result;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourcePath, int killDateDays, int limit) throws Exception {\r
+               this.killDateDays = killDateDays;\r
+               this.limit = limit;\r
+               try {\r
+                       if (getJobRuntime().forkPrepare()) {\r
+                               Files.walkFileTree(Paths.get(sourcePath), this);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
+               } finally {\r
+                       if (submitted > 0)\r
+                               getJobRuntime().forkWaitComplete();\r
+                       else\r
+                               getJobRuntime().cancelForkPrepare();\r
+\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private ArchiveItem getPlanAirMetadata(String mediaHouseId) throws Exception {\r
+               PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+               opt.setSearch(mediaHouseId);\r
+               opt.setType(MetadataType.Material);\r
+\r
+               BasicDBObject json = null;\r
+               List<IMetadata> data = null;\r
+\r
+               IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+               IMetadataProvider planairProvider = factory.getProvider(MetadataProviderType.PLANAIR);\r
+\r
+               ArchiveItem result = null;\r
+               data = planairProvider.list(opt);\r
+               if (data.size() != 0)\r
+                       json = data.get(0).asJSON();\r
+               else {\r
+                       opt.setType(MetadataType.Promo);\r
+                       data = planairProvider.list(opt);\r
+                       if (data.size() != 0)\r
+                               json = data.get(0).asJSON();\r
+                       else {\r
+                               opt.setType(MetadataType.AD);\r
+                               data = planairProvider.list(opt);\r
+                               if (data.size() != 0)\r
+                                       json = data.get(0).asJSON();\r
+                       }\r
+               }\r
+               if (json != null) {\r
+                       result = new ArchiveItem();\r
+                       result.setItemHouseId(json.getString(ITEM_HOUSEID));\r
+                       result.setItemTitle(json.getString(ITEM_TITLE));\r
+                       result.setMediaHouseId(json.getString(MEDIA_HOUSEID));\r
+                       result.setMediaTitle(json.getString(MEDIA_TITLE));\r
+                       result.setMediaDescription(json.getString(MEDIA_DESCRIPTION));\r
+                       result.setMediaType(json.getString(MEDIA_TYPE));\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private boolean handleArchiveConflict(Path mediaPath) throws Exception {\r
+               boolean result = false;\r
+               String sourceFileName = mediaPath.getFileName().toString();\r
+               if (getManager().isMediaFileExists(sourceFileName)) {\r
+                       EscortFiles.createMediaCatch(mediaPath);\r
+                       result = true;\r
+\r
+                       //                      try {\r
+                       //                              Path parent = sourcePath.getParent();\r
+                       //                              Path conflictPath = Paths.get(parent.toString(), CONFLICT);\r
+                       //                              File folder = conflictPath.toFile();\r
+                       //                              if (!folder.exists() || !folder.isDirectory()) {\r
+                       //                                      Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
+                       //                                      FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
+                       //                                      try {\r
+                       //                                              Files.createDirectories(conflictPath, attr);\r
+                       //                                      } catch (Exception e) {\r
+                       //                                              try {\r
+                       //                                                      Files.createDirectory(conflictPath);\r
+                       //                                              } catch (Exception e1) {\r
+                       //                                                      logger.catching(e);\r
+                       //                                                      throw e;\r
+                       //                                              }\r
+                       //                                      }\r
+                       //                              }\r
+                       //\r
+                       //                              Path conflictFile = Paths.get(conflictPath.toString(), sourceFileName);\r
+                       //                              if (conflictFile.toFile().exists())\r
+                       //                                      conflictFile = Paths.get(conflictPath.toString(), sourceFileName + (new Date()).getTime());\r
+                       //                              Files.move(sourcePath, conflictFile);\r
+                       //                              result = true;\r
+                       //                      } catch (Exception e1) {\r
+                       //                              logger.error(getSessionMarker(), "Hiba az '{}' állomány mappába mozgatásakor. A rendszer üzenete: {}", CONFLICT, e1.getMessage());\r
+                       //                      }\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult postVisitDirectory(Path paramT, IOException paramIOException) throws IOException {\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
+               Path dirName = dir.getFileName();\r
+               logger.info("PreVisit {}", dir);\r
+\r
+               if (skipPathNames.contains(dirName.toString()))\r
+                       return FileVisitResult.SKIP_SUBTREE;\r
+               else\r
+                       logger.info("PreVisit {}", dir);\r
+\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       private boolean processPathItem(Path mediaPath) throws Exception {\r
+               if (submitted == limit)\r
+                       return false;\r
+\r
+               //              if (!"Transfered".equals(mediaPath.getParent().getFileName().toString()))\r
+               //                      return false;\r
+\r
+               if (mediaPath.getFileName().toString().startsWith("."))\r
+                       return false;\r
+\r
+               File mediaFile = mediaPath.toFile();\r
+               if (mediaFile.isDirectory())\r
+                       return false;\r
+\r
+               if (EscortFiles.isMediaCatched(mediaPath))\r
+                       return false;\r
+\r
+               if (handleArchiveConflict(mediaPath))\r
+                       return false;\r
+\r
+               if (!canReadMediaInfo(mediaPath))\r
+                       return false;\r
+\r
+               ArchiveItem archiveItem = createArchiveItem(mediaPath);\r
+\r
+               try {\r
+                       checkArchiveItem(archiveItem, mediaPath);\r
+                       submitted++;\r
+\r
+                       Map<String, Object> parameters = ListUtils.asMap(ARCHIVE_ITEM, archiveItem, KILL_DATE_DAYS, killDateDays);\r
+                       IJobRuntime runtime = getEngine().submit(getJobRuntime(), e -> {\r
+                               if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
+                                       EscortFiles.removeMediaCatch(mediaPath);\r
+                       }, JOBTEMPLATE, ARCHIVE, 1, IJobEngine.DEFAULT_OWNER, parameters);\r
+                       if (runtime == null)\r
+                               throw new Exception("Submit returned null runtime");\r
+                       runtime.setRelated(mediaPath.toString());\r
+                       EscortFiles.createMediaCatch(mediaPath);\r
+               } catch (Exception e) {\r
+                       String fileName = new File(archiveItem.getMediaFile()).getName();\r
+                       logger.error(getSessionMarker(), "Az '{}' állomány archiválási kísérlete sikertelen. A rendszer üzenete: {}", fileName, e.getMessage());\r
+               }\r
+\r
+               return true;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFile(Path filePath, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
+               //logger.info("Will archived {}", filePath);\r
+               try {\r
+                       processPathItem(filePath);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+               }\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFileFailed(Path filePath, IOException paramIOException) throws IOException {\r
+               logger.info("Error archive {}", filePath);\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/BatchRetrieveForkStep.java b/server/-product/production/LOCAL/jobs/steps/BatchRetrieveForkStep.java
new file mode 100644 (file)
index 0000000..15cf36c
--- /dev/null
@@ -0,0 +1,76 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.MediaCubeFinishMarker;\r
+import user.commons.MediaCubeMarker;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.scheduler.ScheduledJob;\r
+\r
+public class BatchRetrieveForkStep extends JobStep {\r
+       private static final String TARGET_PATH_TYPE = "targetPathType";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String CHILD_TEMPLATE = "retrieve-ondemand.xml";\r
+       private static final String ARCHIVEDMEDIA = "archivedMedia";\r
+       private static final String RECIPIENT = "successRecipient";\r
+       private static final String HOUSEID = "houseId";\r
+       private MediaCubeMarker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(List<ArchivedMedia> basket, String houseId, String recipient, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime)\r
+                       throws Exception {\r
+               marker = (MediaCubeMarker) jobRuntime.getSessionMarker();\r
+\r
+               //session szinten csak a finishMarker cimzettje az erdekes, es ezt a cimet pluszban hasznalja a konfigban megadott cimmel\r
+               //a finishMarker orokli a cim bellitast a sessionMarkertol\r
+               marker.setTo(recipient);\r
+\r
+               ((MediaCubeMarker) jobRuntime.getFinishMarker()).setTo(recipient);\r
+\r
+               if (basket == null || basket.size() == 0)\r
+                       return null;\r
+               setProgress(10);\r
+\r
+               MediaCubeMarker mailMarker = new MediaCubeMarker(recipient);\r
+               mailMarker.setSessionName("Archívum viszatöltés");\r
+               mailMarker.setSessionID(houseId);\r
+               logger.info(mailMarker, "A visszatöltések elindultak az alábbi állományokra:");\r
+\r
+               if (jobRuntime.forkPrepare()) {\r
+                       for (ArchivedMedia archivedMedia : basket) {\r
+                               logger.info(mailMarker, archivedMedia.getMedia().getMediaFilesName());\r
+                               submit(archivedMedia, recipient, houseId, targetPathType, jobEngine, jobRuntime);\r
+                       }\r
+               }\r
+               setProgress(50);\r
+               logger.info(new MediaCubeFinishMarker(mailMarker), "A visszatöltések végeztével megerősítő üzenetet küldünk.");\r
+               jobRuntime.forkWaitComplete();\r
+               setProgress(100);\r
+               return null;\r
+       }\r
+\r
+       public void submit(ArchivedMedia archivedMedia, String recipient, String houseId, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime)\r
+                       throws Exception {\r
+               try {\r
+                       ScheduledJob scheduledJob = jobEngine.getScheduledJob(CHILD_TEMPLATE);\r
+                       Map<String, Object> parameters = scheduledJob.getJobParameters();\r
+                       parameters.put(ARCHIVEDMEDIA, archivedMedia);\r
+                       parameters.put(HOUSEID, houseId);\r
+                       parameters.put(RECIPIENT, recipient);\r
+                       parameters.put(TARGET_PATH_TYPE, targetPathType);\r
+                       IJobRuntime child = jobEngine.submit(jobRuntime, null, CHILD_TEMPLATE, String.format("Visszatöltés %s részére", recipient), parameters);\r
+                       ((MediaCubeMarker) child.getSessionMarker()).setTo(recipient);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "Hiba a kötegelt visszatöltésben. A rendszer üzenete: {}", e.getMessage());\r
+               }\r
+\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/CancelableStep.java b/server/-product/production/LOCAL/jobs/steps/CancelableStep.java
new file mode 100644 (file)
index 0000000..0ff5eca
--- /dev/null
@@ -0,0 +1,46 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.commons.net.ftp.FTPClient;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.MarkerManager;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.FtpDirectoryLister;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+\r
+public class CancelableStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       int count = 10;\r
+\r
+       @StepEntry\r
+       public Object[] execute(int param) throws Exception {\r
+               try {\r
+\r
+                       Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
+                       getJobRuntime().setRelated("TESZT" + param);\r
+\r
+                       for (int i = 0; i < count; i++) {\r
+                               if (getJobRuntime().isWaitingCancel())\r
+                                       break;\r
+                               Thread.sleep(500);\r
+                               /*\r
+                               if (param==0)\r
+                                       throw new Exception();\r
+                               if (param==1) {\r
+                                       getJobRuntime().setDisableRetry(true);\r
+                                       throw new Exception();\r
+                               }\r
+                                */\r
+                               int progress = (i + 1) * 100 / count;\r
+                               setProgress(progress);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.info(e.getMessage());\r
+                       throw e;\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/CleanupMountedLocationStep.java b/server/-product/production/LOCAL/jobs/steps/CleanupMountedLocationStep.java
new file mode 100644 (file)
index 0000000..4e6f10d
--- /dev/null
@@ -0,0 +1,316 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.DirectoryStream;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.io.FileUtils;\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class CleanupMountedLocationStep extends JobStep implements FileVisitor<Path> {\r
+\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String PROJECTFOLDER = "PROJECT";\r
+       private static final String DATEFORMAT = "yyyyMMdd";\r
+       private static final String DOT = ".";\r
+       private static final String STATUSFOLDER = ".STATUS";\r
+       private static final String EWC2EXT = ".ewc2";\r
+       private static final String XMPEXT = ".xmp";\r
+       private static final String CATCHEDEXT = ".catched";\r
+       private static final String KILLDATEEXT = ".killdate";\r
+       private static final String JSONEXT = ".json";\r
+\r
+       private static boolean isEmpty(final Path directory) throws IOException {\r
+               try (DirectoryStream<Path> dirStream = Files.newDirectoryStream(directory)) {\r
+                       final int[] count = new int[] { 0 };\r
+                       final int[] specialCount = new int[] { 0 };\r
+                       dirStream.forEach(p -> {\r
+                               count[0]++;\r
+                               //                              if (p.getFileName().toString().toLowerCase().equals(PROJECTFOLDER.toLowerCase()))\r
+                               //                                      specialCount[0]++;\r
+                               if (p.getFileName().toString().toLowerCase().equals(STATUSFOLDER.toLowerCase()))\r
+                                       specialCount[0]++;\r
+\r
+                       });\r
+                       if (specialCount[0] == count[0])\r
+                               return true;\r
+               }\r
+               return false;\r
+       }\r
+\r
+       private Marker marker;\r
+\r
+       final int[] allCount = new int[] { 0 };\r
+       final int[] currentCount = new int[] { 0 };\r
+\r
+       private Path sourcePath;\r
+       private SimpleDateFormat dateFormat;\r
+       private StoreUri tsmStoreUri;\r
+\r
+       private Date checkExpiration(List<Path> killDateFiles) {\r
+               Date killDate = null;\r
+               for (Path killDateFile : killDateFiles) {\r
+                       Date currentKillDate = getKillDate(killDateFile);\r
+                       if (currentKillDate == null)\r
+                               continue;\r
+                       if ((killDate != null && currentKillDate.after(killDate)) || killDate == null)\r
+                               killDate = currentKillDate;\r
+               }\r
+               return new Date().after(killDate) ? killDate : null;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceFolder, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = getSessionMarker();\r
+               sourcePath = Paths.get(sourceFolder);\r
+               DirectoryStream<Path> directoryStream = null;\r
+               if (StringUtils.isBlank(sourcePath.toString())) {\r
+                       logger.error(marker, "A folyamat 'sourcePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourceFolder' input parameter missing.");\r
+               }\r
+\r
+               if (!sourcePath.toFile().exists() || !sourcePath.toFile().isDirectory()) {\r
+                       logger.error(marker, "A {} mappa nem létezik.", sourceFolder);\r
+                       throw new NullPointerException(String.format("Directory %s not exists.", sourceFolder));\r
+               }\r
+\r
+               Store tsmStore = getManager().getSystemStore(false);\r
+               if (tsmStore == null)\r
+                       throw new NullPointerException("A TSM bejegyzés nem található!");\r
+\r
+               tsmStoreUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+               if (tsmStoreUri == null)\r
+                       throw new NullPointerException("A TSM forrás elérése nem található!");\r
+\r
+               try {\r
+                       setProgress(1);\r
+                       dateFormat = new SimpleDateFormat(DATEFORMAT);\r
+\r
+                       Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() {\r
+                               @Override\r
+                               public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+                                       allCount[0]++;\r
+                                       return super.visitFile(file, attrs);\r
+                               }\r
+                       });\r
+                       Files.walkFileTree(sourcePath, this);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "Hiba a '{}' mappa feldolgozásában. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       if (directoryStream != null) {\r
+                               try {\r
+                                       directoryStream.close();\r
+                               } catch (IOException e) {\r
+                               }\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private Date getKillDate(Path killDateFile) {\r
+               String fileName = killDateFile.getFileName().toString();\r
+               int end = fileName.lastIndexOf(DOT);\r
+               if (end < 1)\r
+                       return null;\r
+               int start = fileName.lastIndexOf(DOT, end - 1);\r
+               if (start < 0)\r
+                       return null;\r
+               String strKillDate = fileName.substring(start + 1, end);\r
+               Date result = null;\r
+               if (StringUtils.isNumeric(strKillDate)) {\r
+                       try {\r
+                               result = dateFormat.parse(strKillDate);\r
+                       } catch (ParseException e) {\r
+                               logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.", fileName, strKillDate);\r
+                               return null;\r
+                       }\r
+               } else\r
+                       logger.error(marker, "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.", fileName, strKillDate);\r
+               return result;\r
+       }\r
+\r
+       private List<Path> getKillDateFiles(Path filePath) {\r
+               String killDateFilePattern = String.format("%s.*%s", filePath.getFileName().toString(), KILLDATEEXT);\r
+               List<Path> result = new ArrayList<>();\r
+               Path statusPath = null;\r
+               try {\r
+                       statusPath = Paths.get(filePath.getParent().toString(), STATUSFOLDER);\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       return null;\r
+               }\r
+               File statusPathFile = statusPath.toFile();\r
+               if (statusPathFile.exists() && statusPathFile.isDirectory()) {\r
+                       try (DirectoryStream<Path> stream = Files.newDirectoryStream(statusPath, killDateFilePattern)) {\r
+                               stream.forEach(p -> result.add(p));\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+               }\r
+               Collections.sort(result);\r
+               return result;\r
+       }\r
+\r
+       private boolean isArchived(Path filePath) {\r
+               boolean result = false;\r
+               String name = filePath.getFileName().toString();\r
+               String[] tsmName = new String[] { null };\r
+               String query = String.format("SELECT relativepath FROM MEDIAFILE WHERE houseid = '%s'", name);\r
+               getManager().executeQuery(query, rs -> {\r
+                       tsmName[0] = rs.getString("relativepath");\r
+                       return false;\r
+               }, null);\r
+\r
+               if (tsmName[0] != null) {\r
+                       try {\r
+                               RemoteFile remoteFile = tsmStoreUri.getRemoteFile(tsmName[0]);\r
+                               result = remoteFile != null;\r
+                       } catch (Exception e) {\r
+                               logger.error(e.getMessage());\r
+                       } finally {\r
+                               tsmStoreUri.cleanUp();\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {\r
+               if (!dir.equals(sourcePath) && isEmpty(dir)) {\r
+                       if (!removeExistingSpecialDirectory(dir, PROJECTFOLDER))\r
+                               return FileVisitResult.CONTINUE;\r
+                       if (!removeExistingSpecialDirectory(dir, STATUSFOLDER))\r
+                               return FileVisitResult.CONTINUE;\r
+                       if (removeFile(dir))\r
+                               logger.info(marker, "A {} üres mappa törlése sikeres.", dir);\r
+\r
+               }\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+\r
+               //A .-al kezdodo mappakat kihagyjuk\r
+               if (dir.getFileName().toString().startsWith("."))\r
+                       return FileVisitResult.SKIP_SUBTREE;\r
+\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       private void processPathItem(Path filePath) {\r
+               currentCount[0]++;\r
+\r
+               if (filePath.getFileName().toString().startsWith("."))\r
+                       return;\r
+\r
+               int progress = currentCount[0] * 100 / allCount[0];\r
+               setProgress(progress);\r
+\r
+               logger.info("Checking {}", filePath);\r
+               List<Path> killDateFiles = getKillDateFiles(filePath);\r
+               if (killDateFiles == null || killDateFiles.size() == 0) {\r
+                       logger.warn(marker, "A {} fájlhoz nem található 'killdate' állomány.", filePath);\r
+                       return;\r
+               }\r
+\r
+               if (killDateFiles.size() != 1)\r
+                       logger.warn(marker, "A {} fájlhoz több 'killdate' állomány található, a legújabb dátum határozza meg a törlés időpontját.", filePath);\r
+\r
+               Date killDate = checkExpiration(killDateFiles);\r
+               if (killDate == null)\r
+                       return;\r
+\r
+               if (!isArchived(filePath)) {\r
+                       logger.error(marker, "A(z) {} anyag törlésre van kijelölve, de nem található az archívumban.", filePath);\r
+                       return;\r
+               }\r
+\r
+               if (removeFiles(filePath, killDateFiles))\r
+                       logger.info(marker, "A {} fájl és kapcsolódó állományai a {} killdate bejegyzés alapján sikeresen törlődtek.", filePath.getFileName(),\r
+                                       dateFormat.format(killDate));\r
+               else\r
+                       logger.warn(marker, "A {} fájl és kapcsolódó állományai a {} killdate bejegyzés alapján csak részlegesen vagy egyáltalán nem törlődtek.",\r
+                                       filePath.getFileName(), dateFormat.format(killDate));\r
+       }\r
+\r
+       private boolean removeExistingSpecialDirectory(Path dir, String folderName) throws IOException {\r
+               File projectPath = Paths.get(dir.toString(), folderName).toFile();\r
+               if (projectPath.exists() && projectPath.isDirectory()) {\r
+                       FileUtils.deleteDirectory(projectPath);\r
+                       if (projectPath.exists()) {\r
+                               logger.warn(marker, "A {} alatti {} mappa törlése nem sikerült.", dir, folderName);\r
+                               return false;\r
+                       }\r
+               }\r
+               return true;\r
+       }\r
+\r
+       private boolean removeFile(Path filePath) {\r
+               boolean result = false;\r
+               try {\r
+                       //logger.error("REMOVE {}", filePath);\r
+                       File file = filePath.toFile();\r
+                       if (file.exists())\r
+                               result = file.delete();\r
+               } catch (Exception e) {\r
+                       logger.error(marker, "A {} fájl nem törölhető. A rendszer hibaüzenete: {}", filePath, e.getMessage());\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private boolean removeFiles(Path filePath, List<Path> killDateFiles) {\r
+               if (!removeFile(filePath))\r
+                       return false;\r
+\r
+               removeFile(Paths.get(filePath.toString() + EWC2EXT));\r
+               removeFile(Paths.get(filePath.toString() + XMPEXT));\r
+               removeFile(Paths.get(filePath.getParent().toString(), STATUSFOLDER, filePath.getFileName().toString() + CATCHEDEXT));\r
+               removeFile(Paths.get(filePath.getParent().toString(), STATUSFOLDER, filePath.getFileName().toString() + JSONEXT));\r
+\r
+               boolean result = true;\r
+               for (Path killDateFile : killDateFiles) {\r
+                       if (!removeFile(killDateFile))\r
+                               result = false;\r
+               }\r
+\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+               processPathItem(file);\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+\r
+       @Override\r
+       public FileVisitResult visitFileFailed(Path file, IOException e) throws IOException {\r
+               logger.error(marker, "A {} fájl nem érhető el. A rendszer hibaüzenete: {}", file.toString(), e.getMessage());\r
+               return FileVisitResult.CONTINUE;\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/CreateArchiveItemStep.java b/server/-product/production/LOCAL/jobs/steps/CreateArchiveItemStep.java
new file mode 100644 (file)
index 0000000..b169edf
--- /dev/null
@@ -0,0 +1,45 @@
+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
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.Store;\r
+\r
+public class CreateArchiveItemStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(Media mediaCubeMedia, String localHiresPath) throws Exception {\r
+               DB db = NoSQLUtils.getNoSQLDB();\r
+               DBCollection collection = db.getCollection("missing_lowres");\r
+               Store highResStore = getManager().getSystemStore(false);\r
+\r
+               ArchiveItem archiveItem = null;\r
+               try {\r
+                       if (mediaCubeMedia.getMediaFilesCount() != 1)\r
+                               throw new Exception("Expected media count is 1, found " + mediaCubeMedia.getMediaFilesCount());\r
+                       if (mediaCubeMedia.getMediaFiles().get(0).getStoreId() != highResStore.getId())\r
+                               throw new Exception("Expected media store is a high-res store");\r
+\r
+                       String name = mediaCubeMedia.getMediaFileRealName();\r
+                       archiveItem = new ArchiveItem();\r
+                       archiveItem.setMediaFile(Paths.get(localHiresPath, name).toString());\r
+                       collection.save(new BasicDBObject("name", name));\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.info(getMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       setProgress(100);\r
+               }\r
+               return new Object[] { archiveItem };\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/CreateMissingLowresStep.java b/server/-product/production/LOCAL/jobs/steps/CreateMissingLowresStep.java
new file mode 100644 (file)
index 0000000..19bad47
--- /dev/null
@@ -0,0 +1,84 @@
+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
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+\r
+import user.commons.MediaCubeUndoMarker;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class CreateMissingLowresStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String localHiresPath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               Object[] result = new Object[] { null, null, "%s", null, 0, true };\r
+               DB db = NoSQLUtils.getNoSQLDB();\r
+               DBCollection collection = db.getCollection("missing_lowres");\r
+               IItemManager manager = jobEngine.getItemManager();\r
+               Media media = getFirstUntranscodedMedia(manager, collection);\r
+\r
+               try {\r
+                       if (media == null) {\r
+                               logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
+                               // throw new Exception("Nincs feldolgozandó hiány.");\r
+                               cancel();\r
+                               return null;\r
+                       }\r
+\r
+                       String name = media.getMediaFileRealName();\r
+                       result[0] = media;\r
+                       ArchiveItem archiveItem = new ArchiveItem();\r
+                       archiveItem.setMediaFile(Paths.get(localHiresPath, name).toString());\r
+                       result[1] = archiveItem;\r
+                       collection.save(new BasicDBObject("name", name));\r
+                       logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
+                       throw e;\r
+               } finally {\r
+                       setProgress(100);\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private Media getFirstUntranscodedMedia(IItemManager manager, DBCollection collection) {\r
+               Media[] result = new Media[] { null };\r
+               //MV\r
+               String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS WHERE HOUSEID like 'M%' or HOUSEID like 'P%' or HOUSEID like 'R%' ORDER BY modified DESC";\r
+\r
+               //HTV\r
+               //String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS";\r
+               manager.executeQuery(query, rs -> {\r
+                       try {\r
+                               long mediaId = rs.getLong(1);\r
+                               Media media = manager.getMedia(mediaId);\r
+                               //a nevgeneralas miatt az eredeti MediaFilesName nem jo, a pontos nev kell nekunk\r
+                               String name = media.getMediaFileRealName();\r
+                               logger.info(getSessionMarker(), "Checking {}", name);\r
+                               long existing = collection.find(new BasicDBObject("name", name)).count();\r
+                               if (existing > 0) {\r
+                                       logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
+                                       return true;\r
+                               }\r
+\r
+                               result[0] = media;\r
+                       } catch (Exception e) {\r
+                               logger.error(e);\r
+                       }\r
+                       return false;\r
+               }, null);\r
+               return result[0];\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/FileCopyStep.java b/server/-product/production/LOCAL/jobs/steps/FileCopyStep.java
new file mode 100644 (file)
index 0000000..c417255
--- /dev/null
@@ -0,0 +1,95 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class FileCopyStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IItemManager manager;\r
+       private Marker marker;\r
+\r
+       private void check(String sourceProtocol, String sourcePath, String sourceFileName, String targetProtocol, String targetPath, String targetFileName,\r
+                       IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
+               if (jobEngine == null) {\r
+                       logger.error(marker, "A folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(marker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               if (sourceProtocol == null) {\r
+                       logger.error(marker, "A forrás protokol bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourceProtocol' input parameter missing.");\r
+               }\r
+               if (sourcePath == null) {\r
+                       logger.error(marker, "A forrás fájl elérés bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourcePath' input parameter missing.");\r
+               }\r
+               if (sourceFileName == null) {\r
+                       logger.error(marker, "A forrás fájlnév bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'sourceFileName' input parameter missing.");\r
+               }\r
+               if (targetProtocol == null) {\r
+                       logger.error(marker, "A cél protokol bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetProtocol' input parameter missing.");\r
+               }\r
+               if (targetPath == null) {\r
+                       logger.error(marker, "A cél fájl elérés bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetPath' input parameter missing.");\r
+               }\r
+               if (targetFileName == null) {\r
+                       logger.error(marker, "A cél fájlnév bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetFileName' input parameter missing.");\r
+               }\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceProtocol, String sourcePath, String sourceFileName, String targetProtocol, String targetPath, String targetFileName,\r
+                       int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+\r
+               check(sourceProtocol, sourcePath, sourceFileName, targetProtocol, targetPath, targetFileName, jobEngine, jobRuntime);\r
+\r
+               StoreUri source = null;\r
+               StoreUri target = null;\r
+\r
+               try {\r
+                       source = manager.createStoreUri(Enum.valueOf(RemoteStoreProtocol.class, sourceProtocol), sourcePath);\r
+                       target = manager.createStoreUri(Enum.valueOf(RemoteStoreProtocol.class, targetProtocol), targetPath);\r
+                       source.addProgressListener(new IProgressEventListener() {\r
+                               @Override\r
+                               public void progressChanged(ProgressEvent evt) {\r
+                                       jobRuntime.incrementProgress(evt.getProgress());\r
+                               }\r
+                       });\r
+\r
+                       source.transferFrom(target, sourceFileName, targetFileName);\r
+                       if (killDateDays > -1)\r
+                               EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (source != null) {\r
+                               source.cleanUp();\r
+                       }\r
+                       if (target != null) {\r
+                               target.cleanUp();\r
+                       }\r
+               }\r
+\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/FileSearchFilterOptions.java b/server/-product/production/LOCAL/jobs/steps/FileSearchFilterOptions.java
new file mode 100644 (file)
index 0000000..436c3be
--- /dev/null
@@ -0,0 +1,41 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class FileSearchFilterOptions {\r
+\r
+       private BasicDBObject filter;\r
+\r
+       public FileSearchFilterOptions(BasicDBObject filter) {\r
+               this.filter = filter;\r
+       }\r
+\r
+       public boolean acceptFile(Path file) {\r
+               if (filter == null)\r
+                       return true;\r
+\r
+               if (filter.containsKey("fileName")) {\r
+                       //.*\.(sh|ini|conf|vhost|xml|php)$\r
+                       String fileNamePattern = filter.getString("fileName");\r
+                       if (fileNamePattern == null || fileNamePattern.trim().length() == 0)\r
+                               return true;\r
+\r
+                       Pattern pattern = Pattern.compile(fileNamePattern, Pattern.CASE_INSENSITIVE);\r
+\r
+                       Matcher matcher = pattern.matcher(file.getFileName().toString());\r
+                       if (matcher.find())\r
+                               return true;\r
+\r
+               }\r
+\r
+               return false;\r
+       }\r
+\r
+       public boolean preAcceptDirectory(Path file) {\r
+               return true;\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/HSMMigrateStep.java b/server/-product/production/LOCAL/jobs/steps/HSMMigrateStep.java
new file mode 100644 (file)
index 0000000..6b85f1d
--- /dev/null
@@ -0,0 +1,401 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.BufferedInputStream;\r
+import java.io.BufferedOutputStream;\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileOutputStream;\r
+import java.io.IOException;\r
+import java.io.InputStream;\r
+import java.io.OutputStream;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Arrays;\r
+import java.util.LinkedHashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
+import org.apache.commons.io.FilenameUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+import com.ibm.nosql.json.api.QueryBuilder;\r
+\r
+import user.commons.IEntityBase;\r
+import user.commons.MediaCubeMarker;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.MediaFileDAO;\r
+import user.mediacube.metadata.interfaces.IMetadata;\r
+import user.mediacube.metadata.interfaces.IMetadataProvider;\r
+import user.mediacube.metadata.interfaces.IMetadataProviderFactory;\r
+import user.mediacube.metadata.interfaces.MetadataProviderType;\r
+import user.mediacube.metadata.interfaces.MetadataType;\r
+import user.mediacube.metadata.interfaces.PlanAirMetadataListOptions;\r
+\r
+public class HSMMigrateStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String MXFEXT = ".mxf";\r
+       private static final String MOVEXT = ".mov";\r
+       private Marker marker = null;\r
+       private IMetadataProvider hsmProvider;\r
+       private Map<String, BasicDBObject> tapeContents = new LinkedHashMap<>();\r
+       private DBCollection excludes;\r
+       private DBCollection fileHistory;\r
+       private DBCollection volumeHistory;\r
+       private DB db;\r
+       private IMetadataProvider planairProvider;\r
+       private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");\r
+\r
+       private void cleanupHistory() {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (fileHistory == null)\r
+                       fileHistory = db.getCollection("hsm_migrate_file_history");\r
+               if (volumeHistory == null)\r
+                       volumeHistory = db.getCollection("hsm_migrate_volume_history");\r
+               fileHistory.drop();\r
+               volumeHistory.drop();\r
+       }\r
+\r
+       private BasicDBObject createMetadata(String volumeName, String fileName) throws Exception {\r
+\r
+               Path filePath = Paths.get(fileName);\r
+               String mediaHouseId = FilenameUtils.removeExtension(filePath.getFileName().toString());\r
+               BasicDBObject result = null;\r
+               try {\r
+                       result = getPlanAirMetadata(mediaHouseId);\r
+               } catch (Exception e) {\r
+\r
+                       logger.error("PlanAir metadata error", e);\r
+                       //nem latja a drivert pl.\r
+                       //throw e;\r
+               }\r
+\r
+               if (result == null) {\r
+                       result = new BasicDBObject();\r
+                       BasicFileAttributes attr = Files.readAttributes(filePath, BasicFileAttributes.class);\r
+                       result.put("itemHouseId", df.format(attr.lastModifiedTime().toMillis()));\r
+                       result.put("itemTitle", filePath.getParent().toString());\r
+                       result.put("mediaHouseId", mediaHouseId);\r
+                       result.put("mediaTitle", fileName);\r
+                       result.put("mediaDescription", volumeName);\r
+                       result.put("mediaType", "Generic");\r
+               }\r
+               result.put("userName", "mediacube");\r
+               return result;\r
+       }\r
+\r
+       @SuppressWarnings("serial")\r
+       @StepEntry\r
+       public Object[] execute(String sourceLocation, String targetLocation) throws Exception {\r
+               marker = getJobRuntime().getSessionMarker();\r
+               //remove from prod\r
+               //cleanupHistory();\r
+               hsmProvider = getMetadataProvider(MetadataProviderType.HSM);\r
+               if (hsmProvider == null)\r
+                       throw new NullPointerException("No HSM metadata provider available");\r
+               planairProvider = getMetadataProvider(MetadataProviderType.PLANAIR);\r
+               if (planairProvider == null)\r
+                       throw new NullPointerException("No PLANAIR metadata provider available");\r
+               Path targetPath = Paths.get(targetLocation);\r
+               try {\r
+                       List<IMetadata> volumes = hsmProvider.list(new BasicDBObject());\r
+                       for (IMetadata volume : volumes) {\r
+                               String volumeName = volume.getTitle();\r
+\r
+                               BasicDBObject historyResult = queryVolumeHistory(volumeName);\r
+                               if (historyResult != null) {\r
+                                       logger.info(marker, "A kazetta már feldolgozásra került: {}", volumeName);\r
+                                       continue;\r
+                               }\r
+                               logger.info(marker, "A kazetta feldolgozása elindul: {}", volumeName);\r
+                               List<IMetadata> contents = getContents(volumeName);\r
+                               int p = 0;\r
+                               boolean oneSuccess = false;\r
+                               boolean hasError = false;\r
+                               for (IMetadata content : contents) {\r
+                                       BasicDBObject c = content.asJSON();\r
+                                       String hsmFileName = c.getString("fileName");\r
+                                       long contentFileSize = NoSQLUtils.asLong(c, "fileSize");\r
+                                       if (!tapeContents.containsKey(hsmFileName)) {\r
+                                               tapeContents.put(hsmFileName, c);\r
+                                               Path sourceFilePath = Paths.get(sourceLocation, hsmFileName);\r
+                                               if (contentFileSize < Files.getFileStore(targetPath).getUsableSpace()) {\r
+                                                       Path targetFilePath = Paths.get(targetLocation, sourceFilePath.getFileName().toString());\r
+\r
+                                                       try {\r
+                                                               if (processHSMFile(volumeName, hsmFileName, sourceFilePath, targetFilePath)) {\r
+                                                                       oneSuccess = true;\r
+                                                               }\r
+                                                       } catch (Exception e) {\r
+                                                               hasError = true;\r
+                                                       }\r
+                                               }\r
+                                       }\r
+                                       setProgress(p++ * 100 / contents.size());\r
+\r
+                                       if (getJobRuntime().isWaitingCancel()) {\r
+                                               logger.info("Job canceled by user");\r
+                                               //ne mentsuk a szalagot meg\r
+                                               return null;\r
+                                       }\r
+\r
+                               }\r
+\r
+                               if (oneSuccess && !hasError) {\r
+                                       saveVolumeHistory(volumeName);\r
+                                       String subject = "A kazetta eltávolítható a HSM rendszerből: " + volumeName;\r
+                                       logger.info(new MediaCubeMarker() {\r
+                                               {\r
+                                                       setSubject(subject);\r
+                                               }\r
+                                       }, subject);\r
+                               }\r
+\r
+                               //ha mar sikerult valamit archivalni kilepunk\r
+                               if (oneSuccess)\r
+                                       break;\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(marker, "Hiba a migráció során. A rendszer hibaüzenete: {}", e.getMessage());\r
+                       throw e;\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private List<IMetadata> getContents(String volumeName) throws Exception {\r
+               List<IMetadata> contents = null;\r
+               contents = hsmProvider.list(new BasicDBObject("volumeName", volumeName));\r
+               return contents;\r
+       }\r
+\r
+       protected IMetadataProvider getMetadataProvider(MetadataProviderType type) {\r
+               IMetadataProviderFactory factory = getService(IMetadataProviderFactory.class);\r
+               if (factory == null)\r
+                       return null;\r
+               return factory.getProvider(type);\r
+       }\r
+\r
+       private BasicDBObject getPlanAirMetadata(String mediaHouseId) throws Exception {\r
+               PlanAirMetadataListOptions opt = new PlanAirMetadataListOptions();\r
+               opt.setSearch(mediaHouseId);\r
+\r
+               List<IMetadata> result = null;\r
+               opt.setType(MetadataType.Material);\r
+               result = planairProvider.list(opt);\r
+               if (result.size() != 0)\r
+                       return result.get(0).asJSON();\r
+\r
+               opt.setType(MetadataType.Promo);\r
+               result = planairProvider.list(opt);\r
+               if (result.size() != 0)\r
+                       return result.get(0).asJSON();\r
+\r
+               opt.setType(MetadataType.AD);\r
+               result = planairProvider.list(opt);\r
+               if (result.size() != 0)\r
+                       return result.get(0).asJSON();\r
+\r
+               return null;\r
+       }\r
+\r
+       //true if need copy\r
+       public boolean prepareCopy(String hsmFileName, Path source, Path target) throws IOException {\r
+               boolean result = true;\r
+               BasicDBObject excludeResult = queryExclude(hsmFileName);\r
+               if (excludeResult != null) {\r
+                       logger.warn(marker, "Kivételként megjelölt: {}", hsmFileName);\r
+                       return false;\r
+               }\r
+\r
+               File sourceFile = source.toFile();\r
+               File targetFile = target.toFile();\r
+\r
+               if (!sourceFile.exists()) {\r
+                       logger.warn(marker, "A forrás nem elérhető: {}", source);\r
+                       return false;\r
+               }\r
+\r
+               //              BasicDBObject historyResult = queryFileHistory(contentFileName);\r
+               //              if (historyResult != null)\r
+               //                      return false;\r
+\r
+               //              if (!mediaFile.getName().toLowerCase().endsWith(MOVEXT.toLowerCase()) && !mediaFile.getName().toLowerCase().endsWith(MXFEXT.toLowerCase()))\r
+               //                      return;\r
+               //              logger.info("Start copy from {} to {}", sourceFilePath, targetFilePath);\r
+\r
+               boolean targetExists = targetFile.exists();\r
+\r
+               long targetLength = targetFile.length();\r
+               long sourceLength = sourceFile.length();\r
+\r
+               if (targetLength == sourceLength) {\r
+                       logger.warn(marker, "A fájl már fel van dolgozva: {}, {} -> {}", source, sourceLength, targetLength);\r
+                       return false;\r
+               }\r
+\r
+               if (targetLength > sourceLength) {\r
+                       logger.warn(marker, "A célfájl nagyobb, törlöm: {}", target);\r
+                       Files.delete(target);\r
+                       targetLength = 0;\r
+                       targetExists = false;\r
+               }\r
+\r
+               if (targetExists) {\r
+                       logger.warn(marker, "A fájl már létezik, a másolás folytatódik: {}, {} -> {}", target, sourceLength, targetLength);\r
+               } else\r
+                       logger.warn(marker, "Migrálás: {}, {} -> {}", source, sourceLength, targetLength);\r
+\r
+               return result;\r
+       }\r
+\r
+       private boolean processHSMFile(String volumeName, String hsmFileName, Path sourceFilePath, Path targetFilePath) throws Exception {\r
+               int repeat = 4;\r
+               boolean successCopy = false;\r
+\r
+               IItemManager manager = getManager();\r
+               MediaFileDAO mfDAO = (MediaFileDAO) manager.getBaseDAO(MediaFile.class);\r
+               List<IEntityBase> mediaFiles = mfDAO.getByHouseId(sourceFilePath.getFileName().toString());\r
+               if (mediaFiles != null && mediaFiles.size() > 0) {\r
+                       logger.warn(marker, "Már archivált: {}", hsmFileName);\r
+                       return false;\r
+               }\r
+\r
+               if (prepareCopy(hsmFileName, sourceFilePath, targetFilePath)) {\r
+                       while (repeat > 0) {\r
+                               try {\r
+                                       resumeableCopy(sourceFilePath, targetFilePath);\r
+                                       repeat = 0;\r
+                                       successCopy = true;\r
+                               } catch (Exception e) {\r
+                                       if (Files.exists(targetFilePath) && targetFilePath.toFile().length() == 0)\r
+                                               Files.delete(targetFilePath);\r
+                                       //logger.warn(marker, "Hiba a másolás során: {} ({})", sourceFilePath, e.getMessage());\r
+                                       repeat--;\r
+                               }\r
+                       }\r
+               }\r
+               String metadataFileName = sourceFilePath.getFileName() + EscortFiles.DOT_JSON;\r
+               Path metadataPath = Paths.get(targetFilePath.getParent().toString(), EscortFiles.STATUSFOLDER, metadataFileName);\r
+               boolean createMetadata = Files.exists(targetFilePath) && !Files.exists(metadataPath);\r
+\r
+               if (successCopy || createMetadata) {\r
+                       String metadata = null;\r
+                       try {\r
+                               metadata = createMetadata(volumeName, hsmFileName).toPrettyString("");\r
+                               EscortFiles.createMetadata(targetFilePath.getParent().toString(), targetFilePath.getFileName().toString(), metadata);\r
+                               //saveFileHistory(contentFileName);\r
+\r
+                       } catch (Exception e) {\r
+                               logger.error(marker, "Metadata error", e);\r
+                               return false;\r
+                       }\r
+                       return true;\r
+               }\r
+\r
+               logger.error(marker, "A fájl másolása nem lehetséges: {}", sourceFilePath);\r
+               return false;\r
+       }\r
+\r
+       public BasicDBObject queryExclude(String fileName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (excludes == null)\r
+                       excludes = db.getCollection("hsm_migrate_exclude");\r
+               Path filePath = Paths.get(fileName);\r
+               String pureFileName = FilenameUtils.removeExtension(filePath.getFileName().toString());\r
+               QueryBuilder qb = QueryBuilder.start("name").in(Arrays.asList(fileName, pureFileName));\r
+               BasicDBObject exceptionResult = NoSQLUtils.asSingle(excludes.find(qb.get()));\r
+               return exceptionResult;\r
+       }\r
+\r
+       public BasicDBObject queryFileHistory(String fileName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (fileHistory == null)\r
+                       fileHistory = db.getCollection("hsm_migrate_file_history");\r
+               QueryBuilder qb = QueryBuilder.start("name").in(Arrays.asList(fileName));\r
+               BasicDBObject historyResult = NoSQLUtils.asSingle(fileHistory.find(qb.get()));\r
+               return historyResult;\r
+       }\r
+\r
+       public BasicDBObject queryVolumeHistory(String volumeName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (volumeHistory == null)\r
+                       volumeHistory = db.getCollection("hsm_migrate_volume_history");\r
+               QueryBuilder qb = QueryBuilder.start("name").in(Arrays.asList(volumeName));\r
+               BasicDBObject historyResult = NoSQLUtils.asSingle(volumeHistory.find(qb.get()));\r
+               return historyResult;\r
+       }\r
+\r
+       public void resumeableCopy(Path source, Path target) throws Exception {\r
+               File sourceFile = source.toFile();\r
+               File targetFile = target.toFile();\r
+               boolean targetExists = targetFile.exists();\r
+\r
+               long targetLength = targetFile.length();\r
+               long sourceLength = sourceFile.length();\r
+\r
+               try (InputStream in = new BufferedInputStream(new FileInputStream(sourceFile));\r
+                               OutputStream out = new BufferedOutputStream(new FileOutputStream(targetFile, targetExists))) {\r
+\r
+                       byte[] buffer = new byte[128 * 1024];\r
+                       int lengthRead;\r
+\r
+                       if (targetExists)\r
+                               in.skip(targetLength);\r
+\r
+                       while ((lengthRead = in.read(buffer)) > 0) {\r
+                               out.write(buffer, 0, lengthRead);\r
+                               out.flush();\r
+                               targetLength = targetFile.length();\r
+                               if (targetLength > sourceLength) {\r
+                                       throw new Exception("Hiba! A fájl túl nagy lett.");\r
+                               }\r
+\r
+                               if (getJobRuntime().isWaitingCancel()) {\r
+                                       break;\r
+                               }\r
+                       }\r
+\r
+                       targetLength = targetFile.length();\r
+                       sourceLength = sourceFile.length();\r
+                       if (targetLength != sourceLength) {\r
+                               throw new Exception("Hiba! A fájl mérete nem egyezik.");\r
+                       }\r
+               }\r
+       }\r
+\r
+       private void saveFileHistory(String fileName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (fileHistory == null)\r
+                       fileHistory = db.getCollection("hsm_migrate_file_history");\r
+               BasicDBObject item = new BasicDBObject();\r
+               item.put("name", fileName);\r
+               fileHistory.save(item);\r
+\r
+       }\r
+\r
+       private void saveVolumeHistory(String volumeName) {\r
+               if (db == null)\r
+                       db = NoSQLUtils.getNoSQLDB();\r
+               if (volumeHistory == null)\r
+                       volumeHistory = db.getCollection("hsm_migrate_volume_history");\r
+               BasicDBObject item = new BasicDBObject();\r
+               item.put("name", volumeName);\r
+               volumeHistory.save(item);\r
+\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/MXFCutterStep.java b/server/-product/production/LOCAL/jobs/steps/MXFCutterStep.java
new file mode 100644 (file)
index 0000000..58a5944
--- /dev/null
@@ -0,0 +1,129 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+//import user.jobengine.db.Media;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class MXFCutterStep extends JobStep {\r
+       private static final String TARGETNAMEPATTERN = "-ARCH-%s";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IItemManager manager;\r
+       private StoreUri tempTargetUri;\r
+       private StoreUri tempSourceUri;\r
+       private String sourceFileName;\r
+       private Marker marker;\r
+       private int nexioPort;\r
+       private String nexioUserName, nexioPassword;\r
+       private String nexioHost;\r
+\r
+       protected void checkTargetPath(String targetPath) {\r
+               if (StringUtils.isBlank(targetPath)) {\r
+                       logger.error(marker, "A folyamat 'targetPath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetPath' input parameter missing.");\r
+               }\r
+       }\r
+\r
+       protected StoreUri createTargetUri(IItemManager manager, String targetPath) throws NullPointerException {\r
+               StoreUri result = null;\r
+               result = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost);\r
+               result.setPortNumber(nexioPort);\r
+               result.setUserName(nexioUserName);\r
+               result.setPassword(nexioPassword);\r
+\r
+               return result;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchivedMedia archivedMedia, String targetPath, String houseId, String successRecipient, int killDateDays, boolean useNexioTarget,\r
+                       String nexioAgency, int nexioPort, String nexioUserName, String nexioPassword, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               this.nexioPort = nexioPort;\r
+               this.nexioUserName = nexioUserName;\r
+               this.nexioPassword = nexioPassword;\r
+               nexioHost = System.getProperty("nexio.host");\r
+               marker = jobRuntime.getSessionMarker();\r
+\r
+               if (useNexioTarget && archivedMedia.getTcIn() != null && archivedMedia.getTcOut() != null) {\r
+                       setAndCheck(archivedMedia, houseId, targetPath, useNexioTarget, jobEngine);\r
+\r
+                       final IJobRuntime runtime = jobRuntime;\r
+                       sourceFileName = houseId + TARGETNAMEPATTERN;\r
+                       tempSourceUri.addProgressListener(new IProgressEventListener() {\r
+                               @Override\r
+                               public void progressChanged(ProgressEvent evt) {\r
+                                       runtime.incrementProgress(evt.getProgress());\r
+                               }\r
+                       });\r
+\r
+                       RemoteFile result = tempSourceUri.transferFrom(tempTargetUri, sourceFileName, sourceFileName);\r
+\r
+                       EscortFiles.setNEXIOKillDate(killDateDays, houseId, nexioAgency, tempTargetUri);\r
+\r
+                       logger.info("A {} videó kivágva {}s - {}s", sourceFileName, archivedMedia.getTcIn(), archivedMedia.getTcOut());\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       // private String getSourceFileName(ArchivedMedia archivedMedia, Store\r
+       // store) {\r
+       // List<MediaFile> mediaFiles = archivedMedia.getMedia().getMediaFiles();\r
+       // if (mediaFiles == null)\r
+       // return null;\r
+       // for (MediaFile mediaFile : mediaFiles) {\r
+       // if (mediaFile.getStore().getId() == store.getId())\r
+       // return mediaFile.getRelativePath();\r
+       // }\r
+       // return null;\r
+       // }\r
+\r
+       private void setAndCheck(ArchivedMedia archivedMedia, String houseId, String targetPath, boolean useNexioTarget, IJobEngine jobEngine) {\r
+               if (jobEngine == null) {\r
+                       logger.error(marker, "A folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(marker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               if (archivedMedia == null) {\r
+                       logger.error(marker, "A folyamat 'mediaCubeMedia' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'mediaCubeMedia' input parameter missing.");\r
+               }\r
+               checkTargetPath(targetPath);\r
+               if (StringUtils.isBlank(houseId)) {\r
+                       logger.error(marker, "A folyamat 'houseId' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'houseId' input parameter missing.");\r
+               }\r
+               Store tsmStore = manager.getSystemStore(false);\r
+               if (tsmStore == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás nem elérhető.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM Store.");\r
+               }\r
+\r
+               tempSourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, targetPath);\r
+               if (tempSourceUri == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás paraméterei nem elérhetőek.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM StoreUri.");\r
+               }\r
+               tempTargetUri = createTargetUri(manager, targetPath);\r
+               // sourceFileName = getSourceFileName(archivedMedia, tsmStore);\r
+               if (sourceFileName == null) {\r
+                       logger.error(marker, "Adatbázis bejegyzés hiba, a visszatöltendő fájl neve nem található.");\r
+                       throw new NullPointerException("Database error, missing MediaFile 'relativePath'.");\r
+               }\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/MediaToolStep.java b/server/-product/production/LOCAL/jobs/steps/MediaToolStep.java
new file mode 100644 (file)
index 0000000..c0c56f6
--- /dev/null
@@ -0,0 +1,41 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.db.Media;\r
+\r
+public class MediaToolStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia) throws Exception {\r
+               marker = getSessionMarker();\r
+\r
+               //TODO ez most minden esetben ujranezi\r
+               //              if (mediaCubeMedia.getLength() > 0)\r
+               //                      return null;\r
+\r
+               Path filePath = Paths.get(archiveItem.getMediaFile());\r
+               MediaInfo mi = new MediaInfo(filePath);\r
+               try {\r
+                       mi.process();\r
+                       long frames = mi.getFrames();\r
+                       if (frames > 0) {\r
+                               mediaCubeMedia.setLength(frames);\r
+                               getManager().modify(mediaCubeMedia);\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "A '{}' média analizálása sikertelen. A  rendszer üzenete: {}", filePath, e.getMessage());\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/MetadataTransformStep.java b/server/-product/production/LOCAL/jobs/steps/MetadataTransformStep.java
new file mode 100644 (file)
index 0000000..d193820
--- /dev/null
@@ -0,0 +1,168 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.attribute.FileAttribute;\r
+import java.nio.file.attribute.PosixFilePermission;\r
+import java.nio.file.attribute.PosixFilePermissions;\r
+import java.util.Date;\r
+import java.util.Set;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+\r
+import user.jobengine.db.Item;\r
+import user.jobengine.db.ItemManager;\r
+import user.jobengine.db.ItemType;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+/**\r
+ * Itemek es mediak krealasa a ArchiveItem objektum alapjan.\r
+ *\r
+ * @author robi\r
+ */\r
+public class MetadataTransformStep extends JobStep {\r
+       private static final String CONFLICT = ".CONFLICT";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String ITEM_MANAGER_IS_NULL = "ItemManager is null";\r
+       public static final String DEFAULT_MEDIATYPE = "Generic";\r
+       private ItemManager itemManager;\r
+\r
+       private Marker marker;;\r
+\r
+       private void addTags(ArchiveItem archiveItem, Media mediaCubeMedia) {\r
+               BasicDBList tags = archiveItem.getTags();\r
+               if (tags != null) {\r
+                       for (Object tag : tags) {\r
+\r
+                               try {\r
+                                       String tagText = String.valueOf(tag);\r
+                                       itemManager.addMediaTag(tagText, mediaCubeMedia.getId());\r
+                                       System.out.println();\r
+\r
+                               } catch (Exception e) {\r
+                                       logger.catching(e);\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       private void checkDuplicates(ArchiveItem archiveItem, String sourceFileName) throws Exception {\r
+               if (itemManager.isMediaFileExists(sourceFileName)) {\r
+                       try {\r
+                               Path sourcePath = Paths.get(archiveItem.getMediaFile());\r
+                               Path parent = sourcePath.getParent();\r
+                               Path conflictPath = Paths.get(parent.toString(), CONFLICT);\r
+                               File folder = conflictPath.toFile();\r
+                               if (!folder.exists() || !folder.isDirectory()) {\r
+                                       Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
+                                       FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
+                                       try {\r
+                                               Files.createDirectories(conflictPath, attr);\r
+                                       } catch (Exception e) {\r
+                                               try {\r
+                                                       Files.createDirectory(conflictPath);\r
+                                               } catch (Exception e1) {\r
+                                                       logger.catching(e);\r
+                                                       throw e;\r
+                                               }\r
+                                       }\r
+                               }\r
+\r
+                               Files.move(sourcePath, Paths.get(conflictPath.toString(), sourceFileName + (new Date()).getTime()));\r
+                       } catch (Exception e1) {\r
+                               logger.catching(e1);\r
+                               logger.error(marker, "Hiba az '{}' állomány mappába másolásakor. A rendszer üzenete: {}", CONFLICT, e1.getMessage());\r
+                       }\r
+                       throw new Exception("Az '" + sourceFileName + "' állomány már megtalálható az archívumban, archiválása nem lehetséges.");\r
+               }\r
+       }\r
+\r
+       private Item createItem(ArchiveItem archiveItem) {\r
+               Item mediaCubeItem = getExistingItem(archiveItem.getItemHouseId(), archiveItem.getItemTitle());\r
+               if (mediaCubeItem == null)\r
+                       mediaCubeItem = itemManager.createItem(DEFAULT_MEDIATYPE, archiveItem.getItemTitle(), archiveItem.getItemDescription(),\r
+                                       archiveItem.getItemHouseId());\r
+               return mediaCubeItem;\r
+       }\r
+\r
+       private Media createMedia(ArchiveItem archiveItem, Item mediaCubeItem, String mediaType) {\r
+               Media mediaCubeMedia;\r
+               mediaCubeMedia = itemManager.createMedia(mediaType, archiveItem.getMediaTitle(), archiveItem.getMediaDescription(), archiveItem.getMediaHouseId());\r
+               mediaCubeMedia.setLength(archiveItem.getDuration());\r
+               mediaCubeItem.appendMedia(mediaCubeMedia);\r
+\r
+               return mediaCubeMedia;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchiveItem archiveItem, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+               Media mediaCubeMedia = null;\r
+               itemManager = (ItemManager) jobEngine.getItemManager();\r
+               if (itemManager == null)\r
+                       throw new NullPointerException(ITEM_MANAGER_IS_NULL);\r
+               try {\r
+                       File sourceMediaFile = new File(archiveItem.getMediaFile());\r
+                       String sourceFileName = sourceMediaFile.getName();\r
+                       checkDuplicates(archiveItem, sourceFileName);\r
+                       Item mediaCubeItem = createItem(archiveItem);\r
+                       jobRuntime.incrementProgress(50);\r
+                       String mediaType = getCreateType(archiveItem);\r
+                       mediaCubeMedia = createMedia(archiveItem, mediaCubeItem, mediaType);\r
+                       //ha itemid 0 akkor merge, egyebkent media insert\r
+\r
+                       if (mediaCubeItem.getId() == 0)\r
+                               itemManager.mergeItemStructure(mediaCubeItem);\r
+                       else {\r
+                               mediaCubeMedia.setItemId(mediaCubeItem.getId());\r
+                               mediaCubeMedia.add();\r
+                       }\r
+\r
+                       addTags(archiveItem, mediaCubeMedia);\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       String fileName = new File(archiveItem.getMediaFile()).getName();\r
+                       logger.error(marker, "Az '{}' állomány nem archiválható, mert a metaadat transzformáció sikertelen. A rendszer üzenete: {}", fileName,\r
+                                       e.getMessage());\r
+                       if (!archiveItem.removeCatchedFile())\r
+                               logger.error(marker, "Az '{}' állomány .catched jelző állománya nem törölhető.", fileName);\r
+                       throw e;\r
+               } finally {\r
+                       jobRuntime.incrementProgress(100);\r
+               }\r
+               return new Object[] { mediaCubeMedia };\r
+       }\r
+\r
+       private String getCreateType(ArchiveItem archiveItem) {\r
+               String mediaType = archiveItem.getMediaType();\r
+               if (mediaType == null || mediaType.length() == 0)\r
+                       mediaType = DEFAULT_MEDIATYPE;\r
+               else {\r
+                       ItemType mediaItemType = itemManager.getItemType(mediaType);\r
+                       if (mediaItemType == null)\r
+                               itemManager.createItemType(mediaType, mediaType).add();\r
+               }\r
+               return mediaType;\r
+       }\r
+\r
+       private Item getExistingItem(String itemHouseId, String itemTitle) {\r
+               Item[] result = new Item[] { null };\r
+               String sql = String.format("select id from item where houseid='%s' and title='%s'", itemHouseId, itemTitle);\r
+               itemManager.executeQuery(sql, rs -> {\r
+                       long id = rs.getLong("id");\r
+                       result[0] = itemManager.getItem(id);\r
+                       return true;\r
+               }, null);\r
+               return result[0];\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/OutputPathAndNameSelectorStep.java b/server/-product/production/LOCAL/jobs/steps/OutputPathAndNameSelectorStep.java
new file mode 100644 (file)
index 0000000..7148df4
--- /dev/null
@@ -0,0 +1,151 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class OutputPathAndNameSelectorStep extends JobStep {\r
+\r
+       private static final String TARGETNAMEPATTERN = "-ARCH-%s";\r
+\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       private Marker marker;\r
+\r
+       private void check(String localRetrievePath, String materialOutputFolder, String promoOutputFolder, String advertisementOutputFolder,\r
+                       String octopusOutputFolder, String genericOutputFolder, String houseId, String targetPathType) {\r
+               if (StringUtils.isBlank(localRetrievePath)) {\r
+                       logger.error(marker, "A folyamat 'localRetrievePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'localRetrievePath' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(materialOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'materialOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'materialOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(promoOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'promoOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'promoOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(advertisementOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'advertisementOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'advertisementOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(octopusOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'octopusOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'octopusOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(genericOutputFolder)) {\r
+                       logger.error(marker, "A folyamat 'genericOutputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'genericOutputFolder' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(houseId)) {\r
+                       logger.error(marker, "A folyamat 'houseId' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'houseId' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(targetPathType)) {\r
+                       logger.error(marker, "A folyamat 'targetPathType' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetPathType' input parameter missing.");\r
+               }\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(String localRetrievePath, String materialOutputFolder, String promoOutputFolder, String advertisementOutputFolder,\r
+                       String octopusOutputFolder, String genericOutputFolder, String onlineOutputFolder, String houseId, String targetPathType,\r
+                       ArchivedMedia archivedMedia, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+               check(localRetrievePath, materialOutputFolder, promoOutputFolder, advertisementOutputFolder, octopusOutputFolder, genericOutputFolder, houseId,\r
+                               targetPathType);\r
+               Object[] result = null;\r
+               switch (Integer.parseInt(targetPathType)) {\r
+               case 0:\r
+                       String outputFolder = getFolderById(materialOutputFolder, promoOutputFolder, advertisementOutputFolder, octopusOutputFolder, genericOutputFolder,\r
+                                       houseId, archivedMedia);\r
+                       result = localTargetInit(localRetrievePath, outputFolder, houseId, jobRuntime);\r
+                       break;\r
+               case 1:\r
+                       result = localTargetInit(localRetrievePath, onlineOutputFolder, houseId, jobRuntime);\r
+                       break;\r
+               case 2:\r
+\r
+                       if (archivedMedia.getTcIn() != null && archivedMedia.getTcOut() != null)\r
+                               result = new Object[] { genericOutputFolder, houseId, true };\r
+                       else\r
+                               result = new Object[] { null, houseId, true };\r
+                       break;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private String getFolderById(String materialOutputFolder, String promoOutputFolder, String advertisementOutputFolder, String octopusOutputFolder,\r
+                       String genericOutputFolder, String houseId, ArchivedMedia archivedMedia) throws Exception {\r
+               String id = houseId.toUpperCase();\r
+               MetadataType mdType = MetadataTypeDetector.GuessMetadataType(id);\r
+               String result = null;\r
+\r
+               //a groovy nem latja enumnak, hanem az objektum tulajdonsaganak\r
+               switch (mdType.toString()) {\r
+               case "OctopusPlaceholder":\r
+               case "OctopusStory":\r
+                       result = octopusOutputFolder;\r
+                       break;\r
+               case "TrafficMaterial":\r
+                       result = materialOutputFolder;\r
+                       break;\r
+               case "TrafficPromo":\r
+                       result = promoOutputFolder;\r
+                       break;\r
+               case "TrafficAD":\r
+                       result = advertisementOutputFolder;\r
+                       break;\r
+               case "Generic":\r
+                       result = genericOutputFolder;\r
+                       break;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private String getPossiblePath(String id, Path targetPath) throws IOException {\r
+               String[] result = new String[] { targetPath.toString() };\r
+               FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {\r
+                       @Override\r
+                       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+                               String dirName = dir.getFileName().toString();\r
+                               if (dirName.startsWith(id + "-") || dirName.equals(id)) {\r
+                                       result[0] = dir.toString();\r
+                                       return FileVisitResult.TERMINATE;\r
+                               }\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+               };\r
+               Files.walkFileTree(targetPath.getParent(), matcherVisitor);\r
+               return result[0];\r
+       }\r
+\r
+       private Object[] localTargetInit(String localRetrievePath, String outputFolder, String houseId, IJobRuntime jobRuntime) throws IOException {\r
+               String id = houseId.toUpperCase();\r
+               String targetPath = getPossiblePath(id, Paths.get(localRetrievePath, outputFolder, id)).toString();\r
+               String targetNamePattern = houseId + TARGETNAMEPATTERN;\r
+               try {\r
+                       EscortFiles.ensureUNCFolder(Paths.get(targetPath));\r
+               } catch (Exception e) {\r
+                       logger.error(jobRuntime.getSessionMarker(), "A cél mappa '{}' nem létezik és nem hozható létre. A rendszer hibaüzenete: {}", targetPath,\r
+                                       e.getMessage());\r
+                       throw e;\r
+               }\r
+               return new Object[] { targetPath, targetNamePattern, false };\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/PathItemsCollectorStep.java b/server/-product/production/LOCAL/jobs/steps/PathItemsCollectorStep.java
new file mode 100644 (file)
index 0000000..69ca5d0
--- /dev/null
@@ -0,0 +1,67 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+/* DO NOT REMOVE!\r
+import user.jobengine.server.steps.FileSearchFilterOptions;\r
+ */\r
+\r
+public class PathItemsCollectorStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceFolder, BasicDBObject filter) throws Exception {\r
+               Path sourcePath = Paths.get(sourceFolder);\r
+\r
+               List<String> files = new ArrayList<>();\r
+\r
+               //teljes rekurzivitas szuressel\r
+               FileSearchFilterOptions filterOptions = new FileSearchFilterOptions(filter);\r
+               FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {\r
+                       @Override\r
+                       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+                               if (!filterOptions.preAcceptDirectory(dir))\r
+                                       return FileVisitResult.SKIP_SUBTREE;\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+                               if (filterOptions.acceptFile(file))\r
+                                       files.add(file.toString());\r
+                               logger.info(file);\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+               };\r
+\r
+               try {\r
+                       Files.walkFileTree(sourcePath, visitor);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "Hiba a '{}' mappa feldolgozásában. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+               }\r
+               return new Object[] { files };\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/TSMBackupStep.java b/server/-product/production/LOCAL/jobs/steps/TSMBackupStep.java
new file mode 100644 (file)
index 0000000..60adc66
--- /dev/null
@@ -0,0 +1,207 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.Files;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.sql.Timestamp;\r
+import java.util.Date;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.RandomStringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.IStatusEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.commons.remotestore.StatusEvent;\r
+import user.jobengine.db.FileType;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.JobEngineException;\r
+\r
+public class TSMBackupStep extends JobStep {\r
+       private static final String MXFEXT = ".MXF";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IItemManager manager;\r
+       private File sourceMediaFile;\r
+       private Store tsmStore;\r
+       private StoreUri targetUri;\r
+       private FileType fileType;\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, int killDateDays) throws Exception {\r
+               marker = getSessionMarker();\r
+\r
+               File sourceMediaFile = new File(archiveItem.getMediaFile());\r
+               String sourceFileName = sourceMediaFile.getName();\r
+               Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+               String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), sourceMediaFile.length());\r
+               getJobRuntime().setDescription(details);\r
+               try {\r
+\r
+                       setAndCheck(archiveItem, mediaCubeMedia, getEngine());\r
+\r
+                       //TODO mxf helyett az osszes kiterjesztest!!!!!\r
+                       //A dupla ellenorzes a napon beluli ismetlesek miatt kell\r
+                       long existingMediaId = archiveItem.getExistingMediaId();\r
+                       if (sourceMediaFile.length() == 0 && existingMediaId == 0) {\r
+                               existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager, sourceFileName.replace(MXFEXT, ""));\r
+                               if (existingMediaId == 0)\r
+                                       existingMediaId = -1;\r
+                       }\r
+\r
+                       if (existingMediaId == 0)\r
+                               existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager, sourceFileName.replace(MXFEXT, ""));\r
+\r
+                       boolean randomizeName = Boolean.parseBoolean(System.getProperty("jobengine.randomize.archives", "false"));\r
+\r
+                       String targetFileName;\r
+                       if (randomizeName) {\r
+                               // a-z, A-Z, 0-9. For example: WRMcpIk7, s57JwCVA\r
+                               //veletlenszeru neveket adunk!\r
+                               targetFileName = String.format("%s-%s", RandomStringUtils.randomAlphanumeric(8), sourceFileName);\r
+                       } else\r
+                               targetFileName = sourceFileName;\r
+\r
+                       if (existingMediaId == 0) {\r
+                               StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, sourceMediaFile.getParent().toString());\r
+\r
+                               final IJobRuntime runtime = getJobRuntime();\r
+                               sourceUri.addProgressListener(new IProgressEventListener() {\r
+                                       @Override\r
+                                       public void progressChanged(ProgressEvent evt) {\r
+                                               runtime.incrementProgress(evt.getProgress());\r
+                                       }\r
+                               });\r
+                               sourceUri.addStatusListener(new IStatusEventListener() {\r
+                                       @Override\r
+                                       public void statusChanged(StatusEvent evt) {\r
+                                               evt.setCancel(!canContinue());\r
+                                       }\r
+                               });\r
+\r
+                               RemoteFile remoteFile = sourceUri.transferFrom(targetUri, sourceFileName, targetFileName);\r
+                       }\r
+\r
+                       if (existingMediaId > 0)\r
+                               logger.info(marker, "Az '{}' TSM mentése nem szükséges, mert már megtalálható az archívumban.", sourceFileName);\r
+\r
+                       //Fel kell szabadítani, hogy a kovetkezo archivalaskor is nekifusson\r
+                       if (existingMediaId == -1) {\r
+                               logger.info(marker, "Az '{}' mentése jelenleg nem lehetséges, mert a szükséges metaadat még nem található meg az archívumban.", sourceFileName);\r
+                               if (!archiveItem.removeCatchedFile())\r
+                                       logger.error(marker,\r
+                                                       "Az '{}' állomány .catched jelző állománya nem törölhető. Az újabb archiválási kísérlethez annak kézi eltávolítása szükséges!",\r
+                                                       sourceMediaFile.getName());\r
+                               mediaCubeMedia.remove();\r
+                       } else {\r
+                               saveMetadata(mediaCubeMedia, sourceMediaFile, targetFileName, existingMediaId);\r
+                               logger.info(marker, "Az '{}' archiválása sikeres.", sourceFileName);\r
+                               if (killDateDays != 0)\r
+                                       EscortFiles.createUNCKillDate(sourceMediaFile.getParent(), sourceFileName, killDateDays, marker);\r
+                       }\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       Message m = new ParameterizedMessage("Az '{}' állomány archiválása sikertelen. A rendszer hibaüzenete: {}", details, e.getMessage());\r
+                       logger.error(marker, m);\r
+                       if (!archiveItem.removeCatchedFile())\r
+                               logger.error(marker,\r
+                                               "Az '{}' állomány .catched jelző állománya nem törölhető. Az újabb archiválási kísérlethez annak kézi eltávolítása szükséges!",\r
+                                               sourceMediaFile.getName());\r
+                       throw new Exception(m.getFormattedMessage());\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private void saveMetadata(Media mediaCubeMedia, File sourceFile, String targetFileName, long existingMediaId) {\r
+\r
+               if (existingMediaId == 0) {\r
+                       MediaFile mediaFile = manager.createMediaFile(targetFileName, fileType, tsmStore, mediaCubeMedia);\r
+                       mediaFile.setHouseId(sourceFile.getName());\r
+                       mediaFile.add();\r
+               } else {\r
+                       Media existingMedia = manager.getMedia(existingMediaId);\r
+                       List<MediaFile> mediaFiles = existingMedia.getMediaFiles();\r
+                       if (mediaFiles != null) {\r
+                               for (MediaFile mf : mediaFiles) {\r
+                                       mf.setPersister(manager);\r
+                                       mf.setId(0);\r
+                                       mf.setMedia(mediaCubeMedia);\r
+                                       mf.add();\r
+                               }\r
+                       }\r
+               }\r
+               mediaCubeMedia.setPersister(manager);\r
+\r
+               try {\r
+                       BasicFileAttributes attr = Files.readAttributes(sourceFile.toPath(), BasicFileAttributes.class);\r
+                       mediaCubeMedia.setArchived(new Timestamp(attr.creationTime().toMillis()));\r
+               } catch (IOException e) {\r
+                       logger.catching(e);\r
+                       mediaCubeMedia.setArchived(new Timestamp(new Date().getTime()));\r
+               }\r
+\r
+               mediaCubeMedia.modify();\r
+       }\r
+\r
+       private void setAndCheck(ArchiveItem archiveItem, Media mediaCubeMedia, IJobEngine jobEngine) throws JobEngineException, IOException {\r
+               if (jobEngine == null) {\r
+                       logger.error(marker, "Az folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(marker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               if (archiveItem == null) {\r
+                       logger.error(marker, "A folyamat 'archiveItem' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, missing 'archiveItem' input parameter.");\r
+               }\r
+               sourceMediaFile = new File(archiveItem.getMediaFile());\r
+               if (sourceMediaFile == null) {\r
+                       logger.error(marker, "A folyamat 'archiveItem' bemeneti paraméter 'mediaFile' értéke üres.");\r
+                       throw new NullPointerException("System is not configured properly, missing 'mediaFile' value in 'archiveItem' input parameter.");\r
+               }\r
+               if (!sourceMediaFile.exists()) {\r
+                       logger.error(marker, "Az {} állomány nem létezik vagy nem érhető el.", sourceMediaFile.getName());\r
+                       throw new IOException(String.format("Input file {} not exists or unreachable.", sourceMediaFile.getName()));\r
+               }\r
+               tsmStore = manager.getSystemStore(false);\r
+               if (tsmStore == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás nem elérhető.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM Store.");\r
+               }\r
+               targetUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+               if (targetUri == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás paraméterei nem elérhetőek.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM StoreUri.");\r
+               }\r
+               fileType = manager.getFileType("High-res");\r
+               if (fileType == null) {\r
+                       logger.error(marker, "Adatbázis bejegyzés hiba, a 'High-res' FileType nem található.");\r
+                       throw new NullPointerException("System is not configured properly, missing 'High-res' FileType.");\r
+               }\r
+               if (mediaCubeMedia == null) {\r
+                       logger.error(marker, "A folyamat 'mediaCubeMedia' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'mediaCubeMedia' input parameter missing.");\r
+               }\r
+\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/TSMExtendedRetrieveStep.java b/server/-product/production/LOCAL/jobs/steps/TSMExtendedRetrieveStep.java
new file mode 100644 (file)
index 0000000..79a601c
--- /dev/null
@@ -0,0 +1,91 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class TSMExtendedRetrieveStep extends TSMRestoreStep {\r
+       private static String NEXIO_HOST = System.getProperty("nexio.host");\r
+       //      private static String NEXIO_HOST = SystemConfiguration.getInstance().value("services.nexio.host");\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       private boolean useNexioTarget;\r
+       private int nexioPort;\r
+       private String nexioUserName, nexioPassword;\r
+       private String nexioAgency;\r
+\r
+       @Override\r
+       protected void afterRestore(StoreUri targetUri, String targetPath, int killDateDays, String targetFileName) throws Exception {\r
+               if (useNexioTarget) {\r
+                       EscortFiles.setNEXIOKillDate(killDateDays, targetFileName, nexioAgency, targetUri);\r
+               } else {\r
+                       super.afterRestore(targetUri, targetPath, killDateDays, targetFileName);\r
+               }\r
+       }\r
+\r
+       @Override\r
+       protected void beforeRestore(StoreUri targetURI, String targetName) throws Exception {\r
+               String newTargetName = targetName;\r
+               if (targetName.contains("."))\r
+                       newTargetName = targetName.substring(0, targetName.lastIndexOf('.'));\r
+               if (useNexioTarget)\r
+                       if (targetURI.fileExists(newTargetName + ".mxf"))\r
+                               throw new Exception(String.format("%s-The newly created file name is existed.", getClass().getSimpleName()));\r
+       }\r
+\r
+       @Override\r
+       protected void checkTargetPath(String targetPath) {\r
+               if (!useNexioTarget)\r
+                       super.checkTargetPath(targetPath);\r
+       }\r
+\r
+       @Override\r
+       protected StoreUri createTargetUri(IItemManager manager, String targetPath) throws NullPointerException {\r
+               StoreUri result = null;\r
+               logger.info(getSessionMarker(), "Create target uri {}", targetPath);\r
+               if (useNexioTarget) {\r
+                       if (NEXIO_HOST == null) {\r
+                               throw new NullPointerException("Missing system property on 'nexio.host' name");\r
+                       }\r
+                       result = manager.createStoreUri(RemoteStoreProtocol.FTP, NEXIO_HOST);\r
+                       result.setPortNumber(nexioPort);\r
+                       result.setUserName(nexioUserName);\r
+                       result.setPassword(nexioPassword);\r
+               } else\r
+                       result = super.createTargetUri(manager, targetPath);\r
+               return result;\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchivedMedia archivedMedia, String targetPath, String targetNamePattern, String successRecipient, int killDateDays,\r
+                       String localRetrievePath, String globalRetrievePath, boolean useNexioTarget, String nexioAgency, int nexioPort, String nexioUserName,\r
+                       String nexioPassword, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               this.useNexioTarget = useNexioTarget;\r
+               this.nexioAgency = nexioAgency;\r
+               this.nexioPort = nexioPort;\r
+               this.nexioUserName = nexioUserName;\r
+               this.nexioPassword = nexioPassword;\r
+               if (nexioPort == 0) {\r
+                       throw new NullPointerException("System is not configured properly, 'nexioPort' input parameter missing.");\r
+               }\r
+               if (nexioUserName == null) {\r
+                       throw new NullPointerException("System is not configured properly, 'nexioUserName' input parameter missing.");\r
+               }\r
+               if (nexioPassword == null) {\r
+                       throw new NullPointerException("System is not configured properly, 'nexioPassword' input parameter missing.");\r
+               }\r
+               if (nexioAgency == null) {\r
+                       throw new NullPointerException("System is not configured properly, 'nexioAgency' input parameter missing.");\r
+               }\r
+\r
+               return super.execute(archivedMedia.getMedia(), targetPath, targetNamePattern, successRecipient, killDateDays, localRetrievePath, globalRetrievePath,\r
+                               jobEngine, jobRuntime);\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/TSMRestoreStep.java b/server/-product/production/LOCAL/jobs/steps/TSMRestoreStep.java
new file mode 100644 (file)
index 0000000..5b41005
--- /dev/null
@@ -0,0 +1,159 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\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
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.message.Message;\r
+\r
+import user.commons.LogUtils;\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.IStatusEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.commons.remotestore.StatusEvent;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class TSMRestoreStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IItemManager manager;\r
+       private StoreUri targetUri;\r
+       private StoreUri sourceUri;\r
+       private String sourceFileName;\r
+       private Marker marker;\r
+\r
+       protected void afterRestore(StoreUri targetUri, String targetPath, int killDateDays, String targetFileName) throws IOException, Exception {\r
+               if (killDateDays > 0)\r
+                       EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
+       }\r
+\r
+       protected void beforeRestore(StoreUri targetURI, String targetFileName) throws Exception {\r
+       }\r
+\r
+       protected void checkTargetPath(String targetPath) {\r
+               if (StringUtils.isBlank(targetPath)) {\r
+                       logger.error(marker, "A folyamat 'targetPath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetPath' input parameter missing.");\r
+               }\r
+       }\r
+\r
+       protected StoreUri createTargetUri(IItemManager manager, String targetPath) {\r
+               return manager.createStoreUri(RemoteStoreProtocol.LOCAL, targetPath);\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(Media mediaCubeMedia, String targetPath, String targetNamePattern, String successRecipient, int killDateDays,\r
+                       String localRetrievePath, String globalRetrievePath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+               setAndCheck(mediaCubeMedia, targetPath, targetNamePattern, localRetrievePath, globalRetrievePath, jobEngine);\r
+               String targetFileName = String.format(targetNamePattern, sourceFileName);\r
+               Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+               try {\r
+                       String details = String.format("%s (%s)", sourceFileName, timecode.toString());\r
+                       jobRuntime.setDescription(details);\r
+                       beforeRestore(targetUri, targetNamePattern);\r
+                       final IJobRuntime runtime = jobRuntime;\r
+                       sourceUri.addProgressListener(new IProgressEventListener() {\r
+                               @Override\r
+                               public void progressChanged(ProgressEvent evt) {\r
+                                       runtime.incrementProgress(evt.getProgress());\r
+                               }\r
+                       });\r
+                       sourceUri.addStatusListener(new IStatusEventListener() {\r
+                               @Override\r
+                               public void statusChanged(StatusEvent evt) {\r
+                                       evt.setCancel(!canContinue());\r
+                               }\r
+                       });\r
+                       RemoteFile result = sourceUri.transferFrom(targetUri, sourceFileName, targetFileName);\r
+\r
+                       String globalTargetPath = Paths.get(targetPath, targetFileName).getParent().toString().replace(Paths.get(localRetrievePath).toString(),\r
+                                       globalRetrievePath);\r
+\r
+                       logger.info(marker,\r
+                                       "Az '{}' állomány visszatöltése sikeres volt '{}' néven. A célmappa a <a href='{}' target='_blank'>ide kattintva</a> nyitható meg.",\r
+                                       sourceFileName, targetFileName, globalTargetPath);\r
+                       afterRestore(targetUri, targetPath, killDateDays, targetFileName);\r
+\r
+               } catch (Exception e) {\r
+                       Message msg = LogUtils.format("Az '{}' állomány visszatöltése sikertelen. A rendszer hibaüzenete: {}", sourceFileName, e.getMessage());\r
+                       logger.error(marker, msg);\r
+                       // logger.error(jobRuntime.marker, msg);\r
+                       logger.catching(e);\r
+                       throw e;\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private String getSourceFileName(Media mediaCubeMedia, Store store) {\r
+               List<MediaFile> mediaFiles = mediaCubeMedia.getMediaFiles();\r
+               if (mediaFiles == null)\r
+                       return null;\r
+               for (MediaFile mediaFile : mediaFiles) {\r
+                       if (mediaFile.getStore().getId() == store.getId())\r
+                               return mediaFile.getRelativePath();\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private void setAndCheck(Media mediaCubeMedia, String targetPath, String targetNamePattern, String localRetrievePath, String globalRetrievePath,\r
+                       IJobEngine jobEngine) {\r
+               if (jobEngine == null) {\r
+                       logger.error(marker, "Az folyamatkezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing JobEngine reference.");\r
+               }\r
+               manager = jobEngine.getItemManager();\r
+               if (manager == null) {\r
+                       logger.error(marker, "Az adatbáziskezelő réteg nem elérhető.");\r
+                       throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+               }\r
+               if (mediaCubeMedia == null) {\r
+                       logger.error(marker, "A folyamat 'mediaCubeMedia' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'mediaCubeMedia' input parameter missing.");\r
+               }\r
+               checkTargetPath(targetPath);\r
+               if (StringUtils.isBlank(targetNamePattern)) {\r
+                       logger.error(marker, "A folyamat 'targetNamePattern' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'targetNamePattern' input parameter missing.");\r
+               }\r
+               Store tsmStore = manager.getSystemStore(false);\r
+               if (tsmStore == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás nem elérhető.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM Store.");\r
+               }\r
+               sourceUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+               if (sourceUri == null) {\r
+                       logger.error(marker, "A TSM rendszer beállítás paraméterei nem elérhetőek.");\r
+                       throw new NullPointerException("System is not configured properly, missing TSM StoreUri.");\r
+               }\r
+               targetUri = createTargetUri(manager, targetPath);\r
+               sourceFileName = getSourceFileName(mediaCubeMedia, tsmStore);\r
+               if (sourceFileName == null) {\r
+                       logger.error(marker, "Adatbázis bejegyzés hiba, a visszatöltendő fájl neve nem található.");\r
+                       throw new NullPointerException("Database error, missing MediaFile 'relativePath'.");\r
+               }\r
+\r
+               if (StringUtils.isBlank(localRetrievePath)) {\r
+                       logger.error(marker, "A folyamat 'localRetrievePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'localRetrievePath' input parameter missing.");\r
+               }\r
+               if (StringUtils.isBlank(globalRetrievePath)) {\r
+                       logger.error(marker, "A folyamat 'globalRetrievePath' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'globalRetrievePath' input parameter missing.");\r
+               }\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/TSMSimpleRestoreStep.java b/server/-product/production/LOCAL/jobs/steps/TSMSimpleRestoreStep.java
new file mode 100644 (file)
index 0000000..ba63212
--- /dev/null
@@ -0,0 +1,57 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Files;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.IStatusEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.commons.remotestore.StatusEvent;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+\r
+public class TSMSimpleRestoreStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(long mediaId, String targetPath) throws Exception {\r
+               String fileName = null;\r
+               try {\r
+                       Media media = getManager().getMedia(mediaId);\r
+                       MediaFile mediaFile = getManager().getSystemMediaFile(media);\r
+                       fileName = mediaFile.getRelativePath();\r
+                       Timecode timecode = new Timecode(media.getLength(), Type.PAL);\r
+                       getJobRuntime().setDescription(String.format("%s (%s)", fileName, timecode.toString()));\r
+                       Store tsmStore = getManager().getSystemStore(false);\r
+                       StoreUri sourceStoreUri = getManager().getStoreUri(tsmStore.getName(), RemoteStoreProtocol.TSM);\r
+                       sourceStoreUri.addProgressListener(new IProgressEventListener() {\r
+                               @Override\r
+                               public void progressChanged(ProgressEvent evt) {\r
+                                       setProgress(evt.getProgress());\r
+                               }\r
+                       });\r
+                       sourceStoreUri.addStatusListener(new IStatusEventListener() {\r
+                               @Override\r
+                               public void statusChanged(StatusEvent evt) {\r
+                                       evt.setCancel(!canContinue());\r
+                               }\r
+                       });\r
+                       StoreUri targetStoreUri = getManager().createStoreUri(RemoteStoreProtocol.LOCAL, targetPath);\r
+                       sourceStoreUri.transferFrom(targetStoreUri, fileName, fileName + ".part");\r
+                       Files.move(Paths.get(targetPath, fileName + ".part"), Paths.get(targetPath, fileName));\r
+               } catch (Exception e) {\r
+                       logger.error("Az '{}' állomány visszatöltése sikertelen. A rendszer üzenete: {}", fileName, e.getMessage());\r
+                       throw e;\r
+               }\r
+\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/TestForkCancelableStep.java b/server/-product/production/LOCAL/jobs/steps/TestForkCancelableStep.java
new file mode 100644 (file)
index 0000000..c1b49f7
--- /dev/null
@@ -0,0 +1,35 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.IJob;\r
+import user.commons.JobStatus;\r
+import user.commons.ListUtils;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\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
+       private static final Logger logger = LogManager.getLogger();\r
+       int count = 3;\r
+\r
+       @StepEntry\r
+       public Object[] execute(IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               for (int i = 0; i < count; i++) {\r
+                       IJobRuntime rt = getEngine().submit(null, e -> {\r
+                               if (e.getStatus().equals(JobStatus.SUSPENDED)) {\r
+                                       IJobRuntime rt = (IJobRuntime) e.getSource();\r
+                                       logger.info("Cleanup on SUSPEND {}, {}", rt.getId(), rt.isDisableRetry());\r
+                               }\r
+                       }, CHILD_TEMPLATE, "JOB " + i, 0, IJobEngine.DEFAULT_OWNER, ListUtils.asMap("param", i));\r
+                       \r
+                       rt.setRelated("TEST" + rt.getId());\r
+               }\r
+\r
+               logger.info("Done");\r
+               return null;\r
+       }\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/TranscodeFFAStranStep.java b/server/-product/production/LOCAL/jobs/steps/TranscodeFFAStranStep.java
new file mode 100644 (file)
index 0000000..a73ff66
--- /dev/null
@@ -0,0 +1,151 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.File;\r
+import java.io.IOException;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.commons.io.FilenameUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
+\r
+import user.commons.FFAStransAPI;\r
+import user.commons.IFFAStransAPI;\r
+import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.FileType;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class TranscodeFFAStranStep extends JobStep {\r
+       private static final int POLL_INTERVALL = 3000;\r
+       private static final String MP4EXT = ".MP4";\r
+       private static final String MXFEXT = ".MXF";\r
+       private static final String LOWRES_FILETYPE = "Low-res";\r
+       private static final Logger logger = LogManager.getLogger("TranscodeFFAStranStep");\r
+       private IItemManager manager;\r
+       private Store store;\r
+       private FileType fileType;\r
+       private Media mediaCubeMedia;\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, String transcoderAddress, String transcoderTemplateName,\r
+                       String globalHiresSourcePath, String localLowresTargetPath, boolean deleteSource, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+\r
+               this.marker = jobRuntime.getSessionMarker();\r
+               this.manager = jobEngine.getItemManager();\r
+               this.store = check(manager.getCurrentLowresStore(), "lowres Store");\r
+               this.fileType = check(manager.getFileType(LOWRES_FILETYPE), "lowres FileType");\r
+               this.mediaCubeMedia = check(mediaCubeMedia, "mediaCubeMedia");\r
+               check(archiveItem, "archiveItem");\r
+               check(transcoderAddress, "transcoderAddress");\r
+               check(transcoderTemplateName, "transcoderTemplateName");\r
+               check(globalHiresSourcePath, "globalHiresSourcePath");\r
+               check(localLowresTargetPath, "localLowresTargetPath");\r
+\r
+               File sourceMediaFile = new File(archiveItem.getMediaFile());\r
+               logger.info("Transcoding {}", archiveItem.getMediaFile());\r
+               String sourceFileName = sourceMediaFile.getName();\r
+               Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+\r
+               String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), sourceMediaFile.length());\r
+\r
+               StoreUri storeUri = store.getTargetStoreUri(RemoteStoreProtocol.LOCAL);\r
+               if (storeUri == null)\r
+                       throw new Exception("Can not detect proxy folder.");\r
+\r
+               String webPath = storeUri.toString(true);\r
+\r
+               Path targetPath = null;\r
+               try {\r
+                       String targetFileName = FilenameUtils.removeExtension(sourceFileName) + MP4EXT;\r
+                       targetPath = Paths.get(localLowresTargetPath, targetFileName);\r
+                       if (!targetPath.toFile().exists()) {\r
+                               //                              jobRuntime.setDescription(String.format("%s: %s", jobRuntime.getDescription(), details));\r
+                               jobRuntime.setDescription(String.format("%s transzkódolása", details));\r
+                               String sourceFile = Paths.get(globalHiresSourcePath, sourceFileName).toString();\r
+                               IFFAStransAPI api = new FFAStransAPI(transcoderAddress, p -> {\r
+                                       if (p <= 100)\r
+                                               jobRuntime.incrementProgress(p);\r
+                               });\r
+\r
+                               api.submit(transcoderTemplateName, sourceFile);\r
+                               api.monitor(POLL_INTERVALL);\r
+                       }\r
+\r
+                       //a sikeres transzkod utan nem mindig van ott egybol a fajl\r
+                       long started = System.currentTimeMillis();\r
+                       while (!targetPath.toFile().exists()) {\r
+                               long current = System.currentTimeMillis();\r
+                               //max 5 perc varakozas\r
+                               if (current - started > 5 * 60 * 1000)\r
+                                       throw new Exception("Transcode job target file access timed out");\r
+                               Thread.sleep(POLL_INTERVALL);\r
+                       }\r
+\r
+                       postprocess(targetPath, webPath);\r
+\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       Message m = new ParameterizedMessage("{} átkódolás hiba: {}", sourceFileName, e.getMessage());\r
+                       logger.error(marker, m);\r
+                       throw new Exception(m.getFormattedMessage());\r
+               } finally {\r
+                       try {\r
+                               if (deleteSource && sourceMediaFile != null && sourceMediaFile.exists())\r
+                                       sourceMediaFile.delete();\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+                       try {\r
+                               if (deleteSource && targetPath != null && targetPath.toFile().exists())\r
+                                       Files.delete(targetPath);\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                       }\r
+               }\r
+               return null;\r
+       }\r
+\r
+       private void postprocess(Path transcodedFilePath, String webPath) throws IOException {\r
+               Path lowresPath = null;\r
+               try {\r
+                       String transcodedFileName = transcodedFilePath.getFileName().toString();\r
+                       String targetPath = null;\r
+                       if (transcodedFileName.indexOf(".") > 2) {\r
+                               Path subdir = Paths.get(transcodedFileName.substring(0, 1), transcodedFileName.substring(1, 2), transcodedFileName.substring(2, 3));\r
+                               EscortFiles.ensureUNCFolder(webPath, subdir.toString());\r
+                               targetPath = Paths.get(subdir.toString(), transcodedFileName).toString();\r
+                       } else {\r
+                               targetPath = transcodedFileName;\r
+                       }\r
+                       lowresPath = Paths.get(webPath, targetPath);\r
+                       int version = 1;\r
+                       while (lowresPath.toFile().exists()) {\r
+                               String fileName = transcodedFileName + version + MP4EXT;\r
+                               lowresPath = Paths.get(lowresPath.toString().replace(transcodedFileName, fileName));\r
+                               targetPath = targetPath.replace(transcodedFileName, fileName);\r
+                               transcodedFileName = fileName;\r
+                               version++;\r
+                       }\r
+\r
+                       Files.move(transcodedFilePath, lowresPath);\r
+                       manager.createMediaFile(targetPath, fileType, store, mediaCubeMedia).add();\r
+               } catch (IOException e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "A '{}' állomány mozgatása a '{}' helyre nem sikerült.", transcodedFilePath, lowresPath);\r
+                       throw e;\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/steps/UpdateGhostMediaDataStep.java b/server/-product/production/LOCAL/jobs/steps/UpdateGhostMediaDataStep.java
new file mode 100644 (file)
index 0000000..e59008d
--- /dev/null
@@ -0,0 +1,88 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;\r
+\r
+public class UpdateGhostMediaDataStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(Media mediaCubeMedia, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getSessionMarker();\r
+\r
+               IItemManager manager = jobEngine.getItemManager();\r
+               //Refresh from db\r
+               List<MediaFile> mediaFiles = manager.getMedia(mediaCubeMedia.getId()).getMediaFiles();\r
+               if (mediaFiles != null && mediaFiles.size() == 2) {\r
+                       MediaFile lowres = null;\r
+                       MediaFile highres = null;\r
+\r
+                       for (MediaFile mf : mediaFiles) {\r
+                               if (mf.getStore().getSourceStoreUri(RemoteStoreProtocol.HTTP) != null)\r
+                                       lowres = mf;\r
+                               else\r
+                                       highres = mf;\r
+                       }\r
+\r
+                       if (highres == null) {\r
+                               logger.info(marker, "Nincs highres mediaId: {}", mediaCubeMedia.getId());\r
+                               return null;\r
+                       }\r
+                       if (lowres == null) {\r
+                               logger.info(marker, "Nincs lowres mediaId: {}", mediaCubeMedia.getId());\r
+                               return null;\r
+                       }\r
+\r
+                       String id = MetadataTypeDetector.truncateExtension(highres.getRelativePath());\r
+                       id = MetadataTypeDetector.truncateVersion(id);\r
+                       boolean detect = MetadataTypeDetector.GuessMetadataType(id) == MetadataType.OctopusPlaceholder\r
+                                       || MetadataTypeDetector.GuessMetadataType(id) == MetadataType.OctopusStory;\r
+                       if (!detect) {\r
+                               logger.info(marker, "Nem bejátszó mediaId: {}, file: {}", mediaCubeMedia.getId(), highres.getRelativePath());\r
+                               return null;\r
+                       }\r
+\r
+                       Store highresStore = manager.getSystemStore(false);\r
+                       final long sourceMediaId = lowres.getId();\r
+                       final long highresMediaFileId = highres.getId();\r
+                       final String highresRealtivePath = highres.getRelativePath();\r
+\r
+                       manager.executeQuery("SELECT mediaid FROM mediafile WHERE relativepath=? and storeid=? and id!=?", rs -> {\r
+                               long mediaId = rs.getLong(1);\r
+                               Media media = manager.getMedia(mediaId);\r
+                               if (media.getMediaFilesCount() == 1) {\r
+                                       logger.info(marker, "Hiányzó szellem lowres hozzáadása {} alapján", media.getId());\r
+\r
+                                       MediaFile mf = (MediaFile) manager.get(MediaFile.class, sourceMediaId);\r
+                                       mf.setMedia(media);\r
+                                       mf.setId(0);\r
+                                       manager.add(mf);\r
+                                       media.setLength(mediaCubeMedia.getLength());\r
+                                       manager.modify(media);\r
+                               }\r
+                               return true;\r
+                       }, st -> {\r
+                               st.setString(1, highresRealtivePath);\r
+                               st.setLong(2, highresStore.getId());\r
+                               st.setLong(3, highresMediaFileId);\r
+                       });\r
+\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+}\r
diff --git a/server/-product/production/LOCAL/jobs/templates/archive-limited.xml b/server/-product/production/LOCAL/jobs/templates/archive-limited.xml
new file mode 100644 (file)
index 0000000..cf1a246
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Felhasználói archiválás" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer" />\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="archiveList" type="java.util.LinkedList" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="ArchiveListBuilderStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="archiveList" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+\r
+               <calljobstep id="step2" type="ArchiveMaterialSubmitStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveList" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/archive-material.xml b/server/-product/production/LOCAL/jobs/templates/archive-material.xml
new file mode 100644 (file)
index 0000000..973ac9f
--- /dev/null
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Anyag archiválása"  multiInstance="true"  useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer"/>\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="MetadataTransformStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archiveItem" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="MediaToolStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>          \r
+               <calljobstep id="id2" type="TSMBackupStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/archive-ondemand.xml b/server/-product/production/LOCAL/jobs/templates/archive-ondemand.xml
new file mode 100644 (file)
index 0000000..22665b3
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Felhasználói archiválás"  useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer" />\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="archiveList" type="java.util.LinkedList" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="ArchiveListBuilderStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="archiveList" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+\r
+               <calljobstep id="step2" type="ArchiveMaterialSubmitStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveList" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/archive-recursive.xml b/server/-product/production/LOCAL/jobs/templates/archive-recursive.xml
new file mode 100644 (file)
index 0000000..02b9788
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Felhasználói archiválás" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer" />\r
+                       <parameter name="limit" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="ArchiveRecursive.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="limit" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/batch-retrieve-ondemand.xml b/server/-product/production/LOCAL/jobs/templates/batch-retrieve-ondemand.xml
new file mode 100644 (file)
index 0000000..20332cf
--- /dev/null
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Archivált anyag visszatöltése" multiInstance="true"  useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="basket" type="java.util.ArrayList" />\r
+                       <parameter name="houseId" type="java.lang.String" />\r
+                       <parameter name="recipient" type="java.lang.String" />\r
+                       <parameter name="targetPathType" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="BatchRetrieveForkStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="basket" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="houseId" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="recipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetPathType" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/cancelable.xml b/server/-product/production/LOCAL/jobs/templates/cancelable.xml
new file mode 100644 (file)
index 0000000..2be289b
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="true">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="param" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep remote="true" type="CancelableStep.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="param" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/common-copy.xml b/server/-product/production/LOCAL/jobs/templates/common-copy.xml
new file mode 100644 (file)
index 0000000..7abb6fc
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Általános file másolás" multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceProtocol" type="java.lang.String"/>\r
+                       <parameter name="sourcePath" type="java.lang.String"/>\r
+                       <parameter name="sourceFileName" type="java.lang.String"/>\r
+                       <parameter name="targetProtocol" type="java.lang.String"/>\r
+                       <parameter name="targetPath" type="java.lang.String"/>\r
+                       <parameter name="targetFileName" type="java.lang.String"/>\r
+                       <parameter name="killDateDays" type="java.lang.Integer" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="FileCopyStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceProtocol" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="sourceFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetProtocol" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetFileName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/create-lowres-ondemand.xml b/server/-product/production/LOCAL/jobs/templates/create-lowres-ondemand.xml
new file mode 100644 (file)
index 0000000..f792273
--- /dev/null
@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Hiányzó PROXY videók pótlása" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+                       <parameter name="deleteSource" type="java.lang.Boolean"/>\r
+                       <parameter name="killDateDays" type="java.lang.Integer"/>\r
+                       <parameter name="successRecipient" type="java.lang.String" />\r
+                       <parameter name="localHiresPath" type="java.lang.String" />\r
+                       <parameter name="globalHiresPath" type="java.lang.String" />\r
+                       <parameter name="localLowresPath" type="java.lang.String" />\r
+                       <parameter name="transcoderAddress" type="java.lang.String" />\r
+                       <parameter name="transcoderTemplateName" type="java.lang.String" />\r
+                       <parameter name="localRetrievePath" type="java.lang.String" />\r
+                       <parameter name="globalRetrievePath" type="java.lang.String" />\r
+                       <parameter name="targetNamePattern" type="java.lang.String" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="CreateArchiveItemStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="archiveItem" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="TSMRestoreStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetNamePattern" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="successRecipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localRetrievePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="globalRetrievePath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="MediaToolStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="TranscodeFFAStranStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcoderAddress" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcoderTemplateName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="globalHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localLowresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="deleteSource" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="UpdateGhostMediaDataStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/delete-materials.xml b/server/-product/production/LOCAL/jobs/templates/delete-materials.xml
new file mode 100644 (file)
index 0000000..365fe19
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Anyagok törlése" multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourcePath" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="CleanupMountedLocationStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourcePath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/migrate-hsm.xml b/server/-product/production/LOCAL/jobs/templates/migrate-hsm.xml
new file mode 100644 (file)
index 0000000..faec872
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="HSM migráció" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceLocation" type="java.lang.String" />\r
+                       <parameter name="targetLocation" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="step1" type="HSMMigrateStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceLocation" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetLocation" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/retrieve-ondemand.xml b/server/-product/production/LOCAL/jobs/templates/retrieve-ondemand.xml
new file mode 100644 (file)
index 0000000..b58d8fd
--- /dev/null
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Archivált anyag visszatöltése" multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="localRetrievePath" type="java.lang.String" />\r
+                       <parameter name="globalRetrievePath" type="java.lang.String" />\r
+                       <parameter name="materialOutputFolder" type="java.lang.String" />\r
+                       <parameter name="promoOutputFolder" type="java.lang.String" />\r
+                       <parameter name="advertisementOutputFolder" type="java.lang.String" />\r
+                       <parameter name="octopusOutputFolder" type="java.lang.String" />\r
+                       <parameter name="genericOutputFolder" type="java.lang.String" />\r
+                       <parameter name="onlineOutputFolder" type="java.lang.String" />\r
+                       <parameter name="archivedMedia" type="user.jobengine.db.ArchivedMedia" />\r
+                       <parameter name="houseId" type="java.lang.String" />\r
+                       <parameter name="successRecipient" type="java.lang.String" />\r
+                       <parameter name="targetPathType" type="java.lang.String" />\r
+                       <parameter name="killDateDays" type="java.lang.Integer"/>\r
+                       <parameter name="nexioAgency" type="java.lang.String"/>\r
+                       <parameter name="nexioPort" type="java.lang.Integer"/>\r
+                       <parameter name="nexioUserName" type="java.lang.String"/>\r
+                       <parameter name="nexioPassword" type="java.lang.String"/>\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="targetPath" type="java.lang.String" />\r
+                       <variable name="targetNamePattern" type="java.lang.String" />\r
+                       <variable name="useNexioTarget" type="java.lang.Boolean" />\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="OutputPathAndNameSelectorStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="localRetrievePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="materialOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="promoOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="advertisementOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="octopusOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="genericOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="onlineOutputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="houseId" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetPathType" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="archivedMedia" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="targetPath" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="targetNamePattern" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="useNexioTarget" />\r
+                               </output>\r
+                       </outputs>                      \r
+               </calljobstep>\r
+               <calljobstep type="TSMExtendedRetrieveStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archivedMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="targetPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="targetNamePattern" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="successRecipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localRetrievePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="globalRetrievePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="useNexioTarget" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioAgency" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPort" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioUserName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPassword" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="MXFCutterStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="archivedMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="targetPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="successRecipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="houseId" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="killDateDays" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="useNexioTarget" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioAgency" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPort" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioUserName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="nexioPassword" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/retrieve.xml b/server/-product/production/LOCAL/jobs/templates/retrieve.xml
new file mode 100644 (file)
index 0000000..e12fd95
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Archivált anyag visszatöltése" multiInstance="true" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="mediaId" type="java.lang.Long" />\r
+                       <parameter name="targetPath" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="TSMSimpleRestoreStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="mediaId" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="targetPath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/sync-subtitles.xml b/server/-product/production/LOCAL/jobs/templates/sync-subtitles.xml
new file mode 100644 (file)
index 0000000..2fc761c
--- /dev/null
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="sourceFolder" type="java.lang.String" />\r
+                       <parameter name="filter" type="com.ibm.nosql.json.api.BasicDBObject" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep remote="true" type="PathItemsCollectorStep.java" weight="1" >\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="sourceFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="filter" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/sys-recreate-lowres.xml b/server/-product/production/LOCAL/jobs/templates/sys-recreate-lowres.xml
new file mode 100644 (file)
index 0000000..9ef84b3
--- /dev/null
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Hiányzó PROXY videók pótlása" useSessionLog="false">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="localHiresPath" type="java.lang.String" />\r
+                       <parameter name="globalHiresPath" type="java.lang.String" />\r
+                       <parameter name="localLowresPath" type="java.lang.String" />\r
+                       <parameter name="transcoderAddress" type="java.lang.String" />\r
+                       <parameter name="transcoderTemplateName" type="java.lang.String" />\r
+                       <parameter name="localRetrievePath" type="java.lang.String" />\r
+                       <parameter name="globalRetrievePath" type="java.lang.String" />\r
+               </parameters>\r
+               <variables>\r
+                       <variable name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+                       <variable name="targetNamePattern" type="java.lang.String" />\r
+                       <variable name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+                       <variable name="killDateDays" type="java.lang.Integer"/>\r
+                       <variable name="successRecipient" type="java.lang.String" />\r
+                       <variable name="deleteSource" type="java.lang.Boolean"/>\r
+               </variables>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="CreateMissingLowresStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="archiveItem" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="targetNamePattern" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="successRecipient" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="killDateDays" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="deleteSource" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="TSMRestoreStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="targetNamePattern" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="successRecipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="killDateDays" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localRetrievePath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="globalRetrievePath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="MediaToolStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="TranscodeFFAStranStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcoderAddress" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcoderTemplateName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="globalHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localLowresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="deleteSource" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="UpdateGhostMediaDataStep.java" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/jobs/templates/template1.yaml b/server/-product/production/LOCAL/jobs/templates/template1.yaml
new file mode 100644 (file)
index 0000000..4459b9f
--- /dev/null
@@ -0,0 +1,28 @@
+jobtemplate:\r
+   multiInstance: true\r
+   useSessionLog: true\r
+   declarations:\r
+      parameters:\r
+       - name: param1\r
+         type: java.lang.Integer\r
+       - name: param1\r
+         type: java.lang.Integer\r
+      variables:\r
+       - name: var1\r
+         type: java.lang.Integer\r
+       - name: var1\r
+         type: java.lang.Integer\r
+      commands:\r
+       - type: Step1.java\r
+         weight: 1\r
+         inputs:\r
+          - name: param1\r
+          - name: param2\r
+         outputs:\r
+          - name: var1\r
+          - name: var2\r
+       - type: StepS.java\r
+         weight: 1\r
+         inputs:\r
+          - name: var1\r
+          - name: var2\r
diff --git a/server/-product/production/LOCAL/jobs/templates/test-fork-cancelable.xml b/server/-product/production/LOCAL/jobs/templates/test-fork-cancelable.xml
new file mode 100644 (file)
index 0000000..8c88d84
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate multiInstance="true" useSessionLog="false">\r
+<commands>\r
+       <calljobstep type="TestForkCancelableStep.java" weight="1" />\r
+</commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/mediacube.bat b/server/-product/production/LOCAL/mediacube.bat
new file mode 100644 (file)
index 0000000..099f5ae
--- /dev/null
@@ -0,0 +1,17 @@
+@echo off\r
+if exist tmp rmdir tmp /s /q\r
+mkdir tmp\r
+java ^\r
+-Dorg.eclipse.epp.logging.aeri.skipReports=true ^\r
+-Declipse.ignoreApp=true ^\r
+-Dosgi.noShutdown=true ^\r
+-Dlog4j.configurationFile=settings/log4j2.xml ^\r
+-Djetty.home=settings ^\r
+-Djetty.etc.config.urls=jetty.xml ^\r
+-Djava.io.tmpdir=tmp ^\r
+-Dfile.encoding=UTF-8 ^\r
+-Dgosh.home=configuration ^\r
+-jar plugins/org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar ^\r
+-Xms512m ^\r
+-Xmx1024m ^\r
+-console\r
diff --git a/server/-product/production/LOCAL/settings/application.yaml b/server/-product/production/LOCAL/settings/application.yaml
new file mode 100644 (file)
index 0000000..d7c9e8e
--- /dev/null
@@ -0,0 +1,51 @@
+datasource:\r
+  mediacube:\r
+#    url: jdbc:db2://192.168.100.2:50000/mc\r
+#    user: db2inst1\r
+#    password: password\r
+    url: jdbc:db2://10.10.1.27:50000/mc\r
+    user: db2admin\r
+    password: password\r
+    external-indexer: false\r
+    simple-search: true\r
+    login-timeout: 3\r
+    pool-size: 10\r
+  mediacube-nosql:\r
+#    url: jdbc:db2://192.168.100.2:50000/mc\r
+#    user: db2inst1\r
+#    password: password\r
+    url: jdbc:db2://10.10.1.27:50000/mc\r
+    user: db2admin\r
+    password: password\r
+    schema: test\r
+    login-timeout: 3\r
+  hsm: \r
+    url: jdbc:db2://10.11.1.89:51500/tsmdb1\r
+    user: tsminst1\r
+    password: tsminst1\r
+  planair: \r
+    url: jdbc:sqlserver://10.11.254.86;databaseName=PA_Vivantis;\r
+    user: MAM\r
+    password: VDani\r
+services:\r
+  ffmpeg:\r
+    execurable-location: /opt/ffmpeg/ffmpeg \r
+  mediacube:\r
+    proxy-root: /mediacube/data/lowres\r
+  nexio:\r
+    host: 10.10.1.55\r
+    collection-name: nexioclips\r
+    use-mos-gateway: true\r
+    disabled: true\r
+jobs:\r
+  validate-transfers: false\r
+  copy-buffer-size: 32768\r
+  scheduled-execution-disabled: true\r
+tsm:\r
+  randomize-archives: false \r
+  delimiter: /\r
+  node-name: JOBENGINE\r
+  fs-name: /JOBENGINE\r
+  alternate-fs-name: /JOBENGINE\r
+  hl-name: /JOBENGINE\r
+   
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/settings/dsm.opt b/server/-product/production/LOCAL/settings/dsm.opt
new file mode 100644 (file)
index 0000000..0a0a0de
--- /dev/null
@@ -0,0 +1,3 @@
+SErvername       MEDIACUBE\r
+traceflags api\r
+tracefile /opt/mediacube/log/tsm.trace
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/settings/ffmpeg.yaml b/server/-product/production/LOCAL/settings/ffmpeg.yaml
new file mode 100644 (file)
index 0000000..94a90ca
--- /dev/null
@@ -0,0 +1,14 @@
+location: /Programs/ffmpeg/bin/ffmpeg.exe
+default: 
+  - -v panic 
+  - -stats 
+  - -y
+profiles:
+- name: profile1
+  settings:
+  - setting1
+  - setting2
+- name: profile2
+  settings:
+  - setting3
+  - setting4
diff --git a/server/-product/production/LOCAL/settings/jetty.xml b/server/-product/production/LOCAL/settings/jetty.xml
new file mode 100644 (file)
index 0000000..5e47cac
--- /dev/null
@@ -0,0 +1,45 @@
+<?xml version="1.0"?>
+<!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
+
+<Configure id="Server" class="org.eclipse.jetty.server.Server">
+       <Call name="addConnector">
+               <Arg>
+                       <New class="org.eclipse.jetty.server.ServerConnector">
+                               <Arg name="server">
+                                       <Ref refid="Server" />
+                               </Arg>
+                               <Set name="port">
+                                       <Property name="jetty.http.port" default="9080" />
+                               </Set>
+                       </New>
+               </Arg>
+       </Call>
+
+<!--   <Set name="sessionIdManager"> -->
+<!--           <New id="idMgr" -->
+<!--                   class="org.eclipse.jetty.server.session.DefaultSessionIdManager"> -->
+<!--                   <Arg> -->
+<!--                           <Ref refid="Server" /> -->
+<!--                   </Arg> -->
+<!--                   <Set name="workerName">node1</Set> -->
+<!--           </New> -->
+<!--   </Set> -->
+
+       <Set name="handler">
+               <New id="Handlers"
+                       class="org.eclipse.jetty.server.handler.HandlerCollection">
+                       <Set name="handlers">
+                               <Array type="org.eclipse.jetty.server.Handler">
+                                       <Item>
+                                               <New id="Contexts"
+                                                       class="org.eclipse.jetty.server.handler.ContextHandlerCollection" />
+                                       </Item>
+                                       <Item>
+                                               <New id="DefaultHandler"
+                                                       class="org.eclipse.jetty.server.handler.DefaultHandler" />
+                                       </Item>
+                               </Array>
+                       </Set>
+               </New>
+       </Set>
+</Configure>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/settings/log4j2.xml b/server/-product/production/LOCAL/settings/log4j2.xml
new file mode 100644 (file)
index 0000000..ad94622
--- /dev/null
@@ -0,0 +1,103 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<Configuration status="ERROR" monitorInterval="10" packages="user.commons.log4j2.appender">\r
+       <Properties>\r
+               <Property name="logPath">log</Property>\r
+               <Property name="fileName">${logPath}/mediacube.log</Property>\r
+               <Property name="movTestName">${logPath}/movtest.log</Property>\r
+               <Property name="movTestPattern">${logPath}/$${date:yyyy-MM}/movtest-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="delete-materials.log">${logPath}/delete-materials.log</Property>\r
+               <Property name="delete-materials.pattern">${logPath}/$${date:yyyy-MM}/delete-materials-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="filePattern">${logPath}/$${date:yyyy-MM}/mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="markeredFileName">${logPath}/markered-mediacube.log</Property>\r
+               <Property name="markeredFilePattern">${logPath}/$${date:yyyy-MM}/markered-mediacube-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+               <Property name="fileName.err">${logPath}/mediacube-err.log</Property>\r
+               <Property name="filePattern.err">${logPath}/$${date:yyyy-MM}/mediacube-err-%d{MM-dd-yyyy}-%i.log.gz</Property>\r
+       </Properties>\r
+       <Appenders>\r
+               <Console name="Console" target="SYSTEM_OUT">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" />\r
+                       </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 - %markerSimpleName - %msg (%F:%L)%n" />\r
+               </Console>\r
+               <HTMLMailAppender name="MarkeredMail" subject="[Media Vivantis] MediaCube rendszerüzenet" to="zombori.mark@mediavivantis.hu,varga-nagy.lajos@mediavivantis.hu,vasary@elgekko.net" from="mediacubeserver@mediavivantis.hu" smtpHost="mediavivantis-hu.mail.protection.outlook.com"\r
+                       smtpPort="25" smtpProtocol="smtp" ignoreExceptions="false" bufferSize="1">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss} %-5level - %msg %n%n A küldő a %F forráskód %L. sorából a %logger{1}.%M függvény volt. %n" />\r
+               </HTMLMailAppender>\r
+               <RollingFile name="movTestName" fileName="${movTestName}" filePattern="${movTestPattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MOVTEST" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="delete-materials" fileName="${delete-materials.log}" filePattern="${delete-materials.pattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="delete-materials.xml" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="MarkeredRollingFile" fileName="${markeredFileName}" filePattern="${markeredFilePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %-5level %logger{1}.%M - %markerSimpleName - %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="RollingFile" fileName="${fileName}" filePattern="${filePattern}">\r
+                       <Filters>\r
+                               <MarkerFilter marker="MEDIACUBE" onMatch="DENY" onMismatch="NEUTRAL" />\r
+                       </Filters>\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %level %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+               <RollingFile name="RollingFileExceptions" fileName="${fileName.err}" filePattern="${filePattern.err}">\r
+                       <PatternLayout pattern="%d{HH:mm:ss.SSS} %logger{1}.%M %msg (%F:%L)%n %throwable" />\r
+                       <Filters>\r
+                               <ThresholdFilter level="ERROR" onMatch="ACCEPT" onMismatch="DENY" />\r
+                       </Filters>\r
+                       <Policies>\r
+                               <TimeBasedTriggeringPolicy />\r
+                       </Policies>\r
+               </RollingFile>\r
+       </Appenders>\r
+       <Loggers>\r
+               <Root level="INFO">\r
+                       <AppenderRef ref="Console" />\r
+                       <AppenderRef ref="MarkeredConsole" />\r
+                       <AppenderRef ref="RollingFile" />\r
+                       <AppenderRef ref="RollingFileExceptions" />\r
+                       <AppenderRef ref="MarkeredRollingFile" />\r
+<!--                   <AppenderRef ref="MarkeredMail" />-->\r
+                       <AppenderRef ref="movTestName" />\r
+                       <AppenderRef ref="delete-materials" />\r
+               </Root>\r
+               <Logger name="org.zkoss" level="ERROR" additivity="false" />\r
+               <Logger name="org.quartz" level="ERROR" additivity="false" />\r
+               <Logger name="org.eclipse.jetty.osgi.boot" level="ERROR" additivity="false" />\r
+\r
+<!--           <logger name="org.jboss.resteasy.core" level="debug" /> -->\r
+<!--           <logger name="org.jboss.resteasy.specimpl" level="debug" /> -->\r
+<!--           <logger name="org.jboss.resteasy.plugins.server" level="debug" /> -->\r
+<!--           <logger name="org.jboss.resteasy.plugins.providers" level="debug" /> -->\r
+<!--           <logger name="user.commons.nexio" level="debug" /> -->\r
+       </Loggers>\r
+</Configuration>
\ No newline at end of file
diff --git a/server/-product/production/LOCAL/settings/maestro.yaml b/server/-product/production/LOCAL/settings/maestro.yaml
new file mode 100644 (file)
index 0000000..1d36157
--- /dev/null
@@ -0,0 +1,38 @@
+sourceStoreUri:
+  name: Default
+  protocol: LOCAL
+  uri: "/mnt/NLE"
+  fileFilter: "*.mxf"
+  showDirectories: true
+alternateSourceStoreUris:
+- name: NLE1
+  protocol: LOCAL
+  uri: "/mnt/NLE/NLE1"
+  fileFilter: "*.mxf"
+  showDirectories: true
+- name: NLE2
+  protocol: LOCAL
+  uri: "/mnt/NLE/NLE2"
+  fileFilter: "*.mxf"
+  showDirectories: true
+- name: NLE3
+  protocol: LOCAL
+  uri: "/mnt/NLE/NLE3"
+  fileFilter: "*.mxf"
+  showDirectories: true
+- name: NLE4
+  protocol: LOCAL
+  uri: "/mnt/NLE/NLE4"
+  fileFilter: "*.mxf"
+  showDirectories: true
+- name: POLC
+  protocol: LOCAL
+  uri: "/mnt/POLC"
+  fileFilter: "*.mxf"
+  showDirectories: true
+targets:
+- name: FINISHED_SHOWS
+  killDateDays: 7
+  storeUri:
+    protocol: LOCAL
+    uri: "/mnt/PROMISE/FINISHED_SHOWS"
diff --git a/server/-product/production/LOCAL/settings/mediacube.yaml b/server/-product/production/LOCAL/settings/mediacube.yaml
new file mode 100644 (file)
index 0000000..347ca89
--- /dev/null
@@ -0,0 +1,53 @@
+jobQueuePollInterval: 1000\r
+disableHelp: true\r
+maestroDisabled: false\r
+alternateRetrieveSelector: false\r
+disableStatistics: true\r
+disableEditor: false\r
+topTypeFilters:\r
+- name: Hír bejátszó\r
+- name: Hír nyers\r
+- name: Visszarögzített\r
+- name: Egyéb\r
+bottomTypeFilters:\r
+- name: Műsor\r
+- name: Műsor nyers\r
+- name: Promo\r
+- name: Promo nyers\r
+- name: Reklám\r
+- name: Reklám nyers\r
+authentication:\r
+  authEnabled: true\r
+  defaultUser: root\r
+  defaultPassword: password\r
+  adHost: intra.mediavivantis.hu\r
+  adNonSecurePort: 3268\r
+  adBaseDn: DC=intra,DC=mediavivantis,DC=hu\r
+  adAdminMap:\r
+  - G_MV_U_MUSZAK\r
+  - G_MV_U_INGEST\r
+  adSubmitterMap:\r
+  - G_ECH_U_INFORMATIKUSOK\r
+  - G_ECH_U_MUSZAKVEZETOK\r
+  - ECH-ISILON-ADMINS\r
+  adEditorMap:\r
+  - G_ECH_U_INFORMATIKUSOK\r
+  - G_ECH_U_MUSZAKVEZETOK\r
+  - ECH-ISILON-ADMINS\r
+  localAccounts:\r
+  - user: user\r
+    password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+    email:\r
+  - user: lebony\r
+    password: 4E25B117B14D86D7DCECB4E433CF932C\r
+    email:\r
+  - user: root\r
+    password: 5F4DCC3B5AA765D61D8327DEB882CF99\r
+    email: vasary@elgekko.net\r
+  localAdmins:\r
+  - root\r
+  - admin\r
+  localSubmitters:\r
+  - lebony\r
+  localEditors:\r
+  - editor\r
index fd6901cd72cfc7d29d2db2800a49788f2590d59c..265bf754a360cae19b62a363c9e32b5ec0a32010 100644 (file)
@@ -1,5 +1,5 @@
 #This configuration file was written by: org.eclipse.equinox.internal.frameworkadmin.equinox.EquinoxFwConfigFileParser\r
-#Thu Mar 04 15:26:35 CET 2021\r
+#Thu Mar 11 15:00:06 CET 2021\r
 osgi.bundles=reference\:file\:cglib_2.2.2.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-annotations_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-core_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.core.jackson-databind_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.dataformat.jackson-dataformat-yaml_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.datatype.jackson-datatype-joda_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.jaxrs.jackson-jaxrs-base_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider_2.4.5.jar@4,reference\:file\:com.fasterxml.jackson.module.jackson-module-jaxb-annotations_2.4.5.jar@4,reference\:file\:com.ibm.db2.jcc_1.4.0.jar@4,reference\:file\:com.ibm.nosql_4.19.26.jar@4,reference\:file\:com.microsoft.sqlserver.sqljdbc_6.0.8112.100.jar@4,reference\:file\:com.sun.jna_4.2.0.jar@4,reference\:file\:groovy_3.0.3.jar@4,reference\:file\:io.humble.video-arch-x86_64-pc-linux-gnu6_0.2.1.jar@4,reference\:file\:io.humble.video-arch-x86_64-w64-mingw32_0.2.1.jar@4,reference\:file\:io.humble.video-noarch_0.2.1.jar@4,reference\:file\:javax.annotation-api_1.2.0.jar@4,reference\:file\:javax.mail_1.5.0.b01.jar@4,reference\:file\:javax.servlet-api_3.1.0.jar@4,reference\:file\:javax.ws.rs-api_2.0.1.jar@4,reference\:file\:jcifs_1.3.17.jar@4,reference\:file\:joda-time_2.2.0.jar@4,reference\:file\:junit_4.12.0.jar@4,reference\:file\:org.apache.aries.spifly.dynamic.bundle_1.0.8.jar@4,reference\:file\:org.apache.aries.util_1.0.0.jar@4,reference\:file\:org.apache.commons.beanutils_1.8.3.jar@4,reference\:file\:org.apache.commons.collections_3.2.2.jar@4,reference\:file\:org.apache.commons.digester_3.2.0.jar@4,reference\:file\:org.apache.commons.io_2.6.0.jar@4,reference\:file\:org.apache.commons.lang_2.6.0.jar@4,reference\:file\:org.apache.commons.net_3.6.0.jar@4,reference\:file\:org.apache.felix.gogo.command_0.12.0.jar@4,reference\:file\:org.apache.felix.gogo.runtime_0.12.0.jar@4,reference\:file\:org.apache.felix.gogo.shell_0.12.0.jar@4,reference\:file\:org.apache.httpcomponents.httpclient_4.2.6.jar@4,reference\:file\:org.apache.httpcomponents.httpcore_4.2.5.jar@4,reference\:file\:org.apache.logging.log4j.api_2.8.2.jar@1\:start,reference\:file\:org.apache.logging.log4j.core_2.8.2.jar@4,reference\:file\:org.apache.logging.log4j.slf4j-impl_2.8.2.jar@4,reference\:file\:org.apache.servicemix.bundles.quartz_2.3.0.2.jar@4,reference\:file\:org.eclipse.equinox.common_3.8.0.v20160509-1230.jar@2\:start,reference\:file\:org.eclipse.equinox.console_1.1.200.v20150929-1405.jar@4,reference\:file\:org.eclipse.equinox.ds_1.4.400.v20160226-2036.jar@1\:start,reference\:file\:org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar@4,reference\:file\:org.eclipse.equinox.util_1.0.500.v20130404-1337.jar@4,reference\:file\:org.eclipse.jetty.client_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.deploy_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.http_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.io_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.osgi.boot_9.3.9.v20160517.jar@4\:start,reference\:file\:org.eclipse.jetty.schemas_3.1.0.jar@4,reference\:file\:org.eclipse.jetty.security_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.server_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.servlet_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.util_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.webapp_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.api_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.client_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.common_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.server_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.websocket.servlet_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.jetty.xml_9.3.9.v20160517.jar@4,reference\:file\:org.eclipse.osgi.services_3.2.100.v20100503.jar@4,reference\:file\:org.hamcrest.core_1.3.0.jar@4,reference\:file\:org.jboss.resteasy.client_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxb-provider_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxrs_3.0.11.Final.jar@4,reference\:file\:org.jboss.resteasy.jaxrs-api_3.0.11.Final.jar@4,reference\:file\:org.jmock_2.6.0.jar@4,reference\:file\:org.jmock.junit4_2.6.0.jar@4,reference\:file\:org.mybatis.mybatis_3.5.2.jar@4,reference\:file\:org.objectweb.asm_5.0.1.jar@4,reference\:file\:org.objectweb.asm.commons_5.0.1.jar@4,reference\:file\:org.objectweb.asm.tree_5.0.1.jar@4,reference\:file\:org.omnifaces_3.4.1.jar@4,reference\:file\:slf4j.api_1.7.24.jar@4,reference\:file\:slf4j.simple_1.7.2.jar@4,reference\:file\:user.commons.log4j2_1.0.0.jar@4,reference\:file\:user.commons.zk_8.0.3.jar@4,reference\:file\:user.jobengine.osgi.commons_1.0.0.jar@4\:start,reference\:file\:user.jobengine.osgi.db_1.0.0.jar@4,reference\:file\:user.jobengine.osgi.server_1.0.0.jar@4,reference\:file\:user.jobengine.osgi.services_1.0.0.jar@4,reference\:file\:user.mediacube.gui_1.0.0.jar@4,reference\:file\:user.mediacube.metadata_1.0.0.jar@4,reference\:file\:user.tsm.client_1.2.0.jar@4\r
 equinox.use.ds=true\r
 osgi.bundles.defaultStartLevel=4\r
diff --git a/server/-product/production/MEDIAVIVANTIS/jobs/dsm.opt b/server/-product/production/MEDIAVIVANTIS/jobs/dsm.opt
deleted file mode 100644 (file)
index 4955eaa..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-SErvername       MEDIACUBE\r
-*traceflags api\r
-*tracefile /opt/mediacube/log/tsm.trace
\ No newline at end of file
index 5a1ddc5f024904516a74937a277d3337c855b2ab..19bad479f092e0a4f3e1deb3688dd80eb85caaf9 100644 (file)
@@ -9,7 +9,6 @@ import com.ibm.nosql.json.api.BasicDBObject;
 import com.ibm.nosql.json.api.DB;\r
 import com.ibm.nosql.json.api.DBCollection;\r
 \r
-import user.commons.MediaCubeMarker;\r
 import user.commons.MediaCubeUndoMarker;\r
 import user.commons.nosql.NoSQLUtils;\r
 import user.jobengine.db.IItemManager;\r
@@ -19,12 +18,10 @@ import user.jobengine.server.IJobRuntime;
 \r
 public class CreateMissingLowresStep extends JobStep {\r
        private static final Logger logger = LogManager.getLogger();\r
-       private MediaCubeMarker marker;\r
 \r
        @StepEntry\r
        public Object[] execute(String localHiresPath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
                Object[] result = new Object[] { null, null, "%s", null, 0, true };\r
-               marker = (MediaCubeMarker) jobRuntime.getSessionMarker();\r
                DB db = NoSQLUtils.getNoSQLDB();\r
                DBCollection collection = db.getCollection("missing_lowres");\r
                IItemManager manager = jobEngine.getItemManager();\r
@@ -32,7 +29,7 @@ public class CreateMissingLowresStep extends JobStep {
 \r
                try {\r
                        if (media == null) {\r
-                               logger.info(new MediaCubeUndoMarker(marker.getSessionID()), "Nincs feldolgozandó hiány.");\r
+                               logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
                                // throw new Exception("Nincs feldolgozandó hiány.");\r
                                cancel();\r
                                return null;\r
@@ -44,11 +41,11 @@ public class CreateMissingLowresStep extends JobStep {
                        archiveItem.setMediaFile(Paths.get(localHiresPath, name).toString());\r
                        result[1] = archiveItem;\r
                        collection.save(new BasicDBObject("name", name));\r
-                       logger.info(marker, "Hiányzó lowres mediaId: {}", media.getId());\r
+                       logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
 \r
                } catch (Exception e) {\r
                        logger.catching(e);\r
-                       logger.info(marker, e.getMessage());\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
                        throw e;\r
                } finally {\r
                        setProgress(100);\r
@@ -58,16 +55,23 @@ public class CreateMissingLowresStep extends JobStep {
 \r
        private Media getFirstUntranscodedMedia(IItemManager manager, DBCollection collection) {\r
                Media[] result = new Media[] { null };\r
-               String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS WHERE HOUSEID like 'M%' or HOUSEID like 'P%' or HOUSEID like 'R%' ORDER BY modified DESC FETCH FIRST ROW ONLY";\r
+               //MV\r
+               String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS WHERE HOUSEID like 'M%' or HOUSEID like 'P%' or HOUSEID like 'R%' ORDER BY modified DESC";\r
+\r
+               //HTV\r
+               //String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS";\r
                manager.executeQuery(query, rs -> {\r
                        try {\r
                                long mediaId = rs.getLong(1);\r
                                Media media = manager.getMedia(mediaId);\r
                                //a nevgeneralas miatt az eredeti MediaFilesName nem jo, a pontos nev kell nekunk\r
                                String name = media.getMediaFileRealName();\r
+                               logger.info(getSessionMarker(), "Checking {}", name);\r
                                long existing = collection.find(new BasicDBObject("name", name)).count();\r
-                               if (existing > 0)\r
+                               if (existing > 0) {\r
+                                       logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
                                        return true;\r
+                               }\r
 \r
                                result[0] = media;\r
                        } catch (Exception e) {\r
index 0074883c2a81289133461bfa9601fa02b920b8f5..79a601ca36623c2a008e5fb0d0b2855e9b5b42ff 100644 (file)
@@ -1,5 +1,8 @@
 package user.jobengine.server.steps;\r
 \r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
 import user.commons.StoreUri;\r
 import user.commons.remotestore.RemoteStoreProtocol;\r
 import user.jobengine.db.ArchivedMedia;\r
@@ -8,10 +11,13 @@ import user.jobengine.server.IJobEngine;
 import user.jobengine.server.IJobRuntime;\r
 \r
 public class TSMExtendedRetrieveStep extends TSMRestoreStep {\r
+       private static String NEXIO_HOST = System.getProperty("nexio.host");\r
+       //      private static String NEXIO_HOST = SystemConfiguration.getInstance().value("services.nexio.host");\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
        private boolean useNexioTarget;\r
        private int nexioPort;\r
        private String nexioUserName, nexioPassword;\r
-       private String nexioHost;\r
        private String nexioAgency;\r
 \r
        @Override\r
@@ -42,12 +48,12 @@ public class TSMExtendedRetrieveStep extends TSMRestoreStep {
        @Override\r
        protected StoreUri createTargetUri(IItemManager manager, String targetPath) throws NullPointerException {\r
                StoreUri result = null;\r
+               logger.info(getSessionMarker(), "Create target uri {}", targetPath);\r
                if (useNexioTarget) {\r
-                       nexioHost = System.getProperty("nexio.host");\r
-                       if (nexioHost == null) {\r
+                       if (NEXIO_HOST == null) {\r
                                throw new NullPointerException("Missing system property on 'nexio.host' name");\r
                        }\r
-                       result = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost);\r
+                       result = manager.createStoreUri(RemoteStoreProtocol.FTP, NEXIO_HOST);\r
                        result.setPortNumber(nexioPort);\r
                        result.setUserName(nexioUserName);\r
                        result.setPassword(nexioPassword);\r
index b70ef743ac277dfcb6a1ba9d70ac5588ac184f8f..2420431565847c69f5639418f7fcefd9144eba72 100644 (file)
@@ -1,12 +1,13 @@
+cd /opt/mediacube-new
 rm -fr tmp/*
 rm -fr configuration/org.eclipse.osgi
-export DSMI_CONFIG=/opt/mediacube/configuration/dsm.opt
+export DSMI_CONFIG=/opt/mediacube-new/settings/dsm.opt
+export DSMI_LOG=/opt/mediacube-new/log
 export DSMI_DIR=/opt/tivoli/tsm/client/api/bin64
-export DSMI_LOG=/opt/mediacube/log
 export DSM_DIR=/opt/tivoli/tsm/client/api/bin64
-export LD_LIBRARY_PATH=/opt/tivoli/tsm/client/ba/bin:/opt/tivoli/tsm/client/api/bin64:/opt/mediacube
-export LIBPATH=/opt/tivoli/tsm/client/ba/bin:/opt/tivoli/tsm/client/api/bin64
-export SHLIB_PATH=/opt/tivoli/tsm/client/ba/bin:/opt/tivoli/tsm/client/api/bin64
+export LD_LIBRARY_PATH=/opt/tivoli/tsm/server/bin/dbbkapi:/opt/mediacube-new
+export LIBPATH=/opt/tivoli/tsm/server/bin/dbbkapi
+export SHLIB_PATH=/opt/tivoli/tsm/server/bin/dbbkapi
 export TZ=NFT-1DFT,M3.5.0,M10.5.0
 export PATH=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.102-4.b14.el7.x86_64/bin:$PATH
 java \
@@ -14,11 +15,14 @@ java \
 -Dorg.eclipse.epp.logging.aeri.skipReports=true \
 -Declipse.ignoreApp=true \
 -Dosgi.noShutdown=true \
--Dlog4j.configurationFile=configuration/log4j2.xml \
--Djetty.home=configuration/jetty \
--Djetty.etc.config.urls=jetty.xml,jetty-ssl.xml,jetty-ssl-context.xml,jetty-http.xml,jetty-https.xml \
+-Dlog4j.configurationFile=settings/log4j2.xml \
+-Djetty.home=settings \
+-Djetty.etc.config.urls=jetty.xml \
+-Dgosh.home=configuration \
 -Djava.io.tmpdir=tmp \
+-Dfile.encoding=UTF-8 \
 -jar plugins/org.eclipse.equinox.launcher_1.3.201.v20161025-1711.jar \
+-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=8889 \
 -Xms512m \
--Xmx1024m \
--console 5555
+-Xmx4096m \
+-console
index 8d4aff66572f29292bbbfc4ae72a49dbe70e3813..ffd0b6ff3fcf6f0d4cef841fd9aca2b720fae802 100644 (file)
@@ -25,7 +25,7 @@ services:
   ffmpeg:\r
     execurable-location: /opt/ffmpeg/ffmpeg \r
   mediacube:\r
-    proxy-root: /_workspace/data/video\r
+    proxy-root: /mediacube/data/lowres\r
   nexio:\r
     host: 10.10.1.55\r
     collection-name: nexioclips\r
diff --git a/server/-product/production/MEDIAVIVANTIS/settings/dsm.opt b/server/-product/production/MEDIAVIVANTIS/settings/dsm.opt
new file mode 100644 (file)
index 0000000..0a0a0de
--- /dev/null
@@ -0,0 +1,3 @@
+SErvername       MEDIACUBE\r
+traceflags api\r
+tracefile /opt/mediacube/log/tsm.trace
\ No newline at end of file
diff --git a/server/RemoteSystemsTempFiles/.project b/server/RemoteSystemsTempFiles/.project
new file mode 100644 (file)
index 0000000..7675629
--- /dev/null
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<projectDescription>\r
+       <name>RemoteSystemsTempFiles</name>\r
+       <comment></comment>\r
+       <projects>\r
+       </projects>\r
+       <buildSpec>\r
+       </buildSpec>\r
+       <natures>\r
+               <nature>org.eclipse.rse.ui.remoteSystemsTempNature</nature>\r
+       </natures>\r
+</projectDescription>\r
diff --git a/server/hu.user.mediacube.executors.tests/data/hu/user/mediacube/executors/tests/data/TestChild.java b/server/hu.user.mediacube.executors.tests/data/hu/user/mediacube/executors/tests/data/TestChild.java
new file mode 100644 (file)
index 0000000..382ff4a
--- /dev/null
@@ -0,0 +1,10 @@
+package hu.user.mediacube.executors.tests.data;\r
+\r
+public class TestChild extends TestParent {\r
+\r
+       @Override\r
+       public void hello() {\r
+               super.hello();\r
+               System.out.println("Hello from child");\r
+       }\r
+}\r
diff --git a/server/hu.user.mediacube.executors.tests/data/hu/user/mediacube/executors/tests/data/TestParent.java b/server/hu.user.mediacube.executors.tests/data/hu/user/mediacube/executors/tests/data/TestParent.java
new file mode 100644 (file)
index 0000000..d3d3ef2
--- /dev/null
@@ -0,0 +1,8 @@
+package hu.user.mediacube.executors.tests.data;\r
+\r
+public class TestParent {\r
+\r
+       public void hello() {\r
+               System.out.println("Hello from parent");\r
+       }\r
+}\r
diff --git a/server/hu.user.mediacube.executors.tests/jobs/ffmpeg.yaml b/server/hu.user.mediacube.executors.tests/jobs/ffmpeg.yaml
new file mode 100644 (file)
index 0000000..94a90ca
--- /dev/null
@@ -0,0 +1,14 @@
+location: /Programs/ffmpeg/bin/ffmpeg.exe
+default: 
+  - -v panic 
+  - -stats 
+  - -y
+profiles:
+- name: profile1
+  settings:
+  - setting1
+  - setting2
+- name: profile2
+  settings:
+  - setting3
+  - setting4
index d97cc44aaefcb2141be0589cea01583b23f40823..46e13d60351ca3b10daf65c31d528cde15351346 100644 (file)
@@ -34,9 +34,11 @@ import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.Map.Entry;\r
 import java.util.Set;\r
 import java.util.TreeMap;\r
 import java.util.TreeSet;\r
+import java.util.concurrent.TimeUnit;\r
 import java.util.regex.Pattern;\r
 \r
 import org.apache.commons.io.FileUtils;\r
@@ -45,6 +47,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.ibatis.jdbc.SQL;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
+import org.codehaus.groovy.control.CompilationFailedException;\r
 import org.junit.Test;\r
 \r
 import com.ibm.nosql.json.api.BasicDBList;\r
@@ -980,17 +983,29 @@ public class SmallTests {
 \r
        @Test\r
        public void test9995() throws Exception {\r
-               String className = "TestStep1";\r
-               String root = "/opt/steps";\r
+               String file = "/opt/test/TestChild.java";\r
+\r
+                \r
+               GroovyClassLoader cl = new GroovyClassLoader(this.getClass().getClassLoader()) {\r
+                       \r
+                       @Override\r
+                       public Class loadClass(String name, boolean lookupScriptFiles, boolean preferClassOverScript, boolean resolve)\r
+                                       throws ClassNotFoundException, CompilationFailedException {\r
+                               // TODO Auto-generated method stub\r
+                               return super.loadClass(name, lookupScriptFiles, preferClassOverScript, resolve);\r
+                       }\r
+                       \r
+               };\r
 \r
-               try (GroovyClassLoader cl = new GroovyClassLoader(this.getClass().getClassLoader())) {\r
+               try {\r
 \r
-                       Class<?> myClass = parseClassHierarchy(cl, root, className);\r
+                       Class<?> myClass = cl.parseClass(new File(file));\r
                        System.out.println(myClass.getCanonicalName());\r
                        Method method = myClass.getMethod("execute");\r
                        method.invoke(myClass.newInstance());\r
-               } catch (Exception e) {\r
-                       throw e;\r
+                       System.out.println("done");\r
+               } catch (Throwable e) {\r
+                       System.out.println(e.getClass().getSimpleName() + ": " + e.getMessage());\r
                }\r
 \r
        }\r
@@ -1262,7 +1277,79 @@ public class SmallTests {
        @Test\r
        public void test999991() throws Exception {\r
                IConfiguration configuration = SystemConfiguration.getInstance();\r
-               String executors = configuration.getConfig("jobs/executors.yaml");\r
-               configuration.load(executors);\r
+               String configFile = configuration.getConfig("jobs/executors.yaml");\r
+               HashMap<String, String> settings = configuration.load(configFile, HashMap.class);\r
+               assertNotNull(settings);\r
+       }\r
+\r
+       @Test\r
+       public void test999992() throws Exception {\r
+               IConfiguration configuration = SystemConfiguration.getInstance();\r
+               String configFile = configuration.getConfig("jobs/ffmpeg.yaml");\r
+               HashMap<String, String> settings = configuration.load(configFile, HashMap.class);\r
+               assertNotNull(settings);\r
        }\r
+\r
+       //AMC hianyzo hangsav hibakereses\r
+       //select finished,related from job where name='Archiválás' and finished is not null order by finished\r
+       //dsmadmc -id=support -password=userkft -TABdelimited -dataonly=yes "select backup_date ||','|| replace(replace(LL_NAME, '.mxf', ''),'/','') from backups where NODE_NAME='PASANODE' and state='ACTIVE_VERSION'"\r
+       @Test\r
+       public void test999993() throws Exception {\r
+               List<String> jobs = Files.readAllLines(Paths.get("/opt/AMC/2021/TSM-ERROR/archive-jobs"));\r
+               HashMap<String, Date> jobsMap = new HashMap<>();\r
+               SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss.SSS");\r
+\r
+               for (String line : jobs) {\r
+                       String[] tokens = line.split(",");\r
+                       Date dt = df.parse(tokens[0]);\r
+                       String name = tokens[1];\r
+                       name = name.split(" / ")[0];\r
+                       Date stored = jobsMap.get(name);\r
+                       if (stored == null)\r
+                               jobsMap.put(name, dt);\r
+                       else if (stored.before(dt))\r
+                               jobsMap.put(name, dt);\r
+                       //                      System.out.println(name);\r
+               }\r
+\r
+               List<String> tsm = Files.readAllLines(Paths.get("/opt/AMC/2021/TSM-ERROR/archive-tsm"));\r
+               HashMap<String, Date> tsmMap = new HashMap<>();\r
+               SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd-hh.mm.ss.SSSSSS");\r
+\r
+               for (String line : tsm) {\r
+                       String[] tokens = line.split(",");\r
+                       Date dt = df1.parse(tokens[0]);\r
+                       String name = tokens[1].replace(".part", "");\r
+                       tsmMap.put(name, dt);\r
+                       //System.out.println(name);\r
+               }\r
+\r
+               System.out.println("NAME, TSM DATE, ARCHIVE DATE");\r
+               for (Entry<String, Date> entry : jobsMap.entrySet()) {\r
+\r
+                       if (entry.getKey().contains("CCEM047245")) {\r
+                               System.out.println("x");\r
+                       }\r
+                       Date dtTsm = tsmMap.get(entry.getKey());\r
+                       if (dtTsm == null) {\r
+                               continue;\r
+                       }\r
+\r
+                       Date dtArchive = entry.getValue();\r
+                       long diffInMillies = dtArchive.getTime() - dtTsm.getTime();\r
+                       long diff = TimeUnit.DAYS.convert(diffInMillies, TimeUnit.MILLISECONDS);\r
+                       if (diff > 0)\r
+                               System.out.println(entry.getKey() + ", " + df.format(dtTsm) + ", " + df.format(dtArchive));\r
+               }\r
+\r
+               for (Entry<String, Date> entry : jobsMap.entrySet()) {\r
+\r
+                       Date dtTsm = tsmMap.get(entry.getKey());\r
+                       if (dtTsm == null) {\r
+                               System.out.println("Missing " + entry.getKey() + ", " + df.format(entry.getValue()));\r
+                       }\r
+\r
+               }\r
+       }\r
+\r
 }\r
diff --git a/server/user.jobengine.executors/amc/user/jobengine/server/steps/FileSearchFilterOptions.java b/server/user.jobengine.executors/amc/user/jobengine/server/steps/FileSearchFilterOptions.java
new file mode 100644 (file)
index 0000000..436c3be
--- /dev/null
@@ -0,0 +1,41 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.util.regex.Matcher;\r
+import java.util.regex.Pattern;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class FileSearchFilterOptions {\r
+\r
+       private BasicDBObject filter;\r
+\r
+       public FileSearchFilterOptions(BasicDBObject filter) {\r
+               this.filter = filter;\r
+       }\r
+\r
+       public boolean acceptFile(Path file) {\r
+               if (filter == null)\r
+                       return true;\r
+\r
+               if (filter.containsKey("fileName")) {\r
+                       //.*\.(sh|ini|conf|vhost|xml|php)$\r
+                       String fileNamePattern = filter.getString("fileName");\r
+                       if (fileNamePattern == null || fileNamePattern.trim().length() == 0)\r
+                               return true;\r
+\r
+                       Pattern pattern = Pattern.compile(fileNamePattern, Pattern.CASE_INSENSITIVE);\r
+\r
+                       Matcher matcher = pattern.matcher(file.getFileName().toString());\r
+                       if (matcher.find())\r
+                               return true;\r
+\r
+               }\r
+\r
+               return false;\r
+       }\r
+\r
+       public boolean preAcceptDirectory(Path file) {\r
+               return true;\r
+       }\r
+}\r
diff --git a/server/user.jobengine.executors/amc/user/jobengine/server/steps/PathItemsCollectorStep.java b/server/user.jobengine.executors/amc/user/jobengine/server/steps/PathItemsCollectorStep.java
new file mode 100644 (file)
index 0000000..6955a8a
--- /dev/null
@@ -0,0 +1,66 @@
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+/* DO NOT REMOVE!\r
+import user.jobengine.server.steps.FileSearchFilterOptions;\r
+*/\r
+public class PathItemsCollectorStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+\r
+       @StepEntry\r
+       public Object[] execute(String sourceFolder, BasicDBObject filter) throws Exception {\r
+               Path sourcePath = Paths.get(sourceFolder);\r
+\r
+               List<String> files = new ArrayList<>();\r
+\r
+               //teljes rekurzivitas szuressel\r
+               FileSearchFilterOptions filterOptions = new FileSearchFilterOptions(filter);\r
+               FileVisitor<Path> visitor = new SimpleFileVisitor<Path>() {\r
+                       @Override\r
+                       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+                               if (!filterOptions.preAcceptDirectory(dir))\r
+                                       return FileVisitResult.SKIP_SUBTREE;\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {\r
+                               if (filterOptions.acceptFile(file))\r
+                                       files.add(file.toString());\r
+                               logger.info(file);\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+                       @Override\r
+                       public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException {\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+\r
+               };\r
+\r
+               try {\r
+                       Files.walkFileTree(sourcePath, visitor);\r
+               } catch (Exception e) {\r
+                       logger.error(getSessionMarker(), "Hiba a '{}' mappa feldolgozásában. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+               }\r
+               return new Object[] { files };\r
+       }\r
+}\r
index 568b23c1f31531cb6642767bb5b1fffd131bf930..19bad479f092e0a4f3e1deb3688dd80eb85caaf9 100644 (file)
@@ -9,7 +9,6 @@ import com.ibm.nosql.json.api.BasicDBObject;
 import com.ibm.nosql.json.api.DB;\r
 import com.ibm.nosql.json.api.DBCollection;\r
 \r
-import user.commons.MediaCubeMarker;\r
 import user.commons.MediaCubeUndoMarker;\r
 import user.commons.nosql.NoSQLUtils;\r
 import user.jobengine.db.IItemManager;\r
@@ -19,12 +18,10 @@ import user.jobengine.server.IJobRuntime;
 \r
 public class CreateMissingLowresStep extends JobStep {\r
        private static final Logger logger = LogManager.getLogger();\r
-       private MediaCubeMarker marker;\r
 \r
        @StepEntry\r
        public Object[] execute(String localHiresPath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
                Object[] result = new Object[] { null, null, "%s", null, 0, true };\r
-               marker = (MediaCubeMarker) jobRuntime.getSessionMarker();\r
                DB db = NoSQLUtils.getNoSQLDB();\r
                DBCollection collection = db.getCollection("missing_lowres");\r
                IItemManager manager = jobEngine.getItemManager();\r
@@ -32,7 +29,7 @@ public class CreateMissingLowresStep extends JobStep {
 \r
                try {\r
                        if (media == null) {\r
-                               logger.info(new MediaCubeUndoMarker(marker.getSessionID()), "Nincs feldolgozandó hiány.");\r
+                               logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
                                // throw new Exception("Nincs feldolgozandó hiány.");\r
                                cancel();\r
                                return null;\r
@@ -44,11 +41,11 @@ public class CreateMissingLowresStep extends JobStep {
                        archiveItem.setMediaFile(Paths.get(localHiresPath, name).toString());\r
                        result[1] = archiveItem;\r
                        collection.save(new BasicDBObject("name", name));\r
-                       logger.info(marker, "Hiányzó lowres mediaId: {}", media.getId());\r
+                       logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
 \r
                } catch (Exception e) {\r
                        logger.catching(e);\r
-                       logger.info(marker, e.getMessage());\r
+                       logger.error(getSessionMarker(), e.getMessage());\r
                        throw e;\r
                } finally {\r
                        setProgress(100);\r
@@ -58,17 +55,23 @@ public class CreateMissingLowresStep extends JobStep {
 \r
        private Media getFirstUntranscodedMedia(IItemManager manager, DBCollection collection) {\r
                Media[] result = new Media[] { null };\r
-               //String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS WHERE HOUSEID like 'M%' or HOUSEID like 'P%' or HOUSEID like 'R%' ORDER BY modified DESC FETCH FIRST ROW ONLY";\r
-               String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS";\r
+               //MV\r
+               String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS WHERE HOUSEID like 'M%' or HOUSEID like 'P%' or HOUSEID like 'R%' ORDER BY modified DESC";\r
+\r
+               //HTV\r
+               //String query = "SELECT mediaid FROM VW_MISSING_PROXY_IDS";\r
                manager.executeQuery(query, rs -> {\r
                        try {\r
                                long mediaId = rs.getLong(1);\r
                                Media media = manager.getMedia(mediaId);\r
                                //a nevgeneralas miatt az eredeti MediaFilesName nem jo, a pontos nev kell nekunk\r
                                String name = media.getMediaFileRealName();\r
+                               logger.info(getSessionMarker(), "Checking {}", name);\r
                                long existing = collection.find(new BasicDBObject("name", name)).count();\r
-                               if (existing > 0)\r
+                               if (existing > 0) {\r
+                                       logger.info(getSessionMarker(), "{} is on missing_lowres list", name);\r
                                        return true;\r
+                               }\r
 \r
                                result[0] = media;\r
                        } catch (Exception e) {\r
index d3e8eec750ee7d377aabb140998e1d30e2f2e07f..dfe0b04f7a001592d71b0624db5262d7447610f9 100644 (file)
@@ -10,6 +10,9 @@ 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.BasicDBObject;\r
+\r
+import user.commons.configuration.SystemConfiguration;\r
 import user.commons.mediatool.MediaInfo;\r
 \r
 public class FFMpeg {\r
@@ -133,4 +136,90 @@ public class FFMpeg {
 \r
         Files.write(Paths.get(output, "index.m3u8"), indexLines);\r
     }\r
+\r
+    static public void withProfile(String input, String output, String profile, IProgressChanged progressCallback) throws Exception {\r
+       BasicDBObject config = SystemConfiguration.getInstance().load("ffmpeg.yaml", BasicDBObject.class);\r
+\r
+       StringBuilder sb = new StringBuilder();\r
+       sb.append("-v panic -stats -y")\r
+       .append("\r\n")\r
+       .append(String.format("-i %s", input))\r
+       .append("\r\n")\r
+       .append("-map 0:0 -c:v h264 -an -hls_time 100000000000 -hls_list_size 0")\r
+       .append("\r\n")\r
+       .append(String.format("-f hls %s/video.m3u8", output))\r
+       .append("\r\n");\r
+\r
+       for (int i = 0; i < 4; i++) {\r
+               sb.append(String.format("-map 0:%d -f segment -segment_time 100000000000 -segment_list_size 0", i+1))\r
+               .append("\r\n")\r
+               .append(String.format("-segment_list %s/audio%d.m3u8 -segment_format mpegts %s/audio%d%%d.aac", output, i, output, i))\r
+               .append("\r\n");\r
+       }\r
+       System.out.println(sb);\r
+        ProcessBuilder processBuilder = Cmd.create(Cmd.getFFMpegExecutable(), sb);\r
+        long allFrames[] = {0};\r
+\r
+        try {\r
+               MediaInfo mi = new MediaInfo(Paths.get(input));\r
+               mi.process();\r
+               allFrames[0] = mi.getFrames();\r
+        } catch (Exception e ){\r
+               System.err.println(e);\r
+\r
+        }\r
+\r
+        Cmd.execute(processBuilder, false, l -> {\r
+               if (allFrames[0] == 0) {\r
+                       logger.debug(l);\r
+                       System.out.println(l);\r
+                       return;\r
+               }\r
+\r
+               if (progressCallback == null)\r
+                       return;\r
+               if (l.contains(FRAME) && l.contains(FPS)) {\r
+                       String p = StringUtils.substringBetween(l, FRAME, FPS);\r
+                       if (p != null) {\r
+                               p = p.trim();\r
+                               try {\r
+                                       int currentFrames = Integer.parseInt(p);\r
+                                       progressCallback.onProgressChanged((long)currentFrames * 100 / allFrames[0]);\r
+                               } catch (Exception e){}\r
+                       }\r
+               }\r
+        });\r
+\r
+//        #EXTM3U\r
+//        #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="CH1",URI="audio0.m3u8"\r
+//        #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="CH2",URI="audio1.m3u8"\r
+//        #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="CH3",URI="audio2.m3u8"\r
+//        #EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="audio",NAME="CH4",URI="audio3.m3u8"\r
+//        #EXT-X-STREAM-INF:PROGRAM-ID=1,AUDIO="audio"\r
+//        video.m3u8\r
+\r
+        if (!Paths.get(output, "video.m3u8").toFile().exists())\r
+               throw new FileNotFoundException("video.m3u8");\r
+        if (!Paths.get(output, "video0.ts").toFile().exists())\r
+               throw new FileNotFoundException("video0.ts");\r
+        for (int i = 0; i < 4; i++) {\r
+               String file = String.format("audio%d.m3u8", i);\r
+                       if (!Paths.get(output, file).toFile().exists())\r
+                       throw new FileNotFoundException(file);\r
+               file = String.format("audio%d0.aac", i);\r
+                       if (!Paths.get(output, file).toFile().exists())\r
+                       throw new FileNotFoundException(file);\r
+        }\r
+\r
+        List<String> indexLines = new ArrayList<>();\r
+        indexLines.add("#EXTM3U");\r
+        for (int i = 0; i < 4; i++) {\r
+               indexLines.add(String.format("#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID=\"audio\",NAME=\"CH%d\",URI=\"audio%d.m3u8\"", i+1, i));\r
+        }\r
+        indexLines.add("#EXT-X-STREAM-INF:PROGRAM-ID=1,AUDIO=\"audio\"");\r
+        indexLines.add("video.m3u8");\r
+\r
+        Files.write(Paths.get(output, "index.m3u8"), indexLines);\r
+    }\r
+\r
 }\r
index 49368387347cc5432b02ac812b28617d221bc4ab..79a601ca36623c2a008e5fb0d0b2855e9b5b42ff 100644 (file)
@@ -1,7 +1,9 @@
 package user.jobengine.server.steps;\r
 \r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
 import user.commons.StoreUri;\r
-import user.commons.configuration.SystemConfiguration;\r
 import user.commons.remotestore.RemoteStoreProtocol;\r
 import user.jobengine.db.ArchivedMedia;\r
 import user.jobengine.db.IItemManager;\r
@@ -9,12 +11,13 @@ import user.jobengine.server.IJobEngine;
 import user.jobengine.server.IJobRuntime;\r
 \r
 public class TSMExtendedRetrieveStep extends TSMRestoreStep {\r
-       private static String NEXIO_HOST = SystemConfiguration.getInstance().value("services.nexio.host");\r
+       private static String NEXIO_HOST = System.getProperty("nexio.host");\r
+       //      private static String NEXIO_HOST = SystemConfiguration.getInstance().value("services.nexio.host");\r
+       private static final Logger logger = LogManager.getLogger();\r
 \r
        private boolean useNexioTarget;\r
        private int nexioPort;\r
        private String nexioUserName, nexioPassword;\r
-       private String nexioHost;\r
        private String nexioAgency;\r
 \r
        @Override\r
@@ -45,6 +48,7 @@ public class TSMExtendedRetrieveStep extends TSMRestoreStep {
        @Override\r
        protected StoreUri createTargetUri(IItemManager manager, String targetPath) throws NullPointerException {\r
                StoreUri result = null;\r
+               logger.info(getSessionMarker(), "Create target uri {}", targetPath);\r
                if (useNexioTarget) {\r
                        if (NEXIO_HOST == null) {\r
                                throw new NullPointerException("Missing system property on 'nexio.host' name");\r
index 67eff03d3e07f3a5bec206834b9cb64a70266c57..04b2e33f0d6060e0813165cc96edc6795cdae717 100644 (file)
@@ -6,8 +6,6 @@ public interface IConfiguration {
 \r
        String getConfig(String relativeConfigName) throws FileNotFoundException;\r
 \r
-       void load(String file) throws Exception;\r
-\r
        <T> T load(String file, Class<? extends T> configClass) throws Exception;\r
 \r
        <T> T value(String fqn);\r
index df2d02f2811be65b4e5bcbeb6ed05314c63f505b..cd575a5c2a1763d68b6152759862a5646b90177e 100644 (file)
@@ -29,12 +29,18 @@ public class SystemConfiguration implements IConfiguration {
        private Map<String, Object> settings;\r
 \r
        public SystemConfiguration() {\r
+               currentInstance = this;\r
+       }\r
+\r
+       @SuppressWarnings("unchecked")\r
+       private void ensureSettingsLoaded() {\r
+               if (settings != null)\r
+                       return;\r
                try {\r
-                       load(getConfig("settings/application.yaml"));\r
+                       settings = load(getConfig("settings/application.yaml"), HashMap.class);\r
                } catch (Exception e) {\r
                        logger.catching(e);\r
                }\r
-               currentInstance = this;\r
        }\r
 \r
        @Override\r
@@ -48,16 +54,6 @@ public class SystemConfiguration implements IConfiguration {
                throw new FileNotFoundException("Cant find configuration file " + relativeConfigName);\r
        }\r
 \r
-       @SuppressWarnings("unchecked")\r
-       @Override\r
-       public void load(String file) throws Exception {\r
-               logger.info("Loading system configuration {}", file);\r
-               if (file != null) {\r
-                       String yaml = new String(Files.readAllBytes(Paths.get(file)));\r
-                       settings = OBJECT_MAPPER.readValue(yaml, HashMap.class);\r
-               }\r
-       }\r
-\r
        @Override\r
        public <T> T load(String file, Class<? extends T> configClass) throws Exception {\r
                T result = null;\r
@@ -74,6 +70,9 @@ public class SystemConfiguration implements IConfiguration {
        public <T> T value(String fqn) {\r
                T result = null;\r
                String[] tokens = fqn.split("\\.");\r
+\r
+               ensureSettingsLoaded();\r
+\r
                Map<String, Object> parent = settings;\r
                for (int i = 0; i < tokens.length - 1; i++) {\r
                        parent = (Map<String, Object>) parent.get(tokens[i]);\r
index 42280e750e877f18ef742c6d18a1dedebd8c2f3a..2e175ae91d09cfeccb059ef5fd448a3a22f209d0 100644 (file)
@@ -289,25 +289,32 @@ public class NexioDataMiner implements Runnable, INexioChangeListener {
                int count = 0;\r
                try (PreparedStatement stmt = con.prepareStatement(querySQL); ResultSet rs = stmt.executeQuery();) {\r
                        while (rs.next()) {\r
-                               BasicDBObject clip = new BasicDBObject();\r
-                               clip.put(ID, rs.getString(ID));\r
-                               clip.put(LONGNAMEID, rs.getString(LONGNAMEID));\r
-                               clip.put(EXTAGENCY, rs.getString(EXTAGENCY));\r
-                               clip.put(VIDEOBITRATE, rs.getString(VIDEOBITRATE));\r
-                               clip.put(VIDEOFORMAT, rs.getString(VIDEOFORMAT));\r
-                               clip.put(DURATION, rs.getLong(DURATION));\r
 \r
-                               Timestamp record = rs.getTimestamp(RECORDTIMESTAMP);\r
-                               clip.put(RECORDDATE, record);\r
-                               //NEXIO GW modified date nem jo a regi klippeknel\r
-                               Timestamp modified = rs.getTimestamp(MODIFIEDTIMESTAMP);\r
-                               if (modified.before(record))\r
-                                       clip.put(MODIFIEDTIMESTAMP, record);\r
-                               else\r
-                                       clip.put(MODIFIEDTIMESTAMP, modified);\r
-                               clip.put(KILLDATE, rs.getTimestamp(KILLDATE));\r
-                               collection.insert(clip);\r
-                               count++;\r
+                               try {\r
+                                       BasicDBObject clip = new BasicDBObject();\r
+                                       clip.put(ID, rs.getString(ID));\r
+                                       clip.put(LONGNAMEID, rs.getString(LONGNAMEID));\r
+                                       clip.put(EXTAGENCY, rs.getString(EXTAGENCY));\r
+                                       clip.put(VIDEOBITRATE, rs.getString(VIDEOBITRATE));\r
+                                       clip.put(VIDEOFORMAT, rs.getString(VIDEOFORMAT));\r
+                                       clip.put(DURATION, rs.getLong(DURATION));\r
+\r
+                                       Timestamp record = rs.getTimestamp(RECORDTIMESTAMP);\r
+                                       clip.put(RECORDDATE, record);\r
+                                       //NEXIO GW modified date nem jo a regi klippeknel\r
+                                       Timestamp modified = rs.getTimestamp(MODIFIEDTIMESTAMP);\r
+\r
+                                       //neha elrontja, es ez is null\r
+                                       if (modified != null && modified.before(record))\r
+                                               clip.put(MODIFIEDTIMESTAMP, record);\r
+                                       else\r
+                                               clip.put(MODIFIEDTIMESTAMP, modified);\r
+                                       clip.put(KILLDATE, rs.getTimestamp(KILLDATE));\r
+                                       collection.insert(clip);\r
+                                       count++;\r
+                               } catch (Exception e1) {\r
+                                       logger.error("Inner exception", e1);\r
+                               }\r
                        }\r
                        logger.info("Transfered {} clips", count);\r
                } catch (Exception e) {\r
diff --git a/server/user.jobengine.osgi.db/migrations/environments/vm.properties b/server/user.jobengine.osgi.db/migrations/environments/vm.properties
new file mode 100644 (file)
index 0000000..769ba9e
--- /dev/null
@@ -0,0 +1,83 @@
+#
+#    Copyright 2010-2017 the original author or authors.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+
+## Base time zone to ensure times are consistent across machines
+time_zone=GMT+0:00
+
+## The character set that scripts are encoded with
+# script_char_set=UTF-8
+
+## JDBC connection properties.
+driver=com.ibm.db2.jcc.DB2Driver
+url=jdbc:db2://192.168.100.2:50000/mc:retrieveMessagesFromServerOnGetMessage=true;
+username=db2inst1
+password=password
+
+#
+# A NOTE ON STORED PROCEDURES AND DELIMITERS
+#
+# Stored procedures and functions commonly have nested delimiters
+# that conflict with the schema migration parsing.  If you tend
+# to use procs, functions, triggers or anything that could create
+# this situation, then you may want to experiment with
+# send_full_script=true (preferred), or if you can't use
+# send_full_script, then you may have to resort to a full
+# line delimiter such as "GO" or "/" or "!RUN!".
+#
+# Also play with the autocommit settings, as some drivers
+# or databases don't support creating procs, functions or
+# even tables in a transaction, and others require it.
+#
+
+# This ignores the line delimiters and
+# simply sends the entire script at once.
+# Use with JDBC drivers that can accept large
+# blocks of delimited text at once.
+send_full_script=false
+
+# This controls how statements are delimited.
+# By default statements are delimited by an
+# end of line semicolon.  Some databases may
+# (e.g. MS SQL Server) may require a full line
+# delimiter such as GO.
+# These are ignored if send_full_script is true.
+delimiter=@
+full_line_delimiter=false
+
+# If set to true, each statement is isolated
+# in its own transaction.  Otherwise the entire
+# script is executed in one transaction.
+# Few databases should need this set to true,
+# but some do.
+auto_commit=false
+
+# If set to false, warnings from the database will interrupt migrations.
+ignore_warnings=false
+
+# Custom driver path to allow you to centralize your driver files
+# Default requires the drivers to be in the drivers directory of your
+# initialized migration directory (created with "migrate init")
+# driver_path=
+
+# Name of the table that tracks changes to the database
+changelog=CHANGELOG
+
+# Migrations support variable substitutions in the form of ${variable}
+# in the migration scripts.  All of the above properties will be ignored though,
+# with the exception of changelog.
+# Example: The following would be referenced in a migration file as ${ip_address}
+# ip_address=192.168.0.1
+
diff --git a/server/user.jobengine.osgi.db/migrations/scripts/!006_first_missing_proxy.sql b/server/user.jobengine.osgi.db/migrations/scripts/!006_first_missing_proxy.sql
deleted file mode 100644 (file)
index c7d8c42..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
---
---    Copyright 2010-2016 the original author or authors.
---
---    Licensed under the Apache License, Version 2.0 (the "License");
---    you may not use this file except in compliance with the License.
---    You may obtain a copy of the License at
---
---       http://www.apache.org/licenses/LICENSE-2.0
---
---    Unless required by applicable law or agreed to in writing, software
---    distributed under the License is distributed on an "AS IS" BASIS,
---    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
---    See the License for the specific language governing permissions and
---    limitations under the License.
---
-
--- // First missing proxy
--- Migration SQL that makes the change goes here.
-
-
-
-CREATE FUNCTION FIRST_MISSING_PROXY_ID ()
-     RETURNS BIGINT
-     LANGUAGE SQL
-     READS SQL DATA
-     NO EXTERNAL ACTION
-     DETERMINISTIC
-     RETURN 
-               select m.id as mediaid from vw_mediafiles v, mediafile mf, filetype ft, media m where 
-                       m.id=mf.mediaid and
-                       mf.mediaid = v.mediaid and
-                       v.mediafilecount=1 and
-                       mf.filetypeid=ft.id and
-                       ft.name='High-res'
-               order by m.archived desc 
-               fetch first row only
-@
-
--- //@UNDO
--- SQL to undo the change goes here.
-DROP FUNCTION FIRST_MISSING_PROXY_ID
-@
index b0b4ac35949c27f3fe47ba03054d35060b6b257d..c6c2d1c85db99f5355f64773ac47d3f4f22ffba1 100644 (file)
@@ -394,24 +394,24 @@ CREATE TABLE MEDIADESCRIPTION  (
 )
 @
 
-ALTER TABLE DB2ADMIN.MEDIADESCRIPTION
+ALTER TABLE MEDIADESCRIPTION
        ADD CONSTRAINT FK_MEDIADESCRIPTION_MEDIAID
        FOREIGN KEY(MEDIAID)
-       REFERENCES DB2ADMIN.MEDIA(ID)
+       REFERENCES MEDIA(ID)
        ON DELETE CASCADE
        ON UPDATE NO ACTION 
 @
-ALTER TABLE DB2ADMIN.MEDIADESCRIPTION
+ALTER TABLE MEDIADESCRIPTION
        ADD CONSTRAINT FK_MEDIADESCRIPTION_MEDIAFILEID
        FOREIGN KEY(MEDIAFILEID)
-       REFERENCES DB2ADMIN.MEDIAFILE(ID)
+       REFERENCES MEDIAFILE(ID)
        ON DELETE CASCADE 
        ON UPDATE NO ACTION 
 @
-ALTER TABLE DB2ADMIN.MEDIADESCRIPTION
+ALTER TABLE MEDIADESCRIPTION
        ADD CONSTRAINT FK_MEDIADESCRIPTION_ITEMID
        FOREIGN KEY(ITEMID)
-       REFERENCES DB2ADMIN.ITEM(ID)
+       REFERENCES ITEM(ID)
        ON DELETE CASCADE       
        ON UPDATE NO ACTION 
 @
index fddbea586846a8b7363abbcb44be9be0c1a3086c..1a0c7e31cf99591e0be80dcaf5e129ab49dddf42 100644 (file)
@@ -23,7 +23,7 @@ ALTER TABLE JOB ADD COLUMN RELATED VARCHAR(255)
 CREATE INDEX IDX_JOB_RELATED ON JOB ("RELATED")
 @
 
-CALL SYSPROC.ADMIN_CMD('REORG TABLE DB2ADMIN.JOB')
+CALL SYSPROC.ADMIN_CMD('REORG TABLE JOB')
 @
 
 -- //@UNDO
@@ -35,5 +35,5 @@ DROP INDEX IDX_JOB_RELATED
 ALTER TABLE JOB DROP COLUMN RELATED
 @
 
-CALL SYSPROC.ADMIN_CMD('REORG TABLE DB2ADMIN.JOB')
+CALL SYSPROC.ADMIN_CMD('REORG TABLE JOB')
 @
index afeacf1ed057d5dc9668925dcd4e0b282737a736..9da22962c54fce9011f16d5bc58fbf80cb5559cf 100644 (file)
@@ -4,9 +4,11 @@
 INSERT INTO STORE (NAME, ISSYSTEM, ISLOWRES) VALUES ('VOD', 'N', 'N')
 @
 
+-- @DELIMITER ;
 INSERT INTO STOREURI(STOREID,PROTOCOL,DELIVERY,URI,ISSTREAM,ISSOURCE,ISTARGET,USERNAME,PASSWORD,ROOTPATH,PORTNUMBER) VALUES
 ((SELECT ID FROM STORE WHERE NAME='VOD'),'FTP',null,'192.168.0.101','N','Y','Y','ftpuser','FtPVs3r@1',null,null)
-@
+;
+-- @DELIMITER @
 
 -- //@UNDO
 -- SQL to undo the change goes here.
index 5b00ff9efb930c3b371077d3ba8df12bfe104530..b96046e768fd1e495fa0a7cb6e47410e3474e97f 100644 (file)
@@ -19,7 +19,7 @@
 
 ALTER TABLE STOREURI ALTER COLUMN USERNAME SET DATA TYPE VARCHAR(50)
 @
-CALL SYSPROC.ADMIN_CMD ( 'REORG TABLE DB2ADMIN.STOREURI' )
+CALL SYSPROC.ADMIN_CMD ( 'REORG TABLE STOREURI' )
 @
 
 -- //@UNDO
@@ -27,5 +27,5 @@ CALL SYSPROC.ADMIN_CMD ( 'REORG TABLE DB2ADMIN.STOREURI' )
 
 ALTER TABLE STOREURI ALTER COLUMN USERNAME SET DATA TYPE VARCHAR(20)
 @
-CALL SYSPROC.ADMIN_CMD ( 'REORG TABLE DB2ADMIN.STOREURI' )
+CALL SYSPROC.ADMIN_CMD ( 'REORG TABLE STOREURI' )
 @
index a7c660fcc6b390356b6f370f4461e880d1824651..c63033d89add7babc86cf61c263c9d43ba0b022b 100644 (file)
@@ -86,6 +86,8 @@ public interface IJobRuntime extends IJob {
 \r
        boolean isService();\r
 \r
+       boolean isTerminated();\r
+\r
        boolean isWaitFinish();\r
 \r
        boolean isWaitingCancel();\r
index 716c7f5c0ac2516ebf3adebef5a9617727cc9dc2..9b79734ca6369c46345ec688c17d2c5e3f0d5a11 100644 (file)
@@ -931,6 +931,7 @@ public class JobEngine implements IJobEngine {
                        isRunning = true;
                        TSMClient.SetUpMultithread();
                } catch (Exception e) {
+                       logger.error(e.getMessage());
                        logger.error(e);
                }
                logger.info("JobEngine started");
@@ -1026,7 +1027,7 @@ public class JobEngine implements IJobEngine {
 
        @Override
        public void suspendExecutingJob(Throwable t, IJobRuntime jobRuntime) {
-               String description = t.getMessage();
+               String description = t.getClass().getSimpleName() + " : " + t.getMessage();
                jobRuntime.setDescription(description);
                logger.error(description);
                //TODO itt miert FINISH a kovetkezo allapot, miert nem SUSPEND
index de5335c8a76ca893f2d1c1a2373d569a12cddd4d..1bcc931fa8cd9a4bbd19d60574bb45ecd7de8e51 100644 (file)
@@ -26,6 +26,7 @@ import com.ibm.nosql.json.api.BasicDBList;
 import com.ibm.nosql.json.api.BasicDBObject;\r
 \r
 import groovy.lang.GroovyClassLoader;\r
+import groovy.lang.GroovyCodeSource;\r
 import user.commons.configuration.IConfiguration;\r
 import user.commons.nosql.NoSQLUtils;\r
 import user.jobengine.server.ast.Encoder;\r
@@ -114,26 +115,32 @@ public class JobEngineConfiguration implements IJobEngineConfiguration {
                                BasicDBObject jsParam = (BasicDBObject) jobParams.get(p);\r
                                String n = jsParam.getString("name");\r
                                Object v = jsParam.get("value");\r
+\r
+                               if (v == null)\r
+                                       continue;\r
+\r
                                if (v instanceof BasicDBList) {\r
-                                       ArrayList<?> list = (BasicDBList) v;\r
-                                       sj.setJobParameter(n, list);\r
-                               } else {\r
-                                       if (v == null)\r
-                                               continue;\r
-\r
-                                       String sv = String.valueOf(v);\r
-\r
-                                       if ("null".equals(v))\r
-                                               continue;\r
-\r
-                                       Class<?> clazz = null;\r
-                                       try {\r
-                                               clazz = Class.forName(jsParam.getString("type"));\r
-                                               Object value = clazz.getConstructor(new Class[] { String.class }).newInstance(sv);\r
-                                               sj.setJobParameter(n, value);\r
-                                       } catch (Exception e) {\r
-                                               logger.error(e);\r
-                                       }\r
+                                       sj.setJobParameter(n, v);\r
+                                       continue;\r
+                               }\r
+\r
+                               if (v instanceof BasicDBObject) {\r
+                                       sj.setJobParameter(n, v);\r
+                                       continue;\r
+                               }\r
+\r
+                               String sv = String.valueOf(v);\r
+\r
+                               if ("null".equals(v))\r
+                                       continue;\r
+\r
+                               Class<?> clazz = null;\r
+                               try {\r
+                                       clazz = Class.forName(jsParam.getString("type"));\r
+                                       Object value = clazz.getConstructor(new Class[] { String.class }).newInstance(sv);\r
+                                       sj.setJobParameter(n, value);\r
+                               } catch (Exception e) {\r
+                                       logger.error(e);\r
                                }\r
 \r
                        }\r
@@ -279,25 +286,34 @@ public class JobEngineConfiguration implements IJobEngineConfiguration {
        private Class<?> parseClassHierarchy(GroovyClassLoader cl, String root, String className) throws IOException {\r
                Path path = Paths.get(root, className);\r
 \r
-               //logger.info("Loading class {} from {}", className, path.toString());\r
                Class<?> result = null;\r
                if (!path.toFile().exists())\r
                        return result;\r
                List<String> lines = Files.readAllLines(path);\r
 \r
                for (String line : lines) {\r
-                       if (line.contains("extends")) {\r
+                       String trimmedLine = line.trim();\r
+\r
+                       if (trimmedLine.startsWith("import")) {\r
+                               String[] tokens = trimmedLine.split("\\.");\r
+                               String name = tokens[tokens.length - 1];\r
+                               name = name.replace(";", "");\r
+                               logger.info("Try loading imported file {}", name);\r
+                               parseClassHierarchy(cl, root, name + ".java");\r
+                       }\r
 \r
-                               String[] tokens = line.split("extends");\r
+                       if (trimmedLine.contains("extends")) {\r
+                               String[] tokens = trimmedLine.split("extends");\r
                                String parent = tokens[tokens.length - 1];\r
                                parent = parent.replace("{", "").trim();\r
                                //logger.info("Class {} needs parent class {}", className, parent);\r
-\r
+                               logger.info("Try loading parent file {}", parent);\r
                                parseClassHierarchy(cl, root, parent + ".java");\r
                                break;\r
                        }\r
                }\r
-               result = cl.parseClass(path.toFile());\r
+               GroovyCodeSource x = new GroovyCodeSource(path.toFile());\r
+               result = cl.parseClass(x, true);\r
                return result;\r
        }\r
 }\r
index f05de1ec58b7983d0d29f83d274fda418ee6aabf..bc7312e517457186bd24feb46c722fa70c97db33 100644 (file)
@@ -593,6 +593,11 @@ public class JobRuntime extends Job implements IJobRuntime {
                return isService;
        }
 
+       @Override
+       public boolean isTerminated() {
+               return getStatus() == JobStatus.SUSPENDED || getStatus() == JobStatus.FINISHED;
+       }
+
        public boolean isTouchedByExecutor() {
                if (!getStatus().equals(JobStatus.WAIT_EXECUTOR))
                        return false;
@@ -728,7 +733,7 @@ public class JobRuntime extends Job implements IJobRuntime {
                private Semaphore forkSempahore;
                private IJobChangedListener jobChangedListener;
                private List<Long> childrenIDs;
-
+       
         * */
 
        @Override
index a202ebf271b62784fdbe17eb88210dbb6013fac2..8a1fcef07d2a005aa8a5313ceddf82e5f0865e92 100644 (file)
@@ -35,7 +35,7 @@ public class ScheduledJob extends NativeJob { //implements InterruptableJob{
 \r
        public IJobRuntime doJob() throws JobEngineException {\r
                if (jobEngine.isScheduledExecutionDisabled()) {\r
-                       logger.warn("Scheduled execution is temporarly disabled, skipping execution of '{}'", jobName);\r
+                       //logger.warn("Scheduled execution is temporarly disabled, skipping execution of '{}'", jobName);\r
                        return null;\r
                }\r
                return jobEngine.submit(templateName, jobName, getJobParameters());\r
@@ -43,7 +43,7 @@ public class ScheduledJob extends NativeJob { //implements InterruptableJob{
 \r
        public IJobRuntime doJob(IJobStatusChangedListener statusListener) throws JobEngineException {\r
                if (jobEngine.isScheduledExecutionDisabled()) {\r
-                       logger.warn("Scheduled execution is temporarly disabled, skipping execution of '{}'", jobName);\r
+                       //logger.warn("Scheduled execution is temporarly disabled, skipping execution of '{}'", jobName);\r
                        return null;\r
                }\r
                return jobEngine.submit(null, statusListener, templateName, jobName, getJobParameters());\r
index f88665fccff7db0f80ee2eb0de568f17605ea588..ff67dc8ebdc547f87b2015c1b0b47dc91d255c46 100644 (file)
@@ -4,7 +4,7 @@ Bundle-Name: Services
 Bundle-SymbolicName: user.jobengine.osgi.services;singleton:=true
 Bundle-Version: 1.0.0
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Service-Component: OSGI-INF/componentBinder.xml, OSGI-INF/HaltCommandProvider.xml
+Service-Component: OSGI-INF/*.xml
 Bundle-ActivationPolicy: lazy
 Web-ContextPath: /services
 Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
diff --git a/server/user.jobengine.osgi.services/OSGI-INF/TestJobCommandProvider.xml b/server/user.jobengine.osgi.services/OSGI-INF/TestJobCommandProvider.xml
new file mode 100644 (file)
index 0000000..6f962f3
--- /dev/null
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="activate" deactivate="deactivate" immediate="true" name="TestJobCommandProvider">\r
+   <service>\r
+      <provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>\r
+   </service>\r
+   <implementation class="user.jobengine.osgi.console.TestJobCommandProvider"/>\r
+   <reference bind="bindJobEngine" cardinality="1..1" interface="user.jobengine.server.IJobEngine" name="IJobEngine" policy="static" unbind="unbindJobEngine"/>\r
+</scr:component>
\ No newline at end of file
diff --git a/server/user.jobengine.osgi.services/src/user/jobengine/osgi/console/TestJobCommandProvider.java b/server/user.jobengine.osgi.services/src/user/jobengine/osgi/console/TestJobCommandProvider.java
new file mode 100644 (file)
index 0000000..957bf7e
--- /dev/null
@@ -0,0 +1,75 @@
+package user.jobengine.osgi.console;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.concurrent.CountDownLatch;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.eclipse.osgi.framework.console.CommandInterpreter;\r
+import org.eclipse.osgi.framework.console.CommandProvider;\r
+\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.IJobStatusChangedListener;\r
+import user.jobengine.server.JobStatusChangedEvent;\r
+\r
+public class TestJobCommandProvider implements CommandProvider {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IJobEngine jobEngine;\r
+\r
+       public Object _test(CommandInterpreter intp) {\r
+               if (jobEngine == null)\r
+                       return "nothing to do";\r
+\r
+               CountDownLatch finishLatch = new CountDownLatch(1);\r
+\r
+               final Map<String, Object> parameters = new HashMap<>();\r
+               parameters.put("param", 100);\r
+               StringBuilder result = new StringBuilder();\r
+               try {\r
+                       IJobRuntime runtime = jobEngine.submit("cancelable.xml", "Test", parameters);\r
+                       runtime.addEventListener(new IJobStatusChangedListener() {\r
+                               @Override\r
+                               public void statusChanged(JobStatusChangedEvent event) {\r
+                                       IJobRuntime rt = (IJobRuntime) event.getSource();\r
+                                       if (rt.isTerminated()) {\r
+                                               finishLatch.countDown();\r
+                                               result.append("completed");\r
+                                               return;\r
+                                       }\r
+                                       //result.append(String.format("%d %s : %d", rt.getId(), rt.getName(), rt.getProgress()));\r
+                               }\r
+                       });\r
+\r
+                       finishLatch.await();\r
+               } catch (Exception e1) {\r
+                       logger.error(e1.getMessage());\r
+               }\r
+\r
+               return result.toString();\r
+       }\r
+\r
+       synchronized public void activate() {\r
+               logger.info("{} activated", getClass().getSimpleName());\r
+       }\r
+\r
+       synchronized public void bindJobEngine(IJobEngine jobEngine) {\r
+               this.jobEngine = jobEngine;\r
+               logger.info("JobEngine binded");\r
+       }\r
+\r
+       synchronized public void deactivate() {\r
+               logger.info("{} deactivated", getClass().getSimpleName());\r
+       }\r
+\r
+       @Override\r
+       public String getHelp() {\r
+               return "test - Execute Test job\n";\r
+       }\r
+\r
+       synchronized public void unbindJobEngine(IJobEngine jobEngine) {\r
+               logger.info("JobEngine unbinded");\r
+               jobEngine = null;\r
+       }\r
+}
\ No newline at end of file
diff --git a/server/user.mediacube.gui/img/outline_theaters_black_18dp.png b/server/user.mediacube.gui/img/outline_theaters_black_18dp.png
new file mode 100644 (file)
index 0000000..607e28c
Binary files /dev/null and b/server/user.mediacube.gui/img/outline_theaters_black_18dp.png differ
index 04f2977057523d80f6fdff7127aac2060a883f16..835960ec93354baf47589939bdc4f20c1e85a76a 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<window id="wndRetrieveBatch" title="Visszatöltés (v2)" width="700px" border="normal" apply="org.zkoss.bind.BindComposer"\r
+<window id="wndRetrieveBatch" title="Visszatöltés (v2)" width="700px" border="normal"\r
        viewModel="@id('jlm') @init('user.jobengine.zk.model.AlternateRetrieveBatchSelectorModel')" onCancel="wndRetrieveBatch.detach()">\r
        <grid>\r
                <columns>\r
@@ -27,6 +27,7 @@
                                                emptyMessage="Üres" selectedItems="@save(jlm.selectedItems)">\r
                                                <listhead>\r
                                                        <listheader label="Azonosító" hflex="min" align="left" sort="auto" />\r
+                                                       <listheader label="Gyűjtő" hflex="min" align="left" sort="auto" />\r
                                                        <listheader label="Cím" hflex="min" align="left" sort="auto" />\r
                                                        <listheader label="Filenév" hflex="1" align="left" sort="auto" />\r
                                                </listhead>\r
@@ -34,6 +35,7 @@
                                                <template name="model">\r
                                                        <listitem>\r
                                                                <listcell label="@load(each.media.id)" />\r
+                                                               <listcell label="@load(each.item.title)" />\r
                                                                <listcell label="@load(each.media.title)" />\r
                                                                <listcell label="@load(each.media.mediaFileRealName)" />\r
                                                        </listitem>\r
index ed19775eb8b436471591ac59b7f30a1866bea3b8..06a16303041b802efb99d91f9a81a6bf9fbbebc6 100644 (file)
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<window id="resultWin" title="Folyamat futtatása" width="900px" border="normal" apply="org.zkoss.bind.BindComposer"\r
-       viewModel="@id('jlm') @init('user.jobengine.zk.model.JobSelectorModel')" forward="onCancel=closeButton.onClick">\r
+<window id="resultWin" title="Folyamat futtatása" width="900px" border="normal" viewModel="@id('jlm') @init('user.jobengine.zk.model.JobSelectorModel')" forward="onCancel=closeButton.onClick">\r
        <borderlayout height="450px">\r
                <center border="none" flex="true">\r
                        <listbox model="@load(jlm.jobs)" selectedItem="@bind(jlm.selectedJob)">\r
index 2ac116336f33a66dd0a82c488de9198cb7527d3a..ae3f01293d15427fdd9dd071a2198a09ef3f25a7 100644 (file)
-<?xml version="1.0" encoding="UTF-8"?>\r
-<window id="window"  title="" width="900px" height="655px" position="top_center" sizable="true" border="normal" apply="org.zkoss.bind.BindComposer"\r
-       viewModel="@id('vm') @init('user.jobengine.zk.model.MetadataDetailsModel')" forward="onCancel=closeButton.onClick">\r
-       <style>\r
-               .z-window-header{ background:#008ac8; color:white; font-size:16px; padding:10px; } .z-row:hover > .z-row-inner{ background:#7ad6ff40; }\r
-       </style>\r
-       <attribute name="onSize"><![CDATA[\r
-               Integer gridHeight=Integer.parseInt(self.getHeight().replace("px",""))-48;\r
-               String height= String.valueOf(gridHeight*1/18);\r
-            item_houseid.setHeight(height+"px");\r
-            Clients.resize(item_houseid);\r
-            item_title.setHeight(height+"px");\r
-            Clients.resize(item_title);\r
-            item_type.setHeight(height+"px");\r
-            Clients.resize(item_type);\r
-            media_houseid.setHeight(height+"px");\r
-            Clients.resize(media_houseid);\r
-            media_title.setHeight(height+"px");\r
-            Clients.resize(media_title);\r
-            media_type.setHeight(height+"px");\r
-            Clients.resize(media_type);\r
-            height= String.valueOf(gridHeight*3/18);\r
-            item_description.setHeight(height+"px");\r
-            Clients.resize(item_description);\r
-            height= String.valueOf(gridHeight*9/18);\r
-            media_description.setHeight(height+"px");\r
-            Clients.resize(media_description);\r
-            height= String.valueOf(gridHeight*9/18*0.88);\r
-            media_description_content.setHeight(height+"px");\r
-            Clients.resize(media_description_content);\r
-        ]]></attribute>\r
+<window id="metadataEditorWnd" title="Leírás szerkesztése" width="50%" height="50%" mode="overlapped" closable="true" maximizable="true" minimizable="false"\r
+       sizable="true" position="left,top" viewModel="@id('vm') @init('user.jobengine.zk.model.MetadataDetailsModel')" forward="onCancel=closeButton.onClick">\r
+\r
        <vlayout height="100%">\r
-               <div id="div" vflex="true" >\r
-                       <listbox vflex="1" style="border: none; background: #e3e3e3 !important;">\r
-                               <listhead>\r
-                                       <listheader label="" width="20%" />\r
-                                       <listheader label="" />\r
-                               </listhead>\r
-                                       <listitem id="item_houseid">\r
-                                               <listcell label="Anyag azonosítója:" />\r
-                                               <listcell label="@load(vm.archivedMedia.item.houseId)"/>\r
-                                       </listitem>\r
-                                       <listitem id="item_title">\r
-                                               <listcell label="Anyag címe:" />\r
-                                               <listcell label="@load(vm.archivedMedia.item.title)"/>\r
-                                       </listitem>\r
-                                       <listitem id="item_type">\r
-                                               <listcell label="Anyag típusa:" />\r
-                                               <listcell label="@load(vm.archivedMedia.item.itemType.name)"/>\r
-                                       </listitem>\r
-                                       <listitem id="item_description">\r
-                                               <listcell label="Anyag leírása" />\r
-                                               <listcell><textbox rows="6" inplace="true" width="99%" value="@load(vm.archivedMedia.item.description) @save(vm.archivedMedia.item.description,before='save')"></textbox></listcell>\r
-                                       </listitem>\r
-                                       <listitem id="media_houseid">\r
-                                               <listcell label="Média azonosítója:" />\r
-                                               <listcell><textbox inplace="true" value="@load(vm.archivedMedia.media.houseId) @save(vm.archivedMedia.media.houseId,before='save')"></textbox></listcell>\r
-                                       </listitem>\r
-                                       <listitem id="media_title">\r
-                                               <listcell label="Média címe:" />\r
-                                               <listcell><textbox inplace="true" width="99%" value="@load(vm.archivedMedia.media.title) @save(vm.archivedMedia.media.title,before='save')"></textbox></listcell>\r
-                                       </listitem>\r
-                                       <listitem id="media_type">\r
-                                               <listcell label="Média típusa:" />\r
-                                               <listcell><combobox id="mediatypes" width="300px"\r
-                                                       selectedItem="@load(vm.archivedMedia.media.itemType)@save(vm.archivedMedia.media.itemType,before='save')" model="@load(vm.itemTypes)">\r
-                                                       <template name="model">\r
-                                                               <comboitem label="${each.name}" value="${each}"></comboitem>\r
-                                                       </template>\r
-                                               </combobox></listcell>\r
-                                       </listitem>\r
-                                       <listitem id="media_description">\r
-                                               <listcell label="Média leírása:" />\r
-                                               <listcell><textbox rows="21" inplace="true" width="99%" id="media_description_content"\r
-                                                       value="@load(vm.archivedMedia.media.description) @save(vm.archivedMedia.media.description,before='save')">\r
-                                               </textbox></listcell>\r
-                                       </listitem>\r
-                       </listbox>\r
-               </div>\r
-               <div vflex="min">\r
-               <hbox width="100%" vflex="min" pack="center" align="center">\r
-                       <button id="saveButton" label="Mentés" onClick="@command('save')"/>\r
+               <tabbox id="pagesTab" vflex="true" hflex="true" orient="top">\r
+                       <tabs visible="true">\r
+                               <tab id="tab0" label="Adatok" selected="true" />\r
+                               <tab id="tab1" label="Média leírása" />\r
+                       </tabs>\r
+                       <tabpanels>\r
+                               <tabpanel>\r
+                                       <listbox vflex="true" style="border: none; background: white !important;">\r
+                                               <listhead>\r
+                                                       <listheader hflex="min" />\r
+                                                       <listheader width="90%" />\r
+                                               </listhead>\r
+                                               <listitem id="item_houseid">\r
+                                                       <listcell label="Gyűjtő azonosítója" />\r
+                                                       <listcell label="@load(vm.archivedMedia.item.houseId)" />\r
+                                               </listitem>\r
+                                               <listitem id="item_title">\r
+                                                       <listcell label="Gyűjtő címe" />\r
+                                                       <listcell label="@load(vm.archivedMedia.item.title)" />\r
+                                               </listitem>\r
+                                               <listitem id="item_type">\r
+                                                       <listcell label="Gyűjtő típusa" />\r
+                                                       <listcell label="@load(vm.archivedMedia.item.itemType.name)" />\r
+                                               </listitem>\r
+                                               <listitem id="item_description">\r
+                                                       <listcell label="Gyűjtő leírása" style="vertical-align: top;" />\r
+                                                       <listcell label="@load(vm.archivedMedia.item.description)" />\r
+                                               </listitem>\r
+                                               <listitem id="media_houseid">\r
+                                                       <listcell label="Média azonosítója" />\r
+                                                       <listcell>\r
+                                                               <textbox hflex="true" value="@load(vm.archivedMedia.media.houseId) @save(vm.archivedMedia.media.houseId,before='save')"></textbox>\r
+                                                       </listcell>\r
+                                               </listitem>\r
+                                               <listitem id="media_title">\r
+                                                       <listcell label="Média címe" />\r
+                                                       <listcell>\r
+                                                               <textbox hflex="true" value="@load(vm.archivedMedia.media.title) @save(vm.archivedMedia.media.title,before='save')" />\r
+                                                       </listcell>\r
+                                               </listitem>\r
+                                               <listitem id="media_type">\r
+                                                       <listcell label="Média típusa" />\r
+                                                       <listcell>\r
+                                                               <combobox id="mediatypes" hflex="true" model="@load(vm.itemTypes)"\r
+                                                                       selectedItem="@load(vm.archivedMedia.media.itemType)@save(vm.archivedMedia.media.itemType,before='save')">\r
+                                                                       <template name="model">\r
+                                                                               <comboitem label="${each.name}" value="${each}"></comboitem>\r
+                                                                       </template>\r
+                                                               </combobox>\r
+                                                       </listcell>\r
+                                               </listitem>\r
+                                       </listbox>\r
+                               </tabpanel>\r
+                               <tabpanel>\r
+                                       <textbox id="media_description_hidden" multiline="true" hflex="true" vflex="true"\r
+                                               value="@load(vm.archivedMedia.media.description) @save(vm.archivedMedia.media.description,before='save')" />\r
+                               </tabpanel>\r
+                       </tabpanels>\r
+               </tabbox>\r
+\r
+\r
+               <div hflex="true" vflex="min" align="center">\r
+                       <button id="saveButton" label="Mentés" onClick="@command('save')" />\r
                        <button id="closeButton" label="Mégse" onClick="@command('close')" />\r
-               </hbox>\r
                </div>\r
        </vlayout>\r
+       <!-- \r
+               <h:script defer="true">\r
+               var text = document.getElementById("media_description");        \r
+               \r
+               function setDescription(val) {\r
+               text.value = val;\r
+               }\r
+               \r
+               // https://stackoverflow.com/questions/454202/creating-a-textarea-with-auto-resize\r
+               var observe;\r
+               if (window.attachEvent) {\r
+               observe = function (element, event, handler) {\r
+               element.attachEvent('on'+event, handler);\r
+               };\r
+               }\r
+               else {\r
+               observe = function (element, event, handler) {\r
+               element.addEventListener(event, handler, false);\r
+               };\r
+               }               \r
+               \r
+               \r
+               function resize() {\r
+               text.style.height = 'auto';\r
+               text.style.height = text.scrollHeight + 10 + 'px';\r
+               }\r
+               \r
+               function delayedResize() {\r
+               window.setTimeout(resize(), 0);\r
+               }\r
+               \r
+               \r
+               observe(text, 'change',  delayedResize);\r
+               observe(text, 'cut',     delayedResize);\r
+               observe(text, 'paste',   delayedResize);\r
+               observe(text, 'drop',    delayedResize);\r
+               observe(text, 'keydown', delayedResize);\r
+               \r
+               \r
+               \r
+               text.focus();\r
+               text.select();\r
+               resize();\r
+               \r
+               </h:script>\r
+       -->\r
 </window>\r
-\r
index 50ea0671587a63aac1f288c4f072945f6e720533..4c0e7d8dd26c24a3c2201afd2e083ed95c4ea6b8 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<window id="wndRetrieveBatch" title="Visszatöltés" width="700px" border="normal" apply="org.zkoss.bind.BindComposer"\r
+<window id="wndRetrieveBatch" title="Visszatöltés" width="700px" border="normal" \r
        viewModel="@id('jlm') @init('user.jobengine.zk.model.RetrieveBatchSelectorModel')" onCancel="wndRetrieveBatch.detach()">\r
        <grid>\r
                <columns>\r
@@ -28,6 +28,7 @@
                                                emptyMessage="Üres" selectedItems="@save(jlm.selectedItems)">\r
                                                <listhead>\r
                                                        <listheader label="Azonosító" hflex="min" align="left" sort="auto" />\r
+                                                       <listheader label="Gyűjtő" hflex="min" align="left" sort="auto" />\r
                                                        <listheader label="Cím" hflex="min" align="left" sort="auto" />\r
                                                        <listheader label="Filenév" hflex="1" align="left" sort="auto" />\r
                                                </listhead>\r
@@ -35,6 +36,7 @@
                                                <template name="model">\r
                                                        <listitem>\r
                                                                <listcell label="@load(each.media.id)" />\r
+                                                               <listcell label="@load(each.item.title)" />\r
                                                                <listcell label="@load(each.media.title)" />\r
                                                                <listcell label="@load(each.media.mediaFileRealName)" />\r
                                                        </listitem>\r
index 5434ecbb08ad30311880d91fd072067f2db9e799..1a26fd42270f4c7a90d29af5a97d51c94e0fa42c 100644 (file)
@@ -5,7 +5,7 @@
 <?component name="search-results" inline="true" macroURI="searchitems/results.zul"?>\r
 <?component name="item-details" inline="true" macroURI="searchitems/details.zul"?>\r
 \r
-<zk xmlns:w="http://www.zkoss.org/2005/zk/client" xmlns:h="xhtml" xmlns:n="native" xmlns:c="client">\r
+<zk xmlns:h="xhtml" xmlns:n="native" xmlns:c="client">\r
        <style src="/css/video-js.css" />\r
        <style src="/css/searchitems.css" /> \r
        <style src="/css/tagify.css" /> \r
@@ -40,7 +40,7 @@
                <div id="tagListener" onChange="@command('onTagChanged')" />\r
 \r
                <borderlayout width="100%" height="100%">\r
-                       <west id="searchWest" border="none" flex="true" size="60%" splittable="true" minsize="500" onSize="@command('onWestResize', west=self)">\r
+                       <west id="searchWest" border="none" flex="true" size="60%" splittable="true" minsize="500" onSize="@command('onWestResize')">\r
                                <div height="100%" width="100%">\r
                                \r
                                        <search-filters />\r
index c77befaac02720ee0052831ddc3aafd7b36c1941..1740b1fef10b1c7e64362fafda0f88944e5fd21a 100644 (file)
@@ -1,24 +1,16 @@
 <zk xmlns:w="http://www.zkoss.org/2005/zk/client" xmlns:h="xhtml" xmlns:c="client" height="100%" width="100%">\r
-       <div height="100%">\r
-               <toolbar width="100%" style="min-height:40px; font-size:8px">\r
-                       <div style="max-width:450px; margin:auto;">\r
-                               <div sclass="menuButtons">\r
-                                       <toolbarbutton image="/img/ic_compare_arrows_black_18dp.png" autodisable="self" onClick="@command('showInResults')"\r
-                                               disabled="@load(vm.selectedObject eq null)" label="Szinkronizálás" />\r
-                                       <toolbarbutton sclass="col-xs-12" image="/img/ic_shopping_cart_black_18dp.png" autodisable="self" onClick="@command('downloadMedia')"\r
-                                               disabled="@load(not vm.hasTSMMediaFile)" label="Kosárba" />\r
-                                       <toolbarbutton image="/img/baseline_share_black_18dp.png" autodisable="self" onClick="@command('copyMediaIdToClipboard')"\r
-                                               disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Megosztás" />\r
-                                       <toolbarbutton image="/img/baseline_edit_black_18dp.png" autodisable="self" onClick="@command('openMetaDataDialog')"\r
-                                               disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Szerkesztés" />\r
-                                       <separator />\r
-                                       <toolbarbutton iconSclass="z-icon-film" autodisable="self" onClick="@command('createLowres')"\r
-                                               disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Proxy pótlása" />\r
-                                       \r
-                                       <toolbarbutton autodisable="self" c:onClick="pushTcIn('${arg.field}')" label="IN" visible="${not sessionScope.guiEditorDisable}" />\r
-                                       <toolbarbutton autodisable="self" c:onClick="pushTcOut('${arg.field}')" label="OUT" visible="${not sessionScope.guiEditorDisable}" />\r
-                               </div>\r
-                       </div>\r
+       <div height="100%" width="100%">\r
+               <toolbar width="100%" style="min-height:40px; font-size:8px;border-bottom:1px solid darkgray">\r
+                       <toolbarbutton image="/img/ic_compare_arrows_black_18dp.png" autodisable="self" onClick="@command('showInResults')"\r
+                               disabled="@load(vm.selectedObject eq null)" label="Szinkronizálás" />\r
+                       <toolbarbutton sclass="col-xs-12" image="/img/ic_shopping_cart_black_18dp.png" autodisable="self" onClick="@command('downloadMedia')"\r
+                               disabled="@load(not vm.hasTSMMediaFile)" label="Kosárba" />\r
+                       <toolbarbutton image="/img/baseline_share_black_18dp.png" autodisable="self" onClick="@command('copyMediaIdToClipboard')"\r
+                               disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Megosztás" />\r
+                       <toolbarbutton image="/img/outline_theaters_black_18dp.png" autodisable="self" onClick="@command('createLowres')"\r
+                               disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Proxy pótlása" />\r
+                       <toolbarbutton image="/img/baseline_edit_black_18dp.png" autodisable="self" onClick="@command('openMetaDataDialog')"\r
+                               disabled="@load(not sessionScope.userPrincipal.editor or sessionScope.userPrincipal.anonymous or vm.selectedObject eq null)" label="Szerkesztés" />\r
                </toolbar>\r
 \r
                <div id="mediaDetails" width="100%" vflex="true" style="padding: 4px; overflow:auto; background-color: white">\r
index a4956fe27082ce4ba5f85fec6a9c14b641586786..2ecd4660d36574ac62f7061e3068cf1787737168 100644 (file)
        <toolbar id="tagsToolbar" width="100%" style="background: transparent">\r
                <h:textarea name='filterTags' placeholder='Címkék'></h:textarea>\r
        </toolbar>\r
-       <toolbar id="tb" width="100%" style="background: transparent">\r
-               <toolbarbutton id="toggleShowTypeFilters" iconSclass="z-icon-caret-down" mode="toggle">\r
+       <toolbar id="filterToolbar" width="100%" style="background: transparent">\r
+               <toolbarbutton id="toggleShowTypeFilters" iconSclass="z-icon-caret-down" mode="toggle" onCheck="@command('toggleTypeFiltersCheck')">\r
+<!-- \r
                        <attribute name="onCheck">\r
-                               serachDetails.open = !serachDetails.open;\r
-                               self.iconSclass = serachDetails.open ? "z-icon-caret-up" : "z-icon-caret-down"; \r
+                               serachDetails.open = toggleShowTypeFilters.checked;\r
+                               self.iconSclass = toggleShowTypeFilters.checked ? "z-icon-caret-up" : "z-icon-caret-down"; \r
                        </attribute>\r
+ -->\r
            </toolbarbutton>\r
         <toolbarbutton iconSclass="z-icon-th" popup="searchSettings, after_start" />\r
                <separator orient="vertical" />\r
index baf3318f815485e5e99cb024149f5d7cf25514e5..56ed589adda645314ecae02814ae894bad9a163e 100644 (file)
@@ -64,7 +64,7 @@ public class MenuModel extends BaseModel {
        }\r
 \r
        public boolean isMaestroAvailable() {\r
-               return equals(SessionUtil.getMediaCubeConfig().isMaestroDisabled());\r
+               return !SessionUtil.getMediaCubeConfig().isMaestroDisabled();\r
        }\r
 \r
        @Command\r
index 1e413dbe1f7074ae54a67ea4e039d2f0f5d62a7c..55e099e90a6093e37929fe08a2d9e807fadc32aa 100644 (file)
@@ -1,5 +1,6 @@
 package user.jobengine.zk.model;\r
 \r
+import java.util.Collections;\r
 import java.util.List;\r
 import java.util.ListIterator;\r
 \r
@@ -28,8 +29,8 @@ import user.jobengine.db.ItemType;
 public class MetadataDetailsModel extends BaseModel {\r
        private static final Logger logger = LogManager.getLogger();\r
 \r
-       @Wire("#window")\r
-       private Window wnd;\r
+       @Wire\r
+       private Window metadataEditorWnd;\r
        public ArchivedMedia archivedMedia;\r
        private List<ItemType> itemTypes;\r
        private ItemManager manager;\r
@@ -57,11 +58,25 @@ public class MetadataDetailsModel extends BaseModel {
                                iterator.add(archivedMedia.getMedia().getItemType());\r
                        }\r
                }\r
+\r
+               Collections.sort(itemTypes, (i1, i2) -> {\r
+                       return i1.getName().compareTo(i2.getName());\r
+               });\r
+\r
+               //              String description = Strings.escape(archivedMedia.getMedia().getDescription(), Strings.ESCAPE_JAVASCRIPT);\r
+               //              //String description = "Mi a szar?";\r
+               //              if (description != null) {\r
+               //                      StringBuilder script = new StringBuilder();\r
+               //                      script.append("setDescription('");\r
+               //                      script.append(description);\r
+               //                      script.append("')");\r
+               //                      Clients.evalJavaScript(script.toString());\r
+               //              }\r
        }\r
 \r
        @Command\r
        public void close() {\r
-               wnd.detach();\r
+               metadataEditorWnd.detach();\r
        }\r
 \r
        public ArchivedMedia getArchivedMedia() {\r
@@ -102,7 +117,7 @@ public class MetadataDetailsModel extends BaseModel {
                manager.modify(archivedMedia.getItem());\r
                manager.modify(archivedMedia.getMedia());\r
                logger.info("Metadata modified: {}", archivedMedia.getMedia().getId());\r
-               wnd.detach();\r
+               close();\r
        }\r
 \r
        public void setArchivedMedia(ArchivedMedia archivedMedia) {\r
index 785b8e9ec958952a1d1048842457a2548c646c08..853b4761ec67024eda9ded19894f8e6f8a634c15 100644 (file)
@@ -55,6 +55,7 @@ import org.zkoss.zul.Menuitem;
 import org.zkoss.zul.Menupopup;\r
 import org.zkoss.zul.Messagebox;\r
 import org.zkoss.zul.Paging;\r
+import org.zkoss.zul.Panel;\r
 import org.zkoss.zul.Row;\r
 import org.zkoss.zul.Timer;\r
 import org.zkoss.zul.Toolbar;\r
@@ -123,6 +124,10 @@ public class SearchModel extends AsyncBaseModel {
        Hbox searchFiltersMenu;\r
        @Wire\r
        Toolbarbutton toggleShowTypeFilters;\r
+       @Wire\r
+       Panel serachDetails;\r
+       @Wire\r
+       Toolbar filterToolbar;\r
 \r
        @Wire\r
        Menupopup searchSettings;\r
@@ -207,8 +212,17 @@ public class SearchModel extends AsyncBaseModel {
                //Clients.evalJavaScript("setSource('http://localhost:9080/services/proxy/20209535_1-20205617.mp4', 'video/mp4')");\r
 \r
                try {\r
+\r
                        Selectors.wireComponents(view, this, false);\r
                        Selectors.wireEventListeners(view, this);\r
+\r
+                       boolean typeFiltersVisible = SessionUtil.getTypeFiltersVisibility();\r
+                       if (typeFiltersVisible) {\r
+                               toggleShowTypeFilters.setChecked(true);\r
+                               toggleTypeFiltersCheck();\r
+                               search.setFocus(true);\r
+                       }\r
+\r
                        configureSearchResultGrid();\r
                        showExternalMediaID();\r
 \r
@@ -614,6 +628,7 @@ public class SearchModel extends AsyncBaseModel {
        public void onAfterRenderGrid() {\r
                //aszinkron fut le, kulon kezelendo a hiba\r
                try {\r
+\r
                        if (searchResult != null)\r
                                logger.info("isempty {}", searchResult.isEmpty());\r
 \r
@@ -702,15 +717,16 @@ public class SearchModel extends AsyncBaseModel {
        }\r
 \r
        @Command\r
-       public void onWestResize(@BindingParam("west") West _west) {\r
-               //_west.invalidate();\r
+       public void onWestResize() {\r
+               filterToolbar.invalidate();\r
        }\r
 \r
        @Command\r
        public void openMetaDataDialog() {\r
                String template = "/pages/metadatadetails.zul";\r
                Window window = (Window) Executions.createComponents(template, null, ListUtils.asMap("selectedObject", selectedObject));\r
-               window.doModal();\r
+               window.doOverlapped();\r
+\r
        }\r
 \r
        private void processFilterTagChanged(JSONObject jsObject) {\r
@@ -1104,6 +1120,14 @@ public class SearchModel extends AsyncBaseModel {
                                toggleShowTypeFilters, "end_center", 3000);\r
        }\r
 \r
+       @Command\r
+       public void toggleTypeFiltersCheck() {\r
+               boolean visible = toggleShowTypeFilters.isChecked();\r
+               toggleShowTypeFilters.setIconSclass(visible ? "z-icon-caret-up" : "z-icon-caret-down");\r
+               serachDetails.setOpen(visible);\r
+               SessionUtil.putUserTypeFiltersVisibility(visible);\r
+       }\r
+\r
        public void updateAllChecked() {\r
                final boolean[] check = { true };\r
                for (String key : typeFilters.keySet()) {\r
index b2282e6ca3c9143359ff27caf8eff3533cc285ab..6add1e576a0fe27a54d22eee57a86cb44b93c076 100644 (file)
@@ -39,6 +39,7 @@ public class SessionUtil {
        private static final String SEARCH_FILTER = "searchFilter";\r
        private static final String COLUMN_ORDERS = "columnOrders";\r
        private static final String PAGE_SIZE = "pageSize";\r
+       private static final String TYPEFILTERS_VISIBILITY = "typeFiltersVisibility";\r
        private static final String SEARCH_HISTORY = "searchHistory";\r
        private static final String USER_NAME = "userName";\r
        private static final String USER_SETTINGS = "userSettings";\r
@@ -220,6 +221,11 @@ public class SessionUtil {
                return result;\r
        }\r
 \r
+       public static boolean getTypeFiltersVisibility() {\r
+               BasicDBObject userSettings = getUserSettings();\r
+               return userSettings.get(TYPEFILTERS_VISIBILITY) == null ? false : (boolean) userSettings.get(TYPEFILTERS_VISIBILITY);\r
+       }\r
+\r
        public static Map<String, Object> getUserColumnOrder() {\r
                BasicDBObject userSettings = getUserSettings();\r
                return (Map<String, Object>) userSettings.get(COLUMN_ORDERS);\r
@@ -359,6 +365,12 @@ public class SessionUtil {
 \r
        }\r
 \r
+       public static void putUserTypeFiltersVisibility(boolean visible) {\r
+               BasicDBObject userSettings = getUserSettings();\r
+               userSettings.put(TYPEFILTERS_VISIBILITY, visible);\r
+               putUserSettings();\r
+       }\r
+\r
        static public void redirect(String path) {\r
                Executions.sendRedirect(path + getQueryString());\r
        }\r
index b673b8a26d2c4deec9f4fdc6f9fd89417a5df5e3..b2049b49c7d18d2ad6280e69231042ee711c1c1b 100644 (file)
@@ -7,6 +7,9 @@ import java.io.FileOutputStream;
 import java.io.IOException;\r
 import java.util.Vector;\r
 \r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
 import user.tsm.client.api.internal.DataBlk;\r
 import user.tsm.client.api.internal.DsmApiVersionEx;\r
 import user.tsm.client.api.internal.DsmArchiveDelInfo;\r
@@ -34,6 +37,7 @@ import user.tsm.client.api.internal.TSMAPI;
 import user.tsm.client.api.internal.TSMAPIConstants;\r
 \r
 public class TSMClient {\r
+       private static Logger logger = LogManager.getLogger();\r
        private static boolean multiThread = false;\r
        private static DsmApiVersionEx apiVersionEx = null;\r
 \r
@@ -42,6 +46,7 @@ public class TSMClient {
                        if (!TSMAPI.isAvailable())\r
                                return;\r
                        short rc = TSMAPI.dsmCleanUp(TSMAPIConstants.DSM_MULTITHREAD);\r
+                       logger.info("dsmCleanUp {}", rc);\r
                        if (rc != TSMAPIConstants.DSM_RC_OK)\r
                                throw new TSMException(0, rc);\r
                        multiThread = false;\r
@@ -50,9 +55,11 @@ public class TSMClient {
 \r
        public static void SetUpMultithread() throws TSMException {\r
                if (multiThread == false) {\r
+                       logger.info("TSMAPI available {}", TSMAPI.isAvailable());\r
                        if (!TSMAPI.isAvailable())\r
                                return;\r
                        short rc = TSMAPI.dsmSetUp(TSMAPIConstants.DSM_MULTITHREAD);\r
+                       logger.info("dsmSetUp {}", rc);\r
                        if (rc != TSMAPIConstants.DSM_RC_OK)\r
                                throw new TSMException(0, rc);\r
                        multiThread = true;\r