git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 6 Dec 2017 15:51:53 +0000 (15:51 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 6 Dec 2017 15:51:53 +0000 (15:51 +0000)
22 files changed:
client/Maestro/Configuration/-ACTIVE-configuration-vezerlo.json [moved from client/Maestro/Configuration/ACTIVE-configuration-vezerlo.json with 100% similarity]
client/Maestro/Configuration/configuration-studio.json [moved from client/Maestro/Configuration/-configuration-studio.json with 100% similarity]
client/Maestro/Installer/installforge-installer-project.ifp
client/Maestro/Maestro.csproj
client/Maestro/MaestroForm.Metadata.cs
client/Maestro/Properties/AssemblyInfo.cs
client/Maestro/Sources/NexioRESTSource.cs
server/-configuration/log4j2.xml
server/-configuration/run-mediacube-server.launch
server/-configuration/scheduledjobs.json
server/user.jobengine.executors/src/user/jobengine/server/steps/FakeStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/SyncOCTOPUSDataStep.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioClipEventDispatcher.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioDataMiner.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/api/ClipEventType.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/api/MediaListener.java
server/user.jobengine.osgi.commons/src/user/commons/nosql/NoSQLUtils.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/IOctopusAPI.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/OctopusDataMiner.java
server/user.jobengine.osgi.commons/test/user/common/octopus/test/OctopusDataMinerTest.java
server/user.jobengine.osgi.services/deploy.launch
server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/nexio/NexioWSServlet.java

index e88bb6a8db0ea5531daed1c553f8ff14d8663c39..abebe9357d4e4b3b3e5255dfc224db98b5f0489f 100644 (file)
Binary files a/client/Maestro/Installer/installforge-installer-project.ifp and b/client/Maestro/Installer/installforge-installer-project.ifp differ
index 5cc53d9196cecdd215969140f5236e271d5af8ed..c21783fcfe7ed02723d9d80da4b3890297b676c9 100644 (file)
     <None Include="Configuration\-ACTIVE-configuration-nle.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
-    <None Include="Configuration\ACTIVE-configuration-vezerlo.json">\r
+    <None Include="Configuration\-ACTIVE-configuration-vezerlo.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
     <None Include="Configuration\-configuration-archive.json">\r
     <None Include="Configuration\-configuration-sxs.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
-    <None Include="Configuration\-configuration-studio.json">\r
+    <None Include="Configuration\configuration-studio.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
   </ItemGroup>\r
index 9ad1a3a3ce27347540f01de9c4070c5d1ac5ac51..23c11a6d12283d2c86a7e4b2f90fc7f3446c29c6 100644 (file)
@@ -170,12 +170,16 @@ namespace Maestro {
             if (movieSegments == null)\r
                 movieSegments = new BindingList<MovieSegment>();\r
             bool readOnly = true;\r
-            if (ArchiveMetadata == null)\r
-                MsgBox.Error("A metaadatok nem elérhetők, a szegmens definiálás nem engedélyezett.");\r
-            else {\r
+            if (ArchiveMetadata == null) {\r
+                ArchiveMetadata = GetArchiveMetadata();\r
+                if (ArchiveMetadata == null)\r
+                    MsgBox.Error("A metaadatok nem elérhetők, a szegmens definiálás nem engedélyezett.");\r
+                else\r
+                    readOnly = ArchiveMetadata.ok;\r
+            } else\r
                 readOnly = ArchiveMetadata.ok;\r
+            if (readOnly && ArchiveMetadata != null)\r
                 MsgBox.Warning("Az anyag már el van fogadva, a szegmens módosítás nem kerül mentésre. A szegmensek módosításához vissza kell vonni az anyag elfogadását az adástervező rendszerben.");\r
-            }\r
             OpenFile(SelectedSource.FileInfo, true, readOnly);\r
             UpdateDefineSegmentsStatus();\r
         }\r
index d6d602d5f29a42177ba5b6cd4d50aabe06dd911f..fab38224b434a11fb1241e05fe343affcafe252c 100644 (file)
@@ -32,5 +32,5 @@ using System.Runtime.InteropServices;
 // You can specify all the values or you can default the Build and Revision Numbers\r
 // by using the '*' as shown below:\r
 // [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("2.0.6.5")]\r
-[assembly: AssemblyFileVersion("2.0.6.5")]\r
+[assembly: AssemblyVersion("2.0.6.6")]\r
+[assembly: AssemblyFileVersion("2.0.6.6")]\r
index da2220c5c69362c00dfe9ed73020575c7fc12084..2bed6e4395d34ec43b2073f631a52e6753c3178f 100644 (file)
@@ -23,6 +23,7 @@ namespace Maestro.Sources {
         private const string EXTAGENCY = "extagency";\r
         private const string DURATION = "duration";\r
         private const string MODIFIED = "modifiedtimestamp";\r
+        private const string MXFEXT = ".MXF";\r
         private List<String> acceptableAgencies = new List<string>();\r
         private List<NexioSourceItem> cache;\r
         private IMessageBus messageBus;\r
@@ -175,32 +176,38 @@ namespace Maestro.Sources {
         }\r
 \r
         private void OnResponse(object sender, MessageEventArgs e) {\r
-            JObject resultObject = JObject.Parse(e.Data);\r
-            JToken jToken = resultObject.GetValue(NexioAPI.DATA);\r
+            try {\r
+                JObject resultObject = JObject.Parse(e.Data);\r
+                JToken jToken = resultObject.GetValue(NexioAPI.DATA);\r
 \r
-            if (!jToken.HasValues)\r
-                return;\r
-            JToken d = JToken.Parse(jToken.ToString());\r
-            string action = resultObject.GetValue(NexioAPI.ACTION).ToString();\r
-            switch (action) {\r
-                case NexioAPI.LIST:\r
-                    OnList(d);\r
-                    break;\r
-                case NexioAPI.CREATE:\r
-                    if (!initialized)\r
-                        return;\r
-                    OnCreated(d);\r
-                    break;\r
-                case NexioAPI.DELETE:\r
-                    if (!initialized)\r
-                        return;\r
-                    OnDeleted(d);\r
-                    break;\r
-                case NexioAPI.UPDATE:\r
-                    if (!initialized)\r
-                        return;\r
-                    OnChanged(d);\r
-                    break;\r
+                if (!jToken.HasValues)\r
+                    return;\r
+                JToken d = JToken.Parse(jToken.ToString());\r
+                string action = resultObject.GetValue(NexioAPI.ACTION).ToString();\r
+                switch (action) {\r
+                    case NexioAPI.LIST:\r
+                        OnList(d);\r
+                        break;\r
+                    case NexioAPI.CREATE:\r
+                        if (!initialized)\r
+                            return;\r
+                        OnCreated(d);\r
+                        break;\r
+                    case NexioAPI.DELETE:\r
+                        if (!initialized)\r
+                            return;\r
+                        OnDeleted(d);\r
+                        break;\r
+                    case NexioAPI.UPDATE:\r
+                        if (!initialized)\r
+                            return;\r
+                        OnChanged(d);\r
+                        break;\r
+                }\r
+            }\r
+            catch (Exception ex) {\r
+                logger.Error(ex);\r
+                MsgBox.Error(ex.Message);\r
             }\r
         }\r
 \r
@@ -213,15 +220,19 @@ namespace Maestro.Sources {
         }\r
 \r
         private void SetItem(ref NexioSourceItem item, JToken token) {\r
-            item.ID = token[ID].ToString();\r
-            item.Name = token[LONGNAMEID].ToString() + ".MXF";\r
-            item.Agency = token[EXTAGENCY]?.ToString();\r
-            item.Created = DateTime.Parse(token[RECORDDATE]?.ToString());\r
-            item.Modified = DateTime.Parse(token[MODIFIED]?.ToString());\r
-            int d = token.Value<int>(DURATION);\r
-            if (d < 0)\r
-                d = d * -1;\r
-            item.Duration = new Timecode(d).ToString();\r
+            try {\r
+                item.ID = token[ID].ToString();\r
+                item.Name = token[LONGNAMEID].ToString() + MXFEXT;\r
+                item.Agency = token[EXTAGENCY]?.ToString();\r
+                item.Created = DateTime.Parse(token[RECORDDATE]?.ToString());\r
+                item.Modified = DateTime.Parse(token[MODIFIED]?.ToString());\r
+                int d = token.Value<int>(DURATION);\r
+                item.Duration = new Timecode(d).ToString();\r
+            }\r
+            catch (Exception e) {\r
+                logger.Error(e.Message);\r
+            }\r
\r
         }\r
 \r
 \r
@@ -235,7 +246,7 @@ namespace Maestro.Sources {
                     Where(x => x.CanHandle(acceptableAgencies)).\r
                     OrderByDescending(i => i.Created).\r
                     ToList().ForEach(i => Add(i));\r
-                    initialized = true;\r
+                initialized = true;\r
             });\r
         }\r
 \r
index 9e0ab538c2542ad8fe7fc576ed7a5f48c06d9b7f..f6606e9115481cfb3f21efeed79b8c1db401427b 100644 (file)
@@ -57,6 +57,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" level="debug" />\r
+               <logger name="user.commons.nexio" level="info" />\r
        </Loggers>\r
 </Configuration>
\ No newline at end of file
index 2f966b043f1c0fcc542a825f7f4bb792ad9c3105..fd9c1e1d54aa38211dd278212d0bdaab03d80285 100644 (file)
@@ -19,7 +19,7 @@
 <stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.eclipse.equinox.http.jetty.http.port=8080&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/user/jobengine/server/steps&quot;&#13;&#10;-Djobengine.transcoder.source=c:\_Movie\hires\&#13;&#10;-Djetty.home=&quot;${workspace_loc:-configuration}/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v4.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=10.10.1.56"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.eclipse.equinox.http.jetty.http.port=8080&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB;&#13;&#10;-Djobengine.nexio.db.user=sa&#13;&#10;-Djobengine.nexio.db.password=resolve&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/user/jobengine/server/steps&quot;&#13;&#10;-Djobengine.transcoder.source=c:\_Movie\hires\&#13;&#10;-Djetty.home=&quot;${workspace_loc:-configuration}/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v4.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Dnexio.useMOSGateway=true"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
 <booleanAttribute key="show_selected_only" value="false"/>\r
 <stringAttribute key="target_bundles" value="cglib@default:default,com.auth0.java-jwt@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.google.guava@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,com.sun.el.javax.el@default:default,commons-logging@default:default,javassist@default:default,javax.annotation-api@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.servlet.jsp-api@default:default,javax.validation.api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.jasper.glassfish@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jdt.core.compiler.batch@default:default,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jsp@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.jvnet.mimepull@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.reflections@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
index a430fef5f4394b44f9b5ef66d762780cea715b85..7a8ea8ccf222fa936c3898794980fa8153e49208 100644 (file)
        {\r
       "active": false,\r
          "name" : "Teszt folyamat",\r
-      "template": "fake.xml",\r
+      "template": "fake-noparams.xml",\r
       "executeimmediate": false,\r
       "cronexpression": "0/10 * * ? * *",\r
       "parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
index 9e7a831cc8bb424fcacec6dcfecce3392a021905..fd7c139fb8ed42e380d87f2ded576897d5045501 100644 (file)
@@ -12,20 +12,21 @@ public class FakeStep extends JobStep {
 \r
        @StepEntry\r
        public Object[] execute(long itemID, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
-               throw new Exception("42");\r
-               //              try {\r
-               //                      for (int i = 0; i < count; i++) {\r
-               //                              if (!canContinue())\r
-               //                                      break;\r
-               //                              jobRuntime.incrementProgress((i + 1) * count);\r
-               //                              Thread.sleep(1000);\r
-               //                              //logger.info(getMarker(), "Log markered");\r
-               //                              //logger.info("Progress {}", jobRuntime.getProgress());\r
-               //                      }\r
-               //              } catch (Exception e) {\r
-               //                      logger.error(e.getMessage());\r
-               //              }\r
-               //return null;\r
+               //              throw new Exception("42");\r
+               Object[] result = { 1 };\r
+               try {\r
+                       for (int i = 0; i < count; i++) {\r
+                               if (!canContinue())\r
+                                       break;\r
+                               jobRuntime.incrementProgress((i + 1) * count);\r
+                               Thread.sleep(1000);\r
+                               //logger.info(getMarker(), "Log markered");\r
+                               //logger.info("Progress {}", jobRuntime.getProgress());\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.error(e.getMessage());\r
+               }\r
+               return result;\r
        }\r
 \r
 }\r
index 19a59c3525a5bf410a16f5c90238dff783d4d3fa..07510c89c9e5931fb6529d44cfb789b3b7df241f 100644 (file)
@@ -24,10 +24,10 @@ public class SyncOCTOPUSDataStep extends JobStep {
        }\r
 \r
        @StepEntry\r
-       public Object[] execute(boolean forceFull, IJobEngine jobEngine, final IJobRuntime jobRuntime) {\r
+       public Object[] execute(boolean forceFull, IJobEngine jobEngine, final IJobRuntime jobRuntime) throws Exception {\r
                OctopusDataMiner dataMiner = null;\r
                try {\r
-                       jobRuntime.incrementProgress(10);\r
+                       //jobRuntime.incrementProgress(10);\r
                        progressListener = createListener(jobRuntime);\r
                        dataMiner = new OctopusDataMiner();\r
                        dataMiner.addProgressListener(progressListener);\r
index 712fff3efa1205b66f3cb0d4fb154c6542f92550..86c3b18f44160c95f56a97d12284840c3ee2945f 100644 (file)
@@ -38,8 +38,10 @@ import user.commons.remotestore.IProgressEventListener;
  */\r
 \r
 public class NexioClipEventDispatcher implements ClipEventListener {\r
+\r
        private static final Logger logger = LogManager.getLogger();\r
 \r
+       private static final String NEXIO_USE_MOS_GATEWAY = "nexio.useMOSGateway";\r
        private static final String ID = "id";\r
        private static final String VIDEO_FORMAT = "videoformat";\r
        private static final String VIDEO_BITRATE = "videobitrate";\r
@@ -128,6 +130,9 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                                BasicDBObject jsClip = new BasicDBObject();\r
                                jsClip.put(ID, evt.getClip().getId().get()); //Unique internal ID\r
                                removeDeleted(jsClip);\r
+                       } else if (evt.getEventType() == ClipEventType.LISTENER_RESTART_NEEDED) {\r
+                               shutdown();\r
+                               startup();\r
                        }\r
                } catch (Exception exc) {\r
                        logger.error("", exc);\r
@@ -174,11 +179,6 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                } catch (Exception e) {\r
                        //                      System.out.println(e);\r
                }\r
-               try {\r
-                       jsClip.put(FILESIZE, clip.getFileSize());\r
-               } catch (Exception e) {\r
-                       //                      System.out.println(e);\r
-               }\r
                try {\r
                        String agency = new String(clip.getExtendedField(GetExtendedFieldCommand.FN_AGENCY), INexioAPI.ENCODING);\r
                        jsClip.put(EXTAGENCY, agency);\r
@@ -190,9 +190,6 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                } catch (Exception e) {\r
                        //                      System.out.println(e);\r
                }\r
-               //jsClip.put(RECORDDATE, new DateTime(rs.getString(i++)).toDate());\r
-               //jsClip.put(EXTAGENCY, rs.getString(i++));\r
-               //jsClip.put(START, rs.getString(i++));\r
                //System.out.println(String.format("ID = '%s'\tXID = '%s'\tDuration = '%s'\tModified = '%s'\tVideoFormat = '%s'\tVideoBitrate = '%s'", id, xid, duration, modifiedTimestamp.getTime(), videoFormat, videoBitrate));\r
                return jsClip;\r
        }\r
@@ -221,7 +218,7 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                                        logger.debug("Found NEXIO clip: {} XID IS MISSING!!", clip.getId());\r
                                }\r
                        } catch (Exception e) {\r
-                               logger.error("", e);\r
+                               logger.catching(e);\r
                        }\r
                }\r
                logger.info("NEXIO metadata import completed.");\r
@@ -367,7 +364,8 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                                if (!clip.equals(clipForID)) {\r
                                        collection.save(clip);\r
                                        onUpdate(clip);\r
-                               }\r
+                               } else\r
+                                       logger.warn("Not found {}, XID based clip is {}", id, clipForXID.toPrettyString(null));\r
                        }\r
                }\r
        }\r
