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 */
017package org.apache.activemq.kaha.impl.async;
018
019import java.io.DataInput;
020import java.io.DataOutput;
021import java.io.IOException;
022import java.util.concurrent.CountDownLatch;
023
024/**
025 * Used as a location in the data store.
026 * 
027 * 
028 */
029public 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}