git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 29 Nov 2017 16:34:29 +0000 (16:34 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Wed, 29 Nov 2017 16:34:29 +0000 (16:34 +0000)
47 files changed:
client/Maestro/Configuration/ACTIVE-configuration-editor-project.json [new file with mode: 0644]
client/Maestro/Configuration/configuration-archive.json
client/Maestro/Configuration/configuration-studio.json
client/Maestro/Configuration/configuration-sxs-tibi.json [new file with mode: 0644]
client/Maestro/Configuration/configuration-sxs.json
client/Maestro/Configuration/configuration-torokor-t.json [new file with mode: 0644]
client/Maestro/Configuration/global.json
client/Maestro/FolderScanner.cs [new file with mode: 0644]
client/Maestro/Installer/installforge-installer-project.ifp
client/Maestro/Maestro.csproj
client/Maestro/MaestroForm.Designer.cs
client/Maestro/MaestroForm.Metadata.cs
client/Maestro/MaestroForm.Source.cs
client/Maestro/MaestroForm.Target.cs
client/Maestro/MaestroForm.cs
client/Maestro/MeastroFormNotifyIcon.cs
client/Maestro/Program.cs
client/Maestro/Properties/AssemblyInfo.cs
client/Maestro/Sources/FileSystemSource.cs
client/Maestro/Sources/NexioRESTSource.cs
client/MaestroShared/Configuration/ConfigurationInfo.cs
client/MaestroShared/Targets/UNCTargetProcessor.cs
client/OctopusClient/OctopusIDSelector.cs
server/-product/mediacube.product
server/-product/pom.xml
server/user.jobengine.executors/config/config.xml
server/user.jobengine.executors/config/scheduledjobs.json
server/user.jobengine.osgi.commons/src/user/commons/JobStatus.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/OctopusDataMiner.java
server/user.jobengine.osgi.db/src/user/jobengine/db/Media.java
server/user.jobengine.osgi.db/src/user/jobengine/db/MediaFile.java
server/user.jobengine.osgi.server/pages/joblist.zul
server/user.jobengine.osgi.server/pages/mediaplayer.jsp
server/user.jobengine.osgi.server/pages/search_items.zul
server/user.jobengine.osgi.server/src/user/jobengine/server/IJobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobStepExecutor.java
server/user.jobengine.osgi.server/src/user/jobengine/server/actions/JobAction.java
server/user.jobengine.osgi.server/src/user/jobengine/server/actions/SkipExecutingAction.java [new file with mode: 0644]
server/user.jobengine.osgi.server/src/user/jobengine/server/actions/StatusMachine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/messages/JobStepSkippedMessage.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.server/src/user/jobengine/zk/model/SearchModel.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/octopus/OctopusRESTService.java
server/user.tsm.client/src/user/tsm/client/TSMClient.java
server/user.tsm.client/src/user/tsm/client/api/internal/TSMAPI.java

diff --git a/client/Maestro/Configuration/ACTIVE-configuration-editor-project.json b/client/Maestro/Configuration/ACTIVE-configuration-editor-project.json
new file mode 100644 (file)
index 0000000..a88eeba
--- /dev/null
@@ -0,0 +1,72 @@
+{\r
+  "title": "Project megnyitás",\r
+  "active": false,\r
+  "startInTray": true,\r
+  "enableCustomMetadataId": true,\r
+  "defaultWindowColor": "#BDBDBD",\r
+  "partialWindowColor": "#757575",\r
+  "metadataOnly": true,\r
+  "player": {\r
+    "enabled": true,\r
+    "autoStart": false,\r
+    "segmentEditor": true\r
+  },\r
+  "source": {\r
+    "$type": "UNCSource",\r
+    "filter": "avi,wav,mxf",\r
+    "local": {\r
+      "address": "file://C:/xyz",\r
+    }\r
+  },\r
+  "metadatas": [\r
+    {\r
+      "$type": "OctopusMetadata",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/octopus/",\r
+        "timeout": 1000\r
+      },\r
+      "projectSettings": {\r
+        "templateRoot": {\r
+          "address": "file://10.10.1.100/BRAAVOS/.MAESTRO",\r
+          "userName": "mediacube",\r
+          "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+          "timeout": 1000\r
+        },\r
+        "templateName": "ALAPTIMELINE.ezp",\r
+        "target": {\r
+          "label": "Projekt létrehozása",\r
+          "processor": "UNCTargetProcessor",\r
+          "outputFormat": "%ID%-%TEXT%",\r
+          "subFolderFormat": "%IDROOT%-%TEXT%/PROJECT",\r
+          "disableFileVersioning": true,\r
+          "remote": {\r
+            "address": "file://10.10.1.100/BRAAVOS/OCTOPUS",\r
+            "userName": "mediacube",\r
+            "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+            "timeout": 1000\r
+          }\r
+        },\r
+        "disableOpenProject": false,\r
+        "disableOpenSourceFolder": false\r
+      }\r
+    },\r
+    {\r
+      "$type": "TrafficMetadata",\r
+      "server": {\r
+        "address": "Data Source=10.10.1.45\\sql16;Initial Catalog=PA_Echo;Persist Security Info=True;",\r
+        "userName": "MAM",\r
+        "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "MediaCubeMetadata",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/jobengine/",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ],\r
+  "targets": [\r
+  ]\r
+}\r
index bf9614188356cb27b9641ef0331ca1dde80b200f..47daba991983937847d6dc677100dbf45c16486c 100644 (file)
   },\r
   "source": {\r
     "$type": "UNCSource",\r
-    "filter": "avi,wav,mxf",\r
+    "filter": "mov,wav,mxf",\r
+    "foldersAutoExpand": true,\r
     "local": {\r
-      "address": "file://10.10.1.100/BRAAVOS/TOROKOR",\r
+      "address": "file://10.10.1.100/BRAAVOS",\r
       "userName": "mediacube",\r
       "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
       "timeout": 1000\r
index 59b522ee8c2ba1059fae6b62f4e409101c90ab14..d1b924fef166ff72456eec014eed2d9a9f10e1be 100644 (file)
@@ -1,6 +1,6 @@
 {\r
   "title": "Stúdió",\r
-  "active": false,\r
+  "active": true,\r
   "startInTray": false,\r
   "enableCustomMetadataId": true,\r
   "filter": "avi",\r
diff --git a/client/Maestro/Configuration/configuration-sxs-tibi.json b/client/Maestro/Configuration/configuration-sxs-tibi.json
new file mode 100644 (file)
index 0000000..2ac76c0
--- /dev/null
@@ -0,0 +1,105 @@
+{\r
+  "title": "TIBI SxS",\r
+  "active": false,\r
+  "startInTray": true,\r
+  "enableCustomMetadataId": true,\r
+  "defaultWindowColor": "#E0F2F1",\r
+  "partialWindowColor": "#B2DFDB",\r
+  "player": {\r
+    "enabled": true,\r
+    "autoStart": true,\r
+    "segmentEditor": true,\r
+    "extensions": [ "mxf", "mov" ]\r
+  },\r
+  "source": {\r
+    "$type": "UNCSource",\r
+    "filter": "mov,wav,mxf,jpg",\r
+    "local": {\r
+      "address": "file://c:/x"\r
+    }\r
+  },\r
+  "metadatas": [\r
+    {\r
+      "$type": "OctopusMetadata",\r
+      "disableStoryCheck": true,\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/octopus/",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "TrafficMetadata",\r
+      "server": {\r
+        "address": "Data Source=10.10.1.45\\sql16;Initial Catalog=PA_Echo;Persist Security Info=True;",\r
+        "userName": "MAM",\r
+        "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "MediaCubeMetadata",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/jobengine/",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ],\r
+  "targets": [\r
+    {\r
+      "label": "Octopus mappába küldés",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%-%SOURCENAME%",\r
+      "saveArchiveMetadata": false,\r
+      "killDateDays": 7,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/OCTOPUS",\r
+        "userName": "mediacube",\r
+        "password": "H7YCE8gvuGsPvN3bQSf4FTH0/4IRmoe3gKY0QvgG+wlfqS48yLhm/fDoPSRaWpDWa3RKZAnLF3pKs+lLSQX0IRVZDRCkydQP7syEwKhHztbJ+A88W9rKRF2JrQ7W6jA1",\r
+        "timeout": 1000\r
+      },\r
+      "subFolderFormat": "%IDROOT%-%TEXT%",\r
+      "tag": "Betöltés"\r
+    },\r
+    {\r
+      "label": "Traffic mappába küldés",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%-%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%",\r
+      "killDateDays": 7,\r
+      "saveArchiveMetadata": false,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "Lebonyba küldés",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%",\r
+      "tag": "Lebony",\r
+      "killDateDays": 7,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/PLAYOUT_CHECK",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "Archiválás",\r
+      "processor": "FTPTargetProcessor",\r
+      "outputFormat": "%ID%",\r
+      "tag": "Archiválás",\r
+      "saveArchiveMetadata": true,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/ARCHIVE",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ]\r
+}\r
index 94b8ea638301d37bb71526e58fcb146f2aee3002..7d6ab651fd6df7b8111c7ee8a02ac423605c8bff 100644 (file)
@@ -10,9 +10,9 @@
   },\r
   "source": {\r
     "$type": "UNCSource",\r
-    "filter": "avi,wav,mxf",\r
+    "filter": "mov,wav,mxf",\r
     "local": {\r
-      "address": "file://c:/"\r
+      "address": "file://c:/x"\r
     }\r
   },\r
   "metadatas": [\r
@@ -46,7 +46,7 @@
       "processor": "FTPTargetProcessor",\r
       "outputFormat": "%ID%-%SOURCENAME%",\r
       "tag": "Betöltés",\r
-      "subFolderFormat": "%DATESTAMP%/%IDROOT%%TEXT%",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%",\r
       "killDateDays": 7,\r
       "saveArchiveMetadata": false,\r
       "remote": {\r
diff --git a/client/Maestro/Configuration/configuration-torokor-t.json b/client/Maestro/Configuration/configuration-torokor-t.json
new file mode 100644 (file)
index 0000000..51b58bb
--- /dev/null
@@ -0,0 +1,110 @@
+{\r
+  "title": "Törökőr hír nyersanyag betöltő (csak MXF)",\r
+  "active": false,\r
+  "startInTray": true,\r
+  "enableCustomMetadataId": true,\r
+  "defaultWindowColor": "#10F2F1",\r
+  "partialWindowColor": "#10DFDB",\r
+  "player": {\r
+    "enabled": true,\r
+    "autoStart": false,\r
+    "segmentEditor": true\r
+  },\r
+  "source": {\r
+    "$type": "UNCSource",\r
+    "foldersAutoExpand": false,\r
+    "filter": "mxf",\r
+    "local": {\r
+      "address": "file://10.10.1.100//BRAAVOS//OCTOPUS"\r
+    },\r
+    "remote": {\r
+      "address": "ftp://10.10.1.100/OCTOPUS",\r
+      "userName": "mediacube",\r
+      "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+      "timeout": 1000\r
+    }\r
+  },\r
+  "metadatas": [\r
+    {\r
+      "$type": "OctopusMetadata",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/octopus/",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "TrafficMetadata",\r
+      "server": {\r
+        "address": "Data Source=10.10.1.45\\sql16;Initial Catalog=PA_Echo;Persist Security Info=True;",\r
+        "userName": "MAM",\r
+        "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "$type": "MediaCubeMetadata",\r
+      "server": {\r
+        "address": "http://10.10.1.27/services/rest/jobengine/",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ],\r
+  "targets": [\r
+    {\r
+      "label": "Octopus mappába küldés",\r
+      "processor": "FXPTargetProcessor",\r
+      "outputFormat": "%ID%-%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%",\r
+      "killDateDays": 7,\r
+      "saveArchiveMetadata": false,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/OCTOPUS",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "Traffic mappába küldés",\r
+      "processor": "FXPTargetProcessor",\r
+      "outputFormat": "%ID%-%SOURCENAME%",\r
+      "tag": "Betöltés",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%",\r
+      "killDateDays": 7,\r
+      "saveArchiveMetadata": false,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "Lebonyba küldés",\r
+      "processor": "FXPTargetProcessor",\r
+      "outputFormat": "%ID%",\r
+      "tag": "Lebony",\r
+      "killDateDays": 7,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/PLAYOUT_CHECK",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    },\r
+    {\r
+      "label": "Archiválás",\r
+      "processor": "FXPTargetProcessor",\r
+      "outputFormat": "%ID%",\r
+      "tag": "Archiválás",\r
+      "saveArchiveMetadata": true,\r
+      "remote": {\r
+        "address": "ftp://10.10.1.100/ARCHIVE",\r
+        "userName": "mediacube",\r
+        "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
+        "timeout": 1000\r
+      }\r
+    }\r
+  ]\r
+}\r
index 52f76c0022017146450e6b2cceb98fb64d778b26..1188385979be7abb8e600a3e7119f7e9a0b773c8 100644 (file)
@@ -1,5 +1,5 @@
 {\r
-  "minimizeToTray":  true,\r
+  "minimizeToTray":  false,\r
   "userDomain": {\r
     "address": "10.10.254.11",\r
     "userName": "echotest",\r
diff --git a/client/Maestro/FolderScanner.cs b/client/Maestro/FolderScanner.cs
new file mode 100644 (file)
index 0000000..557f828
--- /dev/null
@@ -0,0 +1,44 @@
+using System;\r
+using System.Collections.Concurrent;\r
+using System.IO;\r
+\r
+namespace Maestro {\r
+\r
+    public class FolderScanner<T> {\r
+        public delegate void FoundFileSystemEntry(T parent, string entry, string label, bool isDirectory);\r
+        public event FoundFileSystemEntry OnFoundFileSystemEntry;\r
+        private ConcurrentDictionary<string, T> cache;\r
+\r
+        public void EnumerateDirectories(string path) {\r
+            if (!Directory.Exists(path))\r
+                return;\r
+            foreach (var entry in Directory.EnumerateDirectories(path, "*", SearchOption.AllDirectories)) {\r
+                OnFoundFileSystemEntry?.Invoke(\r
+                    Get(Path.GetDirectoryName(entry)), \r
+                    entry, \r
+                    Uri.UnescapeDataString(Path.GetFileName(entry)), \r
+                    true\r
+                );\r
+            }\r
+        }\r
+\r
+        public void Put(string key, T value) {\r
+            if (cache == null)\r
+                cache = new ConcurrentDictionary<string, T>();\r
+            cache.TryAdd(key, value);\r
+        }\r
+\r
+        private string GetLastSegment(string path) {\r
+            \r
+            return Uri.UnescapeDataString(Path.GetFileName(path));\r
+        }\r
+\r
+        private T Get(string key) {\r
+            T result = default(T);\r
+            if (cache == null)\r
+                return result;\r
+            cache.TryGetValue(key, out result);\r
+            return result;\r
+        }\r
+    }\r
+}\r
index cee5052759c2526c0d2b899787a84fc08e5d3d86..2745a0967707f14e437f00daa9bc4fae41e4979d 100644 (file)
Binary files a/client/Maestro/Installer/installforge-installer-project.ifp and b/client/Maestro/Installer/installforge-installer-project.ifp differ
index 0483df6f97c173f250793defddab9b074a0e8546..483fae64b6ab000eb6380a5c889d8b8ff7c88a80 100644 (file)
     <Compile Include="Commons\DataGridViewProgressColumn.cs" />\r
     <Compile Include="Commons\SambaClient.cs" />\r
     <Compile Include="Commons\WindowsIdentityMembers.cs" />\r
+    <Compile Include="FolderScanner.cs" />\r
     <Compile Include="LoginForm.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
     <Compile Include="MaestroForm.Source.cs">\r
       <SubType>Form</SubType>\r
     </Compile>\r
+    <None Include="Configuration\ACTIVE-configuration-editor-project.json">\r
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+    </None>\r
     <None Include="Configuration\configuration-archive.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
+    <None Include="Configuration\configuration-sxs-tibi.json">\r
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+    </None>\r
+    <None Include="Configuration\configuration-torokor-t.json">\r
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
+    </None>\r
     <None Include="Configuration\global.json">\r
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
     </None>\r
index a39221e236ec559b54e1d1919fcd22d7e2b38c13..aaebe637cb651f9cb559b6bee597388251c06311 100644 (file)
@@ -1,4 +1,5 @@
 using Maestro.Properties;\r
+using System.Windows.Forms;\r
 \r
 namespace Maestro {\r
     partial class MaestroForm {\r
@@ -205,6 +206,7 @@ namespace Maestro {
             this.treeFolders.Dock = System.Windows.Forms.DockStyle.Bottom;\r
             this.treeFolders.Font = new System.Drawing.Font("Microsoft Sans Serif", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
             this.treeFolders.HotTracking = true;\r
+            this.treeFolders.Cursor = Cursors.Hand;\r
             this.treeFolders.ImageIndex = 0;\r
             this.treeFolders.ImageList = this.ilFolders;\r
             this.treeFolders.Location = new System.Drawing.Point(10, 206);\r
index caf99e13f91c8d1d3e9c74b3fd33f418026d48a0..cf13a41d45f8d4b03cfb318cd636c474552aa966 100644 (file)
@@ -162,13 +162,7 @@ namespace Maestro {
                 QuerySegments();\r
             if (movieSegments == null)\r
                 movieSegments = new BindingList<MovieSegment>();\r
-            PlayerForm player = new PlayerForm(ref movieSegments);\r
-            player.BackColor = partialColor;\r
-            player.AutoStart = Configuration.Player.AutoStart;\r
-            player.SegmentEditor = Configuration.Player.SegmentEditor;\r
-            player.Open(SelectedSource.FileInfo);\r
-            Cursor = Cursors.Default;\r
-            player.ShowDialog();\r
+            OpenFile(SelectedSource.FileInfo, true);\r
             UpdateDefineSegmentsStatus();\r
         }\r
 \r
@@ -244,9 +238,9 @@ namespace Maestro {
             MediaCubeMetadata metadata = Configuration.GetMetadataProvider<MediaCubeMetadata>();\r
             string mcID = ARCHIVEID_PREFIX + masterId.id.ToString();\r
             result.itemHouseId = string.IsNullOrEmpty(metadata?.MetadataIDFormat) ? mcID : metadata.MetadataIDFormat;\r
-            result.itemTitle = String.IsNullOrEmpty(metadata?.MetadataTitleFormat) ? result.itemHouseId : metadata.MetadataTitleFormat;\r
+            result.itemTitle = result.itemHouseId;\r
             result.mediaHouseId = mcID;\r
-            result.mediaTitle = result.itemTitle;\r
+            result.mediaTitle = String.IsNullOrEmpty(metadata?.MetadataTitleFormat) ? result.itemHouseId : metadata.MetadataTitleFormat;\r
             return result;\r
         }\r
 \r
index ee8b61386a65cbd4e92de23c0c64c8638ef75abf..54e27ad8ca093bc99263ab425c7df1ff57221c7f 100644 (file)
@@ -1,6 +1,7 @@
 using DxPlay;\r
 using Maestro.Metadata;\r
 using Maestro.Sources;\r
+using MaestroShared.Commons;\r
 using MaestroShared.Configuration;\r
 using MaestroShared.Metadata;\r
 using MaestroShared.Resources;\r
@@ -15,8 +16,8 @@ using System.Windows.Forms;
 \r
 namespace Maestro {\r
 \r
-    delegate void SetTextCallback();\r
-    delegate void TabControlSelectedIndex(int index);\r
+    //delegate void SetTextCallback();\r
+    //delegate void TabControlSelectedIndex(int index);\r
     public partial class MaestroForm {\r
         private ISource source;\r
         private SourceInfo selectedSource;\r
@@ -91,16 +92,33 @@ namespace Maestro {
                 btnShowFolders.CheckState = CheckState.Unchecked;\r
             }\r
             Uri address = Configuration.Source.Local.Address;\r
-            if (!Directory.Exists(address.LocalPath))\r
-                return;\r
-            string[] folders = Directory.GetDirectories(address.LocalPath);\r
-            TreeNode rootNode = treeFolders.Nodes.Add(GetLastSegment(Configuration.Source.Local.Address.ToString()));\r
-            foreach (var folder in folders) {\r
-                TreeNode folderNode = rootNode.Nodes.Add(GetLastSegment(folder));\r
-                folderNode.Nodes.Add("..");\r
-            }\r
+\r
+            \r
+            TreeNode rootNode = treeFolders.Nodes.Add(Path.GetFileName(address.LocalPath));\r
+\r
+            FolderScanner<TreeNode> scanner = new FolderScanner<TreeNode>();\r
+            scanner.Put(address.LocalPath, rootNode);\r
+            scanner.OnFoundFileSystemEntry += (parent, entry, label, isDirectory) => {\r
+                //logger.Trace($"{parent} *** {entry}");\r
+                TreeNode node = parent.Nodes.Add(label);\r
+                scanner.Put(entry, node);\r
+            };\r
+\r
+            treeFolders.BeginUpdate();\r
+            scanner.EnumerateDirectories(address.LocalPath);\r
             if ((Configuration.Source as UNCSource).FoldersAutoExpand)\r
                 treeFolders.ExpandAll();\r
+            rootNode.EnsureVisible();\r
+            treeFolders.EndUpdate();\r
+            //if (!Directory.Exists(address.LocalPath))\r
+            //    return;\r
+            //string[] folders = Directory.GetDirectories(address.LocalPath);\r
+            //TreeNode rootNode = treeFolders.Nodes.Add(GetLastSegment(Configuration.Source.Local.Address.ToString()));\r
+            //var orderedFolders = folders.OrderBy(n => n);\r
+            //foreach (var folder in orderedFolders) {\r
+            //    TreeNode folderNode = rootNode.Nodes.Add(GetLastSegment(folder));\r
+            //    folderNode.Nodes.Add("..");\r
+            //}\r
         }\r
 \r
         private void HideFolders() {\r
@@ -122,15 +140,16 @@ namespace Maestro {
         }\r
 \r
         private void OnBeforeExpandFolder(object sender, TreeViewCancelEventArgs e) {\r
-            if (e.Node.Nodes.Count != 1 || !"..".Equals(e.Node.Nodes[0].Text))\r
-                return;\r
-            e.Node.Nodes.Clear();\r
-            Uri address = new Uri(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node)));\r
-            string[] folders = Directory.GetDirectories(address.LocalPath);\r
-            foreach (var folder in folders) {\r
-                TreeNode folderNode = e.Node.Nodes.Add(GetLastSegment(folder));\r
-                folderNode.Nodes.Add("..");\r
-            }\r
+            //if (e.Node.Nodes.Count != 1 || !"..".Equals(e.Node.Nodes[0].Text))\r
+            //    return;\r
+            //e.Node.Nodes.Clear();\r
+            //Uri address = new Uri(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node)));\r
+            //string[] folders = Directory.GetDirectories(address.LocalPath);\r
+            //var orderedFolders = folders.OrderBy(n => n);\r
+            //foreach (var folder in orderedFolders) {\r
+            //    TreeNode folderNode = e.Node.Nodes.Add(GetLastSegment(folder));\r
+            //    folderNode.Nodes.Add("..");\r
+            //}\r
         }\r
 \r
         private void OnAfterSelectFolder(object sender, TreeViewEventArgs e) {\r
@@ -145,7 +164,10 @@ namespace Maestro {
                 address = new Uri(Uri.UnescapeDataString(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node))));\r
             if (!String.IsNullOrEmpty(address.LocalPath))\r
                 formTooltip.SetToolTip(groupSource, address.LocalPath);\r
-            source.Reset(address.LocalPath);\r
+\r
+            if (source.Reset(address.LocalPath))\r
+                SelectedSource = null;\r
+            \r
             btnShowFolders.Checked = false;\r
             HideFolders();\r
         }\r
@@ -194,21 +216,43 @@ namespace Maestro {
                 if (fileSourceItem == null)\r
                     return;\r
                 dgSource.Enabled = false;\r
-                Cursor = Cursors.WaitCursor;\r
-                try {\r
-                    PlayerForm player = new PlayerForm();\r
+                OpenFile(fileSourceItem.FileInfo, false);\r
+                dgSource.Enabled = true;\r
+            }\r
+        }\r
+\r
+        private void OpenFile(FileInfo fileInfo, bool segmentEditor) {\r
+            Cursor = Cursors.WaitCursor;\r
+            try {\r
+                string[] extensions = Configuration.Player?.Extensions;\r
+\r
+                bool openInternal = false;\r
+                if (extensions != null && !String.IsNullOrEmpty(fileInfo.Extension))\r
+                    openInternal = extensions.Any(e => e != null && fileInfo.Extension.Length > 0 && fileInfo.Extension.Substring(1).ToLower().Equals(e.ToLower()));\r
+\r
+                if (openInternal) {\r
+                    PlayerForm player = new PlayerForm(ref movieSegments);\r
                     player.BackColor = partialColor;\r
                     player.AutoStart = Configuration.Player.AutoStart;\r
-                    player.Open(fileSourceItem.FileInfo);\r
+                    player.SegmentEditor = Configuration.Player.SegmentEditor && segmentEditor;\r
+                    player.Open(fileInfo);\r
                     if (!player.IsDisposed)\r
                         player.ShowDialog();\r
-                    Cursor = Cursors.Default;\r
-                }\r
-                catch (Exception ex) {\r
-                    MessageBox.Show(ex.Message);\r
+                } else {\r
+                    if (segmentEditor)\r
+                        return;\r
+                    ProcessStartInfo psf = new ProcessStartInfo() {\r
+                        FileName = fileInfo.FullName\r
+                    };\r
+                    Process.Start(psf);\r
                 }\r
 \r
-                dgSource.Enabled = true;\r
+            }\r
+            catch (Exception ex) {\r
+                MessageBox.Show(ex.Message);\r
+            }\r
+            finally {\r
+                Cursor = Cursors.Default;\r
             }\r
         }\r
 \r
index af9fb32b61acf029aa7c23a51b1983afee366eda..986dbd6996fbb7fef9452c8220ffd82c7ecdc60c 100644 (file)
@@ -164,19 +164,10 @@ namespace Maestro {
             };\r
 \r
             if (SelectedMetadata.Kind == MetadataType.MediaCube) {\r
-                if (true.Equals(result.ArchiveMetadata?.itemTitle?.Contains("%"))) {\r
-                    string title = PatternNameMaker.Get(result.ArchiveMetadata.itemTitle, result.ID, result.InputFileName, result.MetadataText);\r
-                    result.ArchiveMetadata.itemTitle = title;\r
-                    result.ArchiveMetadata.mediaTitle = title;\r
-                }\r
-                if (true.Equals(result.ArchiveMetadata?.itemHouseId?.Contains("%"))) {\r
-                    string id = PatternNameMaker.Get(result.ArchiveMetadata.itemHouseId, result.ID, result.InputFileName, result.MetadataText);\r
-                    if (String.IsNullOrEmpty(id))\r
-                        result.ArchiveMetadata.itemHouseId = result.ArchiveMetadata.mediaHouseId;\r
-                    else\r
-                        result.ArchiveMetadata.itemHouseId = id;\r
-                }\r
-                //result.ArchiveMetadata.mediaHouseId = id;\r
+                result.ArchiveMetadata.itemHouseId = PatternNameMaker.Get(result.ArchiveMetadata.itemHouseId, result.ID, result.InputFileName, result.MetadataText);\r
+                result.ArchiveMetadata.itemTitle = PatternNameMaker.Get(result.ArchiveMetadata.itemTitle, result.ID, result.InputFileName, result.MetadataText);\r
+                result.ArchiveMetadata.mediaHouseId = PatternNameMaker.Get(result.ArchiveMetadata.mediaHouseId, result.ID, result.InputFileName, result.MetadataText);\r
+                result.ArchiveMetadata.mediaTitle = PatternNameMaker.Get(result.ArchiveMetadata.mediaTitle, result.ID, result.InputFileName, result.MetadataText);\r
             }\r
             return result;\r
         }\r
index 7d1b3748a4f91fb4d996bc74d14ee1816821ecb9..c9971247e2ac21e7006e4805074d890ab9883e4f 100644 (file)
@@ -97,8 +97,6 @@ namespace Maestro {
             SetColor(groupMetadata, defaultColor);\r
             SetColor(groupTarget, defaultColor);\r
             SetColor(groupActions, defaultColor);\r
-            ShowInTaskbar = !TrayApplicationContext.GlobalConfig.MinimizeToTray;\r
-\r
         }\r
 \r
         private void OnMessage(IMessage message) {\r
@@ -120,12 +118,13 @@ namespace Maestro {
 \r
         private void MaestroForm_Resize(object sender, EventArgs e) {\r
             if (WindowState == FormWindowState.Minimized) {\r
-                if (TrayApplicationContext.GlobalConfig.MinimizeToTray)\r
+                if (TrayApplicationContext.GlobalConfig.MinimizeToTray) \r
                     Visible = false;\r
             }\r
         }\r
 \r
         private void MaestroForm_FormClosing(object sender, FormClosingEventArgs e) {\r
+            //if (ModifierKeys.HasFlag()\r
             if (TrayApplicationContext.GlobalConfig.MinimizeToTray)\r
                 Visible = false;\r
             else\r
@@ -158,9 +157,10 @@ namespace Maestro {
                         int position = jobs.IndexOf(job);\r
                         if (position == -1)\r
                             return;\r
-                        bindingSourceJobs.Position = position;\r
-                        if (chkAutoScroll.Checked)\r
+                        if (chkAutoScroll.Checked) {\r
+                            bindingSourceJobs.Position = position;\r
                             dgJobs.FirstDisplayedScrollingRowIndex = position;\r
+                        }\r
                     });\r
                     job.Execute();\r
                 } else {\r
index 8afff418c398e5b92c81927b5022447f26a8e3d8..c821cfac32a287afb6d1a929362e309929e33394 100644 (file)
@@ -15,6 +15,7 @@ namespace Maestro {
             Config = config;\r
             form.MessageBus = messageBus;\r
             form.Configuration = config;\r
+            form.ShowInTaskbar = !TrayApplicationContext.GlobalConfig.MinimizeToTray;\r
 \r
             messageBus.Subscribe<CreateFileActionMsg>(OnFileCreated);\r
             messageBus.Subscribe<RemoveFileActionMsg>(OnFileRemoved);\r
@@ -67,9 +68,9 @@ namespace Maestro {
         }\r
 \r
         public void ShowFormMinimized() {\r
-            notification.Visible = false;\r
-            form.WindowState = FormWindowState.Minimized;\r
             form.Show();\r
+            form.WindowState = FormWindowState.Minimized;\r
+            notification.Visible = false;\r
         }\r
 \r
         public void HideForm() {\r
@@ -91,5 +92,6 @@ namespace Maestro {
             form.Close();\r
             form.Dispose();\r
         }\r
+\r
     }\r
 }\r
index b37bd6062c5d72184621af7b9785dfb80f867f65..0395a8aac1c45c2ee9c945e7feab16d9d18b96f7 100644 (file)
@@ -97,8 +97,10 @@ namespace Maestro {
         public static GlobalInfo GlobalConfig { get; internal set; }\r
 \r
         public TrayApplicationContext() {\r
-            string x = Regex.Replace("1234-00_aaaANYAG", "[^0-9$']", "*");\r
-            Debug.WriteLine(x);\r
+            //string x = Regex.Replace("1234-00_aaaANYAG", "[^0-9$']", "*");\r
+            //Debug.WriteLine(x);\r
+\r
+            //StorageFolder musicFolder = KnownFolders.MusicLibrary;\r
         }\r
 \r
         public static bool HasCommandlineParameter(string parameter) {\r
index 7e8c38db4f2da242eede1674f9e3f2b1ac7047eb..12eaceb37fd784cdb05785187b463d78ef71bab6 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.5.5")]\r
-[assembly: AssemblyFileVersion("2.0.5.5")]\r
+[assembly: AssemblyVersion("2.0.5.7")]\r
+[assembly: AssemblyFileVersion("2.0.5.7")]\r
index deffadca1304d14c5930ba94deeade65a21e5bfd..035295de6342901086b69fb8c8779f83e280a52a 100644 (file)
@@ -138,12 +138,14 @@ namespace Maestro.Sources {
             Reset(null);\r
         }\r
 \r
-        public void Reset(string path) {\r
-            if (path != null)\r
-                this.Path = path;\r
+        public bool Reset(string path) {\r
+            if (Path == null || Path.Equals(path))\r
+                return false;\r
+            Path = path;\r
             Clear();\r
             cache = null;\r
             Shutdown();\r
+            return true;\r
         }\r
 \r
         public FileSystemSource(Control parent, IMessageBus messageBus, bool playerEnabled, string fileExtensionFilter) {\r
index dbd5b7deb20ce4b677f2f0e2c72a8326148569a2..524ddbfebda057304ebd099664389dcb706aee38 100644 (file)
@@ -280,7 +280,10 @@ namespace Maestro.Sources {
             if (item == null)\r
                 return;\r
             parent.SafeCall(() => {\r
-                Remove(item);\r
+                try {\r
+                    Remove(item);\r
+                }\r
+                catch (Exception e) { }\r
                 messageBus.Send(new RemoveFileActionMsg() {\r
                     FileName = item.Name,\r
                     Source = parent\r
index 110d2c8acd54f2354fcba966dfff7524a84374b3..ac2b1b8d83e20a029ecbdecade5d6a3f726b8859 100644 (file)
@@ -4,6 +4,7 @@ using System.Linq;
 using System.Collections.Generic;\r
 using System.IO;\r
 using System.Drawing;\r
+using System.ComponentModel;\r
 \r
 namespace MaestroShared.Configuration {\r
 \r
@@ -59,6 +60,9 @@ namespace MaestroShared.Configuration {
         public bool Enabled { get; set; }\r
         public bool AutoStart { get; set; }\r
         public bool SegmentEditor { get; set; }\r
+        [DefaultValue(new []{"MXF"})]\r
+        [JsonProperty(DefaultValueHandling = DefaultValueHandling.Populate)]\r
+        public string[] Extensions { get; set; }\r
     }\r
 \r
     public class Target {\r
index 5b2ef4a758c6c8338a5b0f0732577b016b489b49..e6d1b1549a2606ee81e87ab75d187b6c95d82539 100644 (file)
@@ -272,10 +272,12 @@ namespace MaestroShared.Targets {
                 int o = segment.IndexOf(UNDERSCORE);\r
                 if (formats[i].Contains("%") && (p > -1 || o > -1)) {\r
                     string pattern = null;\r
-                    if (p < o && p > -1)\r
+                    if (p <= o && p > -1)\r
                         pattern = segment.Substring(0, p);\r
-                    else\r
+                    if (pattern == null && o < p && o > -1)\r
                         pattern = segment.Substring(0, o);\r
+                    if (pattern == null && o < p && p > -1)\r
+                        pattern = segment.Substring(0, p);\r
                     pattern += STAR;\r
                     string searchResult = SearchDirectory(result, pattern);\r
                     if (searchResult == null)\r
index 6c7c8acfaf17f0adb1fe7661508f6ed7901a552d..79f8f646b9655a0e736a72d8f83a62ab4fb0046a 100644 (file)
@@ -78,7 +78,7 @@ namespace OctopusClient {
                     e.Node.Level == 1 && !parameters.Configuration.DisablePlaceHolderCheck) {\r
                     using (Pen pen = new Pen(Color.Black)) {\r
                         pen.Width = 1;\r
-                        e.Graphics.DrawLine(pen, e.Bounds.X, e.Bounds.Y +  2, e.Bounds.X, e.Bounds.Y +  e.Bounds.Height - 4);\r
+                        e.Graphics.DrawLine(pen, e.Bounds.X, e.Bounds.Y + 2, e.Bounds.X, e.Bounds.Y + e.Bounds.Height - 4);\r
                     }\r
                 }\r
             }\r
@@ -119,10 +119,10 @@ namespace OctopusClient {
             //this.OnKeyDown(e);\r
             if (e.KeyCode != Keys.F5)\r
                 return;\r
-            Refresh();\r
+            RefreshList();\r
         }\r
 \r
-        private void Refresh() {\r
+        private void RefreshList() {\r
             if (String.IsNullOrEmpty(txtFilter.Text))\r
                 RefreshStories();\r
             else\r
@@ -132,7 +132,8 @@ namespace OctopusClient {
         private void AddStories(IEnumerable<Story> stories, bool isFolderView = false) {\r
             foreach (var story in stories) {\r
                 string name = story.Name == null ? OctopusAPI.UNNAMED : story.Name;\r
-                String ID = isFolderView ? story.ID : story.ParentStoryID;\r
+                //String ID = isFolderView ? story.ID : story.ParentStoryID;\r
+                String ID = story.ParentStoryID;\r
                 string label = ID;\r
                 if (!String.IsNullOrEmpty(story.Format))\r
                     label += String.Format($" [{story.Format}] {story.Name}");\r
@@ -144,8 +145,13 @@ namespace OctopusClient {
 \r
                 if (parameters.Configuration.DisableStoryCheck)\r
                     HideCheckBox(treeOctopus, storyNode);\r
-                else {\r
-                    if (lookupStoryId != null && lookupStoryId.Equals(story.ID))\r
+\r
+                bool selectFirstChild = false;\r
+\r
+                if (lookupStoryId != null && lookupStoryId.Equals(ID)) {\r
+                    if (parameters.Configuration.DisableStoryCheck)\r
+                        selectFirstChild = true;\r
+                    else\r
                         storyNode.Checked = true;\r
                 }\r
 \r
@@ -158,7 +164,12 @@ namespace OctopusClient {
                     if (parameters.Configuration.DisablePlaceHolderCheck)\r
                         HideCheckBox(treeOctopus, placeHolderNode);\r
                     else {\r
-                        if (lookupPlaceHolderId != null && lookupPlaceHolderId.Equals(mosObject.ObjID)) {\r
+                        if ((lookupPlaceHolderId != null && lookupPlaceHolderId.Equals(mosObject.ObjID)) || selectFirstChild) {\r
+                            if (selectFirstChild && selectedNode != null) {\r
+                                selectFirstChild = false;\r
+                                MsgBox.Warning("Fokozott flehasználói figyelemre van szükség. Az anyag kiválasztás le van tiltva a konfigurációban, így az első elérhető bejátszó került kiválasztásra.");\r
+                                continue;\r
+                            }\r
                             placeHolderNode.Checked = true;\r
                             storyNode.Expand();\r
                             placeHolderNode.EnsureVisible();\r
@@ -197,7 +208,7 @@ namespace OctopusClient {
                 Story story = selectedNode.Tag as Story;\r
                 string text = String.IsNullOrEmpty(story.Format) ? story.Name : String.Format($"{story.Name}_{story.Format}");\r
                 IDChangedEvent?.Invoke(story.ParentStoryID, selectedNode.Name, text);\r
-            }  else\r
+            } else\r
                 IDChangedEvent?.Invoke(null, null, null);\r
         }\r
 \r
@@ -287,7 +298,7 @@ namespace OctopusClient {
                         }\r
                     }\r
                 }\r
-                \r
+\r
             } else {\r
                 refreshDisabled = true;\r
                 dtScheduled.Value = rundown.Start;\r
@@ -302,7 +313,7 @@ namespace OctopusClient {
                         cbFolders.SelectedItem = rundownToSelect;\r
                     }\r
                 }\r
-                \r
+\r
             }\r
             txtFilter.Text = placeHolderId;\r
             if (selectedNode == null)\r
@@ -441,7 +452,7 @@ namespace OctopusClient {
 \r
             processor.Execute();\r
 \r
-            if (!TargetProcessor.READY.Equals(processor.Status) || !TargetProcessor.SKIPPED.Equals(processor.Status)) {\r
+            if (!TargetProcessor.READY.Equals(processor.Status) && !TargetProcessor.SKIPPED.Equals(processor.Status)) {\r
                 MsgBox.Error(processor.Message);\r
                 return;\r
             }\r
@@ -455,7 +466,7 @@ namespace OctopusClient {
         }\r
 \r
         private void noFocusCueButton1_Click(object sender, EventArgs e) {\r
-            Refresh();\r
+            RefreshList();\r
         }\r
     }\r
 \r
index 9d427d6f4a15b67c9b067a829cda10a3f57ea0d7..4352271427d07c3706d4eee56a1068c718b0c38e 100644 (file)
@@ -45,7 +45,7 @@
 \r
 #Selenio\r
 -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl\r
--Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v3.zenium\r
+-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v5.zenium\r
 \r
 #Nexio\r
 -Dnexio.host=10.10.1.55\r
index 8904badb1debed016a62a52fc6a293e00debbaa7..b208a62493e45a80f2f66b45c21ab6bcb56b85b2 100644 (file)
                                                                <argument>/command</argument>\r
                                                                <argument>"open ${remote.address} -hostkey=""${remote.hostkey}"""</argument>\r
 <!--                                                           <argument>"call ${remote.location}/stop-mediacube.sh 2>/dev/null"</argument> -->\r
-<!--                                                           <argument>"call pcs resource disable mediacube_script"</argument> -->\r
+                                                               <argument>"call pcs resource disable mediacube_script"</argument>\r
 <!--                                                           <argument>"call sleep 5"</argument> -->\r
                                                                <argument>"call rm -rf ${remote.location}"</argument>\r
                                                                <argument>"call mkdir ${remote.location}"</argument>\r
index cf02215e30f75de45842824600af9d251d60593d..329c35f56431bd530c897d5e6b02c542b19d35b0 100644 (file)
@@ -10,6 +10,7 @@
        <executor className="user.jobengine.server.steps.MetadataTransformStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.SyncOCTOPUSDataStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.TranscodeSELENIOStep" maxConcurrent="4"/>\r
-       <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="1"/>\r
-       <executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="4"/>\r
+       <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="4"/>\r
+       <executor className="user.jobengine.server.steps.TSMRestoreStep" maxConcurrent="2"/>\r
+       <executor className="user.jobengine.server.steps.OutputPathAndNameSelectorStep" maxConcurrent="10"/>\r
 </executors>
\ No newline at end of file
index f84835ab4a7db14e03dd253034d2f27d13cde786..b6bdbf9427d40e2fd91b9170ca9f02e66866cba9 100644 (file)
       ]\r
        },\r
        {\r
+      "active": false,\r
+         "name" : "Egy archiválás",\r
+      "template": "archive-ondemand.xml",\r
+      "executeimmediate": true,\r
+      "cronexpression": "0 0 0/1 1/1 * ? *",\r
+      "parameters": [ \r
+       {"name": "sourcePath", "value": "/mnt/ISILON/ARCHIVE/ONE", "type": "java.lang.String"},\r
+       {"name": "globalSourcePath", "value": "\\\\10.10.1.100\\BRAAVOS\\ARCHIVE\\ONE", "type": "java.lang.String"},\r
+       {"name": "transcoderTargetPath", "value": "/mnt/SELENIO", "type": "java.lang.String"},\r
+       {"name": "webPath", "value": "/mediacube/data/lowres/www/video", "type": "java.lang.String"},\r
+       {"name": "killDateDays", "value": 1, "type": "java.lang.Integer"}\r
+      ]\r
+       },\r
+       {\r
       "active": false,\r
          "name" : "TRAFFIC anyagok visszatöltése",\r
       "template": "retrieve-traffic-missing-materials.xml",\r
index 3715d823e24ca8b7a99850ef6c0aab0345f6db8e..ff40329c38a8a584bafa441c2de06adb502ab43b 100644 (file)
@@ -5,47 +5,41 @@ package user.commons;
  */
 public enum JobStatus {
        /**
-        * Futtatható - a folyamat az ütemező várakozási sorában található, az
-        * ütemező a megfelelő időben futtatja a gépi kódú utasításokat.
+        * Felfüggesztett - a folyamat egy manuális felfüggesztés-kérés hatására felfüggesztett állapotba került.
         */
-       RUNABLE(0x0001),
-       /**
-        * Felfüggesztett - a folyamat egy manuális felfüggesztés-kérés hatására
-        * felfüggesztett állapotba került.
-        */
-       SUSPENDED(0x0002),
+       SUSPENDED(0x0001),
        /**
         * Vége - a folyamat futása befejeződött.
         */
-       FINISHED(0x0004),
+       FINISHED(0x0002),
        /**
-        * Végrehajtás alatt - a folyamat végrehajtó futtatja a lépést.
+        * Futtatható - a folyamat az ütemező várakozási sorában található, az ütemező a megfelelő időben futtatja a gépi kódú utasításokat.
         */
-       EXECUTING(0x0008),
+       RUNABLE(0x0004),
        /**
         * Megszakított állapot.
         */
-       CANCELED(0x0010),
+       CANCELED(0x0008),
        /**
-        * Végrehajtóra vár - a folyamat aktuális utasítása végrehajtót igényel,
-        * annak várakozási sorában található.
+        * Végrehajtóra vár - a folyamat aktuális utasítása végrehajtót igényel, annak várakozási sorában található.
         */
-       WAIT_EXECUTOR(0x0101),
+       WAIT_EXECUTOR(0x0100),
        /**
-        * Felfüggesztésre vár - a folyamat felfüggesztés kérelmet kapott, de még
-        * nem történt meg a felfüggesztés.
+        * Válaszra vár - a folyamat egy felhasználói üzenet végrehajtása után, annak megválaszolására vár.
         */
-       WAIT_SUSPEND(0x0102),
+       WAIT_USERMESSAGE(0x0102),
        /**
-        * Válaszra vár - a folyamat egy felhasználói üzenet végrehajtása után,
-        * annak megválaszolására vár.
+        * Felfüggesztésre vár - a folyamat felfüggesztés kérelmet kapott, de még nem történt meg a felfüggesztés.
         */
-       WAIT_USERMESSAGE(0x0104),
+       WAIT_SUSPEND(0x0104),
        /**
-        * Megszakításra vár - a folyamat megszakítási kérelmet kapott, annak
-        * lefutását várja. A megszakítási folyamat eredménye CANCELED állapot lesz.
+        * Megszakításra vár - a folyamat megszakítási kérelmet kapott, annak lefutását várja. A megszakítási folyamat eredménye CANCELED állapot lesz.
+        */
+       WAIT_CANCEL(0x0108),
+       /**
+        * Végrehajtás alatt - a folyamat végrehajtó futtatja a lépést.
         */
-       WAIT_CANCEL(0x0108);
+       EXECUTING(0x1000);
 
        private final int value;
 
index 96760ebba9afd52cbf548c81f4950f788da32219..d5df0df1be739f22089be947e5cd1d5abb101903 100644 (file)
@@ -41,7 +41,7 @@ public class OctopusDataMiner implements Runnable {
        private static final String SAVING_STORY_ID = "Saving story {}";\r
        private static final String SAVING_RUNDOWN = "Saving rundown : {} {}";\r
        private static final String CHECKING_RUNDOWN = "Checking Rundown {} ({}/{})";\r
-       private static final String FIELDS_STORIES = "stories,Story.modified,Story.name,Story.id,Story.mosObjects,Story.script,Story.type,Story.format,customColumns,CustomColumn.label,CustomColumn.value";\r
+       private static final String FIELDS_STORIES = "stories,Story.modified,Story.name,Story.id,Story.mosObjects,Story.script,Story.type,Story.format,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
        private static final String FIELDS_SLUGS = "slugs,Slug.story,Slug.position,Story.name,Story.id,Story.modified,Story.mosObjects,Story.script,Story.type,Story.format,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
        private static final String FIELDS_RUNDOWN_LIST = "id,name,modified,scheduledStart,rundownType,RundownType.name,slugs,Slug.storyId,Slug.position";\r
        private static final String FIELDS_STORY_FOLDER_LIST = "id,name,modified,stories,Story.id";\r
@@ -611,11 +611,11 @@ public class OctopusDataMiner implements Runnable {
                } else\r
                        story.put(IOctopusAPI.MOS_OBJECTS, modifiedMOS);\r
 \r
-               String parentSoryId = GetCustomColumnValue(IOctopusAPI.PARENT_STORY_ID, story);\r
-               if (parentSoryId == null)\r
+               String parentStoryId = GetCustomColumnValue(IOctopusAPI.PARENT_STORY_ID, story);\r
+               if (parentStoryId == null)\r
                        story.append(IOctopusAPI.PARENT_STORY_ID, storyID);\r
                else\r
-                       story.append(IOctopusAPI.PARENT_STORY_ID, parentSoryId);\r
+                       story.append(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
                logger.debug(SAVING_STORY_ID, storyID);\r
                collection.save(story);\r
                logger.trace(EXIT);\r
index acfa8b3a55674de4b66637b7be80bffc37e05310..aa343583272f558019448424c6ee3a26d8200567 100644 (file)
@@ -71,6 +71,10 @@ public class Media extends DynamicAttributes {
                return mediaFiles;
        }
 
+       public int getMediaFilesCount() {
+               return getMediaFiles() == null ? 0 : getMediaFiles().size();
+       }
+
        public byte[] getPoster() {
                return poster;
        }
index e7acd34b745731380d3d8504cb5c0bead37f1fbc..2fe834c5e1452513fee612f045a1d0d201840341 100644 (file)
@@ -107,4 +107,5 @@ public class MediaFile extends EntityBase implements Serializable {
                //checkParameter("StoreId", id);
                this.storeId = id;
        }
+
 }
\ No newline at end of file
index 5dd0c4761059d3d0cd9805dcc290fa459535cf30..e635a992aca9ffc5489e8b7ad09cd0ed9abf9cba 100644 (file)
@@ -22,7 +22,7 @@
 \r
                <space bar="false" />\r
                \r
-               <div align="left" width="50%">\r
+               <div align="left" width="100%">\r
                        <space bar="false" />\r
                        <spinner constraint="no empty,min 1 max 10" value="@bind(jlm.newPriority)" width="60px" disabled="@load(jlm.updatePriorityDisabled)" />\r
                        <button label="Repriorizálás" onClick="@command('changeJobsPriority')" autodisable="self" disabled="@load(jlm.updatePriorityDisabled)" />\r
index f7cbeee35ab72db6abb62f1cab57d7d2d8f37be9..43739247ceecb55b5c7910950eea81371900eba4 100644 (file)
@@ -1,22 +1,23 @@
-<%@page import="java.util.*"%><%\r
+<%@page import="java.util.*"%>\r
+<%\r
        String mediaURL = request.getParameter("mediaurl");\r
        if(mediaURL == null) mediaURL = "";\r
 //out.println("<BR>" + mediaURL);      \r
 %>\r
 <head>\r
 \r
-       <style>\r
-               .myVideoDiv-dimensions {\r
-                   width: 100%;\r
-                   height: 100%;\r
-               }       \r
-       </style>\r
+<style>\r
+.myVideoDiv-dimensions {\r
+       width: 100%;\r
+       height: 100%;\r
+}\r
+</style>\r
 \r
-  <link href="/css/video-js.css" rel="stylesheet">\r
-  <!-- If you'd like to support IE8 -->\r
-  <script src="/js/videojs-ie8.min.js"></script>\r
-  <script src="/js/video.js"></script>\r
-  <script>\r
+<link href="/css/video-js.css" rel="stylesheet">\r
+<!-- If you'd like to support IE8 -->\r
+<script src="/js/videojs-ie8.min.js"></script>\r
+<script src="/js/video.js"></script>\r
+<script>\r
          function resizeMediaWindow(){\r
                        //document frame\r
 //                     var mediaDiv = document.getElementById("myVideoDiv");\r
 \r
 <body>\r
 \r
-<%if(!"".equals(mediaURL) && !mediaURL.endsWith("empty.zul")){%>\r
-  <video id="myVideoDiv" class="video-js" controls preload="auto" data-setup="{}">\r
-       <source src="<%=mediaURL%>" type='video/mp4'>\r
-    <!--source src="/zk/media_oceans.mp4" type='video/mp4' -->\r
-    <!--source src="MY_VIDEO.webm" type='video/webm' -->\r
-    <p class="vjs-no-js">\r
-      To view this video please enable JavaScript, and consider upgrading to a web browser that\r
-      <a href="http://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>\r
-    </p>\r
-  </video>\r
+       <%if(!"".equals(mediaURL) && !mediaURL.endsWith("empty.zul")){%>\r
+       <video id="myVideoDiv" class="video-js" controls preload="auto"\r
+               data-setup="{}">\r
+               <script>\r
+                       console.log('<%=mediaURL%>');\r
+               </script>\r
+               <source src="<%=mediaURL%>" type='video/mp4'>\r
+               <!--source src="/zk/media_oceans.mp4" type='video/mp4' -->\r
+               <!--source src="MY_VIDEO.webm" type='video/webm' -->\r
+               <p class="vjs-no-js">\r
+                       To view this video please enable JavaScript, and consider upgrading\r
+                       to a web browser that <a\r
+                               href="http://videojs.com/html5-video-support/" target="_blank">supports\r
+                               HTML5 video</a>\r
+               </p>\r
+       </video>\r
 \r
-<script>\r
+       <script>\r
        var player = videojs('myVideoDiv');\r
        //var player = videojs.players.myVideoDiv;\r
        \r
@@ -59,7 +66,7 @@
        \r
 </script>\r
 \r
-<%}%>\r
+       <%}%>\r
 \r
 \r
 </body>\r
index 31db0bb3ccfd3dc329044a92cebeaf8eccfb9e9b..a14f513affdc61692d042374e94e250ecb6c83df 100644 (file)
                                                        <listhead sizable="true">\r
                                                                <listheader label="ID" hflex="1" align="left" />\r
                                                                <listheader label="Cím" hflex="6" align="left" />\r
+                                                               <listheader label="Kópiák" hflex="1" align="left" />\r
                                                        </listhead>\r
                                                        <template name="model">\r
                                                                <listitem>\r
                                                                        <listcell label="@load(each.houseId)" />\r
                                                                        <listcell label="@load(each.title)" />\r
+                                                                       <listcell label="@load(each.mediaFilesCount)" />\r
                                                                </listitem>\r
                                                        </template>\r
                                                </listbox>\r
index af2a004c89b0d0502dd8a29a280152d8c65f3e23..b917e498e111d5bf1f3029b5eeb883c72931918c 100644 (file)
@@ -76,6 +76,8 @@ public interface IJobEngine {
 
        void processJobStepCompletedMessage(IJobMessage message);
 
+       void processJobStepSkippedMessage(IJobMessage message);
+
        void processReplyMessage(IJobMessage message);
 
        void processRestartRequest(IJobMessage message);
index fcac079c406eeb7262fae92a11d6f0054801e1b0..e573a2eb2e5007b17bd8e521599c0d19642bc7ad 100644 (file)
@@ -65,9 +65,12 @@ public class JobEngine implements IJobEngine {
 
                        while (!shutdown) {
                                try {
-                                       IJobMessage message = messageQueue.poll(100, TimeUnit.MILLISECONDS);
-                                       if (message != null) {
-                                               message.process(JobEngine.this);
+                                       while (!messageQueue.isEmpty()) {
+                                               IJobMessage message = messageQueue.poll(50, TimeUnit.MILLISECONDS);
+                                               if (message != null) {
+                                                       logger.info("Processing {}", message.getClass());
+                                                       message.process(JobEngine.this);
+                                               }
                                        }
                                } catch (InterruptedException e) {
                                        shutdown = true;
@@ -141,19 +144,19 @@ public class JobEngine implements IJobEngine {
                return itemManager;
        }
 
-       private boolean isRunning;
+       private volatile boolean isRunning;
 
        private volatile boolean shutdown = false;
        private final BlockingQueue<IJobRuntime> runQueue;
        private final BlockingQueue<IJobMessage> messageQueue;
        private final List<JobTemplate> jobTemplates;
-       private final Map<Long, IJobRuntime> jobs;
+       private final Map<Long, IJobRuntime> submittedJobs;
        private final Map<String, IProgram> programs;
        private final Map<String, IJobStepExecutor> executors;
-       private final VM worker;
-       private final MessageDispatcher dispatcher;
+       private VM worker;
+       private MessageDispatcher dispatcher;
+       private IUserMessageQueues userMessageQueues;
        private final CyclicBarrier barrier;
-       private final IUserMessageQueues userMessageQueues;
 
        private final IStatusMachine statusMachine;
 
@@ -171,11 +174,8 @@ public class JobEngine implements IJobEngine {
                messageQueue = new LinkedBlockingQueue<IJobMessage>();
                jobTemplates = Collections.synchronizedList(new ArrayList<JobTemplate>());
                executors = new LinkedHashMap<String, IJobStepExecutor>();
-               worker = new VM();
-               dispatcher = new MessageDispatcher();
-               userMessageQueues = new UserMessageQueues();
 
-               jobs = createJobs();
+               submittedJobs = createJobs();
                barrier = new CyclicBarrier(3);
                nextJobId = new AtomicLong(0);
                programs = new HashMap<String, IProgram>();
@@ -229,8 +229,8 @@ public class JobEngine implements IJobEngine {
        public void addToRunQueue(IJobRuntime jobRuntime) {
                try {
 
-                       if (jobRuntime.getIp() == 0)
-                               logger.debug("Adding first Job {}-{} to run queue {}", jobRuntime.getId(), jobRuntime.getName(), jobRuntime.getProgram());
+                       //if (jobRuntime.getIp() == 0)
+                       logger.info("Adding Job {}-{} to run queue {}", jobRuntime.getId(), jobRuntime.getName(), jobRuntime.getProgram());
                        runQueue.put(jobRuntime);
                } catch (Exception e) {
                        logger.error(e.getMessage(), e);
@@ -241,8 +241,6 @@ public class JobEngine implements IJobEngine {
        public synchronized void bindItemManagerService(IItemManager service) {
                try {
                        setItemManager(service);
-                       loadPrograms();
-                       loadExecutors();
                        startup();
                } catch (Exception e) {
                        logger.error("Couldn't bind itemManagerService", e);
@@ -379,21 +377,21 @@ public class JobEngine implements IJobEngine {
        @Override
        public Job getJob(long id) {
                Job result = null;
-               if (jobs.containsKey(id))
-                       result = (Job) jobs.get(id);
+               if (submittedJobs.containsKey(id))
+                       result = (Job) submittedJobs.get(id);
                return result;
        }
 
        @Override
        public IJobRuntime getJobById(long jobId) {
-               if (!jobs.containsKey(jobId))
+               if (!submittedJobs.containsKey(jobId))
                        throw new NullPointerException("job");
-               return jobs.get(jobId);
+               return submittedJobs.get(jobId);
        }
 
        @Override
        public Map<Long, IJobRuntime> getJobs() {
-               return jobs;
+               return submittedJobs;
        }
 
        protected long getNextJobId() {
@@ -465,8 +463,8 @@ public class JobEngine implements IJobEngine {
                                for (IJobStepExecutor executor : executorList)
                                        addStepExecutor(executor);
                        }
-                       //                      loadUnregisteredExecutors(stepRoot);
-                       //                      loadUnregisteredExecutors(stepsAlternateRoot);
+                       loadUnregisteredExecutors(stepRoot);
+                       loadUnregisteredExecutors(stepsAlternateRoot);
                } catch (Exception e) {
                        logger.error("Error loading executors: " + e);
                } finally {
@@ -600,6 +598,12 @@ public class JobEngine implements IJobEngine {
                statusMachine.processAction(JobAction.DONE, jobRuntime);
        }
 
+       @Override
+       public void processJobStepSkippedMessage(IJobMessage message) {
+               IJobRuntime jobRuntime = getJobById(message.getJobId());
+               statusMachine.processAction(JobAction.SKIP, jobRuntime);
+       }
+
        @Override
        public void processReplyMessage(IJobMessage message) {
                IJobRuntime jobRuntime = getJobById(message.getJobId());
@@ -661,8 +665,8 @@ public class JobEngine implements IJobEngine {
 
        @Override
        public void removeJob(long id) {
-               if (jobs.containsKey(id)) {
-                       IJobRuntime jobRuntime = jobs.remove(id);
+               if (submittedJobs.containsKey(id)) {
+                       IJobRuntime jobRuntime = submittedJobs.remove(id);
                        fireJobChangedEvent(new JobChangedEvent(jobRuntime, SignalType.DELETE));
                        logger.info("Removed from VM {}>", jobRuntime);
                }
@@ -710,8 +714,7 @@ public class JobEngine implements IJobEngine {
 
        @Override
        public void sendMessage(IJobMessage jobMessage) {
-               if (!shutdown)
-                       messageQueue.add(jobMessage);
+               messageQueue.add(jobMessage);
        }
 
        @Override
@@ -724,9 +727,10 @@ public class JobEngine implements IJobEngine {
                shutdown = true;
                if (schedulerService != null)
                        schedulerService.shutdown();
+
                worker.shutDown();
-               dispatcher.shutDown();
                shutdownExecutors();
+               dispatcher.shutDown();
 
                try {
                        TSMClient.CleanUpMultithread();
@@ -747,9 +751,17 @@ public class JobEngine implements IJobEngine {
 
        @Override
        public void startup() {
-               worker.start();
-               dispatcher.start();
                try {
+                       loadPrograms();
+                       loadExecutors();
+
+                       worker = new VM();
+                       dispatcher = new MessageDispatcher();
+                       userMessageQueues = new UserMessageQueues();
+
+                       worker.start();
+                       dispatcher.start();
+
                        for (IJobStepExecutor executor : executors.values())
                                executor.startup(this);
                        barrier.await();
@@ -770,7 +782,7 @@ public class JobEngine implements IJobEngine {
                runtime.setSubmitted(new Timestamp(System.currentTimeMillis()));
                runtime.add();
                addToRunQueue(runtime);
-               jobs.put(runtime.getId(), runtime);
+               submittedJobs.put(runtime.getId(), runtime);
                logger.info("< Added to VM {}", runtime);
        }
 
index 9aa6d97eb07b5b98ae397655b3d2ba82c5a37954..993105f14361ab543949d80514c467b94e8554bc 100644 (file)
@@ -12,6 +12,7 @@ import org.apache.logging.log4j.Logger;
 
 import user.commons.JobStatus;
 import user.jobengine.server.messages.JobStepCompletedMessage;
+import user.jobengine.server.messages.JobStepSkippedMessage;
 import user.jobengine.server.steps.IJobStep;
 
 public class JobStepExecutor implements IJobStepExecutor {
@@ -31,6 +32,10 @@ public class JobStepExecutor implements IJobStepExecutor {
                                try {
                                        jobRuntime = queue.poll(50, TimeUnit.MILLISECONDS);
                                        if (jobRuntime != null) {
+                                               if (shutdown) {
+                                                       jobEngine.sendMessage(new JobStepSkippedMessage(jobRuntime.getId()));
+                                                       continue;
+                                               }
                                                Object[] inputs = jobEngine.getInputsFromStack(jobRuntime);
                                                Object[] outputs = null;
                                                jobRuntime.setStatus(JobStatus.EXECUTING);
index 001d79f13980ed49d7c4c6fd8ee332bfaf4844ba..c11a4589dc13b1a786a5f7f465ea46b46773e754 100644 (file)
@@ -2,42 +2,41 @@ package user.jobengine.server.actions;
 
 public enum JobAction {
        /**
-        * Leállítás.
+        * Le�ll�t�s.
         */
        CANCEL(0x0001),
        /**
-        * Lépés futtatás.
+        * L�p�s futtat�s.
         */
        EXECUTE(0x0002),
        /**
-        * Lépés kész: tényleges befejezés, vagy a megszakítás/felfüggesztés kérelem végrehajtása után.
+        * L�p�s k�sz: t�nyleges befejez�s, vagy a megszak�t�s/felf�ggeszt�s k�relem v�grehajt�sa ut�n.
         */
        DONE(0x0003),
        /**
-        * Folytatás. 
+        * Folytat�s.
         */
        RESUME(0x0004),
        /**
-        * Folyamat futtatás.
+        * Folyamat futtats.
         */
        RUN(0x0005),
        /**
-        * Felfüggesztés.
+        * Felf�ggeszt�s.
         */
        SUSPEND(0x0006),
        /**
-        * Felhasználói üzenet.
+        * Felhaszn�l�i �zenet.
         */
        MESSAGE(0x0007),
        /**
-        * Válasz felhasználói üzenetre.
+        * V�lasz felhaszn�l�i �zenetre.
         */
-       REPLY(0x0008), 
+       REPLY(0x0008),
        /**
-        * Kész.
+        * Ksz.
         */
-       FINISH(0x0009), 
-       RESTART(0x000A);
+       FINISH(0x0009), RESTART(0x000A), SKIP(0x000B);
 
        private final int value;
 
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/actions/SkipExecutingAction.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/actions/SkipExecutingAction.java
new file mode 100644 (file)
index 0000000..f534b54
--- /dev/null
@@ -0,0 +1,16 @@
+package user.jobengine.server.actions;\r
+\r
+import user.commons.JobStatus;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class SkipExecutingAction implements IJobStatusAction {\r
+\r
+       @Override\r
+       public void processAction(IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
+               jobRuntime.decrementInstructionPointer();\r
+               jobRuntime.setStatus(JobStatus.RUNABLE);\r
+               jobRuntime.NotifyUpdate();\r
+               jobEngine.addToRunQueue(jobRuntime);\r
+       }\r
+}\r
index 220e02b975d674deea6e628f3ee1c08a45653362..84131cf4258a305dfcf0d9189fa6a90828f2bc5e 100644 (file)
@@ -63,5 +63,6 @@ public class StatusMachine implements IStatusMachine {
                actions.put(new StatusMachineAction(JobAction.REPLY, JobStatus.WAIT_USERMESSAGE), new ReplyWaitUserMessageAction());\r
 \r
                actions.put(new StatusMachineAction(JobAction.RESTART, JobStatus.CANCELED), new RestartCanceledAction());\r
+               actions.put(new StatusMachineAction(JobAction.SKIP, JobStatus.WAIT_EXECUTOR), new SkipExecutingAction());\r
        }\r
 }\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/messages/JobStepSkippedMessage.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/messages/JobStepSkippedMessage.java
new file mode 100644 (file)
index 0000000..2e011fc
--- /dev/null
@@ -0,0 +1,17 @@
+package user.jobengine.server.messages;
+
+import user.jobengine.server.IJobEngine;
+
+public class JobStepSkippedMessage extends JobMessage {
+
+       public JobStepSkippedMessage(long jobId) {
+               super(jobId);
+       }
+
+       @Override
+       public void process(IJobEngine jobEngine) {
+               super.process(jobEngine);
+               jobEngine.processJobStepSkippedMessage(this);
+       }
+
+}
index 6dcfd29c7515f0e8729a6b99d5d5b4eda1f77cd9..0f610d2848a006884ea807d7c97e7b8f30d7887b 100644 (file)
@@ -22,49 +22,9 @@ import user.jobengine.server.IJobEngine;
 import user.jobengine.server.IJobRuntime;\r
 import user.jobengine.server.JobChangedEvent;\r
 import user.jobengine.server.JobEngine;\r
-import user.jobengine.server.JobRuntime;\r
 \r
 public class JobListModel extends BaseModel implements IJobChangedListener {\r
 \r
-       class JobTweaker implements Runnable {\r
-               public JobTweaker() {\r
-                       Thread t = new Thread(this, "JobTweaker");\r
-                       t.start();\r
-               }\r
-\r
-               @Override\r
-               public void run() {\r
-                       for (int c = 1000; true; c++) {\r
-                               try {\r
-                                       for (int j = 0; j < jobList.size(); j++) {\r
-                                               IJobRuntime job = jobList.get(j);\r
-                                               if (j % 2 == 0) {\r
-                                                       if (job.getProgress() < 100) {\r
-                                                               job.setProgress(job.getProgress() + 2);\r
-                                                               jobEngine.fireJobChangedEvent(new JobChangedEvent(job, SignalType.UPDATE));\r
-                                                       }\r
-                                               }\r
-                                               if (job.getProgress() >= 100) {\r
-                                                       //calls : fireJobChangedEvent(new JobChangedEvent(job, SignalType.DELETE));\r
-                                                       jobEngine.removeJob(job.getId());\r
-                                                       jobEngine.fireJobChangedEvent(new JobChangedEvent(job, SignalType.DELETE));\r
-                                               }\r
-                                       }\r
-\r
-                                       if (c % 3 == 0) {\r
-                                               IJobRuntime newJob = createTestJob(c, 1, 50, "NEW" + c);\r
-                                               //calls : fireJobChangedEvent(new JobChangedEvent(jobRuntime, SignalType.CREATE));\r
-                                               jobEngine.addToRunQueue(newJob);\r
-                                               jobEngine.fireJobChangedEvent(new JobChangedEvent(newJob, SignalType.CREATE));\r
-                                       }\r
-                                       Thread.sleep(1000);\r
-                               } catch (Exception exc) {\r
-                                       logger.error("", exc);\r
-                               }\r
-                       }\r
-               }\r
-       }\r
-\r
        private static final Logger logger = LogManager.getLogger();\r
        private List<JobChangedEvent> jobEvents = new ArrayList<JobChangedEvent>();\r
        //protected CachedListModel searchResult = null;\r
@@ -72,8 +32,6 @@ public class JobListModel extends BaseModel implements IJobChangedListener {
        private IJobRuntime selectedJob = null;\r
        private IJobEngine jobEngine = null;\r
        private int newPriority = 1;\r
-       private JobTweaker jobTweaker = null;\r
-       private int nofJobs = 10;\r
        private boolean shutdownDisabled;\r
        private boolean startupDisabled;\r
 \r
@@ -88,13 +46,8 @@ public class JobListModel extends BaseModel implements IJobChangedListener {
                }\r
        }\r
 \r
-       private IJobRuntime createTestJob(int id, int prio, int progress, String name) {\r
-               IJobRuntime job = new JobRuntime();\r
-               job.setId(id);\r
-               job.setName(name == null ? ("Name " + id) : name);\r
-               job.setPriority(prio);\r
-               job.setProgress(progress);\r
-               return job;\r
+       private int compare(IJobRuntime o1, IJobRuntime o2) {\r
+               return o1.getStatus().compareTo(o2.getStatus());\r
        }\r
 \r
        @Command\r
@@ -118,38 +71,37 @@ public class JobListModel extends BaseModel implements IJobChangedListener {
                return this.selectedJob;\r
        }\r
 \r
-       @SuppressWarnings("unchecked")\r
        @Init\r
        public void init() {\r
                try {\r
                        jobList.setMultiple(true);\r
-\r
                        this.jobEngine = JobEngine.getInstance();\r
 \r
-                       if (jobEngine == null) {\r
-                               setStartupDisabled(true);\r
-                               setShutdownDisabled(true);\r
-                       }\r
-                       setShutdownDisabled(true);\r
-                       setStartupDisabled(true);\r
-\r
-                       //TESTJOBOK\r
-                       //test();\r
-\r
+                       if (jobEngine == null)\r
+                               throw new Exception("Internal error! JobEngine instance unavailable.");\r
+                       setShutdownDisabled(!jobEngine.isRunning());\r
+                       setStartupDisabled(jobEngine.isRunning());\r
                        this.jobEngine.addJobChangedEventListener(this);\r
-                       Map<Long, IJobRuntime> jobMap = this.jobEngine.getJobs();\r
+                       initializeList();\r
 \r
-                       jobList.addAll(jobMap.values());\r
-                       //                      List<IEntityBase> allItems = jobEngine.getItemManager().getAll(Job.class);\r
-                       //                      for (IEntityBase entity : allItems) {\r
-                       //                              jobList.add(new JobRuntime((IJob) entity));\r
-                       //                      }\r
-                       Collections.sort((List) jobList); //forditott sorrend?\r
                } catch (Exception exc) {\r
                        logger.error("", exc);\r
+                       setStartupDisabled(true);\r
+                       setShutdownDisabled(true);\r
                }\r
        }\r
 \r
+       private void initializeList() {\r
+               jobList.clear();\r
+               Map<Long, IJobRuntime> jobMap = this.jobEngine.getJobs();\r
+               jobList.addAll(jobMap.values());\r
+               //                      List<IEntityBase> allItems = jobEngine.getItemManager().getAll(Job.class);\r
+               //                      for (IEntityBase entity : allItems) {\r
+               //                              jobList.add(new JobRuntime((IJob) entity));\r
+               //                      }\r
+               Collections.sort(jobList, (o1, o2) -> compare(o1, o2));\r
+       }\r
+\r
        public boolean isShutdownDisabled() {\r
                return shutdownDisabled;\r
        }\r
@@ -222,7 +174,7 @@ public class JobListModel extends BaseModel implements IJobChangedListener {
                this.selectedJob = _selectedJob;\r
        }\r
 \r
-       @NotifyChange({ "shutdownDisabled" })\r
+       //@NotifyChange({ "shutdownDisabled" })\r
        public void setShutdownDisabled(boolean shutdownDisabled) {\r
                this.shutdownDisabled = shutdownDisabled;\r
        }\r
@@ -233,26 +185,31 @@ public class JobListModel extends BaseModel implements IJobChangedListener {
        }\r
 \r
        @Command\r
+       @NotifyChange({ "shutdownDisabled", "startupDisabled" })\r
        public void shutdown() {\r
-               setShutdownDisabled(true);\r
-               jobEngine.shutdown();\r
-               setStartupDisabled(false);\r
+               shutdownDisabled = true;\r
+               Runnable r = new Runnable() {\r
+                       @Override\r
+                       public void run() {\r
+                               jobEngine.shutdown();\r
+                               setStartupDisabled(false);\r
+                               BindUtils.postNotifyChange(null, null, this, "startupDisabled");\r
+                       }\r
+               };\r
+               Thread t = new Thread(r);\r
+               t.start();\r
        }\r
 \r
        @Command\r
+       @NotifyChange({ "shutdownDisabled", "startupDisabled" })\r
        public void startup() {\r
-               setStartupDisabled(true);\r
-               jobEngine.startup();\r
-               setShutdownDisabled(false);\r
-       }\r
-\r
-       private void test() {\r
-               this.jobEngine = new JobEngine();\r
-               for (int j = 0; j < nofJobs; j++) {\r
-                       this.jobEngine.addToRunQueue(createTestJob(j, 1, j, null));\r
+               startupDisabled = true;\r
+               try {\r
+                       jobEngine.startup();\r
+               } catch (Exception e) {\r
                }\r
-               jobTweaker = new JobTweaker();\r
+               shutdownDisabled = false;\r
+               initializeList();\r
        }\r
 \r
-       //END OF TEST CODE ************************************************\r
 }\r
index ae62ee798dcc80aab31b513118a54447969f42cf..cb3fb00c7a8dfb1a93bf27ceda59661b1684c5ee 100644 (file)
@@ -10,6 +10,7 @@ import org.zkoss.zk.ui.Executions;
 import org.zkoss.zk.ui.select.Selectors;\r
 import org.zkoss.zk.ui.select.annotation.Wire;\r
 import org.zkoss.zul.ListModelList;\r
+import org.zkoss.zul.Messagebox;\r
 import org.zkoss.zul.Window;\r
 \r
 import com.ibm.nosql.json.api.BasicDBObject;\r
@@ -43,7 +44,7 @@ public class JobSelectorModel extends BaseModel {
                SchedulerService scheduler = jobEngine.getScheduler();\r
                ScheduledJob scheduledJob = scheduler.createScheduledJob(selectedJobElement.getDbObject());\r
                scheduledJob.setJobEngine(jobEngine);\r
-               for (int i = 0; i < 4; i++) {\r
+               for (int i = 0; i < 10; i++) {\r
 \r
                        try {\r
                                if (!scheduledJob.isActive())\r
@@ -51,8 +52,7 @@ public class JobSelectorModel extends BaseModel {
                                scheduler.executeImmediate(scheduledJob.getJobId());\r
                                Thread.sleep(100);\r
                        } catch (Exception e) {\r
-                               //Page not found /pages/MessageBox.zul\r
-                               //Messagebox.show(e.getMessage());\r
+                               Messagebox.show(e.getMessage());\r
                        }\r
                }\r
 \r
index 65268f68df208a36c01228d3720460fa675005eb..f1b6618de539d2808ec606eaf1853d36aad6879b 100644 (file)
@@ -65,9 +65,11 @@ public class SearchModel extends BaseModel {
                boolean ret = false;\r
                if (this.selectedMedia != null) {\r
                        List<MediaFile> mediaFiles = this.selectedMedia.getMediaFiles();\r
-                       for (MediaFile mf : mediaFiles) {\r
-                               if (mf.getStore().isLowres()) {\r
-                                       return true;\r
+                       if (mediaFiles != null) {\r
+                               for (MediaFile mf : mediaFiles) {\r
+                                       if (mf.getStore().isLowres()) {\r
+                                               return true;\r
+                                       }\r
                                }\r
                        }\r
                }\r
@@ -78,9 +80,11 @@ public class SearchModel extends BaseModel {
                boolean ret = false;\r
                if (this.selectedMedia != null) {\r
                        List<MediaFile> mediaFiles = this.selectedMedia.getMediaFiles();\r
-                       for (MediaFile mf : mediaFiles) {\r
-                               if (mf.getStore().isSystem()) {\r
-                                       return true;\r
+                       if (mediaFiles != null) {\r
+                               for (MediaFile mf : mediaFiles) {\r
+                                       if (mf.getStore().isSystem()) {\r
+                                               return true;\r
+                                       }\r
                                }\r
                        }\r
                }\r
@@ -91,13 +95,15 @@ public class SearchModel extends BaseModel {
                String ret = "";\r
                if (this.selectedMedia != null) {\r
                        List<MediaFile> mediaFiles = this.selectedMedia.getMediaFiles();\r
-                       for (MediaFile mf : mediaFiles) {\r
-                               Store store = mf.getStore();\r
-                               if (store.isLowres()) {\r
-                                       StoreUri sourceStoreUri = store.getSourceStoreUri(RemoteStoreProtocol.HTTP);\r
-                                       File f = new File("file://" + mf.getRelativePath().replace("\\", "/"));\r
-                                       ret = String.format("%s%s%s", "/pages/mediaplayer.jsp?mediaurl=", sourceStoreUri.toString(), f.getName()).toString();\r
-                                       break;\r
+                       if (mediaFiles != null) {\r
+                               for (MediaFile mf : mediaFiles) {\r
+                                       Store store = mf.getStore();\r
+                                       if (store.isLowres()) {\r
+                                               StoreUri sourceStoreUri = store.getSourceStoreUri(RemoteStoreProtocol.HTTP);\r
+                                               File f = new File("file://" + mf.getRelativePath().replace("\\", "/"));\r
+                                               ret = String.format("%s%s%s", "/pages/mediaplayer.jsp?mediaurl=", sourceStoreUri.toString(), f.getName()).toString();\r
+                                               break;\r
+                                       }\r
                                }\r
                        }\r
                }\r
index 0f68911a24281da2fe86e4a5d66fa08a32724ce7..9bd723c9284619baf566e404c17d2b3cbe81491d 100644 (file)
@@ -206,7 +206,7 @@ public class OctopusRESTService {
        @Path("/storyFoldersByParentStoryID/{id}")
        @Consumes({ MediaType.APPLICATION_JSON })
        @Produces({ MediaType.APPLICATION_JSON })
-       public Response getStoryFoldersByStoryID(@PathParam(ID) String id) {
+       public Response getStoryFoldersByParentStoryID(@PathParam(ID) String id) {
                logger.trace("Entry");
                Response result = null;
                try {
index 34d7a62812b86e8324f563aa4e093609b7fc8b9e..90219ea8660a5e7e25d089ba49bb7dcdd897fd34 100644 (file)
@@ -36,9 +36,34 @@ import user.tsm.client.api.internal.TSMAPIConstants;
 public class TSMClient {\r
        private static boolean multiThread = false;\r
        private static DsmApiVersionEx apiVersionEx = null;\r
+\r
+       public static void CleanUpMultithread() throws TSMException {\r
+               if (multiThread == true) {\r
+                       if (!TSMAPI.isAvailable())\r
+                               return;\r
+                       short rc = TSMAPI.dsmCleanUp(TSMAPIConstants.DSM_MULTITHREAD);\r
+                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
+                               throw new TSMException(0, rc);\r
+                       multiThread = false;\r
+               }\r
+       }\r
+\r
+       public static void SetUpMultithread() throws TSMException {\r
+               if (multiThread == false) {\r
+                       if (!TSMAPI.isAvailable())\r
+                               return;\r
+                       short rc = TSMAPI.dsmSetUp(TSMAPIConstants.DSM_MULTITHREAD);\r
+                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
+                               throw new TSMException(0, rc);\r
+                       multiThread = true;\r
+               }\r
+       }\r
+\r
        protected int dsmHandle = 0;\r
        private String applicationType = null;\r
+\r
        private boolean connected = false;\r
+\r
        protected int bufferSize = 0;\r
 \r
        public TSMClient(String applicationType) throws Exception {\r
@@ -96,94 +121,19 @@ public class TSMClient {
                }\r
        }\r
 \r
-       public void disconnect() {\r
-               short rc = TSMAPI.dsmTerminate(dsmHandle);\r
-               if (rc == 0)\r
-                       connected = false;\r
-       }\r
-\r
-       public int getDsmHandle(){\r
-               return dsmHandle;\r
-       }\r
-       \r
-       \r
-       public void registerFilespace(String name, String type, char driveLetter, String info, long capacity, long occupancy) throws TSMException {\r
-               RegFSData regFSData = new RegFSData();\r
-               regFSData.setFsName(name);\r
-               regFSData.setFsType(type);\r
-\r
-               if (System.getProperty("os.name").toUpperCase().contains("WIN")) {\r
-                       DsmDosFSAttr fsAttr = new DsmDosFSAttr();\r
-                       fsAttr.setDriveLetter((byte) driveLetter);\r
-                       fsAttr.setFsInfo(info);\r
-                       fsAttr.setFsInfoLength((short) info.length());\r
-                       regFSData.setFsAttr(fsAttr);\r
-               } else {\r
-                       DsmUnixFSAttr fsAttr = new DsmUnixFSAttr();\r
-                       fsAttr.setFsInfo(info);\r
-                       fsAttr.setFsInfoLength((short) info.length());\r
-                       regFSData.setFsAttr(fsAttr);\r
-               }\r
-               regFSData.setOccupancy(occupancy);\r
-               regFSData.setCapacity(capacity);\r
-               short rc;\r
-               try {\r
-                       rc = TSMAPI.dsmRegisterFS(dsmHandle, regFSData);\r
-               } catch (JNIException e) {\r
-                       throw new TSMException("Internal error: " + e.getMessage());\r
-               }\r
-               if (rc != TSMAPIConstants.DSM_RC_OK) {\r
-                       throw new TSMException(dsmHandle, rc);\r
-               }\r
-       }\r
-\r
-       public void send(TSMObject object) throws NullPointerException, FileNotFoundException, IOException, TSMException {\r
-               String filePath = object.getLocalFilePath();\r
-               if (filePath == null) {\r
-                       throw new NullPointerException("localFilePath can not be null.");\r
-               }\r
-               File f = new File(filePath);\r
-               if (!f.exists())\r
-                       throw new FileNotFoundException(filePath + " has not found.");\r
-               long sizeEstimate = f.length();\r
-               short rc;\r
-               FileInputStream fis = null;\r
+       public void delete(TSMObject object) throws TSMException {\r
                try {\r
-                       rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
+                       short rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
                        if (rc != TSMAPIConstants.DSM_RC_OK)\r
                                throw new TSMException(dsmHandle, rc);\r
+                       DsmBackupDelInfo dsmBackupDelInfo = new DsmBackupDelInfo();\r
                        DsmObjName objName = new DsmObjName();\r
                        objName.setFs(object.getFileSpaceName());\r
                        objName.setHl(object.getHighLevelName());\r
                        objName.setLl(object.getLowLevelName());\r
-                       objName.setObjType(TSMAPIConstants.DSM_OBJ_FILE);\r
-                       McBindKey mcBindKey = new McBindKey();\r
-                       rc = TSMAPI.dsmBindMC(dsmHandle, objName, object.getTypeDefinitionForBindMCAndSendObj(), mcBindKey);\r
-                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
-                               throw new TSMException(dsmHandle, rc);\r
-                       ObjAttr objAttr = new ObjAttr();\r
-                       objAttr.setSizeEstimate(sizeEstimate);\r
-                       objAttr.setOwner(null);\r
-                       objAttr.setObjCompressed(false);\r
-                       objAttr.setObjInfoLength((short) 0);\r
-                       objAttr.setObjInfo(null);\r
-                       objAttr.setMcNameP(object.getManagementClassName());\r
-                       rc = TSMAPI.dsmSendObj(dsmHandle, object.getTypeDefinitionForBindMCAndSendObj(), object.getSendObjBuffer(), objName, objAttr, null);\r
-                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
-                               throw new TSMException(dsmHandle, rc);\r
-                       byte buffer[] = new byte[bufferSize];\r
-                       fis = new FileInputStream(filePath);\r
-                       DataBlk dataBlk = new DataBlk();\r
-                       dataBlk.setBufferPtr(buffer);\r
-                       int length = 0;\r
-                       while ((length = fis.read(buffer)) > 0) {\r
-                               dataBlk.setBufferLen(length);\r
-                               rc = TSMAPI.dsmSendData(dsmHandle, dataBlk);\r
-                               if (rc != TSMAPIConstants.DSM_RC_OK)\r
-                                       throw new TSMException(dsmHandle, rc);\r
-                               object.bytesWorked(length);\r
-                       }\r
-                       rc = TSMAPI.dsmEndSendObj(dsmHandle);\r
+                       dsmBackupDelInfo.setObjName(objName);\r
+                       dsmBackupDelInfo.setCopyGroup(object.getCopyGroup());\r
+                       rc = TSMAPI.dsmDeleteBackupObj(dsmHandle, dsmBackupDelInfo);\r
                        if (rc != TSMAPIConstants.DSM_RC_OK)\r
                                throw new TSMException(dsmHandle, rc);\r
                        DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
@@ -195,6 +145,8 @@ public class TSMClient {
                                throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
                        }\r
                } catch (JNIException e1) {\r
+                       throw new TSMException("Internal error: " + e1.getMessage());\r
+               } catch (TSMException e2) {\r
                        DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
                        endTxnExIn.setDsmHandle(dsmHandle);\r
                        endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
@@ -204,19 +156,43 @@ public class TSMClient {
                        } catch (Exception e) {\r
                        }\r
                        ;\r
-                       throw new TSMException("Internal error: " + e1.getMessage());\r
-               } catch (TSMException e2) {\r
+                       throw e2;\r
+               }\r
+       }\r
+\r
+       //Robi 2014.12.03 AVON migrator miatt.\r
+       public void deleteArchive(TSMObject object) throws TSMException {\r
+               try {\r
+                       short rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
+                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
+                               throw new TSMException(dsmHandle, rc);\r
+\r
+                       DsmArchiveDelInfo dsmArchiveDelInfo = new DsmArchiveDelInfo();\r
+\r
+                       DsmObjName objName = new DsmObjName();\r
+                       objName.setFs(object.getFileSpaceName());\r
+                       objName.setHl(object.getHighLevelName());\r
+                       objName.setLl(object.getLowLevelName());\r
+\r
+                       dsmArchiveDelInfo.setObjName(objName);\r
+                       dsmArchiveDelInfo.setCopyGroup(object.getCopyGroup());\r
+                       dsmArchiveDelInfo.setObjId(object.getObjId());\r
+\r
+                       rc = TSMAPI.dsmDeleteArchiveObj(dsmHandle, dsmArchiveDelInfo);\r
+\r
+                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
+                               throw new TSMException(dsmHandle, rc);\r
                        DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
                        endTxnExIn.setDsmHandle(dsmHandle);\r
-                       endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
+                       endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_COMMIT);\r
                        DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
-                       try {\r
-                               TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
-                       } catch (Exception e) {\r
+                       rc = TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
+                       if (rc != TSMAPIConstants.DSM_RC_OK) {\r
+                               throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
                        }\r
-                       ;\r
-                       throw e2;\r
-               } catch (IOException e3) {\r
+               } catch (JNIException e1) {\r
+                       throw new TSMException("Internal error: " + e1.getMessage());\r
+               } catch (TSMException e2) {\r
                        DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
                        endTxnExIn.setDsmHandle(dsmHandle);\r
                        endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
@@ -226,13 +202,41 @@ public class TSMClient {
                        } catch (Exception e) {\r
                        }\r
                        ;\r
-                       throw e3;\r
-               } finally {\r
-                       if (fis != null)\r
-                               fis.close();\r
+                       throw e2;\r
                }\r
        }\r
 \r
+       public void disconnect() {\r
+               short rc = TSMAPI.dsmTerminate(dsmHandle);\r
+               if (rc == 0)\r
+                       connected = false;\r
+       }\r
+\r
+       public TSMBackupFileObject getActiveBackupFileObject(String filespaceName, String highLevelName, String lowLevelName) throws TSMException {\r
+               String fsQuery = filespaceName;\r
+               String hlQuery = highLevelName;\r
+               String llQuery = lowLevelName;\r
+               TSMBackupFileObject[] result = queryActiveBackupObjects(fsQuery, hlQuery, llQuery);\r
+               return (result.length == 0) ? null : result[0];\r
+       }\r
+\r
+       public TSMArchiveFileObject getArchiveObjects(String filespaceName, String highLevelName, String lowLevelName) throws TSMException {\r
+               TSMArchiveFileObject[] result = queryArchiveObjects(filespaceName, highLevelName, lowLevelName);\r
+               return (result.length == 0) ? null : result[0];\r
+       }\r
+\r
+       public int getBufferSize() {\r
+               return bufferSize;\r
+       }\r
+\r
+       public int getDsmHandle() {\r
+               return dsmHandle;\r
+       }\r
+\r
+       public boolean isConnected() {\r
+               return connected;\r
+       }\r
+\r
        private TSMBackupFileObject[] queryActiveBackupObjects(String fsQuery, String hlQuery, String llQuery) throws TSMException {\r
                TSMBackupFileObject result[] = null;\r
                Vector<TSMBackupFileObject> objects = new Vector<TSMBackupFileObject>();\r
@@ -285,11 +289,6 @@ public class TSMClient {
                return result;\r
        }\r
 \r
-       public TSMArchiveFileObject getArchiveObjects(String filespaceName, String highLevelName, String lowLevelName) throws TSMException {\r
-               TSMArchiveFileObject[] result = queryArchiveObjects(filespaceName, highLevelName, lowLevelName);\r
-               return (result.length == 0) ? null : result[0];\r
-       }\r
-\r
        private TSMArchiveFileObject[] queryArchiveObjects(String fsQuery, String hlQuery, String llQuery) throws TSMException {\r
                TSMArchiveFileObject result[] = null;\r
                Vector<TSMArchiveFileObject> objects = new Vector<TSMArchiveFileObject>();\r
@@ -438,27 +437,83 @@ public class TSMClient {
                }\r
        }\r
 \r
-       public TSMBackupFileObject getActiveBackupFileObject(String filespaceName, String highLevelName, String lowLevelName) throws TSMException {\r
-               String fsQuery = filespaceName;\r
-               String hlQuery = highLevelName;\r
-               String llQuery = lowLevelName;\r
-               TSMBackupFileObject[] result = queryActiveBackupObjects(fsQuery, hlQuery, llQuery);\r
-               return (result.length == 0) ? null : result[0];\r
+       public void registerFilespace(String name, String type, char driveLetter, String info, long capacity, long occupancy) throws TSMException {\r
+               RegFSData regFSData = new RegFSData();\r
+               regFSData.setFsName(name);\r
+               regFSData.setFsType(type);\r
+\r
+               if (System.getProperty("os.name").toUpperCase().contains("WIN")) {\r
+                       DsmDosFSAttr fsAttr = new DsmDosFSAttr();\r
+                       fsAttr.setDriveLetter((byte) driveLetter);\r
+                       fsAttr.setFsInfo(info);\r
+                       fsAttr.setFsInfoLength((short) info.length());\r
+                       regFSData.setFsAttr(fsAttr);\r
+               } else {\r
+                       DsmUnixFSAttr fsAttr = new DsmUnixFSAttr();\r
+                       fsAttr.setFsInfo(info);\r
+                       fsAttr.setFsInfoLength((short) info.length());\r
+                       regFSData.setFsAttr(fsAttr);\r
+               }\r
+               regFSData.setOccupancy(occupancy);\r
+               regFSData.setCapacity(capacity);\r
+               short rc;\r
+               try {\r
+                       rc = TSMAPI.dsmRegisterFS(dsmHandle, regFSData);\r
+               } catch (JNIException e) {\r
+                       throw new TSMException("Internal error: " + e.getMessage());\r
+               }\r
+               if (rc != TSMAPIConstants.DSM_RC_OK) {\r
+                       throw new TSMException(dsmHandle, rc);\r
+               }\r
        }\r
 \r
-       public void delete(TSMObject object) throws TSMException {\r
+       public void send(TSMObject object) throws NullPointerException, FileNotFoundException, IOException, TSMException {\r
+               String filePath = object.getLocalFilePath();\r
+               if (filePath == null) {\r
+                       throw new NullPointerException("localFilePath can not be null.");\r
+               }\r
+               File f = new File(filePath);\r
+               if (!f.exists())\r
+                       throw new FileNotFoundException(filePath + " has not found.");\r
+               long sizeEstimate = f.length();\r
+               short rc;\r
+               FileInputStream fis = null;\r
                try {\r
-                       short rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
+                       rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
                        if (rc != TSMAPIConstants.DSM_RC_OK)\r
                                throw new TSMException(dsmHandle, rc);\r
-                       DsmBackupDelInfo dsmBackupDelInfo = new DsmBackupDelInfo();\r
                        DsmObjName objName = new DsmObjName();\r
                        objName.setFs(object.getFileSpaceName());\r
                        objName.setHl(object.getHighLevelName());\r
                        objName.setLl(object.getLowLevelName());\r
-                       dsmBackupDelInfo.setObjName(objName);\r
-                       dsmBackupDelInfo.setCopyGroup(object.getCopyGroup());\r
-                       rc = TSMAPI.dsmDeleteBackupObj(dsmHandle, dsmBackupDelInfo);\r
+                       objName.setObjType(TSMAPIConstants.DSM_OBJ_FILE);\r
+                       McBindKey mcBindKey = new McBindKey();\r
+                       rc = TSMAPI.dsmBindMC(dsmHandle, objName, object.getTypeDefinitionForBindMCAndSendObj(), mcBindKey);\r
+                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
+                               throw new TSMException(dsmHandle, rc);\r
+                       ObjAttr objAttr = new ObjAttr();\r
+                       objAttr.setSizeEstimate(sizeEstimate);\r
+                       objAttr.setOwner(null);\r
+                       objAttr.setObjCompressed(false);\r
+                       objAttr.setObjInfoLength((short) 0);\r
+                       objAttr.setObjInfo(null);\r
+                       objAttr.setMcNameP(object.getManagementClassName());\r
+                       rc = TSMAPI.dsmSendObj(dsmHandle, object.getTypeDefinitionForBindMCAndSendObj(), object.getSendObjBuffer(), objName, objAttr, null);\r
+                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
+                               throw new TSMException(dsmHandle, rc);\r
+                       byte buffer[] = new byte[bufferSize];\r
+                       fis = new FileInputStream(filePath);\r
+                       DataBlk dataBlk = new DataBlk();\r
+                       dataBlk.setBufferPtr(buffer);\r
+                       int length = 0;\r
+                       while ((length = fis.read(buffer)) > 0) {\r
+                               dataBlk.setBufferLen(length);\r
+                               rc = TSMAPI.dsmSendData(dsmHandle, dataBlk);\r
+                               if (rc != TSMAPIConstants.DSM_RC_OK)\r
+                                       throw new TSMException(dsmHandle, rc);\r
+                               object.bytesWorked(length);\r
+                       }\r
+                       rc = TSMAPI.dsmEndSendObj(dsmHandle);\r
                        if (rc != TSMAPIConstants.DSM_RC_OK)\r
                                throw new TSMException(dsmHandle, rc);\r
                        DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
@@ -470,8 +525,6 @@ public class TSMClient {
                                throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
                        }\r
                } catch (JNIException e1) {\r
-                       throw new TSMException("Internal error: " + e1.getMessage());\r
-               } catch (TSMException e2) {\r
                        DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
                        endTxnExIn.setDsmHandle(dsmHandle);\r
                        endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
@@ -481,80 +534,36 @@ public class TSMClient {
                        } catch (Exception e) {\r
                        }\r
                        ;\r
-                       throw e2;\r
-               }\r
-       }\r
-\r
-       //Robi 2014.12.03 AVON migrator miatt.\r
-       public void deleteArchive(TSMObject object) throws TSMException {\r
-               try {\r
-                       short rc = TSMAPI.dsmBeginTxn(dsmHandle);\r
-                       if( rc != TSMAPIConstants.DSM_RC_OK )\r
-                               throw new TSMException(dsmHandle, rc);\r
-                       \r
-                       DsmArchiveDelInfo dsmArchiveDelInfo = new DsmArchiveDelInfo();\r
-                       \r
-                       DsmObjName objName = new DsmObjName();\r
-                       objName.setFs(object.getFileSpaceName());\r
-                       objName.setHl(object.getHighLevelName());\r
-                       objName.setLl(object.getLowLevelName());\r
-                       \r
-                       dsmArchiveDelInfo.setObjName(objName);\r
-                       dsmArchiveDelInfo.setCopyGroup(object.getCopyGroup());\r
-                       dsmArchiveDelInfo.setObjId(object.getObjId());\r
-                       \r
-                       rc = TSMAPI.dsmDeleteArchiveObj(dsmHandle, dsmArchiveDelInfo);\r
-                       \r
-                       if( rc != TSMAPIConstants.DSM_RC_OK )\r
-                               throw new TSMException(dsmHandle, rc);\r
+                       throw new TSMException("Internal error: " + e1.getMessage());\r
+               } catch (TSMException e2) {\r
                        DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
                        endTxnExIn.setDsmHandle(dsmHandle);\r
-                       endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_COMMIT);\r
+                       endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
                        DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
-                       rc = TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
-                       if( rc != TSMAPIConstants.DSM_RC_OK ) {\r
-                               throw new TSMException(dsmHandle, rc, endTxnExOut.getReason());\r
+                       try {\r
+                               TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
+                       } catch (Exception e) {\r
                        }\r
-               } catch(JNIException e1) {\r
-                       throw new TSMException("Internal error: " + e1.getMessage());\r
-               } catch(TSMException e2) {\r
+                       ;\r
+                       throw e2;\r
+               } catch (IOException e3) {\r
                        DsmEndTxnExIn endTxnExIn = new DsmEndTxnExIn();\r
                        endTxnExIn.setDsmHandle(dsmHandle);\r
                        endTxnExIn.setVote(TSMAPIConstants.DSM_VOTE_ABORT);\r
                        DsmEndTxnExOut endTxnExOut = new DsmEndTxnExOut();\r
-                       try { TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut); } catch(Exception e) {};\r
-                       throw e2;\r
+                       try {\r
+                               TSMAPI.dsmEndTxnEx(endTxnExIn, endTxnExOut);\r
+                       } catch (Exception e) {\r
+                       }\r
+                       ;\r
+                       throw e3;\r
+               } finally {\r
+                       if (fis != null)\r
+                               fis.close();\r
                }\r
        }\r
-       \r
-       \r
-       public boolean isConnected() {\r
-               return connected;\r
-       }\r
 \r
        public void setBufferSize(int bufferSize) {\r
                this.bufferSize = bufferSize;\r
        }\r
-\r
-       public int getBufferSize() {\r
-               return bufferSize;\r
-       }\r
-\r
-       public static void SetUpMultithread() throws TSMException {\r
-               if (multiThread == false) {\r
-                       short rc = TSMAPI.dsmSetUp(TSMAPIConstants.DSM_MULTITHREAD);\r
-                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
-                               throw new TSMException(0, rc);\r
-                       multiThread = true;\r
-               }\r
-       }\r
-\r
-       public static void CleanUpMultithread() throws TSMException {\r
-               if (multiThread == true) {\r
-                       short rc = TSMAPI.dsmCleanUp(TSMAPIConstants.DSM_MULTITHREAD);\r
-                       if (rc != TSMAPIConstants.DSM_RC_OK)\r
-                               throw new TSMException(0, rc);\r
-                       multiThread = false;\r
-               }\r
-       }\r
 }\r
index fc12f01d10a4246c0814006d281486e262cf6003..64c3f792b860660179da61d4ea7bcdd28bbe1c06 100644 (file)
@@ -2,33 +2,68 @@ package user.tsm.client.api.internal;
 \r
 public class TSMAPI {\r
 \r
+       private static boolean isAvailable;\r
        static {\r
-               System.loadLibrary("tsmapi-1.1");\r
+               try {\r
+                       System.loadLibrary("tsmapi-1.1");\r
+                       isAvailable = true;\r
+               } catch (UnsatisfiedLinkError e) {\r
+               }\r
        }\r
 \r
-       public static native void dsmQueryApiVersionEx(DsmApiVersionEx apiVersionExP) throws JNIException;\r
-       public static native short dsmSetUp(boolean mtFlag);\r
-       public static native short dsmCleanUp(boolean mtFlag);\r
-       public static native short dsmInitEx(DsmHandle dsmHandleP, DsmInitExIn dsmInitExInP, DsmInitExOut dsmInitExOutP) throws JNIException;\r
-       public static native short dsmTerminate(int dsmHandle);\r
-       public static native short dsmRegisterFS(int dsmHandle, RegFSData regFilespaceP) throws JNIException;\r
+       public static native short dsmBeginArchiveQuery(int dsmHandle, QryArchiveData qryArchiveData) throws JNIException;\r
+\r
+       public static native short dsmBeginBackupQuery(int dsmHandle, QryBackupData qryBackupData) throws JNIException;\r
+\r
+       public static native short dsmBeginGetData(int dsmHandle, boolean mountWait, short getType, DsmGetList dsmGetObjListP, PartialObjData partialObjDataP)\r
+                       throws JNIException;\r
+\r
        public static native short dsmBeginTxn(int dsmHandle);\r
-       public static native short dsmEndTxnEx(DsmEndTxnExIn endTxnExInP, DsmEndTxnExOut endTxnExOutP) throws JNIException;\r
+\r
        public static native short dsmBindMC(int dsmHandle, DsmObjName objNameP, short sendType, McBindKey mcBindKeyP) throws JNIException;\r
-       public static native short dsmSendObj(int dsmHandle, short sendType, Object sendBuff, DsmObjName objNameP, ObjAttr objAttrPtr, DataBlk dataBlkPtr) throws JNIException;\r
-       public static native short dsmSendData(int dsmHandle, DataBlk dataBlkPtr) throws JNIException;\r
+\r
+       public static native short dsmCleanUp(boolean mtFlag);\r
+\r
+       public static native short dsmDeleteArchiveObj(int dsmHandle, DsmArchiveDelInfo dsmArchiveDelInfo) throws JNIException;\r
+\r
+       public static native short dsmDeleteBackupObj(int dsmHandle, DsmBackupDelInfo dsmBackupDelInfo) throws JNIException;\r
+\r
+       public static native short dsmEndGetData(int dsmHandle);\r
+\r
+       public static native short dsmEndGetObj(int dsmHandle);\r
+\r
+       public static native short dsmEndQuery(int dsmHandle);\r
+\r
        public static native short dsmEndSendObj(int dsmHandle);\r
-       public static native short dsmBeginBackupQuery(int dsmHandle, QryBackupData qryBackupData) throws JNIException;\r
-       public static native short dsmGetNextBackupQObj(int dsmHandle, QryRespBackupData backupQueryResponse) throws JNIException;\r
-       public static native short dsmBeginArchiveQuery(int dsmHandle, QryArchiveData qryArchiveData) throws JNIException;\r
+\r
+       public static native short dsmEndTxnEx(DsmEndTxnExIn endTxnExInP, DsmEndTxnExOut endTxnExOutP) throws JNIException;\r
+\r
+       public static native short dsmGetData(int dsmHandle, DataBlk dataBlkPtr) throws JNIException;\r
+\r
        public static native short dsmGetNextArchiveQObj(int dsmHandle, QryRespArchiveData qryRespArchiveData) throws JNIException;\r
-       public static native short dsmEndQuery(int dsmHandle);\r
-       public static native short dsmBeginGetData(int dsmHandle, boolean mountWait, short getType, DsmGetList dsmGetObjListP, PartialObjData partialObjDataP) throws JNIException;\r
+\r
+       public static native short dsmGetNextBackupQObj(int dsmHandle, QryRespBackupData backupQueryResponse) throws JNIException;\r
+\r
        public static native short dsmGetObj(int dsmHandle, long objId, DataBlk dataBlkPtr) throws JNIException;\r
-       public static native short dsmGetData(int dsmHandle, DataBlk dataBlkPtr) throws JNIException;\r
-       public static native short dsmEndGetObj(int dsmHandle);\r
-       public static native short dsmEndGetData(int dsmHandle);\r
-       public static native short dsmDeleteBackupObj(int dsmHandle, DsmBackupDelInfo dsmBackupDelInfo) throws JNIException;\r
-       public static native short dsmDeleteArchiveObj(int dsmHandle, DsmArchiveDelInfo dsmArchiveDelInfo) throws JNIException;\r
+\r
+       public static native short dsmInitEx(DsmHandle dsmHandleP, DsmInitExIn dsmInitExInP, DsmInitExOut dsmInitExOutP) throws JNIException;\r
+\r
+       public static native void dsmQueryApiVersionEx(DsmApiVersionEx apiVersionExP) throws JNIException;\r
+\r
        public static native String dsmRCMsg(int dsmHandle, short dsmRC);\r
+\r
+       public static native short dsmRegisterFS(int dsmHandle, RegFSData regFilespaceP) throws JNIException;\r
+\r
+       public static native short dsmSendData(int dsmHandle, DataBlk dataBlkPtr) throws JNIException;\r
+\r
+       public static native short dsmSendObj(int dsmHandle, short sendType, Object sendBuff, DsmObjName objNameP, ObjAttr objAttrPtr, DataBlk dataBlkPtr)\r
+                       throws JNIException;\r
+\r
+       public static native short dsmSetUp(boolean mtFlag);\r
+\r
+       public static native short dsmTerminate(int dsmHandle);\r
+\r
+       public static boolean isAvailable() {\r
+               return isAvailable;\r
+       }\r
 }\r