git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 2 May 2018 07:18:24 +0000 (07:18 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 2 May 2018 07:18:24 +0000 (07:18 +0000)
26 files changed:
server/-product/pom.xml
server/user.jobengine.executors/config/config.xml
server/user.jobengine.executors/jobtemplates/archive-recording.xml
server/user.jobengine.executors/jobtemplates/recreate-lowres.xml
server/user.jobengine.executors/src/user/jobengine/server/steps/CreateMissingLowresStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/MediaToolStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/RecordingsArchiveItemBuilderStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TranscodeFFAStranStep.java
server/user.jobengine.executors/test-deploy-steps-to-bsh-main.bat
server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF
server/user.jobengine.osgi.commons/src/user/commons/nexio/INexioAPI.java
server/user.jobengine.osgi.commons/src/user/commons/nexio/NexioAPI.java
server/user.jobengine.osgi.server/META-INF/MANIFEST.MF
server/user.jobengine.osgi.server/OSGI-INF/component.xml
server/user.jobengine.osgi.server/OSGI-INF/componentBinder.xml [new file with mode: 0644]
server/user.jobengine.osgi.server/pages/joblist.zul
server/user.jobengine.osgi.server/src/user/jobengine/osgi/server/ComponentBinder.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobListModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/JobSelectorModel.java
server/user.jobengine.osgi.services/META-INF/MANIFEST.MF
server/user.jobengine.osgi.services/OSGI-INF/componentBinder.xml [moved from server/user.jobengine.osgi.services/OSGI-INF/component.xml with 82% similarity]
server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/ComponentBinder.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/jobengine/JobengineService.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/octopus/OctopusRESTService.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/nexio/NexioWSServlet.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/nexio/NexioWSSocket.java

index 86ba36fbde69b34d170de0d8fa484cdc0bc192a7..211fe1163bdc7113af623fba027254b00f93e8ed 100644 (file)
                                                                                <argument>"lcd ${local.location}/plugins"</argument>\r
                                                                                <argument>"cd ${remote.location}/plugins"</argument>\r
                                                                                <argument>"synchronize remote"</argument>\r
+                                                                               <argument>"lcd ${local.location}/configuration"</argument>\r
+                                                                               <argument>"cd ${remote.location}/configuration"</argument>\r
+                                                                               <argument>"synchronize remote -filemask=config.ini"</argument>\r
                                                                                <argument>"exit"</argument>\r
                                                                        </arguments>\r
                                                                </configuration>\r
index e2277770fe709ca506c3939a6dc8fb53f56a6663..d4677b2fe4c87b2e741fde045524c4d940223a6e 100644 (file)
@@ -21,7 +21,8 @@
        <executor className="user.jobengine.server.steps.SyncOCTOPUSDataStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.TranscodeFFAStranStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.TranscodeSELENIOStep" maxConcurrent="4"/>\r
-       <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="2"/>\r
+       <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="1"/>\r
+       <executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.TSMRetrieveMissingMaterialStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.UploadRecordingToNexioStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.MediaToolStep" maxConcurrent="1"/>\r
index 1b22d263426f495b5f6daad4f499bc4de1652bd3..440285af30856231575fd75e7a12951efc20db3e 100644 (file)
                                <input>\r
                                        <parameter name="transcoderTemplateName" />\r
                                </input>\r
-                               <input>\r
-                                       <parameter name="localHiresSourcePath" />\r
-                               </input>\r
                                <input>\r
                                        <parameter name="globalHiresSourcePath" />\r
                                </input>\r
index a7e33e0f6176388191216beb4199384ac20bb6ff..5a617a21cafd4b2dfefab7c5eb780fd558cc78fa 100644 (file)
 <jobtemplate name="Visszarögzített anyagok archiválása mappából">\r
        <declarations>\r
                <parameters>\r
-                       <parameter name="filePath" type="java.lang.String" />\r
+                       <parameter name="localHiresPath" type="java.lang.String" />\r
+                       <parameter name="globalHiresPath" type="java.lang.String" />\r
+                       <parameter name="localLowresPath" type="java.lang.String" />\r
+                       <parameter name="transcoderAddress" type="java.lang.String" />\r
+                       <parameter name="transcoderTemplateName" type="java.lang.String" />\r
+                       <parameter name="webPath" type="java.lang.String" />\r
                </parameters>\r
+               <variables>\r
+                       <variable name="mediaCubeMedia" type="user.jobengine.db.Media" />\r
+                       <variable name="targetNamePattern" type="java.lang.String" />\r
+                       <variable name="archiveItem" type="user.jobengine.server.steps.ArchiveItem" />\r
+                       <variable name="killDateDays" type="java.lang.Integer"/>\r
+                       <variable name="successRecipient" type="java.lang.String" />\r
+                       <variable name="deleteSource" type="java.lang.Boolean"/>\r
+               </variables>\r
        </declarations>\r
        <commands>\r
+               <calljobstep type="user.jobengine.server.steps.CreateMissingLowresStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                       </inputs>\r
+                       <outputs>\r
+                               <output>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="archiveItem" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="targetNamePattern" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="successRecipient" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="killDateDays" />\r
+                               </output>\r
+                               <output>\r
+                                       <variable name="deleteSource" />\r
+                               </output>\r
+                       </outputs>\r
+               </calljobstep>\r
+               <calljobstep type="user.jobengine.server.steps.TSMRestoreStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="targetNamePattern" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="successRecipient" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="killDateDays" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
                <calljobstep type="user.jobengine.server.steps.MediaToolStep" weight="1">\r
                        <inputs>\r
                                <input>\r
-                                       <parameter name="filePath" />\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+               <calljobstep type="user.jobengine.server.steps.TranscodeFFAStranStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <variable name="archiveItem" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="mediaCubeMedia" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcoderAddress" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="transcoderTemplateName" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="globalHiresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="localLowresPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <parameter name="webPath" />\r
+                               </input>\r
+                               <input>\r
+                                       <variable name="deleteSource" />\r
                                </input>\r
                        </inputs>\r
                </calljobstep>\r
index ca0d2f83b35e464156d6ee30f28066e69a85d44c..d1092debb9761f4a1433aa686e4cc0c51ed1d029 100644 (file)
@@ -1,11 +1,11 @@
 package user.jobengine.server.steps;\r
 \r
-import java.nio.file.Files;\r
 import java.nio.file.Paths;\r
 import java.util.List;\r
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
 \r
 import user.jobengine.db.ItemDAOEx;\r
 import user.jobengine.db.ItemManager;\r
@@ -15,41 +15,29 @@ import user.jobengine.server.IJobRuntime;
 \r
 public class CreateMissingLowresStep extends JobStep {\r
        private static final Logger logger = LogManager.getLogger();\r
-       private static final String targetNamePattern = "%s";\r
-       private String workPath = "/mnt/ISILON/ARCHIVE_RESTORE";\r
-       private String transcoderPath = "/mnt/SELENIO";\r
-       private String webPath = "/mediacube/data/lowres/www/video";\r
+       private Marker marker;\r
 \r
        @StepEntry\r
-       public Object[] execute(IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+       public Object[] execute(String localHiresPath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               Object[] result = { null, null, "%s", null, 0, true };\r
+               marker = jobRuntime.getMarker();\r
                ItemDAOEx dao = new ItemDAOEx((ItemManager) jobEngine.getItemManager());\r
                List<Media> medias = dao.getUntranscodedMedias();\r
-               if (medias == null)\r
-                       return null;\r
-\r
-               int i = 1;\r
-               for (Media media : medias) {\r
-                       String name = media.getMediaFilesName();\r
-                       logger.info("Processing {}", name);\r
-                       restore(jobEngine, jobRuntime, media);\r
-                       transcode(jobEngine, jobRuntime, media);\r
-                       Files.delete(Paths.get(workPath, name));\r
-                       setProgress(i * 100 / medias.size());\r
-                       i++;\r
+               try {\r
+                       if (medias == null || medias.size() == 0) {\r
+                               throw new Exception("Nincs feldolgozandó hiány.");\r
+                       }\r
+\r
+                       result[0] = medias.get(0);\r
+                       ArchiveItem archiveItem = new ArchiveItem();\r
+                       archiveItem.setMediaFile(Paths.get(localHiresPath, medias.get(0).getMediaFilesName()).toString());\r
+                       result[1] = archiveItem;\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, e.getMessage());\r
+               } finally {\r
+                       setProgress(100);\r
                }\r
-\r
-               return null;\r
-       }\r
-\r
-       private void restore(IJobEngine jobEngine, IJobRuntime jobRuntime, Media media) throws Exception {\r
-               TSMRestoreStep restore = new TSMRestoreStep();\r
-               restore.execute(media, workPath, targetNamePattern, null, 0, jobEngine, jobRuntime);\r
-       }\r
-\r
-       private void transcode(IJobEngine jobEngine, IJobRuntime jobRuntime, Media media) throws Exception {\r
-               TranscodeSELENIOStep selenio = new TranscodeSELENIOStep();\r
-               ArchiveItem archiveItem = new ArchiveItem();\r
-               archiveItem.setMediaFile(media.getMediaFilesName());\r
-               selenio.execute(workPath, archiveItem, media, transcoderPath, webPath, jobEngine, jobRuntime);\r
+               return result;\r
        }\r
 }\r
index f7c9bf6cbd2d435f4c859ca08cf1c8f3d8304577..69810a4bcb7cd30d8e2e05b45f6c89be294ab795 100644 (file)
@@ -1,5 +1,6 @@
 package user.jobengine.server.steps;\r
 \r
+import java.nio.file.Path;\r
 import java.nio.file.Paths;\r
 \r
 import org.apache.logging.log4j.LogManager;\r
@@ -7,6 +8,7 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.Marker;\r
 \r
 import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.db.Media;\r
 import user.jobengine.server.IJobEngine;\r
 import user.jobengine.server.IJobRuntime;\r
 \r
@@ -15,11 +17,21 @@ public class MediaToolStep extends JobStep {
        private Marker marker;\r
 \r
        @StepEntry\r
-       public Object[] execute(String filePath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
                marker = jobRuntime.getMarker();\r
-               MediaInfo mi = new MediaInfo(Paths.get(filePath));\r
+\r
+               if (mediaCubeMedia.getLength() > 0)\r
+                       return null;\r
+\r
+               Path filePath = Paths.get(archiveItem.getMediaFile());\r
+               MediaInfo mi = new MediaInfo(filePath);\r
                try {\r
                        mi.process();\r
+                       long frames = mi.getFrames();\r
+                       if (frames > 0) {\r
+                               mediaCubeMedia.setLength(frames);\r
+                               mediaCubeMedia.modify();\r
+                       }\r
                } catch (Exception e) {\r
                        logger.catching(e);\r
                        logger.error(marker, "A '{}' média analizálása sikertelen. A  rendszer üzenete: {}", filePath, e.getMessage());\r
index 2e0bfd0ee8f2b1417cd47d3876335dc68879720c..b476a20dcc9dde47e29e23579320e96c4527bf62 100644 (file)
@@ -174,7 +174,7 @@ public class RecordingsArchiveItemBuilderStep extends JobStep {
                        int extPos = name.toLowerCase().lastIndexOf(LXFEXT);\r
                        targetFileName = String.format("20%s-%s", Paths.get(mediaFile).getParent().getFileName(), name.substring(0, extPos));\r
                        if (targetFileName.length() > 32) {\r
-                               targetFileName = targetFileName.substring(0, 27) + "_PGM";\r
+                               targetFileName = targetFileName.substring(0, 28) + "_PGM";\r
                        }\r
                        logger.info(marker, "Az archiváló folyamat az '{}' anyagot archiválja.", mediaFile);\r
                }\r
index ae3802d892d19a1f90e984b7eb227334c154d64b..3be025a2d1805e9330f02947b9aa6328b9427bff 100644 (file)
@@ -33,7 +33,7 @@ public class TranscodeFFAStranStep extends JobStep {
        private Marker marker;\r
 \r
        @StepEntry\r
-       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, String transcoderAddress, String transcoderTemplateName, String localHiresTargetPath,\r
+       public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, String transcoderAddress, String transcoderTemplateName,\r
                        String globalHiresSourcePath, String localLowresTargetPath, String webPath, boolean deleteSource, IJobEngine jobEngine, IJobRuntime jobRuntime)\r
                        throws Exception {\r
                this.marker = jobRuntime.getMarker();\r
@@ -44,7 +44,6 @@ public class TranscodeFFAStranStep extends JobStep {
                check(archiveItem, "archiveItem");\r
                check(transcoderAddress, "transcoderAddress");\r
                check(transcoderTemplateName, "transcoderTemplateName");\r
-               check(localHiresTargetPath, "localHiresTargetPath");\r
                check(globalHiresSourcePath, "globalHiresSourcePath");\r
                check(localLowresTargetPath, "localLowresTargetPath");\r
                check(webPath, "webPath");\r
index 4ad3d7efd73511eddc01475d9d67fd82ba6fc675..aa3f6524b0be1f92a65b478ff575a057a7a3a1ad 100644 (file)
@@ -9,6 +9,9 @@ SET REMOTE_STEPS_LOCATION=/opt/test-mediacube/configuration/executors/user
 \r
 SET LOCAL_TEMPLATES_LOCATION=jobtemplates\r
 SET REMOTE_TEMPLATES_LOCATION=/opt/test-mediacube/configuration/jobtemplates\r
+\r
+SET LOCAL_CONFIG_LOCATION=config\r
+SET REMOTE_CONFIG_LOCATION=/opt/test-mediacube/configuration/executors\r
  \r
        ECHO *** Deploy steps to server %REMOTE_HOST% ***\r
        WinSCP.com /command ^\r
@@ -26,5 +29,13 @@ SET REMOTE_TEMPLATES_LOCATION=/opt/test-mediacube/configuration/jobtemplates
        "synchronize remote" ^\r
        "exit"\r
 \r
+       ECHO *** Deploy config to server %REMOTE_HOST% ***\r
+       WinSCP.com /command ^\r
+       "open %REMOTE_SERVER_ADDRESS% -hostkey=""%REMOTE_SERVER_HOSTKEY%"" -timeout=60" ^\r
+       "lcd %LOCAL_CONFIG_LOCATION%" ^\r
+       "cd %REMOTE_CONFIG_LOCATION%" ^\r
+       "synchronize remote -filemask=config.xml" ^\r
+       "exit"\r
+\r
 @ECHO ON\r
  
\ No newline at end of file
index 025f68685d5dd2139ed7dde139fea7fedc80eabf..331c6fe383fe35807b4e7c05cb196e975d0cbae9 100644 (file)
@@ -25,7 +25,6 @@ Export-Package: user.commons,
  user.commons.mediatool,
  user.commons.morpheus,
  user.commons.nexio,
- user.commons.nexio.api,
  user.commons.nosql,
  user.commons.octopus,
  user.commons.rcc,
index 8501e898641f7e38d97a759cb426aa740f807ea5..dc4256aac6373958a9f7c90cfb71ba5566ae314e 100644 (file)
@@ -8,6 +8,7 @@ import com.ibm.nosql.json.api.DBObject;
 public interface INexioAPI {\r
        final String ENCODING = "ISO-8859-2";\r
 \r
-       List<DBObject> getItems(Date modified, boolean itemsWithAgency);\r
+       NexioDispatcher getDispatcher();\r
 \r
+       List<DBObject> getItems(Date modified, boolean itemsWithAgency);\r
 }\r
index b8c95520be5afdcaa66c458a28146d3853c02e17..ba4306d0fd3b27b037ec37b5b73ae7ed2717fc1d 100644 (file)
@@ -18,6 +18,14 @@ import user.commons.nosql.NoSQLUtils;
 public class NexioAPI implements INexioAPI {\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final String MODIFIEDTIMESTAMP = "modifiedtimestamp";\r
+       private NexioDispatcher dispatcher;\r
+\r
+       @Override\r
+       public NexioDispatcher getDispatcher() {\r
+               if (dispatcher == null)\r
+                       dispatcher = new NexioDispatcher();\r
+               return dispatcher;\r
+       }\r
 \r
        @Override\r
        public List<DBObject> getItems(Date modified, boolean itemsWithAgency) {\r
index 78fa4bc51b5c949ff9118667de892fa3d305ec94..c0fcecad272cfae77eed1d083c4307a41f62f1f1 100644 (file)
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
 Bundle-Name: Server
 Bundle-SymbolicName: user.jobengine.osgi.server;singleton:=true
 Bundle-Version: 1.0.0
-Service-Component: OSGI-INF/component.xml
+Service-Component: OSGI-INF/component.xml, OSGI-INF/componentBinder.xml
 Import-Package: javax.servlet;version="3.1.0",
  javax.servlet.http;version="3.1.0",
  org.apache.logging.log4j;version="2.8.2",
index 6e03ccbe5d7d848bbd405623bc2516dff4fdb19c..02af0a3f4a5b0a7816e656023245e9197db0478e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="user.jobengine.osgi.server" activate="startup" deactivate="shutdown">\r
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="user.jobengine.server.JobEngine" activate="startup" deactivate="shutdown">\r
    <implementation class="user.jobengine.server.JobEngine"/>\r
    <!-- \r
    <reference bind="bindService" cardinality="1..1" interface="user.jobengine.server.IJobEngine" name="IJobEngine" policy="static" unbind="unbindService"/>\r
diff --git a/server/user.jobengine.osgi.server/OSGI-INF/componentBinder.xml b/server/user.jobengine.osgi.server/OSGI-INF/componentBinder.xml
new file mode 100644 (file)
index 0000000..c1c2023
--- /dev/null
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="user.jobengine.server.ComponentBinder">\r
+   <implementation class="user.jobengine.osgi.server.ComponentBinder"/>\r
+   <reference bind="bindService" cardinality="1..1" interface="user.commons.nexio.INexioAPI" name="INexioAPI" policy="static" unbind="unbindService"/>\r
+</scr:component>\r
index a0a82f9448d1e72c1c779bd63c8e40ca13248811..107351b7b35b4add874eac77430846e51c81411f 100644 (file)
@@ -2,6 +2,9 @@
 <?taglib uri="http://www.zkoss.org/dsp/web/core" prefix="c" ?>\r
 <?init class="user.jobengine.zk.util.AdminAuthInitiator"?>\r
 <zk xmlns:w="http://www.zkoss.org/2005/zk/client" xmlns:ca="client/attribute">\r
+       <script>\r
+       window.history.pushState(null, "Folyamatok", "/jobs");                  \r
+       </script>\r
        <style>\r
                .z-progressmeter { height: 16px; border: 1px solid #cfcfcf; background: #fff 0 0 repeat-x; text-align: left; overflow: hidden; // background-image:\r
                url(/zkau/web/1bf94a1d/zul/img/misc/prgmeter-anim.gif); }\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/osgi/server/ComponentBinder.java b/server/user.jobengine.osgi.server/src/user/jobengine/osgi/server/ComponentBinder.java
new file mode 100644 (file)
index 0000000..3faa750
--- /dev/null
@@ -0,0 +1,34 @@
+package user.jobengine.osgi.server;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.nexio.INexioAPI;\r
+\r
+public class ComponentBinder {\r
+       private static final String MEDIACUBE = "MEDIACUBE";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static INexioAPI nexioAPI;\r
+\r
+       public static INexioAPI getNexioAPI() {\r
+               if (nexioAPI == null)\r
+                       throw new RuntimeException("INexioAPI is null");\r
+               return nexioAPI;\r
+       }\r
+\r
+       public synchronized void bindService(Object service) {\r
+               if (service instanceof INexioAPI) {\r
+                       nexioAPI = (INexioAPI) service;\r
+                       logger.info("INexioAPI service binded");\r
+                       return;\r
+               }\r
+       }\r
+\r
+       public synchronized void unbindService(Object service) {\r
+               if (service instanceof INexioAPI) {\r
+                       nexioAPI = null;\r
+                       logger.info("INexioAPI service unbinded");\r
+                       return;\r
+               }\r
+       }\r
+}\r
index cfa6d09392995681f7b44cb03f2a6263d93c78de..a5a85e604dfcc107c1ad03758ea61a8d4cfc7a1b 100644 (file)
@@ -5,9 +5,6 @@ import java.util.Map;
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
-import org.osgi.framework.BundleContext;\r
-import org.osgi.framework.FrameworkUtil;\r
-import org.osgi.framework.ServiceReference;\r
 import org.zkoss.bind.annotation.BindingParam;\r
 import org.zkoss.bind.annotation.Command;\r
 import org.zkoss.bind.annotation.Init;\r
@@ -22,8 +19,10 @@ import org.zkoss.zul.Window;
 import com.ibm.nosql.json.api.BasicDBObject;\r
 \r
 import user.commons.ListUtils;\r
-import user.commons.nexio.api.ClipEventListener;\r
+import user.commons.nexio.INexioAPI;\r
+import user.commons.nexio.NexioDispatcher;\r
 import user.jobengine.db.ItemManagerData.SignalType;\r
+import user.jobengine.osgi.server.ComponentBinder;\r
 import user.jobengine.server.IJobChangedListener;\r
 import user.jobengine.server.IJobEngine;\r
 import user.jobengine.server.IJobRuntime;\r
@@ -179,12 +178,9 @@ public class JobListModel extends AsyncBaseModel implements IJobChangedListener
                        if (evt.getName().equals("onCancel"))\r
                                return;\r
                        try {\r
-                               BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();\r
-                               if (bundleContext == null)\r
-                                       return;\r
-                               ServiceReference<ClipEventListener> reference = bundleContext.getServiceReference(ClipEventListener.class);\r
-                               ClipEventListener listener = bundleContext.getService(reference);\r
-                               listener.restart();\r
+                               INexioAPI nexioAPI = ComponentBinder.getNexioAPI();\r
+                               NexioDispatcher dispatcher = nexioAPI.getDispatcher();\r
+                               dispatcher.restart();\r
                        } catch (Exception e) {\r
                                Messagebox.show(e.getMessage());\r
                        }\r
index cc12be990d35d1b7c3a72ecd9c4ecb8ed162e89f..0fa1563fc3bfd77f18c9d77003a43c8864e09ad8 100644 (file)
@@ -1,5 +1,12 @@
 package user.jobengine.zk.model;\r
 \r
+import java.text.ParseException;\r
+import java.util.Date;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.quartz.CronExpression;\r
 import org.zkoss.bind.annotation.AfterCompose;\r
 import org.zkoss.bind.annotation.Command;\r
 import org.zkoss.bind.annotation.ContextParam;\r
@@ -21,7 +28,9 @@ import user.jobengine.server.scheduler.ScheduledJob;
 import user.jobengine.server.scheduler.SchedulerService;\r
 \r
 public class JobSelectorModel extends BaseModel {\r
-\r
+       private static final String NEXT_TIME = "nextTime";\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private static final String CRONEXPRESSION = "cronexpression";\r
        @Wire("#resultWin")\r
        private Window resultWin;\r
        private IJobEngine jobEngine;\r
@@ -70,6 +79,22 @@ public class JobSelectorModel extends BaseModel {
        public void init() {\r
                this.jobEngine = (IJobEngine) Executions.getCurrent().getArg().get("jobEngine");\r
                jobs = new ListModelList<>(NoSQLUtils.asList(jobEngine.getScheduler().getScheduleJobs()));\r
+               if (jobs != null) {\r
+                       for (BasicDBObject job : jobs) {\r
+                               String cronExpression = job.getString(CRONEXPRESSION);\r
+                               if (StringUtils.isNotBlank(cronExpression)) {\r
+                                       CronExpression ce;\r
+                                       try {\r
+                                               ce = new CronExpression(cronExpression);\r
+                                               Date nextTime = ce.getNextValidTimeAfter(new Date());\r
+                                               job.put(NEXT_TIME, nextTime);\r
+                                       } catch (ParseException e) {\r
+                                               logger.catching(e);\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+               }\r
        }\r
 \r
        public void setJobs(ListModelList<BasicDBObject> jobs) {\r
index 97e429fde496a7d1fab903e447c55ba5946775f3..00d93990da4377219ab32ae5f81f03eda0197d33 100644 (file)
@@ -4,7 +4,7 @@ Bundle-Name: Services
 Bundle-SymbolicName: user.jobengine.osgi.services;singleton:=true
 Bundle-Version: 1.0.0
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Service-Component: OSGI-INF/component.xml, OSGI-INF/HaltCommandProvider.xml
+Service-Component: OSGI-INF/componentBinder.xml, OSGI-INF/HaltCommandProvider.xml
 Bundle-ActivationPolicy: lazy
 Web-ContextPath: /services
 Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
@@ -33,7 +33,6 @@ Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
  org.osgi.framework;version="1.8.0",
  user.commons,
  user.commons.nexio,
- user.commons.nexio.api,
  user.commons.octopus,
  user.jobengine.db,
  user.jobengine.server
similarity index 82%
rename from server/user.jobengine.osgi.services/OSGI-INF/component.xml
rename to server/user.jobengine.osgi.services/OSGI-INF/componentBinder.xml
index c0fa68f0c8647efc3bd669dfa302084ac2b5f5ae..a29dc9aa09493cfdba067da5413adde8ceedc2de 100644 (file)
@@ -5,4 +5,6 @@
    <reference bind="bindService" cardinality="1..1" interface="user.jobengine.db.IItemManager" name="IItemManager" policy="static" unbind="unbindService"/>\r
    <reference bind="bindService" cardinality="1..1" interface="user.commons.octopus.IOctopusAPI" name="IOctopusAPI" policy="static" unbind="unbindService"/>\r
    <reference bind="bindService" cardinality="1..1" interface="user.commons.nexio.INexioAPI" name="INexioAPI" policy="static" unbind="unbindService"/>\r
+   <reference bind="bindService" cardinality="1..1" interface="user.jobengine.osgi.ws.nexio.NexioWSServlet" name="NexioWSServlet" policy="static" unbind="unbindService"/>\r
+\r
 </scr:component>\r
index 39f72d51acb69d8f7e5bdf8dfbc31897f9b94ec9..3a4ddd02e0757110a280bdf41aa3b8fcaf96dd80 100644 (file)
@@ -5,87 +5,100 @@ import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.MarkerManager;\r
 \r
 import user.commons.nexio.INexioAPI;\r
+import user.commons.nexio.NexioDispatcher;\r
 import user.commons.octopus.IOctopusAPI;\r
 import user.jobengine.db.IItemManager;\r
+import user.jobengine.osgi.ws.nexio.NexioWSServlet;\r
 import user.jobengine.server.IJobEngine;\r
 \r
 public class ComponentBinder {\r
        private static final String MEDIACUBE = "MEDIACUBE";\r
        private static final Logger logger = LogManager.getLogger();\r
-       private static IJobEngine jobengineService;\r
-       private static IItemManager itemManagerService;\r
-       private static IOctopusAPI octopusService;\r
-       private static INexioAPI nexioService;\r
+       private static IJobEngine jobengine;\r
+       private static IItemManager itemManager;\r
+       private static IOctopusAPI octopusAPI;\r
+       private static INexioAPI nexioAPI;\r
 \r
-       public static IItemManager getItemManagerService() {\r
-               if (itemManagerService == null)\r
+       public static IItemManager getItemManager() {\r
+               if (itemManager == null)\r
                        throw new RuntimeException("IItemManager is null");\r
-               return itemManagerService;\r
+               return itemManager;\r
        }\r
 \r
-       public static IJobEngine getJobengineService() {\r
-               if (jobengineService == null)\r
+       public static IJobEngine getJobengine() {\r
+               if (jobengine == null)\r
                        throw new RuntimeException("IJobEngine is null");\r
-               return jobengineService;\r
+               return jobengine;\r
        }\r
 \r
-       public static INexioAPI getNexioService() {\r
-               if (nexioService == null)\r
+       public static INexioAPI getNexioAPI() {\r
+               if (nexioAPI == null)\r
                        throw new RuntimeException("INexioAPI is null");\r
-               return nexioService;\r
+               return nexioAPI;\r
        }\r
 \r
-       public static IOctopusAPI getOctopusService() {\r
-               if (octopusService == null)\r
+       public static IOctopusAPI getOctopusAPI() {\r
+               if (octopusAPI == null)\r
                        throw new RuntimeException("IOctopusAPI is null");\r
-               return octopusService;\r
+               return octopusAPI;\r
        }\r
 \r
+       private NexioWSServlet nexioServlet;\r
+\r
        public synchronized void bindService(Object service) {\r
                if (service instanceof IJobEngine) {\r
-                       jobengineService = (IJobEngine) service;\r
+                       jobengine = (IJobEngine) service;\r
                        logger.info("IJobEngine service binded");\r
                        return;\r
                }\r
                if (service instanceof IItemManager) {\r
-                       itemManagerService = (IItemManager) service;\r
+                       itemManager = (IItemManager) service;\r
                        logger.info("IItemManager service binded");\r
                        return;\r
                }\r
                if (service instanceof IOctopusAPI) {\r
-                       octopusService = (IOctopusAPI) service;\r
+                       octopusAPI = (IOctopusAPI) service;\r
                        logger.info("IOctopusAPI service binded");\r
                        return;\r
                }\r
                if (service instanceof INexioAPI) {\r
-                       nexioService = (INexioAPI) service;\r
+                       nexioAPI = (INexioAPI) service;\r
                        logger.info("INexioAPI service binded");\r
                        return;\r
                }\r
+               if (service instanceof NexioWSServlet) {\r
+                       nexioServlet = (NexioWSServlet) service;\r
+                       logger.info("NexioWSServlet service binded");\r
+                       return;\r
+               }\r
        }\r
 \r
        public void start() {\r
+               NexioDispatcher dispatcher = nexioAPI.getDispatcher();\r
+               dispatcher.setNexioChangeListener(nexioServlet);\r
+               dispatcher.startup();\r
+\r
                logger.info(MarkerManager.getMarker(MEDIACUBE), "A MediaCube server elindult.");\r
        }\r
 \r
        public synchronized void unbindService(Object service) {\r
                if (service instanceof IJobEngine) {\r
-                       jobengineService = null;\r
+                       jobengine = null;\r
                        logger.info("IJobEngine service unbinded");\r
                        return;\r
                }\r
                if (service instanceof IItemManager) {\r
-                       itemManagerService = null;\r
+                       itemManager = null;\r
                        logger.info("IItemManagerService service unbinded");\r
                        return;\r
                }\r
                if (service instanceof IOctopusAPI) {\r
-                       octopusService = null;\r
+                       octopusAPI = null;\r
                        logger.info("IOctopusAPI service unbinded");\r
                        return;\r
                }\r
                if (service instanceof INexioAPI) {\r
-                       nexioService = null;\r
+                       nexioAPI = null;\r
                        logger.info("INexioAPI service unbinded");\r
                        return;\r
                }\r
index edd1fc5a3439e88f389e2fd091e2b8ce9a322d19..e8e9acfca7f4062f167297eb2a1d48406779de55 100644 (file)
@@ -25,7 +25,7 @@ import user.jobengine.server.IJobEngine;
 public class JobengineService {\r
 \r
        private static final Logger logger = LogManager.getLogger();\r
-       private IItemManager itemManager = ComponentBinder.getItemManagerService();\r
+       private IItemManager itemManager = ComponentBinder.getItemManager();\r
 \r
        public JobengineService() {\r
                //logger.info("Created");\r
@@ -84,7 +84,7 @@ public class JobengineService {
        public Response halt() {\r
                Response result = null;\r
                try {\r
-                       final IJobEngine jobEngine = ComponentBinder.getJobengineService();\r
+                       final IJobEngine jobEngine = ComponentBinder.getJobengine();\r
                        if (jobEngine == null)\r
                                throw new Exception("No ItemManager found");\r
 \r
index 67566e6cf522f36031e675d980360db3ad2e3336..5e986db03d786aff1107a518f108bee094cb9d30 100644 (file)
@@ -24,7 +24,7 @@ import user.jobengine.osgi.rest.ComponentBinder;
 public class OctopusRESTService {
        private static final Logger logger = LogManager.getLogger();
        private static final String ID = "id";
-       private IOctopusAPI octopusService = ComponentBinder.getOctopusService();
+       private IOctopusAPI octopusService = ComponentBinder.getOctopusAPI();
 
        public OctopusRESTService() {
                logger.trace("Created");
index b44da7d36806bfaa02539dc10d6ca69421a1a03b..76b0c79d2a52547d13f88d643e5ede2eead615dd 100644 (file)
@@ -16,8 +16,6 @@ import org.osgi.framework.FrameworkUtil;
 import com.ibm.nosql.json.api.BasicDBObject;
 
 import user.commons.nexio.INexioChangeListener;
-import user.commons.nexio.NexioDispatcher;
-import user.commons.nexio.api.ClipEventListener;
 
 @SuppressWarnings("serial")
 public class NexioWSServlet extends WebSocketServlet implements INexioChangeListener {
@@ -32,16 +30,13 @@ public class NexioWSServlet extends WebSocketServlet implements INexioChangeList
        }
 
        private Set<Session> sessions = new ConcurrentHashSet<>();
-       private NexioDispatcher dispatcher = null;
 
        public NexioWSServlet() {
                logger.info("Created");
                instance = this;
-               dispatcher = new NexioDispatcher();
-               dispatcher.setNexioChangeListener(this);
-               dispatcher.startup();
-               logger.info("Initialized");
-               registerNexioService();
+               BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+               if (bundleContext != null)
+                       bundleContext.registerService(NexioWSServlet.class, this, null);
        }
 
        public void addSession(Session session) {
@@ -97,21 +92,6 @@ public class NexioWSServlet extends WebSocketServlet implements INexioChangeList
                        sessions.removeAll(deadSessions);
        }
 
-       private void registerNexioService() {
-               BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
-               if (bundleContext != null) {
-                       ClassLoader tccl = Thread.currentThread().getContextClassLoader();
-                       try {
-                               Thread.currentThread().setContextClassLoader(ClipEventListener.class.getClassLoader());
-                               bundleContext.registerService(ClipEventListener.class, dispatcher, null);
-                       } catch (Exception e) {
-                               logger.catching(e);
-                       } finally {
-                               Thread.currentThread().setContextClassLoader(tccl);
-                       }
-               }
-       }
-
        public void removeSession(Session session) {
                if (sessions.contains(session))
                        sessions.remove(session);
index ed38c10a44adb7f671123270da9210ee5aa9e2b7..590159f05cb37896c0c39693c8c81f2a67b10657 100644 (file)
@@ -43,8 +43,8 @@ public class NexioWSSocket extends WebSocketAdapter {
                //logger.info("Received: " + message);
 
                try {
-                       INexioAPI nexioService = ComponentBinder.getNexioService();
-                       if (nexioService == null)
+                       INexioAPI nexioAPI = ComponentBinder.getNexioAPI();
+                       if (nexioAPI == null)
                                throw new Exception("Nexio service is unreachable");
 
                        BasicDBObject data = (BasicDBObject) JSONUtil.jsonToDbObject(message);
@@ -58,7 +58,7 @@ public class NexioWSSocket extends WebSocketAdapter {
                        BasicDBObject response = new BasicDBObject(ACTION, action);
                        switch (action) {
                        case LIST:
-                               List<DBObject> clips = nexioService.getItems(null, true);
+                               List<DBObject> clips = nexioAPI.getItems(null, true);
                                response.append(DATA, clips);
                                asyncSendResponse(getSession(), response);
                                break;