001 /**
002 * Licensed to the Apache Software Foundation (ASF) under one or more
003 * contributor license agreements. See the NOTICE file distributed with
004 * this work for additional information regarding copyright ownership.
005 * The ASF licenses this file to You under the Apache License, Version 2.0
006 * (the "License"); you may not use this file except in compliance with
007 * the License. You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.kahadb.journal;
018
019 import java.io.DataInput;
020 import java.io.DataOutput;
021 import java.io.IOException;
022 import java.util.concurrent.CountDownLatch;
023
024 /**
025 * Used as a location in the data store.
026 *
027 * @version $Revision: 741741 $
028 */
029 public final class Location implements Comparable<Location> {
030
031 public static final byte USER_TYPE = 1;
032 public static final byte NOT_SET_TYPE = 0;
033 public static final int NOT_SET = -1;
034
035 private int dataFileId = NOT_SET;
036 private int offset = NOT_SET;
037 private int size = NOT_SET;
038 private byte type = NOT_SET_TYPE;
039 private CountDownLatch latch;
040
041 public Location() {
042 }
043
044 public Location(Location item) {
045 this.dataFileId = item.dataFileId;
046 this.offset = item.offset;
047 this.size = item.size;
048 this.type = item.type;
049 }
050
051 public Location(int dataFileId, int offset) {
052 this.dataFileId=dataFileId;
053 this.offset=offset;
054 }
055
056 boolean isValid() {
057 return dataFileId != NOT_SET;
058 }
059
060 /**
061 * @return the size of the data record including the header.
062 */
063 public int getSize() {
064 return size;
065 }
066
067 /**
068 * @param size the size of the data record including the header.
069 */
070 public void setSize(int size) {
071 this.size = size;
072 }
073
074 public int getOffset() {
075 return offset;
076 }
077
078 public void setOffset(int offset) {
079 this.offset = offset;
080 }
081
082 public int getDataFileId() {
083 return dataFileId;
084 }
085
086 public void setDataFileId(int file) {
087 this.dataFileId = file;
088 }
089
090 public byte getType() {
091 return type;
092 }
093
094 public void setType(byte type) {
095 this.type = type;
096 }
097
098 public String toString() {
099 return dataFileId+":"+offset;
100 }
101
102 public void writeExternal(DataOutput dos) throws IOException {
103 dos.writeInt(dataFileId);
104 dos.writeInt(offset);
105 dos.writeInt(size);
106 dos.writeByte(type);
107 }
108
109 public void readExternal(DataInput dis) throws IOException {
110 dataFileId = dis.readInt();
111 offset = dis.readInt();
112 size = dis.readInt();
113 type = dis.readByte();
114 }
115
116 public CountDownLatch getLatch() {
117 return latch;
118 }
119
120 public void setLatch(CountDownLatch latch) {
121 this.latch = latch;
122 }
123
124 public int compareTo(Location o) {
125 Location l = (Location)o;
126 if (dataFileId == l.dataFileId) {
127 int rc = offset - l.offset;
128 return rc;
129 }
130 return dataFileId - l.dataFileId;
131 }
132
133 public boolean equals(Object o) {
134 boolean result = false;
135 if (o instanceof Location) {
136 result = compareTo((Location)o) == 0;
137 }
138 return result;
139 }
140
141 public int hashCode() {
142 return dataFileId ^ offset;
143 }
144
145 }