Return-Path: Delivered-To: apmail-incubator-aries-commits-archive@minotaur.apache.org Received: (qmail 87063 invoked from network); 13 Jan 2010 22:01:30 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 13 Jan 2010 22:01:30 -0000 Received: (qmail 29070 invoked by uid 500); 13 Jan 2010 22:01:30 -0000 Delivered-To: apmail-incubator-aries-commits-archive@incubator.apache.org Received: (qmail 28987 invoked by uid 500); 13 Jan 2010 22:01:30 -0000 Mailing-List: contact aries-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: aries-dev@incubator.apache.org Delivered-To: mailing list aries-commits@incubator.apache.org Received: (qmail 28977 invoked by uid 99); 13 Jan 2010 22:01:30 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 13 Jan 2010 22:01:30 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 13 Jan 2010 22:01:19 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id E04A32388978; Wed, 13 Jan 2010 22:00:58 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r898958 - in /incubator/aries/trunk/jmx: jmx-core/src/main/java/org/apache/aries/jmx/framework/ jmx-itests/src/test/java/org/apache/aries/jmx/framework/ Date: Wed, 13 Jan 2010 22:00:58 -0000 To: aries-commits@incubator.apache.org From: atk@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20100113220058.E04A32388978@eris.apache.org> Author: atk Date: Wed Jan 13 22:00:58 2010 New Revision: 898958 URL: http://svn.apache.org/viewvc?rev=898958&view=rev Log: ARIES-35 Adding integration tests and updating handler close Added: incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java (with props) Modified: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceState.java incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceStateMBeanHandler.java Modified: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceState.java URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceState.java?rev=898958&r1=898957&r2=898958&view=diff ============================================================================== --- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceState.java (original) +++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceState.java Wed Jan 13 22:00:58 2010 @@ -23,6 +23,7 @@ import java.io.IOException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionException; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; @@ -150,8 +151,7 @@ */ public void postDeregister() { if (registrations.decrementAndGet() < 1) { - bundleContext.removeServiceListener(serviceListener); - eventDispatcher.shutdown(); + shutDownDispatcher(); } } @@ -187,6 +187,9 @@ sendNotification(notification); } }); + } catch (RejectedExecutionException re) { + logger.log(LogService.LOG_WARNING, "Task rejected for JMX Notification dispatch of event [" + + serviceevent + "] - Dispatcher may have been shutdown"); } catch (Exception e) { logger.log(LogService.LOG_WARNING, "Exception occured on JMX Notification dispatch for event [" + serviceevent + "]", @@ -202,9 +205,21 @@ } /* + * Shuts down the notification dispatcher + */ + protected void shutDownDispatcher() { + if (serviceListener != null) { + bundleContext.removeServiceListener(serviceListener); + } + if (eventDispatcher != null) { + eventDispatcher.shutdown(); + } + } + + /* * Returns the ExecutorService used to dispatch Notifications */ - public ExecutorService getEventDispatcher() { + protected ExecutorService getEventDispatcher() { return eventDispatcher; } Modified: incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceStateMBeanHandler.java URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceStateMBeanHandler.java?rev=898958&r1=898957&r2=898958&view=diff ============================================================================== --- incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceStateMBeanHandler.java (original) +++ incubator/aries/trunk/jmx/jmx-core/src/main/java/org/apache/aries/jmx/framework/ServiceStateMBeanHandler.java Wed Jan 13 22:00:58 2010 @@ -40,6 +40,7 @@ private String name; private StandardMBean mbean; + private ServiceState serviceStateMBean; private BundleContext bundleContext; private Logger logger; @@ -54,7 +55,7 @@ * @see org.apache.aries.jmx.MBeanHandler#open() */ public void open() { - ServiceStateMBean serviceStateMBean = new ServiceState(bundleContext, logger); + serviceStateMBean = new ServiceState(bundleContext, logger); try { mbean = new RegistrableStandardEmitterMBean(serviceStateMBean, ServiceStateMBean.class); } catch (NotCompliantMBeanException e) { @@ -80,7 +81,10 @@ * @see org.apache.aries.jmx.MBeanHandler#close() */ public void close() { - // No action + // ensure dispatcher is shutdown even if postDeRegister is not honored + if (serviceStateMBean != null) { + serviceStateMBean.shutDownDispatcher(); + } } Added: incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java URL: http://svn.apache.org/viewvc/incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java?rev=898958&view=auto ============================================================================== --- incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java (added) +++ incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java Wed Jan 13 22:00:58 2010 @@ -0,0 +1,232 @@ +/** + * 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 ASF 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.aries.jmx.framework; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; +import static org.ops4j.pax.exam.CoreOptions.provision; +import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.modifyBundle; +import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.newBundle; +import static org.ops4j.pax.swissbox.tinybundles.core.TinyBundles.withBnd; + +import java.io.InputStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.management.InstanceNotFoundException; +import javax.management.Notification; +import javax.management.NotificationListener; +import javax.management.ObjectName; +import javax.management.openmbean.TabularData; + +import org.apache.aries.jmx.AbstractIntegrationTest; +import org.apache.aries.jmx.codec.PropertyData; +import org.apache.aries.jmx.test.bundlea.api.InterfaceA; +import org.apache.aries.jmx.test.bundleb.api.InterfaceB; +import org.junit.Before; +import org.junit.Test; +import org.ops4j.pax.exam.CoreOptions; +import org.ops4j.pax.exam.Customizer; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.Configuration; +import org.osgi.framework.Bundle; +import org.osgi.framework.Constants; +import org.osgi.framework.ServiceReference; +import org.osgi.jmx.JmxConstants; +import org.osgi.jmx.framework.ServiceStateMBean; +import org.osgi.service.cm.ManagedService; +import org.osgi.service.cm.ManagedServiceFactory; + +/** + * + * + * @version $Rev$ $Date$ + */ +public class ServiceStateMBeanTest extends AbstractIntegrationTest { + + @Configuration + public static Option[] configuration() { + Option[] options = CoreOptions + .options( + CoreOptions.equinox(), + mavenBundle("org.apache.felix", "org.apache.felix.configadmin"), + mavenBundle("org.ops4j.pax.logging", "pax-logging-api"), + mavenBundle("org.ops4j.pax.logging", "pax-logging-service"), + mavenBundle("org.osgi", "org.osgi.compendium"), + mavenBundle("org.apache.aries.jmx", "org.apache.aries.jmx"), + new Customizer() { + public InputStream customizeTestProbe(InputStream testProbe) throws Exception { + return modifyBundle(testProbe) + .removeHeader(Constants.DYNAMICIMPORT_PACKAGE) + .set(Constants.REQUIRE_BUNDLE, "org.apache.aries.jmx.test.bundlea,org.apache.aries.jmx.test.bundleb") + .build(withBnd()); + } + }, + provision(newBundle() + .add(org.apache.aries.jmx.test.bundlea.Activator.class) + .add(org.apache.aries.jmx.test.bundlea.api.InterfaceA.class) + .add(org.apache.aries.jmx.test.bundlea.impl.A.class) + .set(Constants.BUNDLE_SYMBOLICNAME, "org.apache.aries.jmx.test.bundlea") + .set(Constants.BUNDLE_VERSION, "2.0.0") + .set(Constants.EXPORT_PACKAGE, "org.apache.aries.jmx.test.bundlea.api;version=2.0.0") + .set(Constants.IMPORT_PACKAGE, + "org.osgi.framework;version=1.5.0,org.osgi.util.tracker,org.apache.aries.jmx.test.bundleb.api;version=1.1.0;resolution:=optional" + + ",org.osgi.service.cm") + .set(Constants.BUNDLE_ACTIVATOR, + org.apache.aries.jmx.test.bundlea.Activator.class.getName()) + .build(withBnd())), + provision(newBundle() + .add(org.apache.aries.jmx.test.bundleb.Activator.class) + .add(org.apache.aries.jmx.test.bundleb.api.InterfaceB.class) + .add(org.apache.aries.jmx.test.bundleb.api.MSF.class) + .add(org.apache.aries.jmx.test.bundleb.impl.B.class) + .set(Constants.BUNDLE_SYMBOLICNAME,"org.apache.aries.jmx.test.bundleb") + .set(Constants.BUNDLE_VERSION, "1.0.0") + .set(Constants.EXPORT_PACKAGE,"org.apache.aries.jmx.test.bundleb.api;version=1.1.0") + .set(Constants.IMPORT_PACKAGE,"org.osgi.framework;version=1.5.0,org.osgi.util.tracker" + + ",org.osgi.service.cm") + .set(Constants.BUNDLE_ACTIVATOR, + org.apache.aries.jmx.test.bundleb.Activator.class.getName()) + .build(withBnd())) + ); + options = updateOptions(options); + return options; + } + + @Before + public void doSetUp() throws Exception { + super.setUp(); + int i=0; + while (true) { + try { + mbeanServer.getObjectInstance(new ObjectName(ServiceStateMBean.OBJECTNAME)); + break; + } catch (InstanceNotFoundException e) { + if (i == 5) { + throw new Exception("ServiceStateMBean not available after waiting 5 seconds"); + } + } + i++; + Thread.sleep(1000); + } + } + + + @Test + public void testMBeanInterface() throws Exception { + + ServiceStateMBean mbean = getMBean(ServiceStateMBean.OBJECTNAME, ServiceStateMBean.class); + assertNotNull(mbean); + + //get bundles + + Bundle a = getBundle("org.apache.aries.jmx.test.bundlea"); + assertNotNull(a); + + Bundle b = getBundle("org.apache.aries.jmx.test.bundleb"); + assertNotNull(b); + + // get services + + ServiceReference refA = bundleContext.getServiceReference(InterfaceA.class.getName()); + assertNotNull(refA); + long serviceAId = (Long) refA.getProperty(Constants.SERVICE_ID); + assertTrue(serviceAId > -1); + + ServiceReference refB = bundleContext.getServiceReference(InterfaceB.class.getName()); + assertNotNull(refB); + long serviceBId = (Long) refB.getProperty(Constants.SERVICE_ID); + assertTrue(serviceBId > -1); + + ServiceReference[] refs = bundleContext.getServiceReferences(ManagedServiceFactory.class.getName(), "(" + Constants.SERVICE_PID + "=jmx.test.B.factory)"); + assertNotNull(refs); + assertEquals(1, refs.length); + ServiceReference msf = refs[0]; + + + // getBundleIdentifier + + assertEquals(a.getBundleId(), mbean.getBundleIdentifier(serviceAId)); + + //getObjectClass + + String[] objectClass = mbean.getObjectClass(serviceAId); + assertEquals(2, objectClass.length); + List classNames = Arrays.asList(objectClass); + assertTrue(classNames.contains(InterfaceA.class.getName())); + assertTrue(classNames.contains(ManagedService.class.getName())); + + // getProperties + + TabularData serviceProperties = mbean.getProperties(serviceBId); + assertNotNull(serviceProperties); + assertEquals(JmxConstants.PROPERTIES_TYPE, serviceProperties.getTabularType()); + assertTrue(serviceProperties.values().size() > 1); + assertEquals("org.apache.aries.jmx.test.ServiceB", + PropertyData.from(serviceProperties.get(new Object[] { Constants.SERVICE_PID })).getValue()); + + // getUsingBundles + + long[] usingBundles = mbean.getUsingBundles(serviceBId); + assertEquals(1, usingBundles.length); + assertEquals(a.getBundleId(), usingBundles[0]); + + // listServices + + TabularData allServices = mbean.listServices(); + assertNotNull(allServices); + assertEquals(bundleContext.getAllServiceReferences(null, null).length, allServices.values().size()); + + // notifications + + final List received = new ArrayList(); + + mbeanServer.addNotificationListener(new ObjectName(ServiceStateMBean.OBJECTNAME), new NotificationListener() { + public void handleNotification(Notification notification, Object handback) { + received.add(notification); + } + }, null, null); + + + assertNotNull(refB); + assertNotNull(msf); + b.stop(); + refB = bundleContext.getServiceReference(InterfaceB.class.getName()); + refs = bundleContext.getServiceReferences(ManagedServiceFactory.class.getName(), "(" + Constants.SERVICE_PID + "=jmx.test.B.factory)"); + assertNull(refs); + assertNull(refB); + b.start(); + refB = bundleContext.getServiceReference(InterfaceB.class.getName()); + refs = bundleContext.getServiceReferences(ManagedServiceFactory.class.getName(), "(" + Constants.SERVICE_PID + "=jmx.test.B.factory)"); + assertNotNull(refB); + assertNotNull(refs); + assertEquals(1, refs.length); + + int i = 0; + while (received.size() < 4 && i < 3) { + Thread.sleep(1000); + i++; + } + + assertEquals(4, received.size()); + + } + +} Propchange: incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: incubator/aries/trunk/jmx/jmx-itests/src/test/java/org/apache/aries/jmx/framework/ServiceStateMBeanTest.java ------------------------------------------------------------------------------ svn:keywords = Revision Date