KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > transport > channel > ChannelUtils


1 /*
2  * Copyright (c) 2004, Bruce Lowery
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * - Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  * - Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * - Neither the name of GOSSIP nor the names of its contributors may be used
14  * to endorse or promote products derived from this software without
15  * specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27  * POSSIBILITY OF SUCH DAMAGE.
28  */

29 package transport.channel;
30
31 import java.io.ByteArrayInputStream JavaDoc;
32 import java.io.IOException JavaDoc;
33 import java.io.ObjectInputStream JavaDoc;
34 import java.nio.ByteBuffer JavaDoc;
35 import java.nio.channels.SocketChannel JavaDoc;
36
37 import org.apache.commons.logging.Log;
38 import org.apache.commons.logging.LogFactory;
39
40 import transport.packet.Packet;
41
42
43 public final class ChannelUtils
44 {
45     private static final Log LOG = LogFactory.getLog(ChannelUtils.class);
46     
47     public static final Packet readChannel(SocketChannel JavaDoc ch) throws IOException JavaDoc
48     {
49         if (LOG.isDebugEnabled())
50             LOG.debug("Reading channel "+ch.hashCode());
51         
52         ch.configureBlocking(true);
53         Packet p = null;
54         ByteBuffer JavaDoc int_buf = ByteBuffer.allocate( 4 );
55         int_buf.clear();
56         while( int_buf.hasRemaining() )
57         {
58             if( -1 == ch.read( int_buf ) )
59             {
60                 throw new IOException JavaDoc( "end-of-stream" );
61             }
62         }
63         
64         int_buf.flip();
65         int len = int_buf.getInt();
66
67         // Read remainder of record
68
byte[] data = new byte[ len ];
69         ByteBuffer JavaDoc data_buf = ByteBuffer.wrap( data );
70         data_buf.clear();
71         while( data_buf.hasRemaining() )
72         {
73             if( -1 == ch.read( data_buf ) )
74             {
75                 throw new IOException JavaDoc( "end-of-stream" );
76             }
77         }
78         
79         // Extract the object
80
ByteArrayInputStream JavaDoc bais = new ByteArrayInputStream JavaDoc( data );
81         ObjectInputStream JavaDoc ois = new ObjectInputStream JavaDoc( bais );
82         try
83         {
84             p = (Packet) ois.readObject();
85             p.setChannelID(ch.hashCode());
86         }
87         catch (ClassNotFoundException JavaDoc e)
88         {
89             IOException JavaDoc ioe = new IOException JavaDoc("Packet deserialization failed");
90             ioe.initCause(e);
91             throw ioe;
92         }
93         finally
94         {
95             ois.close();
96             bais.close();
97             data_buf = null;
98             int_buf = null;
99         }
100
101         return p;
102     }
103
104 }
105
Popular Tags