All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.kaleidofoundry.messaging.rdv.RdvTransport Maven / Gradle / Ivy

/*  
 * Copyright 2008-2021 the original author or authors 
 *
 * 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.kaleidofoundry.messaging.rdv;

import static org.kaleidofoundry.messaging.TransportContextBuilder.RDV_CERTIFIED_CMNAME;
import static org.kaleidofoundry.messaging.TransportContextBuilder.RDV_DAEMON_PARAMETER;
import static org.kaleidofoundry.messaging.TransportContextBuilder.RDV_NETWORK_PARAMETER;
import static org.kaleidofoundry.messaging.TransportContextBuilder.RDV_SERVICE_PARAMETER;
import static org.kaleidofoundry.messaging.TransportContextBuilder.RDV_CERTIFIED_TIMEOUT;
import static org.kaleidofoundry.messaging.TransportContextBuilder.RDV_TRANSPORT_TYPE;

import org.kaleidofoundry.core.context.EmptyContextParameterException;
import org.kaleidofoundry.core.context.RuntimeContext;
import org.kaleidofoundry.core.plugin.Declare;
import org.kaleidofoundry.core.util.StringHelper;
import org.kaleidofoundry.messaging.AbstractTransport;
import org.kaleidofoundry.messaging.MessagingConstants;
import org.kaleidofoundry.messaging.Transport;
import org.kaleidofoundry.messaging.TransportException;

import com.tibco.tibrv.Tibrv;
import com.tibco.tibrv.TibrvCmQueueTransport;
import com.tibco.tibrv.TibrvCmTransport;
import com.tibco.tibrv.TibrvException;
import com.tibco.tibrv.TibrvRvdTransport;
import com.tibco.tibrv.TibrvTransport;

/**
 * Tibco RDV MessagingTransport
 * 
 * @author jraduget
 */
@Declare(MessagingConstants.RDV_TRANSPORT_PLUGIN)
public class RdvTransport extends AbstractTransport implements Transport {

   private TibrvRvdTransport transport;
   private TibrvCmTransport cmTransport;
   private TibrvCmQueueTransport cmQueueTransport;

   /**
    * Create transport
    * 
    * @param context
    * @throws TransportException
    */
   public RdvTransport(final RuntimeContext context) throws TransportException {
	super(context);

	checkTransportContext();

	createTransport();
   }

   /**
    * Consistency check
    * 
    * @throws ContextException
    */
   protected void checkTransportContext() throws TransportException {
	if (StringHelper.isEmpty(getType())) { throw new EmptyContextParameterException(RDV_TRANSPORT_TYPE, context); }
	if (StringHelper.isEmpty(getService())) { throw new EmptyContextParameterException(RDV_SERVICE_PARAMETER, context); }
	if (StringHelper.isEmpty(getDaemon())) { throw new EmptyContextParameterException(RDV_DAEMON_PARAMETER, context); }
   }

   /**
    * transport creation
    * 
    * @throws TransportException
    */
   protected void createTransport() throws TransportException {
	try {
	   // Native implem
	   Tibrv.open(Tibrv.IMPL_NATIVE);
	} catch (final TibrvException rvde) {
	   throw new TransportException("messaging.transport.rdv.open", rvde);
	}

	try {
	   // Create RVD transport
	   transport = new TibrvRvdTransport(getService(), getNetwork(), getDaemon());
	} catch (final TibrvException rvde) {
	   throw new TransportException("messaging.transport.rdv.create", rvde);
	}

	try {
	   // Create RVD certified transport if needed
	   if (RdvTransportTypeEnum.CERTIFIED.equals(getType())) {
		cmTransport = new TibrvCmTransport(transport, getCmname(), true);

		if (!StringHelper.isEmpty(getTimeout())) {
		   try {
			cmTransport.setDefaultTimeLimit(Double.parseDouble(getTimeout()));
		   } catch (final NumberFormatException nfe) {
			throw new TransportException("messaging.transport.rdv.timeout", new String[] { getTimeout() });
		   }
		}
	   }
	} catch (final TibrvException rvde) {
	   throw new TransportException("messaging.transport.rdv.create", rvde);
	}

	try {
	   // Create RVD Distributed queue transport if needed
	   if (RdvTransportTypeEnum.DQUEUE.equals(getType())) {
		cmQueueTransport = new TibrvCmQueueTransport(transport, getCmname());

		if (!StringHelper.isEmpty(getTimeout())) {
		   try {
			cmQueueTransport.setDefaultTimeLimit(Double.parseDouble(getTimeout()));
		   } catch (final NumberFormatException nfe) {
			throw new TransportException("messaging.transport.rdv.timeout", new String[] { getTimeout() });
		   }
		}

	   }
	} catch (final TibrvException rvde) {
	   throw new TransportException("messaging.transport.rdv.create", rvde);
	}
   }

   @Override
   public void close() throws TransportException {

	super.close();

	try {
	   if (transport != null) {
		transport.destroy();
	   }

	   if (cmTransport != null) {
		cmTransport.destroy();
	   }

	   if (cmQueueTransport != null) {
		transport.destroy();
	   }
	} finally {
	   try {
		Tibrv.close();
	   } catch (final TibrvException trve) {
		throw new TransportException("messaging.transport.rdv.close", trve);
	   }
	}
   }

   /**
    * @return RDV service config value
    */
   public String getService() {
	return context.getString(RDV_SERVICE_PARAMETER);
   }

   /**
    * @return RDV Network config value
    */
   public String getNetwork() {
	return context.getString(RDV_NETWORK_PARAMETER);
   }

   /**
    * @return RDV Daemon config value
    */
   public String getDaemon() {
	return context.getString(RDV_DAEMON_PARAMETER);
   }

   /**
    * @return RDV Timeout value for certified transport
    */
   public String getTimeout() {
	return context.getString(RDV_CERTIFIED_TIMEOUT);
   }

   /**
    * @return RDV type transport
    * @see RdvTransportTypeEnum
    */
   public String getType() {
	return context.getString(RDV_TRANSPORT_TYPE);
   }

   /**
    * @return RDV type transport
    * @see RdvTransportTypeEnum
    */
   public String getCmname() {
	return context.getString(RDV_CERTIFIED_CMNAME);
   }

   /**
    * @return Transport RDV
    */
   public TibrvTransport getRdvTransport() {
	return transport;
   }

   /**
    * @return CmTransport RDV if certified
    * @IllegalStateException If transport is not certified
    */
   public TibrvCmTransport getRdvCmTransport() {
	if (RdvTransportTypeEnum.CERTIFIED.equals(getType())) {
	   return cmTransport;
	} else {
	   throw new IllegalStateException("use only for certified transport");
	}
   }

   /**
    * @return CmQueueTransport RDV if distributed queue
    * @IllegalStateException If transport is not distributed queue
    */
   public TibrvCmQueueTransport getCmQueueTransport() {
	if (RdvTransportTypeEnum.DQUEUE.equals(getType())) {
	   return cmQueueTransport;
	} else {
	   throw new IllegalStateException("use only for distributed queue transport");
	}
   }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy