Author: cziegeler
Date: Fri May  5 08:00:47 2017
New Revision: 1793978

URL: http://svn.apache.org/viewvc?rev=1793978&view=rev
Log:
SLING-5387 : Provide support for running singleton jobs on non leader cluster 
nodes also

Modified:
    
sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java
    
sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java

Modified: 
sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java?rev=1793978&r1=1793977&r2=1793978&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java
 (original)
+++ 
sling/trunk/bundles/commons/scheduler/src/main/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinter.java
 Fri May  5 08:00:47 2017
@@ -19,6 +19,7 @@
 package org.apache.sling.commons.scheduler.impl;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -55,6 +56,17 @@ public class WebConsolePrinter {
     @Reference
     private QuartzScheduler scheduler;
 
+    public static final class JobInfo {
+        public String name;
+        public String className;
+        public String description;
+        public String reason;
+        public boolean concurrent;
+        public String runOn;
+        public String[] triggers;
+        public Long bundleId;
+        public Long serviceId;
+    }
     /**
      * Print out the configuration
      * @see 
org.apache.felix.webconsole.ConfigurationPrinter#printConfiguration(java.io.PrintWriter)
@@ -76,54 +88,51 @@ public class WebConsolePrinter {
                     pw.print  ("Id        : ");
                     pw.println(s.getSchedulerInstanceId());
                     pw.println();
-                    final List<String> groups = s.getJobGroupNames();
-                    for(final String group : groups) {
+                    final List<JobInfo> activeJobs = new ArrayList<>();
+                    final List<JobInfo> disabledJobs = new ArrayList<>();
+                    for(final String group : s.getJobGroupNames()) {
                         final Set<JobKey> keys = 
s.getJobKeys(GroupMatcher.jobGroupEquals(group));
                         for(final JobKey key : keys) {
                             final JobDetail detail = s.getJobDetail(key);
                             final QuartzJobExecutor.JobDesc desc = new 
QuartzJobExecutor.JobDesc(detail.getJobDataMap());
                             // only print jobs started through the sling 
scheduler
                             if ( desc.isKnownJob() ) {
-                                pw.print("Job : ");
-                                pw.print(desc.name);
-                                if ( detail.getDescription() != null && 
detail.getDescription().length() > 0 ) {
-                                    pw.print(" (");
-                                    pw.print(detail.getDescription());
-                                    pw.print(")");
-                                }
-                                pw.print(", class: ");
-                                pw.print(desc.job.getClass().getName());
-                                pw.print(", concurrent: ");
-                                
pw.print(!detail.isConcurrentExectionDisallowed());
+                                final JobInfo info = new JobInfo();
+                                info.name = desc.name;
+                                info.className = desc.job.getClass().getName();
+                                info.concurrent = 
!detail.isConcurrentExectionDisallowed();
+                                // check run on information
                                 if ( desc.runOn != null ) {
-                                    pw.print(", runOn: ");
-                                    pw.print(Arrays.toString(desc.runOn));
-                                    // check run on information
+                                    if ( desc.isRunOnLeader() ) {
+                                        info.runOn = "LEADER";
+                                    } else if ( desc.isRunOnSingle() ) {
+                                        info.runOn = "SINGLE";
+                                    } else {
+                                        info.runOn = 
Arrays.toString(desc.runOn);
+                                    }
                                     if ( desc.isRunOnLeader() || 
desc.isRunOnSingle() ) {
                                         if ( 
QuartzJobExecutor.DISCOVERY_AVAILABLE.get() ) {
                                             if ( 
QuartzJobExecutor.DISCOVERY_INFO_AVAILABLE.get() ) {
                                                 if ( desc.isRunOnLeader() || 
QuartzJobExecutor.FORCE_LEADER.get() ) {
                                                     if ( 
!QuartzJobExecutor.IS_LEADER.get() ) {
-                                                        pw.print(" (inactive: 
not leader)");
+                                                        info.reason = "not 
leader";
                                                     }
                                                 } else {
                                                     final String id = 
desc.shouldRunAsSingleOn();
                                                     if ( id != null ) {
-                                                        pw.print(" (inactive: 
single distributed elsewhere ");
-                                                        pw.print(id);
-                                                        pw.print(")");
+                                                        info.reason = "single 
distributed elsewhere " + id;
                                                     }
                                                 }
                                             } else {
-                                                pw.print(" (inactive: no 
discovery info)");
+                                                info.reason = "no discovery 
info";
                                             }
                                         } else {
-                                            pw.print(" (inactive: no 
discovery)");
+                                            info.reason = "no discovery";
                                         }
                                     } else { // sling IDs
                                         final String myId = 
QuartzJobExecutor.SLING_ID;
                                         if ( myId == null ) {
-                                            pw.print(" (inactive: no Sling 
settings)");
+                                            info.reason = "no Sling settings";
                                         } else {
                                             boolean schedule = false;
                                             for(final String id : desc.runOn ) 
{
@@ -133,30 +142,45 @@ public class WebConsolePrinter {
                                                 }
                                             }
                                             if ( !schedule ) {
-                                                pw.print(" (inactive: Sling 
ID)");
+                                                info.reason = "Sling ID";
                                             }
                                         }
-                                    }                            }
-                                final Long bundleId = 
(Long)detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_BUNDLE_ID);
-                                if ( bundleId != null ) {
-                                    pw.print(", bundleId: ");
-                                    pw.print(String.valueOf(bundleId));
+                                    }
                                 }
-                                final Long serviceId = 
(Long)detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_SERVICE_ID);
-                                if ( serviceId != null ) {
-                                    pw.print(", serviceId: ");
-                                    pw.print(String.valueOf(serviceId));
+                                info.bundleId = 
(Long)detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_BUNDLE_ID);
+                                info.serviceId = 
(Long)detail.getJobDataMap().get(QuartzScheduler.DATA_MAP_SERVICE_ID);
+                                int index = 0;
+                                final List<? extends Trigger> triggers = 
s.getTriggersOfJob(key);
+                                info.triggers = new String[triggers.size()];
+                                for(final Trigger trigger : triggers) {
+                                    info.triggers[index] = trigger.toString();
+                                    index++;
                                 }
-                                pw.println();
-                                for(final Trigger trigger : 
s.getTriggersOfJob(key)) {
-                                    pw.print("Trigger : ");
-                                    pw.print(trigger);
-                                    pw.println();
+
+                                if ( info.reason != null ) {
+                                    disabledJobs.add(info);
+                                } else {
+                                    activeJobs.add(info);
                                 }
-                                pw.println();
                             }
                         }
                     }
+                    if ( !activeJobs.isEmpty() ) {
+                        pw.println();
+                        pw.println("Active Jobs");
+                        pw.println("-----------");
+                        for(final JobInfo info : activeJobs) {
+                            print(pw, info);
+                        }
+                    }
+                    if ( !disabledJobs.isEmpty() ) {
+                        pw.println();
+                        pw.println("Inactive Jobs");
+                        pw.println("-------------");
+                        for(final JobInfo info : disabledJobs) {
+                            print(pw, info);
+                        }
+                    }
                 } catch ( final SchedulerException se ) {
                     pw.print  ("Unable to print complete configuration: ");
                     pw.println(se.getMessage());
@@ -168,4 +192,41 @@ public class WebConsolePrinter {
         }
         pw.println();
     }
+
+    private void print(final PrintWriter pw, final JobInfo info) {
+        pw.print("Job : ");
+        pw.print(info.name);
+        if ( info.description != null ) {
+            pw.print(" (");
+            pw.print(info.description);
+            pw.print(")");
+        }
+        pw.print(", class: ");
+        pw.print(info.className);
+        pw.print(", concurrent: ");
+        pw.print(info.concurrent);
+        if ( info.runOn != null ) {
+            pw.print(", runOn: ");
+            pw.print(info.runOn);
+        }
+        if ( info.bundleId != null ) {
+            pw.print(", bundleId: ");
+            pw.print(String.valueOf(info.bundleId));
+        }
+        if ( info.serviceId != null ) {
+            pw.print(", serviceId: ");
+            pw.print(String.valueOf(info.serviceId));
+        }
+        pw.println();
+        if ( info.reason != null ) {
+            pw.print("Reason: ");
+            pw.println(info.reason);
+        }
+        for(final String trigger : info.triggers) {
+            pw.print("Trigger : ");
+            pw.print(trigger);
+            pw.println();
+        }
+        pw.println();
+    }
 }

Modified: 
sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java?rev=1793978&r1=1793977&r2=1793978&view=diff
==============================================================================
--- 
sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java
 (original)
+++ 
sling/trunk/bundles/commons/scheduler/src/test/java/org/apache/sling/commons/scheduler/impl/WebConsolePrinterTest.java
 Fri May  5 08:00:47 2017
@@ -73,6 +73,9 @@ public class WebConsolePrinterTest {
             assertRegexp(reader.readLine(), ".*ThreadPool.*testName.*");
             assertRegexp(reader.readLine(), ".*Id.*");
             reader.readLine();
+            reader.readLine();
+            assertRegexp(reader.readLine(), ".*Active.*Jobs.*");
+            reader.readLine();
             assertRegexp(reader.readLine(), "^Job.*testName[123].*");
             assertRegexp(reader.readLine(), 
"^Trigger.*Trigger.*DEFAULT.testName[123].*");
             reader.readLine();


Reply via email to