Author: ieb
Date: Fri Feb 22 04:00:37 2013
New Revision: 1448886

URL: http://svn.apache.org/r1448886
Log:
SLING-2597 Operation JMX beans for Queues with notification when new queues are 
added. Each queue is given its own MBean.

Added:
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java
   (contents, props changed)
      - copied, changed from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java
   (contents, props changed)
      - copied, changed from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java
      - copied, changed from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java
   (contents, props changed)
      - copied, changed from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
   (with props)
    
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/
    
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
   (with props)
    
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java
   (contents, props changed)
      - copied, changed from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
    
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
   (with props)
Removed:
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBeanImpl.java
Modified:
    sling/trunk/bundles/extensions/event/pom.xml
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java
    
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java
    sling/trunk/launchpad/builder/src/main/bundles/list.xml

Modified: sling/trunk/bundles/extensions/event/pom.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/pom.xml?rev=1448886&r1=1448885&r2=1448886&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/event/pom.xml (original)
+++ sling/trunk/bundles/extensions/event/pom.xml Fri Feb 22 04:00:37 2013
@@ -44,6 +44,7 @@
 
     <properties>
         <site.jira.version.id>12315369</site.jira.version.id>
+        <sling.java.version>6</sling.java.version>
     </properties>
 
     <build>
@@ -67,7 +68,8 @@
                         </Import-Package>
                         <Export-Package>
                             org.apache.sling.event;version=2.4.0,
-                            org.apache.sling.event.jobs;version=1.1.0
+                            org.apache.sling.event.jobs;version=1.1.0,
+                            org.apache.sling.event.jobs.jmx;version=1.0.0
                         </Export-Package>
                         <Private-Package>
                             org.apache.sling.event.impl.*
@@ -204,6 +206,12 @@
             <artifactId>slf4j-simple</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>1.9.5</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.apache.jackrabbit</groupId>
             <artifactId>jackrabbit-core</artifactId>
             <version>2.2.4</version>

Copied: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java
 (from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java)
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java?p2=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AbstractJobStatistics.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java
 Fri Feb 22 04:00:37 2013
@@ -15,13 +15,14 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
  */
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
 
 import java.util.Date;
 
 import javax.management.StandardMBean;
 
 import org.apache.sling.event.jobs.Statistics;
+import org.apache.sling.event.jobs.jmx.StatisticsMBean;
 
 public abstract class AbstractJobStatistics extends StandardMBean implements
         StatisticsMBean {
@@ -30,66 +31,66 @@ public abstract class AbstractJobStatist
         super(StatisticsMBean.class, false);
     }
 
