-#A user.dir mindig a test projekt mappaja, a relativ hivatkozasok ehhez kepest ertendok. \r
-#JobEngine\r
-jobengine.loglevel=INFO\r
-jobengine.jobsteps.root=../user.jobengine.osgi.server/resources/executors\r
-jobengine.jobtemplates.root=../user.jobengine.osgi.server/resources/templates\r
-jobengine.jobsteps.alternate.root=../user.jobengine.executors/bin/user/jobengine/server/steps\r
+jobengine.jobsteps.root=../user.jobengine.executors/bin\r
+jobengine.jobsteps.config=../user.jobengine.executors/config/config-worker.xml\r
+jobengine.jobtemplates.root=../user.jobengine.executors/jobtemplates\r
+jobengine.jobsteps.groovy.root=../user.jobengine.executors/src/user/jobengine/server/steps\r
+\r
+jetty.home=../-configuration/jetty\r
+jetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,etc/user-jetty-http.xml,etc/user-jetty-https.xml\r
+\r
+log4j.configurationFile=../-configuration/log4j2-test.xml\r
+\r
jobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;\r
jobengine.db.user=db2admin\r
jobengine.db.password=password\r
jobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;\r
jobengine.nexio.db.user=sa\r
jobengine.nexio.db.password=resolve\r
-#System\r
-jetty.home=../user.jobengine.osgi.rest/\r
-jetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,etc/user-jetty-http.xml,etc/user-jetty-https.xml\r
-log4j.configuration=../-configuration/log4j.properties\r
-log4j.configurationFile=../-configuration/log4j2.xml
\ No newline at end of file
+nexio.host=10.10.1.55\r
-org.slf4j.simpleLogger.defaultLogLevel=debug\r
jobengine.jobsteps.root=../user.jobengine.executors/bin\r
jobengine.jobsteps.config=../user.jobengine.executors/config/config-worker.xml\r
jobengine.jobtemplates.root=../user.jobengine.executors/jobtemplates\r
\r
log4j.configurationFile=../-configuration/log4j2-test.xml\r
\r
-jobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true;\r
-jobengine.db.user=db2admin\r
-jobengine.db.password=password\r
-jobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true;\r
-jobengine.nosql.db.user=db2admin\r
-jobengine.nosql.db.password=password\r
+jobengine.db.url=jdbc:db2://10.228.212.42:50000/mc:retrieveMessagesFromServerOnGetMessage=true;\r
+jobengine.db.user=blobtest\r
+jobengine.db.password=blobtest\r
+jobengine.nosql.db.url=jdbc:db2://10.228.212.42:50000/mc:retrieveMessagesFromServerOnGetMessage=true;\r
+jobengine.nosql.db.user=blobtest\r
+jobengine.nosql.db.password=blobtest\r
\r
#jobengine.master.server=http://localhost:8888\r
-javax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory
\ No newline at end of file
+javax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory\r
+nexio.host=10.10.1.55
\ No newline at end of file
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/bin" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.jobsteps.config="${workspace_loc}/user.jobengine.executors/config/config.xml" -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/" -Djetty.home="${workspace_loc:}/-configuration/jetty" -Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml -Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty -Djava.io.tmpdir=c:\temp\jetty -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium -Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB; -Djobengine.nexio.db.user=sa -Djobengine.nexio.db.password=resolve -Dnexio.host=10.10.1.55 -Djobengine.nexio.name=testnexioclips -Dnexio.useMOSGateway=true -Dnexio.disable=true -Djobengine.octopus.rundowns.name=rundowns -Djobengine.octopus.storyfolders.name=storyfolders -Djobengine.octopus.stories.name=stories -Dmediacube.auth.location="${workspace_loc}/-configuration/mediacube-auth.properties" -Djobengine.mediacube.config="${workspace_loc}/-configuration/mediacube.json" -Djobengine.mediacube.service.proxyroot="/opt" -Djobengine.randomize.archives=false"/>\r
<stringAttribute key="pde.version" value="3.3"/>\r
<booleanAttribute key="show_selected_only" value="false"/>\r
-<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jackson2-provider@default:default,org.jboss.resteasy.jaxrs-api@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
+<stringAttribute key="target_bundles" value="cglib@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs-api@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.mybatis.mybatis@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.omnifaces@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
<booleanAttribute key="tracing" value="false"/>\r
<booleanAttribute key="useCustomFeatures" value="false"/>\r
<booleanAttribute key="useDefaultConfigArea" value="true"/>\r
<executor className="CancelableStep.java" maxConcurrent="1" isRemote="true" />\r
<executor className="FakeStep.java" maxConcurrent="1" />\r
<executor className="NEXIOCheckerStep.java" maxConcurrent="1" />\r
+ <executor className="ValidateAndArchiveForkStep.java" maxConcurrent="1" />\r
</executors>
\ No newline at end of file
</parameters>\r
</declarations>\r
<commands>\r
- <calljobstep id="id1" type="user.jobengine.server.steps.FileCopyStep" weight="1">\r
+ <calljobstep type="FileCopyStep.java" weight="1">\r
<inputs>\r
<input>\r
<parameter name="sourceProtocol" />\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate>\r
+ <declarations>\r
+ <parameters>\r
+ <parameter name="template" type="java.lang.String"/>\r
+ <parameter name="sourcePath" type="java.lang.String"/>\r
+ <parameter name="limit" type="java.lang.Integer" />\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep type="ValidateAndArchiveForkStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="template" />\r
+ </input>\r
+ <input>\r
+ <parameter name="sourcePath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="limit" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate multiInstance="true" name="Fake">\r
+<!-- A NEXIO servert vegigolvasva, megkeresi azokat a fajlokat amik valtoztak, es a tarolo valamint a fajl nevebol kepez egy statusz fajlt. -->\r
+<jobtemplate multiInstance="true">\r
<declarations>\r
<parameters>\r
<parameter name="storeName" type="java.lang.String"/>\r
<parameter name="outputPath" type="java.lang.String"/>\r
- <parameter name="limit" type="int"/>\r
+ <parameter name="limit" type="java.lang.Integer"/>\r
</parameters>\r
</declarations>\r
<commands>\r
<input>\r
<parameter name="storeName" />\r
</input>\r
+ <input>\r
+ <parameter name="outputPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="limit" />\r
+ </input>\r
</inputs>\r
</calljobstep>\r
</commands>\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Általános file másolás" multiInstance="true">\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
+ <parameter name="media" type="user.jobengine.db.Media"/>\r
+ </parameters>\r
+ <variables>\r
+ <parameter name="frameNumber" type="java.lang.Long" />\r
+ </variables>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep 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
+ <calljobstep type="FrameNumberReaderStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetFileName" />\r
+ </input>\r
+ </inputs>\r
+ <outputs>\r
+ <output>\r
+ <variable name="frameNumber" /> \r
+ </output>\r
+ </outputs>\r
+ </calljobstep>\r
+ <calljobstep type="FrameNumberValidatorStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="targetPath" />\r
+ </input>\r
+ <input>\r
+ <parameter name="targetFileName" />\r
+ </input>\r
+ </inputs>\r
+ <outputs>\r
+ <output>\r
+ <variable name="frameNumber" /> \r
+ </output>\r
+ </outputs>\r
+ </calljobstep>\r
+ <calljobstep type="TSMBackupStep.java" weight="1">\r
+ <inputs>\r
+ <input>\r
+ <parameter name="archiveItem" />\r
+ </input>\r
+ <input>\r
+ <variable name="media" />\r
+ </input>\r
+ <input>\r
+ <parameter name="killDateDays" />\r
+ </input>\r
+ </inputs>\r
+ </calljobstep>\r
+ \r
+ </commands>\r
+</jobtemplate>
\ No newline at end of file
+++ /dev/null
-package hu.user.mediacube.steps;\r
-\r
-import com.ibm.nosql.json.api.BasicDBObject;\r
-\r
-public class DownloadableArchive extends BasicDBObject {\r
-\r
-}\r
+++ /dev/null
-package hu.user.mediacube.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
-\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.jobengine.server.IJobEngine;\r
-import user.jobengine.server.IJobRuntime;\r
-import user.jobengine.server.steps.JobStep;\r
-import user.jobengine.server.steps.StepEntry;\r
-\r
-public class DownloadableListBuilderStep 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
-\r
- @StepEntry\r
- public Object[] execute(String sourcePath, int limit, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
- DirectoryStream<Path> directoryStream = null;\r
- try {\r
- directoryStream = Files.newDirectoryStream(Paths.get(sourcePath));\r
- for (Path p : directoryStream) {\r
- processPathItem(p);\r
- }\r
- } catch (Exception e) {\r
- logger.error(getSessionMarker(), e.getMessage());\r
- } finally {\r
- if (directoryStream != null) {\r
- try {\r
- directoryStream.close();\r
- } catch (IOException e) {\r
- }\r
- }\r
- }\r
-\r
- return null;\r
- }\r
-\r
- private String getMetadata(BasicDBObject dbObject, String fieldName) {\r
- String result = null;\r
- if (dbObject.containsKey(fieldName))\r
- result = dbObject.getString(fieldName);\r
- return result;\r
- }\r
-\r
- private boolean processPathItem(Path mediaFilePath) {\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
- return true;\r
- }\r
-}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class DownloadableMedia extends BasicDBObject {\r
+\r
+}\r
});\r
\r
source.transferFrom(target, sourceFileName, targetFileName);\r
- if (killDateDays > 0) {\r
+ if (killDateDays > -1)\r
EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
- }\r
\r
} catch (Exception e) {\r
logger.catching(e);\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.FileNotFoundException;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+import java.util.Arrays;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.server.steps.JobStep;\r
+import user.jobengine.server.steps.StepEntry;\r
+\r
+public class FrameNumberReaderStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(String sourcePath, String fileName) throws Exception {\r
+ Object result[] = null;\r
+ Path filePath = Paths.get(sourcePath, fileName);\r
+ MediaInfo mi = new MediaInfo(filePath);\r
+ try {\r
+ if (!filePath.toFile().exists())\r
+ throw new FileNotFoundException("File not exists: " + filePath.toString());\r
+ mi.process();\r
+ long frames = mi.getFrames();\r
+ result = Arrays.asList(frames).toArray();\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ throw e;\r
+ }\r
+ return result;\r
+ }\r
+\r
+}\r
-package hu.user.mediacube.steps;\r
+package user.jobengine.server.steps;\r
\r
import java.io.IOException;\r
import java.sql.Timestamp;\r
import user.commons.remotestore.RemoteStoreProtocol;\r
import user.jobengine.db.Media;\r
import user.jobengine.db.Store;\r
-import user.jobengine.server.steps.EscortFiles;\r
-import user.jobengine.server.steps.JobStep;\r
-import user.jobengine.server.steps.StepEntry;\r
\r
public class NEXIOCheckerStep extends JobStep {\r
private static final String DOT_MXF = ".MXF";\r
private static final Logger logger = LogManager.getLogger();\r
\r
- private DownloadableArchive createArchive(String title, Timestamp modified, Timestamp created, int duration) {\r
- DownloadableArchive archive = new DownloadableArchive();\r
+ private DownloadableMedia createArchive(String title, Timestamp modified, Timestamp created, int duration) {\r
+ DownloadableMedia archive = new DownloadableMedia();\r
archive.append("title", title);\r
archive.append("fileName", title + DOT_MXF);\r
archive.append("modified", modified);\r
archive.append("created", created);\r
- archive.append("duration", duration);\r
return archive;\r
}\r
\r
\r
try {\r
if (storeUri.getPortNumber() == 0)\r
- controller = new Controller(storeUri.getRootPath(), storeUri.getPortNumber());\r
+ controller = new Controller(storeUri.getUri(), storeUri.getPortNumber());\r
else\r
- controller = new Controller(storeUri.getRootPath());\r
+ controller = new Controller(storeUri.getUri());\r
controller.connect();\r
Mediabase mediabase = controller.getMediabase();\r
Iterator<Clip> clips = mediabase.getClips();\r
- processClips(outputPath, limit, clips);\r
+ processClips(storeName, outputPath, limit, clips);\r
} catch (Exception e) {\r
logger.error(getSessionMarker(), e.getMessage());\r
throw e;\r
return null;\r
}\r
\r
- private void processClips(String outputPath, int limit, Iterator<Clip> clips) throws ClipNotFoundException, IOException, ProtocolException {\r
+ private void processClips(String storeName, String outputPath, int limit, Iterator<Clip> clips)\r
+ throws ClipNotFoundException, IOException, ProtocolException {\r
int count = limit;\r
while (clips.hasNext()) {\r
\r
- //megszakithatosag\r
- if (getJobRuntime().isWaitingCancel())\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
break;\r
+ }\r
\r
Clip clip = clips.next();\r
String title = clip.getXid().get();\r
Timestamp created = Timestamp.from(clip.getRecordDateTimestamp().toInstant());\r
int duration = clip.getDuration();\r
\r
+ //TODO a rogzites alatt allo klippeket kiszurni\r
+\r
Media media = getManager().getMedia(title);\r
- boolean create = media == null || media.getLength() != duration || !media.getModified().equals(modified) || !media.getCreated().equals(created);\r
+\r
+ boolean create = media == null;\r
+ create |= create || !media.getModified().equals(modified);\r
+ create |= create || !media.getCreated().equals(created);\r
+ //a regi moziknal nincs hossz mentve\r
+ create |= create || (media.getLength() > 0 && media.getLength() != duration);\r
+\r
if (create) {\r
- DownloadableArchive archive = createArchive(title, modified, created, duration);\r
+ DownloadableMedia archive = createArchive(title, modified, created, duration);\r
//letezik : mar hozzadva\r
- if (tryAdd(outputPath, archive))\r
+ if (tryAdd(storeName, outputPath, archive, media))\r
count--;\r
}\r
\r
}\r
}\r
\r
- private boolean tryAdd(String outputPath, DownloadableArchive archive) throws IOException {\r
+ private boolean tryAdd(String storeName, String outputPath, DownloadableMedia archive, Media media) throws IOException {\r
boolean result = false;\r
- String fileName = archive.getString("fileName");\r
+ String fileName = storeName + "." + archive.getString("fileName");\r
+\r
if (!EscortFiles.isMetadataExists(outputPath, fileName)) {\r
String metadata = archive.toPrettyString("");\r
EscortFiles.createMetadata(outputPath, fileName, metadata);\r
--- /dev/null
+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.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 TSMWriterStep 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
+ String details = String.format("%s (%d bytes)", sourceFileName, sourceMediaFile.length());\r
+ try {\r
+\r
+ setAndCheck(archiveItem, mediaCubeMedia, getEngine());\r
+\r
+ getJobRuntime().setDescription(details);\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
--- /dev/null
+package user.jobengine.server.steps;\r
+\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
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.util.JSON;\r
+\r
+import user.jobengine.db.ArchivedMedia;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class ValidateAndArchiveForkStep extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String JOB_TEMPLATE = "validate-and-archive.xml";\r
+\r
+ @StepEntry\r
+ public Object[] execute(String template, String sourcePath, int limit) {\r
+ DirectoryStream<Path> directoryStream = null;\r
+ int count = limit;\r
+ try {\r
+ if (getJobRuntime().forkPrepare()) {\r
+ directoryStream = Files.newDirectoryStream(Paths.get(sourcePath));\r
+ if (directoryStream != null) {\r
+ for (Path p : directoryStream) {\r
+\r
+ if (getJobRuntime().isWaitingCancel()) {\r
+ cancel();\r
+ break;\r
+ }\r
+\r
+ if (processPathItem(template, p))\r
+ count--;\r
+\r
+ if (count == 0)\r
+ break;\r
+ }\r
+ }\r
+\r
+ getJobRuntime().forkWaitComplete();\r
+ }\r
+\r
+ setProgress(100);\r
+ } catch (Exception e) {\r
+ logger.error(getSessionMarker(), e.getMessage());\r
+ } finally {\r
+ if (directoryStream != null) {\r
+ try {\r
+ directoryStream.close();\r
+ } catch (IOException e) {\r
+ }\r
+ }\r
+ }\r
+\r
+ return null;\r
+ }\r
+\r
+ private boolean processPathItem(String template, Path escortFile) throws IOException {\r
+ if (escortFile.toFile().isDirectory())\r
+ return false;\r
+\r
+ String fileName = escortFile.getFileName().toString();\r
+ //minimum 3 karakter: STORENAME.FILENAME.MXF.JSON\r
+ long dotCount = fileName.chars().filter(ch -> ch == '.').count();\r
+ if (dotCount < 4)\r
+ return false;\r
+\r
+ byte[] bytes = Files.readAllBytes(escortFile);\r
+ String content = new String(bytes);\r
+ if (content != null) {\r
+ try {\r
+ DownloadableMedia archive = (DownloadableMedia) JSON.parse(content);\r
+ logger.info("Starting {}", template);\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ }\r
+\r
+ }\r
+\r
+ return true;\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.getMarker()).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
package user.jobengine.server.IT;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
import java.io.FileInputStream;
import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
+import org.apache.commons.io.FileUtils;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class AMCTests {
private static IItemManager manager;
private static IJobEngine jobEngine;
+ private static final String output = "/opt/NEXIO";;
@BeforeClass
public static void initialize() throws Exception {
}
@Test
- public void testNexioCheckerStep() throws Exception {
- Store nexioStore = manager.createStore("NEXIO", false, false);
- nexioStore.add();
+ public void testForkValidateAndArchive() throws Exception {
+ Files.createDirectories(Paths.get(output));
+ DownloadableArchive media = new DownloadableArchive();
+ }
+ @Test
+ public void testNexioChecker() throws Exception {
//Tesztelni a HirTV-n lehet
- StoreUri storeUri = manager.createStoreUri(RemoteStoreProtocol.NEXIO, "10.10.1.55");
- storeUri.setStoreId(nexioStore.getId());
- storeUri.add();
-
+ String storeName = "NEXIO";
+ Store nexioStore = manager.getStore(storeName);
+ StoreUri storeUri = null;
+ if (nexioStore == null) {
+ nexioStore = manager.createStore(storeName, false, false);
+ nexioStore.add();
+
+ storeUri = manager.createStoreUri(RemoteStoreProtocol.NEXIO, System.getProperty("nexio.host"));
+ storeUri.setSource(true);
+ storeUri.setTarget(true);
+ storeUri.setStoreId(nexioStore.getId());
+ storeUri.add();
+ } else {
+ storeUri = nexioStore.getSourceStoreUri(RemoteStoreProtocol.NEXIO);
+ storeUri.setPersister(manager);
+ nexioStore.setPersister(manager);
+ }
CountDownLatch finishLatch = new CountDownLatch(1);
+ Files.createDirectories(Paths.get(output));
+
Map<String, Object> jobParams = new HashMap<>();
- jobParams.put("storeName", "NEXIO");
- jobParams.put("outputPath", "/opt");
+ jobParams.put("storeName", storeName);
+ jobParams.put("outputPath", output);
jobParams.put("limit", 1);
+ jobEngine.addJobChangedEventListener(e -> {
+ });
+
IJobRuntime jobRuntime = jobEngine.submit(null, e -> {
if (e.isRuntimeTerminated())
finishLatch.countDown();
- }, "nexio-check.xml", "NEXIO check", jobParams);
+ }, "nexio-checker.xml", "NEXIO check", jobParams);
- finishLatch.await();
+ if (jobRuntime != null)
+ finishLatch.await();
storeUri.remove();
nexioStore.remove();
+ FileUtils.deleteDirectory(Paths.get(output).toFile());
+
+ assertNotNull(jobRuntime);
assertEquals(JobStatus.FINISHED, jobRuntime.getStatus());
}