/*
* Bibliothek - DockingFrames
* Library built on Java/Swing, allows the user to "drag and drop"
* panels containing any Swing-Component the developer likes to add.
*
* Copyright (C) 2007 Benjamin Sigg
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Benjamin Sigg
* benjamin_sigg@gmx.ch
* CH - Switzerland
*/
package bibliothek.util;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
/**
* A version represents a version of this library.
* @author Benjamin Sigg
*/
public final class Version implements Comparable<Version>{
/** the version 1.0.4 */
public static final Version VERSION_1_0_4 = new Version( 1, 0, 4, null );
/** the version 1.0.5 */
public static final Version VERSION_1_0_5 = new Version( 1, 0, 5, null );
/** the version 1.0.6 */
public static final Version VERSION_1_0_6 = new Version( 1, 0, 6, null );
/** the version 1.0.7 */
public static final Version VERSION_1_0_7 = new Version( 1, 0, 7, null );
/** the version 1.0.8 */
public static final Version VERSION_1_0_8 = new Version( 1, 0, 8, null );
/** the version 1.0.8 (since preview 4) */
public static final Version VERSION_1_0_8a = new Version( 1, 0, 8, "a" );
/** the version 1.1.0 */
public static final Version VERSION_1_1_0 = new Version( 1, 1, 0, null );
/** the version 1.1.0 (since preview 5)*/
public static final Version VERSION_1_1_0a = new Version( 1, 1, 0, "a" );
/** the version 1.1.1 */
public static final Version VERSION_1_1_1 = new Version( 1, 1, 1, null );
/** the version 1.1.1 (since preview 5c) */
public static final Version VERSION_1_1_1a = new Version( 1, 1, 1, "a" );
/** version 1.1.2 */
public static final Version VERSION_1_1_2 = new Version( 1, 1, 2, null );
/** The current version of this library. This constant will be changed for every release. */
public static final Version CURRENT = VERSION_1_1_2;
private int major;
private int minor;
private int mikro;
private String add;
/**
* Creates a new version
* @param major the major version
* @param minor the minor version
* @param mikro the mikro version
* @param add additional comment, <code>null</code> will be replaced by the empty string
*/
public Version( int major, int minor, int mikro, String add ){
if( major < 0 )
throw new IllegalArgumentException( "major must not be smaller than 0" );
if( minor < 0 )
throw new IllegalArgumentException( "minor must not be smaller than 0" );
if( mikro < 0 )
throw new IllegalArgumentException( "mikro must not be smaller than 0" );
if( add == null )
add = "";
this.major = major;
this.mikro = mikro;
this.minor = minor;
this.add = add;
}
/**
* Writes the contents of a version.
* @param out the stream to write into
* @param version the version to write
* @throws IOException if an error occurs
*/
public static void write( DataOutputStream out, Version version ) throws IOException{
out.writeByte( 1 );
out.writeInt( version.major );
out.writeInt( version.minor );
out.writeInt( version.mikro );
out.writeUTF( version.add );
}
/**
* Reads a version that was stored earlier.
* @param in the stream to read from
* @return the new version
* @throws IOException if an error occurs or the format is unknown
*/
public static Version read( DataInputStream in ) throws IOException{
byte version = in.readByte();
if( version != 1 )
throw new IOException( "Unknown format for version" );
int major = in.readInt();
int minor = in.readInt();
int mikro = in.readInt();
String add = in.readUTF();
return new Version( major, minor, mikro, add );
}
/**
* Checks whether this version is greater than the current version and
* throws an exception if so. This method is intended to be called from code
* that is loading some file, but other usages are possible as well.
* @throws IOException thrown if the current version is smaller than <code>this</code>.
*/
public void checkCurrent() throws IOException{
if( this.compareTo( CURRENT ) > 0 )
throw new IOException( "Trying to read something from the future: " + this + " is greater than the current version " + CURRENT );
}
/**
* Gets the additional information
* @return the additional information, can be an empty string
*/
public String getAdd() {
return add;
}
/**
* Gets the major number.
* @return the major
*/
public int getMajor() {
return major;
}
/**
* Gets the mikro number
* @return the mikro
*/
public int getMikro() {
return mikro;
}
/**
* Gets the minor number
* @return the minor
*/
public int getMinor() {
return minor;
}
public int compareTo( Version o ) {
if( major > o.major )
return 1;
if( major < o.major )
return -1;
if( minor > o.minor )
return 1;
if( minor < o.minor )
return -1;
if( mikro > o.mikro )
return 1;
if( mikro < o.mikro )
return -1;
return add.compareTo( o.add );
}
@Override
public String toString() {
return major + "." + minor + "." + mikro + add;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ( ( add == null ) ? 0 : add.hashCode() );
result = prime * result + major;
result = prime * result + mikro;
result = prime * result + minor;
return result;
}
@Override
public boolean equals( Object obj ) {
if( this == obj )
return true;
if( obj == null )
return false;
if( getClass() != obj.getClass() )
return false;
final Version other = (Version)obj;
if( add == null ) {
if( other.add != null )
return false;
} else if( !add.equals( other.add ) )
return false;
if( major != other.major )
return false;
if( mikro != other.mikro )
return false;
if( minor != other.minor )
return false;
return true;
}
}