/*
* JBoss, Home of Professional Open Source.
* Copyright 2006, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.mq.il;
import java.util.Properties;
import javax.jms.IllegalStateException;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import org.jboss.mq.GenericConnectionFactory;
import org.jboss.mq.SpyConnectionFactory;
import org.jboss.mq.SpyXAConnectionFactory;
import org.jboss.system.ServiceMBeanSupport;
/**
* This abstract class handles life cycle managment of the ServeIL. Should be
* extended to provide a full implementation.
*
* @author Hiram Chirino (Cojonudo14@hotmail.com)
* @author David Jencks
* @author Adrian Brock
* @version $Revision: 57198 $
*
* @jmx:mbean extends="org.jboss.system.ServiceMBean"
*/
public abstract class ServerILJMXService extends ServiceMBeanSupport implements ServerILJMXServiceMBean
{
private ObjectName jbossMQService;
protected Invoker jmsServer;
protected String connectionFactoryJNDIRef;
protected String xaConnectionFactoryJNDIRef;
protected long pingPeriod = 60000L;
/** The client id */
protected String clientID;
/**
* Get the value of JBossMQService.
*
* @return value of JBossMQService.
*
* @jmx:managed-attribute
*/
public ObjectName getJBossMQService()
{
return jbossMQService;
}
/**
* Set the value of JBossMQService.
*
* @param v Value to assign to JBossMQService.
*
* @jmx:managed-attribute
*/
public void setInvoker(ObjectName jbossMQService)
{
this.jbossMQService = jbossMQService;
}
public void startService() throws Exception
{
jmsServer = (Invoker) getServer().getAttribute(jbossMQService, "Invoker");
if (jmsServer == null)
{
throw new IllegalStateException("Cannot find JBossMQService!");
} // end of if ()
}
public void stopService() throws Exception
{
jmsServer = null;
}
/**
* @param newConnectionFactoryJNDIRef the JNDI reference where the
* connection factory should be bound to
*
* @jmx:managed-attribute
*/
public void setConnectionFactoryJNDIRef(java.lang.String newConnectionFactoryJNDIRef)
{
connectionFactoryJNDIRef = newConnectionFactoryJNDIRef;
}
/**
* @param newXaConnectionFactoryJNDIRef java.lang.String the JNDI reference
* where the xa connection factory should be bound to
*
* @jmx:managed-attribute
*/
public void setXAConnectionFactoryJNDIRef(java.lang.String newXaConnectionFactoryJNDIRef)
{
xaConnectionFactoryJNDIRef = newXaConnectionFactoryJNDIRef;
}
/**
* @return The ClientConnectionProperties value @returns Properties contains
* all the parameters needed to create a connection from the client
* to this IL
*/
public java.util.Properties getClientConnectionProperties()
{
Properties rc = new Properties();
rc.setProperty(ServerILFactory.PING_PERIOD_KEY, "" + pingPeriod);
if (clientID != null)
rc.setProperty(ServerILFactory.CLIENTID, clientID);
return rc;
}
/**
* @return The ServerIL value @returns ServerIL An instance of the Server
* IL, used for
*/
public abstract ServerIL getServerIL();
/**
* @return java.lang.String the JNDI reference where the connection factory
* should be bound to
*
* @jmx:managed-attribute
*/
public java.lang.String getConnectionFactoryJNDIRef()
{
return connectionFactoryJNDIRef;
}
/**
* @return java.lang.String the JNDI reference where the xa connection
* factory should be bound to
*
* @jmx:managed-attribute
*/
public java.lang.String getXAConnectionFactoryJNDIRef()
{
return xaConnectionFactoryJNDIRef;
}
/**
* Binds the connection factories for this IL
*
* @throws javax.naming.NamingException it cannot be unbound
*/
public void bindJNDIReferences() throws javax.naming.NamingException
{
GenericConnectionFactory gcf = new GenericConnectionFactory(getServerIL(), getClientConnectionProperties());
SpyConnectionFactory scf = new SpyConnectionFactory(gcf);
SpyXAConnectionFactory sxacf = new SpyXAConnectionFactory(gcf);
// Get an InitialContext
InitialContext ctx = getInitialContext();
rebind(ctx, connectionFactoryJNDIRef, scf);
rebind(ctx, xaConnectionFactoryJNDIRef, sxacf);
}
protected InitialContext getInitialContext()
throws NamingException
{
InitialContext ctx = new InitialContext();
return ctx;
}
protected void rebind(Context ctx, String name, Object val) throws NamingException
{
// Bind val to name in ctx, and make sure that all intermediate contexts
// exist
javax.naming.Name n = ctx.getNameParser("").parse(name);
while (n.size() > 1)
{
String ctxName = n.get(0);
try
{
ctx = (Context) ctx.lookup(ctxName);
}
catch (javax.naming.NameNotFoundException e)
{
ctx = ctx.createSubcontext(ctxName);
}
n = n.getSuffix(1);
}
ctx.rebind(n.get(0), val);
}
/**
* Unbinds the connection factories for this IL
*
* @throws javax.naming.NamingException it cannot be unbound
*/
public void unbindJNDIReferences() throws javax.naming.NamingException
{
// Get an InitialContext
InitialContext ctx = getInitialContext();
ctx.unbind(connectionFactoryJNDIRef);
ctx.unbind(xaConnectionFactoryJNDIRef);
}
/**
* @return Description of the Returned Value
* @exception Exception Description of Exception
* @throws javax.naming.NamingException if the server is not found
*/
public Invoker getJMSServer()
{
return jmsServer;
}
/**
* @return Description of the Returned Value
* @exception Exception Description of Exception
* @throws javax.naming.NamingException if the server is not found
*/
public Invoker lookupJMSServer()
{
return getJMSServer();
}
/**
* @return long the period of time in ms to wait between connection pings
* factory should be bound to
*
* @jmx:managed-attribute
*/
public long getPingPeriod()
{
return pingPeriod;
}
/**
* @param period long the period of time in ms to wait between connection
* pings
*
* @jmx:managed-attribute
*/
public void setPingPeriod(long period)
{
pingPeriod = period;
}
/**
* Get the client id for this connection factory
*
* @jmx:managed-attribute
* @return the client id
*/
public String getClientID()
{
return clientID;
}
/**
* Set the client id for this connection factory
*
* @jmx:managed-attribute
* @param clientID the client id
*/
public void setClientID(String clientID)
{
this.clientID = clientID;
}
}