blob: bfa857e5082572ca3cfefe7ec94b5f4219c2fbac [file] [log] [blame]
package org.apache.commons.jelly.tags.velocity;
/*
* Copyright 2001,2004 The Apache Software Foundation.
*
* 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.
*/
import java.util.Set;
import java.util.HashSet;
import java.util.HashMap;
import org.apache.commons.jelly.JellyContext;
import org.apache.velocity.context.Context;
/**
* Adapts a JellyContext for use as a Velocity Context. This context
* can be used in either read-only or read-write mode. When used as a
* read-only adapter, items <tt>put</tt> or <tt>remove</tt>ed from the
* Velocity context are not permitted to propogate to the JellyContext,
* which is the default behavior. The adapter can also be used in a
* read-write mode. This permits changes made by Velocity to propogate
* to the JellyContext.
*
* @author <a href="mailto:pete-apache-dev@kazmier.com">Pete Kazmier</a>
* @version $Id: JellyContextAdapter.java,v 1.4 2004/09/09 12:23:16 dion Exp $
*/
public class JellyContextAdapter implements Context
{
/** Flag to indicate read-only or read-write mode */
private boolean readOnly = true;
/** The JellyContext being adapted */
private JellyContext jellyContext;
/** The store for Velocity in the event the adpater is read-only */
private HashMap privateContext = new HashMap();
/**
* Constructor.
*
* @param jellyContext The JellyContext to adapt
*/
public JellyContextAdapter( JellyContext jellyContext )
{
this.jellyContext = jellyContext;
}
/**
* Sets the read-only flag for this adapter. If the read-only flag
* is set, changes to the Velocity Context will not be propogated to
* the JellyContext. Turning the read-only flag off enables changes
* to propogate.
*
* @param readOnly If this parameter is <tt>true</tt>, the adapter
* becomes read-only. Setting the parameter to <tt>false</tt> the
* adapter becomes read-write.
*/
public void setReadOnly(boolean readOnly)
{
this.readOnly = readOnly;
}
/**
* Tests if the adapter is read-only.
*
* @return <tt>true</tt> if the adpater is read-only; otherwise
* returns <tt>false</tt>.
*/
public boolean isReadOnly()
{
return readOnly;
}
public boolean containsKey( Object key )
{
if ( key == null )
{
return false;
}
if ( readOnly && privateContext.containsKey( key ) )
{
return true;
}
return jellyContext.getVariable( key.toString() ) != null ? true : false;
}
public Object get( String key )
{
if ( key == null )
{
return null;
}
if ( readOnly && privateContext.containsKey( key ) )
{
return privateContext.get( key );
}
return jellyContext.getVariable( key );
}
public Object[] getKeys()
{
Set keys = jellyContext.getVariables().keySet();
if ( readOnly )
{
HashSet combinedKeys = new HashSet( keys );
combinedKeys.addAll( privateContext.keySet() );
keys = combinedKeys;
}
return keys.toArray();
}
public Object put( String key, Object value )
{
Object oldValue;
if ( key == null || value == null )
{
return null;
}
if ( readOnly )
{
oldValue = privateContext.put( key, value );
}
else
{
oldValue = jellyContext.getVariable( key );
jellyContext.setVariable( key, value );
}
return oldValue;
}
public Object remove( Object key )
{
Object oldValue;
if ( key == null )
{
return null;
}
if ( readOnly )
{
oldValue = privateContext.remove( key );
}
else
{
oldValue = jellyContext.getVariable( key.toString() );
jellyContext.removeVariable( key.toString() );
}
return oldValue;
}
}