blob: c2c4d7b4e1ae156d5e748a4e08828ba115a2b1f2 [file] [log] [blame]
/*
* Copyright (C) The Apache Software Foundation. All rights reserved.
*
* This software is published under the terms of the Apache Software License
* version 1.1, a copy of which has been included with this distribution in
* the LICENSE file.
*/
package org.apache.myrmidon.api;
import java.io.File;
import java.util.Map;
import org.apache.avalon.excalibur.io.FileUtil;
import org.apache.avalon.excalibur.property.PropertyException;
import org.apache.avalon.excalibur.property.PropertyUtil;
import org.apache.avalon.framework.context.ContextException;
import org.apache.avalon.framework.context.DefaultContext;
/**
* Default implementation of TaskContext.
*
* @author <a href="mailto:donaldp@apache.org">Peter Donald</a>
*/
public class DefaultTaskContext
extends DefaultContext
implements TaskContext
{
/**
* Constructor for Context with no parent contexts.
*/
public DefaultTaskContext( final Map contextData )
{
super( contextData );
}
/**
* Constructor for Context with no parent contexts.
*/
public DefaultTaskContext()
{
this( (TaskContext)null );
}
/**
* Constructor.
*/
public DefaultTaskContext( final TaskContext parent )
{
super( parent );
}
/**
* Retrieve JavaVersion running under.
*
* @return the version of JVM
*/
public JavaVersion getJavaVersion()
{
try { return (JavaVersion)get( JAVA_VERSION ); }
catch( final ContextException ce )
{
throw new IllegalStateException( "No JavaVersion in Context" );
}
}
/**
* Retrieve Name of tasklet.
*
* @return the name
*/
public String getName()
{
try { return (String)get( NAME ); }
catch( final ContextException ce )
{
throw new IllegalStateException( "No Name in Context" );
}
}
/**
* Retrieve base directory.
*
* @return the base directory
*/
public File getBaseDirectory()
{
try { return (File)get( BASE_DIRECTORY ); }
catch( final ContextException ce )
{
throw new IllegalStateException( "No Base Directory in Context" );
}
}
/**
* Resolve filename.
* This involves resolving it against baseDirectory and
* removing ../ and ./ references. It also means formatting
* it appropriately for the particular OS (ie different OS have
* different volumes, file conventions etc)
*
* @param filename the filename to resolve
* @return the resolved filename
*/
public File resolveFile( final String filename )
{
return FileUtil.resolveFile( getBaseDirectory(), filename );
}
/**
* Retrieve property for name.
*
* @param name the name of property
* @return the value of the property
*/
public Object getProperty( final String name )
{
try { return get( name ); }
catch( final ContextException ce )
{
return null;
}
}
/**
* Set property value in current context.
*
* @param name the name of property
* @param value the value of property
*/
public void setProperty( final String name, final Object value )
throws TaskException
{
setProperty( name, value, CURRENT );
}
/**
* Set property value.
*
* @param property the property
*/
public void setProperty( final String name, final Object value, final ScopeEnum scope )
throws TaskException
{
checkPropertyValid( name, value );
if( CURRENT == scope ) put( name, value );
else if( PARENT == scope )
{
if( null == getParent() )
{
throw new TaskException( "Can't set a property with parent scope when context " +
" has no parent" );
}
else
{
((TaskContext)getParent()).setProperty( name, value );
}
}
else if( TOP_LEVEL == scope )
{
DefaultTaskContext context = this;
while( null != context.getParent() )
{
context = (DefaultTaskContext)context.getParent();
}
context.put( name, value );
}
else
{
throw new IllegalStateException( "Unknown property scope! (" + scope + ")" );
}
}
/**
* Make sure property is valid if it is one of the "magic" properties.
*
* @param name the name of property
* @param value the value of proeprty
* @exception TaskException if an error occurs
*/
protected void checkPropertyValid( final String name, final Object value )
throws TaskException
{
if( BASE_DIRECTORY.equals( name ) && !( value instanceof File ) )
{
throw new TaskException( "Property " + BASE_DIRECTORY +
" must have a value of type " +
File.class.getName() );
}
else if( NAME.equals( name ) && !( value instanceof String ) )
{
throw new TaskException( "Property " + NAME +
" must have a value of type " +
String.class.getName() );
}
else if( JAVA_VERSION.equals( name ) && !( value instanceof JavaVersion ) )
{
throw new TaskException( "Property " + JAVA_VERSION +
" must have a value of type " +
JavaVersion.class.getName() );
}
}
}