/** * edu.utexas.GeDBIT.type.Fragment 2006.05.24 * * Copyright Information: * * Change Log: * 2006.05.24: Created, by Willard */ package GeDBIT.type; import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import GeDBIT.index.TableManager; /** * @author Willard * */ public class Fragment extends IndexObject { /** * */ private static final long serialVersionUID = -7087849259510041868L; /** * */ private SequenceTable sTable; /** * */ public Fragment() { } /** * @param table * @param rowID */ public Fragment(SequenceTable table, int rowID) { super(rowID); this.sTable = table; } /** * @param i * @return */ public Symbol get(int i) { return sTable.alphabet .get(sTable.sequences[sTable.originalRowIDs[rowIDStart]].data[sTable.fragmentOffsets[rowIDStart] + i]); } /* * (non-Javadoc) * * @see GeDBIT.type.IndexObject#size() */ public int size() { return sTable.fragmentLength; } /* * (non-Javadoc) * * @see GeDBIT.type.IndexObject#expand() */ public IndexObject[] expand() { IndexObject[] dbO = new IndexObject[rowIDLength]; for (int i = 0; i < rowIDLength; i++) { dbO[i] = new Fragment(sTable, rowIDStart + i); } return dbO; } /* * (non-Javadoc) * * @see GeDBIT.type.IndexObject#compareTo(GeDBIT.type.IndexObject) */ public int compareTo(IndexObject oThat) { if (!(oThat instanceof Fragment)) throw new Error("not compatible"); Fragment that = (Fragment) oThat; if (this == that) return 0; if (this.size() < that.size()) return -1; else if (this.size() > that.size()) return 1; else { for (int i = 0; i < sTable.fragmentLength; i++) { byte byte1 = sTable.sequences[sTable.originalRowIDs[rowIDStart]].data[sTable.fragmentOffsets[rowIDStart] + i]; byte byte2 = that.sTable.sequences[that.sTable.originalRowIDs[that.rowIDStart]].data[that.sTable.fragmentOffsets[that.rowIDStart] + i]; if (byte1 < byte2) return -1; else if (byte1 > byte2) return 1; } return 0; } } /* * (non-Javadoc) * * @see java.lang.Object#equals(java.lang.Object) */ public final boolean equals(Object object) { if (object == null) return false; if (!(object instanceof Fragment)) return false; Fragment that = (Fragment) object; if (this.size() != that.size()) return false; if (!this.sTable.alphabet.equals(that.sTable.alphabet)) return false; for (int i = 0; i < size(); ++i) if (this.get(i) != that.get(i)) return false; return true; } // taken from Joshua Bloch's Effective Java public int hashCode() { int result = super.hashCode(); result = 37 * result + size(); result = 37 * result + sTable.alphabet.hashCode(); for (int i = 0; i < size(); ++i) { result = 37 * result + get(i).hashCode(); } return result; } /* * (non-Javadoc) * * @see java.lang.Object#toString() */ public String toString() { StringBuffer sourceSequence = new StringBuffer(rowIDLength); for (int i = 0; i < rowIDLength; i++) { sourceSequence .append(sTable.sequences[sTable.getOriginalRowID(rowIDStart + i)].sequenceID).append(", offset: ") .append(sTable.getFragmentOffset(rowIDStart + i)) .append(" "); } StringBuffer fragment = new StringBuffer(sTable.fragmentLength); for (int i = 0; i < sTable.fragmentLength; i++) { fragment.append(get(i)); } return "fragment: " + fragment.toString() + " source: " + sourceSequence.toString(); } /* * (non-Javadoc) * * @see GeDBIT.type.IndexObject#readExternal(java.io.ObjectInput) */ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { super.readExternal(in); String indexPrefix = (String) in.readObject(); sTable = (SequenceTable) TableManager.getTableManager(indexPrefix) .getTable(in.readInt()); } /* * (non-Javadoc) * * @see GeDBIT.type.IndexObject#writeExternal(java.io.ObjectOutput) */ public void writeExternal(ObjectOutput out) throws IOException { super.writeExternal(out); out.writeObject(sTable.getIndexPrefix()); out.writeInt(sTable.getTableLocation()); } }