blob: ab473b7043d1eea9a9d4ad056d46f31290aa5cc5 [file] [log] [blame]
/*
* Copyright 2002,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.
*/
package org.apache.commons.jelly.tags.threads;
import org.apache.commons.jelly.JellyTagException;
import org.apache.commons.jelly.TagSupport;
import org.apache.commons.jelly.XMLOutput;
import java.util.List;
/**
* Base class for tags that will "use" threads.
*
* @author <a href="mailto:jason@jhorman.org">Jason Horman</a>
*/
public abstract class UseThreadTag extends TagSupport {
/** The thread to use in some way. */
private Thread thread = null;
/** Threads can be grouped and acted on as a set */
private List threadGroup = null;
/** If true doTag will search for a parent thread to use if setThread was not called */
private boolean searchForParent = true;
/**
* The default behavior is to either use the set thread or to
* search for a parent thread to use.
*/
public void doTag(XMLOutput output) throws JellyTagException {
try {
// either use the set thread or search for a parent thread to use
if (thread != null) {
useThread(thread, output);
} else if (threadGroup != null) {
useThreadGroup(threadGroup, output);
} else {
// check if this tag is nested inside a thread. if so
// use the parent thread.
if (searchForParent) {
// first look for parent threads
ThreadTag tt = (ThreadTag) findAncestorWithClass(ThreadTag.class);
if (tt != null) {
useThread(tt.getThread(), output);
} else {
// then look for parent thread groups
GroupTag gt = (GroupTag) findAncestorWithClass(GroupTag.class);
if (gt != null) {
useThreadGroup(gt.getThreads(), output);
} else {
throw new JellyTagException("no thread or thread group found");
}
}
} else {
throw new JellyTagException("no thread or thread group found");
}
}
}
catch (InterruptedException e) {
throw new JellyTagException(e);
}
}
/** Implement this method to do something with the thread */
protected abstract void useThread(Thread thread, XMLOutput output) throws InterruptedException ;
/** Implement this method to do something with the threadGroup */
protected abstract void useThreadGroup(List threadGroup, XMLOutput output) throws InterruptedException ;
/**
* Set the thread to use in some way.
*/
public void setThread(Thread thread) {
this.thread = thread;
}
/**
* Get a reference to the thread to use
*/
public Thread getThread() {
return thread;
}
/**
* Set the thread group to "use".
* @param threadGroup The threadGroup created with the <i>group</i> tag.
*/
public void setThreadGroup(List threadGroup) {
this.threadGroup = threadGroup;
}
/**
* Get the thread group
*/
public List getThreadGroup() {
return threadGroup;
}
/**
* If true the tag will search for a parent thread tag to "use" if
* no thread was set via <i>setThread</i>. This is <i>true</i> by default.
*/
public void setSearchForParentThread(boolean searchForParent) {
this.searchForParent = searchForParent;
}
}