View Javadoc

    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      // Method used to mange the state of the log file.
    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     // Method used to maitain the list of LogFileNodes used by
    117     // the LogFileManager
    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 }