/*
* IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved.
*
* http://izpack.org/
* http://izpack.codehaus.org/
*
* Copyright 2002 Olexij Tkatchenko
*
* 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 com.izforge.izpack.util;
import com.izforge.izpack.adaptator.IXMLElement;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Encapsulates OS constraints specified on creation time and allows to check them against the
* current OS.
* <p/>
* For example, this is used for <executable>s to check whether the executable is suitable for
* the current OS.
*
* @author Olexij Tkatchenko <ot@parcs.de>
*/
public class OsConstraint
implements java.io.Serializable
{
//~ Static variables/initializers
/**
*
*/
private static final long serialVersionUID = 3762248660406450488L;
//~ Instance variables
/**
* OS architecture from java system properties
*/
private String arch;
/**
* The OS family
*/
private String family;
/**
* JRE version used for installation
*/
private String jre;
/**
* OS name from java system properties
*/
private String name;
/**
* OS version from java system properties
*/
private String version;
//~ Constructors
/**
* Constructs a new instance. Please remember, MacOSX belongs to Unix family.
*
* @param family The OS family (unix, windows or mac).
* @param name The exact OS name.
* @param version The exact OS version (check property <code>os.version</code> for values).
* @param arch The machine architecture (check property <code>os.arch</code> for values).
* @param jre The Java version used for installation (check property <code>java.version</code> for values).
*/
public OsConstraint(String family,
String name,
String version,
String arch,
String jre)
{
this.family = (family != null)
? family.toLowerCase()
: null;
this.name = (name != null)
? name.toLowerCase()
: null;
this.version = (version != null)
? version.toLowerCase()
: null;
this.arch = (arch != null)
? arch.toLowerCase()
: null;
this.jre = (jre != null)
? jre.toLowerCase()
: null;
} // end OsConstraint()
/**
* Creates a new instance. Please remember, MacOSX belongs to Unix family.
*
* @param family The OS family (unix, windows or mac).
* @param name The exact OS name.
* @param version The exact OS version (check property <code>os.version</code> for values).
* @param arch The machine architecture (check property <code>os.arch</code> for values).
*/
public OsConstraint(String family,
String name,
String version,
String arch)
{
this(family, name, version, arch, null);
} // end OsConstraint()
//~ Methods
/**
* Matches OS specification in this class against current system properties.
*
* @return Description of the Return Value
*/
public boolean matchCurrentSystem()
{
boolean match = true;
String osName = System.getProperty("os.name").toLowerCase();
if ((arch != null) && (arch.length() != 0))
{
match = System.getProperty("os.arch").toLowerCase().equals(arch);
} // end if
if (match && (version != null) && (version.length() != 0))
{
match = System.getProperty("os.version").toLowerCase().equals(version);
} // end if
if (match && (name != null) && (name.length() != 0))
{
match = osName.equals(name);
} // end if
if (match && (family != null))
{
if ("windows".equals(family))
{
match = OsVersion.IS_WINDOWS;
} // end if
else if ("mac".equals(family) || "osx".equals(family))
{
match = OsVersion.IS_OSX;
} // end else if
else if ("unix".equals(family))
{
match = OsVersion.IS_UNIX;
} // end else if
} // end if
if (match && (jre != null) && (jre.length() > 0))
{
match = System.getProperty("java.version").toLowerCase().startsWith(jre);
} // end if
return match
&& ((family != null) || (name != null) || (version != null) || (arch != null) || (jre != null));
} // end matchCurrentSystem()
/**
* Extract a list of OS constraints from given element.
*
* @param element parent IXMLElement
* @return List of OsConstraint (or empty List if no constraints found)
*/
public static List<OsConstraint> getOsList(IXMLElement element)
{
// get os info on this executable
ArrayList<OsConstraint> osList = new ArrayList<OsConstraint>();
Iterator<IXMLElement> osIterator = element.getChildrenNamed("os").iterator();
while (osIterator.hasNext())
{
IXMLElement os = osIterator.next();
osList.add(new OsConstraint(os.getAttribute("family",
null),
os.getAttribute("name",
null),
os.getAttribute("version",
null),
os.getAttribute("arch",
null),
os.getAttribute("jre",
null)));
} // end while
// backward compatibility: still support os attribute
String osattr = element.getAttribute("os");
if ((osattr != null) && (osattr.length() > 0))
{
// add the "os" attribute as a family constraint
osList.add(new OsConstraint(osattr,
null,
null,
null,
null));
} // end if
return osList;
} // end getOsList()
/**
* Helper function: Scan a list of OsConstraints for a match.
*
* @param constraint_list List of OsConstraint to check
* @return true if one of the OsConstraints matched the current system or constraint_list is
* null (no constraints), false if none of the OsConstraints matched
*/
public static boolean oneMatchesCurrentSystem(List<OsConstraint> constraint_list)
{
if (constraint_list == null)
{
return true;
} // end if
Iterator<OsConstraint> constraint_it = constraint_list.iterator();
// no constraints at all - matches!
if (!constraint_it.hasNext())
{
return true;
} // end if
while (constraint_it.hasNext())
{
OsConstraint osc = constraint_it.next();
Debug.trace("checking if os constraints " + osc + " match current OS");
// check for match
if (osc.matchCurrentSystem())
{
Debug.trace("matched current OS.");
return true; // bail out on first match
} // end if
} // end while
Debug.trace("no match with current OS!");
// no match found
return false;
} // end oneMatchesCurrentSystem()
/**
* Helper function: Check whether the given IXMLElement is "suitable" for the current OS.
*
* @param el The IXMLElement to check for OS constraints.
* @return true if there were no OS constraints or the constraints matched the current OS.
*/
public static boolean oneMatchesCurrentSystem(IXMLElement el)
{
return oneMatchesCurrentSystem(getOsList(el));
} // end oneMatchesCurrentSystem()
public void setFamily(String f)
{
family = f.toLowerCase();
} // end setFamily()
public String getFamily()
{
return family;
} // end getFamily()
public void setName(String n)
{
name = n.toLowerCase();
} // end setName()
public String getName()
{
return name;
} // end getName()
public void setVersion(String v)
{
version = v.toLowerCase();
} // end setVersion()
public String getVersion()
{
return version;
} // end getVersion()
public void setArch(String a)
{
arch = a.toLowerCase();
} // end setArch()
public String getArch()
{
return arch;
} // end getArch()
public String toString()
{
StringBuffer retval = new StringBuffer();
retval.append("[Os ");
retval.append(" family ").append(family);
retval.append(" name ").append(name);
retval.append(" version ").append(version);
retval.append(" arch ").append(arch);
retval.append(" jre ").append(jre);
retval.append(" ]");
return retval.toString();
} // end toString()
} // end OsConstraint