Package hermes.ext.ems

Source Code of hermes.ext.ems.TibcoEMSAdmin

/*
* 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 hermes.ext.ems;

import hermes.Domain;
import hermes.Hermes;
import hermes.HermesAdmin;
import hermes.HermesException;
import hermes.JNDIConnectionFactory;
import hermes.browser.HermesBrowser;
import hermes.config.DestinationConfig;
import hermes.ext.HermesAdminSupport;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Queue;
import javax.jms.QueueConnectionFactory;
import javax.jms.TopicConnectionFactory;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.log4j.Logger;

import com.tibco.tibjms.admin.DestinationInfo;
import com.tibco.tibjms.admin.DurableInfo;
import com.tibco.tibjms.admin.QueueInfo;
import com.tibco.tibjms.admin.TibjmsAdmin;
import com.tibco.tibjms.admin.TibjmsAdminException;
import com.tibco.tibjms.admin.TopicInfo;

/**
* Administration plugin for Tibco EMS.
*
* @author colincrist@hermesjms.com last changed by: $Author: colincrist $
* @version $Id: TibcoEMSAdmin.java,v 1.10 2006/02/08 09:17:08 colincrist Exp $
*/
public class TibcoEMSAdmin extends HermesAdminSupport implements HermesAdmin
{
   private static final Logger log = Logger.getLogger(TibcoEMSAdmin.class);

   private TibcoEMSAdminFactory factory;
   private TibjmsAdmin admin;

   /**
    *
    */
   public TibcoEMSAdmin(Hermes hermes, TibcoEMSAdminFactory factory)
   {
      super(hermes);

      this.factory = factory;
   }

   private synchronized TibjmsAdmin getAdmin() throws JMSException
   {
      if (admin == null)
      {
         admin = factory.createAdmin(getHermes().getConnectionFactory());
      }

      return admin;
   }

   public synchronized void close() throws JMSException
   {
      try
      {
         if (admin != null)
         {
            admin.close();
            admin = null;
         }
      }
      catch (TibjmsAdminException e)
      {
         throw new HermesException(e);
      }
   }

   public int getDepth(final DestinationConfig destination) throws JMSException
   {
      if (destination.isDurable())
      {
         try
         {
            DurableInfo info = getAdmin().getDurable(destination.getClientID(), getHermes().getConnection().getClientID());

            if (info != null)
            {
               return (int) info.getPendingMessageCount();
            }
            else
            {
               throw new HermesException("No durable information availble for clientID=" + getHermes().getConnection().getClientID() + ", durableName="
                     + destination.getClientID());
            }
         }
         catch (TibjmsAdminException ex)
         {
            throw new HermesException(ex);
         }
      }
      else
      {
         DestinationInfo info = getDestinationInfo(destination);

         if (info != null)
         {
            return (int) info.getPendingMessageCount();
         }
         else
         {
            return 0;
         }
      }
   }

   public Map getStatistics(final DestinationConfig destination) throws JMSException
   {
      try
      {
         final DestinationInfo info = getDestinationInfo(destination);
         final TreeMap rval = new TreeMap();

         rval.putAll(PropertyUtils.describe(info));

         rval.remove("inboundStatistics");
         rval.remove("outboundStatistics");

         rval.put("inboundByteRate", new Long(info.getInboundStatistics().getByteRate()));
         rval.put("inboundMessageRate", new Long(info.getInboundStatistics().getMessageRate()));
         rval.put("inboundTotalBytes", new Long(info.getInboundStatistics().getTotalBytes()));
         rval.put("inboundTotalMessages", new Long(info.getInboundStatistics().getTotalMessages()));

         rval.put("outboundByteRate", new Long(info.getOutboundStatistics().getByteRate()));
         rval.put("outboundMessageRate", new Long(info.getOutboundStatistics().getMessageRate()));
         rval.put("outboundTotalBytes", new Long(info.getOutboundStatistics().getTotalBytes()));
         rval.put("outboundTotalMessages", new Long(info.getOutboundStatistics().getTotalMessages()));

         return rval;
      }
      catch (IllegalAccessException e)
      {
         throw new HermesException(e);
      }
      catch (InvocationTargetException e)
      {
         throw new HermesException(e);
      }
      catch (NoSuchMethodException e)
      {
         throw new HermesException(e);
      }
   }

   private DestinationInfo getDestinationInfo(final DestinationConfig dConfig) throws JMSException
   {
      try
      {
         if (dConfig.getDomain() == Domain.QUEUE.getId())
         {
            return getAdmin().getQueue(getRealDestinationName(dConfig));
         }
         else
         {

            return getAdmin().getTopic(getRealDestinationName(dConfig));
         }
      }
      catch (TibjmsAdminException e)
      {
         throw new HermesException(e);
      }
   }

