franta-hg@15: /**
franta-hg@15: * Free Telco Dictionary
franta-hg@15: * Copyright © 2013 František Kučera (frantovo.cz)
franta-hg@15: *
franta-hg@15: * This program is free software: you can redistribute it and/or modify
franta-hg@15: * it under the terms of the GNU General Public License as published by
franta-hg@151: * the Free Software Foundation, version 3 of the License.
franta-hg@15: *
franta-hg@15: * This program is distributed in the hope that it will be useful,
franta-hg@15: * but WITHOUT ANY WARRANTY; without even the implied warranty of
franta-hg@15: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
franta-hg@15: * GNU General Public License for more details.
franta-hg@15: *
franta-hg@15: * You should have received a copy of the GNU General Public License
franta-hg@15: * along with this program. If not, see .
franta-hg@15: */
franta-hg@15: package cz.frantovo.telco.dictionary;
franta-hg@15:
franta-hg@17: import java.io.DataOutputStream;
franta-hg@17: import java.io.IOException;
franta-hg@17: import java.nio.charset.StandardCharsets;
franta-hg@17: import java.util.Objects;
franta-hg@17:
franta-hg@15: /**
franta-hg@130: * Represents one item in StarDict index file (.idx)
franta-hg@130: * which links the term and its position and length in data file (.dict)
franta-hg@130: *
franta-hg@15: * @author Ing. František Kučera (frantovo.cz)
franta-hg@15: */
franta-hg@15: public class IndexEntry implements Comparable {
franta-hg@15:
franta-hg@17: private String name;
franta-hg@17: private long offset;
franta-hg@17: private long length;
franta-hg@17: private long ordinal;
franta-hg@17:
franta-hg@17: public IndexEntry(String name, long offset, long length) {
franta-hg@17: this.name = name;
franta-hg@17: this.offset = offset;
franta-hg@17: this.length = length;
franta-hg@17: }
franta-hg@17:
franta-hg@17: public void serialize(DataOutputStream indexOutputStream) throws IOException {
franta-hg@17: indexOutputStream.write(name.getBytes(StandardCharsets.UTF_8));
franta-hg@17: indexOutputStream.write(0);
franta-hg@17: indexOutputStream.writeInt((int) offset); // unsigned int 32
franta-hg@17: indexOutputStream.writeInt((int) length); // unsigned int 32
franta-hg@17: }
franta-hg@17:
franta-hg@17: public void setOrdinal(long ordinal) {
franta-hg@17: this.ordinal = ordinal;
franta-hg@17: }
franta-hg@17:
franta-hg@17: public long getOrdinal() {
franta-hg@17: return ordinal;
franta-hg@17: }
franta-hg@17:
franta-hg@15: @Override
franta-hg@15: public int compareTo(IndexEntry o) {
franta-hg@17: int nameDiff = name.compareTo(o.name);
franta-hg@17: if (nameDiff == 0) {
franta-hg@17: int offsetDiff = ((Long) offset).compareTo(o.offset);
franta-hg@17: if (offsetDiff == 0) {
franta-hg@17: return ((Long) length).compareTo(o.length);
franta-hg@17: } else {
franta-hg@17: return offsetDiff;
franta-hg@17: }
franta-hg@17: } else {
franta-hg@17: return nameDiff;
franta-hg@17: }
franta-hg@17: }
franta-hg@17:
franta-hg@17: @Override
franta-hg@17: public boolean equals(Object o) {
franta-hg@17: return o instanceof IndexEntry && compareTo((IndexEntry) o) == 0;
franta-hg@17: }
franta-hg@17:
franta-hg@17: @Override
franta-hg@17: public int hashCode() {
franta-hg@17: int hash = 5;
franta-hg@17: hash = 53 * hash + Objects.hashCode(this.name);
franta-hg@17: hash = 53 * hash + (int) (this.offset ^ (this.offset >>> 32));
franta-hg@17: hash = 53 * hash + (int) (this.length ^ (this.length >>> 32));
franta-hg@17: return hash;
franta-hg@15: }
franta-hg@15: }