/**
* Copyright 2007-2008 University Of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package edu.isi.pegasus.planner.catalog.classes;
/**
* A container class to keep system information associated with a Site entry in
* the Site Catalog or a Transformation in the Transformation Catalog.
*
* The class follows the NMI conventions for specifying Architecture/ OS and OS release.
*
*
* @author Karan Vahi
* @version $Revision$
*/
public class SysInfo implements Cloneable {
/**
* Enumerates the new OS types supported in Pegasus.
*/
public enum OS {
linux, sunos, aix, macosx, windows
}
/**
* Enumerates the new architecture types supported in Pegasus.
*/
public enum Architecture {
x86, x86_64, ppc, ppc_64, ia64, sparcv7, sparcv9, amd64
}
/**
* The default OS the entry is associated with if none is specified
*/
public static final OS DEFAULT_OS = OS.linux;
/**
* The default Architecture the entry is associated with if none is specified
*/
public static final Architecture DEFAULT_ARCHITECTURE = Architecture.x86_64;
/**
* The architecture.
*/
protected Architecture mArchitecture;
/**
* The Operating System.
*/
protected OS mOS;
/**
* The Operating System Release. Optional.
*/
protected String mOSRelease;
/**
* The Operating System Version. Optional.
*/
protected String mOSVersion;
/**
* The Glibc version. Optional.
*/
protected String mGlibc;
/**
* The default constructor.
*/
public SysInfo(){
mArchitecture = SysInfo.DEFAULT_ARCHITECTURE;
mOS = SysInfo.DEFAULT_OS;
mOSRelease = "";
mOSVersion = "";
mGlibc = "";
}
/**
* This constructor takes the system information in the format arch::os:osversion:glibc
* @param system the system information string
*/
public SysInfo(String system){
if (system != null) {
String s1[] = system.split("::", 2);
if (s1.length == 2) {
if(isValidArchitecture(s1[0].trim())){
mArchitecture =Architecture.valueOf(s1[0].trim());
}else {
throw new IllegalStateException(
"Error: Illegal Architecture defined. Please specify one of the predefined types \n [x86, x86_64, ppc, ppc_64, ia64, sparcv7, sparcv9, amd64]");
}
String s2[] = s1[1].split(":", 3);
if(isValidOS(s2[0].trim())){
mOS = OS.valueOf(s2[0].trim());
}else {
throw new IllegalStateException(
"Error: Illegal Operating System defined. Please specify one of the predefined types \n [LINUX, SUNOS, AIX, MACOSX, WINDOWS]");
}
for (int i = 1; i < s2.length; i++) {
if (i == 1) {
mOSVersion = s2[i];
}
if (i == 2) {
mGlibc = s2[i];
}
}
} else {
throw new IllegalStateException(
"Error : Please check your system info string");
}
} else {
mArchitecture = SysInfo.DEFAULT_ARCHITECTURE;
mOS = SysInfo.DEFAULT_OS;
mOSRelease = "";
mOSVersion = "";
mGlibc = "";
}
}
/**
* Checks if the architecture is a valid supported architecture
* @param arch architecture
* @return true if it is a valid supported architecture, false otherwise
*/
private static boolean isValidArchitecture(String arch){
for(Architecture architecture : Architecture.values()){
if(architecture.toString().equals(arch))
return true;
}
return false;
}
/**
* Checks if the operating system is a valid supported operating system
* @param os operating system
* @return true if it is a valid supported operating system, false otherwise
*/
private static boolean isValidOS(String os){
for(OS osystem : OS.values()){
if(osystem.toString().equals(os))
return true;
}
return false;
}
/**
* Sets the architecture of the site.
*
* @param arch the architecture.
*/
public void setArchitecture( Architecture arch ){
mArchitecture = arch;
}
/**
* Returns the architecture of the site.
*
* @return the architecture.
*/
public Architecture getArchitecture( ){
return mArchitecture;
}
/**
* Sets the OS of the site.
*
* @param os the os of the site.
*/
public void setOS( OS os ){
mOS = os;
}
/**
* Returns the OS of the site.
*
* @return the OS
*/
public OS getOS( ){
return mOS;
}
/**
* Sets the OS release of the site.
*
* @param release the os releaseof the site.
*/
public void setOSRelease( String release ){
mOSRelease = release;
}
/**
* Returns the OS release of the site.
*
* @return the OS
*/
public String getOSRelease( ){
return mOSRelease;
}
/**
* Sets the OS version of the site.
*
* @param version the os versionof the site.
*/
public void setOSVersion( String version ){
mOSVersion = version;
}
/**
* Returns the OS version of the site.
*
* @return the OS
*/
public String getOSVersion( ){
return mOSVersion;
}
/**
* Sets the glibc version on the site.
*
* @param version the glibc version of the site.
*/
public void setGlibc( String version ){
mGlibc = version;
}
/**
* Returns the glibc version of the site.
*
* @return the OS
*/
public String getGlibc( ){
return mGlibc;
}
/**
* Check if the system information matches.
*
* @param obj to be compared.
*
* @return boolean
*/
public boolean equals(Object obj) {
boolean result = false;
if( obj instanceof SysInfo ){
SysInfo sysinfo = (SysInfo)obj;
result = this.getArchitecture().equals( sysinfo.getArchitecture() ) &&
this.getOS().equals( sysinfo.getOS() ) &&
this.getOSRelease().equals( sysinfo.getOSRelease() ) &&
this.getOSVersion().equals( sysinfo.getOSVersion() ) &&
this.getGlibc().equals( sysinfo.getGlibc() );
}
return result;
}
/**
* Returns the clone of the object.
*
* @return the clone
*/
public Object clone(){
SysInfo obj = null;
try{
obj = ( SysInfo ) super.clone();
obj.setArchitecture( this.getArchitecture() );
obj.setOS( this.getOS() );
obj.setOSRelease( this.getOSRelease() );
obj.setOSVersion( this.getOSVersion() );
obj.setGlibc( this.getGlibc() );
}
catch( CloneNotSupportedException e ){
//somewhere in the hierarch chain clone is not implemented
throw new RuntimeException("Clone not implemented in the base class of " + this.getClass().getName(),
e );
}
return obj;
}
/**
* Returns the output of the data class as string.
* @return String
*/
public String toString() {
StringBuffer s = new StringBuffer();
s.append( "{" );
s.append( "arch=" + this.getArchitecture() );
s.append( " os=" + this.getOS() );
String release = this.getOSRelease();
if ( release != null && release.length() > 0 ) {
s.append( " osrelease=" + release );
}
String version = this.getOSVersion();
if ( version != null && version.length() > 0 ) {
s.append( " osversion=" + version );
}
s.append( "}" );
return s.toString();
}
}