View Javadoc

1   /*
2    *  Copyright 2006 Simon Raess
3    *
4    *  Licensed under the Apache License, Version 2.0 (the "License");
5    *  you may not use this file except in compliance with the License.
6    *  You may obtain a copy of the License at
7    *
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   *  Unless required by applicable law or agreed to in writing, software
11   *  distributed under the License is distributed on an "AS IS" BASIS,
12   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   *  See the License for the specific language governing permissions and
14   *  limitations under the License.
15   */
16  package net.sf.beep4j.internal;
17  
18  import java.nio.ByteBuffer;
19  
20  import net.sf.beep4j.internal.util.Assert;
21  import net.sf.beep4j.transport.Transport;
22  
23  public class Frame {
24  	private DataHeader header;
25  	private ByteBuffer payload;
26  	
27  	public Frame(DataHeader header, ByteBuffer payload) {
28  		Assert.notNull("header", header);
29  		Assert.notNull("payload", payload);
30  		this.header = header;
31  		this.payload = payload;
32  	}
33  	
34  	public DataHeader getHeader() {
35  		return header;
36  	}
37  	
38  	public MessageType getType() {
39  		return header.getType();
40  	}
41  	
42  	public int getChannelNumber() {
43  		return header.getChannel();
44  	}
45  	
46  	public boolean isIntermediate() {
47  		return header.isIntermediate();
48  	}
49  	
50  	public int getMessageNumber() {
51  		return header.getMessageNumber();
52  	}
53  	
54  	public long getSequenceNumber() {
55  		return header.getSequenceNumber();
56  	}
57  	
58  	public int getSize() {
59  		return header.getPayloadSize();
60  	}
61  	
62  	public ByteBuffer getPayload() {
63  		return payload;
64  	}
65  	
66  	public Frame[] split(int size) {
67  		Frame[] result = new Frame[2];
68  		
69  		DataHeader[] headers = header.split(size);
70  		ByteBuffer[] buffers = splitPayload(getPayload(), size);
71  		
72  		result[0] = new Frame(headers[0], buffers[0]);		
73  		result[1] = new Frame(headers[1], buffers[1]);
74  		
75  		return result;
76  	}
77  		
78  	private ByteBuffer[] splitPayload(ByteBuffer payload, int size) {
79  		ByteBuffer[] result = new ByteBuffer[2];
80  		
81  		payload.position(0).limit(size);
82  		result[0] = payload.slice();
83  		
84  		payload.position(size);
85  		payload.limit(payload.capacity());
86  		result[1] = payload.slice();
87  		
88  		return result;
89  	}
90  
91  	public void send(Transport transport) {
92  		ByteBuffer headerBuffer = header.asByteBuffer();
93  		
94  		ByteBuffer buffer = ByteBuffer.allocate(headerBuffer.remaining() + getSize() + 5);
95  		buffer.put(headerBuffer);
96  		buffer.put(getPayload());
97  		buffer.put(Constants.TRAILER_BYTES);
98  		buffer.flip();
99  		
100 		transport.sendBytes(buffer);
101 	}
102 	
103 	@Override
104 	public boolean equals(Object obj) {
105 		if (this == obj) {
106 			return true;
107 		} else if (obj == null) {
108 			return false;
109 		} else if (obj.getClass().equals(getClass())) {
110 			Frame frame = (Frame) obj;
111 			return header.equals(frame.header)
112 			    && payload.equals(frame.payload);
113 		} else {
114 			return false;
115 		}
116 	}
117 	
118 	@Override
119 	public String toString() {
120 		return "Frame[header=" + getHeader() + "]";
121 	}
122 
123 }