blob: 2434c0bb8f675763d43b83bad51b63526280301c [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.commons.jelly.core;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.List;
import java.util.ArrayList;
import org.apache.commons.jelly.JellyContext;
import org.apache.commons.jelly.JellyTagException;
import org.apache.commons.jelly.MissingAttributeException;
import org.apache.commons.jelly.Script;
import org.apache.commons.jelly.TagLibrary;
import org.apache.commons.jelly.TagSupport;
import org.apache.commons.jelly.XMLOutput;
import junit.framework.TestCase;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* This test illustrates pre-1.0 Jelly behavior that did not cache tags by default. Many user tag implementations
* will assume that they are at an initialized state when doTag() is called, rather than still being "dirty" from a
* prior run.
*
* @author <a href="mailto:proyal@apache.org">peter royal</a>
*/
public class TestUnexpectedTagCaching extends TestCase
{
public void testExpectFreshTagOnEachRun() throws Exception
{
final JellyContext scriptContext = new JellyContext();
scriptContext.registerTagLibrary( "a", new TestCachingTagLibrary() );
final String scriptText = "<a:write xmlns:a=\"a\"><a:set>${message}</a:set></a:write>";
final Script script = scriptContext.compileScript( new InputSource( new StringReader( scriptText ) ) );
assertScriptResult( "one", script, scriptContext );
assertScriptResult( "two", script, scriptContext );
assertScriptResult( "three", script, scriptContext );
}
private static void assertScriptResult( final String message,
final Script script,
final JellyContext scriptContext ) throws JellyTagException
{
final JellyContext context = new JellyContext( scriptContext );
context.setVariable( "message", message );
final StringWriter writer = new StringWriter();
script.run( context, XMLOutput.createXMLOutput( writer ) );
assertEquals( "["+ message + "]", writer.toString() );
}
public static class TestCachingTagLibrary extends TagLibrary
{
public TestCachingTagLibrary()
{
registerTag( "set", SetTag.class );
registerTag( "write", WriteTag.class );
}
}
public static class WriteTag extends TagSupport
{
private List m_strings = new ArrayList();
public List getStrings()
{
return m_strings;
}
public void addString( final String string )
{
m_strings.add( string );
}
public void doTag( final XMLOutput output ) throws MissingAttributeException, JellyTagException
{
invokeBody( output );
try
{
output.write( getStrings().toString() );
}
catch( SAXException e )
{
throw new JellyTagException( "Unable to write message", e );
}
}
}
public static class SetTag extends TagSupport
{
public void doTag( final XMLOutput output ) throws MissingAttributeException, JellyTagException
{
( (WriteTag)getParent() ).addString( getBodyText() );
}
}
}