/*
* IzPack - Copyright 2001-2008 Julien Ponge, All Rights Reserved.
*
* http://izpack.org/
* http://izpack.codehaus.org/
*
* Copyright 2007 Dennis Reil
*
* 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.rules;
import com.izforge.izpack.util.Debug;
import com.izforge.izpack.adaptator.IXMLElement;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* A condition based on the value of a static java field or static java method.
*
* @author Dennis Reil, <Dennis.Reil@reddot.de>
*/
public class JavaCondition extends Condition
{
/**
*
*/
private static final long serialVersionUID = -7649870719815066537L;
protected String classname;
protected String methodname;
protected String fieldname;
protected boolean complete;
protected String returnvalue;
protected String returnvaluetype;
protected Class usedclass;
protected Field usedfield;
protected Method usedmethod;
public JavaCondition()
{
}
public boolean isTrue()
{
if (!this.complete)
{
return false;
}
else
{
if (this.usedclass == null)
{
ClassLoader loader = ClassLoader.getSystemClassLoader();
try
{
this.usedclass = loader.loadClass(this.classname);
}
catch (ClassNotFoundException e)
{
Debug.log("Can't find class " + this.classname);
return false;
}
}
if ((this.usedfield == null) && (this.fieldname != null))
{
try
{
this.usedfield = this.usedclass.getField(this.fieldname);
}
catch (SecurityException e)
{
Debug.log("No permission to access specified field: " + this.fieldname);
return false;
}
catch (NoSuchFieldException e)
{
Debug.log("No such field: " + this.fieldname);
return false;
}
}
if ((this.usedmethod == null) && (this.methodname != null))
{
Debug.log("not implemented yet.");
return false;
}
if (this.usedfield != null)
{
// access field
if ("boolean".equals(this.returnvaluetype))
{
try
{
boolean returnval = this.usedfield.getBoolean(null);
boolean expectedreturnval = Boolean.valueOf(this.returnvalue);
return returnval == expectedreturnval;
}
catch (IllegalArgumentException e)
{
Debug.log("IllegalArgumentexeption " + this.fieldname);
}
catch (IllegalAccessException e)
{
Debug.log("IllegalAccessException " + this.fieldname);
}
}
else
{
Debug.log("not implemented yet.");
return false;
}
}
return false;
}
}
public void readFromXML(IXMLElement xmlcondition)
{
if (xmlcondition.getChildrenCount() != 2)
{
Debug.log("Condition of type java needs (java,returnvalue)");
return;
}
IXMLElement javael = xmlcondition.getFirstChildNamed("java");
IXMLElement classel = javael.getFirstChildNamed("class");
if (classel != null)
{
this.classname = classel.getContent();
}
else
{
Debug.log("Java-Element needs (class,method?,field?)");
return;
}
IXMLElement methodel = javael.getFirstChildNamed("method");
if (methodel != null)
{
this.methodname = methodel.getContent();
}
IXMLElement fieldel = javael.getFirstChildNamed("field");
if (fieldel != null)
{
this.fieldname = fieldel.getContent();
}
if ((this.methodname == null) && (this.fieldname == null))
{
Debug.log("java element needs (class, method?,field?)");
return;
}
IXMLElement returnvalel = xmlcondition.getFirstChildNamed("returnvalue");
if (returnvalel != null)
{
this.returnvalue = returnvalel.getContent();
this.returnvaluetype = returnvalel.getAttribute("type");
}
else
{
Debug.log("no returnvalue-element specified.");
return;
}
this.complete = true;
}
/* (non-Javadoc)
* @see com.izforge.izpack.rules.Condition#getDependenciesDetails()
*/
public String getDependenciesDetails()
{
StringBuffer details = new StringBuffer();
details.append(this.id);
details.append(" depends on the ");
if (this.fieldname != null)
{
details.append("value of field <b>");
details.append(this.fieldname);
details.append("</b>");
}
else
{
details.append("return value of method <b>");
details.append(this.methodname);
details.append("</b>");
}
details.append(" on an instance of class <b>");
details.append(this.classname);
details.append("</b> which should be <b>");
details.append(this.returnvalue);
details.append("</b><br/>");
return details.toString();
}
}