   private DestinationInfo getDestinationInfo(final Destination destination) throws JMSException
   {
      final String name = getHermes().getDestinationName(destination);

      try
      {
         if (destination instanceof Queue)
         {
            return getAdmin().getQueue(name);
         }
         else
         {
            return getAdmin().getTopic(name);
         }
      }
      catch (TibjmsAdminException e)
      {
         throw new HermesException(e);
      }
   }

   public int truncate(final DestinationConfig dConfig) throws JMSException
   {
      try
      {
         final int rval = getDepth(dConfig);

         if (dConfig.getDomain() == Domain.QUEUE.getId())
         {
            getAdmin().purgeQueue(dConfig.getName());
         }
         else
         {
            if (dConfig.isDurable())
            {
               getAdmin().purgeDurable(dConfig.getClientID(), getHermes().getConnection().getClientID());
            }
            else
            {
               getAdmin().purgeTopic(dConfig.getName());
            }
         }

         return rval;
      }
      catch (TibjmsAdminException e)
      {
         throw new HermesException(e);
      }
   }

   public Collection discoverDestinationConfigs() throws JMSException
   {
      /*
       * As Tibco do not implement the browsing of their JNDI contexts, when the
       * connection factory is JNDI we use their admin API instead to get the
       * jndi names of queues/topics. If there is no JNDI name then it's not
       * bound anywhere.
       */

      try
      {
         final Collection<DestinationConfig> rval = new ArrayList<DestinationConfig>();
        
         boolean both = (getHermes().getConnectionFactory() instanceof TopicConnectionFactory) && (getHermes().getConnectionFactory() instanceof TopicConnectionFactory) ;
        
         if (!(getHermes().getConnectionFactory() instanceof TopicConnectionFactory) || both)
         {
            final QueueInfo[] qinfos = getAdmin().getQueues();

            for (int i = 0; i < qinfos.length; i++)
            {
               if (getHermes().getConnectionFactory() instanceof JNDIConnectionFactory)
               {
                  if (qinfos[i].getJNDINames() != null)
                  {
                     for (int j = 0; j < qinfos[i].getJNDINames().length; j++)
                     {
                        final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();

                        dConfig.setName(qinfos[i].getJNDINames()[j]);
                        dConfig.setDomain(Domain.QUEUE.getId());
                        rval.add(dConfig);

                     }
                  }
               }
               else
               {
                  final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();

                  dConfig.setName(qinfos[i].getName());
                  dConfig.setDomain(Domain.QUEUE.getId());
                  rval.add(dConfig);
               }
            }
         }

         if (!(getHermes().getConnectionFactory() instanceof QueueConnectionFactory) || both)
         {
            final TopicInfo[] tinfos = getAdmin().getTopics();

            for (int i = 0; i < tinfos.length; i++)
            {
               if (getHermes().getConnectionFactory() instanceof JNDIConnectionFactory)
               {
                  if (tinfos[i].getJNDINames() != null)
                  {
                     for (int j = 0; j < tinfos[i].getJNDINames().length; j++)
                     {
                        final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();

                        dConfig.setName(tinfos[i].getJNDINames()[j]);
                        dConfig.setDomain(Domain.TOPIC.getId());
                        rval.add(dConfig);
                        rval.addAll(discoverDurableSubscriptions(tinfos[i].getName(), tinfos[i].getJNDINames()[j]));
                     }
                  }
               }
               else
               {
                  final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();
                  dConfig.setName(tinfos[i].getName());

                  dConfig.setDomain(Domain.TOPIC.getId());
                  rval.add(dConfig);

                  rval.addAll(discoverDurableSubscriptions(tinfos[i].getName(), null));
               }
            }
         }

         return rval;
      }
      catch (TibjmsAdminException e)
      {
         log.error(e.getMessage(), e);

         throw new HermesException(e);
      }

   }

   @Override
   protected Collection<DestinationConfig> discoverDurableSubscriptions(String topicName, String jndiName) throws JMSException
   {
      try
      {
         final Collection<DestinationConfig> rval = new ArrayList<DestinationConfig>();
         final DurableInfo[] dInfos = getAdmin().getDurables(topicName);

         for (int j = 0; j < dInfos.length; j++)
         {
            DurableInfo dInfo = dInfos[j];

            final DestinationConfig dConfig = HermesBrowser.getConfigDAO().createDestinationConfig();

            dConfig.setDurable(true);
            dConfig.setName(jndiName == null ? dInfo.getTopicName() : jndiName);
            dConfig.setClientID(dInfo.getDurableName());
            dConfig.setSelector(dInfo.getSelector());
            dConfig.setDomain(Domain.TOPIC.getId());

            rval.add(dConfig);
         }

         return rval;
      }
      catch (TibjmsAdminException e)
      {
         log.error(e.getMessage(), e);

         throw new HermesException(e);
      }
   }

}
TOP

Related Classes of hermes.ext.ems.TibcoEMSAdmin

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.