@Test
  public void testVelocityToolboxView() throws Exception {
    final String templateName = "test.vm";

    StaticWebApplicationContext wac = new StaticWebApplicationContext();
    wac.setServletContext(new MockServletContext());
    final Template expectedTemplate = new Template();
    VelocityConfig vc =
        new VelocityConfig() {
          public VelocityEngine getVelocityEngine() {
            return new TestVelocityEngine(templateName, expectedTemplate);
          }
        };
    wac.getDefaultListableBeanFactory().registerSingleton("velocityConfigurer", vc);

    final HttpServletRequest expectedRequest = new MockHttpServletRequest();
    final HttpServletResponse expectedResponse = new MockHttpServletResponse();

    VelocityToolboxView vv =
        new VelocityToolboxView() {
          protected void mergeTemplate(
              Template template, Context context, HttpServletResponse response) throws Exception {
            assertTrue(template == expectedTemplate);
            assertTrue(response == expectedResponse);
            assertTrue(context instanceof ChainedContext);

            assertEquals("this is foo.", context.get("foo"));
            assertTrue(context.get("map") instanceof HashMap<?, ?>);
            assertTrue(context.get("date") instanceof DateTool);
            assertTrue(context.get("math") instanceof MathTool);

            assertTrue(context.get("link") instanceof LinkTool);
            LinkTool linkTool = (LinkTool) context.get("link");
            assertNotNull(linkTool.getContextURL());

            assertTrue(context.get("link2") instanceof LinkTool);
            LinkTool linkTool2 = (LinkTool) context.get("link2");
            assertNotNull(linkTool2.getContextURL());
          }
        };

    vv.setUrl(templateName);
    vv.setApplicationContext(wac);
    @SuppressWarnings("unchecked")
    Map<String, Class> toolAttributes = new HashMap<String, Class>();
    toolAttributes.put("math", MathTool.class);
    toolAttributes.put("link2", LinkTool.class);
    vv.setToolAttributes(toolAttributes);
    vv.setToolboxConfigLocation("org/springframework/web/servlet/view/velocity/toolbox.xml");
    vv.setExposeSpringMacroHelpers(false);

    vv.render(new HashMap<String, Object>(), expectedRequest, expectedResponse);
  }
  public void testOpenPersistenceManagerInViewFilter() throws Exception {
    MockControl pmfControl = MockControl.createControl(PersistenceManagerFactory.class);
    final PersistenceManagerFactory pmf = (PersistenceManagerFactory) pmfControl.getMock();
    MockControl pmControl = MockControl.createControl(PersistenceManager.class);
    PersistenceManager pm = (PersistenceManager) pmControl.getMock();

    pmf.getPersistenceManager();
    pmfControl.setReturnValue(pm, 1);
    pm.close();
    pmControl.setVoidCallable(1);
    pmfControl.replay();
    pmControl.replay();

    MockControl pmf2Control = MockControl.createControl(PersistenceManagerFactory.class);
    final PersistenceManagerFactory pmf2 = (PersistenceManagerFactory) pmf2Control.getMock();
    MockControl pm2Control = MockControl.createControl(PersistenceManager.class);
    PersistenceManager pm2 = (PersistenceManager) pm2Control.getMock();

    pmf2.getPersistenceManager();
    pmf2Control.setReturnValue(pm2, 1);
    pm2.close();
    pm2Control.setVoidCallable(1);
    pmf2Control.replay();
    pm2Control.replay();

    MockServletContext sc = new MockServletContext();
    StaticWebApplicationContext wac = new StaticWebApplicationContext();
    wac.setServletContext(sc);
    wac.getDefaultListableBeanFactory().registerSingleton("persistenceManagerFactory", pmf);
    wac.getDefaultListableBeanFactory().registerSingleton("myPersistenceManagerFactory", pmf2);
    wac.refresh();
    sc.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, wac);
    MockHttpServletRequest request = new MockHttpServletRequest(sc);
    MockHttpServletResponse response = new MockHttpServletResponse();

    MockFilterConfig filterConfig = new MockFilterConfig(wac.getServletContext(), "filter");
    MockFilterConfig filterConfig2 = new MockFilterConfig(wac.getServletContext(), "filter2");
    filterConfig2.addInitParameter(
        "persistenceManagerFactoryBeanName", "myPersistenceManagerFactory");

    final OpenPersistenceManagerInViewFilter filter = new OpenPersistenceManagerInViewFilter();
    filter.init(filterConfig);
    final OpenPersistenceManagerInViewFilter filter2 = new OpenPersistenceManagerInViewFilter();
    filter2.init(filterConfig2);

    final FilterChain filterChain =
        new FilterChain() {
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse) {
            assertTrue(TransactionSynchronizationManager.hasResource(pmf));
            servletRequest.setAttribute("invoked", Boolean.TRUE);
          }
        };

    final FilterChain filterChain2 =
        new FilterChain() {
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse)
              throws IOException, ServletException {
            assertTrue(TransactionSynchronizationManager.hasResource(pmf2));
            filter.doFilter(servletRequest, servletResponse, filterChain);
          }
        };

    FilterChain filterChain3 = new PassThroughFilterChain(filter2, filterChain2);

    assertFalse(TransactionSynchronizationManager.hasResource(pmf));
    assertFalse(TransactionSynchronizationManager.hasResource(pmf2));
    filter2.doFilter(request, response, filterChain3);
    assertFalse(TransactionSynchronizationManager.hasResource(pmf));
    assertFalse(TransactionSynchronizationManager.hasResource(pmf2));
    assertNotNull(request.getAttribute("invoked"));

    pmfControl.verify();
    pmControl.verify();
    pmf2Control.verify();
    pm2Control.verify();

    wac.close();
  }