/*
 * Conditions Of Use
 *
 * This software was developed by employees of the National Institute of
 * Standards and Technology (NIST), an agency of the Federal Government.
 * Pursuant to title 15 Untied States Code Section 105, works of NIST
 * employees are not subject to copyright protection in the United States
 * and are considered to be in the public domain.  As a result, a formal
 * license is not needed to use the software.
 *
 * This software is provided by NIST as a service and is expressly
 * provided "AS IS."  NIST MAKES NO WARRANTY OF ANY KIND, EXPRESS, IMPLIED
 * OR STATUTORY, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT
 * AND DATA ACCURACY.  NIST does not warrant or make any representations
 * regarding the use of the software or the results thereof, including but
 * not limited to the correctness, accuracy, reliability or usefulness of
 * the software.
 *
 * Permission to use this software is contingent upon your acceptance
 * of the terms of this agreement
 *
 * .
 *
 */
package gov.nist.javax.sip.stack;

import javax.sip.ListeningPoint;
import java.io.IOException;
import java.net.InetAddress;

/**
 * Default stack implementation of the MessageProcessorFactory.
 * This Factory creates MessageProcessor instances using the Old IO (as opposed to NIO)
 * 
 * @author jean.deruelle@gmail.com
 *
 */
public class OIOMessageProcessorFactory implements MessageProcessorFactory {

	public MessageProcessor createMessageProcessor(
			SIPTransactionStack sipStack, InetAddress ipAddress, int port,
			String transport) throws IOException {
		if (transport.equalsIgnoreCase(ListeningPoint.UDP)) {
			UDPMessageProcessor udpMessageProcessor = new UDPMessageProcessor(
					ipAddress, sipStack, port);			
			sipStack.udpFlag = true;
			return udpMessageProcessor;
		} else if (transport.equalsIgnoreCase(ListeningPoint.TCP)) {
			TCPMessageProcessor tcpMessageProcessor = new TCPMessageProcessor(
					ipAddress, sipStack, port);			
			// this.tcpFlag = true;
			return tcpMessageProcessor;
		} else if (transport.equalsIgnoreCase(ListeningPoint.TLS)) {
			TLSMessageProcessor tlsMessageProcessor = new TLSMessageProcessor(
					ipAddress, sipStack, port);			
			// this.tlsFlag = true;
			return tlsMessageProcessor;
		} else if (transport.equalsIgnoreCase(ListeningPoint.SCTP)) {

			// Need Java 7 for this, so these classes are packaged in a separate
			// jar
			// Try to load it indirectly, if fails report an error
			try {
				Class<?> mpc = ClassLoader.getSystemClassLoader().loadClass(
						"gov.nist.javax.sip.stack.sctp.SCTPMessageProcessor");
				MessageProcessor mp = (MessageProcessor) mpc.newInstance();
				mp.initialize(ipAddress, port, sipStack);				
				return mp;
			} catch (ClassNotFoundException e) {
				throw new IllegalArgumentException(
						"SCTP not supported (needs Java 7 and SCTP jar in classpath)");
			} catch (InstantiationException ie) {
				throw new IllegalArgumentException("Error initializing SCTP",
						ie);
			} catch (IllegalAccessException ie) {
				throw new IllegalArgumentException("Error initializing SCTP",
						ie);
			}
		} else {
			throw new IllegalArgumentException("bad transport");
		}
	}

}
