/**
* TNTConcept Easy Enterprise Management by Autentia Real Bussiness Solution S.L.
* Copyright (C) 2007 Autentia Real Bussiness Solution S.L.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License.
*
* 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.autentia.tnt.version;
import com.autentia.tnt.util.HibernateUtil;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
/**
*
* @author ivan
*/
public class Version implements Comparable<Version>, Cloneable
{
private static final Log log = LogFactory.getLog(Version.class);
public static final int MAJOR = 0;
public static final int MINOR = 1;
public static final int PATCH = 2;
private static Version appVersion = null;
private int major = 0;
private int minor = 0;
private int patch = 0;
public static Version getApplicationVersion()
{
if( appVersion==null )
{
try
{
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream("com/autentia/tnt/version/info.properties");
Properties props = new Properties();
props.load(is);
appVersion = new Version( props.getProperty("number") );
}
catch( Exception e )
{
log.fatal("static - cannot read version",e);
}
}
return appVersion;
}
public static Version getDatabaseVersion() throws SQLException
{
Session ses = HibernateUtil.getSessionFactory().openSession();
try
{
return getDatabaseVersion( ses.connection() );
}
catch( SQLException e )
{
throw e;
}
finally
{
ses.close();
}
}
public static Version getDatabaseVersion( Connection con ) throws SQLException
{
Statement stmt = null;
ResultSet rs = null;
String ret = null;
try {
stmt = con.createStatement();
rs = stmt.executeQuery("select version from Version");
if( rs.next() ){
ret = rs.getString("version");
}
} catch( SQLException e ) {
throw e;
} finally {
if( rs!=null ){
try {
rs.close();
} catch (SQLException e){
log.error("Error al liberar el resultset", e);
}
}
if( stmt!=null ) {
try {
stmt.close();
} catch (SQLException e){
log.error("Error al liberar el statement", e);
}
}
}
return new Version(ret==null?"0":ret);
}
/** Creates a new instance of Version */
public Version( int major, int minor, int patch )
{
this.major = major;
this.minor = minor;
this.patch = patch;
}
/** Creates a new instance of Version */
public Version( String number ) throws IllegalArgumentException
{
// Remove "-SNAPSHOT" if present
if( number.endsWith("-SNAPSHOT") ){
number = number.substring(0,number.length()-9);
}
String[] numbers = number.split("\\.");
if(numbers.length < 1 || numbers.length > 3){
throw new IllegalArgumentException("Invalid version number: "+number);
}
if(numbers.length >=1 ){
this.major = Integer.parseInt(numbers[0]);
}
if(numbers.length>=2){
this.minor = Integer.parseInt(numbers[1]);
}
if(numbers.length == 3){
this.patch = Integer.parseInt(numbers[2]);
}
}
public int getMajor()
{
return major;
}
public int getMinor()
{
return minor;
}
public int getPatch()
{
return patch;
}
public Version clone() throws CloneNotSupportedException
{
return (Version)super.clone();
}
public String toString()
{
return toString(PATCH);
}
public String toString(int level)
{
StringBuilder sb = new StringBuilder();
if( level>=MAJOR ){
sb.append(Integer.toString(major));
if( level>=MINOR ){
sb.append(".");
sb.append(Integer.toString(minor));
if( level>=PATCH ){
sb.append(".");
sb.append(Integer.toString(patch));
}
}
}
return sb.toString();
}
public boolean equals(Object that)
{
if( !(that instanceof Version) )
{
return false;
}
else
{
return compareTo((Version)that)==0;
}
}
public int compareTo(Version that)
{
return compareTo(that,PATCH);
}
public int compareTo(Version that, int level)
{
int diff;
diff = this.major - that.major;
if( diff!=0 || level==MAJOR ) return diff;
diff = this.minor - that.minor;
if( diff!=0 || level==MINOR ) return diff;
diff = this.patch - that.patch;
return diff;
}
public int hashCode(){
return (this.major + "." + this.minor + "." + this.patch).hashCode();
}
}