/*
* 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.jboss;
import java.io.IOException;
import java.util.Hashtable;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.Name;
import javax.naming.Reference;
import javax.naming.spi.ObjectFactory;
import org.jacorb.notification.ConsoleMain;
import org.jacorb.notification.jmx.COSNotificationService;
import org.jboss.iiop.CorbaORBService;
import org.jboss.mx.util.MBeanServerLocator;
import org.jboss.system.ServiceMBeanSupport;
import org.omg.CORBA.ORB;
/**
* Adaptor to run a JMX-enabled NotificationService inside of JBoss.
*
* @jmx.mbean name = "JBossCOSNotificationService"
* extends = "org.jboss.system.ServiceMBean"
* persistPolicy = "OnUpdate"
* persistPeriod = "10"
* persistLocation = "${jboss.server.data.dir}"
* persistName = "COSNotification.ser"
* state-action-on-update = "keep-running"
* persistence-manager = "org.jboss.mx.persistence.ObjectStreamPersistenceManager"
*
* @jboss.xmbean
*
* @author Alphonse Bendt
*/
public class JBossCOSNotificationService extends ServiceMBeanSupport implements
JBossCOSNotificationServiceMBean, ObjectFactory
{
public final static String NAMING_NAME = "COSNotification";
private static final String DEFAULT_DOMAIN = "NotificationService";
private static final String NOT_RUNNING = "Not Started";
private COSNotificationService delegate_;
private String iorFileName_ = "CosNotification.ior";
private String cosNamingEntry_ = "CosNotification";
private String additionalArguments_;
// operation from super interfaces
// this is redundant but otherwise xmbean is not generated correctly
/**
* @jmx.managed-attribute access = "read-only"
*/
public String getName()
{
return super.getName();
}
/**
* @jmx.managed-attribute access = "read-only"
*/
public int getState()
{
return super.getState();
}
/**
* @jmx.managed-attribute access = "read-only"
*/
public String getStateString()
{
return super.getStateString();
}
/**
* @--jmx.managed-operation description = "Detyped lifecycle invocation"
* impact = "ACTION"
*/
public void jbossInternalLifecycle(String method) throws Exception
{
super.jbossInternalLifecycle(method);
}
/**
* @jmx.managed-operation description = "create the service, do expensive operations etc"
* impact = "ACTION"
*/
public void create() throws Exception
{
super.create();
}
/**
* @jmx.managed-operation description = "start the service, create is already called"
* impact = "ACTION"
*/
public void start() throws Exception
{
super.start();
}
/**
* @jmx.managed-operation description = "stop the service"
* impact = "ACTION"
*/
public void stop()
{
super.stop();
}
/**
* @jmx.managed-operation description = "destroy the service, tear down"
* impact = "ACTION"
*/
public void destroy()
{
super.destroy();
}
/**
* @jmx.managed-operation description="create a new channel"
* impact = "ACTION"
*/
public String createChannel()
{
return isStarted() ? delegate_.createChannel() : NOT_RUNNING;
}
/**
* @jmx.managed-attribute description = "NameService Entry (Optional)"
* access = "read-write"
*/
public String getCOSNamingEntry()
{
return cosNamingEntry_;
}
/**
* @jmx.managed-attribute access = "read-write"
*/
public void setCOSNamingEntry(String cosNamingEntry)
{
cosNamingEntry_ = cosNamingEntry;
if (isStarted())
{
updateCOSNamingEntry();
}
}
private void updateCOSNamingEntry()
{
delegate_.setCOSNamingEntry(cosNamingEntry_);
log.info("Bound to COSNaming name: " + cosNamingEntry_);
}
/**
* @jmx.managed-attribute description="Corbaloc to access the EventChannelFactory"
* access = "read-only"
*/
public String getCorbaloc()
{
return isStarted() ? delegate_.getCorbaloc() : NOT_RUNNING;
}
/**
* @jmx.managed-attribute description="IOR to access the EventChannelFactory"
* access = "read-only"
*/
public String getIOR()
{
return isStarted() ? delegate_.getIOR() : NOT_RUNNING;
}
/**
* @jmx.managed-attribute description = "Filename the IOR should be written to"
* access = "read-write"
*/
public String getIORFile()
{
return iorFileName_;
}
/**
* @jmx.managed-attribute access = "read-write"
*/
public void setIORFile(String filename) throws IOException
{
iorFileName_ = filename;
if (isStarted())
{
updateIORFile();
}
}
private void updateIORFile() throws IOException
{
delegate_.setIORFile(iorFileName_);
log.info("set IOR filename to " + iorFileName_);
}
/**
* @jmx.managed-attribute access = "read-write"
*/
public void setAdditionalArguments(String additionalArguments)
{
additionalArguments_ = additionalArguments;
}
/**
* @jmx.managed-attribute description = "Additional startup arguments. Setting these on an
* already running service will have no effect!"
* access = "read-write"
*/
public String getAdditionalArguments()
{
return additionalArguments_;
}
protected void startService() throws Exception
{
final ORB _orb;
InitialContext _context = new InitialContext();
try
{
_orb = (ORB) _context.lookup("java:/" + CorbaORBService.ORB_NAME);
} finally
{
_context.close();
}
String[] args = ConsoleMain.splitArgs(additionalArguments_);
delegate_ = new COSNotificationService(_orb, MBeanServerLocator.locateJBoss(),
new JMXManageableXMBeanProvider(DEFAULT_DOMAIN), args);
bind(NAMING_NAME, "org.omg.CosNotifyChannelAdmin.EventChannelFactory");
updateIORFile();
updateCOSNamingEntry();
delegate_.start();
log.info("COSNotificationService started");
}
protected void stopService() throws Exception
{
delegate_.stop();
unbind(NAMING_NAME);
log.info("COSNotificationService stopped");
}
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment)
throws Exception
{
String s = name.toString();
if (getLog().isTraceEnabled())
{
getLog().trace(
"getObjectInstance: obj.getClass().getName=\"" + obj.getClass().getName()
+ "\n name=" + s);
}
if (NAMING_NAME.equals(s))
{
return delegate_.getEventChannelFactory();
}
throw new IllegalArgumentException();
}
private void bind(String name, String className) throws Exception
{
Reference _ref = new Reference(className, getClass().getName(), null);
InitialContext _context = new InitialContext();
try
{
_context.bind("java:/" + name, _ref);
log.info("Bound to JNDI name: " + name);
} finally
{
_context.close();
}
}
private void unbind(String name) throws Exception
{
InitialContext _context = new InitialContext();
try
{
_context.unbind("java:/" + name);
} finally
{
_context.close();
}
}
private boolean isStarted()
{
return getState() == STARTED;
}
}