blob: e26ae7fca2c3174ee6da287287307f54317aadd8 [file] [log] [blame]
/*
* Copyright 2005 The Apache Software Foundation
*
* 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.apache.felix.jmood;
import java.util.Iterator;
import java.util.Vector;
import javax.management.InstanceAlreadyExistsException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanRegistrationException;
import javax.management.MBeanServer;
import javax.management.MalformedObjectNameException;
import javax.management.NotCompliantMBeanException;
import javax.management.ObjectName;
import org.apache.felix.jmood.compendium.ConfigAdminManager;
import org.apache.felix.jmood.compendium.ConfigAdminManagerMBean;
import org.apache.felix.jmood.compendium.LogManager;
import org.apache.felix.jmood.compendium.LogManagerMBean;
import org.apache.felix.jmood.compendium.UserManager;
import org.apache.felix.jmood.compendium.UserManagerMBean;
import org.apache.felix.jmood.utils.ObjectNames;
import org.osgi.framework.Constants;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
import org.osgi.framework.ServiceReference;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.log.LogService;
import org.osgi.service.useradmin.UserAdmin;
/**
* This class will control the life-cycle of MBeans related to OSGi Compendium
* Services
*
*
*/
public class CompendiumHandler {
private AgentContext ac;
private ServiceListener sl;
private Vector svcs;
private MBeanServer server;
public CompendiumHandler(MBeanServer server, AgentContext ac) {
super();
this.ac = ac;
this.server = server;
svcs = new Vector();
svcs.add(ConfigurationAdmin.class.getName());
svcs.add(UserAdmin.class.getName());
svcs.add(LogService.class.getName());
sl = new ServiceListener() {
public void serviceChanged(ServiceEvent event) {
processServiceEvent(event);
}
};
}
public void initController() {
try {
if (ac.getConfigurationAdmin() != null) {
ConfigAdminManagerMBean ca = new ConfigAdminManager(ac);
server
.registerMBean(ca, new ObjectName(
ObjectNames.CM_SERVICE));
}
if (ac.getLogservice() != null) {
LogManagerMBean lm = new LogManager(ac);
server.registerMBean(lm,
new ObjectName(ObjectNames.LOG_SERVICE));
}
if (ac.getUserAdmin() != null) {
UserManagerMBean um = new UserManager(ac);
server
.registerMBean(um, new ObjectName(
ObjectNames.UA_SERVICE));
}
} catch (InstanceAlreadyExistsException e) {
ac.error("Unexpected error", e);
} catch (MBeanRegistrationException e) {
ac.error("Unexpected error", e);
} catch (NotCompliantMBeanException e) {
ac.error("Unexpected error", e);
} catch (MalformedObjectNameException e) {
ac.error("Unexpected error", e);
} catch (NullPointerException e) {
ac.error("Unexpected error", e);
}
ac.getBundleContext().addServiceListener(sl);
}
public void dispose() {
ac.getBundleContext().removeServiceListener(sl);
try {
Iterator it = server.queryNames(
new ObjectName(ObjectNames.COMPENDIUM + ":*"), null)
.iterator();
while (it.hasNext())
server.unregisterMBean((ObjectName) it.next());
} catch (MalformedObjectNameException e) {
ac.error("Unexpected error", e);
} catch (NullPointerException e) {
ac.error("Unexpected error", e);
} catch (InstanceNotFoundException e) {
ac.error("Unexpected error", e);
} catch (MBeanRegistrationException e) {
ac.error("Unexpected error", e);
}
}
private void processServiceEvent(ServiceEvent event) {
String[] svs = (String[]) event.getServiceReference().getProperty(
Constants.OBJECTCLASS);
// Check if this event comes from an OSGi compendium service
for (int i = 0; i < svs.length; i++) {
if (svcs.contains(svs[i])) {
if (event.getType() == ServiceEvent.REGISTERED
|| event.getType() == ServiceEvent.UNREGISTERING)
handleEvent(event.getServiceReference(), svs[i], event
.getType());
}
}
}
private void handleEvent(ServiceReference serviceReference,
String iService, int eType) {
try {
if (iService.equals(ConfigurationAdmin.class.getName())) {
switch (eType) {
case ServiceEvent.REGISTERED:
ConfigAdminManagerMBean ca = new ConfigAdminManager(ac);
server.registerMBean(ca, new ObjectName(
ObjectNames.CM_SERVICE));
break;
case ServiceEvent.UNREGISTERING:
server.unregisterMBean(new ObjectName(
ObjectNames.CM_SERVICE));
break;
default:
break;
}
}
if (iService.equals(LogService.class.getName())) {
switch (eType) {
case ServiceEvent.REGISTERED:
LogManagerMBean lm = new LogManager(ac);
server.registerMBean(lm, new ObjectName(
ObjectNames.LOG_SERVICE));
break;
case ServiceEvent.UNREGISTERING:
server.unregisterMBean(new ObjectName(
ObjectNames.LOG_SERVICE));
break;
default:
break;
}
}
if (iService.equals(UserAdmin.class.getName())) {
switch (eType) {
case ServiceEvent.REGISTERED:
UserManagerMBean um = new UserManager(ac);
server.registerMBean(um, new ObjectName(
ObjectNames.UA_SERVICE));
break;
case ServiceEvent.UNREGISTERING:
server.unregisterMBean(new ObjectName(
ObjectNames.UA_SERVICE));
break;
default:
break;
}
}
} catch (InstanceAlreadyExistsException e) {
ac.error("Unexpected error", e);
} catch (MBeanRegistrationException e) {
ac.error("Unexpected error", e);
} catch (NotCompliantMBeanException e) {
ac.error("Unexpected error", e);
} catch (MalformedObjectNameException e) {
ac.error("Unexpected error", e);
} catch (NullPointerException e) {
ac.error("Unexpected error", e);
} catch (InstanceNotFoundException e) {
ac.error("Unexpected error", e);
}
}
}