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.activeio.journal.active;
19
20 import java.io.DataInput;
21 import java.io.DataOutput;
22 import java.io.IOException;
23
24 /***
25 * @version $Revision: 1.1 $
26 */
27 final class LogFileNode {
28
29 static final public int SERIALIZED_SIZE = 10;
30
31 private final LogFile logFile;
32 private LogFileNode next;
33
34 /*** The id of the log file. */
35 private int id;
36 /*** Does it have live records in it? */
37 private boolean active = false;
38 /*** Is the log file in readonly mode */
39 private boolean readOnly;
40 /*** The location of the next append offset */
41 private int appendOffset = 0;
42
43 public LogFileNode(LogFile logFile) {
44 this.logFile = logFile;
45 }
46
47 public LogFile getLogFile() {
48 return logFile;
49 }
50
51
52
53
54
55
56
57 public void activate(int id) {
58 if (active)
59 throw new IllegalStateException("Log allready active.");
60
61 this.id = id;
62 this.readOnly = false;
63 this.active = true;
64 this.appendOffset = 0;
65 }
66
67 public int getId() {
68 return id;
69 }
70
71 public void setReadOnly(boolean enable) {
72 if (!active)
73 throw new IllegalStateException("Log not active.");
74 this.readOnly = enable;
75 }
76
77 public void reinitialize() throws IOException {
78 if (active)
79 throw new IllegalStateException("Cannot reinitialize an active log.");
80
81 this.id = -1;
82 this.readOnly = true;
83 this.appendOffset = 0;
84 getLogFile().resize();
85 }
86
87 public boolean isActive() {
88 return active;
89 }
90
91 public void setActive(boolean enable) {
92 active = enable;
93 }
94
95 public int getAppendOffset() {
96 return appendOffset;
97 }
98
99
100 public Location getFirstRecordLocation() {
101 if (isActive() && appendOffset > 0)
102 return new Location(getId(), 0);
103 return null;
104 }
105
106 public boolean isReadOnly() {
107 return readOnly;
108 }
109
110 public void appended(int i) {
111 appendOffset += i;
112 }
113
114
115
116
117
118
119
120
121 public LogFileNode getNext() {
122 return next;
123 }
124
125 public void setNext(LogFileNode state) {
126 next = state;
127 }
128
129 public LogFileNode getNextActive() {
130 if (getNext().isActive())
131 return getNext();
132 return null;
133 }
134
135 public LogFileNode getNextInactive() {
136 if (!getNext().isActive())
137 return getNext();
138 return null;
139 }
140
141 /***
142 * @param data
143 * @throws IOException
144 */
145 public void writeExternal(DataOutput data) throws IOException {
146 data.writeInt(id);
147 data.writeBoolean(active);
148 data.writeBoolean(readOnly);
149 data.writeInt(appendOffset);
150 }
151
152 /***
153 * @param data
154 * @throws IOException
155 */
156 public void readExternal(DataInput data) throws IOException {
157 id = data.readInt();
158 active = data.readBoolean();
159 readOnly = data.readBoolean();
160 appendOffset = data.readInt();
161 }
162
163 public void setAppendOffset(int offset) {
164 appendOffset = offset;
165 }
166
167 }