001: /*
002: Copyright (c) 2007 Health Market Science, Inc.
003:
004: This library is free software; you can redistribute it and/or
005: modify it under the terms of the GNU Lesser General Public
006: License as published by the Free Software Foundation; either
007: version 2.1 of the License, or (at your option) any later version.
008:
009: This library is distributed in the hope that it will be useful,
010: but WITHOUT ANY WARRANTY; without even the implied warranty of
011: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: Lesser General Public License for more details.
013:
014: You should have received a copy of the GNU Lesser General Public
015: License along with this library; if not, write to the Free Software
016: Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
017: USA
018:
019: You can contact Health Market Science at info@healthmarketscience.com
020: or at the following address:
021:
022: Health Market Science
023: 2700 Horizon Drive
024: Suite 200
025: King of Prussia, PA 19406
026: */
027:
028: package com.healthmarketscience.jackcess;
029:
030: import org.apache.commons.lang.builder.CompareToBuilder;
031:
032: /**
033: * Uniquely identifies a row of data within the access database.
034: *
035: * @author james
036: */
037: public class RowId implements Comparable<RowId> {
038: /** special page number which will sort before any other valid page
039: number */
040: public static final int FIRST_PAGE_NUMBER = -1;
041: /** special page number which will sort after any other valid page
042: number */
043: public static final int LAST_PAGE_NUMBER = -2;
044:
045: /** special row number representing an invalid row number */
046: public static final int INVALID_ROW_NUMBER = -1;
047:
048: /** type attributes for RowIds which simplify comparisons */
049: public enum Type {
050: /** comparable type indicating this RowId should always compare less than
051: normal RowIds */
052: ALWAYS_FIRST,
053: /** comparable type indicating this RowId should always compare
054: normally */
055: NORMAL,
056: /** comparable type indicating this RowId should always compare greater
057: than normal RowIds */
058: ALWAYS_LAST;
059: }
060:
061: /** special rowId which will sort before any other valid rowId */
062: public static final RowId FIRST_ROW_ID = new RowId(
063: FIRST_PAGE_NUMBER, INVALID_ROW_NUMBER);
064:
065: /** special rowId which will sort after any other valid rowId */
066: public static final RowId LAST_ROW_ID = new RowId(LAST_PAGE_NUMBER,
067: INVALID_ROW_NUMBER);
068:
069: private final int _pageNumber;
070: private final int _rowNumber;
071: private final Type _type;
072:
073: /**
074: * Creates a new <code>RowId</code> instance.
075: *
076: */
077: public RowId(int pageNumber, int rowNumber) {
078: _pageNumber = pageNumber;
079: _rowNumber = rowNumber;
080: _type = ((_pageNumber == FIRST_PAGE_NUMBER) ? Type.ALWAYS_FIRST
081: : ((_pageNumber == LAST_PAGE_NUMBER) ? Type.ALWAYS_LAST
082: : Type.NORMAL));
083: }
084:
085: public int getPageNumber() {
086: return _pageNumber;
087: }
088:
089: public int getRowNumber() {
090: return _rowNumber;
091: }
092:
093: /**
094: * Returns {@code true} if this rowId potentially represents an actual row
095: * of data, {@code false} otherwise.
096: */
097: public boolean isValid() {
098: return ((getRowNumber() >= 0) && (getPageNumber() >= 0));
099: }
100:
101: public Type getType() {
102: return _type;
103: }
104:
105: public int compareTo(RowId other) {
106: return new CompareToBuilder()
107: .append(getType(), other.getType()).append(
108: getPageNumber(), other.getPageNumber()).append(
109: getRowNumber(), other.getRowNumber())
110: .toComparison();
111: }
112:
113: @Override
114: public int hashCode() {
115: return getPageNumber() ^ getRowNumber();
116: }
117:
118: @Override
119: public boolean equals(Object o) {
120: return ((this == o) || ((o != null)
121: && (getClass() == o.getClass())
122: && (getPageNumber() == ((RowId) o).getPageNumber()) && (getRowNumber() == ((RowId) o)
123: .getRowNumber())));
124: }
125:
126: @Override
127: public String toString() {
128: return getPageNumber() + ":" + getRowNumber();
129: }
130:
131: }
|