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.activemq.kaha.impl.async;
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 *
028 */
029 public final class Location implements Comparable<Location> {
030
031 public static final byte MARK_TYPE = -1;
032 public static final byte USER_TYPE = 1;
033 public static final byte NOT_SET_TYPE = 0;
034 public static final int NOT_SET = -1;
035
036 private int dataFileId = NOT_SET;
037 private int offset = NOT_SET;
038 private int size = NOT_SET;
039 private byte type = NOT_SET_TYPE;
040 private CountDownLatch latch;
041
042 public Location() {
043 }
044
045 Location(Location item) {
046 this.dataFileId = item.dataFileId;
047 this.offset = item.offset;
048 this.size = item.size;
049 this.type = item.type;
050 }
051
052 boolean isValid() {
053 return dataFileId != NOT_SET;
054 }
055
056 /**
057 * @return the size of the data record including the header.
058 */
059 public int getSize() {
060 return size;
061 }
062
063 /**
064 * @param size the size of the data record including the header.
065 */
066 public void setSize(int size) {
067 this.size = size;
068 }
069
070 /**
071 * @return the size of the payload of the record.
072 */
073 public int getPaylodSize() {
074 return size - AsyncDataManager.ITEM_HEAD_FOOT_SPACE;
075 }
076
077 public int getOffset() {
078 return offset;
079 }
080
081 public void setOffset(int offset) {
082 this.offset = offset;
083 }
084
085 public int getDataFileId() {
086 return dataFileId;
087 }
088
089 public void setDataFileId(int file) {
090 this.dataFileId = file;
091 }
092
093 public byte getType() {
094 return type;
095 }
096
097 public void setType(byte type) {
098 this.type = type;
099 }
100
101 public String toString() {
102 String result = "offset = " + offset + ", file = " + dataFileId + ", size = " + size + ", type = "
103 + type;
104 return result;
105 }
106
107 public void writeExternal(DataOutput dos) throws IOException {
108 dos.writeInt(dataFileId);
109 dos.writeInt(offset);
110 dos.writeInt(size);
111 dos.writeByte(type);
112 }
113
114 public void readExternal(DataInput dis) throws IOException {
115 dataFileId = dis.readInt();
116 offset = dis.readInt();
117 size = dis.readInt();
118 type = dis.readByte();
119 }
120
121 public CountDownLatch getLatch() {
122 return latch;
123 }
124
125 public void setLatch(CountDownLatch latch) {
126 this.latch = latch;
127 }
128
129 public int compareTo(Location o) {
130 Location l = (Location)o;
131 if (dataFileId == l.dataFileId) {
132 int rc = offset - l.offset;
133 return rc;
134 }
135 return dataFileId - l.dataFileId;
136 }
137
138 public boolean equals(Object o) {
139 boolean result = false;
140 if (o instanceof Location) {
141 result = compareTo((Location)o) == 0;
142 }
143 return result;
144 }
145
146 public int hashCode() {
147 return dataFileId ^ offset;
148 }
149
150 }