-    protected abstract Statistics getAggregateStatistics();
+    protected abstract Statistics getStatistics();
 
     public long getAverageProcessingTime() {
-        return getAggregateStatistics().getAverageProcessingTime();
+        return getStatistics().getAverageProcessingTime();
     }
 
     public long getAverageWaitingTime() {
-        return getAggregateStatistics().getAverageWaitingTime();
+        return getStatistics().getAverageWaitingTime();
     }
 
     public long getLastActivatedJobTime() {
-        return getAggregateStatistics().getLastActivatedJobTime();
+        return getStatistics().getLastActivatedJobTime();
     }
 
     public long getLastFinishedJobTime() {
-        return getAggregateStatistics().getLastFinishedJobTime();
+        return getStatistics().getLastFinishedJobTime();
     }
 
     public long getNumberOfActiveJobs() {
-        return getAggregateStatistics().getNumberOfActiveJobs();
+        return getStatistics().getNumberOfActiveJobs();
     }
 
     public long getNumberOfCancelledJobs() {
-        return getAggregateStatistics().getNumberOfCancelledJobs();
+        return getStatistics().getNumberOfCancelledJobs();
     }
 
     public long getStartTime() {
-        return getAggregateStatistics().getStartTime();
+        return getStatistics().getStartTime();
     }
 
     public long getNumberOfFinishedJobs() {
-        return getAggregateStatistics().getNumberOfFinishedJobs();
+        return getStatistics().getNumberOfFinishedJobs();
     }
 
     public long getNumberOfFailedJobs() {
-        return getAggregateStatistics().getNumberOfFailedJobs();
+        return getStatistics().getNumberOfFailedJobs();
     }
 
     public long getNumberOfProcessedJobs() {
-        return getAggregateStatistics().getNumberOfProcessedJobs();
+        return getStatistics().getNumberOfProcessedJobs();
     }
 
     public long getNumberOfQueuedJobs() {
-        return getAggregateStatistics().getNumberOfQueuedJobs();
+        return getStatistics().getNumberOfQueuedJobs();
     }
 
     public long getNumberOfJobs() {
-        return getAggregateStatistics().getNumberOfJobs();
+        return getStatistics().getNumberOfJobs();
     }
 
     public void reset() {
-        getAggregateStatistics().reset();
+        getStatistics().reset();
     }
 
     public Date getLastActivatedJobDate() {
-        return new Date(getAggregateStatistics().getLastActivatedJobTime());
+        return new Date(getStatistics().getLastActivatedJobTime());
     }
 
     public Date getLastFinishedJobDate() {
-        return new Date(getAggregateStatistics().getLastFinishedJobTime());
+        return new Date(getStatistics().getLastFinishedJobTime());
     }
 
 }

Propchange: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AbstractJobStatistics.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java
 (from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java)
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java?p2=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/AllJobStatisticsMBean.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java
 Fri Feb 22 04:00:37 2013
@@ -15,7 +15,7 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
  */
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
 
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Properties;
@@ -24,11 +24,11 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.event.jobs.JobManager;
 import org.apache.sling.event.jobs.Statistics;
+import org.apache.sling.event.jobs.jmx.StatisticsMBean;
 
-@Component(immediate = true, enabled = false)
-// disabled while dev in progress.
+@Component(immediate = true)
 @Service(value = StatisticsMBean.class)
