Re: WebappLoader and Velocimacros
Matt Raible said: > Sorry for the inappropriate e-mail. aw, i wouldn't call it inappropriate, just not very helpful. :) > I got all my issues fixed. Here's how: > > 1. I changed to use the WebappLoader from Velocity (by copying code > from the VelocityViewServlet) and now everything refreshes as expected. ... sweet. i'm glad to hear it. your code looks good to me. > Thanks for the tip, this is exactly what I was looking for. > > 2. Duh, it wasn't a valid reference. :) > 3. The new WebappLoader seems to have fixed this problem as well. > > 4. Got the Velocity WebappLoader to work, so this is not an issue. > > Thanks for responding to my question. you're welcome! and if/when struts-menu is ready-to-go for VelocityStruts users, be sure to let us know over here. i'm curious about it. :) Nathan Bubna [EMAIL PROTECTED] - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: WebappLoader and Velocimacros
Sorry for the inappropriate e-mail. I got all my issues fixed. Here's how: 1. I changed to use the WebappLoader from Velocity (by copying code from the VelocityViewServlet) and now everything refreshes as expected. Here's the code I'm now using: /** * Key used to access the ServletContext in * the Velocity application attributes. */ public static final String SERVLET_CONTEXT_KEY = ServletContext.class.getName(); //~ Methods public void init(PageContext pageContext, MenuDisplayerMapping mapping) { super.init(pageContext, mapping); this.pageContext = pageContext; // MR: Copied from VelocityViewServlet to initialize WebappLoader Velocity.setApplicationAttribute(SERVLET_CONTEXT_KEY, pageContext.getServletContext()); // default to servletlogger, which logs to the servlet engines log Velocity.setProperty(RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS, ServletLogger.class.getName()); // by default, load resources with webapp resource loader Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "webapp"); Velocity.setProperty("webapp.resource.loader.class", WebappLoader.class.getName()); // now all is ready - init Velocity try { ResourceBundle rb = ResourceBundle.getBundle("velocity"); Properties props = new Properties(); for (Enumeration keys = rb.getKeys(); keys.hasMoreElements();) { String key = (String) keys.nextElement(); props.put(key, rb.getString(key)); } // only initialized the first time it's called, from: // http://jakarta.apache.org/velocity/developer-guide.html // it's ignored for subsequent calls Velocity.init(props); } catch (Exception e) { log.error("Error initializing Velocity: " + e.getMessage()); e.printStackTrace(); } } Thanks for the tip, this is exactly what I was looking for. 2. Duh, it wasn't a valid reference. 3. The new WebappLoader seems to have fixed this problem as well. 4. Got the Velocity WebappLoader to work, so this is not an issue. Thanks for responding to my question. Matt On Tuesday, September 30, 2003, at 12:22 PM, Nathan Bubna wrote: Matt Raible said: I'm trying to enhance struts-menu (http://sf.net/projects/struts-menu), demo at http://raibledesigns.com/struts-menu to allow for Velocity Templates. I've got most of it working, but I'm having a few issues. i'll see if i can give a few answers... I've added the #local declaration to my velocity-1.4-dev.jar and everything is working fine there. I have the template below that also works great. However, since the #eval macro and the #displayMenu macro will likely be the same for all menus, I thought I'd put them in a global library. To do this, I declared the following in my velocity.properties file: velocimacro.library = macros.vm velocimacro.library.autoreload = true velocimacro.context.localscope = true # allow users to modify displayMenu and eval macros in their local templates velocimacro.permissions.allow.inline.to.replace.global = true velocimacro.permissions.allow.inline.local.scope = false And then I moved these two macros to macros.vm. This actually works with the template below. FIRST QUESTION: Why do I have to reload this webapp every time I change the template? I've turned off caching on all my loaders. I'd love for these template to be live JSPs (at least for development) where I can redeploy, refresh in browser, and can view my changes. uh, first off, these are Velocity templates, not JSPs. they're two different things that will stay different. second, i believe the 'velocimacro.library.autoreload = true' is not working because the WebappLoader does not presently have functioning isSourceModified() and getLastModified() methods. the Servlet API does not have any easy way to implement these. at one point, i looked into how it could be done, and i remember that i thought it could be, but i never went through with it or tested it. i'm just too busy right now. if you or someone else needs it anytime soon, then they'll need to step up with a patch. this is open source; the person with the itch should do the scratching. or alternately, you could try using the FileResourceLoader (not incredibly easy or portable in a web environment). SECOND QUESTION: I have a 2nd template that is similar to the one below, but it as a different #menuItem macro - with $displayer.getMessage($menu.title), rather than simply $menu.title. If I have all macros in the same template (no library), this works fine, but with a global library, I get: WARN - SimpleLog4JLogSystem.logVelocityMessage(172) | org.apache.velocity.runtime.exception.Referenc eException: reference : templ
Re: WebappLoader and Velocimacros
Matt Raible said: > I'm trying to enhance struts-menu (http://sf.net/projects/struts-menu), > demo at http://raibledesigns.com/struts-menu to allow for Velocity > Templates. I've got most of it working, but I'm having a few issues. i'll see if i can give a few answers... > I've added the #local declaration to my velocity-1.4-dev.jar and > everything is working fine there. I have the template below that also > works great. However, since the #eval macro and the #displayMenu macro > will likely be the same for all menus, I thought I'd put them in a > global library. To do this, I declared the following in my > velocity.properties file: > > velocimacro.library = macros.vm > velocimacro.library.autoreload = true > velocimacro.context.localscope = true > > # allow users to modify displayMenu and eval macros in their local > templates > velocimacro.permissions.allow.inline.to.replace.global = true > velocimacro.permissions.allow.inline.local.scope = false > > And then I moved these two macros to macros.vm. This actually works > with the template below. > > FIRST QUESTION: Why do I have to reload this webapp every time I change > the template? I've turned off caching on all my loaders. I'd love for > these template to be live JSPs (at least for development) where I can > redeploy, refresh in browser, and can view my changes. uh, first off, these are Velocity templates, not JSPs. they're two different things that will stay different. second, i believe the 'velocimacro.library.autoreload = true' is not working because the WebappLoader does not presently have functioning isSourceModified() and getLastModified() methods. the Servlet API does not have any easy way to implement these. at one point, i looked into how it could be done, and i remember that i thought it could be, but i never went through with it or tested it. i'm just too busy right now. if you or someone else needs it anytime soon, then they'll need to step up with a patch. this is open source; the person with the itch should do the scratching. or alternately, you could try using the FileResourceLoader (not incredibly easy or portable in a web environment). > SECOND QUESTION: I have a 2nd template that is similar to the one > below, but it as a different #menuItem macro - with > $displayer.getMessage($menu.title), rather than simply $menu.title. If > I have all macros in the same template (no library), this works fine, > but with a global library, I get: > > WARN - SimpleLog4JLogSystem.logVelocityMessage(172) | > org.apache.velocity.runtime.exception.Referenc > eException: reference : template = /table.html [line 9,column 5] : > $displayer.getMessage($menu.title > ) is not a valid reference. if it's not a valid reference, then it's not a valid reference. without knowing what the $displayer or $menu references are (or are supposed to be), how can we help you? you seem to assume that some here is familiar with your code or is willing to take the time to look through all of it to find the relevant parts. i have to warn you, that's not likely to happen. > ## Evaluates other macros. > #macro(eval $_macro)$_macro#end > > #macro( displayMenu $menu $level ) > #if ($menu.components.size() > 0) > ## display top menu > #menuItem($menu $level) > #foreach ($menu in $menu.components) > #local ($menu $level) > #set ($level = $level+1) > #if ($menu.components.size() > 0) > #eval("#displayMenu($menu $level)") > #else > #menuItem($menu $level) > #end > #end > #end > #else > #menuItem($menu $level) > #end > #end > > #macro( menuItem $menu $level ) > #foreach ($i in [0..$level]) > > #end > #if ($menu.url) > > $menu.title > #else > $menu.title > #end > > #end > > #displayMenu($menu 0) thanks, but i'm not sure what these have to do with your questions (or which question they're about). > THIRD QUESTION: There seems to be an issue when you have two menus > (menu:useMenuDisplayer tag) on one page (each using different > templates). The second menu seems to try and use parts of the first > table's template - very strange. yep, sounds strange. but i don't know what anything about these menus or where they are getting their templates from. i've never used struts-menu before. > LAST QUESTION: I'm using a custom WebappResourceLoader (from Roller, > source = http://tinyurl.com/ow5d) that supposedly borrows heavily from > org.apache.velocity.tools.view.servlet.WebappLoader. I'd rather just > use the one in Velocity, but I can't seem to get it to work. The one in > Roller is initialized with one simple call: > WebappResourceLoader.setServletContext(pageContext.getServletContext()); that's a shame. but just telling us "i can't get it to work" doesn't help us help you. you're practically begging to be referred to the "How to Ask Smart Questions" document here. :) now, if you couldn't get to the WebappLoader to work, then why wasn't