/**
* Copyright 2010 JBoss Inc
*
* Licensed 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.drools.management;
import java.lang.management.ManagementFactory;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.management.MBeanServer;
import javax.management.ObjectName;
import org.drools.common.AbstractWorkingMemory;
import org.drools.common.InternalWorkingMemory;
import org.drools.reteoo.ReteooRuleBase;
/**
* The main management agent for Drools. The purpose of this
* agent is to serve as a singleton for knowledge base and session
* monitoring mbeans registration and management.
*
* @author etirelli
*
*/
public class DroolsManagementAgent
implements
DroolsManagementAgentMBean {
private static final String MBEAN_NAME = "org.drools:type=DroolsManagementAgent";
private static DroolsManagementAgent INSTANCE;
private static MBeanServer mbs;
private long kbases;
private long ksessions;
private Map<Object, List<ObjectName>> mbeans;
private DroolsManagementAgent() {
kbases = 0;
ksessions = 0;
mbeans = new HashMap<Object, List<ObjectName>>();
}
public static synchronized DroolsManagementAgent getInstance() {
if ( INSTANCE == null ) {
INSTANCE = new DroolsManagementAgent();
try {
MBeanServer mbs = getMBeanServer();
ObjectName mbName = createObjectName( MBEAN_NAME );
if ( !mbs.isRegistered( mbName ) ) {
mbs.registerMBean( INSTANCE,
mbName );
}
} catch ( Exception e ) {
System.err.println( "Unable to register DroolsManagementAgent into the platform MBean Server" );
e.printStackTrace();
}
}
return INSTANCE;
}
/* (non-Javadoc)
* @see org.drools.reteoo.monitoring.DroolsManagementAgentMBean#getRulebaseCount()
*/
public synchronized long getKnowledgeBaseCount() {
return kbases;
}
/* (non-Javadoc)
* @see org.drools.reteoo.monitoring.DroolsManagementAgentMBean#getSessionCount()
*/
public synchronized long getSessionCount() {
return ksessions;
}
public synchronized long getNextKnowledgeBaseId() {
return ++kbases;
}
public synchronized long getNextKnowledgeSessionId() {
return ++ksessions;
}
public void registerKnowledgeBase(ReteooRuleBase kbase) {
KnowledgeBaseMonitoring mbean = new KnowledgeBaseMonitoring( kbase );
registerMBean( kbase,
mbean,
mbean.getName() );
}
public void registerKnowledgeSession(InternalWorkingMemory ksession) {
KnowledgeSessionMonitoring mbean = new KnowledgeSessionMonitoring( ksession );
registerMBean( ksession,
mbean,
mbean.getName() );
}
public void unregisterKnowledgeSession(InternalWorkingMemory ksession) {
unregisterMBeansFromOwner( ksession );
}
public void registerMBean(Object owner,
Object mbean,
ObjectName name) {
try {
MBeanServer mbs = getMBeanServer();
if ( !mbs.isRegistered( name ) ) {
mbs.registerMBean( mbean,
name );
List<ObjectName> mbl = mbeans.get( owner );
if ( mbl == null ) {
mbl = new LinkedList<ObjectName>();
mbeans.put( owner,
mbl );
}
mbl.add( name );
}
} catch ( Exception e ) {
System.err.println( "Unable to register mbean " + name + " into the platform MBean Server" );
e.printStackTrace();
}
}
public void unregisterMBeansFromOwner(Object owner) {
List<ObjectName> mbl = mbeans.remove( owner );
if ( mbl != null ) {
MBeanServer mbs = getMBeanServer();
for ( ObjectName name : mbl ) {
unregisterMBeanFromServer( mbs,
name );
}
}
}
private void unregisterMBeanFromServer(MBeanServer mbs,
ObjectName name) {
try {
mbs.unregisterMBean( name );
} catch ( Exception e ) {
System.err.println( "Exception unregistering mbean: " + name );
e.printStackTrace();
}
}
public void unregisterMBean( Object owner, ObjectName mbean ) {
List<ObjectName> mbl = mbeans.get( owner );
if( mbl != null ) {
mbl.remove( mbean );
}
MBeanServer mbs = getMBeanServer();
unregisterMBeanFromServer( mbs,
mbean );
}
public void unregisterDependentsMBeansFromOwner(Object owner) {
List<ObjectName> mbl = mbeans.get( owner );
if ( mbl != null ) {
MBeanServer mbs = getMBeanServer();
for ( ObjectName name : mbl.subList( 1, mbl.size() ) ) {
unregisterMBeanFromServer( mbs,
name );
}
mbl.subList( 1, mbl.size() ).clear();
}
}
public static ObjectName createObjectName(String name) {
try {
return new ObjectName( name );
} catch ( Exception e ) {
System.err.println( "This is a bug. Error creating ObjectName for MBean: " + name );
System.err.println( "Please contact the development team and provide the following stack trace: " + e.getMessage() );
e.printStackTrace();
return null;
}
}
private static MBeanServer getMBeanServer() {
if ( mbs == null ) {
mbs = ManagementFactory.getPlatformMBeanServer();
}
return mbs;
}
}