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: * <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 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 [EMAIL PROTECTED] 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 <[EMAIL PROTECTED]> 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 <[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]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]