Author: michiel
Date: 2009-06-05 18:40:29 +0200 (Fri, 05 Jun 2009)
New Revision: 35794

Added:
   
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/test_upload.jspx
Modified:
   
speeltuin/mihxil/streams/src/main/java/org/mmbase/streams/CreateCachesProcessor.java
   
speeltuin/mihxil/streams/src/main/java/org/mmbase/streams/transcoders/InfiniteTranscoder.java
   
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/builders/streams/streamsources.fields.xml
   
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/builders/streams/streamsources.xml
   
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/components/streams.xml
   
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/functions/streams.xml
   
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/alljobs.jspx
   
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/myjobs.jspx
   
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/upload.jspx
Log:


Modified: 
speeltuin/mihxil/streams/src/main/java/org/mmbase/streams/CreateCachesProcessor.java
===================================================================
--- 
speeltuin/mihxil/streams/src/main/java/org/mmbase/streams/CreateCachesProcessor.java
        2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/java/org/mmbase/streams/CreateCachesProcessor.java
        2009-06-05 16:40:29 UTC (rev 35794)
@@ -168,6 +168,8 @@
         NodeQuery q = caches.createQuery();
         Queries.addConstraint(q, Queries.createConstraint(q, "id",  
FieldCompareConstraint.EQUAL, node));
         Queries.addConstraint(q, Queries.createConstraint(q, "key", 
FieldCompareConstraint.EQUAL, t.getKey()));
+
+        LOG.service("Executing " + q.toSql());
         NodeList nodes = caches.getList(q);
         Node resultNode;
         if (nodes.size() > 0) {
@@ -195,13 +197,13 @@
 
 
 
-    private static final Set<Job> runningJobs = 
Collections.synchronizedSet(new HashSet<Job>());
+    private static final Map<Integer, Job> runningJobs = 
Collections.synchronizedMap(new LinkedHashMap<Integer, Job>());
 
 
     public static Set<Job> myJobs(UserContext u) {
-        Set<Job> myjobs = new HashSet<Job>();
+        Set<Job> myjobs = new LinkedHashSet<Job>();
         synchronized(runningJobs) {
-            for (Job j : runningJobs) {
+            for (Job j : runningJobs.values()) {
                 if (j.user.equals(u.getIdentifier())) {
                     myjobs.add(j);
                 }
@@ -209,14 +211,38 @@
         }
         return myjobs;
     }
-    public static Set<Job> runningJobs() {
-        return Collections.unmodifiableSet(runningJobs);
+    public static Collection<Job> runningJobs() {
+        return Collections.unmodifiableCollection(runningJobs.values());
     }
 
+    public static String cancelJob(Node node) {
+        Job job = runningJobs.get(node.getNumber());
+        if (job == null) {
+            return "No such job";
+        } else {
+            if (job.future.cancel(true)) {
+                String message = "Canceled " + job.future;
+                job.logger.info(message);
+                runningJobs.remove(node.getNumber());
+                return message;
+            } else {
+                return "Could not cancel " + job;
+            }
 
+        }
+    }
+
+
     private Job createJob(final Node node, final Node mediaprovider, final 
Node mediafragment, final ChainedLogger logger) {
-        final Job thisJob = new Job(node.getCloud().getUser(), logger, 
list.size());
-        runningJobs.add(thisJob);
+
+        Job job = runningJobs.get(node.getNumber());
+        if (job != null) {
+            // already running
+            return null;
+        }
+        final Job thisJob = new Job(node, logger, list.size());
+
+        runningJobs.put(node.getNumber(), thisJob);
         thisJob.setFuture(transcoderExecutor.submit(new Callable<Integer>() {
                     public Integer call() {
                         int result = 0;
@@ -302,7 +328,7 @@
                             }
                         } finally {
                             logger.info("READY " + result);
-                            runningJobs.remove(thisJob);
+                            runningJobs.remove(thisJob.getNodeNumber());
                         }
                         return result;
 
@@ -322,26 +348,24 @@
                 ThreadPools.scheduler.schedule(new Runnable() {
                         public void run() {
                             if (ntCloud.hasNode(node.getNumber())) {
-                                    final ChainedLogger logger = new 
ChainedLogger(LOG);
-                                    node.getStringValue("title"); // This 
triggers RelatedField$Creator to create a
-                                    // mediafragment if it does not yet exist
-                                    Node mediafragment = 
node.getNodeValue("mediafragment");
-                                    Node mediaprovider = 
node.getNodeValue("mediaprovider");
-                                    if (mediaprovider == null) {
-                                        mediaprovider = 
Casting.toNode(node.getNodeManager().getField("mediaprovider").getDataType().getDefaultValue(),
 node.getCloud());
-                                    }
+                                final ChainedLogger logger = new 
ChainedLogger(LOG);
+                                final Node ntNode = 
ntCloud.getNode(node.getNumber());
+                                ntNode.getStringValue("title"); // This 
triggers RelatedField$Creator to create a
+                                // mediafragment if it does not yet exist
+                                final Node mediafragment = 
ntCloud.getNode(ntNode.getNodeValue("mediafragment").getNumber());
+                                final Node mediaprovider = 
ntCloud.getNode(ntNode.getNodeValue("mediaprovider").getNumber());
 
-                                    LOG.info("Field '" + field + " was 
changed. Triggering caches for " + list + " Mediaframent " + mediafragment);
+                                LOG.info("Field '" + field.getName() + " was 
changed. Triggering caches for " + list + " Mediaframent " + mediafragment);
 
-                                    final Job thisJob = 
createJob(ntCloud.getNode(node.getNumber()),
-                                                                  
ntCloud.getNode(mediaprovider.getNumber()),
-                                                                  
ntCloud.getNode(mediafragment.getNumber()), logger);
+                                final Job thisJob = createJob(ntNode,
+                                                        mediaprovider,
+                                                        mediafragment, logger);
+                                if (thisJob != null) {
 
-
                                     // If the node happens to be deleted 
before the future with cache creations is ready, cancel the future
                                     
EventManager.getInstance().addEventListener(new WeakNodeEventListener() {
                                             public void notify(NodeEvent 
event) {
-                                                if (event.getNodeNumber() == 
node.getNumber() && event.getType() == Event.TYPE_DELETE) {
+                                                if (event.getNodeNumber() == 
ntNode.getNumber() && event.getType() == Event.TYPE_DELETE) {
                                                     if 
(thisJob.future.cancel(true)) {
                                                         logger.info("Canceled 
" + thisJob.future + " for " + event.getBuilderName() + " " + 
event.getNodeNumber());
                                                     }
@@ -351,6 +375,7 @@
                                                 return "Job canceler for " + 
node.getNumber();
                                             }
                                         });
+                                }
                             } else {
                                 LOG.warn("Node " + node.getNumber() + " is not 
real.");
                             }
@@ -383,19 +408,24 @@
         }
     }
 
+
+    private static long lastJobNumber = 0;
     public class Job {
 
         private final String user;
+        private final int nodeNumber;
         private final BufferedLogger logger;
         private final int size;
+        private final long number = lastJobNumber++;
 
-        private int busy = 0;;
+        private int busy = 0;
 
         private Future<Integer> future;
         private Transcoder transcoder;
 
-        public Job(UserContext u, ChainedLogger chain, int s) {
-            user = u.getIdentifier();
+        public Job(Node node, ChainedLogger chain, int s) {
+            user = node.getCloud().getUser().getIdentifier();
+            nodeNumber = node.getNumber();
             logger = new BufferedLogger();
             logger.setLevel(Level.DEBUG);
             logger.setMaxSize(100);
@@ -422,10 +452,20 @@
         public String getUser() {
             return user;
         }
+        public long getNumber() {
+            return number;
+        }
+        public int getNodeNumber() {
+            return nodeNumber;
+        }
 
         @Override
         public String toString() {
-            return user + ":" + transcoder + ":" + getProgress();
+            if (transcoder == null) {
+                return number + ":" + user + ":SCHEDULED:" + list;
+            } else {
+                return number + ": " + user + ":" + transcoder + ":" + 
getProgress();
+            }
         }
     }
 

Modified: 
speeltuin/mihxil/streams/src/main/java/org/mmbase/streams/transcoders/InfiniteTranscoder.java
===================================================================
--- 
speeltuin/mihxil/streams/src/main/java/org/mmbase/streams/transcoders/InfiniteTranscoder.java
       2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/java/org/mmbase/streams/transcoders/InfiniteTranscoder.java
       2009-06-05 16:40:29 UTC (rev 35794)
@@ -40,7 +40,7 @@
             }
             LOG.debug("Logging to " + log);
 
-            log.service("" + (seq++) + " " + in + " -> " + out);
+            log.debug("" + (seq++) + " " + in + " -> " + out);
         }
     }
 

Modified: 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/builders/streams/streamsources.fields.xml
===================================================================
--- 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/builders/streams/streamsources.fields.xml
     2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/builders/streams/streamsources.fields.xml
     2009-06-05 16:40:29 UTC (rev 35794)
@@ -41,7 +41,6 @@
     </datatype>
   </field>
 
-
   <xi:include href="mediaprovider.field.xml" />
 
 </fieldlist>

Modified: 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/builders/streams/streamsources.xml
===================================================================
--- 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/builders/streams/streamsources.xml
    2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/builders/streams/streamsources.xml
    2009-06-05 16:40:29 UTC (rev 35794)
@@ -16,6 +16,7 @@
 
   <xi:include 
href="http://www.mmbase.org/builders/media/mediasources.virtual.fields.xml"; />
   <xi:include 
href="http://www.mmbase.org/builders/media/mediasources.main.virtual.fields.xml";
 />
+
   <xi:include href="streamsources.fields.xml" />
   <xi:include href="streamsources.functions.xml" />
 

Modified: 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/components/streams.xml
===================================================================
--- 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/components/streams.xml
        2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/components/streams.xml
        2009-06-05 16:40:29 UTC (rev 35794)
@@ -14,6 +14,10 @@
 
   <dependency component="media" version="1" />
 
+  <action name="cancel_jobs" rank="administrator">
+    <description xml:lang="en">Whether you may cancel jobs</description>
+  </action>
+
   <block name="recent"
          classification="mmbase.examples:90 mmbase.streams"
          mimetype="text/html">
@@ -51,7 +55,9 @@
   <block name="alljobs"
          classification="mmbase.streams"
          mimetype="text/html">
-    <body jsp="alljobs.jspx" />
+    <body jsp="alljobs.jspx">
+      <param name="cancel" />
+    </body>
   </block>
 
   <block name="upload"
@@ -61,4 +67,10 @@
     <body jsp="upload.jspx" />
   </block>
 
+  <block name="test_upload"
+         classification="mmbase.streams"
+         mimetype="text/html">
+    <body jsp="test_upload.jspx" />
+  </block>
+
 </component>

Modified: 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/functions/streams.xml
===================================================================
--- 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/functions/streams.xml
 2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/resources/org/mmbase/config/functions/streams.xml
 2009-06-05 16:40:29 UTC (rev 35794)
@@ -17,4 +17,11 @@
     <method>runningJobs</method>
   </function>
 
+  <function name="cancelJob">
+    <type>class</type>
+    <class>org.mmbase.streams.CreateCachesProcessor</class>
+    <method>cancelJob</method>
+    <param name="node" type="org.mmbase.bridge.Node" />
+  </function>
+
 </functionset>

Modified: 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/alljobs.jspx
===================================================================
--- 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/alljobs.jspx 
    2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/alljobs.jspx 
    2009-06-05 16:40:29 UTC (rev 35794)
@@ -8,11 +8,24 @@
     xmlns:mm="http://www.mmbase.org/mmbase-taglib-2.0";>
 
   <jsp:output omit-xml-declaration="true" />
+  <mm:import externid="cancel" />
 
+  <c:if test="${! empty cancel}">
+    <mm:function set="streams" name="cancelJob" referids="can...@node">
+      <p>${_}</p>
+    </mm:function>
+  </c:if>
+
   <ul>
-    <mm:listfunction set="streams" name="runningJobs">
+    <mm:listfunction set="streams" name="runningJobs" id="job">
       <li>
-        <span>${_.transcoder} (${_.progress})</span>
+        <span>${_} (${_.progress}). Node ${_.nodeNumber}.</span>
+        <mm:may action="cancel_jobs">
+          <mm:link>
+            <mm:param name="cancel">${job.nodeNumber}</mm:param>
+            <a href="${_}">Cancel this job</a>
+          </mm:link>
+        </mm:may>
         <p>
           <span class="in">${_.transcoder.in}</span>
           <jsp:text> -&amp;gt; </jsp:text>

Modified: 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/myjobs.jspx
===================================================================
--- 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/myjobs.jspx  
    2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/myjobs.jspx  
    2009-06-05 16:40:29 UTC (rev 35794)
@@ -12,7 +12,7 @@
   <ul>
     <mm:listfunction set="streams" name="myJobs">
       <li>
-        <span>${_.transcoder} (${_.progress})</span>
+        <span>${_} ${_.transcoder} (${_.progress})</span>
         <p>
           <span class="in">${_.transcoder.in}</span>
           <jsp:text> -&amp;gt; </jsp:text>

Added: 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/test_upload.jspx
===================================================================
--- 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/test_upload.jspx
                         (rev 0)
+++ 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/test_upload.jspx
 2009-06-05 16:40:29 UTC (rev 35794)
@@ -0,0 +1,37 @@
+<div
+    class="mm_c c_streams b_upload ${requestScope.componentClassName}"
+    id="${requestScope.componentId}"
+    xmlns:c="http://java.sun.com/jsp/jstl/core";
+    xmlns:mm-res="urn:jsptagdir:/WEB-INF/tags/mm/resources"
+    xmlns:fn="http://java.sun.com/jsp/jstl/functions";
+    xmlns:jsp="http://java.sun.com/JSP/Page";
+    xmlns:fmt="http://java.sun.com/jsp/jstl/fmt";
+    xmlns:mm="http://www.mmbase.org/mmbase-taglib-2.0";>
+
+  <jsp:output omit-xml-declaration="true" />
+  <mm:cloud method="asis" id="cloud">
+    <mm:form commitonclose="false">
+      <mm:createnode id="newsource" type="blob_on_disk" commitonclose="false">
+        <mm:fieldlist fields="url" id="field">
+          <mm:fieldinfo type="input" />
+          <mm:fieldinfo type="errors" />
+        </mm:fieldlist>
+      </mm:createnode>
+      <input type="submit" name="submit" />
+      <mm:import externid="submit" />
+      <mm:present referid="submit">
+        <mm:valid>
+          <mm:commit />
+          <mm:import id="committed" />
+          <mm:node number="${newsource}" cloud="cloud">
+            <p>Submitted ${_node} ${_node.url}</p>
+          </mm:node>
+        </mm:valid>
+      </mm:present>
+      <mm:notpresent referid="committed">
+        <mm:cancel />
+      </mm:notpresent>
+    </mm:form>
+  </mm:cloud>
+
+</div>

Modified: 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/upload.jspx
===================================================================
--- 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/upload.jspx  
    2009-06-05 15:22:47 UTC (rev 35793)
+++ 
speeltuin/mihxil/streams/src/main/webapp/mmbase/components/streams/upload.jspx  
    2009-06-05 16:40:29 UTC (rev 35794)
@@ -10,16 +10,17 @@
 
   <jsp:output omit-xml-declaration="true" />
   <mm:import externid="fields">title,subtitle,intro</mm:import>
-  <mm:cloud method="asis">
+  <mm:cloud method="asis" id="cloud">
     <mm:maycreate type="streamsources">
 
       <script type="text/javascript">
-        <jsp:text>Widgets.prototype.labelsToInputs(".c_streams.b_upload 
label", { emptyisuntouched: true });</jsp:text>
+        <jsp:text>//Widgets.prototype.labelsToInputs(".c_streams.b_upload 
label", { emptyisuntouched: true });</jsp:text>
       </script>
       <mm:form>
         <mm:createnode id="newsource" type="streamsources" 
commitonclose="false">
           <mm:fieldlist fields="url" id="urlfield">
             <mm:fieldinfo type="input" />
+            <mm:fieldinfo type="errors" />
           </mm:fieldlist>
           <mm:fieldlist fields="${fields}" id="field">
             <mm:fieldinfo type="forid">
@@ -40,12 +41,21 @@
         <mm:present referid="submit">
           <mm:valid>
             <mm:commit />
-            <p>Submitted ${newsource} ${newsource.url}</p>
+            <mm:import id="committed" />
+            <mm:node number="${newsource}" cloud="cloud">
+              <p>Submitted ${_node} URL: ${_node.url} FS: ${_node.filesize}</p>
+            </mm:node>
+
           </mm:valid>
         </mm:present>
+        <mm:notpresent referid="committed">
+          <mm:cancel />
+        </mm:notpresent>
       </mm:form>
+      <!--
       <h2>Jobs</h2>
       <mm:component name="streams" block="myjobs" />
+      -->
     </mm:maycreate>
     <mm:maycreate type="streamsources" inverse="true">
       <fmt:message key="maynot" />

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to