1 /***
2 *
3 * Copyright 2004 Hiram Chirino
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 **/
18 package org.codehaus.activemq.journal.impl;
19
20 import java.nio.ByteBuffer;
21
22
23 /***
24 * Serializes/Deserializes data records.
25 *
26 * @version $Revision: 1.2 $
27 */
28 public class Record {
29
30 static final public int RECORD_BASE_SIZE=RecordHeader.RECORD_HEADER_SIZE+RecordFooter.RECORD_FOOTER_SIZE;
31
32 final RecordHeader header = new RecordHeader();
33 final RecordFooter footer = new RecordFooter();
34 final ByteBuffer headerBuffer;
35 final ByteBuffer dataBuffer;
36 final ByteBuffer footerBuffer;
37 final Mark mark;
38
39 public Record(RecordHeader header, byte[] data) {
40 this( header.sequenceId, header.recordType, data, null);
41 }
42
43 public Record(final long sequenceId, final byte recordType, final byte data[], final Mark visitData) {
44 this.header.bulkSet(recordType, sequenceId, data);
45 this.headerBuffer = this.header.toByteBuffer();
46 this.dataBuffer = ByteBuffer.wrap( data );
47 this.footer.bulkSet(header, data);
48 this.footerBuffer = footer.toByteBuffer();
49 this.mark = visitData;
50 }
51
52
53 public RecordHeader getHeader() {
54 return header;
55 }
56
57 public Mark getMark() {
58 return mark;
59 }
60
61 public int remaining() {
62 return headerBuffer.remaining() + dataBuffer.remaining();
63 }
64
65 public void fill(ByteBuffer byteBuffer) {
66 fill( byteBuffer, headerBuffer);
67 fill( byteBuffer, dataBuffer);
68 fill( byteBuffer, footerBuffer);
69 }
70
71 /***
72 * Relative bulk put operation that copies bytes from src to dest. Unlike
73 * <code>ByteBuffer.put(ByteBuffer)</code> this will not throw a
74 * <code>java.nio.BufferOverflowException</code>. It will just put
75 * as many bytes as can fit into the dest object.
76 *
77 * @param byteBuffer
78 * @param headerBuffer2
79 */
80 private void fill(ByteBuffer dest, ByteBuffer src) {
81 int r =dest.remaining();
82 if( r ==0 )
83 return;
84
85 if( r < src.remaining() ) {
86
87 int limit = src.limit();
88 src.limit(src.position()+r);
89 dest.put(src);
90
91 src.limit(limit);
92 } else {
93 dest.put(src);
94 }
95
96 }
97
98 }