git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Tue, 24 Apr 2018 09:17:58 +0000 (09:17 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Tue, 24 Apr 2018 09:17:58 +0000 (09:17 +0000)
46 files changed:
client/Maestro/Configuration/-configuration-studio.json
client/Maestro/Configuration/configuration-grafika.json
client/Maestro/MaestroForm.Designer.cs
client/Maestro/MaestroForm.Source.cs
client/Maestro/MaestroForm.cs
client/Maestro/MaestroForm.resx
client/Maestro/Properties/AssemblyInfo.cs
client/MaestroShared/Controls/CheckableTreeView.cs
client/MaestroShared/Controls/DoubleClickTreeView.cs [new file with mode: 0644]
client/MaestroShared/MaestroShared.csproj
client/MaestroShared/Properties/AssemblyInfo.cs
client/MaestroShared/Targets/TargetProcessor.cs
client/MaestroShared/Targets/UNCTargetProcessor.cs
server/-configuration/run-mediacube-server-bsh.launch
server/-configuration/scheduledjobs.json
server/-dependencies/jobengine.target
server/-dependencies/libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar [new file with mode: 0644]
server/-dependencies/libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar [new file with mode: 0644]
server/-dependencies/libs/humble-video-noarch-0.2.1.jar [new file with mode: 0644]
server/-dependencies/pom.xml
server/-product/mediacube.product
server/user.jobengine.executors/config/config.xml
server/user.jobengine.executors/jobtemplates/recreate-lowres.xml [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/BatchRetrieveForkStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIOMaterialsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/MediaToolStep.java [new file with mode: 0644]
server/user.jobengine.executors/src/user/jobengine/server/steps/OutputPathAndNameSelectorStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TSMBackupStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/TranscodeSELENIOStep.java
server/user.jobengine.osgi.commons/META-INF/MANIFEST.MF
server/user.jobengine.osgi.commons/src/user/commons/mediatool/MediaInfo.java [new file with mode: 0644]
server/user.jobengine.osgi.db/sql/ft-join.sql [new file with mode: 0644]
server/user.jobengine.osgi.db/src/user/jobengine/db/IItemManager.java
server/user.jobengine.osgi.db/src/user/jobengine/db/IResultSetConsumer.java [moved from server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IResultSetConsumer.java with 50% similarity]
server/user.jobengine.osgi.db/src/user/jobengine/db/IStatementDecorator.java [moved from server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IStatementDecorator.java with 79% similarity]
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemDAOEx.java
server/user.jobengine.osgi.db/src/user/jobengine/db/ItemManager.java
server/user.jobengine.osgi.server/OSGI-INF/component.xml
server/user.jobengine.osgi.server/pages/searchitems.zul
server/user.jobengine.osgi.server/src/user/jobengine/server/JobEngine.java
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/ArchiveItem.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/CachedListModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/SearchModel.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/model/TypeFilter.java [new file with mode: 0644]
server/user.jobengine.osgi.server/test/user/jobengine/server/IT/Support.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/ws/nexio/NexioWSServlet.java

index 7666e57919492281af3e21fe37176695a950e39e..3c3581448495dde279fd6107039d341edf4b2d53 100644 (file)
@@ -28,7 +28,7 @@
     {\r
       "$type": "TrafficMetadata",\r
       "server": {\r
-        "address": "Data Source=10.10.1.45\\sql16;Initial Catalog=PA_Echo;Persist Security Info=True;",\r
+        "address": "Data Source=10.10.1.45;Initial Catalog=PA_Echo;Persist Security Info=True;",\r
         "userName": "MAM",\r
         "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
         "timeout": 1000\r
   ],\r
   "targets": [\r
     {\r
-      "label": "Adásellenőrzés",\r
+      "label": "Octopus",\r
       "processor": "FXPTargetProcessor",\r
       "outputFormat": "%ID%",\r
       "tag": "Adáskész",\r
+      "subFolderFormat": "%IDROOT%-%TEXT%",\r
+      "killDateDays": 15,\r
+      "saveArchiveMetadata": false,\r
       "remote": {\r
-        "address": "ftp://10.10.1.100:21/PLAYOUT_CHECK",\r
+        "address": "ftp://10.10.1.100:21/OCTOPUS",\r
         "userName": "mediacube",\r
         "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
         "timeout": 1000\r
index b09b6dd4ef3f18c47778da33f9572347911e8491..59127046fdd3912d92247a49eb23e60e48d4d175 100644 (file)
       "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%",\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
+        "address": "Data Source=10.10.1.45;Initial Catalog=PA_Echo;Persist Security Info=True;",\r
         "userName": "MAM",\r
         "password": "7RKZYBzumKjL40SJwuwiFCvX57xuCN8zay6OttUm2wbrgImyYZBHyZTUUYrXX31Ge2Uwew07HYsqh2uzdJeDBDwcVntxaHg3nIpv9Dyq/odVoiC4tUF/K+lgvKWANcrZ",\r
         "timeout": 1000\r
index 9229c050d00cd6f1a9972c7ae88fe3140dde99fc..62e3f21b09c610d53b26ad2261d7537d465461b9 100644 (file)
@@ -1,5 +1,4 @@
-using Maestro.Properties;\r
-using System.Windows.Forms;\r
+using System.Windows.Forms;\r
 \r
 namespace Maestro {\r
     partial class MaestroForm {\r
@@ -41,7 +40,7 @@ namespace Maestro {
             this.groupSource = new System.Windows.Forms.GroupBox();\r
             this.dgSource = new System.Windows.Forms.DataGridView();\r
             this.bindingSource = new System.Windows.Forms.BindingSource(this.components);\r
-            this.treeFolders = new System.Windows.Forms.TreeView();\r
+            this.treeFolders = new MaestroShared.Controls.DoubleClickTreeView();\r
             this.ilFolders = new System.Windows.Forms.ImageList(this.components);\r
             this.pSourceFilter = new System.Windows.Forms.TableLayoutPanel();\r
             this.txtSourceFilter = new System.Windows.Forms.TextBox();\r
@@ -217,7 +216,7 @@ namespace Maestro {
             this.treeFolders.TabIndex = 18;\r
             this.treeFolders.Visible = false;\r
             this.treeFolders.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.OnBeforeExpandFolder);\r
-            this.treeFolders.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnAfterSelectFolder);\r
+            this.treeFolders.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.OnAfterFolderSelect);\r
             this.treeFolders.MouseDown += new System.Windows.Forms.MouseEventHandler(this.OnFolderMouseDown);\r
             // \r
             // ilFolders\r
@@ -1025,7 +1024,7 @@ namespace Maestro {
         private System.Windows.Forms.ToolStripButton btnDefineSegments;\r
         private System.Windows.Forms.ToolStrip tsSource;\r
         private System.Windows.Forms.ToolStripButton btnShowFolders;\r
-        private System.Windows.Forms.TreeView treeFolders;\r
+        private MaestroShared.Controls.DoubleClickTreeView treeFolders;\r
         private System.Windows.Forms.ImageList ilFolders;\r
         private System.Windows.Forms.CheckBox chkAutoScroll;\r
         private DataGridViewTextBoxColumn columnLabel;\r
index dfd46f4d95d661faa297675e2392c9ab60eb6d7f..2be7542fa2b0f038626df3c9349084b3a5927699 100644 (file)
@@ -76,6 +76,8 @@ namespace Maestro {
             source.Startup(localAddress);\r
             bindingSource.DataSource = source;\r
             dgSource.Columns.AddRange(source.Columns);\r
+\r
+            treeFolders.NodeDoubleClick += OnDoubleClickFolder;\r
         }\r
 \r
         private string GetLastSegment(string path) {\r
@@ -146,16 +148,16 @@ namespace Maestro {
             AddFolders(address, e.Node);\r
         }\r
 \r
-        private void OnAfterSelectFolder(object sender, TreeViewEventArgs e) {\r
-            if (e.Action != TreeViewAction.ByMouse)\r
-                return;\r
+        private void OnDoubleClickFolder(object sender, TreeNodeMouseClickEventArgs args) {\r
+            //if (e.Action != TreeViewAction.ByMouse)\r
+            //    return;\r
             txtSourceFilter.Text = null;\r
             FileSystemSource source = bindingSource.DataSource as FileSystemSource;\r
             Uri address = null;\r
-            if (e.Node.Level == 0)\r
+            if (args.Node.Level == 0)\r
                 address = Configuration.Source.Local.Address;\r
             else\r
-                address = new Uri(Uri.UnescapeDataString(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(e.Node))));\r
+                address = new Uri(Uri.UnescapeDataString(Path.Combine(Configuration.Source.Local.Address.LocalPath, GetPath(args.Node))));\r
             if (!String.IsNullOrEmpty(address.LocalPath))\r
                 formTooltip.SetToolTip(groupSource, address.LocalPath);\r
 \r
index 1f718fe5dec93e88a89b872577ba80d5ab7e1d58..a5742abbdd74d014b28f16e34689abfebe5f69fc 100644 (file)
@@ -284,5 +284,9 @@ namespace Maestro {
                 treeFolders.SelectedNode = treeFolders.GetNodeAt(e.X, e.Y);\r
         }\r
 \r
+        private void OnAfterFolderSelect(object sender, TreeViewEventArgs e) {\r
+            if (e.Node != null)\r
+                e.Node.Expand();\r
+        }\r
     }\r
 }\r
index 851c96f8405c1eb738b2bbca4031c98cd26c4577..6f3dee41c46ca341ab0c53f372360487b7eb4a01 100644 (file)
         AAEAAAD/////AQAAAAAAAAAMAgAAAFdTeXN0ZW0uV2luZG93cy5Gb3JtcywgVmVyc2lvbj00LjAuMC4w\r
         LCBDdWx0dXJlPW5ldXRyYWwsIFB1YmxpY0tleVRva2VuPWI3N2E1YzU2MTkzNGUwODkFAQAAACZTeXN0\r
         ZW0uV2luZG93cy5Gb3Jtcy5JbWFnZUxpc3RTdHJlYW1lcgEAAAAERGF0YQcCAgAAAAkDAAAADwMAAAAS\r
-        CAAAAk1TRnQBSQFMAgEBAgEAASgBAQEoAQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\r
+        CAAAAk1TRnQBSQFMAgEBAgEAATgBAQE4AQEBEAEAARABAAT/AQkBAAj/AUIBTQE2AQQGAAE2AQQCAAEo\r
         AwABQAMAARADAAEBAQABCAYAAQQYAAGAAgABgAMAAoABAAGAAwABgAEAAYABAAKAAgADwAEAAcAB3AHA\r
         AQAB8AHKAaYBAAEzBQABMwEAATMBAAEzAQACMwIAAxYBAAMcAQADIgEAAykBAANVAQADTQEAA0IBAAM5\r
         AQABgAF8Af8BAAJQAf8BAAGTAQAB1gEAAf8B7AHMAQABxgHWAe8BAAHWAucBAAGQAakBrQIAAf8BMwMA\r
index 4124d82a907045f60cf5f2f5195f5ef625c07ae1..88f47f376e7ecc70d1d7585aeaff4ac9d28a1c0f 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.7.7")]\r
-[assembly: AssemblyFileVersion("2.0.7.7")]\r
+[assembly: AssemblyVersion("2.0.7.8")]\r
+[assembly: AssemblyFileVersion("2.0.7.8")]\r
index 8b1ac6e9bbaf669240b088d909291e5ffba9103c..4e48c46c2be0e1a6c0a56c961130d14c59259a26 100644 (file)
@@ -3,10 +3,7 @@ using System.Drawing;
 using System.Windows.Forms;\r
 \r
 namespace MaestroShared.Controls {\r
-    class CheckableTreeView : TreeView {\r
-        public delegate void OnNodeDoubleClick(object sender, TreeNodeMouseClickEventArgs args);\r
-\r
-        public OnNodeDoubleClick NodeDoubleClick;\r
+    class CheckableTreeView : DoubleClickTreeView {\r
         private readonly bool[] disableCheckBoxLevels;\r
 \r
         public CheckableTreeView(bool[] disableCheckBoxLevels) {\r
@@ -35,18 +32,6 @@ namespace MaestroShared.Controls {
             TextRenderer.DrawText(e.Graphics, e.Node.Text, Font, e.Bounds, ForeColor, TextFormatFlags.Left | TextFormatFlags.Top);\r
         }\r
 \r
-        protected override void WndProc(ref Message m) {\r
-            // Suppress WM_LBUTTONDBLCLK\r
-            if (m.Msg == 0x203) {\r
-                var point = PointToClient(Cursor.Position);\r
-                TreeNode node = GetNodeAt(point);\r
-                TreeNodeMouseClickEventArgs args = new TreeNodeMouseClickEventArgs(node, MouseButtons.Left, 2, point.X, point.Y);\r
-                NodeDoubleClick?.Invoke(this, args);\r
-                m.Result = IntPtr.Zero;\r
-            } else\r
-                base.WndProc(ref m);\r
-        }\r
-\r
     }\r
 \r
 }\r
diff --git a/client/MaestroShared/Controls/DoubleClickTreeView.cs b/client/MaestroShared/Controls/DoubleClickTreeView.cs
new file mode 100644 (file)
index 0000000..34475d1
--- /dev/null
@@ -0,0 +1,24 @@
+using System;\r
+using System.Windows.Forms;\r
+\r
+namespace MaestroShared.Controls {\r
+    public class DoubleClickTreeView : TreeView {\r
+        public delegate void OnNodeDoubleClick(object sender, TreeNodeMouseClickEventArgs args);\r
+\r
+        public OnNodeDoubleClick NodeDoubleClick;\r
+\r
+        protected override void WndProc(ref Message m) {\r
+            // Suppress WM_LBUTTONDBLCLK\r
+            if (m.Msg == 0x203) {\r
+                var point = PointToClient(Cursor.Position);\r
+                TreeNode node = GetNodeAt(point);\r
+                TreeNodeMouseClickEventArgs args = new TreeNodeMouseClickEventArgs(node, MouseButtons.Left, 2, point.X, point.Y);\r
+                NodeDoubleClick?.Invoke(this, args);\r
+                m.Result = IntPtr.Zero;\r
+            } else\r
+                base.WndProc(ref m);\r
+        }\r
+\r
+    }\r
+\r
+}\r
index b0e8a9a0de0d6410df17d58102671060dd7c7146..e3f83c2b0eb64e0e2c09bd5a6a5763aaa0aa7add 100644 (file)
@@ -91,6 +91,9 @@
     <Compile Include="Configuration\KeysColorConverter.cs" />\r
     <Compile Include="Configuration\KeysPasswordConverter.cs" />\r
     <Compile Include="Configuration\KnownTypesBinder.cs" />\r
+    <Compile Include="Controls\DoubleClickTreeView.cs">\r
+      <SubType>Component</SubType>\r
+    </Compile>\r
     <Compile Include="Controls\CheckableTreeView.cs">\r
       <SubType>Component</SubType>\r
     </Compile>\r
index 14af195fa06dab00a768e7df9a7daad5e68af971..876860ff7dd4d08a1d081ba7537f3e9933bf3eb5 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("1.0.0.0")]\r
-[assembly: AssemblyFileVersion("1.0.0.0")]\r
+[assembly: AssemblyVersion("2.0.7.8")]\r
+[assembly: AssemblyFileVersion("2.0.7.8")]\r
index 074b0fae2b794280b2ad3ec251005b70b96b583e..e32f3b38d8696f4049168af2d58e87a799c8bdf0 100644 (file)
@@ -14,6 +14,7 @@ namespace MaestroShared.Targets {
         public const string READY = "Kész";\r
         public const string REVOKED = "Visszavonva";\r
         public const string SKIPPED = "Kihagyva";\r
+        protected const string FORMAT_IDROOT = "%IDROOT%";\r
         private string status;\r
         private string message;\r
         private string id;\r
@@ -29,7 +30,7 @@ namespace MaestroShared.Targets {
         private string killDatePath;\r
         protected Control parent;\r
         private List<ITargetProcessor> references;\r
-\r
+        \r
         public event PropertyChangedEventHandler PropertyChanged;\r
 \r
         public static ITargetProcessor Create(string processorName) {\r
index 11683c29c12320b53b9ec8cc580f4114aeafb7e0..547f782c6de3d0eb2d31dbcf45e62426b65585b3 100644 (file)
@@ -283,7 +283,7 @@ namespace MaestroShared.Targets {
         protected virtual string SearchDirectory(string path, string pattern) {\r
             logger.Trace(Strings.ENTRY);\r
             string result = null;\r
-            string[] dirs = Directory.GetDirectories(path, pattern);\r
+            string[] dirs = Directory.GetDirectories(path, pattern + STAR);\r
             if (dirs.Length > 0)\r
                 result = dirs[0];\r
             return result;\r
@@ -303,24 +303,16 @@ namespace MaestroShared.Targets {
             string[] formats = Parameters.TargetConfig.SubFolderFormat.Replace(BACKSLASH, SLASH).Split(SLASH[0]);\r
             for (int i = 0; i < segments.Length; i++) {\r
                 string segment = segments[i];\r
-                int p = segment.IndexOf(HYPHEN);\r
-                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
-                        pattern = segment.Substring(0, p);\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
-                        result = Slash(Path.Combine(result, segment));\r
-                    else\r
-                        result = Slash(Path.Combine(result, searchResult));\r
-                } else\r
+                if (!formats[i].StartsWith(FORMAT_IDROOT)) {\r
                     result = Slash(Path.Combine(result, segment));\r
+                    continue;\r
+                }\r
+                string pattern = GetDynamicText(FORMAT_IDROOT);\r
+                string searchResult = SearchDirectory(result, pattern);\r
+                if (searchResult == null)\r
+                    result = Slash(Path.Combine(result, segment));\r
+                else\r
+                    result = Slash(Path.Combine(result, searchResult));\r
             }\r
 \r
             logger.Trace(Strings.EXIT);\r
index 4ffdbc8f77b49bf7fce306a2443230bf384dbb59..ec4eca746e8f571724fd2e57cc23461f89fa9704 100644 (file)
@@ -21,8 +21,8 @@
 <stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
 <stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml&#13;&#10;-Dorg.eclipse.jetty.webapp.basetempdir=c:\temp\jetty&#13;&#10;-Djava.io.tmpdir=c:\temp\jetty&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=test_rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=test_storyfolders&#13;&#10;-Djobengine.octopus.stories.name=test_stories&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
-<booleanAttribute key="show_selected_only" value="true"/>\r
-<stringAttribute key="target_bundles" value="cglib@default:default,com.auth0.java-jwt@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.google.guava@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,com.sun.el.javax.el@default:default,commons-logging@default:default,javax.annotation-api@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.servlet.jsp-api@default:default,javax.validation.api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.jasper.glassfish@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jsp@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
+<booleanAttribute key="show_selected_only" value="false"/>\r
+<stringAttribute key="target_bundles" value="cglib@default:default,com.auth0.java-jwt@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.google.guava@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,com.sun.el.javax.el@default:default,commons-logging@default:default,humble.video.noarch@default:default,humble.video.windows@default:default,javax.annotation-api@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.servlet.jsp-api@default:default,javax.validation.api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.jasper.glassfish@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jsp@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
 <booleanAttribute key="tracing" value="false"/>\r
 <booleanAttribute key="useCustomFeatures" value="false"/>\r
 <booleanAttribute key="useDefaultConfigArea" value="true"/>\r
index b2954182981ee0acf31092ec8f6ba9cbb4cbda47..011df72e24affe1b54067845a9943203dee8e3aa 100644 (file)
@@ -1,13 +1,16 @@
 {"joblist":[\r
        {\r
-         "name" : "SYS: batch-retrieve-ondemand",\r
-      "template": "batch-retrieve-ondemand.xml",\r
+      "active": false,\r
+      "executeimmediate": false,\r
+         "name" : "SYS: recreate-lowres",\r
+      "template": "recreate-lowres.xml",\r
       "parameters": [ \r
-       {"name": "trafficOutputPath", "value": "/mnt/ISILON/PLAYOUT_NLE", "type": "java.lang.String"},\r
-       {"name": "octopusOutputPath", "value": "/mnt/ISILON/OCTOPUS", "type": "java.lang.String"},\r
-       {"name": "genericOutputPath", "value": "/mnt/ISILON/ARCHIVE_RESTORE", "type": "java.lang.String"},\r
-       {"name": "killDateDays", "value": 7, "type": "java.lang.Integer"}\r
+       {"name": "filePath", "value": "c:/_downloads/Silicon.Valley.S04E08.HDTV.x264.HUN-SFY/Silicon.Valley.S04E08.HDTV.x264.HUN-SFY.mkv", "type": "java.lang.String" }\r
       ]\r
+       },\r
+       {\r
+         "name" : "SYS: batch-retrieve-ondemand",\r
+      "template": "batch-retrieve-ondemand.xml"\r
        },\r
        {\r
          "name" : "SYS: retrieve-ondemand",\r
index 0340280ade322a3d8a3a44ac8fd4b0ee0c2e0090..61066195432df0f62fb3ecd060c160bc952549aa 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
-<?pde version="3.8"?><target name="JobEngine" sequenceNumber="285">\r
+<?pde version="3.8"?><target name="JobEngine" sequenceNumber="289">\r
 <locations>\r
 <location path="${eclipse_home}" type="Profile"/>\r
 <location path="${workspace_loc}/-dependencies/target/repository/plugins" type="Directory"/>\r
 <plugin id="com.fasterxml.jackson.jaxrs.jackson-jaxrs-base" version="2.4.5"/>\r
 <plugin id="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" version="2.4.5"/>\r
 <plugin id="com.fasterxml.jackson.module.jackson-module-jaxb-annotations" version="2.4.5"/>\r
-<plugin id="com.google.guava"/>\r
+<plugin id="com.google.guava" version="18.0.0"/>\r
 <plugin id="com.ibm.db2jcc4"/>\r
 <plugin id="com.ibm.nosql"/>\r
 <plugin id="com.microsoft.sqlserver.sqljdbc"/>\r
 <plugin id="com.sun.el.javax.el"/>\r
 <plugin id="com.sun.org.apache.jaxp-ri"/>\r
 <plugin id="commons-logging"/>\r
+<plugin id="humble.video.linux"/>\r
+<plugin id="humble.video.noarch"/>\r
+<plugin id="humble.video.windows"/>\r
 <plugin id="javax.activation" version="1.1.0.v201211130549"/>\r
 <plugin id="javax.annotation"/>\r
 <plugin id="javax.annotation-api"/>\r
diff --git a/server/-dependencies/libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar b/server/-dependencies/libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar
new file mode 100644 (file)
index 0000000..9baa313
Binary files /dev/null and b/server/-dependencies/libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar differ
diff --git a/server/-dependencies/libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar b/server/-dependencies/libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar
new file mode 100644 (file)
index 0000000..ccd42e5
Binary files /dev/null and b/server/-dependencies/libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar differ
diff --git a/server/-dependencies/libs/humble-video-noarch-0.2.1.jar b/server/-dependencies/libs/humble-video-noarch-0.2.1.jar
new file mode 100644 (file)
index 0000000..c8fc9bb
Binary files /dev/null and b/server/-dependencies/libs/humble-video-noarch-0.2.1.jar differ
index f80efafdd6600d56c0c5ea4cff87f9682d840156..6c4ff157e608fb75d8b0e58c8431dfbe231c05bc 100644 (file)
                                                <goals>\r
                                                        <goal>install-file</goal>\r
                                                </goals>\r
+                                               <configuration>\r
+                                                       <file>libs/humble-video-arch-x86_64-pc-linux-gnu6-0.2.1.jar</file>\r
+                                                       <groupId>humble.video</groupId>\r
+                                                       <artifactId>linux</artifactId>\r
+                                                       <version>0.2.1</version>\r
+                                                       <packaging>jar</packaging>\r
+                                               </configuration>\r
+                                       </execution>\r
+                                       <execution>\r
+                                               <id>install3</id>\r
+                                               <phase>package</phase>\r
+                                               <goals>\r
+                                                       <goal>install-file</goal>\r
+                                               </goals>\r
+                                               <configuration>\r
+                                                       <file>libs/humble-video-arch-x86_64-w64-mingw32-0.2.1.jar</file>\r
+                                                       <groupId>humble.video</groupId>\r
+                                                       <artifactId>windows</artifactId>\r
+                                                       <version>0.2.1</version>\r
+                                                       <packaging>jar</packaging>\r
+                                               </configuration>\r
+                                       </execution>\r
+                                       <execution>\r
+                                               <id>install4</id>\r
+                                               <phase>package</phase>\r
+                                               <goals>\r
+                                                       <goal>install-file</goal>\r
+                                               </goals>\r
+                                               <configuration>\r
+                                                       <file>libs/humble-video-noarch-0.2.1.jar</file>\r
+                                                       <groupId>humble.video</groupId>\r
+                                                       <artifactId>noarch</artifactId>\r
+                                                       <version>0.2.1</version>\r
+                                                       <packaging>jar</packaging>\r
+                                               </configuration>\r
+                                       </execution>\r
+                                       <execution>\r
+                                               <id>install5</id>\r
+                                               <phase>package</phase>\r
+                                               <goals>\r
+                                                       <goal>install-file</goal>\r
+                                               </goals>\r
                                                <configuration>\r
                                                        <file>libs/sqljdbc42.jar</file>\r
                                                        <groupId>com.microsoft.sqlserver</groupId>\r
                                                <id>default-cli</id>\r
                                                <configuration>\r
                                                        <artifacts>\r
+                                                               <artifact>\r
+                                                                       <id>humble.video:linux:0.2.1</id>\r
+                                                               </artifact>\r
+                                                               <artifact>\r
+                                                                       <id>humble.video:windows:0.2.1</id>\r
+                                                               </artifact>\r
+                                                               <artifact>\r
+                                                                       <id>humble.video:noarch:0.2.1</id>\r
+                                                               </artifact>\r
+\r
                                                                <artifact>\r
                                                                        <id>com.google.guava:guava:18.0</id>\r
                                                                </artifact>\r
index a039e209e4cbc7db059eef96ac82c2c1984ef41c..1494b6ac3d1aa76d3174dd4573525df9d86a315a 100644 (file)
       <plugin id="com.microsoft.sqlserver.sqljdbc"/>\r
       <plugin id="com.sun.el.javax.el"/>\r
       <plugin id="commons-logging"/>\r
+      <plugin id="humble.video.linux"/>\r
+      <plugin id="humble.video.noarch"/>\r
+      <plugin id="humble.video.windows"/>\r
       <plugin id="javax.annotation-api"/>\r
       <plugin id="javax.inject"/>\r
       <plugin id="javax.mail"/>\r
index 5e56e335797cd2c5a29f9eee08d163ad85ea256b..e2277770fe709ca506c3939a6dc8fb53f56a6663 100644 (file)
@@ -24,4 +24,6 @@
        <executor className="user.jobengine.server.steps.TSMBackupStep" maxConcurrent="2"/>\r
        <executor className="user.jobengine.server.steps.TSMRetrieveMissingMaterialStep" maxConcurrent="1"/>\r
        <executor className="user.jobengine.server.steps.UploadRecordingToNexioStep" maxConcurrent="1"/>\r
+       <executor className="user.jobengine.server.steps.MediaToolStep" maxConcurrent="1"/>\r
+       \r
 </executors>
\ No newline at end of file
diff --git a/server/user.jobengine.executors/jobtemplates/recreate-lowres.xml b/server/user.jobengine.executors/jobtemplates/recreate-lowres.xml
new file mode 100644 (file)
index 0000000..a7e33e0
--- /dev/null
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>\r
+<jobtemplate name="Visszarögzített anyagok archiválása mappából">\r
+       <declarations>\r
+               <parameters>\r
+                       <parameter name="filePath" type="java.lang.String" />\r
+               </parameters>\r
+       </declarations>\r
+       <commands>\r
+               <calljobstep type="user.jobengine.server.steps.MediaToolStep" weight="1">\r
+                       <inputs>\r
+                               <input>\r
+                                       <parameter name="filePath" />\r
+                               </input>\r
+                       </inputs>\r
+               </calljobstep>\r
+       </commands>\r
+</jobtemplate>
\ No newline at end of file
index 4bfe9011716b12f602473e0ed52923fc71cf4089..6024566fd05e367fe1397a7ddfca3008ea16fbf7 100644 (file)
@@ -21,8 +21,7 @@ public class BatchRetrieveForkStep extends JobStep {
        private MediaCubeMarker marker;\r
 \r
        @StepEntry\r
-       public Object[] execute(String trafficOutputPath, String octopusOutputPath, String genericOutputPath, List<Media> basket, String houseId, String recipient,\r
-                       int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+       public Object[] execute(List<Media> basket, String houseId, String recipient, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
                marker = (MediaCubeMarker) jobRuntime.getMarker();\r
                marker.setTo(recipient);\r
 \r
@@ -31,7 +30,7 @@ public class BatchRetrieveForkStep extends JobStep {
                setProgress(10);\r
                if (jobRuntime.forkPrepare()) {\r
                        for (Media mediaCubeMedia : basket) {\r
-                               submit(trafficOutputPath, octopusOutputPath, genericOutputPath, mediaCubeMedia, recipient, houseId, killDateDays, jobEngine, jobRuntime);\r
+                               submit(mediaCubeMedia, recipient, houseId, jobEngine, jobRuntime);\r
                        }\r
                }\r
                setProgress(50);\r
@@ -40,8 +39,7 @@ public class BatchRetrieveForkStep extends JobStep {
                return null;\r
        }\r
 \r
-       public void submit(String trafficOutputPath, String octopusOutputPath, String genericOutputPath, Media mediaCubeMedia, String recipient, String houseId,\r
-                       int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+       public void submit(Media mediaCubeMedia, String recipient, String houseId, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
                try {\r
                        ScheduledJob scheduledJob = jobEngine.getScheduledJob(CHILD_TEMPLATE);\r
                        Map<String, Object> parameters = scheduledJob.getJobParameters();\r
index 35bba94f9dda808d47d4e1ae4108eeba7f4477fd..5627362f3573ca9684f09075104fe6236f491070 100644 (file)
@@ -90,25 +90,30 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep {
                String fileName = String.format("%s-%s", origFileName, rundownArchive.getItemHouseId());\r
                String videoFileName = fileName + MXFEXT;\r
 \r
-               transferFile(origFileName + MXFEXT, videoFileName);\r
-               BasicDBObject metadata = createMetadata(rundownArchive, storyArchive, fileArchive);\r
+               //A mar letezo mozikat nem archivaljuk le ujra, csak a metaadatot\r
+               long existingMediaId = manager.getExistingRundownMedia(origFileName);\r
+               if (existingMediaId == 0)\r
+                       transferFile(origFileName + MXFEXT, videoFileName);\r
+               else\r
+                       transferChunk(origFileName);\r
+\r
+               BasicDBObject metadata = createMetadata(rundownArchive, storyArchive, fileArchive, existingMediaId);\r
                transferMetadata(videoFileName, metadata);\r
                createSourceKillDateFile(rundownArchive, origFileName);\r
        }\r
 \r
-       private BasicDBObject createMetadata(RundownArchive rundownArchive, StoryArchive storyArchive, FileArchive fileArchive) {\r
+       private BasicDBObject createMetadata(RundownArchive rundownArchive, StoryArchive storyArchive, FileArchive fileArchive, long existingMediaId) {\r
                BasicDBObject result = new BasicDBObject();\r
                result.put("itemHouseId", rundownArchive.getItemHouseId());\r
                result.put("itemTitle", rundownArchive.getItemTitle());\r
                result.put("itemDescription", rundownArchive.getItemDesc());\r
                result.put("userName", "mediacube");\r
-\r
                result.put("mediaHouseId", storyArchive.getMediaHouseId());\r
                result.put("mediaTitle", storyArchive.getMediaTitle());\r
                result.put("mediaDescription", storyArchive.getMediaDesc());\r
                result.put("mediaType", MEDIATYPE);\r
-\r
                result.put("duration", fileArchive.getDuration());\r
+               result.put("existingMediaId", existingMediaId);\r
                return result;\r
        }\r
 \r
@@ -360,6 +365,24 @@ public class CopyForArchiveNEXIOMaterialsStep extends JobStep {
 \r
        }\r
 \r
+       private void transferChunk(String fileName) throws Exception {\r
+               logger.info("Transfer chunk {}", fileName);\r
+               OutputStream outStream = null;\r
+               try {\r
+                       outStream = targetFtp.storeFileStream(fileName + MXFEXT);\r
+                       if (outStream == null) {\r
+                               throw new NullPointerException("Can not open: " + fileName + MXFEXT + " Reply:" + targetFtp.getReplyString());\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+                       if (outStream != null)\r
+                               outStream.close();\r
+                       targetUri.cleanUp();\r
+               }\r
+       }\r
+\r
        private void transferFile(String sourceFileName, String targetFileName) throws Exception {\r
                int reply = 0;\r
                logger.info("Transfer clip {}", sourceFileName);\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/MediaToolStep.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/MediaToolStep.java
new file mode 100644 (file)
index 0000000..f7c9bf6
--- /dev/null
@@ -0,0 +1,31 @@
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.apache.logging.log4j.Marker;\r
+\r
+import user.commons.mediatool.MediaInfo;\r
+import user.jobengine.server.IJobEngine;\r
+import user.jobengine.server.IJobRuntime;\r
+\r
+public class MediaToolStep extends JobStep {\r
+       private static final Logger logger = LogManager.getLogger();\r
+       private Marker marker;\r
+\r
+       @StepEntry\r
+       public Object[] execute(String filePath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
+               marker = jobRuntime.getMarker();\r
+               MediaInfo mi = new MediaInfo(Paths.get(filePath));\r
+               try {\r
+                       mi.process();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       logger.error(marker, "A '{}' média analizálása sikertelen. A  rendszer üzenete: {}", filePath, e.getMessage());\r
+                       throw e;\r
+               }\r
+               return null;\r
+       }\r
+\r
+}\r
index db95b6ae7c12f4166114a46df15bba4f93388fd6..927c66799b07fead39500c2c19cd51be6c7d73ed 100644 (file)
@@ -1,7 +1,13 @@
 package user.jobengine.server.steps;\r
 \r
 import java.io.IOException;\r
+import java.nio.file.FileVisitResult;\r
+import java.nio.file.FileVisitor;\r
+import java.nio.file.Files;\r
+import java.nio.file.Path;\r
 import java.nio.file.Paths;\r
+import java.nio.file.SimpleFileVisitor;\r
+import java.nio.file.attribute.BasicFileAttributes;\r
 \r
 import org.apache.commons.lang.StringUtils;\r
 import org.apache.logging.log4j.LogManager;\r
@@ -50,10 +56,10 @@ public class OutputPathAndNameSelectorStep extends JobStep {
                        break;\r
                case OCTOPUSPLACEHOLDER:\r
                case OCTOPUSSTORY:\r
-                       targetPath = Paths.get(octopusOutputPath, id).toString();\r
+                       targetPath = getPossiblePath(id, Paths.get(octopusOutputPath, id)).toString();\r
                        break;\r
                case TRAFFIC:\r
-                       targetPath = Paths.get(trafficOutputPath, id).toString();\r
+                       targetPath = getPossiblePath(id, Paths.get(trafficOutputPath, id)).toString();\r
                        break;\r
                }\r
                String targetNamePattern = houseId + TARGETNAMEPATTERN;\r
@@ -66,4 +72,21 @@ public class OutputPathAndNameSelectorStep extends JobStep {
                return new Object[] { targetPath, targetNamePattern };\r
        }\r
 \r
+       private String getPossiblePath(String id, Path targetPath) throws IOException {\r
+               String[] result = { targetPath.toString() };\r
+               FileVisitor<Path> matcherVisitor = new SimpleFileVisitor<Path>() {\r
+                       @Override\r
+                       public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {\r
+                               String dirName = dir.getFileName().toString();\r
+                               if (dirName.startsWith(id + "-") || dirName.equals(id)) {\r
+                                       result[0] = dir.toString();\r
+                                       return FileVisitResult.TERMINATE;\r
+                               }\r
+                               return FileVisitResult.CONTINUE;\r
+                       }\r
+               };\r
+               Files.walkFileTree(targetPath.getParent(), matcherVisitor);\r
+               return result[0];\r
+       }\r
+\r
 }\r
index 0b540ed7a9976fa956525d8a637fbe0316c653a0..20592bec295991c8f67f11ff48f21ef19e453a39 100644 (file)
@@ -4,6 +4,7 @@ import java.io.File;
 import java.io.IOException;\r
 import java.sql.Timestamp;\r
 import java.util.Date;\r
+import java.util.List;\r
 \r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
@@ -39,6 +40,7 @@ public class TSMBackupStep extends JobStep {
        @StepEntry\r
        public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia, int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
                marker = jobRuntime.getMarker();\r
+\r
                File sourceMediaFile = new File(archiveItem.getMediaFile());\r
                String sourceFileName = sourceMediaFile.getName();\r
                String details = String.format("%s (%d bytes)", sourceFileName, sourceMediaFile.length());\r
@@ -48,25 +50,28 @@ public class TSMBackupStep extends JobStep {
 \r
                        jobRuntime.setDescription(String.format("%s: %s", jobRuntime.getDescription(), details));\r
 \r
-                       StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, sourceMediaFile.getParent().toString());\r
-\r
-                       final IJobRuntime runtime = jobRuntime;\r
-                       sourceUri.addProgressListener(new IProgressEventListener() {\r
-                               @Override\r
-                               public void progressChanged(ProgressEvent evt) {\r
-                                       runtime.incrementProgress(evt.getProgress());\r
-                               }\r
-                       });\r
-                       sourceUri.addStatusListener(new IStatusEventListener() {\r
-                               @Override\r
-                               public void statusChanged(StatusEvent evt) {\r
-                                       evt.setCancel(!canContinue());\r
-                               }\r
-                       });\r
-                       RemoteFile remoteFile = sourceUri.transferFrom(targetUri, sourceFileName, sourceFileName);\r
+                       if (archiveItem.getExistingMediaId() == 0) {\r
+                               StoreUri sourceUri = manager.createStoreUri(RemoteStoreProtocol.LOCAL, sourceMediaFile.getParent().toString());\r
 \r
-                       saveMetadata(mediaCubeMedia, sourceFileName);\r
-                       logger.info(marker, "Az '{}' állomány archiválása sikeres.", sourceFileName);\r
+                               final IJobRuntime runtime = jobRuntime;\r
+                               sourceUri.addProgressListener(new IProgressEventListener() {\r
+                                       @Override\r
+                                       public void progressChanged(ProgressEvent evt) {\r
+                                               runtime.incrementProgress(evt.getProgress());\r
+                                       }\r
+                               });\r
+                               sourceUri.addStatusListener(new IStatusEventListener() {\r
+                                       @Override\r
+                                       public void statusChanged(StatusEvent evt) {\r
+                                               evt.setCancel(!canContinue());\r
+                                       }\r
+                               });\r
+                               RemoteFile remoteFile = sourceUri.transferFrom(targetUri, sourceFileName, sourceFileName);\r
+                       } else {\r
+                               logger.info(marker, "Az '{}' TSM mentése nem szükséges, mert már megtalálható az archívumban.", sourceFileName);\r
+                       }\r
+                       saveMetadata(mediaCubeMedia, sourceFileName, archiveItem);\r
+                       logger.info(marker, "Az '{}' archiválása sikeres.", sourceFileName);\r
 \r
                        if (killDateDays > 0)\r
                                EscortFiles.createUNCKillDate(sourceMediaFile.getParent(), sourceFileName, killDateDays, marker);\r
@@ -83,10 +88,23 @@ public class TSMBackupStep extends JobStep {
                return null;\r
        }\r
 \r
-       private void saveMetadata(Media mediaCubeMedia, String sourceFileName) {\r
-               MediaFile mediaFile = manager.createMediaFile(sourceFileName, fileType, tsmStore, mediaCubeMedia);\r
-               mediaFile.setHouseId(sourceFileName);\r
-               mediaFile.add();\r
+       private void saveMetadata(Media mediaCubeMedia, String sourceFileName, ArchiveItem archiveItem) {\r
+               if (archiveItem.getExistingMediaId() == 0) {\r
+                       MediaFile mediaFile = manager.createMediaFile(sourceFileName, fileType, tsmStore, mediaCubeMedia);\r
+                       mediaFile.setHouseId(sourceFileName);\r
+                       mediaFile.add();\r
+               } else {\r
+                       Media existingMedia = manager.getMedia(archiveItem.getExistingMediaId());\r
+                       List<MediaFile> mediaFiles = existingMedia.getMediaFiles();\r
+                       if (mediaFiles != null) {\r
+                               for (MediaFile mf : mediaFiles) {\r
+                                       mf.setId(0);\r
+                                       mf.setMedia(mediaCubeMedia);\r
+                                       mf.add();\r
+                                       mediaCubeMedia.appendMediaFile(mf);\r
+                               }\r
+                       }\r
+               }\r
                mediaCubeMedia.setPersister(manager);\r
                mediaCubeMedia.setArchived(new Timestamp(new Date().getTime()));\r
                mediaCubeMedia.modify();\r
index 5e90b8a9b0d2676525f57d6fb6a7dcb7dcbd9e4d..51f6bacdb41d264260e34e16a49bb3239d967ff6 100644 (file)
@@ -94,6 +94,10 @@ public class TranscodeSELENIOStep extends JobStep {
                marker = jobRuntime.getMarker();\r
                String sourceFileName = null;\r
 \r
+               //Nincs mit transzkódolni\r
+               if (archiveItem.getExistingMediaId() != 0)\r
+                       return null;\r
+\r
                try {\r
                        setAndCheck(globalSourcePath, transcoderTargetPath, webPath, jobEngine);\r
 \r
index cd541195e88a0e03cc6b1d693cc1577aac96a9b7..025f68685d5dd2139ed7dde139fea7fedc80eabf 100644 (file)
@@ -9,6 +9,7 @@ Import-Package: com.fasterxml.jackson.annotation;version="2.4.5",
  com.fasterxml.jackson.databind.util;version="2.4.5",
  com.fasterxml.jackson.datatype.joda;version="2.4.5",
  com.fasterxml.jackson.jaxrs.json;version="2.4.5",
+ io.humble.video,
  org.apache.logging.log4j;version="2.8.2",
  org.apache.logging.log4j.message;version="2.8.2",
  org.jboss.resteasy.client.jaxrs,
@@ -21,6 +22,7 @@ Service-Component: OSGI-INF/nexioAPI.xml, OSGI-INF/octopusAPI.xml
 Export-Package: user.commons,
  user.commons.ftp,
  user.commons.logging,
+ user.commons.mediatool,
  user.commons.morpheus,
  user.commons.nexio,
  user.commons.nexio.api,
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/mediatool/MediaInfo.java b/server/user.jobengine.osgi.commons/src/user/commons/mediatool/MediaInfo.java
new file mode 100644 (file)
index 0000000..ed7b3ab
--- /dev/null
@@ -0,0 +1,56 @@
+package user.commons.mediatool;\r
+\r
+import java.io.IOException;\r
+import java.nio.file.Path;\r
+\r
+import io.humble.video.Decoder;\r
+import io.humble.video.Demuxer;\r
+import io.humble.video.DemuxerStream;\r
+import io.humble.video.Global;\r
+import io.humble.video.MediaDescriptor;\r
+\r
+public class MediaInfo {\r
+\r
+       private long frames;\r
+\r
+       private Path filePath;\r
+\r
+       public MediaInfo(Path filePath) {\r
+               this.filePath = filePath;\r
+       }\r
+\r
+       public long getFrames() {\r
+               return frames;\r
+       }\r
+\r
+       public void process() throws InterruptedException, IOException {\r
+               final Demuxer demuxer = Demuxer.make();\r
+               demuxer.open(filePath.toString(), null, false, true, null, null);\r
+               int bitRate = demuxer.getBitRate() / 1000;\r
+               double start = demuxer.getStartTime() == Global.NO_PTS ? 0 : demuxer.getStartTime() / 1000000.0;\r
+\r
+               int numStreams = demuxer.getNumStreams();\r
+\r
+               frames = 0;\r
+               int videoStreamId = -1;\r
+               long streamStartTime = Global.NO_PTS;\r
+               Decoder videoDecoder = null;\r
+               for (int i = 0; i < numStreams; i++) {\r
+                       final DemuxerStream stream = demuxer.getStream(i);\r
+                       streamStartTime = stream.getStartTime();\r
+                       final Decoder decoder = stream.getDecoder();\r
+\r
+                       if (decoder != null && decoder.getCodecType() == MediaDescriptor.Type.MEDIA_VIDEO) {\r
+                               videoStreamId = i;\r
+                               videoDecoder = decoder;\r
+                               frames = stream.getDuration();\r
+                               break;\r
+                       }\r
+               }\r
+               if (videoStreamId == -1)\r
+                       throw new RuntimeException("could not find video stream in container: " + filePath);\r
+\r
+               demuxer.close();\r
+       }\r
+\r
+}\r
diff --git a/server/user.jobengine.osgi.db/sql/ft-join.sql b/server/user.jobengine.osgi.db/sql/ft-join.sql
new file mode 100644 (file)
index 0000000..a2196f2
--- /dev/null
@@ -0,0 +1,35 @@
+select i.id itemid,i.created itemcreated,i.houseid itemhouseid,i.title itemtitle,\r
+m.id mediaid,m.created mediacreated,m.archived,m.length,it.name mediatype,m.houseid mediahouseid,m.title mediatitle,\r
+mf.id mediafileid,mf.houseid mediafilehouseid \r
+from mediafile mf \r
+left outer join media m on (m.id = mf.mediaid) \r
+left outer join item i on (i.id = m.itemid) \r
+left outer join itemtype it on (it.id = m.itemtypeid) \r
+where mf.storeid = 1 and \r
+(contains(i.title, 'trend*') >= 1 or contains(m.title, 'trend*') >= 1)\r
+order by itemtitle desc, mediatype\r
+\r
+SELECT * FROM (\r
+(\r
+    SELECT DISTINCT m.id,m.title,i.title FROM ITEM i, MEDIA m\r
+    WHERE CONTAINS(i.title, 'trend*') >= 1 AND m.itemid = i.id\r
+) UNION (\r
+    SELECT DISTINCT m.id,m.title,i.title FROM ITEM i, MEDIA m\r
+    WHERE CONTAINS(m.title, 'trend*') >= 1 AND m.itemid = i.id\r
+))\r
+\r
+\r
+SELECT * FROM (\r
+(\r
+    SELECT DISTINCT i.houseid itemhouseid,i.title itemtitle,m.id mediaid,m.archived,m.length,m.itemtypeid mediaitemtypeid,m.houseid mediahouseid,m.title mediatitle,mf.houseid mediafilehouseid \r
+    FROM ITEM i, MEDIA m, MEDIAFILE mf \r
+    WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1 AND ((CONTAINS(i.title, 'trend*') >= 1) OR (CONTAINS(i.description, 'trend*') >= 1))\r
+) UNION (\r
+    SELECT DISTINCT i.houseid itemhouseid,i.title itemtitle,m.id mediaid,m.archived,m.length,m.itemtypeid mediaitemtypeid,m.houseid mediahouseid,m.title mediatitle,mf.houseid mediafilehouseid \r
+    FROM ITEM i, MEDIA m, MEDIAFILE mf \r
+    WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1 AND ((CONTAINS(m.title, 'trend*') >= 1) OR (CONTAINS(m.description, 'trend*') >= 1))\r
+) UNION (\r
+    SELECT DISTINCT i.houseid itemhouseid,i.title itemtitle,m.id mediaid,m.archived,m.length,m.itemtypeid mediaitemtypeid,m.houseid mediahouseid,m.title mediatitle,mf.houseid mediafilehouseid \r
+    FROM ITEM i, MEDIA m, MEDIAFILE mf WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1 \r
+    AND (CONTAINS(mf.houseId, 'trend*') >= 1)\r
+)) ORDER BY itemtitle desc, mediaitemtypeid
\ No newline at end of file
index f7ea9e79da1acab231af6f8507c9fe96fe4b3116..3e5c9bdc329f21cafc8b96b027741f57f2c62299 100644 (file)
@@ -98,6 +98,8 @@ public interface IItemManager extends IEntityPersister {
 \r
        void disconnect();\r
 \r
+       void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator);\r
+\r
        /**\r
         * A type paraméterből lekéri az entitás DAO objektumát, amin keresztül visszakapjuk az összes entitást.\r
         *\r
@@ -144,6 +146,8 @@ public interface IItemManager extends IEntityPersister {
         */\r
        List<ItemType> getDynamicItemTypes();\r
 \r
+       long getExistingRundownMedia(String houseid);\r
+\r
        /**\r
         * Elkéri a FileTypeDAO-tól a bemeneti paraméterként kapott névvel rendelekző FileType-ot.\r
         *\r
@@ -352,7 +356,7 @@ public interface IItemManager extends IEntityPersister {
         */\r
        IEntityBase retrieveCached(Class<? extends IEntityBase> baseClass, Object key);\r
 \r
-       SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, int fromResult, int toResult);\r
+       SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, String orderBy, boolean orderAscending, int fromResult, int toResult);\r
 \r
        /**\r
         * A bemeneti paraméterként kapott keresési feltételeknek megfelelő Anyagokat lekéri az adatbázisból és SearchResult objektumba csomagolva visszatér.\r
similarity index 50%
rename from server/user.jobengine.osgi.server/test/user/jobengine/server/IT/IResultSetConsumer.java
rename to server/user.jobengine.osgi.db/src/user/jobengine/db/IResultSetConsumer.java
index 821d76ed845a178b18c1b1a05def0234ad581b8f..3e3e716b1238698a0be0458b404743ca063d1e90 100644 (file)
@@ -1,10 +1,10 @@
-package user.jobengine.server.IT;\r
+package user.jobengine.db;\r
 \r
 import java.sql.ResultSet;\r
 import java.sql.SQLException;\r
 \r
 public interface IResultSetConsumer {\r
 \r
-       void process(ResultSet resultSet) throws SQLException;\r
+       boolean process(ResultSet resultSet) throws SQLException;\r
 \r
 }\r
index c94a4a82fa532cb873c371eee56cc73cf2cf1452..bdbd2a9bc69ed62831f814b2b3ccc9fcfa554c9d 100644 (file)
@@ -58,7 +58,45 @@ public class ItemDAOEx {
                return resultQuery.toString();\r
        }\r
 \r
-       private PreparedStatement createArchiveMediaSearchStatement(Connection connection, String criteria, List<String> typeIDs) throws SQLException {\r
+       //              sql.append("select");\r
+       //              sql.append(" ");\r
+       //              sql.append("i.id itemid,");\r
+       //              sql.append("i.created itemcreated,");\r
+       //              sql.append("i.houseid itemhouseid,");\r
+       //              sql.append("i.title itemtitle,");\r
+       //              sql.append("m.id mediaid,");\r
+       //              sql.append("m.created mediacreated,");\r
+       //              sql.append("m.archived,");\r
+       //              sql.append("m.length,");\r
+       //              sql.append("it.name mediatype,");\r
+       //              sql.append("m.houseid mediahouseid,");\r
+       //              sql.append("m.title mediatitle,");\r
+       //              sql.append("mf.id mediafileid,");\r
+       //              sql.append("mf.houseid mediafilehouseid");\r
+       //              sql.append(" ");\r
+       //              sql.append("from mediafile mf");\r
+       //              sql.append(" ");\r
+       //              sql.append("left outer join media m on (m.id = mf.mediaid)");\r
+       //              sql.append(" ");\r
+       //              sql.append("left outer join item i on (i.id = m.itemid)");\r
+       //              sql.append(" ");\r
+       //              sql.append("left outer join itemtype it on (it.id = m.itemtypeid)");\r
+       //              sql.append(" ");\r
+       //              sql.append("where mf.storeid = 1 and (");\r
+       //              sql.append("contains(i.title, ?) >= 1");\r
+       //              sql.append(" ");\r
+       //              sql.append("or contains(i.description, ?) >= 1");\r
+       //              sql.append(" ");\r
+       //              sql.append("or contains(m.title, ?) >= 1");\r
+       //              sql.append(" ");\r
+       //              sql.append("or contains(m.description, ?) >= 1");\r
+       //              sql.append(" ");\r
+       //              sql.append("or contains(mf.houseid, ?) >= 1");\r
+       //              sql.append(")");\r
+       //              if (typeIDs != null)\r
+       //                      sql.append(" and m.itemtypeid in ").append(typeCriteria.toString());\r
+       private PreparedStatement createArchiveMediaSearchStatement(Connection connection, String criteria, String orderBy, boolean orderAscending,\r
+                       List<String> typeIDs) throws SQLException {\r
                StringBuilder typeCriteria = new StringBuilder();\r
                if (typeIDs != null) {\r
                        typeCriteria.append("(");\r
@@ -70,25 +108,37 @@ public class ItemDAOEx {
                        typeCriteria.append(")");\r
                }\r
 \r
+               String columNames = getColumnNames();\r
+               StringBuilder innerSql = new StringBuilder();\r
+               innerSql.append("SELECT DISTINCT ");\r
+               innerSql.append(columNames);\r
+               innerSql.append(" FROM ITEM i, MEDIA m, MEDIAFILE mf WHERE m.itemid = i.id AND mf.mediaid = m.id AND mf.storeid = 1");\r
+               if (typeIDs != null) {\r
+                       innerSql.append(" AND m.itemtypeid IN ");\r
+                       innerSql.append(typeCriteria.toString());\r
+               }\r
+\r
                StringBuilder sql = new StringBuilder();\r
                sql.append("SELECT * FROM ((");\r
-               sql.append("SELECT DISTINCT m.id, m.title,m.itemtypeid,m.archived FROM ITEM i, MEDIA m, MEDIAFILE mf");\r
-               sql.append(" WHERE ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1)) AND m.itemid = i.id AND mf.mediaid = m.id");\r
-               if (typeIDs != null)\r
-                       sql.append(" AND m.itemtypeid IN ").append(typeCriteria.toString());\r
-               sql.append(")UNION(");\r
-               sql.append("SELECT DISTINCT m2.id,m2.title,m2.itemtypeid,m2.archived FROM ITEM i2, MEDIA m2, MEDIAFILE mf2");\r
-               sql.append(" WHERE ((CONTAINS(m2.title, ?) >= 1) OR (CONTAINS(m2.description, ?) >= 1)) AND m2.itemid = i2.id AND mf2.mediaid = m2.id");\r
-               if (typeIDs != null)\r
-                       sql.append(" AND m2.itemtypeid IN ").append(typeCriteria.toString());\r
-               sql.append(")UNION(");\r
-               sql.append("SELECT DISTINCT m3.id,m3.title,m3.itemtypeid,m3.archived FROM ITEM i3, MEDIA m3, MEDIAFILE mf3");\r
-               sql.append(" WHERE (CONTAINS(mf3.houseId, ?) >= 1) AND m3.itemid = i3.id AND mf3.mediaid = m3.id");\r
-               if (typeIDs != null)\r
-                       sql.append(" AND m3.itemtypeid IN ").append(typeCriteria.toString());\r
-               sql.append(")) ORDER BY itemtypeid,archived desc");\r
+               sql.append(innerSql);\r
+               sql.append(" AND ((CONTAINS(i.title, ?) >= 1) OR (CONTAINS(i.description, ?) >= 1))");\r
+               sql.append(") UNION (");\r
+               sql.append(innerSql);\r
+               sql.append(" AND ((CONTAINS(m.title, ?) >= 1) OR (CONTAINS(m.description, ?) >= 1))");\r
+               sql.append(") UNION (");\r
+               sql.append(innerSql);\r
+               sql.append(" AND (CONTAINS(mf.houseId, ?) >= 1)");\r
+               sql.append(")) ORDER BY ");\r
+\r
+               if (orderBy == null) {\r
+                       sql.append("itemtitle desc, mediaitemtypeid");\r
+               } else {\r
+                       sql.append(orderBy);\r
+                       sql.append(orderAscending ? " ASC" : " DESC");\r
+               }\r
 \r
                String query = sql.toString();\r
+               logger.info(query);\r
                PreparedStatement st = connection.prepareStatement(query, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);\r
 \r
                for (int s = 1; s <= 5; s++) {\r
@@ -97,6 +147,20 @@ public class ItemDAOEx {
                return st;\r
        }\r
 \r
+       private String getColumnNames() {\r
+               StringBuilder columns = new StringBuilder();\r
+               columns.append("i.houseid itemhouseid,");\r
+               columns.append("i.title itemtitle,");\r
+               columns.append("m.id mediaid,");\r
+               columns.append("m.archived,");\r
+               columns.append("m.length,");\r
+               columns.append("m.itemtypeid mediaitemtypeid,");\r
+               columns.append("m.houseid mediahouseid,");\r
+               columns.append("m.title mediatitle,");\r
+               columns.append("mf.houseid mediafilehouseid");\r
+               return columns.toString();\r
+       }\r
+\r
        private List<SearchResult> getResultHeaders(Connection connection, QueryObject queryObject, String innerQuery) {\r
                List<SearchResult> results = new ArrayList<SearchResult>();\r
                String typeQuery;\r
@@ -377,7 +441,8 @@ public class ItemDAOEx {
                return result;\r
        }\r
 \r
-       public SearchResult<ArchivedMedia> searchArchivedMedia(String criteria, List<String> searchFilters, int fromResult, int toResult) {\r
+       public SearchResult<ArchivedMedia> searchArchivedMedia(String criteria, List<String> searchFilters, String orderBy, boolean orderAscending, int fromResult,\r
+                       int toResult) {\r
                SearchResult<ArchivedMedia> result = new SearchResult<>();\r
 \r
                List<String> typeIDs = getTypeIDs(searchFilters);\r
@@ -388,7 +453,7 @@ public class ItemDAOEx {
                Connection connection = context.getConnection();\r
                try {\r
 \r
-                       st = createArchiveMediaSearchStatement(connection, criteria, typeIDs);\r
+                       st = createArchiveMediaSearchStatement(connection, criteria, orderBy, orderAscending, typeIDs);\r
                        rs = st.executeQuery();\r
                        rs.last();\r
                        result.setItemCount(rs.getRow());\r
@@ -419,7 +484,7 @@ public class ItemDAOEx {
                        logger.info("Processing query result, maxRecords {}", maxRecords);\r
                        while (rs.next() && maxRecords > 0) {\r
                                ArchivedMedia am = new ArchivedMedia();\r
-                               Media media = manager.getMedia(rs.getLong("id"));\r
+                               Media media = manager.getMedia(rs.getLong("mediaid"));\r
                                am.setMedia(media);\r
                                Item item = manager.getItem(media.getItemId());\r
                                am.setItem(item);\r
index 54e4d3915cbf6f7539a78b54542bb37222ec6c87..6729fe820470ef72b66edfe06dcdc19eb89eb5d1 100644 (file)
@@ -409,6 +409,44 @@ public class ItemManager extends MemoryCache implements IItemManager {
                traceOut();\r
        }\r
 \r
+       @Override\r
+       public void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator) {\r
+               ResultSet rs = null;\r
+               PreparedStatement st = null;\r
+               DefaultContext context = getDbContext();\r
+               Connection connection = context.getConnection();\r
+               try {\r
+                       st = connection.prepareStatement(query);\r
+                       if (decorator != null)\r
+                               decorator.decorate(st);\r
+                       rs = st.executeQuery();\r
+                       while (rs.next()) {\r
+                               if (!consumer.process(rs))\r
+                                       break;\r
+                       }\r
+\r
+                       connection.commit();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       try {\r
+                               connection.rollback();\r
+                       } catch (Exception e1) {\r
+                       }\r
+               } finally {\r
+                       try {\r
+                               if (rs != null)\r
+                                       rs.close();\r
+                       } catch (Exception e1) {\r
+                       }\r
+                       try {\r
+                               if (st != null)\r
+                                       st.close();\r
+                       } catch (Exception e1) {\r
+                       }\r
+                       putDbContext(context);\r
+               }\r
+       }\r
+\r
        @Override\r
        public IEntityBase get(Class<? extends IEntityBase> classInfo, long id) {\r
                traceIn();\r
@@ -516,6 +554,26 @@ public class ItemManager extends MemoryCache implements IItemManager {
                return result;\r
        }\r
 \r
+       @Override\r
+       public long getExistingRundownMedia(String houseid) {\r
+               final long[] result = { 0 };\r
+               StringBuilder query = new StringBuilder();\r
+               query.append("select itemid, mediaid, replace(mediafilehouseid, concat('-', concat(itemhouseid,'.MXF')), '') filename");\r
+               query.append(" ");\r
+               query.append("from vw_items where replace(mediafilehouseid, concat('-', itemhouseid), '') != mediafilehouseid");\r
+               query.append(" ");\r
+               query.append("and replace(mediafilehouseid, concat('-', concat(itemhouseid,'.MXF')), '') = ?");\r
+               IStatementDecorator decorator = st -> {\r
+                       st.setString(1, houseid);\r
+               };\r
+               IResultSetConsumer consumer = rs -> {\r
+                       result[0] = rs.getLong("mediaid");\r
+                       return false;\r
+               };\r
+               executeQuery(query.toString(), consumer, decorator);\r
+               return result[0];\r
+       }\r
+\r
        @Override\r
        public FileType getFileType(String name) {\r
                FileTypeDAO dao = (FileTypeDAO) getBaseDAO(FileType.class);\r
@@ -949,11 +1007,12 @@ public class ItemManager extends MemoryCache implements IItemManager {
        }\r
 \r
        @Override\r
-       public SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, int fromResult, int toResult) {\r
+       public SearchResult<ArchivedMedia> search(String criteria, List<String> searchFilters, String orderBy, boolean orderAscending, int fromResult,\r
+                       int toResult) {\r
                traceIn();\r
                SearchResult<ArchivedMedia> result = null;\r
                ItemDAOEx itemDb = new ItemDAOEx(this);\r
-               result = itemDb.searchArchivedMedia(criteria, searchFilters, fromResult, toResult);\r
+               result = itemDb.searchArchivedMedia(criteria, searchFilters, orderBy, orderAscending, fromResult, toResult);\r
                traceOut();\r
                return result;\r
        }\r
index d78073c9512e136729602c1bdb6fcac90c14f798..6e03ccbe5d7d848bbd405623bc2516dff4fdb19c 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="user.jobengine.osgi.server" activate="activate" deactivate="deactivate">\r
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" immediate="true" name="user.jobengine.osgi.server" activate="startup" deactivate="shutdown">\r
    <implementation class="user.jobengine.server.JobEngine"/>\r
    <!-- \r
    <reference bind="bindService" cardinality="1..1" interface="user.jobengine.server.IJobEngine" name="IJobEngine" policy="static" unbind="unbindService"/>\r
index ae86a13f029620247aec949fe83b4e67fe6316ce..4c52bbe737ad55a8d3ef1b82c5008009353215fc 100644 (file)
@@ -48,6 +48,80 @@ div.z-row-content span {
 .z-row:hover>.z-row-inner>.z-row-content{\r
                text-color: black;\r
 }\r
+\r
+.RED100 .z-toolbarbutton-content {\r
+       background: #FFCDD2;\r
+}\r
+\r
+.RED200 .z-toolbarbutton-content {\r
+       background: #EF9A9A;\r
+}\r
+\r
+.BROWN100 .z-toolbarbutton-content {\r
+       background: #D7CCC8;\r
+}\r
+\r
+.YELLOW200 .z-toolbarbutton-content {\r
+       background: #FFF59D;\r
+}\r
+\r
+.INDIGO100 .z-toolbarbutton-content {\r
+       background: #C5CAE9;\r
+}\r
+\r
+.INDIGO200 .z-toolbarbutton-content {\r
+       background: #9FA8DA;\r
+}\r
+\r
+.BLUE100 .z-toolbarbutton-content {\r
+       background: #BBDEFB;\r
+}\r
+\r
+.BLUE200 .z-toolbarbutton-content {\r
+       background: #90CAF9; \r
+}\r
+\r
+.TEAL100 .z-toolbarbutton-content {\r
+       background: #B2DFDB;\r
+}\r
+\r
+.TEAL200 .z-toolbarbutton-content {\r
+       background: #80CBC4;\r
+}\r
+\r
+.z-toolbarbutton-content {\r
+       text-shadow: none;\r
+       background: transparent;\r
+       border: 1px solid transparent;\r
+       border-radius: 3px;\r
+       margin: 1px;\r
+}\r
+\r
+.toolbar {\r
+       padding:1px;\r
+       background:none;\r
+       border:0px;\r
+}\r
+\r
+.typefilter{\r
+       font-size:9px;\r
+       padding:0px;\r
+       margin:0px;\r
+       background: none;\r
+}\r
+\r
+.z-toolbarbutton:hover {\r
+       background:transparent;\r
+}\r
+\r
+.ie8 .z-toolbarbutton:active {\r
+       background:transparent;\r
+}\r
+\r
+.ie8 .z-toolbarbutton-checked {\r
+       background:transparent;\r
+}\r
+\r
        </style>\r
        <div id="scdiv" width="100%" height="100%" apply="org.zkoss.bind.BindComposer" viewModel="@id('vm') @init('user.jobengine.zk.model.SearchModel')">\r
                <timer id="timer" delay="100" repeats="true" onTimer="@command('uiTick')" />\r
@@ -57,18 +131,25 @@ div.z-row-content span {
                                        <groupbox vflex="min" closable="false">\r
                                                <vlayout>\r
                                                        <hbox pack="left" align="top">\r
-                                                               <checkbox checked="@bind(vm.allChecked)" style="font-size:10px" />\r
+                                                               <toolbar class="toolbar">\r
+                                                                       <toolbarbutton label="Mind" style="font-size:9px;padding:0px;margin:0px 10px 0px 0px;background:none;" mode="toggle"\r
+                                                                               checked="@bind(vm.allChecked)" />\r
+                                                               </toolbar>\r
                                                                <vlayout>\r
-                                                                       <toolbar style="padding:1px;background:none;border:0px;">\r
+                                                                       <toolbar class="toolbar">\r
                                                                                <forEach items="@load(vm.topTypeFilterNames)">\r
-                                                                                       <toolbarbutton image="@load(c:cat('/img/types/', vm.typeIcons[each]))" style="font-size:9px;padding:0px;margin:0px;background:none;" label="@load(each)" mode="toggle"\r
-                                                                                               checked="@bind(vm.typeFilters[each]) @validator(vm.allFilterCheckedValidator)" />\r
+                                                                                       <toolbarbutton label="@load(each)" mode="toggle"\r
+                                                                                               image="@load(c:cat('/img/types/', vm.typeFilters[each].icon))" \r
+                                                                                               checked="@bind(vm.typeFilters[each].checked) @validator(vm.allFilterCheckedValidator)"\r
+                                                                                               class="@load(c:cat(vm.typeFilters[each].color, ' typefilter'))" />\r
                                                                                </forEach>\r
                                                                        </toolbar>\r
-                                                                       <toolbar style="padding:1px;background:none;border:0px;">\r
+                                                                       <toolbar class="toolbar">\r
                                                                                <forEach items="@load(vm.bottomTypeFilterNames)">\r
-                                                                                       <toolbarbutton image="@load(c:cat('/img/types/', vm.typeIcons[each]))" style="font-size:9px;padding:0px;margin:0px;background:none;" label="@load(each)" mode="toggle"\r
-                                                                                               checked="@bind(vm.typeFilters[each]) @validator(vm.allFilterCheckedValidator)" />\r
+                                                                                       <toolbarbutton label="@load(each)" mode="toggle"\r
+                                                                                               image="@load(c:cat('/img/types/', vm.typeFilters[each].icon))" \r
+                                                                                               checked="@bind(vm.typeFilters[each].checked) @validator(vm.allFilterCheckedValidator)"\r
+                                                                                               class="@load(c:cat(vm.typeFilters[each].color, ' typefilter'))" />\r
                                                                                </forEach>\r
                                                                        </toolbar>\r
                                                                </vlayout>\r
@@ -80,6 +161,13 @@ div.z-row-content span {
                                                        <button hflex="min" image="/img/ic_search_black_18dp.png" onClick="@command('doSearch')" style="width:40px" />\r
                                                </hbox>\r
                                        </groupbox>\r
+                                       <popup id="sortOther">\r
+                                               <vlayout vflex="min">\r
+                                                       <radiogroup>\r
+                                                               <radio label="Gyűjtő cím" />\r
+                                                       </radiogroup>\r
+                                               </vlayout>                                                  \r
+                                       </popup>                                                \r
                                        <groupbox vflex="true" closable="false">\r
                                                <grid id="itemsGrid" sizedByContent="false" span="true" vflex="true" hflex="true" mold="paging" autopaging="false"\r
                                                        model="@load(vm.searchResult)" activePage="@bind(vm.activePage)" emptyMessage="Nincs találat!"\r
@@ -94,8 +182,9 @@ div.z-row-content span {
                                                                </column>\r
                                                                <column label="ID" sort="auto" hflex="min" align="left" />\r
                                                                <column label="Cím" sort="auto" align="left" />\r
-                                                               <column label="Fájlnév" hflex="min" align="left" />\r
-                                                               <column label="Hossz" hflex="min" align="right" />\r
+                                                               <column label="Fájlnév" sort="auto" hflex="min" align="left" />\r
+                                                               <column label="Hossz" sort="auto" hflex="min" align="right" />\r
+<!--                                                           <column width="20px" align="right" style="cursor: pointer" popup="sortOther" /> -->\r
                                                        </columns>\r
                                                        <rows id="rows" style="cursor: pointer;" >\r
                                                                <template name="model">\r
index 80d4429e0e59a1b20c930f336d9037ea63faff65..1a0e9657ae287683371d929e278b720e61473d1a 100644 (file)
@@ -256,12 +256,7 @@ public class JobEngine implements IJobEngine {
 
        @Override
        public synchronized void bindItemManagerService(IItemManager service) {
-               try {
-                       setItemManager(service);
-                       startup();
-               } catch (Exception e) {
-                       logger.error("Couldn't bind itemManagerService", e);
-               }
+               setItemManager(service);
        }
 
        private void bootstrap() throws JobEngineException {
index 4ad7d14b9b628f6515747bceef0e51c7269762f8..76ece446f3552b1bb9802205b3f572776809126a 100644 (file)
@@ -15,6 +15,7 @@ public class ArchiveItem implements Serializable {
        private String catchedFile;\r
        private String mediaType;\r
        private long duration;\r
+       private long existingMediaId;\r
 \r
        public String getCatchedFile() {\r
                return catchedFile;\r
@@ -24,6 +25,10 @@ public class ArchiveItem implements Serializable {
                return duration;\r
        }\r
 \r
+       public long getExistingMediaId() {\r
+               return existingMediaId;\r
+       }\r
+\r
        public String getItemDescription() {\r
                return itemDescription;\r
        }\r
@@ -74,6 +79,10 @@ public class ArchiveItem implements Serializable {
                this.duration = duration;\r
        }\r
 \r
+       public void setExistingMediaId(long existingMediaId) {\r
+               this.existingMediaId = existingMediaId;\r
+       }\r
+\r
        public void setItemDescription(String itemDescription) {\r
                this.itemDescription = itemDescription;\r
        }\r
index 026a3b34e6b0016764a32343d8f9e23ada3baf0b..c0448ffb0382b7dc3f5b792a95055087793ab03c 100644 (file)
@@ -37,12 +37,15 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
        private ArrayList<EventListener> eventListenerList = new ArrayList<EventListener>();\r
        private IItemManager itemManager = null;\r
        private List<String> searchFilters;\r
+       private String orderBy;\r
+       private boolean orderAscending;\r
 \r
-       public CachedListModel(String searchValue, List<String> searchFilters) {\r
+       public CachedListModel(String searchValue, List<String> searchFilters, String orderBy, boolean orderAscending) {\r
                this.searchValue = searchValue;\r
                this.searchFilters = searchFilters;\r
+               this.orderBy = orderBy;\r
+               this.orderAscending = orderAscending;\r
                this.itemManager = ItemManager.getInstance();\r
-               //this.setMultiple(true);\r
                reinit();\r
        }\r
 \r
@@ -150,7 +153,7 @@ public class CachedListModel extends ListModelList<ArchivedMedia> {
                        int endPos = (startPos + rowLimit);\r
                        endPos = ((this.resultSetSize < 0) || (endPos <= this.resultSetSize)) ? endPos : this.resultSetSize;\r
 \r
-                       SearchResult<ArchivedMedia> sr = this.itemManager.search(formatSearchValue(searchValue), searchFilters, startPos, endPos);\r
+                       SearchResult<ArchivedMedia> sr = this.itemManager.search(formatSearchValue(searchValue), searchFilters, orderBy, orderAscending, startPos, endPos);\r
 \r
                        if (sr != null) {\r
                                if (this.resultSetSize < 0) {\r
index 6c296a81c2610fd8c5b4864e87754d3b2081aa19..c4c7045c2425203938e56321ce7b49dcb98e6f0f 100644 (file)
@@ -19,14 +19,13 @@ import org.zkoss.bind.annotation.ContextParam;
 import org.zkoss.bind.annotation.ContextType;\r
 import org.zkoss.bind.annotation.NotifyChange;\r
 import org.zkoss.zk.ui.Component;\r
-import org.zkoss.zk.ui.event.EventListener;\r
+import org.zkoss.zk.ui.event.Event;\r
 import org.zkoss.zk.ui.event.MouseEvent;\r
 import org.zkoss.zk.ui.event.SortEvent;\r
 import org.zkoss.zk.ui.select.Selectors;\r
 import org.zkoss.zk.ui.select.annotation.Wire;\r
 import org.zkoss.zul.Checkbox;\r
 import org.zkoss.zul.Column;\r
-import org.zkoss.zul.Columns;\r
 import org.zkoss.zul.Detail;\r
 import org.zkoss.zul.Grid;\r
 import org.zkoss.zul.Hlayout;\r
@@ -59,59 +58,57 @@ public class SearchModel extends AsyncBaseModel {
        private static final String PAGES_MEDIAPLAYER = "/pages/mediaplayer.jsp?mediaurl=";\r
        private String[] topTypeFilterNames;\r
        private String[] bottomTypeFilterNames;\r
+       private Map<String, TypeFilter> typeFilters;\r
+       private Map<String, String> columnHeaders;\r
        private String searchValue = null;\r
        private CachedListModel searchResult = null;\r
        private ArchivedMedia selectedObject = null;\r
        private Validator allFilterCheckedValidator;\r
        private Validator itemSelectedValidator;\r
-       private Map<String, Boolean> typeFilters;\r
-       private Map<String, String> typeIcons;\r
        private boolean allChecked = true;\r
        private int activePage;\r
        private boolean rowsExpanded = true;\r
        private boolean allSelected;\r
-       private boolean itemSelected;\r
 \r
+       private boolean itemSelected;\r
        @Wire\r
        Rows rows;\r
        @Wire\r
        Grid itemsGrid;\r
+       private String orderBy;\r
+       private boolean orderAscending;\r
+\r
+       private Map<String, String> topColorClasses;\r
 \r
        public SearchModel() {\r
                typeFilters = new LinkedHashMap<>();\r
-               typeFilters.put(NEWS_MATERIAL, true);\r
-               typeFilters.put(RAW_NEWS_MATERIAL, true);\r
-               typeFilters.put(MATERIAL, true);\r
-               typeFilters.put(RAW_MATERIAL, true);\r
-               typeFilters.put(PROMO, true);\r
-               typeFilters.put(RAW_PROMO, true);\r
-               typeFilters.put(AD, true);\r
-               typeFilters.put(RAW_AD, true);\r
-               typeFilters.put(RECORDING, true);\r
-               typeFilters.put(GENERIC, true);\r
+               addTypeFilter(TypeFilter.as(NEWS_MATERIAL, "RED200", "ic_language_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(RAW_NEWS_MATERIAL, "RED100", "ic_perm_camera_mic_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(MATERIAL, "TEAL200", "ic_theaters_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(RAW_MATERIAL, "TEAL100", "ic_invert_colors_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(PROMO, "INDIGO200", "ic_picture_in_picture_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(RAW_PROMO, "INDIGO100", "ic_bug_report_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(AD, "BLUE200", "ic_picture_in_picture_alt_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(RAW_AD, "BLUE100", "ic_settings_brightness_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(RECORDING, "BROWN100", "ic_group_work_black_18dp.png"));\r
+               addTypeFilter(TypeFilter.as(GENERIC, "YELLOW200", "ic_view_quilt_black_18dp.png"));\r
                topTypeFilterNames = new String[] { NEWS_MATERIAL, RAW_NEWS_MATERIAL, RECORDING, GENERIC };\r
                bottomTypeFilterNames = new String[] { MATERIAL, RAW_MATERIAL, PROMO, RAW_PROMO, AD, RAW_AD };\r
 \r
-               typeIcons = new LinkedHashMap<>();\r
-               typeIcons.put(NEWS_MATERIAL, "ic_language_black_18dp.png");\r
-               typeIcons.put(RAW_NEWS_MATERIAL, "ic_perm_camera_mic_black_18dp.png");\r
-               typeIcons.put(MATERIAL, "ic_theaters_black_18dp.png");\r
-               typeIcons.put(RAW_MATERIAL, "ic_invert_colors_black_18dp.png");\r
-               typeIcons.put(PROMO, "ic_picture_in_picture_black_18dp.png");\r
-               typeIcons.put(RAW_PROMO, "ic_bug_report_black_18dp.png");\r
-               typeIcons.put(AD, "ic_picture_in_picture_alt_black_18dp.png");\r
-               typeIcons.put(RAW_AD, "ic_settings_brightness_black_18dp.png");\r
-               typeIcons.put(RECORDING, "ic_group_work_black_18dp.png");\r
-               typeIcons.put(GENERIC, "ic_view_quilt_black_18dp.png");\r
+               columnHeaders = new LinkedHashMap<>();\r
+               columnHeaders.put("ID", "mediahouseid");\r
+               columnHeaders.put("Cím", "mediatitle");\r
+               columnHeaders.put("Hossz", "length");\r
+               columnHeaders.put("Fájlnév", "mediafilehouseid");\r
 \r
                allFilterCheckedValidator = new Validator() {\r
                        @Override\r
                        public void validate(ValidationContext ctx) {\r
                                try {\r
 \r
-                                       String label = ctx.getProperty().getProperty();\r
+                                       TypeFilter typeFilter = (TypeFilter) ctx.getProperty().getBase();\r
                                        boolean isChecked = (boolean) ctx.getProperty().getValue();\r
-                                       typeFilters.put(label, isChecked);\r
+                                       typeFilter.setChecked(isChecked);\r
                                        //logger.info("{} {}", label, isChecked);\r
                                } catch (Exception e) {\r
 \r
@@ -136,35 +133,23 @@ public class SearchModel extends AsyncBaseModel {
                };\r
        }\r
 \r
+       private void addTypeFilter(TypeFilter typeFilter) {\r
+               typeFilters.put(typeFilter.getName(), typeFilter);\r
+       }\r
+\r
        @AfterCompose\r
        public void afterCompose(@ContextParam(ContextType.VIEW) Component view) {\r
                Selectors.wireComponents(view, this, false);\r
                Selectors.wireEventListeners(view, this);\r
                itemsGrid.getPagingChild().setAutohide(false);\r
-               Columns columns = itemsGrid.getColumns();\r
-               for (Component child : columns.getChildren()) {\r
+               for (Component child : itemsGrid.getColumns().getChildren()) {\r
                        Column column = (Column) child;\r
-                       column.addEventListener("onSort", new EventListener<SortEvent>() {\r
-                               @Override\r
-                               public void onEvent(SortEvent evt) throws Exception {\r
-                                       for (Component child : columns.getChildren()) {\r
-                                               Column column = (Column) child;\r
-                                               column.setSortDirection("natural");\r
-                                       }\r
-                                       Column column = (Column) evt.getTarget();\r
-                                       if (evt.isAscending())\r
-                                               column.setSortDirection("ascending");\r
-                                       else\r
-                                               column.setSortDirection("descending");\r
-                                       logger.info("{} {}", column.getLabel(), evt.isAscending());\r
-                                       evt.stopPropagation();\r
-                               }\r
-                       });\r
+                       column.addEventListener("onSort", evt -> doSort(evt));\r
                }\r
        }\r
 \r
        @Command\r
-       @NotifyChange({ "activePage", "searchResult", "selectedObject", "hasLowresMediaFile" })\r
+       @NotifyChange({ "activePage", "searchResult", "selectedObject", "hasLowresMediaFile", "lowresMediaFilePath" })\r
        public void doSearch() {\r
                try {\r
                        this.selectedObject = null;\r
@@ -173,13 +158,28 @@ public class SearchModel extends AsyncBaseModel {
 \r
                        List<String> searchFilters = getSelectedFilters();\r
 \r
-                       searchResult = new CachedListModel(searchValue, searchFilters);\r
+                       searchResult = new CachedListModel(searchValue, searchFilters, orderBy, orderAscending);\r
                } catch (Exception e) {\r
                        Messagebox.show(e.getMessage());\r
                        logger.catching(e);\r
                }\r
        }\r
 \r
+       public void doSort(Event event) throws Exception {\r
+               itemsGrid.getColumns().getChildren().forEach(c -> ((Column) c).setSortDirection("natural"));\r
+               SortEvent evt = (SortEvent) event;\r
+               Column column = (Column) evt.getTarget();\r
+               column.setSortDirection(evt.isAscending() ? "ascending" : "descending");\r
+               logger.info("{} {}", column.getLabel(), evt.isAscending());\r
+\r
+               orderBy = columnHeaders.get(column.getLabel());\r
+               orderAscending = evt.isAscending();\r
+               doSearch();\r
+               NotifyChange("activePage", "searchResult", "selectedObject", "hasLowresMediaFile", "lowresMediaFilePath");\r
+\r
+               evt.stopPropagation();\r
+       }\r
+\r
        @Command\r
        public void downloadMedia() {\r
                if (!getHasTSMMediaFile())\r
@@ -273,7 +273,7 @@ public class SearchModel extends AsyncBaseModel {
                List<String> result = null;\r
                if (!allChecked) {\r
                        for (String label : typeFilters.keySet()) {\r
-                               boolean isChecked = typeFilters.get(label);\r
+                               boolean isChecked = typeFilters.get(label).isChecked();\r
                                if (!isChecked)\r
                                        continue;\r
                                if (result == null)\r
@@ -288,6 +288,10 @@ public class SearchModel extends AsyncBaseModel {
                return selectedObject;\r
        }\r
 \r
+       public Map<String, String> getTopColorClasses() {\r
+               return topColorClasses;\r
+       }\r
+\r
        public String[] getTopTypeFilterNames() {\r
                return topTypeFilterNames;\r
        }\r
@@ -306,14 +310,10 @@ public class SearchModel extends AsyncBaseModel {
                return ret;\r
        }\r
 \r
-       public Map<String, Boolean> getTypeFilters() {\r
+       public Map<String, TypeFilter> getTypeFilters() {\r
                return typeFilters;\r
        }\r
 \r
-       public Map<String, String> getTypeIcons() {\r
-               return typeIcons;\r
-       }\r
-\r
        private void highlight(ArchivedMedia am, boolean highlight) {\r
                if (am == null)\r
                        return;\r
@@ -386,7 +386,7 @@ public class SearchModel extends AsyncBaseModel {
        public void setAllChecked(boolean allChecked) {\r
                this.allChecked = allChecked;\r
                for (String key : typeFilters.keySet())\r
-                       typeFilters.put(key, allChecked);\r
+                       typeFilters.get(key).setChecked(allChecked);\r
        }\r
 \r
        public void setAllFilterCheckedValidator(Validator allFilterCheckedValidator) {\r
@@ -437,7 +437,7 @@ public class SearchModel extends AsyncBaseModel {
        public void updateAllChecked() {\r
                final boolean[] check = { true };\r
                for (String key : typeFilters.keySet()) {\r
-                       if (!(boolean) typeFilters.get(key)) {\r
+                       if (!typeFilters.get(key).isChecked()) {\r
                                check[0] = false;\r
                                break;\r
                        }\r
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/TypeFilter.java b/server/user.jobengine.osgi.server/src/user/jobengine/zk/model/TypeFilter.java
new file mode 100644 (file)
index 0000000..3d0777b
--- /dev/null
@@ -0,0 +1,40 @@
+package user.jobengine.zk.model;\r
+\r
+public class TypeFilter {\r
+       static public TypeFilter as(String name, String color, String icon) {\r
+               return new TypeFilter(name, color, icon);\r
+       }\r
+\r
+       private String name;\r
+       private String color;\r
+       private String icon;\r
+\r
+       private boolean checked;\r
+\r
+       TypeFilter(String name, String color, String icon) {\r
+               this.name = name;\r
+               this.color = color;\r
+               this.icon = icon;\r
+               this.checked = true;\r
+       }\r
+\r
+       public String getColor() {\r
+               return color;\r
+       }\r
+\r
+       public String getIcon() {\r
+               return icon;\r
+       }\r
+\r
+       public String getName() {\r
+               return name;\r
+       }\r
+\r
+       public boolean isChecked() {\r
+               return checked;\r
+       }\r
+\r
+       public void setChecked(boolean checked) {\r
+               this.checked = checked;\r
+       }\r
+}
\ No newline at end of file
index 5c0379a7109b01a5d5051d7c571d2af0376d3091..17b95075e84e411908403fa34477b98b635e5dd4 100644 (file)
@@ -37,6 +37,8 @@ import user.commons.logging.LogUtils;
 import user.commons.nosql.NoSQLUtils;\r
 import user.commons.octopus.OctopusAPI;\r
 import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.IResultSetConsumer;\r
+import user.jobengine.db.IStatementDecorator;\r
 import user.jobengine.db.Item;\r
 import user.jobengine.db.ItemManager;\r
 import user.jobengine.db.Media;\r
@@ -122,41 +124,6 @@ public class Support {
 \r
        }\r
 \r
-       private void executeQuery(String query, IResultSetConsumer consumer, IStatementDecorator decorator) {\r
-               ResultSet rs = null;\r
-               PreparedStatement st = null;\r
-               DefaultContext context = ((ItemManager) manager).getDbContext();\r
-               Connection connection = context.getConnection();\r
-               try {\r
-                       st = connection.prepareStatement(query);\r
-                       if (decorator != null)\r
-                               decorator.decorate(st);\r
-                       rs = st.executeQuery();\r
-                       while (rs.next()) {\r
-                               consumer.process(rs);\r
-                       }\r
-\r
-                       connection.commit();\r
-               } catch (Exception e) {\r
-                       try {\r
-                               connection.rollback();\r
-                       } catch (Exception e1) {\r
-                       }\r
-               } finally {\r
-                       try {\r
-                               if (rs != null)\r
-                                       rs.close();\r
-                       } catch (Exception e1) {\r
-                       }\r
-                       try {\r
-                               if (st != null)\r
-                                       st.close();\r
-                       } catch (Exception e1) {\r
-                       }\r
-                       ((ItemManager) manager).putDbContext(context);\r
-               }\r
-       }\r
-\r
        @Test\r
        public void generateMissingRecordingsList() throws Exception {\r
                //              select itemtitle, mediafilehouseid from vw_items where itemtitle like '%Echo TV%' and itemtitle like '2%' and mediatitle like '%PGM%' order by itemtitle, mediafilehouseid\r
@@ -261,7 +228,7 @@ public class Support {
                        if (masterMediaFile[0] == null) {\r
                                masterMediaFile[0] = mediaFile;\r
                                System.out.println("Skipping: " + mediaFileHouseId);\r
-                               return;\r
+                               return true;\r
                        }\r
 \r
                        String path = rs.getString("relativepath");\r
@@ -270,9 +237,9 @@ public class Support {
                        File file = Paths.get(LOWRES_ROOT, path).toFile();\r
                        duplicateLength[0] += file.length();\r
                        System.out.println("Inspecting: " + mediaFileHouseId + " now available " + duplicateLength[0]);\r
-\r
+                       return true;\r
                };\r
-               executeQuery(query, consumer, decorator);\r
+               manager.executeQuery(query, consumer, decorator);\r
        }\r
 \r
        @Test\r
@@ -281,8 +248,9 @@ public class Support {
                IResultSetConsumer consumer = rs -> {\r
                        String fileName = rs.getString("filename");\r
                        processLowresDuplicateGroup(fileName);\r
+                       return true;\r
                };\r
-               executeQuery(query, consumer, null);\r
+               manager.executeQuery(query, consumer, null);\r
                System.out.println("Available will " + duplicateLength[0]);\r
        }\r
 \r
@@ -333,8 +301,10 @@ public class Support {
                        } catch (Exception e) {\r
                                System.out.println("Error processing: " + rundownID);\r
                        }\r
+                       return true;\r
                };\r
-               executeQuery(query, consumer, null);\r
+\r
+               manager.executeQuery(query, consumer, null);\r
                //System.out.println("Available will " + duplicateLength[0]);\r
        }\r
 \r
index 3ea70d0e35c7da768b2af961bbb053fc59548e04..b44da7d36806bfaa02539dc10d6ca69421a1a03b 100644 (file)
@@ -41,9 +41,7 @@ public class NexioWSServlet extends WebSocketServlet implements INexioChangeList
                dispatcher.setNexioChangeListener(this);
                dispatcher.startup();
                logger.info("Initialized");
-               BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
-               if (bundleContext != null)
-                       bundleContext.registerService(ClipEventListener.class, dispatcher, null);
+               registerNexioService();
        }
 
        public void addSession(Session session) {
@@ -99,6 +97,21 @@ public class NexioWSServlet extends WebSocketServlet implements INexioChangeList
                        sessions.removeAll(deadSessions);
        }
 
+       private void registerNexioService() {
+               BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
+               if (bundleContext != null) {
+                       ClassLoader tccl = Thread.currentThread().getContextClassLoader();
+                       try {
+                               Thread.currentThread().setContextClassLoader(ClipEventListener.class.getClassLoader());
+                               bundleContext.registerService(ClipEventListener.class, dispatcher, null);
+                       } catch (Exception e) {
+                               logger.catching(e);
+                       } finally {
+                               Thread.currentThread().setContextClassLoader(tccl);
+                       }
+               }
+       }
+
        public void removeSession(Session session) {
                if (sessions.contains(session))
                        sessions.remove(session);