<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 -Dorg.eclipse.equinox.http.jetty.http.port=8080 -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -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/user/jobengine/server/steps" -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 -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_v4.zenium -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Dnexio.host=10.10.1.555"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory -Dorg.eclipse.equinox.http.jetty.http.port=8080 -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -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/user/jobengine/server/steps" -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 -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_v4.zenium -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Dnexio.host=10.10.1.55"/>\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.auth0.java-jwt@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.google.guava@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,com.sun.el.javax.el@default:default,commons-logging@default:default,javassist@default:default,javax.annotation-api@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.servlet.jsp-api@default:default,javax.validation.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.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@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.jasper.glassfish@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.jdt.core.compiler.batch@default:default,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jsp@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.jvnet.mimepull@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.reflections@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
{"name": "killDateDays", "value": 1, "type": "java.lang.Integer"}\r
]\r
},\r
+ {\r
+ "active": false,\r
+ "name" : "NEXIO anyagok másolása az ISILON/ARCHIVE mappába",\r
+ "template": "copyforarchive-nexio-materials.xml",\r
+ "executeimmediate": true,\r
+ "cronexpression": "0 0 0/1 1/1 * ? *",\r
+ "parameters": [ \r
+ {"name": "nexioPort", "value": 2098, "type": "java.lang.Integer"},\r
+ {"name": "nexioUserName", "value": "administrator", "type": "java.lang.String"},\r
+ {"name": "nexioPassword", "value": "system", "type": "java.lang.String"},\r
+ {"name": "archiveFtp", "value": "ftp://10.10.1.100/ARCHIVE/TEST", "type": "java.lang.String"},\r
+ {"name": "archiveUserName", "value": "administrator", "type": "java.lang.String"},\r
+ {"name": "archivePassword", "value": "system", "type": "java.lang.String"},\r
+ {"name": "daysBeforeNow", "value": 1, "type": "java.lang.Integer"}\r
+ ]\r
+ }, \r
+ \r
{\r
"active": false,\r
"name" : "TRAFFIC anyagok visszatöltése",\r
"executeimmediate": true,\r
"cronexpression": "0 0 0/1 1/1 * ? *",\r
"parameters": [ \r
- {"name": "sourcePath", "value": "o:\\_OLD", "type": "java.lang.String"}\r
+ {"name": "sourcePath", "value": "q:/TEST", "type": "java.lang.String"}\r
]\r
}, \r
{\r
<executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="4"/>\r
<executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="2"/>\r
<executor className="user.jobengine.server.steps.OutputPathAndNameSelectorStep" maxConcurrent="1"/>\r
+ <executor className="user.jobengine.server.steps.CopyForArchiveNEXIOMaterialsStep" maxConcurrent="1"/>\r
</executors>
\ No newline at end of file
}, \r
{\r
"active": false,\r
- "name" : "Anyagok törlése",\r
+ "name" : "Lejárt ISISLON/ARCHIVE anyagok törlése",\r
"template": "delete-materials.xml",\r
"executeimmediate": true,\r
"cronexpression": "0 0 0/1 1/1 * ? *",\r
"parameters": [ \r
- {"name": "sourcePath", "value": "\\\\10.10.1.100\\BRAAVOS\\ARCHIVE", "type": "java.lang.String"},\r
- {"name": "userName", "value": "mediacube", "type": "java.lang.String"},\r
- {"name": "password", "value": "Broadca5T", "type": "java.lang.String"}\r
+ {"name": "sourcePath", "value": "/mnt/ISILON/ARCHIVE", "type": "java.lang.String"}\r
]\r
}, \r
{\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="NEXIO anyagok törlése">\r
+ <declarations>\r
+ <parameters>\r
+<!-- A host név 'nexio.host' rendszerparaméter -->\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
+ <parameter name="archiveFtp" type="java.lang.String"/>\r
+ <parameter name="archiveUserName" type="java.lang.String"/>\r
+ <parameter name="archivePassword" type="java.lang.String"/>\r
+ <parameter name="daysBeforeNow" type="java.lang.Integer"/>\r
+ </parameters>\r
+ </declarations>\r
+ <commands>\r
+ <calljobstep id="id1" type="user.jobengine.server.steps.CopyForArchiveNEXIOMaterialsStep" weight="1">\r
+ <inputs>\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
+ <input>\r
+ <parameter name="archiveFtp" />\r
+ </input>\r
+ <input>\r
+ <parameter name="archiveUserName" />\r
+ </input>\r
+ <input>\r
+ <parameter name="archivePassword" />\r
+ </input>\r
+ <input>\r
+ <parameter name="daysBeforeNow" />\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 name="Anyagok törlése">\r
+<jobtemplate name="Anyagok törlése" multiInstance="true">\r
<declarations>\r
<parameters>\r
<parameter name="sourcePath" type="java.lang.String"/>\r
\r
setProgress(currentCount[0] * 100 / allCount[0]);\r
\r
- logger.debug("Checking {}", filePath);\r
+ if (STATUSFOLDER.equals(filePath.getParent().getFileName()))\r
+ logger.info("Skipping {}", filePath);\r
+\r
+ logger.info("Checking {}", filePath);\r
List<Path> killDateFiles = getKillDateFiles(filePath);\r
if (killDateFiles.size() == 0)\r
return;\r
\r
boolean result = true;\r
for (Path killDateFile : killDateFiles) {\r
- if (removeFile(killDateFile))\r
+ if (!removeFile(killDateFile))\r
result = false;\r
}\r
\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.io.IOException;\r
+import java.net.URI;\r
+import java.net.URISyntaxException;\r
+import java.util.Calendar;\r
+import java.util.List;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import 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.DBObject;\r
+\r
+import user.commons.CalendarUtils;\r
+import user.commons.StoreUri;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.commons.octopus.IOctopusAPI;\r
+import user.commons.octopus.OctopusAPI;\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
+import user.jobengine.server.JobEngineException;\r
+import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;\r
+\r
+public class CopyForArchiveNEXIOMaterialsStep extends JobStep {\r
+ private static final String MXFEXT = ".MXF";\r
+ private static final Logger logger = LogManager.getLogger();\r
+ private static final String NEXIOCLIPS = "nexioclips";\r
+ private static final String KILLDATE = "killdate";\r
+ private static final String LONGNAMEID = "longnameid";\r
+ private static final String ID = "id";\r
+ private StoreUri sourceUri;\r
+ private StoreUri targetUri;\r
+ private OctopusAPI octopusAPI;\r
+ private IItemManager manager;\r
+ private DB db;\r
+\r
+ private int check(int value, String name) {\r
+ if (value == 0) {\r
+ logger.error(getMarker(), "A folyamat '{}' bemeneti paramétere 0.", name);\r
+ throw new NullPointerException(String.format("System is not configured properly, missing '%s' input parameter.", name));\r
+ }\r
+ return value;\r
+ }\r
+\r
+ private String check(String value, String name) {\r
+ if (value == null) {\r
+ logger.error(getMarker(), "A folyamat '{}' bemeneti paramétere üres.", name);\r
+ throw new NullPointerException(String.format("System is not configured properly, missing '%s' input parameter.", name));\r
+ }\r
+ return value;\r
+ }\r
+\r
+ private BasicDBObject createMetadata(BasicDBObject rundown, BasicDBObject story, BasicDBObject mosObject) {\r
+ // TODO Auto-generated method stub\r
+ return null;\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute(int nexioPort, String nexioUserName, String nexioPassword, String archiveFtp, String archiveUserName, String archivePassword,\r
+ int daysBeforeNow, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+ setAndCheck(nexioPort, nexioUserName, nexioPassword, archiveFtp, archiveUserName, archivePassword, jobEngine);\r
+ octopusAPI = new OctopusAPI();\r
+ Calendar scheduledDate = Calendar.getInstance();\r
+ scheduledDate.add(Calendar.DAY_OF_YEAR, -1 * daysBeforeNow);\r
+ List<DBObject> rundowns = octopusAPI.getRundowns(scheduledDate.getTime());\r
+ if (rundowns == null) {\r
+ logger.warn(getMarker(), "Nem található adástükör a {} napra.", CalendarUtils.toDateString(scheduledDate));\r
+ return null;\r
+ }\r
+ try {\r
+ int index = 1;\r
+ for (DBObject r : rundowns) {\r
+ setProgress(index * 100 / rundowns.size());\r
+ processRundow(r);\r
+ index++;\r
+ }\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ logger.error(getMarker(), e.getMessage());\r
+ throw e;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ private void processMosObject(BasicDBObject rundown, BasicDBObject story, BasicDBObject mosObject) throws Exception {\r
+ String mosID = mosObject.getString(IOctopusAPI.OBJ_ID);\r
+ if (MetadataTypeDetector.GuessMetadataType(mosID) != MetadataType.OCTOPUSPLACEHOLDER) {\r
+ logger.warn("Skipping MOS object {}", mosID);\r
+ return;\r
+ }\r
+\r
+ DBCollection clips = db.getCollection(NEXIOCLIPS);\r
+ DBObject clip = clips.findOne(new BasicDBObject(LONGNAMEID, mosID));\r
+ if (clip == null) {\r
+ logger.info("File NOT exists {}", mosID);\r
+ throw new Exception("Not exists");\r
+ } else {\r
+ logger.info("File exists {}", mosID);\r
+ }\r
+\r
+ BasicDBObject metadata = createMetadata(rundown, story, mosObject);\r
+ }\r
+\r
+ private void processRundow(DBObject r) throws Exception {\r
+ BasicDBObject rundown = (BasicDBObject) r;\r
+ long rundownID = rundown.getLong(ID);\r
+ logger.info("Processing rundown {}", rundownID);\r
+ List<DBObject> stories = octopusAPI.getRundownStories(rundownID);\r
+ if (stories == null)\r
+ return;\r
+ for (DBObject s : stories)\r
+ processStory(rundown, s);\r
+ }\r
+\r
+ private void processStory(BasicDBObject rundown, DBObject s) throws Exception {\r
+ BasicDBObject story = (BasicDBObject) s;\r
+ String parentStoryID = story.getString(IOctopusAPI.PARENT_STORY_ID);\r
+ logger.info("Processing story {}", parentStoryID);\r
+ List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
+ if (mosObjects == null)\r
+ return;\r
+ for (BasicDBObject mosObject : mosObjects)\r
+ processMosObject(rundown, story, mosObject);\r
+\r
+ }\r
+\r
+ private void setAndCheck(int nexioPort, String nexioUserName, String nexioPassword, String archiveFtp, String archiveUserName, String archivePassword,\r
+ IJobEngine jobEngine) throws JobEngineException, IOException, URISyntaxException {\r
+ db = NoSQLUtils.getNoSQLDB();\r
+ if (db == null) {\r
+ logger.error(getMarker(), "Az NoSQL adatkezelő réteg nem elérhető.");\r
+ throw new NullPointerException("Internal error, missing NoSQL DB reference.");\r
+ }\r
+\r
+ if (jobEngine == null) {\r
+ logger.error(getMarker(), "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(getMarker(), "Az adatbáziskezelő réteg nem elérhető.");\r
+ throw new NullPointerException("Internal error, missing ItemManager reference.");\r
+ }\r
+ String nexioHost = System.getProperty("nexio.host");\r
+ if (StringUtils.isBlank(nexioHost)) {\r
+ logger.error(getMarker(), "A 'nexio.host' rendszer paraméter nem található.");\r
+ throw new NullPointerException("System is not configured properly, 'jobengine.selenio.address' startup parameter missing.");\r
+ }\r
+ check(nexioPort, "nexioPort");\r
+ check(nexioUserName, "nexioUserName");\r
+ check(nexioPassword, "nexioPassword");\r
+\r
+ sourceUri = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost);\r
+ sourceUri.setPortNumber(nexioPort);\r
+ sourceUri.setUserName(nexioUserName);\r
+ sourceUri.setPassword(nexioPassword);\r
+\r
+ check(archiveFtp, "archiveFtp");\r
+ check(archiveUserName, "archiveUserName");\r
+ check(archivePassword, "archivePassword");\r
+\r
+ targetUri = manager.createStoreUri(new URI(archiveFtp));\r
+ targetUri.setUserName(archiveUserName);\r
+ targetUri.setPassword(archivePassword);\r
+ }\r
+\r
+}\r
throw new NullPointerException("System is not configured properly, 'jobengine.selenio.address' startup parameter missing.");\r
}\r
\r
- DB db = NoSQLUtils.getDB();\r
+ DB db = NoSQLUtils.getNoSQLDB();\r
\r
DBCollection collection = db.getCollection(NEXIOCLIPS);\r
//https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+\r
+public class MetadataTypeDetector {\r
+ public enum MetadataType {\r
+ TRAFFIC, OCTOPUSSTORY, OCTOPUSPLACEHOLDER, GENERIC\r
+ }\r
+\r
+ private static final String REGEXP_TRAFFIC = "^[MRP]{1}[0-9]{6}[A-Z]{1}$";\r
+ private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+$";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+$";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}$";\r
+\r
+ public static MetadataType GuessMetadataType(String id) {\r
+ if (StringUtils.isBlank(id))\r
+ return MetadataType.GENERIC;\r
+ if (id.matches(REGEXP_TRAFFIC))\r
+ return MetadataType.TRAFFIC;\r
+ if (id.matches(REGEXP_OCTOPUSSTORYID))\r
+ return MetadataType.OCTOPUSSTORY;\r
+ if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
+ return MetadataType.OCTOPUSPLACEHOLDER;\r
+ if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
+ return MetadataType.OCTOPUSPLACEHOLDER;\r
+ return MetadataType.GENERIC;\r
+ }\r
+\r
+}\r
\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
+import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;\r
\r
public class OutputPathAndNameSelectorStep extends JobStep {\r
- private enum MetadataType {\r
- TRAFFIC, OCTOPUS, GENERIC\r
- }\r
\r
private static final String TARGETNAMEPATTERN = "-ARCH-%s";\r
\r
private static final Logger logger = LogManager.getLogger();\r
- private static final String REGEXP_TRAFFIC = "^[MRP]{1}[0-9]{6}[A-Z]{1}$";\r
- private static final String REGEXP_OCTOPUSID = "^[0-9]+$";\r
\r
private void check(String trafficOutputPath, String octopusOutputPath, String genericOutputPath, String houseId) {\r
if (StringUtils.isBlank(trafficOutputPath)) {\r
check(trafficOutputPath, octopusOutputPath, genericOutputPath, houseId);\r
\r
String id = houseId.toUpperCase();\r
- MetadataType mdType = GuessMetadataType(id);\r
+ MetadataType mdType = MetadataTypeDetector.GuessMetadataType(id);\r
String targetPath = null;\r
switch (mdType) {\r
case GENERIC:\r
targetPath = Paths.get(genericOutputPath, id).toString();\r
break;\r
- case OCTOPUS:\r
+ case OCTOPUSPLACEHOLDER:\r
+ case OCTOPUSSTORY:\r
targetPath = Paths.get(octopusOutputPath, id).toString();\r
break;\r
case TRAFFIC:\r
return new Object[] { targetPath, targetNamePattern };\r
}\r
\r
- private MetadataType GuessMetadataType(String id) {\r
- if (id.matches(REGEXP_TRAFFIC))\r
- return MetadataType.TRAFFIC;\r
- if (id.matches(REGEXP_OCTOPUSID))\r
- return MetadataType.OCTOPUS;\r
- return MetadataType.GENERIC;\r
- }\r
-\r
}\r
throw new Exception("InputLister is null.");
}
+ public boolean fileExists(String fileName) throws Exception {
+ ensureLister();
+ return lister.exists(fileName);
+ }
+
public void fireProgressEvent(ProgressEvent evt) {
Object[] listeners = progressListenerList.getListenerList();
for (int i = 0; i < listeners.length; i += 2) {
List<DBObject> result = null;\r
DB db;\r
try {\r
- db = NoSQLUtils.getDB();\r
+ db = NoSQLUtils.getNoSQLDB();\r
DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
DBCursor find = collection.find().sort(new BasicDBObject(MODIFIEDTIMESTAMP, new BasicDBList(-1, "$date")));\r
if (find.hasNext())\r
import java.util.Iterator;\r
import java.util.List;\r
import java.util.Map;\r
+import java.util.concurrent.ExecutorService;\r
+import java.util.concurrent.Executors;\r
\r
import javax.swing.event.EventListenerList;\r
\r
import user.commons.nexio.server.protocol.GetExtendedFieldCommand;\r
import user.commons.nosql.NoSQLUtils;\r
import user.commons.remotestore.IProgressEventListener;\r
-import user.commons.remotestore.ProgressEvent;\r
\r
/**\r
* NexioWSServlet hozza letre. Indulaskor betolti a teljes nexio clip listat mongodb-be. Beregisztralja magat ClipEventListener-nek. Az erkezo esemenyekkel\r
public static final String CLIP_COLLECTION_NAME = "nexioclips";\r
static private final byte[] GET_SPECIAL_ID_ATTRIBUTES_REQ = { (byte) 0xC8, (byte) 0x84 };\r
static private final char[] hexArray = "0123456789ABCDEF".toCharArray();\r
+ private static final ExecutorService executor = Executors.newFixedThreadPool(1);\r
\r
public static String bytesToBin(byte[] bytes) {\r
StringBuilder result = new StringBuilder();\r
}\r
\r
private EventListenerList progressListenerList;\r
- private ProgressEvent progressEvent = new ProgressEvent(this, 0);\r
private INexioChangeListener nexioChangeListener;\r
private DB db;\r
\r
- //BEGIN OF R\r
-\r
- //R\r
- private String NEXIO_HOST = System.getProperty("nexio.host"); //"10.228.43.18"; //echo: "10.10.1.55"; vmware: "10.228.43.18"\r
-\r
+ private String NEXIO_HOST = System.getProperty("nexio.host");\r
private Controller controller = null;\r
\r
- //KONSTRUKTOR\r
- //KONSTRUKTOR\r
public NexioClipEventDispatcher() {\r
- try {\r
- this.db = NoSQLUtils.getDB();\r
-\r
- // BasicDBObject jsClip = new BasicDBObject();\r
- // jsClip.put(ID, "%00001"); //Unique internal ID\r
- // jsClip.put(LONGNAMEID, "valami1"); //Extended ID (Filename)\r
- // jsClip.put(DURATION, 100);\r
- // jsClip.put(MODIFIEDTIMESTAMP, new Date());\r
- // jsClip.put(EXTAGENCY, "TEST1");\r
- // Map<String, BasicDBObject> emptyMap = new HashMap<String, BasicDBObject>();\r
- // this.saveClipIntoMongo(jsClip, emptyMap);\r
-\r
- //nexio init\r
- this.controller = new Controller(NEXIO_HOST);\r
- this.controller.connect();\r
- //this.controller.getMediabase().getMediaListener().addClipEventListener(this);\r
- logger.info("NEXIO server is connected.");\r
-\r
- this.progressListenerList = new EventListenerList();\r
-\r
- this.dropAllClipsFromMongo();\r
- this.ensureIndexes();\r
-\r
- //load clips into mongo\r
-\r
- Thread importThread = new Thread(new Runnable() {\r
- @Override\r
- public void run() {\r
- try {\r
- //1. kezdeti masolas\r
- copyClipsIntoMongo();\r
- //2. esemeny feliratkozas\r
- NexioClipEventDispatcher.this.controller.getMediabase().startMediaListener();\r
- NexioClipEventDispatcher.this.controller.getMediabase().getMediaListener().addClipEventListener(NexioClipEventDispatcher.this);\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- }\r
- }\r
- });\r
- importThread.start();\r
-\r
- } catch (Exception exc) {\r
- logger.error("", exc);\r
- }\r
+ this.db = NoSQLUtils.getNoSQLDB();\r
}\r
\r
public void addProgressListener(IProgressEventListener listener) {\r
//DELETE-nel csak az id van kitoltve a CLIP-en, ezert exception jon!!!\r
if (evt.getEventType() == ClipEventType.CLIP_ADDED) {\r
// if (isValidClip(evt.getClip())) {\r
- BasicDBObject jsClip = convertClipToJSON(evt.getClip());\r
+ BasicDBObject jsClip = clipToJSON(evt.getClip());\r
\r
String fileName = jsClip.getString(LONGNAMEID);\r
if (fileName != null && !"".equals(fileName)) {\r
}\r
}\r
\r
- //END OF R\r
- /*\r
- private void extendJSONClip(BasicDBObject jsClip, Clip clip) throws Exception {\r
- jsClip.put(ID, clip.getId().get()); //Unique internal ID\r
- jsClip.put(LONGNAMEID, clip.getXid().get()); //Extended ID (Filename)\r
- jsClip.put(DURATION, clip.getDuration());\r
- jsClip.put(MODIFIEDTIMESTAMP, clip.getModifiedTimestamp().getTime());\r
- jsClip.put(VIDEO_FORMAT, clip.getVideoFormat());\r
- jsClip.put(VIDEO_BITRATE, clip.getVideoBitrate());\r
- jsClip.put(FILESIZE, clip.getFileSize());\r
- jsClip.put(EXTAGENCY, clip.getExtendedField(GetExtendedFieldCommand.FN_AGENCY));\r
- //jsClip.put(RECORDDATE, new DateTime(rs.getString(i++)).toDate());\r
- //jsClip.put(EXTAGENCY, rs.getString(i++));\r
- //jsClip.put(START, rs.getString(i++));\r
- //System.out.println(String.format("ID = '%s'\tXID = '%s'\tDuration = '%s'\tModified = '%s'\tVideoFormat = '%s'\tVideoBitrate = '%s'", id, xid, duration, modifiedTimestamp.getTime(), videoFormat, videoBitrate));\r
- }\r
- */\r
-\r
- private BasicDBObject convertClipToJSON(Clip clip) throws Exception {\r
+ private BasicDBObject clipToJSON(Clip clip) throws Exception {\r
BasicDBObject jsClip = new BasicDBObject();\r
try {\r
String xid = clip.getId().get();\r
Clip clip = null;\r
try {\r
clip = clips.next();\r
- BasicDBObject jsonClip = convertClipToJSON(clip);\r
+ BasicDBObject jsonClip = clipToJSON(clip);\r
String fileName = jsonClip.getString(LONGNAMEID);\r
String agency = jsonClip.getString(EXTAGENCY);\r
int duration = jsonClip.getInt(DURATION);\r
logger.info("NEXIO metadata import completed.");\r
}\r
\r
+ //END OF R\r
+ /*\r
+ private void extendJSONClip(BasicDBObject jsClip, Clip clip) throws Exception {\r
+ jsClip.put(ID, clip.getId().get()); //Unique internal ID\r
+ jsClip.put(LONGNAMEID, clip.getXid().get()); //Extended ID (Filename)\r
+ jsClip.put(DURATION, clip.getDuration());\r
+ jsClip.put(MODIFIEDTIMESTAMP, clip.getModifiedTimestamp().getTime());\r
+ jsClip.put(VIDEO_FORMAT, clip.getVideoFormat());\r
+ jsClip.put(VIDEO_BITRATE, clip.getVideoBitrate());\r
+ jsClip.put(FILESIZE, clip.getFileSize());\r
+ jsClip.put(EXTAGENCY, clip.getExtendedField(GetExtendedFieldCommand.FN_AGENCY));\r
+ //jsClip.put(RECORDDATE, new DateTime(rs.getString(i++)).toDate());\r
+ //jsClip.put(EXTAGENCY, rs.getString(i++));\r
+ //jsClip.put(START, rs.getString(i++));\r
+ //System.out.println(String.format("ID = '%s'\tXID = '%s'\tDuration = '%s'\tModified = '%s'\tVideoFormat = '%s'\tVideoBitrate = '%s'", id, xid, duration, modifiedTimestamp.getTime(), videoFormat, videoBitrate));\r
+ }\r
+ */\r
+\r
public void dropAllClipsFromMongo() {\r
db.getCollection(CLIP_COLLECTION_NAME).drop();\r
}\r
}\r
\r
/*\r
-\r
+ \r
int c = connection.read(buffer, 0, 2);\r
//2 bytes hosszan az idokozben hozzaadott id-k szamossaga\r
if (c < 2) {\r
throw new ProtocolException("c, 2, 2");\r
}\r
//MSB, LSB\r
-\r
+ \r
return nofIds;\r
*/\r
return ret;\r
}\r
}\r
\r
+ public void setNexioChangeListener(INexioChangeListener nexioChangeListener) {\r
+ this.nexioChangeListener = nexioChangeListener;\r
+ }\r
+\r
+ public void shutdown() {\r
+ executor.shutdownNow();\r
+ }\r
+\r
/*\r
BasicDBObject clip = new BasicDBObject();\r
clip.put(LONGNAMEID, rs.getString(i++));\r
}\r
*/\r
\r
- public void setNexioChangeListener(INexioChangeListener nexioChangeListener) {\r
- this.nexioChangeListener = nexioChangeListener;\r
+ public void startup() {\r
+ this.controller = new Controller(NEXIO_HOST);\r
+ try {\r
+ this.controller.connect();\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ return;\r
+ }\r
+ logger.info("NEXIO server is connected.");\r
+\r
+ this.progressListenerList = new EventListenerList();\r
+ this.dropAllClipsFromMongo();\r
+ this.ensureIndexes();\r
+\r
+ executor.submit(() -> {\r
+ try {\r
+ //1. kezdeti masolas\r
+ copyClipsIntoMongo();\r
+ //2. esemeny feliratkozas\r
+ NexioClipEventDispatcher.this.controller.getMediabase().startMediaListener();\r
+ NexioClipEventDispatcher.this.controller.getMediabase().getMediaListener().addClipEventListener(NexioClipEventDispatcher.this);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ }\r
+ });\r
}\r
\r
private String toUTF8(String iso88592) throws UnsupportedEncodingException {\r
\r
public NexioDataMiner() {\r
this.progressListenerList = new EventListenerList();\r
- db = NoSQLUtils.getDB();\r
+ db = NoSQLUtils.getNoSQLDB();\r
ensureIndexes();\r
}\r
\r
return result;\r
}\r
\r
- public static DB getDB() {\r
+ public static DB getNoSQLDB() {\r
DB result = null;\r
try {\r
result = NoSQLClient.getDB(NoSQLUtils.Url, NoSQLUtils.User, NoSQLUtils.Pass);\r
private DB db;\r
\r
public OctopusAPI() throws SQLException {\r
- db = NoSQLUtils.getDB();\r
+ db = NoSQLUtils.getNoSQLDB();\r
}\r
\r
private void addReferences(List<DBObject> result) {\r
continue;\r
BasicDBObject story = (BasicDBObject) storyObject;\r
if (story.containsKey(REF_RUNDOWN) && story.get(REF_RUNDOWN) != null) {\r
- List<DBObject> rundowns = getReferencedObjects(result, RUNDOWN_COLLECTION_NAME, REF_RUNDOWN);\r
+ List<DBObject> rundowns = getReferencedObjects(result, RUNDOWN_COLLECTION, REF_RUNDOWN);\r
story.put(REF_RUNDOWN, rundowns);\r
}\r
if (story.containsKey(REF_STORYFOLDER) && story.get(REF_STORYFOLDER) != null) {\r
- List<DBObject> storyFolders = getReferencedObjects(result, STORY_FOLDER_COLLECTION_NAME, REF_STORYFOLDER);\r
+ List<DBObject> storyFolders = getReferencedObjects(result, FOLDER_COLLECTION, REF_STORYFOLDER);\r
story.put(REF_STORYFOLDER, storyFolders);\r
}\r
}\r
@Override\r
public List<DBObject> getRundowns(Date scheduledDate) {\r
List<DBObject> result = null;\r
- DBCollection collection = db.getCollection(RUNDOWN_COLLECTION_NAME);\r
+ DBCollection collection = db.getCollection(RUNDOWN_COLLECTION);\r
Calendar calStart = CalendarUtils.createZeroCalendar(scheduledDate);\r
Calendar calStop = CalendarUtils.createZeroCalendar(scheduledDate);\r
calStop.add(Calendar.DAY_OF_MONTH, 1);\r
\r
@Override\r
public List<DBObject> getRundownsByParentStoryID(String id) {\r
- DBCollection storyCollection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection storyCollection = db.getCollection(STORY_COLLECTION);\r
DBCursor find = storyCollection.find(new BasicDBObject(PARENT_STORY_ID, id), new BasicDBObject(REF_RUNDOWN, 1));\r
if (!find.hasNext())\r
return null;\r
- return getReferencedObjects(find.toArray(), RUNDOWN_COLLECTION_NAME, REF_RUNDOWN);\r
+ return getReferencedObjects(find.toArray(), RUNDOWN_COLLECTION, REF_RUNDOWN);\r
}\r
\r
@Override\r
public List<DBObject> getRundownsByPlaceHolderID(String id) {\r
//db.testStoryCollection.find({"mosObjects": {$elemMatch: {"globalId": "OCTOPUS-ECHOTV-2429902"}}})\r
- DBCollection storyCollection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection storyCollection = db.getCollection(STORY_COLLECTION);\r
BasicDBObject criteria = new BasicDBObject(MOS_OBJECTS, new BasicDBObject($ELEMMATCH, new BasicDBObject(OBJ_ID, id)));\r
DBCursor find = storyCollection.find(criteria, new BasicDBObject(REF_RUNDOWN, 1));\r
if (!find.hasNext())\r
return null;\r
- return getReferencedObjects(find.toArray(), RUNDOWN_COLLECTION_NAME, REF_RUNDOWN);\r
+ return getReferencedObjects(find.toArray(), RUNDOWN_COLLECTION, REF_RUNDOWN);\r
}\r
\r
@Override\r
// db.stories.find({ rundown: { $elemMatch: { id: 92950867 } }})\r
// { rundown: { $elemMatch: { id: 44622396 } }}\r
List<DBObject> result = null;\r
- DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection collection = db.getCollection(STORY_COLLECTION);\r
DBCursor find = collection\r
.find(new BasicDBObject(REF_RUNDOWN, new BasicDBObject($ELEMMATCH, new BasicDBObject(ID, id))), new BasicDBObject(ID, 1)\r
.append(PARENT_STORY_ID, 1).append(NAME, 1).append(MODIFIED, 1).append(REF_RUNDOWN, 1).append(FORMAT, 1).append(MOS_OBJECTS, 1))\r
@Override\r
public List<DBObject> getStories() {\r
List<DBObject> result = null;\r
- DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection collection = db.getCollection(STORY_COLLECTION);\r
DBCursor find = collection.find();\r
if (find.hasNext())\r
result = find.toArray();\r
@Override\r
public List<DBObject> getStoriesByID(String id) {\r
List<DBObject> result = null;\r
- DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection collection = db.getCollection(STORY_COLLECTION);\r
DBCursor find = collection.find(new BasicDBObject(ID, id));\r
if (find.hasNext()) {\r
result = find.toArray();\r
//Pattern regex = Pattern.compile(id, Pattern.CASE_INSENSITIVE);\r
//BasicDBObject query = new BasicDBObject("id", Pattern.compile(id));\r
List<DBObject> result = null;\r
- DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection collection = db.getCollection(STORY_COLLECTION);\r
DBCursor find = collection.find(new BasicDBObject(PARENT_STORY_ID, id));\r
if (find.hasNext()) {\r
result = find.toArray();\r
@Override\r
public List<DBObject> getStoriesByPlaceHolderID(String id) {\r
List<DBObject> result = new ArrayList<>();\r
- DBCollection storyCollection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection storyCollection = db.getCollection(STORY_COLLECTION);\r
BasicDBObject criteria = new BasicDBObject(MOS_OBJECTS, new BasicDBObject($ELEMMATCH, new BasicDBObject(OBJ_ID, id)));\r
DBCursor find = storyCollection.find(criteria);\r
if (find.hasNext()) {\r
@Override\r
public List<DBObject> getStoryFolders() {\r
List<DBObject> result = null;\r
- DBCollection collection = db.getCollection(STORY_FOLDER_COLLECTION_NAME);\r
+ DBCollection collection = db.getCollection(FOLDER_COLLECTION);\r
DBCursor find = collection.find();\r
if (find.hasNext())\r
result = find.toArray();\r
\r
@Override\r
public List<DBObject> getStoryFoldersByParentStoryID(String id) {\r
- DBCollection storyCollection = db.getCollection(STORY_COLLECTION_NAME);\r
- DBCursor find = storyCollection.find(new BasicDBObject(ID, id), new BasicDBObject(REF_STORYFOLDER, 1));\r
+ DBCollection storyCollection = db.getCollection(STORY_COLLECTION);\r
+ DBCursor find = storyCollection.find(new BasicDBObject(PARENT_STORY_ID, id), new BasicDBObject(REF_STORYFOLDER, 1));\r
if (!find.hasNext())\r
return null;\r
- return getReferencedObjects(find.toArray(), STORY_FOLDER_COLLECTION_NAME, REF_STORYFOLDER);\r
+ return getReferencedObjects(find.toArray(), FOLDER_COLLECTION, REF_STORYFOLDER);\r
}\r
\r
@Override\r
public List<DBObject> getStoryFoldersByPlaceHolderID(String id) {\r
- DBCollection storyCollection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection storyCollection = db.getCollection(STORY_COLLECTION);\r
BasicDBObject criteria = new BasicDBObject(MOS_OBJECTS, new BasicDBObject($ELEMMATCH, new BasicDBObject(OBJ_ID, id)));\r
DBCursor find = storyCollection.find(criteria, new BasicDBObject(REF_STORYFOLDER, 1));\r
if (!find.hasNext())\r
return null;\r
- return getReferencedObjects(find.toArray(), STORY_FOLDER_COLLECTION_NAME, REF_STORYFOLDER);\r
+ return getReferencedObjects(find.toArray(), FOLDER_COLLECTION, REF_STORYFOLDER);\r
}\r
\r
@Override\r
public List<DBObject> getStoryFolderStories(long storyFolderId) {\r
List<DBObject> result = null;\r
- DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
+ DBCollection collection = db.getCollection(STORY_COLLECTION);\r
DBCursor find = collection\r
.find(new BasicDBObject(REF_STORYFOLDER, new BasicDBObject($ELEMMATCH, new BasicDBObject(ID, storyFolderId))), new BasicDBObject(ID, 1)\r
.append(PARENT_STORY_ID, 1).append(NAME, 1).append(MODIFIED, 1).append(REF_STORYFOLDER, 1).append(FORMAT, 1).append(MOS_OBJECTS, 1))\r
import org.apache.commons.net.ftp.FTP;\r
import org.apache.commons.net.ftp.FTPClient;\r
import org.apache.commons.net.ftp.FTPFile;\r
+import org.apache.commons.net.ftp.FTPFileFilter;\r
\r
import user.commons.IRemoteFileListCallback;\r
import user.commons.RemoteFile;\r
}\r
\r
private void connect() throws Exception {\r
+ if (ftpClient != null)\r
+ return;\r
String path = storeUri.toString(true);\r
String[] pathElements = path.split("/");\r
- if (ftpClient == null) {\r
- ftpClient = new FTPClient();\r
- if (storeUri.getPortNumber() != null)\r
- ftpClient.connect(pathElements[0], storeUri.getPortNumber().intValue());\r
- else\r
- ftpClient.connect(pathElements[0]);\r
- String userName = storeUri.getUserName();\r
- userName = StringUtils.isEmpty(userName) ? "anonymous" : userName;\r
- ftpClient.login(userName, storeUri.getPassword());\r
- ftpClient.setFileType(FTP.BINARY_FILE_TYPE);\r
- ftpClient.enterLocalPassiveMode();\r
- if (pathElements.length > 1) {\r
- for (int i = 1; i < pathElements.length; i++) {\r
- ftpClient.changeWorkingDirectory(pathElements[i]);\r
- }\r
+ ftpClient = new FTPClient();\r
+ if (storeUri.getPortNumber() != null)\r
+ ftpClient.connect(pathElements[0], storeUri.getPortNumber().intValue());\r
+ else\r
+ ftpClient.connect(pathElements[0]);\r
+ String userName = storeUri.getUserName();\r
+ userName = StringUtils.isEmpty(userName) ? "anonymous" : userName;\r
+ ftpClient.login(userName, storeUri.getPassword());\r
+ ftpClient.setFileType(FTP.BINARY_FILE_TYPE);\r
+ ftpClient.enterLocalPassiveMode();\r
+ if (pathElements.length > 1) {\r
+ for (int i = 1; i < pathElements.length; i++) {\r
+ ftpClient.changeWorkingDirectory(pathElements[i]);\r
}\r
}\r
+\r
}\r
\r
@Override\r
}\r
}\r
\r
+ @Override\r
+ public boolean exists(String fileName) throws Exception {\r
+ connect();\r
+ if (ftpClient == null)\r
+ return false;\r
+ // FTPFile[] files = ftpClient.listFiles(ftpClient.printWorkingDirectory(), new FTPFileFilter() {\r
+ // @Override\r
+ // public boolean accept(FTPFile paramFTPFile) {\r
+ // return fileName.equals(paramFTPFile.getName());\r
+ // }\r
+ // });\r
+ FTPFile[] files = ftpClient.listFiles(null, new FTPFileFilter() {\r
+ @Override\r
+ public boolean accept(FTPFile paramFTPFile) {\r
+ return !paramFTPFile.isDirectory() && fileName.toLowerCase().equals(paramFTPFile.getName().toLowerCase());\r
+ }\r
+ });\r
+\r
+ return files.length == 1;\r
+ }\r
+\r
@Override\r
public RemoteFile get(String fileName) throws Exception {\r
RemoteFile result = null;\r
\r
void delete(RemoteFile remoteFile) throws Exception;\r
\r
+ boolean exists(String fileName) throws Exception;\r
+\r
RemoteFile get(String fileName) throws Exception;\r
\r
InputStream getInputStream(RemoteFile remoteFile) throws Exception;\r
import java.io.FileOutputStream;\r
import java.io.InputStream;\r
import java.io.OutputStream;\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
import java.sql.Timestamp;\r
import java.util.ArrayList;\r
import java.util.Arrays;\r
\r
}\r
\r
+ @Override\r
+ public boolean exists(String fileName) throws Exception {\r
+ Path path = Paths.get(storeUri.toString(true), fileName);\r
+ return path.toFile().exists();\r
+ }\r
+\r
@Override\r
public RemoteFile get(String fileName) throws Exception {\r
String path = storeUri.toString(true);\r
}\r
}\r
\r
+ @Override\r
+ public boolean exists(String fileName) throws Exception {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
+ }\r
+\r
@Override\r
public RemoteFile get(String fileName) throws Exception {\r
RemoteFile result = null;\r
\r
}\r
\r
+ @Override\r
+ public boolean exists(String fileName) throws Exception {\r
+ // TODO Auto-generated method stub\r
+ return false;\r
+ }\r
+\r
@Override\r
public RemoteFile get(String fileName) throws Exception {\r
RemoteFile result = null;\r
package user.jobengine.db;\r
\r
+import java.net.URI;\r
import java.sql.Timestamp;\r
import java.util.Date;\r
import java.util.List;\r
import user.jobengine.db.ItemManagerData.UserRight;\r
\r
/***\r
- * Adatbázis kezelő API. Az implementáció OSGI szolgáltatásként érhető el ezen\r
- * az interfészen keresztül. Az API főbb szolgáltatásai: az adatmodell\r
- * objektumainak létrehozása, módosítása, törlése az adatbázisban.\r
- * \r
+ * Adatbázis kezelő API. Az implementáció OSGI szolgáltatásként érhető el ezen az interfészen keresztül. Az API főbb szolgáltatásai: az adatmodell objektumainak\r
+ * létrehozása, módosítása, törlése az adatbázisban.\r
+ *\r
* @author comtrans\r
- * \r
+ *\r
*/\r
public interface IItemManager extends IEntityPersister {\r
/**\r
\r
/**\r
* A megfelelő bemeneti paramétrekekkel meghívja a connect() függvényt.\r
- * \r
+ *\r
* @param dbUrl\r
* Adatbázis elérési útvonala\r
* @param dbUser\r
*/\r
void connect(String dbUrl, String dbUser, String dbPassword);\r
\r
- FileType createFileType(String name, String description, String videoCodec, String audioCodec, int videoTracks,\r
- int audioTracks, float frameRate);\r
+ FileType createFileType(String name, String description, String videoCodec, String audioCodec, int videoTracks, int audioTracks, float frameRate);\r
+\r
+ Item createItem(String name, String description, String houseId);\r
\r
Item createItem(String itemTypeName, String name, String description, String houseId);\r
\r
\r
Metadata createMetadata(MetadataElement mde, ListType listType, GuiType guiType, MdType... flags);\r
\r
- Metadata createMetadata(MetadataElement mde, ListType listType, GuiType guiType, String sqlField,\r
- StaticTables staticTable, String pojoField, MdType... flags);\r
+ Metadata createMetadata(MetadataElement mde, ListType listType, GuiType guiType, String sqlField, StaticTables staticTable, String pojoField,\r
+ MdType... flags);\r
\r
Metadata createMetadata(MetadataElement mde, MdType... flags);\r
\r
\r
StoreUri createStoreUri(RemoteStoreProtocol protocol, String uri);\r
\r
- StoreUri createStoreUri(RemoteStoreProtocol protocol, String uri, int portNumber, boolean isStream,\r
- boolean isSource, boolean isTarget, String userName, String password, String rootPath);\r
+ StoreUri createStoreUri(RemoteStoreProtocol protocol, String uri, int portNumber, boolean isStream, boolean isSource, boolean isTarget, String userName,\r
+ String password, String rootPath);\r
+\r
+ StoreUri createStoreUri(URI uri);\r
\r
UserInfo createUser(String fullName, String userName, String password, UserRight[] rights);\r
\r
+ WorkflowAction createWorkflowAction(Timestamp touched, Timestamp started, Timestamp finished, boolean successful, String houseId, String description,\r
+ String source, String destination, String tag, long size);\r
+\r
void disconnect();\r
\r
/**\r
- * A type paraméterből lekéri az entitás DAO objektumát, amin keresztül\r
- * visszakapjuk az összes entitást.\r
- * \r
+ * A type paraméterből lekéri az entitás DAO objektumát, amin keresztül visszakapjuk az összes entitást.\r
+ *\r
* @param type\r
* @return\r
*/\r
\r
/**\r
* Entitás típus és azonosító alapján visszaad egy listát.\r
- * \r
+ *\r
* @param type\r
* @param id\r
* @return\r
\r
/**\r
* Visszaadja egy átmeneti tárolóban tárolt entitás listáját.\r
- * \r
+ *\r
* @param baseClass\r
* @return\r
*/\r
\r
/**\r
* Visszaadja az entitásnak megfelelő DAO objektumot.\r
- * \r
+ *\r
* @param classInfo\r
* @return\r
*/\r
Break getBreak(long id);\r
\r
/**\r
- * Elkéri a FileTypeDAO-tól a bemeneti paraméterként kapott névvel\r
- * rendelekző FileType-ot.\r
- * \r
+ * Elkéri az összes dinamikus anyag típust.\r
+ *\r
+ * @return\r
+ */\r
+ List<ItemType> getDynamicItemTypes();\r
+\r
+ /**\r
+ * Elkéri a FileTypeDAO-tól a bemeneti paraméterként kapott névvel rendelekző FileType-ot.\r
+ *\r
* @param name\r
* @return\r
*/\r
\r
/**\r
* Visszaad egy szűrési feltételeknek megfelelő Domain listát.\r
- * \r
+ *\r
* @param domainCategoryId\r
* @param filter\r
* @return\r
\r
/**\r
* Visszaad egy szűrési feltételeknek megfelelő QueryObject listát.\r
- * \r
+ *\r
* @param filter\r
* @param isChunked\r
* @return\r
\r
/**\r
* Visszaad egy szűrési feltételeknek megfelelő Vágólista listát.\r
- * \r
+ *\r
* @param name\r
* @param isChunked\r
* @return\r
List<IEntityBase> getFilteredScene(String name, boolean isChunked);\r
\r
/**\r
- * A bemenő paraméterként kapott azonosító alaján lekéri a megfelelő Mappa\r
- * objektumokat.\r
- * \r
+ * A bemenő paraméterként kapott azonosító alaján lekéri a megfelelő Mappa objektumokat.\r
+ *\r
* @param id\r
* @return\r
*/\r
List<IEntityBase> getFolders(long id);\r
\r
- /**\r
- * A bemenő paraméterként kapott azonosító alaján lekéri a megfelelő Szkript\r
- * objektumokat.\r
- * \r
- * @param id\r
- * @return\r
- */\r
- List<IEntityBase> getShots(long id);\r
+ Item getItemByHouseID(String houseID);\r
+\r
+ ItemType getItemType(String itemTypeName);\r
\r
/**\r
* Elkéri az összes anyag típust.\r
- * \r
+ *\r
* @return\r
*/\r
List<ItemType> getItemTypes();\r
\r
- /**\r
- * Elkéri az összes dinamikus anyag típust.\r
- * \r
- * @return\r
- */\r
- List<ItemType> getDynamicItemTypes();\r
-\r
- /**\r
- * Elkéri az fix anyag típust.\r
- * \r
- * @return\r
- */\r
- ItemType getStaticItemType();\r
-\r
/**\r
* Azonosító alapján elkér egy Verzió objektumot.\r
- * \r
+ *\r
* @param id\r
* @return\r
*/\r
\r
/**\r
* Azonosító alapján elkér egy Metaadat elem objektumot.\r
- * \r
+ *\r
* @param id\r
* @return\r
*/\r
\r
/**\r
* Visszaadja az adatbázisban tárolt összes Metaadat elem listáját.\r
- * \r
+ *\r
* @return\r
*/\r
List<MetadataElement> getMetadataElements();\r
\r
/**\r
* Azonosító alapján elkér egy Metadatat típus objektumot.\r
- * \r
+ *\r
* @param id\r
* @return\r
*/\r
MetadataType getMetadataType(long id);\r
\r
+ List<Job> getRunningJobs(String template);\r
+\r
/**\r
* Azonosító alapján elkér egy Vágólista objektumot.\r
- * \r
+ *\r
* @param id\r
* @return\r
*/\r
\r
/**\r
* Név és időpont alapján elkéri a megfelelő Vágólista objektumokat.\r
- * \r
+ *\r
* @param name\r
* @param created\r
* @return\r
\r
/**\r
* Azonosító alapján elkér egy Szkript objektumot.\r
- * \r
+ *\r
* @param id\r
* @return\r
*/\r
Shot getShot(long id);\r
\r
+ /**\r
+ * A bemenő paraméterként kapott azonosító alaján lekéri a megfelelő Szkript objektumokat.\r
+ *\r
+ * @param id\r
+ * @return\r
+ */\r
+ List<IEntityBase> getShots(long id);\r
+\r
+ /**\r
+ * Elkéri az fix anyag típust.\r
+ *\r
+ * @return\r
+ */\r
+ ItemType getStaticItemType();\r
+\r
/**\r
* Azonosító alapján elkér egy Tároló objektumot.\r
- * \r
+ *\r
* @param id\r
* @return\r
*/\r
\r
/**\r
* Név alapján elkér egy Szkript objektumot.\r
- * \r
+ *\r
* @param name\r
* @return\r
*/\r
Store getStore(String name);\r
\r
/**\r
- * Elkér a StoreDAO-tól, egy olyan Rendszer tárolót, amely a lowres\r
- * paraméterben kapott érték alapján vagy kisfelbontású videók tárolója,\r
- * vagy nem.\r
- * \r
+ * Elkér a StoreDAO-tól, egy olyan Rendszer tárolót, amely a lowres paraméterben kapott érték alapján vagy kisfelbontású videók tárolója, vagy nem.\r
+ *\r
* @param lowres\r
* @return\r
*/\r
Store getSystemStore(boolean lowres);\r
\r
/**\r
- * Ha a bemeneti paraméter alapján létezik ilyen felhasználó, akkor true-val\r
- * tér vissza.\r
- * \r
+ * Ha a bemeneti paraméter alapján létezik ilyen felhasználó, akkor true-val tér vissza.\r
+ *\r
* @param userName\r
* @param password\r
* @return\r
boolean getUser(String userName, String password);\r
\r
/**\r
- * A bemeneti paraméterként megadott felhasználónév/jelszó páros alapján\r
- * visszaad egy UserInfo objektumot.\r
- * \r
+ * A bemeneti paraméterként megadott felhasználónév/jelszó páros alapján visszaad egy UserInfo objektumot.\r
+ *\r
* @param userName\r
* @param password\r
* @return\r
*/\r
UserInfo getUserInfo(String userName, String password);\r
\r
+ List<WorkflowAction> getWorkflowActions(Date date);\r
+\r
+ void merge(IEntityBase entity);\r
+\r
+ void mergeItemStructure(Item item);\r
+\r
/**\r
- * A bemeneti paraméterként kapott típus és azonosító lista alapján\r
- * eltávolítja a megfelelő adatbázis bejegyzéseket.\r
- * \r
+ * A bemeneti paraméterként kapott típus és azonosító lista alapján eltávolítja a megfelelő adatbázis bejegyzéseket.\r
+ *\r
* @param type\r
* @param ids\r
*/\r
void remove(Class<? extends IEntityBase> type, List<Long> ids);\r
\r
/**\r
- * A bemeneti paraméterként kapott típus és azonosító alapján az objektumot\r
- * eltávolítja az átmeneti tárolóból.\r
- * \r
+ * A bemeneti paraméterként kapott típus és azonosító alapján az objektumot eltávolítja az átmeneti tárolóból.\r
+ *\r
* @param baseClass\r
* @param key\r
*/\r
void removeCached(Class<? extends IEntityBase> baseClass, Object key);\r
\r
/**\r
- * A bemeneti paraméterként kapott típus és kulcs alapján elkéri a megfelelő\r
- * objektumot az átmeneti tárolóból.\r
- * \r
+ * A bemeneti paraméterként kapott típus és kulcs alapján elkéri a megfelelő objektumot az átmeneti tárolóból.\r
+ *\r
* @param baseClass\r
* @param key\r
* @return\r
IEntityBase retrieveCached(Class<? extends IEntityBase> baseClass, Object key);\r
\r
/**\r
- * A bemeneti paraméterként kapott keresési feltételeknek megfelelő\r
- * Anyagokat lekéri az adatbázisból és SearchResult objektumba csomagolva\r
- * visszatér.\r
- * \r
+ * A bemeneti paraméterként kapott keresési feltételeknek megfelelő Anyagokat lekéri az adatbázisból és SearchResult objektumba csomagolva visszatér.\r
+ *\r
* @param parameter\r
* @return\r
*/\r
List<SearchResult> searchItem(QueryObject parameter);\r
\r
+ SearchResult searchItem(String criteria, int fromResult, int toResult);\r
+\r
/**\r
- * A bemeneti paraméterként kapott keresési feltételeknek megfelelő\r
- * Munkafolyamatokat lekéri az adaatbázisból.\r
- * \r
+ * A bemeneti paraméterként kapott keresési feltételeknek megfelelő Munkafolyamatokat lekéri az adaatbázisból.\r
+ *\r
* @param parameter\r
* @return\r
*/\r
List<Job> searchJob(QueryObject parameter);\r
\r
/**\r
- * A kapott három paraméter alapján létrehoz egy Signal objektumot,\r
- * átkonvertálja bájt tömbbé és beteszi a Signalserver üzenetküldő sorába.\r
- * \r
+ * A kapott három paraméter alapján létrehoz egy Signal objektumot, átkonvertálja bájt tömbbé és beteszi a Signalserver üzenetküldő sorába.\r
+ *\r
* @param id\r
* @param signalType\r
* @param staticTable\r
\r
/**\r
* Egy azonosítót és entitást elhelyez az átmeneti tárolóban.\r
- * \r
+ *\r
* @param key\r
* @param entity\r
* @return\r
boolean storeCached(Object key, IEntityBase entity);\r
\r
/**\r
- * Kivétel dobása esetén a kivétel üzenetét és a keletkezés helyét\r
- * becsomagolja egy string-be, majd átadja a logger-nek.\r
- * \r
+ * Kivétel dobása esetén a kivétel üzenetét és a keletkezés helyét becsomagolja egy string-be, majd átadja a logger-nek.\r
+ *\r
* @param e\r
*/\r
void throwError(Exception e);\r
\r
/**\r
- * Kiloggolja az kapott művelethez tartozó objektum típusát és a metódus\r
- * nevét.\r
+ * Kiloggolja az kapott művelethez tartozó objektum típusát és a metódus nevét.\r
*/\r
void traceIn();\r
\r
/**\r
- * Kiloggolja az kapott művelet végén az objektum típusát és a metódus\r
- * nevét.\r
+ * Kiloggolja az kapott művelet végén az objektum típusát és a metódus nevét.\r
*/\r
void traceOut();\r
\r
\r
/**\r
* Törli a bemeneti paraméterként kapott entitás adatbázis bejegyzéseit.\r
- * \r
+ *\r
* @param classInfo\r
*/\r
void truncate(Class<? extends IEntityBase> classInfo);\r
-\r
- Item createItem(String name, String description, String houseId);\r
-\r
- SearchResult searchItem(String criteria, int fromResult, int toResult);\r
-\r
- Item getItemByHouseID(String houseID);\r
-\r
- List<Job> getRunningJobs(String template);\r
-\r
- ItemType getItemType(String itemTypeName);\r
-\r
- WorkflowAction createWorkflowAction(Timestamp touched, Timestamp started, Timestamp finished, boolean successful,\r
- String houseId, String description, String source, String destination, String tag, long size);\r
-\r
- List<WorkflowAction> getWorkflowActions(Date date);\r
-\r
- void mergeItemStructure(Item item);\r
-\r
- void merge(IEntityBase entity);\r
}
\ No newline at end of file
package user.jobengine.db;\r
\r
+import java.net.URI;\r
import java.sql.ResultSet;\r
import java.sql.SQLException;\r
import java.sql.Statement;\r
return entity;\r
}\r
\r
+ @Override\r
+ public StoreUri createStoreUri(URI uri) {\r
+ StoreUri result = createStoreUri(RemoteStoreProtocol.fromString(uri.toString()), uri.getHost(), uri.getPort(), false, false, false, null, null, null);\r
+ result.setRootPath(uri.getPath());\r
+ return result;\r
+ }\r
+\r
@Override\r
public UserInfo createUser(String fullName, String userName, String password, UserRight[] rights) {\r
traceIn();\r
Parser parser = new Parser(stream);
Encoder encoder = new Encoder();
JobTemplate template = parser.parse();
+ template.validate();
template.setFileName(fileName);
IProgram program = (IProgram) encoder.visitJobTemplate(template, null);
Parser parser = new Parser(stream);
Encoder encoder = new Encoder();
JobTemplate jobTemplate = parser.parse();
+ jobTemplate.validate();
jobTemplate.setFileName(name);
IProgram program = (IProgram) encoder.visitJobTemplate(jobTemplate, null);
programs.put(name, program);
package user.jobengine.server.ast;\r
\r
+import java.util.ArrayList;\r
+import java.util.HashMap;\r
+import java.util.List;\r
+import java.util.Map;\r
+\r
/**\r
* Gy�k�r oszt�ly.\r
*/\r
return declarationSequence;\r
}\r
\r
- public void setCommandSequence(CommandSequence commandSequence) {\r
- this.commandSequence = commandSequence;\r
- }\r
-\r
- public void setDeclarationSequence(DeclarationSequence declarationSequence) {\r
- this.declarationSequence = declarationSequence;\r
- }\r
-\r
- @Override\r
- public Object visit(Visitor v, Object o) {\r
- return v.visitJobTemplate(this, o);\r
+ public String getDescription() {\r
+ return description;\r
}\r
\r
public String getFileName() {\r
return fileName;\r
}\r
\r
- public void setFileName(String fileName) {\r
- this.fileName = fileName;\r
- }\r
-\r
public String getName() {\r
return name;\r
}\r
\r
- public void setName(String name) {\r
- this.name = name;\r
+ public boolean isMultiInstance() {\r
+ return multiInstance;\r
}\r
\r
- public String getDescription() {\r
- return description;\r
+ public void setCommandSequence(CommandSequence commandSequence) {\r
+ this.commandSequence = commandSequence;\r
+ }\r
+\r
+ public void setDeclarationSequence(DeclarationSequence declarationSequence) {\r
+ this.declarationSequence = declarationSequence;\r
}\r
\r
public void setDescription(String description) {\r
this.description = description;\r
}\r
\r
- public boolean isMultiInstance() {\r
- return multiInstance;\r
+ public void setFileName(String fileName) {\r
+ this.fileName = fileName;\r
}\r
\r
public void setMultiInstance(boolean multiInstance) {\r
this.multiInstance = multiInstance;\r
}\r
+\r
+ public void setName(String name) {\r
+ this.name = name;\r
+ }\r
+\r
+ public List<String> validate() throws Exception {\r
+ Map<String, String> parameters = new HashMap<>();\r
+ Map<String, String> variables = new HashMap<>();\r
+ List<String> inputvariables = new ArrayList<>();\r
+ List<String> inputparameters = new ArrayList<>();\r
+ List<String> errors = new ArrayList<>();\r
+ if (declarationSequence != null) {\r
+ for (Declaration declaration : declarationSequence.getDeclarations()) {\r
+ if (declaration instanceof ParameterDeclaration)\r
+ parameters.put(declaration.getName(), declaration.getType());\r
+ if (declaration instanceof VariableDeclaration)\r
+ variables.put(declaration.getName(), declaration.getType());\r
+ }\r
+ }\r
+\r
+ if (commandSequence != null) {\r
+ for (Command command : commandSequence.getCommands()) {\r
+ if (command instanceof CallJobStepCommand) {\r
+ ParameterSequence inputParameterSequence = ((CallJobStepCommand) command).getInputParameterSequence();\r
+ if (inputParameterSequence != null) {\r
+ for (Parameter parameter : inputParameterSequence.getParameters()) {\r
+ Expression expression = ((InputParameter) parameter).getExpression();\r
+ if (expression instanceof VariableExpression) {\r
+ if (!inputvariables.contains(expression.getName()))\r
+ inputvariables.add(expression.getName());\r
+ }\r
+ if (expression instanceof ParameterExpression) {\r
+ if (!inputparameters.contains(expression.getName()))\r
+ inputparameters.add(expression.getName());\r
+ }\r
+ }\r
+ }\r
+ ParameterSequence outputParameterSequence = ((CallJobStepCommand) command).getOutputParameterSequence();\r
+ if (outputParameterSequence != null) {\r
+ for (Parameter parameter : outputParameterSequence.getParameters()) {\r
+ VariableName name = ((OutputParameter) parameter).getVariableName();\r
+ if (!inputvariables.contains(name.getName()))\r
+ inputvariables.add(name.getName());\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ for (String input : inputvariables) {\r
+ if (!variables.containsKey(input))\r
+ errors.add(String.format("Variable declaration missing for '%s'.", input));\r
+ }\r
+ for (String input : inputparameters) {\r
+ if (!parameters.containsKey(input))\r
+ errors.add(String.format("Parameter declaration missing for '%s'.", input));\r
+ }\r
+\r
+ }\r
+\r
+ if (errors.size() > 0) {\r
+ StringBuilder sb = new StringBuilder();\r
+ errors.forEach(e -> sb.append(e));\r
+ throw new Exception("JobTemplate validation error: " + sb.toString());\r
+ }\r
+ return errors;\r
+ }\r
+\r
+ @Override\r
+ public Object visit(Visitor v, Object o) {\r
+ return v.visitJobTemplate(this, o);\r
+ }\r
}\r
logger.info("NexioAPIServlet created");
// messagePool = new NexioAPIServletMessagePool(3, sessions);
instance = this;
- this.dispatcher = new NexioClipEventDispatcher();
- this.dispatcher.setNexioChangeListener(this);
+ dispatcher = new NexioClipEventDispatcher();
+ dispatcher.setNexioChangeListener(this);
+ //dispatcher.startup();
logger.info("NexioWSServlet has been initialized.");
/*
BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
if (bundleContext != null) {
ServiceRegistration<INexioChangeListener> registerService = bundleContext
.registerService(INexioChangeListener.class, this, null);
-
+
logger.info("{} successfully registered", INexioChangeListener.class.getSimpleName());
}
*/