-@Properties(@Property(name = "jmx.objectname", value = 
"org.apache.sling.event.AllJobs;type=Statistics"))
+@Properties(@Property(name = "jmx.objectname", value = 
"org.apache.sling.event.AllJobs:type=Statistics"))
 public class AllJobStatisticsMBean extends AbstractJobStatistics {
     private static final long TTL = 1000L;
     private long agregateStatisticsTTL = 0L;
@@ -39,7 +39,7 @@ public class AllJobStatisticsMBean exten
     /**
      * @return the aggregate stats from the job manager.
      */
-    protected Statistics getAggregateStatistics() {
+    protected Statistics getStatistics() {
         if (System.currentTimeMillis() > agregateStatisticsTTL) {
             aggregateStatistics = jobManager.getStatistics();
             agregateStatisticsTTL = System.currentTimeMillis() + TTL;
@@ -47,4 +47,8 @@ public class AllJobStatisticsMBean exten
         return aggregateStatistics;
     }
 
+    public String getName() {
+        return "All Queues";
+    }
+
 }

Propchange: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBean.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java
 (from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java)
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java?p2=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/EmptyStatistics.java
 Fri Feb 22 04:00:37 2013
@@ -15,10 +15,14 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
  */
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
 
 import org.apache.sling.event.jobs.Statistics;
 
+/**
+ * Dummy stats that just returns 0 for all info, used where the queue doesnt
+ * implement the Statistics interface.
+ */
 public class EmptyStatistics implements Statistics {
 
     public long getStartTime() {

Copied: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java
 (from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java)
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java?p2=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueueMBeanImpl.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java
 Fri Feb 22 04:00:37 2013
@@ -15,11 +15,14 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
  */
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
 
 import org.apache.sling.event.jobs.Queue;
 import org.apache.sling.event.jobs.Statistics;
 
+/**
+ * An MBean that provides statistics from 
+ */
 public class QueueMBeanImpl extends AbstractJobStatistics {
 
     private Queue queue;
@@ -40,11 +43,15 @@ public class QueueMBeanImpl extends Abst
     }
 
     @Override
-    protected Statistics getAggregateStatistics() {
+    protected Statistics getStatistics() {
         if (queue instanceof Statistics) {
             return (Statistics) queue;
         }
         return emptyStatistics;
     }
 
+    public String getName() {
+        return queue.getName();
+    }
+
 }

Propchange: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueueMBeanImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java?rev=1448886&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
 (added)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
 Fri Feb 22 04:00:37 2013
@@ -0,0 +1,198 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The SF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.sling.event.impl.jobs.jmx;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Dictionary;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import javax.management.AttributeChangeNotification;
+import javax.management.MBeanNotificationInfo;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.StandardEmitterMBean;
+
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Properties;
+import org.apache.felix.scr.annotations.Property;
+import org.apache.felix.scr.annotations.Service;
+import org.apache.sling.event.impl.jobs.QueueStatusEvent;
+import org.apache.sling.event.jobs.Queue;
+import org.apache.sling.event.jobs.jmx.QueuesMBean;
+import org.apache.sling.event.jobs.jmx.StatisticsMBean;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventHandler;
+
+@Component(immediate = true)
+@Service(value = { QueuesMBean.class, EventHandler.class })
+@Properties({
+        @Property(name = "jmx.objectname", propertyPrivate = true, value = 
"org.apache.sling.event.Queues:type=Statistics"),
+        @Property(name = "event.topics", propertyPrivate = true, value = { 
QueueStatusEvent.TOPIC }) })
+public class QueuesMBeanImpl extends StandardEmitterMBean implements
+        QueuesMBean, EventHandler {
+
+    private static final String QUEUE_NOTIFICATION = 
"org.apache.sling.event.queue";
+    private static final String[] NOTIFICATION_TYPES = { QUEUE_NOTIFICATION };
+    private Map<String, QueueMBeanHolder> queues = new 
ConcurrentHashMap<String, QueueMBeanHolder>();
+    private String[] names;
+    private AtomicLong sequence = new AtomicLong(System.currentTimeMillis());
+    private BundleContext bundleContext;
+
+    class QueueMBeanHolder {
+
+        QueueMBeanHolder(String name, QueueMBeanImpl queueMBean,
+                ServiceRegistration registration) {
+            this.name = name;
+            this.queueMBean = queueMBean;
+            this.registration = registration;
+        }
+
+        QueueMBeanImpl queueMBean;
+        ServiceRegistration registration;
+        String name;
+
+    }
+
+    public QueuesMBeanImpl() {
+        super(QueuesMBean.class, false, new NotificationBroadcasterSupport(
+                new MBeanNotificationInfo(NOTIFICATION_TYPES,
+                        Notification.class.getName(),
+                        "Notifications about queues")));
+    }
+
+    @Activate
+    public void activate(ComponentContext componentContext) {
+        bundleContext = componentContext.getBundleContext();
+    }
+
+    @Deactivate
+    public void deactivate(ComponentContext componentContext) {
+
+    }
+
+    public void handleEvent(Event event) {
+        if (event instanceof QueueStatusEvent) {
+            QueueStatusEvent e = (QueueStatusEvent) event;
+            if (e.isNew()) {
+                bindQueueMBean(e);
+            } else if (e.isRemoved()) {
+                unbindQueueMBean(e);
+            } else {
+                updateQueueMBean(e);
+            }
+        }
+    }
+
+    private void updateQueueMBean(QueueStatusEvent e) {
+        QueueMBeanHolder queueMBeanHolder = queues.get(e.getQueue().getName());
+        if (queueMBeanHolder != null) {
+            String[] oldQueue = getQueueNames();
+            queueMBeanHolder.queueMBean.notifyUpdate(e.getQueue());
+            names = null;
+            this.sendNotification(new AttributeChangeNotification(this,
+                    sequence.incrementAndGet(), System.currentTimeMillis(),
+                    "Queue " + e.getQueue().getName() + " updated ",
+                    "queueNames", "String[]", oldQueue, getQueueNames()));
+
+        }
+    }
+
+    private void unbindQueueMBean(QueueStatusEvent e) {
+        QueueMBeanHolder queueMBeanHolder = 
queues.get(e.getOldQueue().getName());
+        if (queueMBeanHolder != null) {
+            removeAndNotify(queueMBeanHolder);
+        }
+    }
+
+    private void bindQueueMBean(QueueStatusEvent e) {
+        QueueMBeanHolder queueMBeanHolder = queues.get(e.getQueue().getName());
+        if (queueMBeanHolder != null) {
+            removeAndNotify(queueMBeanHolder);
+        }
+        addAndNotify(e.getQueue());
+    }
+
+    private void addAndNotify(Queue queue) {
+        String[] oldQueue = getQueueNames();
+        QueueMBeanHolder queueMBeanHolder = add(queue);
+        names = null;
+        this.sendNotification(new AttributeChangeNotification(this, sequence
+                .incrementAndGet(), System.currentTimeMillis(), "Queue "
+                + queueMBeanHolder.name + " added ", "queueNames", "String[]",
+                oldQueue, getQueueNames()));
+    }
+
+    private void removeAndNotify(QueueMBeanHolder queueMBeanHolder) {
+        String[] oldQueue = getQueueNames();
+        remove(queueMBeanHolder);
+        names = null;
+        this.sendNotification(new AttributeChangeNotification(this, sequence
+                .incrementAndGet(), System.currentTimeMillis(), "Queue "
+                + queueMBeanHolder.name + " removed ", "queueNames",
+                "String[]", oldQueue, getQueueNames()));
+    }
+
+    private QueueMBeanHolder add(Queue queue) {
+        QueueMBeanImpl queueMBean = new QueueMBeanImpl(queue);
+        ServiceRegistration serviceRegistration = bundleContext
+                .registerService(StatisticsMBean.class.getName(), queueMBean,
+                        createProperties(
+                                
"jmx.objectname","org.apache.sling.event.queue."+queue.getName()+":type=Statistics",
+                                Constants.SERVICE_DESCRIPTION, "QueueMBean for 
queue "+queue.getName(),
+                                Constants.SERVICE_VENDOR,"Apache"));
+        QueueMBeanHolder queueMBeanHolder = new QueueMBeanHolder(
+                queue.getName(), queueMBean, serviceRegistration);
+        queues.put(queueMBeanHolder.name, queueMBeanHolder);
+        return queueMBeanHolder;
+    }
+
+    private Dictionary<String, Object> createProperties(Object ... values) {
+        Dictionary<String, Object> props = new Hashtable<String, Object>();
+        for ( int i = 0; i < values.length; i+=2) {
+            props.put((String) values[i], values[i+1]);
+        }
+        return props;
+    }
+
+    private void remove(QueueMBeanHolder queueMBeanHolder) {
+        queueMBeanHolder.queueMBean.notifyRemove();
+        queueMBeanHolder.registration.unregister();
+        queues.remove(queueMBeanHolder.name);
+    }
+
+    public String[] getQueueNames() {
+        if (names == null) {
+            List<String> lnames = new ArrayList<String>(queues.keySet());
+            Collections.sort(lnames);
+            names = lnames.toArray(new String[lnames.size()]);
+        }
+        return names;
+    }
+
+}

Propchange: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java?rev=1448886&r1=1448885&r2=1448886&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/QueuesMBean.java
 Fri Feb 22 04:00:37 2013
@@ -23,4 +23,6 @@ package org.apache.sling.event.jobs.jmx;
  */
 public interface QueuesMBean {
 
+    String[] getQueueNames();
+
 }

Modified: 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java?rev=1448886&r1=1448885&r2=1448886&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/StatisticsMBean.java
 Fri Feb 22 04:00:37 2013
@@ -27,4 +27,6 @@ public interface StatisticsMBean extends
 
     Date getLastFinishedJobDate();
 
+    String getName();
+
 }

Added: 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java?rev=1448886&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
 (added)
+++ 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
 Fri Feb 22 04:00:37 2013
@@ -0,0 +1,70 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The SF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http:www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.sling.event.impl.jobs.jmx;
+
+import java.util.Date;
+
+import junit.framework.Assert;
+import junitx.util.PrivateAccessor;
+
+import org.apache.sling.event.jobs.JobManager;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+
+public class AllJobStatisticsMBeanTest {
+
+    private AllJobStatisticsMBean mbean;
+    @Mock
+    private JobManager jobManager;
+    private long seed;
+
+    public AllJobStatisticsMBeanTest() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Before
+    public void setup() throws NoSuchFieldException {
+        mbean = new AllJobStatisticsMBean();
+        PrivateAccessor.setField(mbean, "jobManager", jobManager);
+        seed = System.currentTimeMillis();
+        Mockito.when(jobManager.getStatistics()).thenReturn(
+                new DummyStatistics(seed));
+    }
+
+    @Test
+    public void testStatistics() {
+        Assert.assertEquals(seed + 1, mbean.getStartTime());
+        Assert.assertEquals(seed + 2, mbean.getNumberOfFinishedJobs());
+        Assert.assertEquals(seed + 3, mbean.getNumberOfCancelledJobs());
+        Assert.assertEquals(seed + 4, mbean.getNumberOfFailedJobs());
+        Assert.assertEquals(seed + 5, mbean.getNumberOfProcessedJobs());
+        Assert.assertEquals(seed + 6, mbean.getNumberOfActiveJobs());
+        Assert.assertEquals(seed + 7, mbean.getNumberOfQueuedJobs());
+        Assert.assertEquals(seed + 8, mbean.getNumberOfJobs());
+        Assert.assertEquals(seed + 9, mbean.getLastActivatedJobTime());
+        Assert.assertEquals(new Date(seed + 9), 
mbean.getLastActivatedJobDate());
+        Assert.assertEquals(seed + 10, mbean.getLastFinishedJobTime());
+        Assert.assertEquals(new Date(seed + 10), 
mbean.getLastFinishedJobDate());
+        Assert.assertEquals(seed + 11, mbean.getAverageWaitingTime());
+        Assert.assertEquals(seed + 12, mbean.getAverageProcessingTime());
+    }
+
+}

Propchange: 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/AllJobStatisticsMBeanTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Copied: 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java
 (from r1448641, 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java)
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java?p2=sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java&p1=sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java&r1=1448641&r2=1448886&rev=1448886&view=diff
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/main/java/org/apache/sling/event/jobs/jmx/EmptyStatistics.java
 (original)
+++ 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java
 Fri Feb 22 04:00:37 2013
@@ -15,58 +15,67 @@
  * KIND, either express or implied. See the License for the
  * specific language governing permissions and limitations under the License.
  */
-package org.apache.sling.event.jobs.jmx;
+package org.apache.sling.event.impl.jobs.jmx;
 
 import org.apache.sling.event.jobs.Statistics;
 
-public class EmptyStatistics implements Statistics {
+/**
+ * Dummy statistics for testing purposes.
+ */
+public class DummyStatistics implements Statistics {
+
+    private long base;
 
+    public DummyStatistics(long base) {
+        this.base = base;
+        
+    }
     public long getStartTime() {
-        return 0;
+        return base+1;
     }
 
     public long getNumberOfFinishedJobs() {
-        return 0;
+        return base+2;
     }
 
     public long getNumberOfCancelledJobs() {
-        return 0;
+        return base+3;
     }
 
     public long getNumberOfFailedJobs() {
-        return 0;
+        return base+4;
     }
 
     public long getNumberOfProcessedJobs() {
-        return 0;
+        return base+5;
     }
 
     public long getNumberOfActiveJobs() {
-        return 0;
+        return base+6;
     }
 
     public long getNumberOfQueuedJobs() {
-        return 0;
+        return base+7;
     }
 
     public long getNumberOfJobs() {
-        return 0;
+        return base+8;
     }
 
     public long getLastActivatedJobTime() {
-        return 0;
+        return base+9;
     }
 
     public long getLastFinishedJobTime() {
-        return 0;
+        return base+10;
     }
 
     public long getAverageWaitingTime() {
-        return 0;
+        return base+11;
     }
 
     public long getAverageProcessingTime() {
-        return 0;
+        return base+12;
     }
 
     public void reset() {

Propchange: 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/DummyStatistics.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java?rev=1448886&view=auto
==============================================================================
--- 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
 (added)
+++ 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
 Fri Feb 22 04:00:37 2013
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The SF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations under the License.
+ */
+package org.apache.sling.event.impl.jobs.jmx;
+
+import java.util.Date;
+import java.util.Dictionary;
+
+import junit.framework.Assert;
+
+import org.apache.sling.event.impl.jobs.QueueStatusEvent;
+import org.apache.sling.event.jobs.Queue;
+import org.apache.sling.event.jobs.Statistics;
+import org.apache.sling.event.jobs.jmx.StatisticsMBean;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.component.ComponentContext;
+
+public class QueuesMBeanImplTest {
+ 
+    private QueuesMBeanImpl mbean;
+    @Mock
+    private BundleContext bundleContext;
+    @Mock
+    private ComponentContext componentContext;
+    @Captor
+    private ArgumentCaptor<String> serviceClass;
+    @Captor
+    private ArgumentCaptor<Object> serviceObject;
+    @SuppressWarnings("rawtypes")
+    @Captor
+    private ArgumentCaptor<Dictionary> serviceProperties;
+    @Mock
+    private ServiceRegistration serviceRegistration;
+    
+    public QueuesMBeanImplTest() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Before
+    public void setup() throws NoSuchFieldException {
+        mbean = new QueuesMBeanImpl();
+        
Mockito.when(componentContext.getBundleContext()).thenReturn(bundleContext);
+        mbean.activate(componentContext);
+    }
+    
+    
+    @Test
+    public void testAddQueue() {
+        addQueue();
+    }
+    
+    public Queue addQueue() {
+        Queue queue = Mockito.mock(Queue.class, 
Mockito.withSettings().extraInterfaces(Statistics.class));
+        mockStatistics((Statistics) queue);
+        Mockito.when(queue.getName()).thenReturn("queue-name");
+        Mockito.when(bundleContext.registerService(Mockito.anyString(), 
Mockito.any(StatisticsMBean.class), 
Mockito.any(Dictionary.class))).thenReturn(serviceRegistration);
+        mbean.handleEvent(new QueueStatusEvent(queue,null));
+        Mockito.verify(bundleContext, 
Mockito.only()).registerService(serviceClass.capture(), 
serviceObject.capture(), serviceProperties.capture());
+        Assert.assertEquals("Expected bean to be registerd as a 
StatisticsMBean ", StatisticsMBean.class.getName(), serviceClass.getValue());
+        Assert.assertTrue("Expected service to be an instance of 
SatisticsMBean", serviceObject.getValue() instanceof StatisticsMBean);
+        Assert.assertNotNull("Expected properties to have a jmx.objectname", 
serviceProperties.getValue().get("jmx.objectname"));
+        testStatistics((StatisticsMBean) serviceObject.getValue());
+        return queue;
+    }
+    
+
+    @Test
+    public void updateQueue() {
+        Queue firstQueue = addQueue();
+        Queue queue = Mockito.mock(Queue.class, 
Mockito.withSettings().extraInterfaces(Statistics.class));
+        Mockito.when(queue.getName()).thenReturn("queue-name-changed");
+        Mockito.reset(bundleContext);
+        mbean.handleEvent(new QueueStatusEvent(queue,firstQueue));
+        Mockito.verify(bundleContext, 
Mockito.never()).registerService(serviceClass.capture(), 
serviceObject.capture(), serviceProperties.capture());
+    }
+    
+    @Test
+    public void removeQueue() {
+        Queue firstQueue = addQueue();
+        mbean.handleEvent(new QueueStatusEvent(null,firstQueue));
+        Mockito.verify(serviceRegistration, Mockito.only()).unregister();
+        
+    }
+
+    private void mockStatistics(Statistics queue) {
+        Mockito.when(queue.getStartTime()).thenReturn(1L);
+        Mockito.when(queue.getNumberOfFinishedJobs()).thenReturn(2L);
+        Mockito.when(queue.getNumberOfCancelledJobs()).thenReturn(3L);
+        Mockito.when(queue.getNumberOfFailedJobs()).thenReturn(4L);
+        Mockito.when(queue.getNumberOfProcessedJobs()).thenReturn(5L);
+        Mockito.when(queue.getNumberOfActiveJobs()).thenReturn(6L);
+        Mockito.when(queue.getNumberOfQueuedJobs()).thenReturn(7L);
+        Mockito.when(queue.getNumberOfJobs()).thenReturn(8L);
+        Mockito.when(queue.getLastActivatedJobTime()).thenReturn(9L);
+        Mockito.when(queue.getLastFinishedJobTime()).thenReturn(10L);
+        Mockito.when(queue.getAverageWaitingTime()).thenReturn(11L);
+        Mockito.when(queue.getAverageProcessingTime()).thenReturn(12L);
+    }
+
+    public void testStatistics(StatisticsMBean statisticsMbean) {
+        Assert.assertEquals(1, statisticsMbean.getStartTime());
+        Assert.assertEquals(2, statisticsMbean.getNumberOfFinishedJobs());
+        Assert.assertEquals(3, statisticsMbean.getNumberOfCancelledJobs());
+        Assert.assertEquals(4, statisticsMbean.getNumberOfFailedJobs());
+        Assert.assertEquals(5, statisticsMbean.getNumberOfProcessedJobs());
+        Assert.assertEquals(6, statisticsMbean.getNumberOfActiveJobs());
+        Assert.assertEquals(7, statisticsMbean.getNumberOfQueuedJobs());
+        Assert.assertEquals(8, statisticsMbean.getNumberOfJobs());
+        Assert.assertEquals(9, statisticsMbean.getLastActivatedJobTime());
+        Assert.assertEquals(new Date(9), 
statisticsMbean.getLastActivatedJobDate());        
+        Assert.assertEquals(10, statisticsMbean.getLastFinishedJobTime());
+        Assert.assertEquals(new Date(10), 
statisticsMbean.getLastFinishedJobDate());
+        Assert.assertEquals(11, statisticsMbean.getAverageWaitingTime());
+        Assert.assertEquals(12, statisticsMbean.getAverageProcessingTime());
+    }
+
+
+}

Propchange: 
sling/trunk/bundles/extensions/event/src/test/java/org/apache/sling/event/impl/jobs/jmx/QueuesMBeanImplTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: sling/trunk/launchpad/builder/src/main/bundles/list.xml
URL: 
http://svn.apache.org/viewvc/sling/trunk/launchpad/builder/src/main/bundles/list.xml?rev=1448886&r1=1448885&r2=1448886&view=diff
==============================================================================
--- sling/trunk/launchpad/builder/src/main/bundles/list.xml (original)
+++ sling/trunk/launchpad/builder/src/main/bundles/list.xml Fri Feb 22 04:00:37 
2013
@@ -65,7 +65,7 @@
         <bundle>
             <groupId>org.apache.sling</groupId>
             <artifactId>org.apache.sling.event</artifactId>
-            <version>3.1.4</version>
+            <version>3.1.5-SNAPSHOT</version>
         </bundle>
 
         <bundle>


Reply via email to