Hey Charlie,

Any luck getting this to work yet?  Just curious...

thanks,
nathan

On Tue, Apr 8, 2008 at 3:15 PM, Nathan Bubna <[EMAIL PROTECTED]> wrote:
> On Tue, Apr 8, 2008 at 2:10 PM, Charles Harvey III <[EMAIL PROTECTED]> wrote:
>  > Ok.  I tried and tried and I cannot get the ServletConfig to where I need 
> it
>  > so
>  >  I can create a new VelocityView.  The best I can get is a ServletContext.
>
>  That is a bummer.  Thank you!  Seriously, this exposes a signficant
>  shortcoming in the plans to make it easy to integrate Tools into other
>  frameworks.  It also made me realize that i didn't provide proper
>  Filter support either.  It needs to be easier to init() a VelocityView
>  (whether with a ServletConfig, FilterConfig or neither).  I'll try to
>  set aside some time to fix that this week.  It'll mean we need to do
>  another beta, i'm sure, but i think it'll be well worth it.
>
>
>  >  ------------------------------------------------------------------
>  >  VelocityView velocityView = new VelocityView( getServletContext() );
>  >  Context context = velocityView.getContext( request, response );
>  >  ------------------------------------------------------------------
>  >
>  >  And, looking at the code for VelocityView, when you create a new
>  > VelocityView
>  >  with a ServletContext, it never calls the init(ServletConfig config)
>  > method.
>  >  So, the tools don't get configured.  When I do $params.get('thing') it
>  > tells me:
>  >
>  >   Request is null. ParameterTool must be initialized first!
>
>  Actually, this means the tools did get configured.  This just means
>  that the tool was never given access to the HttpServletRequest; the
>  tools aren't being properly initialized.
>
>  You could just precede $params.thing with $params.setRequest($request)
>  to make this work, but obviously that shouldn't be necessary and would
>  not work for tools who use configure() instead of setters.
>
>
>  >  So, I tried it the "standalone" way:
>  >  ------------------------------------------------------------------
>  >  ToolManager manager = new ToolManager();
>  >  if( getToolboxConfigLocation() != null )
>  >  {
>  >    manager.configure( getServletContext().getRealPath(
>  > getToolboxConfigLocation() ) );
>  >  }
>  >  manager.setVelocityEngine( getVelocityEngine() );
>  >  Context context = manager.createContext();
>  >  ------------------------------------------------------------------
>  >
>  >  And I get the same result.
>
>  As expected.  The code above has no knowledge of ServletRequests, so
>  it would be unable to tell tools about them.
>
>
>  >  One other attempt was made:
>  >  ------------------------------------------------------------------
>  >  ViewToolContext context = new ViewToolContext( getVelocityEngine(),
>  >                                               request, response,
>  > getServletContext() );
>  >  ------------------------------------------------------------------
>  >
>  >  This time, no errors.  But the tools don't work.  I see a bunch of
>  > $link.setRelative()
>  >  all over the page.  Nothing renders.
>
>  That's because the ViewToolContext only knows how to find tools.  It
>  doesn't create them at all.
>
>
>  >
>  >  Am I close?  Way off?  Any help is much appreciated.
>  >
>
>  Your last example is actually headed in the right direction.
>  Unfortunately, since you can't use VelocityView until i fix it, it's a
>  little more complicated.  Here's the gist, though i'll have to leave
>  you to fill in the blanks for the moment:
>
>  the first goal is to create a FactoryConfiguration, then configure a
>  new ToolboxFactory instance with that config.  this may look something
>  like this (see VelocityView.configure(ServletConfig, ToolboxFactory)
>  for a much more involved example):
>
>  FactoryConfiguration config = ConfigurationUtils.getAutoLoaded(); //
>  read javadoc on this!
>  ToolboxFactory factory = new ToolboxFactory();
>  factory.configure(config);
>
>  keep this factory around for the life of the app.  you only want the
>  code above to happen once, not on every request!
>
>  this once-per-app initialization is also a good place to create your
>  application-scoped toolbox and put that in the servlet context.  that
>  code is ripped from VelocityView.init(ServletConfig,ToolboxFactory)
>  and looks roughly like this:
>
>         Toolbox appTools = factory.createToolbox(Scope.APPLICATION);
>         if (appTools != null &&
>             servletContext.getAttribute(Toolbox.class.getName()) == null)
>         {
>             servletContext.setAttribute(Toolbox.class.getName(), appTools);
>         }
>
>
>  with that, the application level stuff should be ready to go; now we
>  just need to prep some things before every request.  so, before you
>  create that ViewToolContext in your last example above, use your
>  ToolboxFactory and do the following (this code is ripped from
>  VelocityView.prepareToolboxes()):
>
>         String key = Toolbox.class.getName();
>         if (factory.hasTools(Scope.REQUEST)
>             && request.getAttribute(key) == null)
>         {
>             // add request toolbox, if any
>             Toolbox reqTools = factory.createToolbox(Scope.REQUEST);
>             if (reqTools != null)
>             {
>                 request.setAttribute(key, reqTools);
>             }
>         }
>
>         if (factory.hasTools("session"))
>         {
>              HttpSession session = request.getSession(true);
>               // allow only one thread at a time
>                synchronized(factory)
>                 {
>                     if (session.getAttribute(key) == null)
>                     {
>                         Toolbox sessTools =
>                             factory.createToolbox("session");
>                         session.setAttribute(key, sessTools);
>                     }
>                 }
>             }
>
>
>  This creates the Toolbox instances for the current session and request
>  and puts them where the ViewToolContext can find them.  Once all of
>  the above is done, create your ViewToolContext and return that.
>
>  i think that should do the trick.  sorry this is more complicated that
>  i'd hoped.  i'll try and whip the VelocityView init code into
>  something more forgiving and get a new beta out.  Thanks for bringing
>  attention to this deficit. :)
>
>
>
>  >  Thanks again.
>  >
>  >
>  >
>  >
>  >  Charlie
>  >
>  >
>  >  ---------------------------------------------------------------------
>  >  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]

Reply via email to