git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 2 Oct 2017 18:45:04 +0000 (18:45 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Mon, 2 Oct 2017 18:45:04 +0000 (18:45 +0000)
28 files changed:
server/-configuration/log4j2.xml
server/-configuration/scheduledjobs.json
server/-dependencies/jobengine.target
server/user.jobengine.executors/config/config.xml
server/user.jobengine.executors/jobtemplates/archive-material.xml [moved from server/user.jobengine.executors/jobtemplates/archive-item.xml with 100% similarity]
server/user.jobengine.executors/jobtemplates/archive-ondemand.xml
server/user.jobengine.executors/jobtemplates/delete-materials.xml [new file with mode: 0644]
server/user.jobengine.executors/jobtemplates/delete-nexio-materials.xml [new file with mode: 0644]
server/user.jobengine.executors/jobtemplates/sync-octopus.xml [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveListBuilderStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveMaterialSubmitStep.java [moved from server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveItemSubmitStep.java with 87% similarity]
server/user.jobengine.executors/src/user/jobengine/server/steps/DeleteMaterialsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/DeleteNEXIOMaterialsStep.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/NexioDeleteMaterialsStep.java [deleted file]
server/user.jobengine.executors/src/user/jobengine/server/steps/OCTOPUSDataMinerStep.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/SelenioLowresTranscodeStep.java
server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF
server/user.jobengine.osgi.commons/src/user/commons/StoreUri.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioClipEventDispatcher.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/api/MediaListener.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/OctopusDataMiner.java
server/user.jobengine.osgi.commons/src/user/commons/remotestore/FtpDirectoryLister.java
server/user.jobengine.osgi.commons/src/user/commons/remotestore/IDirectoryLister.java
server/user.jobengine.osgi.commons/src/user/commons/remotestore/LocalDirectoryLister.java
server/user.jobengine.osgi.commons/src/user/commons/remotestore/SambaDirectoryLister.java
server/user.jobengine.osgi.commons/src/user/commons/remotestore/TSMLister.java
server/user.jobengine.osgi.db/src/user/jobengine/db/JobDAO.sqlj
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/JobStep.java

index 3a675331ad58d1bdb213e4cd531ac6cb0f1b37e0..b7eb36e60f66f8f4e52e7e50b8a9fa1545cfdbb7 100644 (file)
@@ -61,5 +61,6 @@
                <logger name="org.jboss.resteasy.specimpl" level="debug" />\r
                <logger name="org.jboss.resteasy.plugins.server" level="debug" />\r
                <logger name="org.jboss.resteasy.plugins.providers" level="debug" />\r
+               <logger name="user.commons.nexio.api" level="debug" />\r
        </Loggers>\r
 </Configuration>
\ No newline at end of file
index 28603a4128cf5b80ed8a6bf71faf71e75380d314..0c947a478fd13cae1ddce166da6288e0eb1be180 100644 (file)
@@ -1,7 +1,7 @@
 {"joblist":[\r
        {\r
       "active": false,\r
-         "name" : "On-demand archiválás",\r
+         "name" : "Felhasználói archiválás",\r
       "template": "archive-ondemand.xml",\r
       "executeimmediate": true,\r
       "cronexpression": "0 0 0/1 1/1 * ? *",\r
        },\r
        {\r
       "active": false,\r
-         "name" : "NEXIO adatok szinkronizása",\r
-      "template": "nexio-sync.xml",\r
+         "name" : "Anyagok törlése",\r
+      "template": "delete-materials.xml",\r
       "executeimmediate": true,\r
-      "cronexpression": "0/20 * * ? * *"\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "inputFolder", "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
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+         "name" : "NEXIO anyagok törlése",\r
+      "template": "delete-nexio-materials.xml",\r
+      "executeimmediate": true,\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "port", "value": 21, "type": "java.lang.Integer"},\r
+       {"name": "userName", "value": "dani", "type": "java.lang.String"},\r
+       {"name": "password", "value": "dani", "type": "java.lang.String"}\r
+      ]\r
+       },      \r
+       {\r
+      "active": false,\r
+         "name" : "OCTOPUS adatok szinkronizálása",\r
+      "template": "sync-octopus.xml",\r
+      "executeimmediate": true,\r
+      "cronexpression": "0 0 0/1 1/1 * ? *"\r
        },      \r
        {\r
       "active": false,\r
index bcf2d38703955b8330ff9f628bacf27a964f7bfe..30aade6b40edd39c5c6b0434d72f5cf23391c5ef 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<?pde version="3.8"?><target name="JobEngine" sequenceNumber="229">\r
+<?pde version="3.8"?><target name="JobEngine" sequenceNumber="233">\r
 <locations>\r
 <location path="${eclipse_home}" type="Profile"/>\r
 <location path="${workspace_loc}/-dependencies/target/repository/plugins" type="Directory"/>\r
 <plugin id="org.eclipse.osgi" version="3.11.2.v20161107-1947"/>\r
 <plugin id="org.eclipse.osgi.services" version="3.2.100.v20100503"/>\r
 <plugin id="org.eclipse.osgi.util"/>\r
+<plugin id="org.glassfish.jersey.core.jersey-common" version="2.23.2"/>\r
 <plugin id="org.glassfish.web.javax.servlet.jsp"/>\r
 <plugin id="org.glassfish.web.javax.servlet.jsp.jstl"/>\r
 <plugin id="org.hamcrest.core" version="1.3.0.v201303031735"/>\r
index 9ac90b92be6ba98f5fddef8ae0e04664ab8e6b15..3b8fa33f09be8e089c54461fc36c31e774ccff6c 100644 (file)
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <executors>\r
-       <executor className="user.jobengine.server.steps.ArchiveItemSubmitStep" maxConcurrent="1"/>\r
+       <executor className="user.jobengine.server.steps.ArchiveMaterialSubmitStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.ArchiveListBuilderStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.FakeStep" maxConcurrent="10"/>\r
        <executor className="user.jobengine.server.steps.MetadataTransformStep" maxConcurrent="1"/>\r
index c06878eeda06bfdb118766c098feb673707aff72..956b84c19e3a1d234a91e5a00a546fc2013038c5 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<jobtemplate name="Kézi archiválás">\r
+<jobtemplate name="Felhasználói archiválás">\r
 <declarations>\r
        <parameters>\r
                <parameter name="inputFolder" type="java.lang.String"/>\r
@@ -23,7 +23,7 @@
                </outputs>\r
        </calljobstep>\r
        \r
-       <calljobstep id="step2" type="user.jobengine.server.steps.ArchiveItemSubmitStep" weight="1">\r
+       <calljobstep id="step2" type="user.jobengine.server.steps.ArchiveMaterialSubmitStep" weight="1">\r
                <inputs>\r
                        <input>\r
                                <parameter name="globalInputFolder" />\r
diff --git a/server/user.jobengine.executors/jobtemplates/delete-materials.xml b/server/user.jobengine.executors/jobtemplates/delete-materials.xml
new file mode 100644 (file)
index 0000000..96f53ce
--- /dev/null
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Anyagok törlése">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="inputFolder" type="java.lang.String"/>\r
+                       <parameter name="userName" type="java.lang.String"/>\r
+                       <parameter name="password" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="user.jobengine.server.steps.DeleteMaterialsStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="inputFolder" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="userName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="password" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/user.jobengine.executors/jobtemplates/delete-nexio-materials.xml b/server/user.jobengine.executors/jobtemplates/delete-nexio-materials.xml
new file mode 100644 (file)
index 0000000..4b8768c
--- /dev/null
@@ -0,0 +1,26 @@
+<?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="port" type="java.lang.Integer"/>\r
+                       <parameter name="userName" type="java.lang.String"/>\r
+                       <parameter name="password" type="java.lang.String"/>\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep id="id1" type="user.jobengine.server.steps.DeleteNEXIOMaterialsStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="port" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="userName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="password" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
diff --git a/server/user.jobengine.executors/jobtemplates/sync-octopus.xml b/server/user.jobengine.executors/jobtemplates/sync-octopus.xml
new file mode 100644 (file)
index 0000000..04642a7
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="OCTOPUS adatok szinkronizálása">\r
+       <commands>\r
+               <calljobstep id="id1" type="user.jobengine.server.steps.OCTOPUSDataMinerStep" weight="1" />\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
index 950d0230200e1d19f74e43fa88eada3e2a15462f..3724cfd36ed62ae146948c04edc72affea7c79c9 100644 (file)
@@ -28,7 +28,6 @@ import user.jobengine.server.IJobRuntime;
 public class ArchiveListBuilderStep extends JobStep {\r
        private static final Logger logger = LogManager.getLogger();\r
        //      private static final String UTF8 = "utf-8";\r
-       private static final String CATCHED = "catched";\r
        private static final String STATUSFOLDER = ".STATUS";\r
        private static final String MEDIAEXT = ".mxf";\r
        private static final String JSONEXT = ".json";\r
similarity index 87%
rename from server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveItemSubmitStep.java
rename to server/user.jobengine.executors/src/user/jobengine/server/steps/ArchiveMaterialSubmitStep.java
index bbcaaf34844df51a409ad47554f27f7c0dd046cc..d8efb0b74686ffc599ec22a7f31ffa09a6bdb950 100644 (file)
@@ -14,10 +14,10 @@ import user.jobengine.server.IJobRuntime;
  *\r
  * @author robi\r
  */\r
-public class ArchiveItemSubmitStep extends JobStep {\r
+public class ArchiveMaterialSubmitStep extends JobStep {\r
        private static final String GLOBAL_INPUT_FOLDER = "globalInputFolder";\r
        private static final Logger logger = LogManager.getLogger();\r
-       private static final String JOBTEMPLATE = "archive-item.xml";\r
+       private static final String JOBTEMPLATE = "archive-material.xml";\r
        private static final String ARCHIVE_ITEM = "archiveItem";\r
 \r
        @StepEntry\r
index 78385b90faa2969b2ae00495f874121e9f8622ff..759173f5bef306e47e89744b07671152441fee5b 100644 (file)
@@ -1,5 +1,11 @@
 package user.jobengine.server.steps;\r
 \r
+import java.text.ParseException;\r
+import java.text.SimpleDateFormat;\r
+import java.util.Date;\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
@@ -12,36 +18,85 @@ import user.jobengine.server.IJobRuntime;
 \r
 public class DeleteMaterialsStep 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 MEDIAEXT = ".mxf";\r
-       private static final String KILLDATE = ".catched";\r
+       private static final String KILLDATE = ".killdate";\r
+       private static final String MXFFILTER = "*.mxf";\r
+       private StoreUri sourceUri;\r
 \r
        @StepEntry\r
        public Object[] execute(String inputFolder, String userName, String password, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
-               //"\\\\10.10.1.100\\BRAAVOS\\ARCHIVE"\r
-               //"mediacube"\r
-               //"Broadca5T"\r
+               if (StringUtils.isBlank(inputFolder)) {\r
+                       logger.error(getMarker(), "A folyamat 'inputFolder' bemeneti paramétere üres.");\r
+                       throw new NullPointerException("System is not configured properly, 'inputFolder' input parameter missing.");\r
+               }\r
                IItemManager manager = jobEngine.getItemManager();\r
-               StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.SMB, inputFolder);\r
+               sourceUri = manager.createStoreUri(RemoteStoreProtocol.SMB, inputFolder);\r
                sourceUri.setUserName(userName);\r
                sourceUri.setPassword(password);\r
                try {\r
-                       sourceUri.getRemoteFiles(f -> processPathItem(f));\r
+                       sourceUri.getRemoteFiles(MXFFILTER, f -> processPathItem(f));\r
                } catch (Exception e) {\r
-                       logger.error("", e);\r
-               } finally {\r
+                       logger.error(getMarker(), "Általános folyamat hiba. A rendszer hibaüzenete: {}", e.getMessage());\r
                }\r
                return null;\r
        }\r
 \r
        private boolean processPathItem(RemoteFile remoteFile) {\r
                //KILLDATE\r
-               //{0}.{1}.KILLDATE\r
+               String killDateFileName = String.format("%s.*%s", remoteFile.getName(), KILLDATE);\r
+               logger.debug("Checking {}", killDateFileName);\r
+               List<RemoteFile> remoteKillDateFiles = null;\r
+               try {\r
+                       sourceUri.setCurrentPath(STATUSFOLDER);\r
+                       remoteKillDateFiles = sourceUri.getRemoteFiles(killDateFileName);\r
+               } catch (Exception e) {\r
+                       //logger.error(getMarker(), "A {} fájl 'killdate' állományai nem kérdezhetőek le. A rendszer hibaüzenete: {}", remoteFile.getName(), e.getMessage());\r
+                       return true;\r
+               }\r
+\r
+               if (remoteKillDateFiles == null || remoteKillDateFiles.size() == 0)\r
+                       return true;\r
+\r
+               if (remoteKillDateFiles.size() != 1) {\r
+                       logger.error(getMarker(), "A {} fájlhoz több 'killdate' állomány található, így nem eldönthető törölhető e.", remoteFile.getName());\r
+                       return true;\r
+               }\r
+               RemoteFile killDateFile = remoteKillDateFiles.get(0);\r
+               String strKillDate = killDateFile.getName().toLowerCase().replace(remoteFile.getName().toLowerCase() + ".", "").replace(KILLDATE.toLowerCase(), "");\r
+               if (!StringUtils.isNumeric(strKillDate)) {\r
+                       logger.error(getMarker(), "A {} fájl 'killdate' állománya hibás formátumú, az dátum helyett ez áll: '{}'.", remoteFile.getName(), strKillDate);\r
+                       return true;\r
+               }\r
+\r
+               SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");\r
+               Date killDate = null;\r
+               try {\r
+                       killDate = dateFormat.parse(strKillDate);\r
+               } catch (ParseException e) {\r
+                       logger.error(getMarker(), "A {} fájl 'killdate' állománya hibás formátumú, a {} karaktersorozat nem konvertálható dátummá.", remoteFile.getName(),\r
+                                       strKillDate);\r
+                       return true;\r
+               }\r
+\r
+               if (killDate.after(new Date()))\r
+                       return true;\r
+\r
+               try {\r
+                       sourceUri.setCurrentPath(null);\r
+                       sourceUri.delete(remoteFile);\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "A {} fájl nem törölhető. A rendszer hibaüzenete: {}", remoteFile.getName(), e.getMessage());\r
+                       return true;\r
+               }\r
 \r
-               //MODIFIED\r
+               try {\r
+                       sourceUri.setCurrentPath(STATUSFOLDER);\r
+                       sourceUri.delete(killDateFile);\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "A {} 'killdate' állománya nem törölhető. A rendszer hibaüzenete: {}", killDateFile.getName(), e.getMessage());\r
+               }\r
 \r
-               //NAME PATTERN\r
+               logger.info(getMarker(), "A {} fájl törlése a {} killdate alapján sikeresen megtörtént.", remoteFile.getName(), killDateFile.getName());\r
 \r
                return true;\r
        }\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/DeleteNEXIOMaterialsStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/DeleteNEXIOMaterialsStep.java
new file mode 100644 (file)
index 0000000..8122399
--- /dev/null
@@ -0,0 +1,89 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.Date;\r
+import java.util.List;\r
+import java.util.regex.Pattern;\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.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+import com.ibm.nosql.json.api.DBCursor;\r
+import com.ibm.nosql.json.api.DBObject;\r
+import com.ibm.nosql.json.api.QueryBuilder;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class DeleteNEXIOMaterialsStep extends JobStep {\r
+       private static final String NEXIOCLIPS = "nexioclips";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String MODIFIEDTIMESTAMP = "modifiedtimestamp";\r
+       private static final String EXTAGENCY = "extagency";\r
+       private static final String LONGNAMEID = "longnameid";\r
+       private StoreUri sourceUri;\r
+       private String fileNameRegex = "1$";\r
+       private Date modified = new Date();\r
+       private String agency = "";\r
+\r
+       @StepEntry\r
+       public Object[] execute(int port, String userName, String password, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
+               String nexioHost = System.getProperty("nexio.host");\r
+               nexioHost = "localhost";\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
+\r
+               DB db = NoSQLUtils.getDB();\r
+\r
+               DBCollection collection = db.getCollection(NEXIOCLIPS);\r
+               //https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html\r
+               //http://www.vogella.com/tutorials/JavaRegularExpressions/article.html\r
+               QueryBuilder queryBuilder = QueryBuilder.start();\r
+               if (StringUtils.isNotBlank(fileNameRegex))\r
+                       queryBuilder.and(QueryBuilder.start(LONGNAMEID).regex(Pattern.compile(fileNameRegex)).get());\r
+               if (StringUtils.isNotBlank(agency))\r
+                       queryBuilder.and(QueryBuilder.start(EXTAGENCY).all(agency).get());\r
+               if (modified != null)\r
+                       queryBuilder.and(QueryBuilder.start(MODIFIEDTIMESTAMP).lessThan(modified).get());\r
+               DBCursor cursor = collection.find(queryBuilder.get());\r
+               if (!cursor.hasNext())\r
+                       return null;\r
+\r
+               IItemManager manager = jobEngine.getItemManager();\r
+               sourceUri = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost);\r
+               sourceUri.setPortNumber(21);\r
+               sourceUri.setUserName(userName);\r
+               sourceUri.setPassword(password);\r
+\r
+               List<DBObject> clips = cursor.toArray();\r
+               for (DBObject dbObject : clips) {\r
+                       String name = String.valueOf(dbObject.get(LONGNAMEID));\r
+                       delete(name);\r
+               }\r
+\r
+               return null;\r
+       }\r
+\r
+       private void delete(String name) {\r
+               RemoteFile remoteFile = null;\r
+               try {\r
+                       remoteFile = sourceUri.getRemoteFile(name);\r
+                       if (remoteFile == null)\r
+                               throw new NullPointerException("File not exists: " + name);\r
+                       sourceUri.delete(remoteFile);\r
+                       logger.info(getMarker(), "A {} fájl törlése sikeres volt.", remoteFile.getName());\r
+               } catch (Exception e) {\r
+                       logger.error(getMarker(), "A {} fájl nem törölhető. A rendszer hibaüzenete: {}", remoteFile.getName(), e.getMessage());\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/NexioDeleteMaterialsStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/NexioDeleteMaterialsStep.java
deleted file mode 100644 (file)
index 007aa43..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-package user.jobengine.server.steps;\r
-\r
-import org.apache.logging.log4j.LogManager;\r
-import org.apache.logging.log4j.Logger;\r
-\r
-import user.commons.RemoteFile;\r
-import user.jobengine.server.IJobEngine;\r
-import user.jobengine.server.IJobRuntime;\r
-\r
-public class NexioDeleteMaterialsStep extends JobStep {\r
-       private static final Logger logger = LogManager.getLogger();\r
-\r
-       @StepEntry\r
-       public Object[] execute(String inputFolder, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
-\r
-               try {\r
-               } catch (Exception e) {\r
-                       logger.error("", e);\r
-               } finally {\r
-               }\r
-               return null;\r
-       }\r
-\r
-       private boolean processPathItem(RemoteFile remoteFile) {\r
-               //MODIFIED\r
-\r
-               //NAME PATTERN\r
-\r
-               //AGENCY\r
-\r
-               return true;\r
-       }\r
-}\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/OCTOPUSDataMinerStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/OCTOPUSDataMinerStep.java
new file mode 100644 (file)
index 0000000..91e45b7
--- /dev/null
@@ -0,0 +1,44 @@
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.octopus.OctopusDataMiner;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class OCTOPUSDataMinerStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private IProgressEventListener progressListener;\r
+\r
+       private IProgressEventListener createListener(final IJobRuntime jobRuntime) {\r
+               return new IProgressEventListener() {\r
+                       @Override\r
+                       public void progressChanged(ProgressEvent evt) {\r
+                               logger.info("Progress changed to " + evt.getProgress() + "%");\r
+                               jobRuntime.incrementProgress(evt.getProgress());\r
+                       }\r
+               };\r
+       }\r
+\r
+       @StepEntry\r
+       public Object[] execute(IJobEngine jobEngine, final IJobRuntime jobRuntime) {\r
+               OctopusDataMiner dataMiner = null;\r
+               try {\r
+                       progressListener = createListener(jobRuntime);\r
+                       dataMiner = new OctopusDataMiner();\r
+                       dataMiner.addProgressListener(progressListener);\r
+                       dataMiner.run();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (dataMiner != null)\r
+                               dataMiner.removeProgressListener(progressListener);\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
index a4835318b236ea94263c4bb2f095833e9f5d9768..a88d75a60e022151067184374f5c723e05befe81 100644 (file)
@@ -49,7 +49,7 @@ public class SelenioLowresTranscodeStep extends JobStep {
        private Store store;\r
        private FileType fileType;\r
 \r
-       public SelenioLowresTranscodeStep() {\r
+       public SelenioLowresTranscodeStep() throws Exception {\r
                try {\r
                        address = System.getProperty("jobengine.selenio.address");\r
                        if (StringUtils.isBlank(address))\r
@@ -63,6 +63,7 @@ public class SelenioLowresTranscodeStep extends JobStep {
                        transcoder = service.getTranscodeMgrWSPort();\r
                } catch (Exception e) {\r
                        logger.catching(e);\r
+                       throw e;\r
                }\r
        }\r
 \r
index 496c2a54d5a37da9ce69f365e2d9f73672dcb3e6..7f1df3f175ac6dc9b7ed10a098b782ed7c878e23 100644 (file)
@@ -13,6 +13,7 @@ Service-Component: OSGI-INF/nexioAPI.xml, OSGI-INF/octopusAPI.xml
 Export-Package: user.commons,
  user.commons.logging,
  user.commons.nexio,
+ user.commons.nosql,
  user.commons.octopus,
  user.commons.rcc,
  user.commons.remotestore,
index 5f6d93cd33e510080848199b80f9088621d5ad55..f5d9dbe0469943589cca14284c9a8e5780f3f53c 100644 (file)
@@ -44,6 +44,7 @@ public class StoreUri extends EntityBase implements Serializable {
        private EventListenerList progressListenerList;
        private EventListenerList statusListenerList;
        private int percent;
+       private IDirectoryLister lister;
 
        public StoreUri() {
                super();
@@ -59,6 +60,15 @@ public class StoreUri extends EntityBase implements Serializable {
                statusListenerList.add(IStatusEventListener.class, listener);
        }
 
+       public void cleanUp() {
+               if (lister != null)
+                       try {
+                               lister.cleanUp();
+                       } catch (Exception e) {
+                               logger.catching(e);
+                       }
+       }
+
        public void clearListeners() {
                this.progressListenerList = new EventListenerList();
                this.statusListenerList = new EventListenerList();
@@ -75,7 +85,6 @@ public class StoreUri extends EntityBase implements Serializable {
                        throw new Exception("InputStream is null!");
 
                result = new RemoteFile();
-               // Kitesztelni a helyes f�jlv�gz�d�seket!
                String targetFileName = targetName;
                if (StringUtils.isEmpty(targetFileName))
                        targetFileName = source.getName();
@@ -132,6 +141,18 @@ public class StoreUri extends EntityBase implements Serializable {
                return result;
        }
 
+       public void delete(RemoteFile remoteFile) throws Exception {
+               ensureLister();
+               lister.delete(remoteFile);
+       }
+
+       private void ensureLister() throws Exception {
+               if (lister == null)
+                       lister = RemoteFileHandler.createLister(this);
+               if (lister == null)
+                       throw new Exception("InputLister is null.");
+       }
+
        public void fireProgressEvent(ProgressEvent evt) {
                Object[] listeners = progressListenerList.getListenerList();
                for (int i = 0; i < listeners.length; i += 2) {
@@ -156,21 +177,6 @@ public class StoreUri extends EntityBase implements Serializable {
                return delivery;
        }
 
-       // public String getFullPath() {
-       // return getFullPath(true);
-       // }
-       //
-       // public String getFullPath(boolean trimProtocol) {
-       // String uri = DirectoryUtils.checkSlash("/", getUri(), false, true);
-       // String root = DirectoryUtils.checkSlash("/", getRootPath(), false, true);
-       // String currentPath = DirectoryUtils.checkSlash("/", getCurrentPath(),
-       // false, true);
-       // String result = uri + root + currentPath;
-       // if (trimProtocol)
-       // result = result.substring(result.indexOf("://") + 3);
-       // return result.replace("\\", "/");
-       // }
-
        public String getFilter() {
                return filter;
        }
@@ -187,32 +193,29 @@ public class StoreUri extends EntityBase implements Serializable {
                return protocol;
        }
 
-       public RemoteFile getRemoteFile(String fileName) {
-               RemoteFile result = null;
-               try {
-                       IDirectoryLister inputLister = RemoteFileHandler.createLister(this);
-                       if (inputLister == null)
-                               throw new Exception("InputLister is null.");
-                       result = inputLister.get(fileName);
-               } catch (Exception e) {
-                       logger.error(e);
-               }
-               return result;
+       public RemoteFile getRemoteFile(String fileName) throws Exception {
+               ensureLister();
+               return lister.get(fileName);
        }
 
        public List<RemoteFile> getRemoteFiles() throws Exception {
-               List<RemoteFile> result = null;
-               IDirectoryLister lister = RemoteFileHandler.createLister(this);
-               if (lister != null)
-                       result = lister.list();
-               return result;
+               ensureLister();
+               return lister.list();
        }
 
        public void getRemoteFiles(IRemoteFileListCallback callback) throws Exception {
-               List<RemoteFile> result = null;
-               IDirectoryLister lister = RemoteFileHandler.createLister(this);
-               if (lister != null)
-                       lister.list(callback);
+               ensureLister();
+               lister.list(callback);
+       }
+
+       public List<RemoteFile> getRemoteFiles(String wildCard) throws Exception {
+               ensureLister();
+               return lister.list(wildCard);
+       }
+
+       public void getRemoteFiles(String wildCard, IRemoteFileListCallback callback) throws Exception {
+               ensureLister();
+               lister.list(wildCard, callback);
        }
 
        public String getRootPath() {
@@ -322,31 +325,22 @@ public class StoreUri extends EntityBase implements Serializable {
        }
 
        public RemoteFile transferFrom(StoreUri targetStoreUri, RemoteFile remoteFile, String targetName) throws Exception {
-               IDirectoryLister inputLister = RemoteFileHandler.createLister(this);
-               if (inputLister == null)
-                       throw new Exception("InputLister is null.");
+               ensureLister();
                IDirectoryLister outputLister = RemoteFileHandler.createLister(targetStoreUri);
                if (outputLister == null)
                        throw new Exception("OutputLister is null.");
-               return copy(inputLister, outputLister, remoteFile, targetName);
+               return copy(lister, outputLister, remoteFile, targetName);
        }
 
        public RemoteFile transferFrom(StoreUri targetStoreUri, String fileName, String targetName) throws Exception {
-               logger.info("transferFrom");
-               IDirectoryLister inputLister = RemoteFileHandler.createLister(this);
-               if (inputLister == null)
-                       throw new Exception("InputLister is null.");
-               logger.info("InputLister is selected!");
-               RemoteFile remoteFile = inputLister.get(fileName);
+               ensureLister();
+               RemoteFile remoteFile = lister.get(fileName);
                if (remoteFile == null)
                        throw new Exception("RemoteFile is null.");
-               // N�v �s m�ret ki�rat�sa
                logger.info("RemoteFile:" + remoteFile.getName() + " " + remoteFile.getSize());
                IDirectoryLister outputLister = RemoteFileHandler.createLister(targetStoreUri);
                if (outputLister == null)
                        throw new Exception("OutputLister is null.");
-               logger.info("OutputLister is selected!");
-
-               return copy(inputLister, outputLister, remoteFile, targetName);
+               return copy(lister, outputLister, remoteFile, targetName);
        }
 }
\ No newline at end of file
index 15dd700c0b5320614bf7ca109c9a2617d78e72f8..f434ebb1a78d21f6e75c14bd90ff60b6aaca841a 100644 (file)
@@ -83,6 +83,17 @@ public class NexioClipEventDispatcher implements ClipEventListener {
        //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
@@ -90,7 +101,6 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                        logger.info("NexioClipEventDispatcher nexio server is connected.");\r
 \r
                        this.progressListenerList = new EventListenerList();\r
-                       this.db = NoSQLUtils.getDB();\r
                        this.dropAllClipsFromMongo();\r
                        this.ensureIndexes();\r
 \r
@@ -162,13 +172,16 @@ public class NexioClipEventDispatcher implements ClipEventListener {
         * @throws Exception\r
         */\r
        private void copyClipsIntoMongo() throws Exception {\r
+               logger.info("Starting initial NEXIO metadata import.");\r
                Map<String, BasicDBObject> emptyMap = new HashMap<String, BasicDBObject>();\r
                Iterator<Clip> clips = controller.getMediabase().getClips();\r
                while (clips.hasNext()) {\r
                        Clip clip = clips.next();\r
                        BasicDBObject jsonClip = convertClipToJSON(clip);\r
+                       logger.info("Found NEXIO clip: {} {}", clip.getId(), clip.getXid());\r
                        this.saveClipIntoMongo(jsonClip, emptyMap);\r
                }\r
+               logger.info("NEXIO metadata import completed.");\r
        }\r
 \r
        public void dropAllClipsFromMongo() {\r
@@ -216,14 +229,14 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                }\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
index 482e208523da7372c1cf8487086efad631ebe138..b15c6efc9b23346ce60f53277ba4747b159f0fb7 100644 (file)
@@ -1,7 +1,6 @@
 package user.commons.nexio.api;\r
 \r
 import java.util.ArrayList;\r
-import java.util.Iterator;\r
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
@@ -11,103 +10,143 @@ import user.commons.nexio.server.protocol.Id;
 import user.commons.nexio.server.protocol.TCPConnection;\r
 \r
 /**\r
- *     Szeparalt konnekcion feliratkozik a nexio change notification eventekre.\r
- *     1.      send CHANGE_NOTIFICATION_REQ + mask (add+delete)\r
- *     2.      read (2 bytes)  ACK\r
- *     3.      blocking read (4 bytes) CHANGE_NOTIFICATION_RESP 4 bytes, \r
- *             az utolso biten mondja meg, hogy add vagy delete NN(notification number)\r
- *     4.  send ACK\r
- *     5.      send LIST_FIRST_ID_LIST_ADDED   vagy  LIST_FIRST_ID_LIST_DELETED a 3. pont NN valasza alapjan\r
- *     6.  read LIST_FIRST.. response (2 bytes), elvart valasz: D84C\r
- *     7.      read first id (8 bytes)\r
- *     8.      send LIST_NEXT_ID_LIST\r
- *     8b.             read list next.. response(2 bytes) elvart valasz: D84D, ha nincs tobb akkor: D04D -> 9. pont\r
- *     8c.             read NEXT ID (8 bytes) ha D84D volt a 9. pont valasza\r
- *     8d.             vissza 8. pontra\r
- *     9.      ismetles a 3. ponttol \r
+ * Szeparalt konnekcion feliratkozik a nexio change notification eventekre. 1. send CHANGE_NOTIFICATION_REQ + mask (add+delete) 2. read (2 bytes) ACK 3.\r
+ * blocking read (4 bytes) CHANGE_NOTIFICATION_RESP 4 bytes, az utolso biten mondja meg, hogy add vagy delete NN(notification number) 4. send ACK 5. send\r
+ * LIST_FIRST_ID_LIST_ADDED vagy LIST_FIRST_ID_LIST_DELETED a 3. pont NN valasza alapjan 6. read LIST_FIRST.. response (2 bytes), elvart valasz: D84C 7. read\r
+ * first id (8 bytes) 8. send LIST_NEXT_ID_LIST 8b. read list next.. response(2 bytes) elvart valasz: D84D, ha nincs tobb akkor: D04D -> 9. pont 8c. read NEXT\r
+ * ID (8 bytes) ha D84D volt a 9. pont valasza 8d. vissza 8. pontra 9. ismetles a 3. ponttol\r
+ *\r
  * @author robi\r
  */\r
 \r
-public class MediaListener implements Runnable{\r
+public class MediaListener implements Runnable {\r
 \r
        static private final char[] hexArray = "0123456789ABCDEF".toCharArray();\r
        static private final Logger logger = LogManager.getLogger();\r
        //MASK REQ                      RESP_NOT_NUM\r
        //00 00 00 01           0x00                    IDs in Added List               BC=0x01, NN=0x00, DATA=none\r
        //00 00 00 02           0x01                    IDs in Deleted List             BC=0x01, NN=0x01, DATA=none\r
-       static private final byte[] CHANGE_NOTIFICATION_REQ = { (byte) 0xC4, (byte)0xA5, 0,0,0,0x03};   //C4A5 + MASK=ADD+DELETE\r
+       static private final byte[] CHANGE_NOTIFICATION_REQ = { (byte) 0xC4, (byte) 0xA5, 0, 0, 0, 0x03 }; //C4A5 + MASK=ADD+DELETE\r
        //10 01 response immediately\r
-       static private final byte[] ACK = { (byte) 0x10, (byte)0x01};\r
-       //CF A6 BC NN DATA              NN=0 -> IDs are in added list, NN=1 -> IDs are in deleted list  \r
-       static private final byte[] CHANGE_NOTIFICATION_RESP = { (byte) 0xCF, (byte)0xA6};\r
-       //List First ID List (C1 4C)    \r
-       static private final byte[] LIST_FIRST_ID_LIST_ADDED =  { (byte) 0xC1, (byte)0x4C, (byte)0x02}; //2 added, 3 deleted\r
-       static private final byte[] LIST_FIRST_ID_LIST_DELETED = { (byte) 0xC1, (byte)0x4C, (byte)0x03};        //2 added, 3 deleted\r
-       //List First ID List (C0 4D)    \r
-       static private final byte[] LIST_NEXT_ID_LIST = { (byte) 0xC0, (byte)0x4D};\r
-       \r
+       static private final byte[] ACK = { (byte) 0x10, (byte) 0x01 };\r
+       //CF A6 BC NN DATA              NN=0 -> IDs are in added list, NN=1 -> IDs are in deleted list\r
+       static private final byte[] CHANGE_NOTIFICATION_RESP = { (byte) 0xCF, (byte) 0xA6 };\r
+       //List First ID List (C1 4C)\r
+       static private final byte[] LIST_FIRST_ID_LIST_ADDED = { (byte) 0xC1, (byte) 0x4C, (byte) 0x02 }; //2 added, 3 deleted\r
+       static private final byte[] LIST_FIRST_ID_LIST_DELETED = { (byte) 0xC1, (byte) 0x4C, (byte) 0x03 }; //2 added, 3 deleted\r
+       //List First ID List (C0 4D)\r
+       static private final byte[] LIST_NEXT_ID_LIST = { (byte) 0xC0, (byte) 0x4D };\r
+\r
        static private final String LIST_FIRST_ID_LIST_FOUND = "D84C";\r
        static private final String LIST_FIRST_ID_LIST_NOT_FOUND = "D04C";\r
-       \r
+\r
        static private final String LIST_NEXT_ID_LIST_FOUND = "D84D";\r
        static private final String LIST_NEXT_ID_LIST_NOT_FOUND = "D04D";\r
-       \r
-       static private final int  NN_ID_ADDED = 0;\r
-       static private final int  NN_ID_DELETED = 1;\r
-       \r
+\r
+       static private final int NN_ID_ADDED = 0;\r
+       static private final int NN_ID_DELETED = 1;\r
+\r
+       public static String bytesToHex(byte[] bytes) {\r
+               char[] hexChars = new char[bytes.length * 2];\r
+               for (int j = 0; j < bytes.length; j++) {\r
+                       int v = bytes[j] & 0xFF;\r
+                       hexChars[j * 2] = hexArray[v >>> 4];\r
+                       hexChars[j * 2 + 1] = hexArray[v & 0x0F];\r
+               }\r
+               return new String(hexChars);\r
+       }\r
+\r
        private ArrayList<ClipEventListener> clipEventListeners = new ArrayList<ClipEventListener>();\r
        private boolean isRunning = false;\r
-       private Mediabase mediaBase = null;\r
 \r
+       private Mediabase mediaBase = null;\r
        private int nexioPort = 557;\r
        private String nexioHost = null;\r
+\r
        private Connection connection = null;\r
-       \r
+\r
        //KONSTRUKTOR\r
-       public MediaListener(Mediabase _mediaBase, String _nexioHost, int _nexioPort){\r
+       public MediaListener(Mediabase _mediaBase, String _nexioHost, int _nexioPort) {\r
                this.mediaBase = _mediaBase;\r
                this.nexioHost = _nexioHost;\r
                this.nexioPort = _nexioPort;\r
                startListener();\r
        }\r
-       \r
-       public void startListener(){\r
-               try{\r
-                       createNexioConnection();\r
-                       this.isRunning = true;\r
-                       Thread t = new Thread(this, "MediaListener");\r
-                       t.start();\r
-                       logger.info("Nexio MediaListener is starting...");\r
-               }catch(Exception exc){\r
-                       logger.error("",  exc);\r
+\r
+       public void addClipEventListener(ClipEventListener listener) {\r
+               this.clipEventListeners.add(listener);\r
+       }\r
+\r
+       private void createNexioConnection() throws Exception {\r
+               this.connection = TCPConnection.getInstance(this.nexioHost, this.nexioPort);\r
+               logger.info("Nexio MediaListener is connected to NEXIO " + this.nexioHost + " : " + this.nexioPort);\r
+       }\r
+\r
+       private void fireEvent(String idString, int notificationNumber) throws Exception {\r
+               Id id = new Id(idString);\r
+               ClipEvent evt = null;\r
+               if (notificationNumber == NN_ID_ADDED) {\r
+                       evt = new ClipEvent(mediaBase.getClip(id), ClipEventType.CLIP_ADDED);\r
+               } else if (notificationNumber == NN_ID_DELETED) {\r
+                       evt = new ClipEvent(mediaBase.getClip(id), ClipEventType.CLIP_DELETED);\r
+               }\r
+               for (ClipEventListener cel : this.clipEventListeners) {\r
+                       cel.clipEventPerformed(evt);\r
+               }\r
+       }\r
+\r
+       private byte[] readBytes(int numberOfBytes) throws Exception {\r
+               try {\r
+                       byte[] ret = new byte[numberOfBytes];\r
+                       this.connection.read(ret, 0, numberOfBytes);\r
+                       return ret;\r
+               } catch (Exception e) {\r
+                       restartListener();\r
+                       throw e;\r
                }\r
        }\r
 \r
-       public void stopListener(){\r
+       public void removeClipEventListener(ClipEventListener listener) {\r
+               this.clipEventListeners.remove(listener);\r
+       }\r
+\r
+       private void restartListener() throws Exception {\r
                this.isRunning = false;\r
+               Thread.sleep(3000);\r
+               try {\r
+                       Thread.currentThread().interrupt();\r
+               } catch (Exception e) {\r
+               }\r
+               try {\r
+                       if (this.connection != null) {\r
+                               this.connection.disconnect();\r
+                       }\r
+               } catch (Exception e) {\r
+               }\r
+               //new connection / new thread\r
+               startListener();\r
        }\r
-       \r
 \r
-       \r
-       public void run(){\r
-               try{\r
+       @Override\r
+       public void run() {\r
+               try {\r
                        //SEND CHANGE NOTIFICATION REQ\r
                        writeBytes(CHANGE_NOTIFICATION_REQ);\r
-                       \r
+\r
                        //ACK\r
                        byte[] buffer = readBytes(2);\r
                        logger.info("Nexio MediaListener is waiting for events..");\r
-                       \r
-                       while(isRunning){\r
-                               try{\r
+\r
+                       while (isRunning) {\r
+                               try {\r
                                        //CHANGE_NOTIFICATION_RESP (BLOCKING READ!)\r
-                                       buffer = readBytes(4);                          //CFA6  BC      NN->0=added, 1=deleted\r
+                                       buffer = readBytes(4); //CFA6   BC      NN->0=added, 1=deleted\r
                                        int notificationNumber = buffer[3];\r
                                        logger.debug("Nexio MediaListener notification: " + bytesToHex(buffer));\r
-                                       \r
+\r
                                        //SEND ACK\r
-//                                     writeBytes(ACK);\r
-                               \r
+                                       //                                      writeBytes(ACK);\r
+\r
                                        //LIST_FIRST_ID_LIST\r
                                        /*\r
                                                0x01    Main ID Handle List     D8 4C ID\r
@@ -120,131 +159,90 @@ public class MediaListener implements Runnable{
                                                0x22    ID Handles/Extended IDs Added List      DF 4C BC ID XID *\r
                                                0x23    ID Handles/Extended IDs Deleted List    DF 4C BC ID XID *\r
                                        */\r
-                                       if(notificationNumber == NN_ID_ADDED){\r
+\r
+                                       boolean handled = false;\r
+                                       if (notificationNumber == NN_ID_ADDED) {\r
                                                writeBytes(LIST_FIRST_ID_LIST_ADDED);\r
-                                       }else\r
-                                       if(notificationNumber == NN_ID_DELETED){\r
+                                               handled = true;\r
+                                       }\r
+\r
+                                       if (notificationNumber == NN_ID_DELETED) {\r
                                                //SEND ACK\r
                                                writeBytes(ACK);\r
                                                writeBytes(LIST_FIRST_ID_LIST_DELETED);\r
+                                               handled = true;\r
                                        }\r
-                               \r
+\r
+                                       if (!handled) {\r
+                                               writeBytes(ACK);\r
+                                               logger.debug("Unhandled notification: {}", bytesToHex(buffer));\r
+                                               continue;\r
+                                       }\r
+\r
                                        //LIST_FIRST_ID_LIST response\r
                                        buffer = readBytes(2);\r
-                                       if(LIST_FIRST_ID_LIST_FOUND.equals(bytesToHex(buffer))){\r
-                                               \r
+                                       if (LIST_FIRST_ID_LIST_FOUND.equals(bytesToHex(buffer))) {\r
+\r
                                                //read first id\r
                                                buffer = readBytes(8);\r
                                                String stringId = new String(buffer);\r
                                                logger.debug("Nexio MediaListener first id: " + stringId);\r
                                                fireEvent(stringId, notificationNumber);\r
-                                               \r
+\r
                                                //read next ids\r
                                                writeBytes(LIST_NEXT_ID_LIST);\r
-                                               for(buffer=readBytes(2); LIST_NEXT_ID_LIST_FOUND.equals(bytesToHex(buffer)) && isRunning; buffer=readBytes(2)){\r
-                               \r
+                                               for (buffer = readBytes(2); LIST_NEXT_ID_LIST_FOUND.equals(bytesToHex(buffer)) && isRunning; buffer = readBytes(2)) {\r
+\r
                                                        byte[] idBuffer = readBytes(8);\r
                                                        stringId = new String(idBuffer);\r
                                                        logger.debug("Nexio MediaListener next id: " + stringId);\r
                                                        fireEvent(stringId, notificationNumber);\r
-                                               \r
+\r
                                                        writeBytes(LIST_NEXT_ID_LIST);\r
                                                }\r
                                                logger.debug("Nexio MediaListener end of id list: " + bytesToHex(buffer));\r
                                                //SEND ACK\r
-                                               writeBytes(ACK);                                                \r
-                                               \r
-                                       }else\r
-                                       if(LIST_FIRST_ID_LIST_NOT_FOUND.equals(bytesToHex(buffer))){\r
+                                               writeBytes(ACK);\r
+\r
+                                       } else if (LIST_FIRST_ID_LIST_NOT_FOUND.equals(bytesToHex(buffer))) {\r
                                                logger.debug("Nexio MediaListener LIST_FIRST_ID_LIST ID not found!");\r
-                                       }else{\r
-                                               logger.debug("Nexio MediaListener unknown answer has arrived for LIST_FIRST_ID_LIST:  " + bytesToHex( buffer));\r
+                                       } else {\r
+                                               logger.debug("Nexio MediaListener unknown answer has arrived for LIST_FIRST_ID_LIST:  " + bytesToHex(buffer));\r
                                        }\r
-                               }catch(Exception exc){\r
+                               } catch (Exception exc) {\r
                                        logger.error("", exc);\r
                                }\r
                        }\r
                        this.connection.disconnect();\r
-               }catch(Exception e){\r
+               } catch (Exception e) {\r
                        logger.error("", e);\r
                }\r
        }\r
 \r
-       private void fireEvent(String idString, int notificationNumber) throws Exception{\r
-               Id id = new Id(idString);\r
-               ClipEvent evt = null;\r
-               if(notificationNumber == NN_ID_ADDED){\r
-                       evt = new ClipEvent(mediaBase.getClip(id), ClipEventType.CLIP_ADDED);\r
-               }else\r
-               if(notificationNumber == NN_ID_DELETED){\r
-                       evt = new ClipEvent(mediaBase.getClip(id), ClipEventType.CLIP_DELETED);\r
-               }\r
-               for(ClipEventListener cel : this.clipEventListeners){\r
-                       cel.clipEventPerformed(evt);\r
+       public void startListener() {\r
+               try {\r
+                       createNexioConnection();\r
+                       this.isRunning = true;\r
+                       Thread t = new Thread(this, "MediaListener");\r
+                       t.start();\r
+                       logger.info("Nexio MediaListener is starting...");\r
+               } catch (Exception exc) {\r
+                       logger.error("", exc);\r
                }\r
        }\r
 \r
-       private byte[] readBytes(int numberOfBytes) throws Exception{\r
-               try{\r
-                       byte[] ret = new byte[numberOfBytes];\r
-                       this.connection.read(ret, 0, numberOfBytes);\r
-                       return ret;\r
-               }catch(Exception e){\r
-                       restartListener();\r
-                       throw e;\r
-               }\r
+       public void stopListener() {\r
+               this.isRunning = false;\r
        }\r
-       \r
-       private void writeBytes(byte[] toWrite) throws Exception{\r
-               try{\r
+\r
+       private void writeBytes(byte[] toWrite) throws Exception {\r
+               try {\r
                        this.connection.write(toWrite);\r
                        this.connection.flush();\r
-               }catch(Exception e){\r
+               } catch (Exception e) {\r
                        restartListener();\r
                        throw e;\r
                }\r
        }\r
 \r
-       \r
-       private void createNexioConnection() throws Exception{\r
-               this.connection = TCPConnection.getInstance(this.nexioHost, this.nexioPort);\r
-               logger.info("Nexio MediaListener is connected to NEXIO " + this.nexioHost + " : " + this.nexioPort);\r
-       }\r
-       \r
-       \r
-       private void restartListener() throws Exception{\r
-               this.isRunning = false;\r
-               Thread.sleep(3000);\r
-               try{\r
-                       Thread.currentThread().interrupt();\r
-               }catch(Exception e){}\r
-               try{\r
-                       if(this.connection != null){\r
-                               this.connection.disconnect();\r
-                       }\r
-               }catch(Exception e){}\r
-               //new connection / new thread\r
-               startListener();\r
-       }\r
-       \r
-       \r
-       public void addClipEventListener(ClipEventListener listener){\r
-               this.clipEventListeners.add(listener);\r
-       }\r
-\r
-       public void removeClipEventListener(ClipEventListener listener){\r
-               this.clipEventListeners.remove(listener);\r
-       }\r
-       \r
-       public static String bytesToHex(byte[] bytes) {\r
-           char[] hexChars = new char[bytes.length * 2];\r
-           for ( int j = 0; j < bytes.length; j++ ) {\r
-               int v = bytes[j] & 0xFF;\r
-               hexChars[j * 2] = hexArray[v >>> 4];\r
-               hexChars[j * 2 + 1] = hexArray[v & 0x0F];\r
-           }\r
-           return new String(hexChars);\r
-       }\r
-       \r
-       \r
 }\r
index ffce5c647c86df10a228f3842b5e0e152814a00e..9234a64109ed7ce41bbf0dae886c1e32edc84cca 100644 (file)
@@ -4,6 +4,7 @@ import java.util.Date;
 import java.util.HashSet;\r
 import java.util.List;\r
 \r
+import javax.swing.event.EventListenerList;\r
 import javax.ws.rs.client.Invocation.Builder;\r
 import javax.ws.rs.core.Response;\r
 \r
@@ -26,6 +27,8 @@ import com.ibm.nosql.json.api.QueryBuilder;
 import com.ibm.nosql.json.api.WriteResult;\r
 \r
 import user.commons.nosql.NoSQLUtils;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
 \r
 public class OctopusDataMiner implements Runnable {\r
        private static final Logger logger = LogManager.getLogger();\r
@@ -70,6 +73,8 @@ public class OctopusDataMiner implements Runnable {
        private String apiUser;\r
        private String apiPwd;\r
        private HashSet<Long> storyIDs = new HashSet<>();\r
+       private EventListenerList progressListenerList;\r
+       private ProgressEvent progressEvent = new ProgressEvent(this, 0);\r
 \r
        public OctopusDataMiner() {\r
                String jdbcUrl = System.getProperty("jobengine.nosql.db.url");\r
@@ -86,24 +91,66 @@ public class OctopusDataMiner implements Runnable {
                webTarget = client.target(apiAddress).register(new BasicAuthentication(apiUser, apiPwd));\r
        }\r
 \r
-       @Override\r
-       public void run() {\r
-               logger.info(STARTING);\r
-               try {\r
-                       ensureIndexes();\r
-                       Date lastUpdateTime = getLastUpdateTime();\r
-                       setLastUpdateTime(new Date());\r
-                       BasicDBList rundowns = queryRundowns(lastUpdateTime);\r
-                       if (rundowns != null)\r
-                               storeRundowns(rundowns, lastUpdateTime);\r
-                       BasicDBList storyFolders = queryStoryFolders(lastUpdateTime);\r
-                       if (storyFolders != null)\r
-                               storeStoryFolders(storyFolders, lastUpdateTime);\r
-                       deleteOrphanStories();\r
-               } catch (Exception e) {\r
-                       logger.error(e);\r
+       public void addProgressListener(IProgressEventListener listener) {\r
+               progressListenerList.add(IProgressEventListener.class, listener);\r
+       }\r
+\r
+       private BasicDBList asDBList(BasicDBObject obj, String name) {\r
+               BasicDBList result = null;\r
+               if (obj.containsKey(name) && (obj.get(name) instanceof BasicDBList))\r
+                       result = (BasicDBList) obj.get(name);\r
+               return result;\r
+       }\r
+\r
+       private BasicDBObject asDBObject(BasicDBObject obj, String name) {\r
+               BasicDBObject result = null;\r
+               if (obj.containsKey(name) && (obj.get(name) instanceof BasicDBObject))\r
+                       result = (BasicDBObject) obj.get(name);\r
+               return result;\r
+       }\r
+\r
+       private void checkAndStoreStory(BasicDBObject modifiedStory, Date lastUpdateTime, long storyID, int position, long referenceID, String referenceName,\r
+                       DBCollection collection) {\r
+               boolean isContains = storyIDs.contains(storyID);\r
+               if (!isContains)\r
+                       storyIDs.add(storyID);\r
+               if (lastUpdateTime != null && !isModified(lastUpdateTime, modifiedStory, MODIFIED))\r
+                       return;\r
+               if (isContains) {\r
+                       logger.trace(PROCESSING_MULTI_REFERENCED_STORY_ID + storyID);\r
+                       modifiedStory = (BasicDBObject) collection.findOne(new BasicDBObject(ID, storyID));\r
                }\r
-               logger.trace(FINISHED);\r
+               BasicDBList references = asDBList(modifiedStory, referenceName);\r
+               if (references == null) {\r
+                       references = new BasicDBList();\r
+                       modifiedStory.append(referenceName, references);\r
+               }\r
+               references.add(new BasicDBObject(ID, referenceID).append(POSITION, position));\r
+               logger.info(String.format(SAVING_STORY_D, storyID));\r
+               collection.save(modifiedStory);\r
+       }\r
+\r
+       public void clear() {\r
+               db.getCollection(RUNDOWN_COLLECTION_NAME).remove();\r
+               db.getCollection(STORY_COLLECTION_NAME).remove();\r
+               db.getCollection(STORY_FOLDER_COLLECTION_NAME).remove();\r
+               db.getCollection(TIME_COLLECTION_NAME).remove();\r
+       }\r
+\r
+       private String concatParentsToStoryFolder(BasicDBObject actual, String name) {\r
+\r
+               String fields = "name,id,parent";\r
+               Response response = query("StoryFolder/" + actual.getLong("id"), fields).get();\r
+               String json = response.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               BasicDBObject res = (BasicDBObject) resultObject.get("result");\r
+               BasicDBObject parent = (BasicDBObject) res.get("parent");\r
+               if (parent == null || parent.isEmpty())\r
+                       return name;\r
+               String parentName = parent.getString("name");\r
+               String actualName = actual.getString("name");\r
+               String newName = String.format("%s/%s", parentName, actualName);\r
+               return concatParentsToStoryFolder(parent, newName);\r
        }\r
 \r
        private void deleteOrphanStories() {\r
@@ -117,81 +164,50 @@ public class OctopusDataMiner implements Runnable {
                }\r
        }\r
 \r
-       private BasicDBList queryStoryFolders(Date lastUpdateTime) {\r
-               logger.trace(ENTER);\r
-               BasicDBList result = null;\r
-               String fields = ID_NAME_MODIFIED;\r
-               Response response = query(STORY_FOLDER, fields).get();\r
-               String json = response.readEntity(String.class);\r
-               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
-               if (resultObject != null)\r
-                       result = asDBList(resultObject, RESULT);\r
-               \r
-               /*teszt*/\r
-               List<BasicDBObject> list = NoSQLUtils.asList(result);\r
-               for(BasicDBObject actual : list) {\r
-                       String fullName = concatParentsToStoryFolder(actual, actual.getString("name"));\r
-                       logger.info(String.format("fullname %s", fullName));\r
-                       actual.remove("name");\r
-                       actual.append("name", fullName);\r
+       private void ensureIndexes() {\r
+               DBCollection collection = db.getCollection(STORY_FOLDER_COLLECTION_NAME);\r
+               if (collection.count() == 0)\r
+                       collection.ensureIndex(ID);\r
+               collection = db.getCollection(RUNDOWN_COLLECTION_NAME);\r
+               if (collection.count() == 0) {\r
+                       collection.ensureIndex(ID);\r
+                       collection.ensureIndex(SCHEDULED_START);\r
                }\r
-               \r
-               logger.trace(EXIT);\r
-               return result;\r
-       }\r
-       \r
-       private String concatParentsToStoryFolder(BasicDBObject actual, String name) {\r
-                       String fields = "name,id,parent";\r
-                       Response response = query("StoryFolder/"+actual.getLong("id"), fields).get();\r
-                       String json = response.readEntity(String.class);\r
-                       BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
-                       BasicDBObject res = (BasicDBObject) resultObject.get("result");\r
-                       BasicDBObject parent = (BasicDBObject) res.get("parent");\r
-                       if(parent == null || parent.isEmpty())\r
-                               return name;\r
-                       String parentName = parent.getString("name");\r
-                       String actualName = actual.getString("name");\r
-                       String newName = String.format("%s/%s", parentName, actualName);\r
-                       return concatParentsToStoryFolder(parent, newName);\r
+               collection = db.getCollection(STORY_COLLECTION_NAME);\r
+               if (collection.count() == 0)\r
+                       collection.ensureIndex(ID);\r
        }\r
 \r
-       private void storeStoryFolders(BasicDBList storyFolders, Date lastUpdateTime) {\r
-               logger.trace(ENTER);\r
-               List<BasicDBObject> storyFolderList = NoSQLUtils.asList(storyFolders);\r
-               int idx = 1;\r
-               for (BasicDBObject storyFolder : storyFolderList) {\r
-                       logger.info(\r
-                                       String.format(CHECKING_STORY_FOLDER_S_D_D, storyFolder.getLong(ID), storyFolderList.size(), idx));\r
-                       storeStoryFolder(storyFolder, lastUpdateTime);\r
-                       idx++;\r
+       private void fireProgressEvent(ProgressEvent evt) {\r
+               logger.debug("Progress changed to " + evt.getProgress() + "%");\r
+               Object[] listeners = progressListenerList.getListenerList();\r
+               for (int i = 0; i < listeners.length; i += 2) {\r
+                       if (listeners[i] == IProgressEventListener.class)\r
+                               ((IProgressEventListener) listeners[i + 1]).progressChanged(evt);\r
                }\r
-               logger.trace(EXIT);\r
        }\r
 \r
-       private void storeStoryFolder(BasicDBObject storyFolder, Date lastUpdateTime) {\r
-               logger.trace(ENTER);\r
-               long storyFolderID = storyFolder.getLong(ID);\r
+       private Date getLastUpdateTime() {\r
+               Date result = null;\r
+               DBCollection collection = db.getCollection(TIME_COLLECTION_NAME);\r
+               DBObject timeObject = collection.findOne();\r
+               if (timeObject != null)\r
+                       result = (Date) timeObject.get(LASTUPDATE_TIME);\r
+               return result;\r
+       }\r
 \r
-               BasicDBObject storyFoldersWithStories = queryStoryFolder(storyFolderID);\r
-               BasicDBList stories = asDBList(storyFoldersWithStories, STORIES);\r
-               if (stories != null)\r
-                       storeStoryFolderStories(stories, storyFolderID, storyFolderID, lastUpdateTime);\r
-               storyFolder.put(MODIFIED, toDate(storyFolder, MODIFIED));\r
-               DBCollection collection = db.getCollection(STORY_FOLDER_COLLECTION_NAME);\r
-               if (lastUpdateTime == null || (lastUpdateTime != null && isModifiedRundown(lastUpdateTime, storyFolder))) {\r
-                       logger.trace(String.format("saving storyFolder %d", storyFolderID));\r
-                       collection.save(storyFolder);\r
-               }\r
-               logger.trace(EXIT);\r
+       private boolean isModified(Date date, BasicDBObject object, String name) {\r
+               Date actualModifiedString = toDate(object, name);\r
+               if (actualModifiedString == null)\r
+                       logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
+               int result = date.compareTo(actualModifiedString);\r
+               return result <= 0;\r
        }\r
 \r
-       private void storeStoryFolderStories(BasicDBList stories, long storyFolderID, long referenceID,\r
-                       Date lastUpdateTime) {\r
-               logger.trace(ENTER);\r
-               List<BasicDBObject> list = NoSQLUtils.asList(stories);\r
-               for (BasicDBObject story : list)\r
-                       storeStory(story, 0, referenceID, STORYFOLDER, lastUpdateTime);\r
-               logger.trace(EXIT);\r
+       private boolean isModifiedRundown(Date date, BasicDBObject object) {\r
+               Date modified = (Date) object.get(MODIFIED);\r
+               int result = date.compareTo(modified);\r
+               return result <= 0;\r
        }\r
 \r
        private Builder query(String path, String fields) {\r
@@ -200,28 +216,28 @@ public class OctopusDataMiner implements Runnable {
                return result;\r
        }\r
 \r
-       private BasicDBList queryRundowns(Date lastUpdateTime) {\r
+       private BasicDBObject queryRundown(long id) {\r
                logger.trace(ENTER);\r
-               BasicDBList result = null;\r
-               String fields = ID_NAME_MODIFIED_SCHEDULED_START;\r
-               Response response = query(RUNDOWN, fields).get();\r
+               BasicDBObject result = null;\r
+               String fields = SLUGS_FIELDS;\r
+               Response response = query(String.format("%s/", RUNDOWN) + id, fields).get();\r
                String json = response.readEntity(String.class);\r
                BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
                if (resultObject != null)\r
-                       result = asDBList(resultObject, RESULT);\r
+                       result = asDBObject(resultObject, RESULT);\r
                logger.trace(EXIT);\r
                return result;\r
        }\r
 \r
-       private BasicDBObject queryRundown(long id) {\r
+       private BasicDBList queryRundowns(Date lastUpdateTime) {\r
                logger.trace(ENTER);\r
-               BasicDBObject result = null;\r
-               String fields = SLUGS_FIELDS;\r
-               Response response = query(String.format("%s/", RUNDOWN) + id, fields).get();\r
+               BasicDBList result = null;\r
+               String fields = ID_NAME_MODIFIED_SCHEDULED_START;\r
+               Response response = query(RUNDOWN, fields).get();\r
                String json = response.readEntity(String.class);\r
                BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
                if (resultObject != null)\r
-                       result = asDBObject(resultObject, RESULT);\r
+                       result = asDBList(resultObject, RESULT);\r
                logger.trace(EXIT);\r
                return result;\r
        }\r
@@ -239,16 +255,70 @@ public class OctopusDataMiner implements Runnable {
                return result;\r
        }\r
 \r
-       private void storeRundowns(BasicDBList rundowns, Date lastUpdateTime) {\r
+       private BasicDBList queryStoryFolders(Date lastUpdateTime) {\r
                logger.trace(ENTER);\r
-               List<BasicDBObject> rundownsList = NoSQLUtils.asList(rundowns);\r
-               int idx = 1;\r
-               for (BasicDBObject rundown : rundownsList) {\r
-                       logger.info(String.format(CHECKING_RUNDOWN_S_D_D, rundown.getLong(ID), rundownsList.size(), idx));\r
-                       storeRundown(rundown, lastUpdateTime);\r
-                       idx++;\r
+               BasicDBList result = null;\r
+               String fields = ID_NAME_MODIFIED;\r
+               Response response = query(STORY_FOLDER, fields).get();\r
+               String json = response.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               if (resultObject != null)\r
+                       result = asDBList(resultObject, RESULT);\r
+\r
+               /*teszt*/\r
+               List<BasicDBObject> list = NoSQLUtils.asList(result);\r
+               for (BasicDBObject actual : list) {\r
+                       String fullName = concatParentsToStoryFolder(actual, actual.getString("name"));\r
+                       logger.info(String.format("fullname %s", fullName));\r
+                       actual.remove("name");\r
+                       actual.append("name", fullName);\r
                }\r
+\r
                logger.trace(EXIT);\r
+               return result;\r
+       }\r
+\r
+       public void removeProgressListener(IProgressEventListener listener) {\r
+               progressListenerList.remove(IProgressEventListener.class, listener);\r
+       }\r
+\r
+       @Override\r
+       public void run() {\r
+               logger.info(STARTING);\r
+               try {\r
+                       ensureIndexes();\r
+                       Date lastUpdateTime = getLastUpdateTime();\r
+                       setLastUpdateTime(new Date());\r
+                       BasicDBList rundowns = queryRundowns(lastUpdateTime);\r
+                       if (rundowns != null)\r
+                               storeRundowns(rundowns, lastUpdateTime);\r
+                       else {\r
+                               progressEvent.setProgress(50);\r
+                               fireProgressEvent(progressEvent);\r
+                       }\r
+\r
+                       BasicDBList storyFolders = queryStoryFolders(lastUpdateTime);\r
+                       if (storyFolders != null)\r
+                               storeStoryFolders(storyFolders, lastUpdateTime);\r
+                       else {\r
+                               progressEvent.setProgress(100);\r
+                               fireProgressEvent(progressEvent);\r
+                       }\r
+                       deleteOrphanStories();\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+               }\r
+               logger.trace(FINISHED);\r
+       }\r
+\r
+       public void setLastUpdateTime(Date lastUpdateTime) {\r
+               DBCollection collection = db.getCollection(OctopusAPI.TIME_COLLECTION_NAME);\r
+               DBObject timeObject = collection.findOne();\r
+               if (timeObject == null)\r
+                       timeObject = new BasicDBObject();\r
+               timeObject.put(LASTUPDATE_TIME, lastUpdateTime);\r
+\r
+               collection.save(timeObject);\r
        }\r
 \r
        private void storeRundown(BasicDBObject rundown, Date lastUpdateTime) {\r
@@ -269,92 +339,24 @@ public class OctopusDataMiner implements Runnable {
                logger.trace(EXIT);\r
        }\r
 \r
-       private void storeRundownStories(BasicDBList slugs, long referenceID, Date lastUpdateTime) {\r
+       private void storeRundowns(BasicDBList rundowns, Date lastUpdateTime) {\r
                logger.trace(ENTER);\r
-               List<BasicDBObject> slugsList = NoSQLUtils.asList(slugs);\r
-               for (BasicDBObject slug : slugsList) {\r
-                       if (slug.containsKey(STORY))\r
-                               storeStory((BasicDBObject) slug.get(STORY), slug.getInt(POSITION), referenceID, RUNDOWN2,\r
-                                               lastUpdateTime);\r
-               }\r
-               logger.trace(EXIT);\r
-       }\r
+               List<BasicDBObject> rundownsList = NoSQLUtils.asList(rundowns);\r
+               int idx = 1;\r
+               for (BasicDBObject rundown : rundownsList) {\r
+                       logger.info(String.format(CHECKING_RUNDOWN_S_D_D, rundown.getLong(ID), rundownsList.size(), idx));\r
+                       storeRundown(rundown, lastUpdateTime);\r
+                       int progress = idx * 50 / rundownsList.size();\r
+                       if (progress - progressEvent.getProgress() > 0) {\r
+                               progressEvent.setProgress(progress);\r
+                               fireProgressEvent(progressEvent);\r
+                       }\r
 \r
-       private void storeStory(BasicDBObject story, int position, long referenceID, String referenceName,\r
-                       Date lastUpdateTime) {\r
-               logger.trace(ENTER);\r
-               try {\r
-                       // a run v�g�n lek�rj�k az �sszes storyID-t az adatb�zisb�l\r
-                       // �s ha van olyan eleme annak a list�nak, ami nincs benne a\r
-                       // mem�ri�ban t�rolt storyIDs setben, t�r�lj�k adatb�zisb�l\r
-                       long storyID = story.getLong(ID);\r
-                       DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
-                       BasicDBObject modifiedStory = story;\r
-                       // boolean trashed = story.getBoolean(TRASHED);\r
-                       // modifiedStory.remove(TRASHED);\r
-                       // nem m�k�dik\r
-                       /*\r
-                        * if (trashed) { modifiedStory = (BasicDBObject)\r
-                        * collection.findOne(new BasicDBObject(ID, storyID), new\r
-                        * BasicDBObject(_ID, 1)); collection.remove(modifiedStory); } else\r
-                        */\r
-                       checkAndStoreStory(modifiedStory, lastUpdateTime, storyID, position, referenceID, referenceName,\r
-                                       collection);\r
-               } catch (Exception e) {\r
-                       logger.error(e);\r
-                       throw e;\r
+                       idx++;\r
                }\r
                logger.trace(EXIT);\r
        }\r
 \r
-       private void checkAndStoreStory(BasicDBObject modifiedStory, Date lastUpdateTime, long storyID, int position,\r
-                       long referenceID, String referenceName, DBCollection collection) {\r
-               boolean isContains = storyIDs.contains(storyID);\r
-               if (!isContains)\r
-                       storyIDs.add(storyID);\r
-               if (lastUpdateTime != null && !isModified(lastUpdateTime, modifiedStory, MODIFIED))\r
-                       return;\r
-               if (isContains) {\r
-                       logger.trace(PROCESSING_MULTI_REFERENCED_STORY_ID + storyID);\r
-                       modifiedStory = (BasicDBObject) collection.findOne(new BasicDBObject(ID, storyID));\r
-               }\r
-               BasicDBList references = asDBList(modifiedStory, referenceName);\r
-               if (references == null) {\r
-                       references = new BasicDBList();\r
-                       modifiedStory.append(referenceName, references);\r
-               }\r
-               references.add(new BasicDBObject(ID, referenceID).append(POSITION, position));\r
-               logger.info(String.format(SAVING_STORY_D, storyID));\r
-               collection.save(modifiedStory);\r
-       }\r
-\r
-       private BasicDBList asDBList(BasicDBObject obj, String name) {\r
-               BasicDBList result = null;\r
-               if (obj.containsKey(name) && (obj.get(name) instanceof BasicDBList))\r
-                       result = (BasicDBList) obj.get(name);\r
-               return result;\r
-       }\r
-\r
-       private BasicDBObject asDBObject(BasicDBObject obj, String name) {\r
-               BasicDBObject result = null;\r
-               if (obj.containsKey(name) && (obj.get(name) instanceof BasicDBObject))\r
-                       result = (BasicDBObject) obj.get(name);\r
-               return result;\r
-       }\r
-\r
-       private Date toDate(BasicDBObject obj, String name) {\r
-               Date result = null;\r
-               if (obj.containsKey(name)) {\r
-                       String dt = obj.getString(name);\r
-                       if (dt != null) {\r
-                               // create jodatime from date\r
-                               DateTime jdt = new DateTime(dt);\r
-                               result = jdt.toDate();\r
-                       }\r
-               }\r
-               return result;\r
-       }\r
-\r
        // private void insertStoryFoldersToDB2() {\r
        // DBCollection collection = db.getCollection(STORY_FOLDER_COLLECTION_NAME);\r
        // Set<String> storyKeys = storyFolders.keySet();\r
@@ -424,58 +426,94 @@ public class OctopusDataMiner implements Runnable {
        // storyFolders = converter.convertBasicDBObjectFromJson(result);\r
        // }\r
 \r
-       public void clear() {\r
-               db.getCollection(RUNDOWN_COLLECTION_NAME).remove();\r
-               db.getCollection(STORY_COLLECTION_NAME).remove();\r
-               db.getCollection(STORY_FOLDER_COLLECTION_NAME).remove();\r
-               db.getCollection(TIME_COLLECTION_NAME).remove();\r
+       private void storeRundownStories(BasicDBList slugs, long referenceID, Date lastUpdateTime) {\r
+               logger.trace(ENTER);\r
+               List<BasicDBObject> slugsList = NoSQLUtils.asList(slugs);\r
+               for (BasicDBObject slug : slugsList) {\r
+                       if (slug.containsKey(STORY))\r
+                               storeStory((BasicDBObject) slug.get(STORY), slug.getInt(POSITION), referenceID, RUNDOWN2, lastUpdateTime);\r
+               }\r
+               logger.trace(EXIT);\r
        }\r
 \r
-       private void ensureIndexes() {\r
-               DBCollection collection = db.getCollection(STORY_FOLDER_COLLECTION_NAME);\r
-               if (collection.count() == 0)\r
-                       collection.ensureIndex(ID);\r
-               collection = db.getCollection(RUNDOWN_COLLECTION_NAME);\r
-               if (collection.count() == 0) {\r
-                       collection.ensureIndex(ID);\r
-                       collection.ensureIndex(SCHEDULED_START);\r
+       private void storeStory(BasicDBObject story, int position, long referenceID, String referenceName, Date lastUpdateTime) {\r
+               logger.trace(ENTER);\r
+               try {\r
+                       // a run v�g�n lek�rj�k az �sszes storyID-t az adatb�zisb�l\r
+                       // �s ha van olyan eleme annak a list�nak, ami nincs benne a\r
+                       // mem�ri�ban t�rolt storyIDs setben, t�r�lj�k adatb�zisb�l\r
+                       long storyID = story.getLong(ID);\r
+                       DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
+                       BasicDBObject modifiedStory = story;\r
+                       // boolean trashed = story.getBoolean(TRASHED);\r
+                       // modifiedStory.remove(TRASHED);\r
+                       // nem m�k�dik\r
+                       /*\r
+                        * if (trashed) { modifiedStory = (BasicDBObject)\r
+                        * collection.findOne(new BasicDBObject(ID, storyID), new\r
+                        * BasicDBObject(_ID, 1)); collection.remove(modifiedStory); } else\r
+                        */\r
+                       checkAndStoreStory(modifiedStory, lastUpdateTime, storyID, position, referenceID, referenceName, collection);\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+                       throw e;\r
                }\r
-               collection = db.getCollection(STORY_COLLECTION_NAME);\r
-               if (collection.count() == 0)\r
-                       collection.ensureIndex(ID);\r
+               logger.trace(EXIT);\r
        }\r
 \r
-       private Date getLastUpdateTime() {\r
-               Date result = null;\r
-               DBCollection collection = db.getCollection(TIME_COLLECTION_NAME);\r
-               DBObject timeObject = collection.findOne();\r
-               if (timeObject != null)\r
-                       result = (Date) timeObject.get(LASTUPDATE_TIME);\r
-               return result;\r
-       }\r
+       private void storeStoryFolder(BasicDBObject storyFolder, Date lastUpdateTime) {\r
+               logger.trace(ENTER);\r
+               long storyFolderID = storyFolder.getLong(ID);\r
 \r
-       public void setLastUpdateTime(Date lastUpdateTime) {\r
-               DBCollection collection = db.getCollection(OctopusAPI.TIME_COLLECTION_NAME);\r
-               DBObject timeObject = collection.findOne();\r
-               if (timeObject == null)\r
-                       timeObject = new BasicDBObject();\r
-               timeObject.put(LASTUPDATE_TIME, lastUpdateTime);\r
+               BasicDBObject storyFoldersWithStories = queryStoryFolder(storyFolderID);\r
+               BasicDBList stories = asDBList(storyFoldersWithStories, STORIES);\r
+               if (stories != null)\r
+                       storeStoryFolderStories(stories, storyFolderID, storyFolderID, lastUpdateTime);\r
+               storyFolder.put(MODIFIED, toDate(storyFolder, MODIFIED));\r
+               DBCollection collection = db.getCollection(STORY_FOLDER_COLLECTION_NAME);\r
+               if (lastUpdateTime == null || (lastUpdateTime != null && isModifiedRundown(lastUpdateTime, storyFolder))) {\r
+                       logger.trace(String.format("saving storyFolder %d", storyFolderID));\r
+                       collection.save(storyFolder);\r
+               }\r
+               logger.trace(EXIT);\r
+       }\r
 \r
-               collection.save(timeObject);\r
+       private void storeStoryFolders(BasicDBList storyFolders, Date lastUpdateTime) {\r
+               logger.trace(ENTER);\r
+               List<BasicDBObject> storyFolderList = NoSQLUtils.asList(storyFolders);\r
+               int idx = 1;\r
+               for (BasicDBObject storyFolder : storyFolderList) {\r
+                       logger.info(String.format(CHECKING_STORY_FOLDER_S_D_D, storyFolder.getLong(ID), storyFolderList.size(), idx));\r
+                       storeStoryFolder(storyFolder, lastUpdateTime);\r
+                       int progress = 50 + (idx * 50 / storyFolderList.size());\r
+                       if (progress - progressEvent.getProgress() > 0) {\r
+                               progressEvent.setProgress(progress);\r
+                               fireProgressEvent(progressEvent);\r
+                       }\r
+                       idx++;\r
+               }\r
+               logger.trace(EXIT);\r
        }\r
 \r
-       private boolean isModified(Date date, BasicDBObject object, String name) {\r
-               Date actualModifiedString = toDate(object, name);\r
-               if (actualModifiedString == null)\r
-                       logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
-               int result = date.compareTo(actualModifiedString);\r
-               return result <= 0;\r
+       private void storeStoryFolderStories(BasicDBList stories, long storyFolderID, long referenceID, Date lastUpdateTime) {\r
+               logger.trace(ENTER);\r
+               List<BasicDBObject> list = NoSQLUtils.asList(stories);\r
+               for (BasicDBObject story : list)\r
+                       storeStory(story, 0, referenceID, STORYFOLDER, lastUpdateTime);\r
+               logger.trace(EXIT);\r
        }\r
 \r
-       private boolean isModifiedRundown(Date date, BasicDBObject object) {\r
-               Date modified = (Date) object.get(MODIFIED);\r
-               int result = date.compareTo(modified);\r
-               return result <= 0;\r
+       private Date toDate(BasicDBObject obj, String name) {\r
+               Date result = null;\r
+               if (obj.containsKey(name)) {\r
+                       String dt = obj.getString(name);\r
+                       if (dt != null) {\r
+                               // create jodatime from date\r
+                               DateTime jdt = new DateTime(dt);\r
+                               result = jdt.toDate();\r
+                       }\r
+               }\r
+               return result;\r
        }\r
 \r
 }\r
index d6edd1c049a141b834a4fed086a3e923be31280c..b0d88fda795d03c97428ab23fe1bd9dc79938422 100644 (file)
@@ -98,9 +98,11 @@ public class FtpDirectoryLister implements IDirectoryLister {
        }\r
 \r
        @Override\r
-       public void delete(RemoteFile remoteFile) {\r
-               // TODO Auto-generated method stub\r
-\r
+       public void delete(RemoteFile remoteFile) throws Exception {\r
+               if (remoteFile.getSourceObject() instanceof FTPFile) {\r
+                       FTPFile ftpFile = (FTPFile) remoteFile.getSourceObject();\r
+                       ftpClient.deleteFile(ftpFile.getName());\r
+               }\r
        }\r
 \r
        @Override\r
@@ -111,7 +113,7 @@ public class FtpDirectoryLister implements IDirectoryLister {
                        FTPFile[] files = ftpClient.listFiles(fileName);\r
                        if (files != null && files.length == 1)\r
                                result = toRemoteFile(files[0]);\r
-                       cleanUp();\r
+                       //                      cleanUp();\r
                }\r
                if (result == null)\r
                        throw new Exception("File not exists: " + fileName + " on uri " + storeUri);\r
@@ -156,7 +158,7 @@ public class FtpDirectoryLister implements IDirectoryLister {
                                file.setSize(ftpFile.getSize());\r
                                result.add(file);\r
                        }\r
-                       cleanUp();\r
+                       //                      cleanUp();\r
                }\r
                return result;\r
        }\r
@@ -166,6 +168,18 @@ public class FtpDirectoryLister implements IDirectoryLister {
                throw new NotImplementedException();\r
        }\r
 \r
+       @Override\r
+       public List<RemoteFile> list(String wildCard) throws Exception {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public void list(String wildCard, IRemoteFileListCallback callback) throws Exception {\r
+               // TODO Auto-generated method stub\r
+\r
+       }\r
+\r
        private RemoteFile toRemoteFile(FTPFile file) {\r
                RemoteFile result = new RemoteFile();\r
                result.setName(file.getName());\r
@@ -173,6 +187,7 @@ public class FtpDirectoryLister implements IDirectoryLister {
                result.setModify(new Timestamp(file.getTimestamp().getTimeInMillis()));\r
                result.setIsFolder(file.isDirectory());\r
                result.setSize(file.getSize());\r
+               result.setSourceObject(file);\r
                return result;\r
        }\r
 \r
index 8b61253c8eb071503f0fc20ea2c630e2d13eea80..d3df24073e368ec4a178588d92f6d0edd829b5ee 100644 (file)
@@ -25,4 +25,8 @@ public interface IDirectoryLister {
 \r
        void list(IRemoteFileListCallback callback) throws Exception;\r
 \r
+       List<RemoteFile> list(String wildCard) throws Exception;\r
+\r
+       void list(String wildCard, IRemoteFileListCallback callback) throws Exception;\r
+\r
 }\r
index bc431906e9fa0122389cb11b6aca55afcbdc5496..dd9f3b8399f6f8650d5a41e227fe20deb6028806 100644 (file)
@@ -104,6 +104,18 @@ public class LocalDirectoryLister implements IDirectoryLister {
                throw new NotImplementedException();\r
        }\r
 \r
+       @Override\r
+       public List<RemoteFile> list(String wildCard) throws Exception {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public void list(String wildCard, IRemoteFileListCallback callback) throws Exception {\r
+               // TODO Auto-generated method stub\r
+\r
+       }\r
+\r
        private RemoteFile toRemoteFile(File file) {\r
                RemoteFile result = new RemoteFile();\r
                result.setName(file.getName());\r
index 3ae29850223e52337bd4426517c3396213ad5813..9be677918936e7fdeae0a2be00cfa5388058393e 100644 (file)
@@ -104,6 +104,35 @@ public class SambaDirectoryLister implements IDirectoryLister {
                }\r
        }\r
 \r
+       @Override\r
+       public List<RemoteFile> list(String wildCard) throws Exception {\r
+               List<RemoteFile> result = new ArrayList<RemoteFile>();\r
+               NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, storeUri.getUserName(), storeUri.getPassword());\r
+               String path = "smb:" + storeUri.toString(true).replace("\\", "/");\r
+               SmbFile smbFile = new SmbFile(path, auth);\r
+               SmbFile[] list = smbFile.listFiles(wildCard);\r
+               for (SmbFile smb : list) {\r
+                       RemoteFile file = toRemoteFile(smb);\r
+                       result.add(file);\r
+               }\r
+               return result;\r
+       }\r
+\r
+       @Override\r
+       public void list(String wildCard, IRemoteFileListCallback callback) throws Exception {\r
+               NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null, storeUri.getUserName(), storeUri.getPassword());\r
+               String path = "smb:" + storeUri.toString(true).replace("\\", "/");\r
+               SmbFile smbFile = new SmbFile(path, auth);\r
+               SmbFile[] list = smbFile.listFiles(wildCard);\r
+               for (SmbFile smb : list) {\r
+                       RemoteFile file = toRemoteFile(smb);\r
+                       if (callback != null) {\r
+                               if (!callback.onRemoteFile(file))\r
+                                       break;\r
+                       }\r
+               }\r
+       }\r
+\r
        private RemoteFile toRemoteFile(SmbFile file) throws Exception {\r
                RemoteFile result = new RemoteFile();\r
                result.setName(file.getName());\r
index a763786e7f0719f38a0efec36f801149711c0d24..80db5c0a175dcac86543a1181805ca3db18131c2 100644 (file)
@@ -90,6 +90,18 @@ public class TSMLister implements IDirectoryLister {
                throw new NotImplementedException();\r
        }\r
 \r
+       @Override\r
+       public List<RemoteFile> list(String wildCard) throws Exception {\r
+               // TODO Auto-generated method stub\r
+               return null;\r
+       }\r
+\r
+       @Override\r
+       public void list(String wildCard, IRemoteFileListCallback callback) throws Exception {\r
+               // TODO Auto-generated method stub\r
+\r
+       }\r
+\r
        private RemoteFile toRemoteFile(TSMBackupFileObject file) {\r
                RemoteFile result = new RemoteFile();\r
                result.setName(file.getLowLevelName());\r
index 39f8925b72190f9ffc305ee71aacb29a2ff4b448..b0bcd13f81f6367c3c6e94b58a8c7908506d2998 100644 (file)
@@ -125,7 +125,7 @@ class JobDAO extends EntityBaseDAO {
                        //ResultSetIterImpl iter = null;\r
                        #sql [context] iter = { SELECT ID, NAME, OWNER, PRIORITY, PROGRESS, STATUS, DESCRIPTION, SUBMITTED, FINISHED, TEMPLATE, SCHEDULEDTIME \r
                                                                        FROM JOB WHERE TEMPLATE = :template\r
-                                                                       AND STATUS IN ('EXECUTING', 'WAIT_EXECUTOR', 'WAIT_SUSPEND', 'SUSPENDED', 'RUNABLE')};\r
+                                                                       AND STATUS IN ('EXECUTING', 'WAIT_EXECUTOR', 'WAIT_SUSPEND', 'RUNABLE')};\r
                        result = getList(context, iter, false);\r
                } catch (Exception e) {\r
                        throw new ItemManagerException(e);\r
index 2990262194a811a78fd93fd30fb7006e5f03404e..10098123b1c904063c450d75db5eff936dee30b9 100644 (file)
@@ -8,6 +8,8 @@ import java.util.List;
 import org.apache.commons.lang.ArrayUtils;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+import org.apache.logging.log4j.MarkerManager;\r
 \r
 import user.jobengine.server.IJobEngine;\r
 import user.jobengine.server.IJobRuntime;\r
@@ -38,6 +40,14 @@ public class JobStep implements IJobStep {
        public void cleanup() {\r
        }\r
 \r
+       protected Marker getMarker() {\r
+               return MarkerManager.getMarker(getRuntimeName());\r
+       }\r
+\r
+       protected String getRuntimeName() {\r
+               return jobRuntime.getName();\r
+       }\r
+\r
        @Override\r
        public Object[] run(IJobEngine jobEngine, IJobRuntime jobRuntime, Object[] inputs) throws Exception {\r
                Object[] result = null;\r