Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   *  Copyright (c) xsocket.org, 2006 - 2008. All rights reserved.
   *
   *  This library is free software; you can redistribute it and/or
   *  modify it under the terms of the GNU Lesser General Public
   *  License as published by the Free Software Foundation; either
   *  version 2.1 of the License, or (at your option) any later version.
   *
   *  This library is distributed in the hope that it will be useful,
  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  *  Lesser General Public License for more details.
  *
  *  You should have received a copy of the GNU Lesser General Public
  *  License along with this library; if not, write to the Free Software
  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  *
  * Please refer to the LGPL license at: http://www.gnu.org/copyleft/lesser.txt
  * The latest copy of this software may be found on http://www.xsocket.org/
  */
 package org.xsocket.connection.multiplexed.multiplexer;
 
 
 
 import java.util.UUID;
 
the simple implementation of the IMultiplexer

Author(s):
grro@xsocket.org
 
 public final class SimpleMultiplexer implements IMultiplexer {
 	
 	private static final Logger LOG = Logger.getLogger(SimpleMultiplexer.class.getName());
 	
 	private static byte VERSION = 1;
 	
 	private static final byte PIPELINE_OPENED = 0;
 	private static final byte PIPELINE_CLOSED = 1;
 	private static final byte PIPELINE_DATA = 99;


 
 		UUID uuid = UUID.randomUUID(); 
 		String pipelineId = uuid.toString();
 		
 		if (.isLoggable(.)) {
 			.fine("[" + connection.getId() + "] sending on pipeline " + pipelineId + " opened notification"); 
 		}
 			
 
 		FlushMode flushMode = connection.getFlushmode();
 		
 		ByteBuffer header = ByteBuffer.allocate(4 +1 + 1 + 16);
 		header.putInt(1 + 1 + 16);                       // packet length field
 		header.put();
 		header.put();                     // command
 		header.putLong(uuid.getMostSignificantBits());   // uuid 
 		header.putLong(uuid.getLeastSignificantBits());  // uuid
 		header.rewind();
 		connection.write(header);
 		connection.flush();
 		
 		connection.setFlushmode(flushMode);
 		
 		return pipelineId;
 	}


 
 	public void closePipeline(INonBlockingConnection connectionString pipelineIdthrows IOExceptionClosedChannelException {
 		if (.isLoggable(.)) {
 			.fine("[" + connection.getId() + "] sending on pipeline " + pipelineId + " closed notification"); 
 		}
 		
 		FlushMode flushMode = connection.getFlushmode();
 		
 		UUID uuid = UUID.fromString(pipelineId);
 				
 		ByteBuffer header = ByteBuffer.allocate(4 + 1 + 1 + 16);
		header.putInt(1 + 1 + 16);                       // packet length field
		header.put();
		header.put();                     // command
		header.putLong(uuid.getMostSignificantBits());   // uuid 
		header.putLong(uuid.getLeastSignificantBits());  // uuid
		header.rewind();
		connection.write(header);
		connection.flush();
		connection.setFlushmode(flushMode);
	}


	public void multiplex(INonBlockingConnection connectionString pipelineIdByteBuffer[] dataToWritethrows IOExceptionClosedChannelException {
		int dataLength = 0;
		for (ByteBuffer buffer : dataToWrite) {
			dataLength += buffer.remaining();
		}
			int size = 0;
			ByteBuffer[] buffers = new ByteBuffer[dataToWrite.length];
			for (int i = 0; i < buffers.lengthi++) {
				buffers[i] = dataToWrite[i].duplicate();
				size += buffers[i].remaining();
			}
			.fine("[" + connection.getId() + "] sending data on pipeline " + pipelineId + ": (" + DataConverter.toFormatedBytesSize(size) + ") " 
 					 + DataConverter.toString(buffers"UTF-8", 200)); 
		}
		UUID uuid = UUID.fromString(pipelineId);
		ByteBuffer header = ByteBuffer.allocate(4 + 1 + 1 + 16);
		header.putInt(1 + 1 + 16 + dataLength);          // packet length field
		header.put();
		header.put();                       // command
		header.putLong(uuid.getMostSignificantBits());   // uuid 
		header.putLong(uuid.getLeastSignificantBits());  // uuid
		header.rewind();
		connection.write(header);
		connection.write(dataToWrite);                   // data
		connection.flush();
	}


	public void demultiplex(INonBlockingConnection connectionIDemultiplexResultHandler resultHandlerthrows IOExceptionClosedChannelException {
		byte dataType = 0;
		String pipelineId = null
		ByteBuffer[] data = null;
			.fine("receive queue size " + connection.available());
		}
		int length = ConnectionUtils.validateSufficientDatasizeByIntLengthField(connection);
		byte version = connection.readByte();
		if (version != ) {
			throw new IOException("message with version " + version + " received. Expected is " + );
		}
		dataType = connection.readByte();
		long uuidMost = connection.readLong();
		long uuidLeast = connection.readLong();
		UUID uuid = new UUID(uuidMostuuidLeast);
		pipelineId = uuid.toString(); 
		data = connection.readByteBufferByLength(length - (1 + 1 + 16));
			.fine("[" + connection.getId() + "] got message for " + pipelineId);
		}
		switch (dataType) {
					int size = 0;
					ByteBuffer[] buffers = new ByteBuffer[data.length];
					for (int i = 0; i < buffers.lengthi++) {
						buffers[i] = data[i].duplicate();
						size += buffers[i].remaining();
					}
					.fine("[" + connection.getId() + "] received data packet on pipeline " + pipelineId + ": (" + DataConverter.toFormatedBytesSize(size) + ") " 
							 + DataConverter.toString(buffers"UTF-8", 200)); 
				}
				resultHandler.onPipelineData(pipelineIddata);
				break;
					.fine("[" + connection.getId() + "] received on pipeline " + pipelineId + " opened notification"); 
				}
				resultHandler.onPipelineOpend(pipelineId);
				break;
					.fine("[" + connection.getId() + "] received on pipeline " + pipelineId + " closed notification"); 
				}
				resultHandler.onPipelineClosed(pipelineId);
				break;
			default:
				.warning("received unknown message type " + dataType);
				break;	
		}
	}
New to GrepCode? Check out our FAQ X