/*
* This file is part of ELKI:
* Environment for Developing KDD-Applications Supported by Index-Structures
*
* Copyright (C) 2017
* ELKI Development Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package de.lmu.ifi.dbs.elki.persistent;
import java.io.Externalizable;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
/**
* Abstract superclass for pages.
*
* @author Elke Achtert
* @since 0.2
*/
// todo elke revise comments
public abstract class AbstractExternalizablePage implements Externalizable, Page {
/**
* Serial version
*/
private static final long serialVersionUID = 2;
/**
* The unique id if this page.
*/
private int id;
/**
* The dirty flag of this page.
*/
private transient boolean dirty;
/**
* Empty constructor for Externalizable interface.
*/
public AbstractExternalizablePage() {
super();
this.id = -1;
}
/**
* Returns the unique id of this Page.
*
* @return the unique id of this Page
*/
@Override
public final int getPageID() {
return id;
}
/**
* Sets the unique id of this Page.
*
* @param id the id to be set
*/
@Override
public final void setPageID(int id) {
this.id = id;
}
/**
* Returns true if this page is dirty, false otherwise.
*
* @return true if this page is dirty, false otherwise
*/
@Override
public final boolean isDirty() {
return dirty;
}
/**
* Sets the dirty flag of this page.
*
* @param dirty the dirty flag to be set
*/
@Override
public final void setDirty(boolean dirty) {
this.dirty = dirty;
}
/**
* The object implements the writeExternal method to save its contents by
* calling the methods of DataOutput for its primitive values or calling the
* writeObject method of ObjectOutput for objects, strings, and arrays.
*
* @param out the stream to write the object to
* @throws java.io.IOException Includes any I/O exceptions that may occur
* @serialData Overriding methods should use this tag to describe the data
* layout of this Externalizable object. List the sequence of
* element types and, if possible, relate the element to a
* public/protected field and/or method of this Externalizable
* class.
*/
@Override
public void writeExternal(ObjectOutput out) throws IOException {
out.writeInt(id);
}
/**
* The object implements the readExternal method to restore its contents by
* calling the methods of DataInput for primitive types and readObject for
* objects, strings and arrays. The readExternal method must read the values
* in the same sequence and with the same types as were written by
* writeExternal.
*
* @param in the stream to read data from in order to restore the object
* @throws java.io.IOException if I/O errors occur
* @throws ClassNotFoundException If the class for an object being restored
* cannot be found.
*/
@Override
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
id = in.readInt();
}
/**
* Returns a string representation of the object.
*
* @return a string representation of the object
*/
@Override
public String toString() {
return Integer.toString(id);
}
/**
* Indicates whether some other object is "equal to" this one.
*
* @param o the object to be tested
* @return true, if o is an AbstractNode and has the same id and the same
* entries as this node.
*/
@Override
public boolean equals(Object o) {
return this == o || (o != null && getClass() == o.getClass() //
&& id == ((AbstractExternalizablePage) o).getPageID());
}
/**
* Returns as hash code value for this node the id of this node.
*
* @return the id of this node
*/
@Override
public int hashCode() {
return id;
}
}