Could you provide some information what problems you were trying to
solve, or what you are trying to enhance? That would be great.
geir
"Patrick E. Whitesell" wrote:
>
> Hey fellas,
>
> I did some stuff to enchance the Context chaining. This is my first
> submission, so let me know if I'm way out of line...
>
> There are some ugly bits in here due to the fact that the innerContext
> is defined as a Context, not an AbstractContext. Does anyone object to
> making the innerContext an AbstractContext? If not, I can take the
> exceptions out of this code...
>
> Index: src/java/org/apache/velocity/context/AbstractContext.java
> ===================================================================
> RCS file:
>
>/home/cvspublic/jakarta-velocity/src/java/org/apache/velocity/context/AbstractContext.java,v
> retrieving revision 1.4
> diff -u -r1.4 AbstractContext.java
> --- src/java/org/apache/velocity/context/AbstractContext.java 2001/03/28 03:01:04
> 1.4
> +++ src/java/org/apache/velocity/context/AbstractContext.java 2001/04/28 01:50:43
> @@ -298,7 +298,115 @@
> return innerContext;
> }
>
> -}
> + /**
> + * Sets the chained Context.
> + * Note: using this method can potentially cause a loop in the
> Context chain.
> + * The preferred method of dealing with the Context chain is
> through the addChainedContext() and removeChainedContext() methods, as
> those methods do checks to prevent a closed chain.
> + *
> + * @param context The context to be chained.
> + * @return The old chained Context if one existed,
> <code>null</code> if not.
> + */
> + public Context setChainedContext(Context c)
> + {
> + Context oldContext = innerContext;
> + innerContext = c;
> + return oldContext;
> + }
> +
> + /**
> + * Adds a Context to the end of the Context chain.
> + * If the provided context is already on the Context chain, it is
> not added again.
> + *
> + * @param context The context to be added to the chain.
> + * @return <code>true</code> is the context was added,
> <code>false</code> otherwise.
> + * @throws UnsupportedOperationException if a context on the chain
> does not support this action.
> + */
> + public boolean addChainedContext(Context c)
> + {
> + // Make sure adding this context will not create an infinite loop
> + Context con = c;
> + while(con != null)
> + {
> + if(con == this)
> + {
> + return false;
> + }
> +
> + if(!(con instanceof AbstractContext))
> + {
> + throw new UnsupportedOperationException("It could not
> be determined if adding the supplied Context would cause a loop in the
> Context chain.");
> + }
> + else
> + {
> + con = ((AbstractContext)con).getChainedContext();
> + }
> + }
> +
> + if(innerContext == null)
> + {
> + innerContext = c;
> + return true;
> + }
>
> + if(!(innerContext instanceof AbstractContext))
> + {
> + throw new UnsupportedOperationException("Some Context on
> the chain does not support this operation.");
> + }
>
> + return ((AbstractContext)innerContext).addChainedContext(c);
> + }
>
> + /**
> + * Removes a Context from the Context chain.
> + * All Contexts following the removed context are moved one step
> closer to the head of the chain.
> + *
> + * @param context The context to be removed from the chain.
> + * @param severChain
> + * @return <code>true</code> is the context was removed,
> <code>false</code> otherwise.
> + * @throws UnsupportedOperationException if a context on the chain
> does not support this action.
> + */
> + public boolean removeChainedContext(Context c)
> + {
> + return removeChainedContext(c, true);
> + }
> +
> + /**
> + * Removes a Context from the Context chain.
> + *
> + * @param context The context to be removed from the chain.
> + * @param severChain
> + * If true, the chain is severed at the removed context.
> + * If false, all Contexts following the removed context are moved
> one step closer to the head of the chain.
> + * @return <code>true</code> is the context was found and removed,
> <code>false</code> otherwise.
> + * @throws UnsupportedOperationException if a context on the chain
> does not support this action.
> + */
> + public boolean removeChainedContext(Context c, boolean severChain)
> + {
> + if(innerContext == null)
> + {
> + return false;
> + }
> +
> + if(innerContext == c)
> + {
> + if(severChain)
> + {
> + innerContext = null;
> + }
> + else
> + {
> + if(!(innerContext instanceof AbstractContext))
> + {
> + throw new UnsupportedOperationException("Some
> Context on the chain does not support this operation.");
> + }
> + innerContext =
> ((AbstractContext)innerContext).getChainedContext();
> + }
> + return true;
> + }
> + else
> + {
> + return
> ((AbstractContext)innerContext).removeChainedContext(c, severChain);
> + }
> + }
> +
> +}
>
> --
> Patrick E. Whitesell
> [EMAIL PROTECTED]
>
> ***************************************
> This e-mail message may contain confidential and/or legally privileged
> information. If you are not the intended recipient(s), or the employee
> or agent responsible for delivery of this message to the intended
> recipient(s), you are hereby notified that any dissemination,
> distribution or copying of this e-mail message is strictly prohibited.If
> you have received this message in error, please immediately notify the
> sender and delete this e-mail message from your computer. DO NOT FORWARD
> THIS E-MAIL MESSAGE WITHOUT THE PERMISSION OF THE SENDER.
--
Geir Magnusson Jr. [EMAIL PROTECTED]
System and Software Consulting
Developing for the web? See http://jakarta.apache.org/velocity/