/*
* (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.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
/**
* ExecuteQueryRequest protocol message.
*
* The binary format is :
* |messageHeader|numberOfParameters|parameterTypes|parametersValues|
*
* @author lengelle
*
*/
public class ExecuteQueryRequest extends Message
{
// 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 int numberOfParameters;
private int[] executiveParameterTypes;
private String[] executiveParameters;
/**
* Creates a new ExecuteQueryRequest
*/
protected ExecuteQueryRequest()
{
super();
numberOfParameters = 0;
executiveParameterTypes = null;
executiveParameters = null;
}
/* (non-Javadoc)
* @see com.ibm.gaiandb.udpdriver.common.protocol.Message#initializeWithData(byte[], java.net.InetAddress, int)
*/
public void initializeWithData( byte[] data, InetAddress emittingAdress, int emittingPort ) throws UDPProtocolException
{
super.initializeWithData( data, emittingAdress, emittingPort );
try
{
deserializeData();
}
catch( Exception e )
{
throw new UDPProtocolException( "ExecuteQueryRequest - constructor failed.", e );
}
}
/* (non-Javadoc)
* @see com.ibm.gaiandb.udpdriver.common.protocol.Message#clean()
*/
public void clean()
{
super.clean();
numberOfParameters = 0;
executiveParameterTypes = null;
executiveParameters = null;
}
public int getType()
{
return Message.EXECUTE_QUERY_REQUEST;
}
public int getNumberOfParameters()
{
return numberOfParameters;
}
public void setNumberOfParameters( int numberOfParameters )
{
this.numberOfParameters = numberOfParameters;
}
public int[] getExecutiveParameterTypes()
{
return executiveParameterTypes;
}
public String[] getExecutiveParameters()
{
return executiveParameters;
}
public void setExecutiveParameterTypes( int[] executiveParamterTypes )
{
this.executiveParameterTypes = executiveParamterTypes;
}
public void setExecutiveParameters( String[] executiveParameters )
{
this.executiveParameters = executiveParameters;
}
/* (non-Javadoc)
* @see com.ibm.gaiandb.udpdriver.common.protocol.Message#deserializeData()
*/
protected void deserializeData() throws IOException
{
ByteArrayInputStream bais = new ByteArrayInputStream( binaryData );
DataInputStream dis = new DataInputStream( bais );
dis.readByte(); // the message type
queryID = dis.readUTF();
sequenceNumber = dis.readInt();
numberOfParameters = dis.readInt();
if ( numberOfParameters > 0 )
{
executiveParameterTypes = new int[numberOfParameters];
for ( int i=0; i<numberOfParameters; ++i )
{
executiveParameterTypes[i] = dis.readInt();
}
executiveParameters = new String[numberOfParameters];
for ( int i=0; i<numberOfParameters; ++i )
{
executiveParameters[i] = dis.readUTF();
}
}
dis.close();
bais.close();
}
/* (non-Javadoc)
* @see com.ibm.gaiandb.udpdriver.common.protocol.Message#serializeMessage()
*/
public byte[] serializeMessage() throws UDPProtocolException
{
try
{
ByteArrayOutputStream baos = new ByteArrayOutputStream( BYTE_ARRAY_INITIAL_SIZE );
DataOutputStream daos = new DataOutputStream( baos );
if ( queryID==null || sequenceNumber==-1 )
{
throw new UDPProtocolException( "The fields 'queryID' or 'sequenceNumber' are not initialized. " );
}
daos.writeByte( getType() );
daos.writeUTF( queryID );
daos.writeInt( sequenceNumber );
daos.writeInt( numberOfParameters );
if ( numberOfParameters > 0 )
{
if ( executiveParameterTypes == null )
{
throw new UDPProtocolException( "executiveParameterTypes field is not initilized." );
}
for ( int i=0; i<numberOfParameters; ++i )
{
daos.writeInt( executiveParameterTypes[i] );
}
if ( executiveParameters == null )
{
throw new UDPProtocolException( "executiveParameters field is not initilized." );
}
for ( int i=0; i<numberOfParameters; ++i )
{
daos.writeUTF( executiveParameters[i] );
}
}
daos.close();
byte[] serialized = baos.toByteArray();
baos.close();
return serialized;
}
catch( Exception e )
{
throw new UDPProtocolException( "ExecuteQueryRequest - serializeMessage() failed. ", e );
}
}
}