/* * JacORB - a free Java ORB * * Copyright (C) 1999-2014 Gerald Brose / The JacORB Team. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * */ package org.jacorb.notification.jmx; import java.io.IOException; import java.util.Properties; import javax.management.MBeanServer; import org.slf4j.Logger; import org.jacorb.notification.AbstractChannelFactory; import org.jacorb.notification.ConsoleMain; import org.jacorb.notification.EventChannelFactoryImpl; import org.jacorb.notification.conf.Attributes; import org.jacorb.notification.util.LogUtil; import org.nanocontainer.remoting.jmx.DynamicMBeanProvider; import org.nanocontainer.remoting.jmx.JMXExposingComponentAdapterFactory; import org.omg.CORBA.IntHolder; import org.omg.CORBA.ORB; import org.omg.CosNotification.Property; import org.picocontainer.MutablePicoContainer; import org.picocontainer.defaults.CachingComponentAdapterFactory; import org.picocontainer.defaults.ComponentAdapterFactory; import org.picocontainer.defaults.ConstructorInjectionComponentAdapterFactory; import org.picocontainer.defaults.DefaultPicoContainer; /** * @jmx.mbean name="COSNotificationServiceMBean" * description="Control the JacORB Notification Service" * * @author Alphonse Bendt */ public class COSNotificationService implements COSNotificationServiceMBean { private AbstractChannelFactory factory_; private final MutablePicoContainer container_; private final static String STARTED = "EventChannelFactory was started"; private final static String RUNNING = "EventChannelFactory is running"; private final static String NOT_RUNNING = "EventChannelFactory is not running"; private final static String STOPPED = "EventChannelFactory was stopped"; private final static String IOR_DEFAULT = "IOR:0"; private final static String CORBALOC_DEFAULT = "<undefined>"; private final Logger logger_ = LogUtil.getLogger(getClass().getName()); private final Properties properties_; private final ORB optionalORB_; public COSNotificationService(ORB orb, MBeanServer mbeanServer, DynamicMBeanProvider mbeanProvider, String[] args) { super(); optionalORB_ = orb; properties_ = ConsoleMain.parseProperties(args); DynamicMBeanProvider _decoratedProvider = new UnregisterObjectNameProviderDecorator( mbeanServer, mbeanProvider); ComponentAdapterFactory _defaultCAF = new JMXExposingComponentAdapterFactory( new ConstructorInjectionComponentAdapterFactory(), mbeanServer, new DynamicMBeanProvider[] { _decoratedProvider }); ComponentAdapterFactory _cachingCAF = new CachingComponentAdapterFactory( _defaultCAF); container_ = new DefaultPicoContainer(_cachingCAF); container_.registerComponentInstance(ComponentAdapterFactory.class, _defaultCAF); } /** * @jmx.managed-operation description="create a new channel" */ public String createChannel() { try { if (factory_ != null) { EventChannelFactoryImpl factory = (EventChannelFactoryImpl) factory_; IntHolder id = new IntHolder(); factory.create_channel(new Property[0], new Property[0], id); return "Created Channel id=" + id.value; } return NOT_RUNNING; } catch (Exception e) { logger_.error("Error creating Channel", e); throw new RuntimeException("Create channel failed: " + e.getMessage()); } } public String start() { if (factory_ != null) { return RUNNING; } try { factory_ = AbstractChannelFactory.newFactory(optionalORB_, container_, properties_); return STARTED; } catch (Exception e) { logger_.error("Error starting Service", e); throw new RuntimeException("Start failed: " + e.getMessage()); } } public String stop() { if (factory_ != null) { factory_.dispose(); factory_ = null; return STOPPED; } return NOT_RUNNING; } /** * @jmx.managed-attribute description="IOR to access the EventChannelFactory" * access = "read-only" */ public String getIOR() { return (factory_ == null) ? IOR_DEFAULT : factory_.getIOR(); } /** * @jmx.managed-attribute description="Corbaloc to access the EventChannelFactory * access = "read-only" */ public String getCorbaloc() { return (factory_ == null) ? CORBALOC_DEFAULT : factory_.getCorbaLoc(); } /** * @jmx.managed-attribute description = "Filename the IOR should be written to" * access = "read-write" */ public String getIORFile() { return properties_.getProperty(Attributes.IOR_FILE); } /** * @jmx.managed-attribute */ public void setIORFile(String filename) throws IOException { properties_.setProperty(Attributes.IOR_FILE, filename); if (factory_ != null) { factory_.writeIOR(filename); } } /** * @jmx.managed-attribute description = "NameService Entry (Optional)" * access = "read-write" */ public String getCOSNamingEntry() { StringBuffer name = new StringBuffer(properties_.getProperty(Attributes.REGISTER_NAME_ID, "<undefined>")); final String nameKind = properties_.getProperty(Attributes.REGISTER_NAME_KIND); if (nameKind != null) { name.append('.'); name.append(nameKind); } return name.toString(); } /** * @jmx.managed-attribute */ public void setCOSNamingEntry(String registerName) { ConsoleMain.addCOSNamingName(properties_, registerName); if (factory_ != null) { try { factory_.unregisterName(); factory_.registerName(properties_); } catch (Exception e) { logger_.error("Error changing COSNaming entry", e); throw new RuntimeException("Changing the COSNaming entry failed: " + e.getMessage()); } } } public org.omg.CORBA.Object getEventChannelFactory() { return factory_.activate(); } }