And ChainedContext has no method called getToolKeys() in 1.2 either.
I guess I have to get 1.3-dev to use this neat little tool. I have
to get that out of CVS don't I?
Charlie
Nathan Bubna said the following on 10/18/2006 4:52 PM:
> Oh, i should also mention that it's written for VelocityTools 1.3-dev,
> so it doesn't currently declare that it implements the Configurable or
> ViewTool interfaces. To work with previous VelocityTools versions, it
> will need to at least declare that it implements ViewTool.
>
> On 10/18/06, Nathan Bubna <[EMAIL PROTECTED]> wrote:
>> On 10/18/06, Charles Harvey III <[EMAIL PROTECTED]> wrote:
>> > Ok. I tried this out. And it works... sort of. There are
definately
>> > things missing and I can't figure out why.
>> >
>> > As in, I know for sure that I am doing:
>> >
>> > request.setAttribute( "person", person );
>> >
>> > And "person" isn't in the list of $request.attributeNames. I can't
>> for the
>> > life of me figure out why though. Is there something I am
>> missing? This
>> > is what is getting printed to the page for the
>> $request.attributeNames:
>> >
>> > # javax.servlet.forward.request_uri
>> > # javax.servlet.forward.context_path
>> > # javax.servlet.forward.servlet_path
>> > # javax.servlet.forward.path_info
>> > # org.springframework.web.servlet.DispatcherServlet.THEME
>> > # __acegi_session_integration_filter_applied
>> > # org.springframework.web.servlet.DispatcherServlet.CONTEXT
>> > # __acegi_filterSecurityInterceptor_filterApplied
>> > # org.springframework.web.servlet.DispatcherServlet.LOCALE
>>
>> That's pretty odd. Assuming you're sure that the setAttribute and
the
>> getAttributeNames are happening in the same request thread (not
>> subsequent requests or some sort of secondary connection, like with
>> ImportTool), then i'm really not sure why the person attribute would
>> be removed. It's not something that the VVS or VLS would do.
>>
>> > What is even stranger is that it works for the session.
>> > $session.attributeNames:
>> >
>> > # website
>> > # IS_USER_ONLINE_SESSION_BINDING_LISTENER
>> >
>> > Those are definately two values that I specifically put into the
>> > session. All
>> > I can think of is that Spring is doing something to my objects and
>> I guess I
>> > have to go figure out what.
>>
>> might try checking out the exact class of the request object to
see if
>> it is being wrapped along the way
>>
>> $request.class.name
>>
>> Also, if you want to hack around, i hacked up a quick ContextTool. I
>> haven't tested it yet (and thus haven't committed it) and it
relies on
>> the addition of a new method to VelocityTools' ChainedContext class,
>> but i figure you should be able to get it working without much
>> modification. Let me know what you think...
>>
>> /*
>> * Copyright 2006 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.velocity.tools.view.tools;
>>
>> import java.util.Arrays;
>> import java.util.Enumeration;
>> import java.util.HashSet;
>> import java.util.Iterator;
>> import java.util.Map;
>> import java.util.Set;
>> import javax.servlet.http.HttpServletRequest;
>> import javax.servlet.http.HttpSession;
>> import javax.servlet.ServletContext;
>> import org.apache.velocity.context.AbstractContext;
>> import org.apache.velocity.context.Context;
>> import org.apache.velocity.tools.generic.ValueParser;
>> import org.apache.velocity.tools.view.context.ChainedContext;
>> import org.apache.velocity.tools.view.context.ViewContext;
>>
>> /**
>> * <p>View tool for convenient access to all available context keys
>> and values.</p>
>> * <p><pre>
>> * Template example(s):
>> * #foreach( $key in $context.keys )
>> * $key = $context.get($key)
>> * #end
>> *
>> * Toolbox configuration:
>> * <tool>
>> * <key>context</key>
>> * <scope>request</scope>
>> *
>>
<class>org.apache.velocity.tools.view.tools.ContextTool</class>
>>
>> * </tool>
>> * </pre></p>
>> *
>> * <p>This class is only designed for use as a request-scope
tool.</p>
>> *
>> * @author <a href="mailto:[EMAIL PROTECTED]">Nathan Bubna</a>
>> * @since VelocityTools 1.3
>> * @version $Id: ContextTool.java 385122 2006-03-11 18:37:42Z
nbubna $
>> */
>> public class ContextTool
>> {
>> /**
>> * The key used for specifying whether to hide keys with '.' in
>> them.
>> */
>> public static final String SAFE_MODE_KEY = "safe-mode";
>>
>> protected ViewContext context;
>> protected HttpServletRequest request;
>> protected HttpSession session;
>> protected ServletContext application;
>>
>> private boolean safeMode = true;
>>
>>
>> /**
>> * Looks for a safe-mode configuration setting. By default,
>> * safe-mode is true and thus keys with '.' in them are hidden.
>> */
>> public void configure(Map params)
>> {
>> if (params != null)
>> {
>> ValueParser parser = new ValueParser(params);
>> safeMode = parser.getBoolean(SAFE_MODE_KEY, true);
>> }
>> }
>>
>> /**
>> * Initializes this instance for the current request.
>> *
>> * @param obj the ViewContext of the current request
>> */
>> public void init(Object obj)
>> {
>> this.context = (ViewContext)obj;
>> this.request = context.getRequest();
>> this.session = request.getSession(false);
>> this.application = context.getServletContext();
>> }
>>
>>
>> /**
>> * Return a [EMAIL PROTECTED] Set} of the available reference keys in the
>> current
>> * context.
>> */
>> public Set getKeys()
>> {
>> Set keys = new HashSet();
>>
>> // get the tool keys, if there is a toolbox
>> if (this.context instanceof ChainedContext)
>> {
>> Set toolKeys =
((ChainedContext)this.context).getToolKeys();
>> keys.addAll(toolKeys);
>> }
>>
>> // recurse down the velocity context collecting keys
>> Context velctx = this.context.getVelocityContext();
>> while (velctx != null)
>> {
>> Object[] ctxKeys = velctx.getKeys();
>> keys.addAll(Arrays.asList(ctxKeys));
>> if (velctx instanceof AbstractContext)
>> {
>> velctx =
((AbstractContext)velctx).getChainedContext();
>> }
>> else
>> {
>> velctx = null;
>> }
>> }
>>
>> // get request attribute keys
>> Enumeration e = request.getAttributeNames();
>> while (e.hasMoreElements())
>> {
>> keys.add(e.nextElement());
>> }
>>
>> // get session attribute keys if we have a session
>> if (session != null)
>> {
>> e = session.getAttributeNames();
>> while (e.hasMoreElements())
>> {
>> keys.add(e.nextElement());
>> }
>> }
>>
>> // get request attribute keys
>> e = application.getAttributeNames();
>> while (e.hasMoreElements())
>> {
>> keys.add(e.nextElement());
>> }
>>
>> // if we're in safe mode, remove keys that contain '.'
>> if (safeMode)
>> {
>> for (Iterator i = keys.iterator(); i.hasNext(); )
>> {
>> String key = String.valueOf(i.next());
>> if (key.indexOf('.') >= 0)
>> {
>> i.remove();
>> }
>> }
>> }
>>
>> // return the key set
>> return keys;
>> }
>>
>> /**
>> * Retrieves the value for the specified reference name (aka
>> context key).
>> */
>> public Object get(Object refName)
>> {
>> String key = String.valueOf(refName);
>> if (safeMode && key.indexOf('.') >= 0)
>> {
>> return null;
>> }
>> return this.context.getVelocityContext().get(key);
>> }
>>
>> }
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]