@@ -404,17 +402,24 @@ public class NexioClipEventDispatcher implements ClipEventListener {
                        logger.catching(e);\r
                        return;\r
                }\r
-               logger.info("NEXIO server is connected.");\r
+               logger.info("NEXIO server connected");\r
 \r
                this.progressListenerList = new EventListenerList();\r
                this.dropAllClipsFromMongo();\r
                this.ensureIndexes();\r
-\r
+               boolean[] useMOSGateway = { false };\r
+               try {\r
+                       useMOSGateway[0] = Boolean.parseBoolean(System.getProperty(NEXIO_USE_MOS_GATEWAY));\r
+               } finally {\r
+               }\r
                executor.submit(() -> {\r
                        try {\r
-                               //1. kezdeti masolas\r
-                               copyClipsIntoMongo();\r
-                               //2. esemeny feliratkozas\r
+                               if (useMOSGateway[0]) {\r
+                                       NexioDataMiner dm = new NexioDataMiner();\r
+                                       dm.transferClips();\r
+                               } else {\r
+                                       copyClipsIntoMongo();\r
+                               }\r
                                NexioClipEventDispatcher.this.controller.getMediabase().startMediaListener();\r
                                NexioClipEventDispatcher.this.controller.getMediabase().getMediaListener().addClipEventListener(NexioClipEventDispatcher.this);\r
                        } catch (Exception e) {\r
index b937f65fdf4733cf3d1c8a7a1aff2098f410366f..b6c4a6b85d6a6651c20daf04a481b306d1b026fe 100644 (file)
@@ -15,7 +15,6 @@ import javax.swing.event.EventListenerList;
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
-import org.joda.time.DateTime;\r
 import org.osgi.framework.Bundle;\r
 import org.osgi.framework.BundleContext;\r
 import org.osgi.framework.FrameworkUtil;\r
@@ -43,19 +42,32 @@ public class NexioDataMiner implements Runnable, INexioChangeListener {
        private static final String EXTAGENCY = "extagency";\r
        private static final String RECORDDATE = "recorddate";\r
        private static final String LONGNAMEID = "longnameid";\r
+       private static final String ID = "id";\r
        public static final String CLIP_COLLECTION_NAME = "nexioclips";\r
+       private static final String VIDEOBITRATE = "videobitrate";\r
+       private static final String VIDEOFORMAT = "videoformat";\r
+       private static final String KILLDATE = "killdate";\r
        private static String url, user, pass;\r
-       private EventListenerList progressListenerList;\r
-       private ProgressEvent progressEvent = new ProgressEvent(this, 0);\r
-       private INexioChangeListener nexioChangeListener;\r
-       private DB db;\r
-\r
        static {\r
                url = System.getProperty(JOBENGINE_NEXIO_DB_URL);\r
                user = System.getProperty(JOBENGINE_NEXIO_DB_USER);\r
                pass = System.getProperty(JOBENGINE_NEXIO_DB_PASSWORD);\r
        }\r
 \r
+       private static Connection getSQLConnection() throws ClassNotFoundException, SQLException {\r
+               Connection result = null;\r
+               Class.forName(SQLSERVER_JDBC_SQL_SERVER_DRIVER);\r
+               result = DriverManager.getConnection(url, user, pass);\r
+               return result;\r
+       }\r
+\r
+       private EventListenerList progressListenerList;\r
+       private ProgressEvent progressEvent = new ProgressEvent(this, 0);\r
+\r
+       private INexioChangeListener nexioChangeListener;\r
+\r
+       private DB db;\r
+\r
        public NexioDataMiner() {\r
                this.progressListenerList = new EventListenerList();\r
                db = NoSQLUtils.getNoSQLDB();\r
@@ -66,15 +78,40 @@ public class NexioDataMiner implements Runnable, INexioChangeListener {
                progressListenerList.add(IProgressEventListener.class, listener);\r
        }\r
 \r
-       public void removeProgressListener(IProgressEventListener listener) {\r
-               progressListenerList.remove(IProgressEventListener.class, listener);\r
+       private void ensureIndexes() {\r
+               DBCollection collection = db.getCollection(CLIP_COLLECTION_NAME);\r
+               if (collection.count() == 0)\r
+                       collection.ensureIndex(LONGNAMEID);\r
        }\r
 \r
-       private static Connection getSQLConnection() throws ClassNotFoundException, SQLException {\r
-               Connection result = null;\r
-               Class.forName(SQLSERVER_JDBC_SQL_SERVER_DRIVER);\r
-               result = DriverManager.getConnection(url, user, pass);\r
-               return result;\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
+       }\r
+\r
+       @Override\r
+       public void onCreate(BasicDBObject data) {\r
+               logger.debug("onCreate clip: " + data);\r
+               if (nexioChangeListener != null)\r
+                       nexioChangeListener.onCreate(data);\r
+       }\r
+\r
+       @Override\r
+       public void onDelete(BasicDBObject data) {\r
+               logger.debug("onDelete clip: " + data);\r
+               if (nexioChangeListener != null)\r
+                       nexioChangeListener.onDelete(data);\r
+       }\r
+\r
+       @Override\r
+       public void onUpdate(BasicDBObject data) {\r
+               logger.debug("onUpdate clip: " + data);\r
+               if (nexioChangeListener != null)\r
+                       nexioChangeListener.onUpdate(data);\r
        }\r
 \r
        public Map<String, BasicDBObject> queryClips(Connection con) {\r
@@ -82,19 +119,21 @@ public class NexioDataMiner implements Runnable, INexioChangeListener {
                int count = queryClipsCount(con);\r
                logger.debug("Clips count is {}", count);\r
 \r
-               String querySQL = "SELECT c.longnameid, CONVERT(NVARCHAR(30), c.recorddate, 126) as recordate, c.extagency, CONVERT(NVARCHAR(30), cd.modifiedtimestamp, 126) as modifiedtimestamp, cd.start, cd.duration FROM ClipsTbl c LEFT OUTER JOIN ClipsDomainsTbl cd ON (cd.longnameid = c.longnameid)";\r
+               String querySQL = "SELECT cd.id, c.longnameid, c.recorddate, c.extagency, cd.id, cd.modifiedtimestamp, cd.duration, cd.videoformat, cd.videobitrate FROM ClipsTbl c LEFT OUTER JOIN ClipsDomainsTbl cd ON (cd.longnameid = c.longnameid)";\r
                logger.debug("Executing statement: {}", querySQL);\r
                try (PreparedStatement stmt = con.prepareStatement(querySQL); ResultSet rs = stmt.executeQuery();) {\r
                        int idx = 1;\r
                        while (rs.next()) {\r
-                               int i = 1;\r
                                BasicDBObject clip = new BasicDBObject();\r
-                               clip.put(LONGNAMEID, rs.getString(i++));\r
-                               clip.put(RECORDDATE, new DateTime(rs.getString(i++)).toDate());\r
-                               clip.put(EXTAGENCY, rs.getString(i++));\r
-                               clip.put(MODIFIEDTIMESTAMP, new DateTime(rs.getString(i++)).toDate());\r
-                               clip.put(START, rs.getString(i++));\r
-                               clip.put(DURATION, rs.getLong(i++));\r
+                               clip.put(ID, rs.getString(ID));\r
+                               clip.put(LONGNAMEID, rs.getString(LONGNAMEID));\r
+                               clip.put(RECORDDATE, rs.getDate(RECORDDATE).getTime());\r
+                               clip.put(EXTAGENCY, rs.getString(EXTAGENCY));\r
+                               clip.put(MODIFIEDTIMESTAMP, rs.getDate(MODIFIEDTIMESTAMP).getTime());\r
+                               clip.put(KILLDATE, rs.getDate(KILLDATE).getTime());\r
+                               clip.put(VIDEOBITRATE, rs.getString(VIDEOBITRATE));\r
+                               clip.put(VIDEOFORMAT, rs.getString(VIDEOFORMAT));\r
+                               clip.put(DURATION, rs.getLong(DURATION));\r
                                result.put(clip.getString(LONGNAMEID), clip);\r
                                int progress = idx * 50 / count;\r
                                if (progress - progressEvent.getProgress() > 0) {\r
@@ -121,15 +160,44 @@ public class NexioDataMiner implements Runnable, INexioChangeListener {
                return count;\r
        }\r
 \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
+       private Map<String, BasicDBObject> readClips() {\r
+               Map<String, BasicDBObject> result = new HashMap<>();\r
+               DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
+               DBCursor find = collection.find();\r
+               if (find.hasNext()) {\r
+                       List<BasicDBObject> clips = ListUtils.cast(find.toArray());\r
+                       result = ListUtils.map(clips, item -> item.getString(LONGNAMEID));\r
+                       for (BasicDBObject clip : clips)\r
+                               result.put(clip.getString(LONGNAMEID), clip);\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private void removeDeleted(Map<String, BasicDBObject> remoteClips, Map<String, BasicDBObject> localClips) {\r
+               Set<String> remoteNames = new HashSet<>(remoteClips.keySet());\r
+               Set<String> localNames = new HashSet<>(localClips.keySet());\r
+               localNames.removeAll(remoteNames);\r
+               if (localNames.isEmpty())\r
+                       logger.debug("Nothing to remove");\r
+\r
+               DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
+               for (String name : localNames) {\r
+                       logger.debug("Removing {}", name);\r
+\r
+                       BasicDBObject clip = localClips.get(name);\r
+                       collection.remove(clip);\r
+                       onDelete(clip);\r
                }\r
        }\r
 \r
+       public void removeProgressListener(IProgressEventListener listener) {\r
+               progressListenerList.remove(IProgressEventListener.class, listener);\r
+       }\r
+\r
+       public void reset() {\r
+               db.getCollection(CLIP_COLLECTION_NAME).drop();\r
+       }\r
+\r
        @Override\r
        public void run() {\r
                try (Connection con = getSQLConnection()) {\r
@@ -151,8 +219,7 @@ public class NexioDataMiner implements Runnable, INexioChangeListener {
                if (bundle != null) {\r
                        BundleContext bundleContext = bundle.getBundleContext();\r
                        if (bundleContext != null) {\r
-                               ServiceReference<INexioChangeListener> reference = bundleContext\r
-                                               .getServiceReference(INexioChangeListener.class);\r
+                               ServiceReference<INexioChangeListener> reference = bundleContext.getServiceReference(INexioChangeListener.class);\r
                                if (reference != null) {\r
                                        INexioChangeListener service = bundleContext.getService(reference);\r
                                        setNexioChangeListener(service);\r
@@ -162,55 +229,8 @@ public class NexioDataMiner implements Runnable, INexioChangeListener {
                }\r
        }\r
 \r
-       private void ensureIndexes() {\r
-               DBCollection collection = db.getCollection(CLIP_COLLECTION_NAME);\r
-               if (collection.count() == 0)\r
-                       collection.ensureIndex(LONGNAMEID);\r
-       }\r
-\r
-       private void removeDeleted(Map<String, BasicDBObject> remoteClips, Map<String, BasicDBObject> localClips) {\r
-               Set<String> remoteNames = new HashSet<>(remoteClips.keySet());\r
-               Set<String> localNames = new HashSet<>(localClips.keySet());\r
-               localNames.removeAll(remoteNames);\r
-               if (localNames.isEmpty())\r
-                       logger.debug("Nothing to remove");\r
-\r
-               DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
-               for (String name : localNames) {\r
-                       logger.debug("Removing {}", name);\r
-\r
-                       BasicDBObject clip = localClips.get(name);\r
-                       collection.remove(clip);\r
-                       onDelete(clip);\r
-               }\r
-       }\r
-\r
-       private Map<String, BasicDBObject> readClips() {\r
-               Map<String, BasicDBObject> result = new HashMap<>();\r
-               DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
-               DBCursor find = collection.find();\r
-               if (find.hasNext()) {\r
-                       List<BasicDBObject> clips = ListUtils.cast(find.toArray());\r
-                       result = ListUtils.map(clips, item -> item.getString(LONGNAMEID));\r
-                       for (BasicDBObject clip : clips)\r
-                               result.put(clip.getString(LONGNAMEID), clip);\r
-               }\r
-               return result;\r
-       }\r
-\r
-       private void storeClips(Map<String, BasicDBObject> remoteClips, Map<String, BasicDBObject> localClips) {\r
-               logger.trace("Enter");\r
-               int idx = 1;\r
-               for (BasicDBObject clip : remoteClips.values()) {\r
-                       storeClip(clip, localClips);\r
-                       int progress = 50 + (idx * 50 / remoteClips.size());\r
-                       if (progress - progressEvent.getProgress() > 0) {\r
-                               progressEvent.setProgress(progress);\r
-                               fireProgressEvent(progressEvent);\r
-                       }\r
-                       idx++;\r
-               }\r
-               logger.trace("Exit");\r
+       public void setNexioChangeListener(INexioChangeListener nexioChangeListener) {\r
+               this.nexioChangeListener = nexioChangeListener;\r
        }\r
 \r
        private void storeClip(BasicDBObject clip, Map<String, BasicDBObject> localClips) {\r
@@ -233,33 +253,55 @@ public class NexioDataMiner implements Runnable, INexioChangeListener {
                logger.trace("Exit");\r
        }\r
 \r
-       public void reset() {\r
-               db.getCollection(CLIP_COLLECTION_NAME).drop();\r
-       }\r
-\r
-       public void setNexioChangeListener(INexioChangeListener nexioChangeListener) {\r
-               this.nexioChangeListener = nexioChangeListener;\r
-       }\r
-\r
-       @Override\r
-       public void onCreate(BasicDBObject data) {\r
-               logger.debug("onCreate clip: " + data);\r
-               if (nexioChangeListener != null)\r
-                       nexioChangeListener.onCreate(data);\r
+       private void storeClips(Map<String, BasicDBObject> remoteClips, Map<String, BasicDBObject> localClips) {\r
+               logger.trace("Enter");\r
+               int idx = 1;\r
+               for (BasicDBObject clip : remoteClips.values()) {\r
+                       storeClip(clip, localClips);\r
+                       int progress = 50 + (idx * 50 / remoteClips.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
-       @Override\r
-       public void onDelete(BasicDBObject data) {\r
-               logger.debug("onDelete clip: " + data);\r
-               if (nexioChangeListener != null)\r
-                       nexioChangeListener.onDelete(data);\r
+       public void transferClips() {\r
+               try (Connection con = getSQLConnection()) {\r
+                       DBCollection collection = db.getCollection(CLIP_COLLECTION_NAME);\r
+                       collection.drop();\r
+                       transferClips(con, collection);\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+               }\r
        }\r
 \r
-       @Override\r
-       public void onUpdate(BasicDBObject data) {\r
-               logger.debug("onUpdate clip: " + data);\r
-               if (nexioChangeListener != null)\r
-                       nexioChangeListener.onUpdate(data);\r
+       private void transferClips(Connection con, DBCollection collection) {\r
+               logger.info("Transfering clips from NEXIO MOS Gateway {}", con.toString());\r
+               String querySQL = "SELECT cd.id, c.longnameid, c.recorddate, c.extagency, c.killdate, cd.modifiedtimestamp, cd.duration, cd.videoformat, cd.videobitrate FROM ClipsTbl c LEFT OUTER JOIN ClipsDomainsTbl cd ON (cd.longnameid = c.longnameid)";\r
+               logger.debug("Executing statement: {}", querySQL);\r
+               int count = 0;\r
+               try (PreparedStatement stmt = con.prepareStatement(querySQL); ResultSet rs = stmt.executeQuery();) {\r
+                       while (rs.next()) {\r
+                               BasicDBObject clip = new BasicDBObject();\r
+                               clip.put(ID, rs.getString(ID));\r
+                               clip.put(LONGNAMEID, rs.getString(LONGNAMEID));\r
+                               clip.put(EXTAGENCY, rs.getString(EXTAGENCY));\r
+                               clip.put(VIDEOBITRATE, rs.getString(VIDEOBITRATE));\r
+                               clip.put(VIDEOFORMAT, rs.getString(VIDEOFORMAT));\r
+                               clip.put(DURATION, rs.getLong(DURATION));\r
+                               clip.put(MODIFIEDTIMESTAMP, rs.getTimestamp(MODIFIEDTIMESTAMP));\r
+                               clip.put(RECORDDATE, rs.getTimestamp(RECORDDATE).getTime());\r
+                               clip.put(KILLDATE, rs.getTimestamp(KILLDATE));\r
+                               collection.insert(clip);\r
+                               count++;\r
+                       }\r
+                       logger.info("Transfered {} clips", count);\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+               }\r
        }\r
 \r
 }\r
index ad96dbb96e405cd5e4edf75451b632570435a66e..1a23e64745bdf768d606df2bd8eae9290842c68f 100644 (file)
@@ -2,14 +2,13 @@ package user.commons.nexio.api;
 \r
 public enum ClipEventType {\r
 \r
-    CLIP_ADDED,\r
-    CLIP_DELETED;\r
+       LISTENER_RESTART_NEEDED, CLIP_ADDED, CLIP_DELETED;\r
 \r
-    public String value() {\r
-        return name();\r
-    }\r
+       public static ClipEventType fromValue(String v) {\r
+               return valueOf(v);\r
+       }\r
 \r
-    public static ClipEventType fromValue(String v) {\r
-        return valueOf(v);\r
-    }\r
+       public String value() {\r
+               return name();\r
+       }\r
 }\r
index 84356e03e7ee2f490f3455dca70d339261a991b2..e9c321d7f867cd9d50396f1439d5d1b047cb6432 100644 (file)
@@ -2,7 +2,6 @@ package user.commons.nexio.api;
 \r
 import java.util.ArrayList;\r
 \r
-import org.apache.commons.io.output.ByteArrayOutputStream;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
@@ -47,6 +46,7 @@ public class MediaListener implements Runnable {
 \r
        static private final int NN_ID_ADDED = 0;\r
        static private final int NN_ID_DELETED = 1;\r
+       static private final int NN_LISTENER_RESTART = 2;\r
 \r
        public static String bytesToHex(byte[] bytes) {\r
                char[] hexChars = new char[bytes.length * 2];\r
@@ -67,6 +67,8 @@ public class MediaListener implements Runnable {
 \r
        private Connection connection = null;\r
 \r
+       private ArrayList<Integer> notificationList = new ArrayList<Integer>();\r
+\r
        //KONSTRUKTOR\r
        public MediaListener(Mediabase _mediaBase, String _nexioHost, int _nexioPort) {\r
                this.mediaBase = _mediaBase;\r
@@ -79,6 +81,30 @@ public class MediaListener implements Runnable {
                this.clipEventListeners.add(listener);\r
        }\r
 \r
+       private byte[] collectNotifications(boolean dontAnswer) throws Exception {\r
+\r
+               //kov. notificationnek megfelelo listazas kerese\r
+               if (notificationList.size() > 0 && !dontAnswer) {\r
+                       handleNotification(notificationList.get(0));\r
+               }\r
+\r
+               //tovabbi notification-ok gyujtese\r
+               //CHANGE_NOTIFICATION_RESP (BLOCKING READ!) ********\r
+               byte[] buffer = null;\r
+               for (buffer = readBytes(2); CHANGE_NOTIFICATION_RESP_S.equals(bytesToHex(buffer)); buffer = readBytes(2)) {\r
+                       buffer = readBytes(2);\r
+                       int notNumber = buffer[1];\r
+                       notificationList.add(notNumber);\r
+                       logger.debug("Nexio MediaListener notification: CFA6" + bytesToHex(buffer));\r
+\r
+                       //csak igy jon meg a kesobb kezelt LIST_FIRST_ID_LIST\r
+                       if (notificationList.size() == 1 && !dontAnswer) {\r
+                               handleNotification(notNumber);\r
+                       }\r
+               }\r
+               return buffer;\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
@@ -92,28 +118,42 @@ public class MediaListener implements Runnable {
                } else if (notificationNumber == NN_ID_DELETED) {\r
                        Clip deletedClip = new ClipImpl(mediaBase.getProtocol(), id);\r
                        evt = new ClipEvent(deletedClip, ClipEventType.CLIP_DELETED);\r
+               } else if (notificationNumber == NN_LISTENER_RESTART) {\r
+                       evt = new ClipEvent(null, ClipEventType.LISTENER_RESTART_NEEDED);\r
                }\r
                for (ClipEventListener cel : this.clipEventListeners) {\r
                        cel.clipEventPerformed(evt);\r
                }\r
        }\r
 \r
-       private byte[] readBytesOLD(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
+       private void handleNotification(int notificationNumber) throws Exception {\r
+               //LIST_FIRST_ID_LIST\r
+               /*\r
+                       0x01    Main ID Handle List     D8 4C ID\r
+                       0x02    ID Handles Added List   D8 4C ID\r
+                       0x03    ID Handles Deleted List D8 4C ID\r
+                       0x11    Main Extended ID List   DF 4C BC XID *\r
+                       0x12    Extended IDs Added List DF 4C BC XID *\r
+                       0x13    Extended IDs Deleted List       DF 4C BC XID *\r
+                       0x21    Main ID Handle/Extended ID List DF 4C BC ID XID *\r
+                       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
+                       writeBytes(LIST_FIRST_ID_LIST_ADDED);\r
+               } else if (notificationNumber == NN_ID_DELETED) {\r
+                       //SEND ACK\r
+                       writeBytes(ACK);\r
+                       writeBytes(LIST_FIRST_ID_LIST_DELETED);\r
                }\r
+\r
        }\r
 \r
        private byte[] readBytes(int numberOfBytes) throws Exception {\r
                byte[] ret = new byte[numberOfBytes];\r
                try {\r
-                       for(int c=0; c<numberOfBytes; c++){\r
-                               ret[c] = (byte)this.connection.read();\r
+                       for (int c = 0; c < numberOfBytes; c++) {\r
+                               ret[c] = (byte) this.connection.read();\r
                        }\r
                } catch (Exception e) {\r
                        restartListener();\r
@@ -121,8 +161,18 @@ public class MediaListener implements Runnable {
                }\r
                return ret;\r
        }\r
-       \r
-       \r
+\r
+       private byte[] readBytesOLD(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 removeClipEventListener(ClipEventListener listener) {\r
                this.clipEventListeners.remove(listener);\r
        }\r
@@ -141,12 +191,11 @@ public class MediaListener implements Runnable {
                } catch (Exception e) {\r
                }\r
                //new connection / new thread\r
+               //szóljunk a dispatcher-nek, hogy inicializálja újra magát\r
+               //fireEvent(null, NN_LISTENER_RESTART);\r
                startListener();\r
        }\r
 \r
-       private ArrayList<Integer> notificationList = new ArrayList<Integer>();\r
-       \r
-       \r
        @Override\r
        public void run() {\r
                try {\r
@@ -157,19 +206,18 @@ public class MediaListener implements Runnable {
                        byte[] buffer = readBytes(2);\r
                        logger.info("Nexio MediaListener is waiting for events..");\r
 \r
-                       \r
                        while (isRunning) {\r
                                try {\r
 \r
                                        //BLOKKOLVA addig olvassa fel es gyujti a notification-oket amig mas adat nem jon.\r
                                        //az elso alkalommal amikor nem notification-t kap, visszater.\r
                                        buffer = collectNotifications(false);\r
-                                       \r
+\r
                                        //LIST_FIRST_ID_LIST response\r
                                        if (LIST_FIRST_ID_LIST_FOUND.equals(bytesToHex(buffer))) {\r
                                                int notificationNumber = notificationList.get(0);\r
                                                notificationList.remove(0);\r
-                                               \r
+\r
                                                //read first id\r
                                                buffer = readBytes(8);\r
                                                String stringId = new String(buffer);\r
@@ -179,7 +227,8 @@ public class MediaListener implements Runnable {
                                                //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
-                                               for (buffer = collectNotifications(true); LIST_NEXT_ID_LIST_FOUND.equals(bytesToHex(buffer)) && isRunning; buffer = collectNotifications(true)) {\r
+                                               for (buffer = collectNotifications(true); LIST_NEXT_ID_LIST_FOUND.equals(bytesToHex(buffer))\r
+                                                               && isRunning; buffer = collectNotifications(true)) {\r
 \r
                                                        byte[] idBuffer = readBytes(8);\r
                                                        stringId = new String(idBuffer);\r
@@ -191,12 +240,11 @@ public class MediaListener implements Runnable {
                                                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
+\r
+                                       } else if (LIST_FIRST_ID_LIST_NOT_FOUND.equals(bytesToHex(buffer))) {\r
                                                notificationList.remove(0);\r
                                                logger.debug("Nexio MediaListener LIST_FIRST_ID_LIST ID not found!");\r
-                                       }else{\r
+                                       } else {\r
                                                logger.debug("Nexio MediaListener unknown answer has arrived for LIST_FIRST_ID_LIST:  " + bytesToHex(buffer));\r
                                        }\r
                                } catch (Exception exc) {\r
@@ -209,56 +257,6 @@ public class MediaListener implements Runnable {
                }\r
        }\r
 \r
-                                  \r
-       private byte[] collectNotifications(boolean dontAnswer) throws Exception{\r
-\r
-               //kov. notificationnek megfelelo listazas kerese\r
-               if(notificationList.size() > 0 && !dontAnswer){\r
-                       handleNotification(notificationList.get(0));\r
-               }\r
-               \r
-               //tovabbi notification-ok gyujtese\r
-               //CHANGE_NOTIFICATION_RESP (BLOCKING READ!) ********\r
-               byte[] buffer = null;\r
-               for(buffer = readBytes(2); CHANGE_NOTIFICATION_RESP_S.equals(bytesToHex(buffer)); buffer = readBytes(2)){\r
-                       buffer = readBytes(2);\r
-                       int notNumber = buffer[1];\r
-                       notificationList.add(notNumber);\r
-                       logger.debug("Nexio MediaListener notification: CFA6" + bytesToHex(buffer));\r
-                       \r
-                       //csak igy jon meg a kesobb kezelt LIST_FIRST_ID_LIST\r
-                       if(notificationList.size() == 1 && !dontAnswer){\r
-                               handleNotification(notNumber);\r
-                       }\r
-               }\r
-               return buffer;\r
-       }\r
-       \r
-       \r
-       private void handleNotification(int notificationNumber) throws Exception{\r
-               //LIST_FIRST_ID_LIST\r
-               /*\r
-                       0x01    Main ID Handle List     D8 4C ID\r
-                       0x02    ID Handles Added List   D8 4C ID\r
-                       0x03    ID Handles Deleted List D8 4C ID\r
-                       0x11    Main Extended ID List   DF 4C BC XID *\r
-                       0x12    Extended IDs Added List DF 4C BC XID *\r
-                       0x13    Extended IDs Deleted List       DF 4C BC XID *\r
-                       0x21    Main ID Handle/Extended ID List DF 4C BC ID XID *\r
-                       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
-                       writeBytes(LIST_FIRST_ID_LIST_ADDED);\r
-               }else\r
-               if (notificationNumber == NN_ID_DELETED) {\r
-                       //SEND ACK\r
-                       writeBytes(ACK);\r
-                       writeBytes(LIST_FIRST_ID_LIST_DELETED);\r
-               }\r
-               \r
-       }\r
-       \r
        public void startListener() {\r
                try {\r
                        createNexioConnection();\r
index e81b8f635e53a3606bf7d0d5b3e6d20be2273c0f..1649db72d0107c73d3e77d90d1a8f7ee1652c5fd 100644 (file)
@@ -15,7 +15,7 @@ import com.ibm.nosql.json.api.NoSQLClient;
 public class NoSQLUtils {\r
        private static final Logger logger = LogManager.getLogger();\r
        public static final String Url, User, Pass;\r
-\r
+       public static DB noSQLClient = null;\r
        static {\r
                Url = System.getProperty("jobengine.nosql.db.url");\r
                User = System.getProperty("jobengine.nosql.db.user");\r
@@ -67,17 +67,13 @@ public class NoSQLUtils {
        }\r
 \r
        public static DB getNoSQLDB() {\r
-               DB result = null;\r
                try {\r
-                       result = NoSQLClient.getDB(NoSQLUtils.Url, NoSQLUtils.User, NoSQLUtils.Pass);\r
+                       if (noSQLClient == null)\r
+                               noSQLClient = NoSQLClient.getDB(NoSQLUtils.Url, NoSQLUtils.User, NoSQLUtils.Pass);\r
                } catch (Exception e) {\r
-                       logger.error(e);\r
+                       logger.catching(e);\r
                }\r
-               return result;\r
-       }\r
-\r
-       public static DB getNoSQLDB(String url, String user, String pass) {\r
-               return NoSQLClient.getDB(Url, User, Pass);\r
+               return noSQLClient;\r
        }\r
 \r
 }\r
index 69d3e8d4afbfde6487f8d62835cededcc355fad0..d8a8baec3ee54817e67545f7eafb5c6f40f553bb 100644 (file)
@@ -12,7 +12,7 @@ public interface IOctopusAPI {
        static final String TIME_COLLECTION_NAME = "time";\r
        static final String LASTUPDATE_TIME = "lastUpdateTime";\r
        static final String NEXIO_MOS = "NEXIO.MOS";\r
-       static final String PARENT_STORY_ID = "parentStoryId";\r
+       static final String PARENT_STORY_ID = "ParentStoryId";\r
        static final String VALUE = "value";\r
        static final String CUSTOM_COLUMNS = "customColumns";\r
        static final String MOS_ID = "mosId";\r
index 48eedfac40f01c2f0c225e9e75a5536cd3522bbc..87a3fcb0ce95e8c5c433ea8fb017dd3ccadad288 100644 (file)
@@ -5,6 +5,7 @@ import java.util.HashMap;
 import java.util.HashSet;\r
 import java.util.List;\r
 import java.util.Map;\r
+import java.util.concurrent.ConcurrentHashMap;\r
 \r
 import javax.swing.event.EventListenerList;\r
 import javax.ws.rs.client.Invocation.Builder;\r
@@ -28,12 +29,13 @@ import com.ibm.nosql.json.api.DBObject;
 import com.ibm.nosql.json.api.QueryBuilder;\r
 import com.ibm.nosql.json.api.WriteResult;\r
 \r
+import user.commons.ListUtils;\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 String _TMP = "_tmp1";\r
+       private static final String _TMP = "_tmp";\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final String LINEFEED = "\r\n";\r
        private static final String SIMPLE_LINEFEED = "\n";\r
@@ -74,6 +76,10 @@ public class OctopusDataMiner implements Runnable {
        private String FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION;\r
        private String STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION;\r
 \r
+       private Map<Long, BasicDBList> newRundowns = new HashMap<>();\r
+       private Map<Long, BasicDBList> newStoryFolders = new HashMap<>();\r
+       private Map<Long, BasicDBList> newStories = new HashMap<>();\r
+\r
        public OctopusDataMiner() {\r
                db = NoSQLUtils.getNoSQLDB();\r
 \r
@@ -203,6 +209,44 @@ public class OctopusDataMiner implements Runnable {
                return concatParentsToStoryFolder(parent, newName);\r
        }\r
 \r
+       private void deleteDiff(String oldCollectionName, String newCollectionName, String idFieldName) {\r
+               DBCollection oldCollection = db.getCollection(oldCollectionName);\r
+               DBCollection newCollection = db.getCollection(newCollectionName);\r
+               DBCursor oldCollectionCursor = newCollection.find(new BasicDBObject(), new BasicDBObject(idFieldName, 1));\r
+               if (!oldCollectionCursor.hasNext()) {\r
+                       logger.error("{} collection is empty", newCollectionName);\r
+                       return;\r
+               }\r
+               List<BasicDBObject> oldItems = ListUtils.cast(oldCollectionCursor.toArray());\r
+\r
+               DBCursor newCollectionCursor = oldCollection.find();\r
+               ConcurrentHashMap<Long, BasicDBObject> newItems = null;\r
+               if (newCollectionCursor.hasNext()) {\r
+                       List<BasicDBObject> newList = ListUtils.cast(newCollectionCursor.toArray());\r
+                       newItems = ListUtils.map(newList, item -> item.getLong(IOctopusAPI.ID));\r
+               }\r
+               if (newItems == null)\r
+                       newItems = new ConcurrentHashMap<>();\r
+\r
+               for (BasicDBObject oldItem : oldItems) {\r
+                       if (oldItem == null) {\r
+                               logger.error("Item is null");\r
+                               continue;\r
+                       }\r
+                       if (!oldItem.containsKey(idFieldName)) {\r
+                               logger.error("{} is null", idFieldName);\r
+                               continue;\r
+                       }\r
+                       long id = oldItem.getLong(idFieldName);\r
+                       BasicDBObject newItem = newItems.get(id);\r
+                       if (newItem == null) {\r
+                               //remove\r
+                               logger.info("Deleting {}", oldItem.toPrettyString(null));\r
+                               oldCollection.remove(new BasicDBObject(idFieldName, id));\r
+                       }\r
+               }\r
+       }\r
+\r
        private void deleteOrphanStories() {\r
                try {\r
                        DBCollection collection = db.getCollection(STORY_COLLECTION);\r
@@ -228,18 +272,20 @@ public class OctopusDataMiner implements Runnable {
                        collection.ensureIndex(IOctopusAPI.ID);\r
        }\r
 \r
-       public void execute() {\r
+       public void execute() throws Exception {\r
                logger.trace(STARTING);\r
                RUNDOWN_COLLECTION = IOctopusAPI.RUNDOWN_COLLECTION + _TMP;\r
                FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION + _TMP;\r
                STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION + _TMP;\r
 \r
-               //                      ResteasyWebTarget target = webTarget.path(RUNDOWN);\r
-               //                      Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
-               //                      Response r = result.get();\r
-               //                      String x = r.readEntity(String.class);\r
-               //                      logger.info(x);\r
-               //                      return;\r
+               try {\r
+                       db.getCollection(RUNDOWN_COLLECTION).drop();\r
+                       db.getCollection(FOLDER_COLLECTION).drop();\r
+                       db.getCollection(STORY_COLLECTION).drop();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               }\r
 \r
                BasicDBList rundowns = null;\r
                BasicDBList storyFolders = null;\r
@@ -252,60 +298,34 @@ public class OctopusDataMiner implements Runnable {
                        throw e;\r
                }\r
 \r
-               if (rundowns == null || rundowns.size() == 0) {\r
-                       progressEvent.setProgress(50);\r
-                       fireProgressEvent(progressEvent);\r
-               } else {\r
-                       logger.info("Process rundowns");\r
-                       try {\r
-                               storeRundowns(rundowns, null);\r
-                       } catch (Exception e) {\r
-                               logger.catching(e);\r
-                               throw e;\r
-                       }\r
-               }\r
-\r
-               if (storyFolders == null || storyFolders.size() == 0) {\r
-                       progressEvent.setProgress(100);\r
-                       fireProgressEvent(progressEvent);\r
-               } else {\r
-                       logger.info("Process story folders");\r
-                       try {\r
-                               storeStoryFolders(storyFolders, null);\r
-                       } catch (Exception e) {\r
-                               logger.catching(e);\r
-                               throw e;\r
-                       }\r
-               }\r
-               setLastUpdateTime(new Date());\r
-               logger.info("Activate");\r
+               processRundowns(rundowns);\r
+               processStoryFolders(storyFolders);\r
 \r
-               //                      db.getCollection(IOctopusAPI.RUNDOWN_COLLECTION).drop();\r
-               try {\r
-                       db.getCollection(RUNDOWN_COLLECTION).rename(IOctopusAPI.RUNDOWN_COLLECTION, true);\r
-               } catch (Exception e) {\r
-                       logger.catching(e);\r
-                       throw e;\r
-               }\r
+               //a sorrend fontos !\r
+               updateDiff(IOctopusAPI.STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
+               updateDiff(IOctopusAPI.RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
+               updateDiff(IOctopusAPI.FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
+               deleteDiff(IOctopusAPI.RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
+               deleteDiff(IOctopusAPI.FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
+               deleteDiff(IOctopusAPI.STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
 \r
-               //                      db.getCollection(IOctopusAPI.FOLDER_COLLECTION).drop();\r
-               try {\r
-                       db.getCollection(FOLDER_COLLECTION).rename(IOctopusAPI.FOLDER_COLLECTION, true);\r
-               } catch (Exception e) {\r
-                       logger.catching(e);\r
-                       throw e;\r
-               }\r
+               //setLastUpdateTime(new Date());\r
+               logger.info("Activate");\r
 \r
-               //                      db.getCollection(IOctopusAPI.STORY_COLLECTION).drop();\r
-               try {\r
-                       db.getCollection(STORY_COLLECTION).rename(IOctopusAPI.STORY_COLLECTION, true);\r
-               } catch (Exception e) {\r
-                       logger.catching(e);\r
-                       throw e;\r
-               }\r
+               //              db.getCollection(RUNDOWN_COLLECTION).rename(IOctopusAPI.RUNDOWN_COLLECTION, true);\r
+               //              db.getCollection(FOLDER_COLLECTION).rename(IOctopusAPI.FOLDER_COLLECTION, true);\r
+               //              db.getCollection(STORY_COLLECTION).rename(IOctopusAPI.STORY_COLLECTION, true);\r
+               logger.trace(FINISHED);\r
 \r
-               //              logger.trace(FINISHED);\r
+       }\r
 \r
+       public void executetest() {\r
+               //                      ResteasyWebTarget target = webTarget.path(RUNDOWN);\r
+               //                      Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
+               //                      Response r = result.get();\r
+               //                      String x = r.readEntity(String.class);\r
+               //                      logger.info(x);\r
+               //                      return;\r
        }\r
 \r
        private String extractContent(BasicDBObject content) {\r
@@ -387,14 +407,6 @@ public class OctopusDataMiner implements Runnable {
                return result;\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
-       //      }\r
-\r
        private String extractScriptContent(BasicDBObject story) {\r
                BasicDBObject script = NoSQLUtils.asDBObject(story, IOctopusAPI.SCRIPT);\r
                if (script == null || script.isEmpty())\r
@@ -441,6 +453,14 @@ public class OctopusDataMiner implements Runnable {
                return result;\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
+       //      }\r
+\r
        private boolean isModified(Date date, BasicDBObject object) {\r
                if (date == null)\r
                        return true;\r
@@ -449,6 +469,36 @@ public class OctopusDataMiner implements Runnable {
                return result <= 0;\r
        }\r
 \r
+       private void processRundowns(BasicDBList rundowns) throws Exception {\r
+               if (rundowns == null || rundowns.size() == 0) {\r
+                       progressEvent.setProgress(50);\r
+                       fireProgressEvent(progressEvent);\r
+               } else {\r
+                       logger.info("Process rundowns");\r
+                       try {\r
+                               storeRundowns(rundowns, null);\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                               throw e;\r
+                       }\r
+               }\r
+       }\r
+\r
+       private void processStoryFolders(BasicDBList storyFolders) throws Exception {\r
+               if (storyFolders == null || storyFolders.size() == 0) {\r
+                       progressEvent.setProgress(100);\r
+                       fireProgressEvent(progressEvent);\r
+               } else {\r
+                       logger.info("Process story folders");\r
+                       try {\r
+                               storeStoryFolders(storyFolders, null);\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                               throw e;\r
+                       }\r
+               }\r
+       }\r
+\r
        private Builder query(String path, String fields) {\r
                //logger.info("Class loader {}", getClass().getClassLoader());\r
                //              try {\r
@@ -635,7 +685,7 @@ public class OctopusDataMiner implements Runnable {
                List<BasicDBObject> rundownsList = NoSQLUtils.asList(rundowns);\r
                int idx = 1;\r
                for (BasicDBObject rundown : rundownsList) {\r
-                       logger.info(CHECKING_RUNDOWN, rundown.getLong(IOctopusAPI.ID), rundownsList.size(), idx);\r
+                       //logger.info(CHECKING_RUNDOWN, rundown.getLong(IOctopusAPI.ID), rundownsList.size(), idx);\r
                        storeRundown(rundown, lastUpdateTime);\r
                        int progress = idx * 50 / rundownsList.size();\r
                        if (progress - progressEvent.getProgress() > 0) {\r
@@ -660,6 +710,10 @@ public class OctopusDataMiner implements Runnable {
 \r
        private void storeStory(BasicDBObject story, Date lastUpdateTime) {\r
                logger.trace(ENTER);\r
+               if (!story.containsKey(IOctopusAPI.ID)) {\r
+                       logger.error("Missing id in story {}", story.toPrettyString(null));\r
+                       return;\r
+               }\r
                long storyID = story.getLong(IOctopusAPI.ID);\r
                boolean isContains = storyIDs.contains(storyID);\r
                if (isContains)\r
@@ -717,9 +771,10 @@ public class OctopusDataMiner implements Runnable {
                        story.put(IOctopusAPI.MOS_OBJECTS, modifiedMOS);\r
 \r
                String parentStoryId = extractCustomColumnValue(IOctopusAPI.PARENT_STORY_ID, story);\r
-               if (parentStoryId == null)\r
+               if (parentStoryId == null) {\r
+                       logger.warn("Missing {} in story", IOctopusAPI.PARENT_STORY_ID, story.toPrettyString(null));\r
                        story.append(IOctopusAPI.PARENT_STORY_ID, storyID);\r
-               else\r
+               else\r
                        story.append(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
                logger.debug(SAVING_STORY_ID, storyID);\r
                collection.save(story);\r
@@ -782,4 +837,58 @@ public class OctopusDataMiner implements Runnable {
                return result;\r
        }\r
 \r
+       private void updateDiff(String oldCollectionName, String newCollectionName, String idFieldName) {\r
+               DBCollection oldCollection = db.getCollection(oldCollectionName);\r
+               DBCollection newCollection = db.getCollection(newCollectionName);\r
+               DBCursor newCollectionCursor = newCollection.find();\r
+               if (!newCollectionCursor.hasNext()) {\r
+                       logger.error("{} collection is empty", newCollectionName);\r
+                       return;\r
+               }\r
+\r
+               List<BasicDBObject> newItems = ListUtils.cast(newCollectionCursor.toArray());\r
+\r
+               DBCursor oldCollectionCursor = oldCollection.find();\r
+               ConcurrentHashMap<Long, BasicDBObject> oldItems = null;\r
+               if (oldCollectionCursor.hasNext()) {\r
+                       List<BasicDBObject> oldList = ListUtils.cast(oldCollectionCursor.toArray());\r
+                       oldItems = ListUtils.map(oldList, item -> item.getLong(IOctopusAPI.ID));\r
+               }\r
+               if (oldItems == null)\r
+                       oldItems = new ConcurrentHashMap<>();\r
+               for (BasicDBObject newItem : newItems) {\r
+                       if (newItem == null) {\r
+                               logger.error("Item is null");\r
+                               continue;\r
+                       }\r
+                       if (!newItem.containsKey(idFieldName)) {\r
+                               logger.error("{} is null", idFieldName);\r
+                               continue;\r
+                       }\r
+                       long id = newItem.getLong(idFieldName);\r
+                       BasicDBObject oldItem = oldItems.get(id);\r
+                       boolean save = false;\r
+                       if (oldItem == null) {\r
+                               //save\r
+                               save = true;\r
+                       } else {\r
+                               //compare\r
+                               Object oldDbId = oldItem.getID();\r
+                               newItem.remove(IOctopusAPI._ID);\r
+                               oldItem.remove(IOctopusAPI._ID);\r
+\r
+                               if (!newItem.equals(oldItem)) {\r
+                                       //save\r
+                                       newItem.put(IOctopusAPI._ID, oldDbId);\r
+                                       save = true;\r
+                               }\r
+                       }\r
+\r
+                       if (save) {\r
+                               logger.info("Saving {}", newItem.toPrettyString(null));\r
+                               oldCollection.save(newItem);\r
+                       }\r
+               }\r
+       }\r
+\r
 }\r
index eb4ba4c01f573466982612a0034c193baf124bbe..49c3944417b920fe42ef9093f170acc5a03c2283 100644 (file)
@@ -48,7 +48,7 @@ public class OctopusDataMinerTest {
        private OctopusDataMiner sut;\r
 \r
        @Test\r
-       public void integrationExecute() {\r
+       public void integrationExecute() throws Exception {\r
                // fixture\r
                sut = new OctopusDataMiner();\r
                // Exercise\r
index 93a343096bed6c7fac6fb603d2c78ca6173cc1aa..94e5a916df45b18aca5cfcf567c5fcb1124ea49b 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
 <launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">\r
 <booleanAttribute key="M2_DEBUG_OUTPUT" value="true"/>\r
-<stringAttribute key="M2_GOALS" value="clean deploy"/>\r
+<stringAttribute key="M2_GOALS" value="clean install"/>\r
 <booleanAttribute key="M2_NON_RECURSIVE" value="false"/>\r
 <booleanAttribute key="M2_OFFLINE" value="true"/>\r
 <stringAttribute key="M2_PROFILES" value=""/>\r
index 24dced10c1585131db960e453908415e0b13ec3c..71709d093c4fc71ae6ffb72b1b527a0b7f8edfa1 100644 (file)
@@ -34,13 +34,13 @@ public class NexioWSServlet extends WebSocketServlet implements INexioChangeList
        private NexioClipEventDispatcher dispatcher = null;
 
        public NexioWSServlet() {
-               logger.info("NexioAPIServlet created");
+               logger.info("Created");
                //              messagePool = new NexioAPIServletMessagePool(3, sessions);
                instance = this;
                dispatcher = new NexioClipEventDispatcher();
                dispatcher.setNexioChangeListener(this);
-               //dispatcher.startup();
-               logger.info("NexioWSServlet has been initialized.");
+               dispatcher.startup();
+               logger.info("Initialized");
                /*
                                BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
                                if (bundleContext != null) {