/* * (C) Copyright IBM Corp. 2010 * * LICENSE: Eclipse Public License v1.0 * http://www.eclipse.org/legal/epl-v10.html */ package com.ibm.gaiandb.udpdriver.common.protocol; import java.net.InetAddress; import java.util.concurrent.ArrayBlockingQueue; /** * MessageFactory implements message pools. Each message obtained from MessageFactory has * to be return to the pool by using the static method * MessageFactory.returnMessage(message); * * Example: * QueryRequest qr = MessageFactory.getQueryRequestMessage( queryID ); * ... * ... * MessageFactory.returnMessage(qr); * * @author lengelle * */ public abstract class MessageFactory { // Use PROPRIETARY notice if class contains a main() method, otherwise use COPYRIGHT notice. public static final String COPYRIGHT_NOTICE = "(c) Copyright IBM Corp. 2010"; private static final int MESSAGE_POOL_MAX_SIZE = 30; private static ArrayBlockingQueue<QueryRequest> queryRequestList; private static ArrayBlockingQueue<MetaData> metaDataList; private static ArrayBlockingQueue<ExecuteQueryRequest> executeQueryRequestList; private static ArrayBlockingQueue<ExecuteQueryResponse> executeQueryResponseList; private static ArrayBlockingQueue<NextValuesRequest> nextValuesRequestList; private static ArrayBlockingQueue<NextValuesResponse> nextValuesResponseList; private static ArrayBlockingQueue<CloseRequest> closeRequestList; // private static ArrayBlockingQueue<QueryStatusReport> queryStatusReportList; DRVV static { queryRequestList = new ArrayBlockingQueue<QueryRequest>( MESSAGE_POOL_MAX_SIZE ); metaDataList = new ArrayBlockingQueue<MetaData>( MESSAGE_POOL_MAX_SIZE ); executeQueryRequestList = new ArrayBlockingQueue<ExecuteQueryRequest>( MESSAGE_POOL_MAX_SIZE ); executeQueryResponseList = new ArrayBlockingQueue<ExecuteQueryResponse>( MESSAGE_POOL_MAX_SIZE ); nextValuesRequestList = new ArrayBlockingQueue<NextValuesRequest>( MESSAGE_POOL_MAX_SIZE ); nextValuesResponseList = new ArrayBlockingQueue<NextValuesResponse>( MESSAGE_POOL_MAX_SIZE ); closeRequestList = new ArrayBlockingQueue<CloseRequest>( MESSAGE_POOL_MAX_SIZE ); } /** * Returns a Message object according to the data provided as a parameter. * * @param data * @param emittingAdress * @param emittingPort * @return * @throws UDPProtocolException */ public static Message getMessage( byte[] data, InetAddress emittingAdress, int emittingPort ) throws UDPProtocolException { try { int messageType = new Integer( data[0] ); Message message = null; switch ( messageType ) { case Message.QUERY_REQUEST : message = getQueryRequestMessage(); break; case Message.META_DATA : message = getMetaDataMessage(); break; case Message.EXECUTE_QUERY_REQUEST : message = getExecuteQueryRequestMessage(); break; case Message.EXECUTE_QUERY_RESPONSE : message = getExecuteQueryResponseMessage(); break; case Message.NEXT_VALUES_REQUEST : message = getNextValuesRequestMessage(); break; case Message.NEXT_VALUES_RESPONSE : message = getNextValuesResponseMessage(); break; case Message.CLOSE_REQUEST : message = getCloseRequestMessage(); break; // case Message.QUERY_STATUS_REPORT : // message = getCloseRequestMessage(); // break; // DRVV default : return null; } message.initializeWithData( data, emittingAdress, emittingPort ); return message; } catch( Exception e ) { throw new UDPProtocolException( "MessageFactory - createMessage() failed.", e ); } } public static Message getMessage( byte[] data ) throws UDPProtocolException { return getMessage( data, null, -1 ); } public static QueryRequest getQueryRequestMessage( String queryID ) throws UDPProtocolException { QueryRequest queryRequest = getQueryRequestMessage(); queryRequest.setQueryID( queryID ); return queryRequest; } public static MetaData getMetaDataMessage( String queryID ) throws UDPProtocolException { MetaData metaData = getMetaDataMessage(); metaData.setQueryID( queryID ); return metaData; } public static ExecuteQueryRequest getExecuteQueryRequestMessage( String queryID ) throws UDPProtocolException { ExecuteQueryRequest executeQueryRequest = getExecuteQueryRequestMessage(); executeQueryRequest.setQueryID( queryID ); return executeQueryRequest; } public static ExecuteQueryResponse getExecuteQueryResponseMessage( String queryID ) throws UDPProtocolException { ExecuteQueryResponse executeQueryResponse = getExecuteQueryResponseMessage(); executeQueryResponse.setQueryID( queryID ); return executeQueryResponse; } public static NextValuesRequest getNextValuesRequestMessage( String queryID ) throws UDPProtocolException { NextValuesRequest nextValuesRequest = getNextValuesRequestMessage(); nextValuesRequest.setQueryID( queryID ); return nextValuesRequest; } public static NextValuesResponse getNextValuesResponseMessage( String queryID ) throws UDPProtocolException { NextValuesResponse nextValuesResponse = getNextValuesResponseMessage(); nextValuesResponse.setQueryID( queryID ); return nextValuesResponse; } public static CloseRequest getCloseRequestMessage( String queryID ) throws UDPProtocolException { CloseRequest closeRequest = getCloseRequestMessage(); closeRequest.setQueryID( queryID ); return closeRequest; } public static QueryRequest getQueryRequestMessage() throws UDPProtocolException { QueryRequest message = queryRequestList.poll(); if ( message != null ) { return message; } else { return new QueryRequest(); } } public static MetaData getMetaDataMessage() throws UDPProtocolException { MetaData message = metaDataList.poll(); if ( message != null ) { return message; } else { return new MetaData(); } } public static ExecuteQueryRequest getExecuteQueryRequestMessage() throws UDPProtocolException { ExecuteQueryRequest message = executeQueryRequestList.poll(); if ( message != null ) { return message; } else { return new ExecuteQueryRequest(); } } public static ExecuteQueryResponse getExecuteQueryResponseMessage() throws UDPProtocolException { ExecuteQueryResponse message = executeQueryResponseList.poll(); if ( message != null ) { return message; } else { return new ExecuteQueryResponse(); } } public static NextValuesRequest getNextValuesRequestMessage() throws UDPProtocolException { NextValuesRequest message = nextValuesRequestList.poll(); if ( message != null ) { return message; } else { return new NextValuesRequest(); } } public static NextValuesResponse getNextValuesResponseMessage() throws UDPProtocolException { NextValuesResponse message = nextValuesResponseList.poll(); if ( message != null ) { return message; } else { return new NextValuesResponse(); } } public static CloseRequest getCloseRequestMessage() throws UDPProtocolException { CloseRequest message = closeRequestList.poll(); if ( message != null ) { return message; } else { return new CloseRequest(); } } // public static CloseRequest getQueryStatusReportMessage() throws UDPProtocolException // { // CloseRequest message = closeRequestList.poll(); // // if ( message != null ) // { // return message; // } // else // { // return new CloseRequest(); // } // } public static void returnMessage( Message message ) { int messageType = message.getType(); switch ( messageType ) { case Message.QUERY_REQUEST : returnQueryRequest( ( QueryRequest )message ); return; case Message.META_DATA : returnMetaData( ( MetaData )message ); return; case Message.EXECUTE_QUERY_REQUEST : returnExecuteQueryRequest( ( ExecuteQueryRequest )message ); return; case Message.EXECUTE_QUERY_RESPONSE : returnExecuteQueryResponse( ( ExecuteQueryResponse )message ); return; case Message.NEXT_VALUES_REQUEST : returnNextValuesRequest( ( NextValuesRequest )message ); return; case Message.NEXT_VALUES_RESPONSE : returnNextValuesResponse( ( NextValuesResponse )message ); return; case Message.CLOSE_REQUEST : returnCloseRequest( ( CloseRequest )message ); break; default : return; } } private static void returnQueryRequest( QueryRequest queryRequest ) { queryRequest.clean(); if ( !queryRequestList.offer( queryRequest ) ) { queryRequest = null; } } private static void returnMetaData( MetaData metaData ) { metaData.clean(); if ( !metaDataList.offer( metaData ) ) { metaData = null; } } private static void returnExecuteQueryRequest( ExecuteQueryRequest executeQueryRequest ) { executeQueryRequest.clean(); if ( !executeQueryRequestList.offer( executeQueryRequest ) ) { executeQueryRequest = null; } } private static void returnExecuteQueryResponse( ExecuteQueryResponse executeQueryResponse ) { executeQueryResponse.clean(); if ( !executeQueryResponseList.offer( executeQueryResponse ) ) { executeQueryResponse = null; } } private static void returnNextValuesRequest( NextValuesRequest nextValuesRequest ) { nextValuesRequest.clean(); if ( !nextValuesRequestList.offer( nextValuesRequest ) ) { nextValuesRequest = null; } } private static void returnNextValuesResponse( NextValuesResponse nextValuesResponse ) { nextValuesResponse.clean(); if ( !nextValuesResponseList.offer( nextValuesResponse ) ) { nextValuesResponse = null; } } private static void returnCloseRequest( CloseRequest closeRequest ) { closeRequest.clean(); if ( !closeRequestList.offer( closeRequest ) ) { closeRequest = null; } } }