public void testTypedCommandProvidingFormController() throws Exception {
    DispatcherPortlet portlet =
        new DispatcherPortlet() {
          protected ApplicationContext createPortletApplicationContext(ApplicationContext parent)
              throws BeansException {
            GenericWebApplicationContext wac = new GenericWebApplicationContext();
            wac.registerBeanDefinition(
                "controller", new RootBeanDefinition(MyTypedCommandProvidingFormController.class));
            wac.registerBeanDefinition(
                "controller2",
                new RootBeanDefinition(MyOtherTypedCommandProvidingFormController.class));
            RootBeanDefinition adapterDef =
                new RootBeanDefinition(AnnotationMethodHandlerAdapter.class);
            adapterDef
                .getPropertyValues()
                .addPropertyValue("webBindingInitializer", new MyWebBindingInitializer());
            adapterDef
                .getPropertyValues()
                .addPropertyValue("customArgumentResolver", new MySpecialArgumentResolver());
            wac.registerBeanDefinition("handlerAdapter", adapterDef);
            wac.refresh();
            return wac;
          }

          protected void render(ModelAndView mv, RenderRequest request, RenderResponse response)
              throws Exception {
            new TestView().render(mv.getViewName(), mv.getModel(), request, response);
          }
        };
    portlet.init(new MockPortletConfig());

    MockRenderRequest request = new MockRenderRequest(PortletMode.VIEW);
    request.addParameter("myParam", "myValue");
    request.addParameter("defaultName", "10");
    request.addParameter("age", "value2");
    request.addParameter("date", "2007-10-02");
    MockRenderResponse response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals(
        "myView-Integer:10-typeMismatch-tb1-myOriginalValue", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.VIEW);
    request.addParameter("myParam", "myOtherValue");
    request.addParameter("defaultName", "10");
    request.addParameter("age", "value2");
    request.addParameter("date", "2007-10-02");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals(
        "myOtherView-Integer:10-typeMismatch-tb1-myOriginalValue", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.EDIT);
    request.addParameter("myParam", "myValue");
    request.addParameter("defaultName", "10");
    request.addParameter("age", "value2");
    request.addParameter("date", "2007-10-02");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myView-myName-typeMismatch-tb1-myOriginalValue", response.getContentAsString());
  }
  public void testSpecificBinderInitializingCommandProvidingFormController() throws Exception {
    DispatcherPortlet portlet =
        new DispatcherPortlet() {
          protected ApplicationContext createPortletApplicationContext(ApplicationContext parent)
              throws BeansException {
            StaticPortletApplicationContext wac = new StaticPortletApplicationContext();
            wac.registerBeanDefinition(
                "controller",
                new RootBeanDefinition(
                    MySpecificBinderInitializingCommandProvidingFormController.class));
            wac.refresh();
            return wac;
          }

          protected void render(ModelAndView mv, RenderRequest request, RenderResponse response)
              throws Exception {
            new TestView().render(mv.getViewName(), mv.getModel(), request, response);
          }
        };
    portlet.init(new MockPortletConfig());

    MockRenderRequest request = new MockRenderRequest(PortletMode.VIEW);
    request.addParameter("defaultName", "myDefaultName");
    request.addParameter("age", "value2");
    request.addParameter("date", "2007-10-02");
    MockRenderResponse response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals(
        "myView-String:myDefaultName-typeMismatch-tb1-myOriginalValue",
        response.getContentAsString());
  }
  public void testModelFormController() throws Exception {
    DispatcherPortlet portlet =
        new DispatcherPortlet() {
          protected ApplicationContext createPortletApplicationContext(ApplicationContext parent)
              throws BeansException {
            GenericWebApplicationContext wac = new GenericWebApplicationContext();
            wac.registerBeanDefinition(
                "controller", new RootBeanDefinition(MyModelFormController.class));
            wac.refresh();
            return wac;
          }

          protected void render(ModelAndView mv, RenderRequest request, RenderResponse response)
              throws Exception {
            new TestView().render(mv.getViewName(), mv.getModel(), request, response);
          }
        };
    portlet.init(new MockPortletConfig());

    MockRenderRequest request = new MockRenderRequest(PortletMode.VIEW);
    request.addParameter("name", "name1");
    request.addParameter("age", "value2");
    MockRenderResponse response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myView-name1-typeMismatch-tb1-myValue", response.getContentAsString());
  }
  public void testParameterDispatchingController() throws Exception {
    DispatcherPortlet portlet =
        new DispatcherPortlet() {
          protected ApplicationContext createPortletApplicationContext(ApplicationContext parent)
              throws BeansException {
            StaticPortletApplicationContext wac = new StaticPortletApplicationContext();
            wac.setPortletContext(new MockPortletContext());
            RootBeanDefinition bd = new RootBeanDefinition(MyParameterDispatchingController.class);
            bd.setScope(WebApplicationContext.SCOPE_REQUEST);
            wac.registerBeanDefinition("controller", bd);
            AnnotationConfigUtils.registerAnnotationConfigProcessors(wac);
            wac.refresh();
            return wac;
          }
        };
    portlet.init(new MockPortletConfig());

    MockRenderRequest request = new MockRenderRequest(PortletMode.VIEW);
    MockRenderResponse response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.VIEW);
    request.addParameter("view", "other");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myOtherView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.VIEW);
    request.addParameter("view", "my");
    request.addParameter("lang", "de");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myLangView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.VIEW);
    request.addParameter("surprise", "!");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("mySurpriseView", response.getContentAsString());
  }
  public void doTestAdaptedHandleMethods(final Class controllerClass) throws Exception {
    DispatcherPortlet portlet =
        new DispatcherPortlet() {
          protected ApplicationContext createPortletApplicationContext(ApplicationContext parent)
              throws BeansException {
            GenericWebApplicationContext wac = new GenericWebApplicationContext();
            wac.registerBeanDefinition("controller", new RootBeanDefinition(controllerClass));
            wac.refresh();
            return wac;
          }
        };
    portlet.init(new MockPortletConfig());

    MockActionRequest actionRequest = new MockActionRequest(PortletMode.VIEW);
    MockActionResponse actionResponse = new MockActionResponse();
    portlet.processAction(actionRequest, actionResponse);
    assertEquals("value", actionResponse.getRenderParameter("test"));

    MockRenderRequest request = new MockRenderRequest(PortletMode.EDIT);
    request.addParameter("param1", "value1");
    request.addParameter("param2", "2");
    MockRenderResponse response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("test-value1-2", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.HELP);
    request.addParameter("name", "name1");
    request.addParameter("age", "2");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("test-name1-2", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.VIEW);
    request.addParameter("name", "name1");
    request.addParameter("age", "value2");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("test-name1-typeMismatch", response.getContentAsString());
  }
  public void testStandardHandleMethod() throws Exception {
    DispatcherPortlet portlet =
        new DispatcherPortlet() {
          protected ApplicationContext createPortletApplicationContext(ApplicationContext parent)
              throws BeansException {
            GenericWebApplicationContext wac = new GenericWebApplicationContext();
            wac.registerBeanDefinition("controller", new RootBeanDefinition(MyController.class));
            wac.refresh();
            return wac;
          }
        };
    portlet.init(new MockPortletConfig());

    MockRenderRequest request = new MockRenderRequest(PortletMode.VIEW);
    MockRenderResponse response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("test", response.getContentAsString());
  }
  public void testTypeLevelParameterDispatchingController() throws Exception {
    DispatcherPortlet portlet =
        new DispatcherPortlet() {
          protected ApplicationContext createPortletApplicationContext(ApplicationContext parent)
              throws BeansException {
            StaticPortletApplicationContext wac = new StaticPortletApplicationContext();
            wac.setPortletContext(new MockPortletContext());
            RootBeanDefinition bd =
                new RootBeanDefinition(MyTypeLevelParameterDispatchingController.class);
            bd.setScope(WebApplicationContext.SCOPE_REQUEST);
            wac.registerBeanDefinition("controller", bd);
            RootBeanDefinition bd2 =
                new RootBeanDefinition(MySpecialParameterDispatchingController.class);
            bd2.setScope(WebApplicationContext.SCOPE_REQUEST);
            wac.registerBeanDefinition("controller2", bd2);
            RootBeanDefinition bd3 =
                new RootBeanDefinition(MyOtherSpecialParameterDispatchingController.class);
            bd3.setScope(WebApplicationContext.SCOPE_REQUEST);
            wac.registerBeanDefinition("controller3", bd3);
            RootBeanDefinition bd4 = new RootBeanDefinition(MyParameterDispatchingController.class);
            bd4.setScope(WebApplicationContext.SCOPE_REQUEST);
            wac.registerBeanDefinition("controller4", bd4);
            AnnotationConfigUtils.registerAnnotationConfigProcessors(wac);
            wac.refresh();
            return wac;
          }
        };
    portlet.init(new MockPortletConfig());

    MockRenderRequest request = new MockRenderRequest(PortletMode.HELP);
    MockRenderResponse response = new MockRenderResponse();
    try {
      portlet.render(request, response);
      fail("Should have thrown UnavailableException");
    } catch (UnavailableException ex) {
      // expected
    }

    request = new MockRenderRequest(PortletMode.EDIT);
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myDefaultView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.EDIT);
    request.addParameter("myParam", "myValue");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.EDIT);
    request.addParameter("myParam", "mySpecialValue");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("mySpecialView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.EDIT);
    request.addParameter("myParam", "myOtherSpecialValue");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myOtherSpecialView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.VIEW);
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.EDIT);
    request.addParameter("myParam", "myValue");
    request.addParameter("view", "other");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myOtherView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.EDIT);
    request.addParameter("myParam", "myValue");
    request.addParameter("view", "my");
    request.addParameter("lang", "de");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("myLangView", response.getContentAsString());

    request = new MockRenderRequest(PortletMode.EDIT);
    request.addParameter("myParam", "myValue");
    request.addParameter("surprise", "!");
    response = new MockRenderResponse();
    portlet.render(request, response);
    assertEquals("mySurpriseView", response.getContentAsString());
  }