EMMA Coverage Report (generated Sun May 02 20:42:29 CEST 2010)
[all classes][hu.netmind.beankeeper.management.impl]

COVERAGE SUMMARY FOR SOURCE FILE [ManagementTrackerImpl.java]

nameclass, %method, %block, %line, %
ManagementTrackerImpl.java100% (1/1)100% (11/11)74%  (195/265)85%  (47.5/56)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class ManagementTrackerImpl100% (1/1)100% (11/11)74%  (195/265)85%  (47.5/56)
deregisterBeanInternal (String): void 100% (1/1)55%  (29/53)70%  (7/10)
registerBeanInternal (String, Object): void 100% (1/1)56%  (31/55)70%  (7/10)
handle (PersistenceEvent): void 100% (1/1)67%  (45/67)82%  (11.5/14)
<static initializer> 100% (1/1)100% (4/4)100% (1/1)
ManagementTrackerImpl (): void 100% (1/1)100% (14/14)100% (4/4)
deregisterBean (String): void 100% (1/1)100% (9/9)100% (3/3)
deregisterBeans (): void 100% (1/1)100% (19/19)100% (3/3)
init (Map): void 100% (1/1)100% (5/5)100% (2/2)
registerBean (String, Object): void 100% (1/1)100% (11/11)100% (3/3)
registerBeans (): void 100% (1/1)100% (21/21)100% (3/3)
release (): void 100% (1/1)100% (7/7)100% (3/3)

1/**
2 * Copyright (C) 2008 NetMind Consulting Bt.
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 3 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 */
18 
19package hu.netmind.beankeeper.management.impl;
20 
21import hu.netmind.beankeeper.common.StoreException;
22import hu.netmind.beankeeper.management.ManagementTracker;
23import hu.netmind.beankeeper.event.PersistenceEventListener;
24import hu.netmind.beankeeper.event.PersistenceEvent;
25import hu.netmind.beankeeper.event.EventDispatcher;
26import hu.netmind.beankeeper.node.NodeManager;
27import hu.netmind.beankeeper.node.event.NodeStateChangeEvent;
28import java.util.*;
29import javax.management.ObjectName;
30import javax.management.MBeanServer;
31import java.lang.management.ManagementFactory;
32import org.apache.log4j.Logger;
33 
34/**
35 * This implementation is waiting for the node to become connected to register the mbeans.
36 * If a reconnect occurs, the beans are re-registered with the new node id.
37 * @author Brautigam Robert
38 * @version Revision: $Revision$
39 */
40public class ManagementTrackerImpl implements ManagementTracker, PersistenceEventListener
41{
42   private static final Logger logger = Logger.getLogger(ManagementTrackerImpl.class);
43 
44   private Map<String,Object> beans = new HashMap<String,Object>();
45   private int nodeId = 0;
46 
47   private EventDispatcher eventDispatcher = null; // Injected
48 
49   /**
50    * Register as listener.
51    */
52   public void init(Map parameters)
53   {
54      eventDispatcher.registerListener(this);
55   }
56 
57   /**
58    * Remove all beans from JMX, and unregister from event
59    * dispatcher.
60    */
61   public void release()
62   {
63      eventDispatcher.unregisterListener(this);
64      deregisterBeans();
65   }
66   
67   /**
68    * Register a JMX bean with the given name.
69    */
70   public void registerBean(String name, Object bean)
71   {
72      beans.put(name,bean);
73      registerBeanInternal(name,bean);
74   }
75 
76   /**
77    * Deregister the bean with the given name.
78    */
79   public void deregisterBean(String name)
80   {
81      beans.remove(name);
82      deregisterBeanInternal(name);
83   }
84 
85   /**
86    * Register all beans to JMX.
87    */
88   private void registerBeans()
89   {
90      for ( Map.Entry<String,Object> entry : beans.entrySet() )
91         registerBeanInternal(entry.getKey(),entry.getValue());
92   }
93 
94   /**
95    * Deregister all beans from JMX.
96    */
97   private void deregisterBeans()
98   {
99      for ( Map.Entry<String,Object> entry : beans.entrySet() )
100         deregisterBeanInternal(entry.getKey());
101   }
102 
103   /**
104    * Register a single bean into JMX.
105    */
106   private void registerBeanInternal(String name, Object object)
107   {
108      if ( nodeId == 0 )
109         return; // Do nothing, node not initialized
110      try
111      {
112         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
113         mbs.registerMBean(object,new ObjectName(
114                  "hu.netmind.beankeeper:type="+name+",node="+nodeId));
115         if ( logger.isDebugEnabled() )
116            logger.debug("registered JMX bean: "+name);
117      } catch ( Exception e ) {
118         throw new StoreException("could not register JMX bean: "+name,e);
119      }
120   }
121 
122   /**
123    * Deregister a single bean from JMX.
124    */
125   private void deregisterBeanInternal(String name)
126   {
127      if ( nodeId == 0 )
128         return; // Do nothing, node not initialized
129      try
130      {
131         MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
132         mbs.unregisterMBean(new ObjectName(
133                  "hu.netmind.beankeeper:type="+name+",node="+nodeId));
134         if ( logger.isDebugEnabled() )
135            logger.debug("deregistered JMX bean: "+name);
136      } catch ( Exception e ) {
137         throw new StoreException("could not deregister JMX bean: "+name,e);
138      }
139   }
140 
141   /**
142    * Listen to node events, and deregister all beans
143    * when the node disconnects, register all beans when
144    * node initializes.
145    */
146   public void handle(PersistenceEvent event)
147      throws Exception
148   {
149      if ( event instanceof NodeStateChangeEvent )
150      {
151         NodeStateChangeEvent stateEvent = (NodeStateChangeEvent) event;
152         if ( (stateEvent.getNewState() == NodeManager.NodeState.INITIALIZED) &&
153              (stateEvent.getOldState().getLevel() < NodeManager.NodeState.INITIALIZED.getLevel()) )
154         {
155            // Node entered initialized state from a lower state, so register all beans
156            // and remember the node's id
157            nodeId = stateEvent.getNodeId();
158            if ( logger.isDebugEnabled() )
159               logger.debug("node initialized, with id '"+nodeId+"', registering all beans");
160            registerBeans();
161         }
162         if ( (stateEvent.getNewState().getLevel() < NodeManager.NodeState.INITIALIZED.getLevel()) &&
163              (stateEvent.getOldState() == NodeManager.NodeState.INITIALIZED) )
164         {
165            // Node left initialized state for a lower state, so deregister beans
166            if ( logger.isDebugEnabled() )
167               logger.debug("node uninitialized, removing all JMX beans");
168            try
169            {
170               deregisterBeans();
171            } finally {
172               nodeId=0;
173            }
174         }
175      }
176   }
177}
178 
179 

[all classes][hu.netmind.beankeeper.management.impl]
EMMA 2.0.5312debian (C) Vladimir Roubtsov