velocity-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Charles Harvey III <charl...@alloy.com>
Subject Re: getting list of all context values
Date Thu, 19 Oct 2006 16:00:52 GMT
Works like a charm.  It catches everything I put into the request
and even everything I had previously #set() earlier on the page.

Thanks so much for churning that out like that.


Charlie


Nathan Bubna said the following on 10/18/2006 5:42 PM:
> Actually, 1.3-dev doesn't have a getToolKeys() method yet either. :)
> I'll check these in once i get a chance to test them out.  In the
> meantime, it should be relatively quick to modify this for 1.2; the
> only catch is that it won't be able to list the tools in your toolbox.
> Here ya go:
>
> /*
> * 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 context meta-data.</p>
> * <p><pre>
> * Template example(s):
> *  #foreach( $key in $context.keys )
> *    $key = $context.get($key)
> *  #end
> *
> * Toolbox configuration:
> * &lt;tool&gt;
> *   &lt;key&gt;context&lt;/key&gt;
> *   &lt;scope&gt;request&lt;/scope&gt;
> *   
> &lt;class&gt;org.apache.velocity.tools.view.tools.ContextTool&lt;/class&gt;

>
> * &lt;/tool&gt;
> * </pre></p>
> *
> * <p>This class is only designed for use as a request-scope tool.</p>
> *
> * @author <a href="mailto:nathan@esha.com">Nathan Bubna</a>
> * @since VelocityTools 1.3
> * @version $Id: ContextTool.java 385122 2006-03-11 18:37:42Z nbubna $
> */
> public class ContextTool implements ViewTool, Configurable
> {
>    /**
>     * 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 {@link Set} of the available reference keys in the current
>     * context.
>     */
>    public Set getKeys()
>    {
>        Set keys = new HashSet();
>
>        // 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);
>    }
>
> }
>
>
> On 10/18/06, Charles Harvey III <charlieh@alloy.com> wrote:
>> 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 <nbubna@gmail.com> wrote:
>> >> On 10/18/06, Charles Harvey III <charlieh@alloy.com> 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:
>> >>  * &lt;tool&gt;
>> >>  *   &lt;key&gt;context&lt;/key&gt;
>> >>  *   &lt;scope&gt;request&lt;/scope&gt;
>> >>  *
>> >> 
>> &lt;class&gt;org.apache.velocity.tools.view.tools.ContextTool&lt;/class&gt;

>>
>> >>
>> >>  * &lt;/tool&gt;
>> >>  * </pre></p>
>> >>  *
>> >>  * <p>This class is only designed for use as a request-scope 
>> tool.</p>
>> >>  *
>> >>  * @author <a href="mailto:nathan@esha.com">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 {@link 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: velocity-user-unsubscribe@jakarta.apache.org
>> > For additional commands, e-mail: velocity-user-help@jakarta.apache.org
>> >
>> >
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: velocity-user-unsubscribe@jakarta.apache.org
>> For additional commands, e-mail: velocity-user-help@jakarta.apache.org
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: velocity-user-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: velocity-user-help@jakarta.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: velocity-user-unsubscribe@jakarta.apache.org
For additional commands, e-mail: velocity-user-help@jakarta.apache.org


Mime
View raw message