Fixing broken tests.
This commit is contained in:
@@ -1,303 +0,0 @@
|
||||
package org.springframework.faces.webflow;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import javax.el.CompositeELResolver;
|
||||
import javax.faces.FacesException;
|
||||
import javax.faces.component.UIViewRoot;
|
||||
import javax.faces.context.FacesContext;
|
||||
import javax.faces.el.ValueBinding;
|
||||
import javax.faces.event.PhaseEvent;
|
||||
import javax.faces.event.PhaseId;
|
||||
import javax.faces.event.PhaseListener;
|
||||
import javax.faces.lifecycle.Lifecycle;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.easymock.EasyMock;
|
||||
import org.jboss.el.ExpressionFactoryImpl;
|
||||
import org.springframework.binding.expression.ExpressionParser;
|
||||
import org.springframework.binding.method.MethodSignature;
|
||||
import org.springframework.binding.method.Parameter;
|
||||
import org.springframework.web.context.support.GenericWebApplicationContext;
|
||||
import org.springframework.webflow.action.AbstractBeanInvokingAction;
|
||||
import org.springframework.webflow.action.EvaluateAction;
|
||||
import org.springframework.webflow.action.SetAction;
|
||||
import org.springframework.webflow.context.ExternalContext;
|
||||
import org.springframework.webflow.context.ExternalContextHolder;
|
||||
import org.springframework.webflow.context.servlet.ServletExternalContext;
|
||||
import org.springframework.webflow.core.expression.el.RequestContextELResolver;
|
||||
import org.springframework.webflow.core.expression.el.ScopeSearchingELResolver;
|
||||
import org.springframework.webflow.core.expression.el.WebFlowELExpressionParser;
|
||||
import org.springframework.webflow.engine.ActionState;
|
||||
import org.springframework.webflow.engine.EndState;
|
||||
import org.springframework.webflow.engine.Flow;
|
||||
import org.springframework.webflow.engine.TargetStateResolver;
|
||||
import org.springframework.webflow.engine.Transition;
|
||||
import org.springframework.webflow.engine.TransitionCriteria;
|
||||
import org.springframework.webflow.engine.ViewState;
|
||||
import org.springframework.webflow.engine.impl.FlowExecutionImplFactory;
|
||||
import org.springframework.webflow.engine.support.DefaultTargetStateResolver;
|
||||
import org.springframework.webflow.engine.support.EventIdTransitionCriteria;
|
||||
import org.springframework.webflow.execution.Action;
|
||||
import org.springframework.webflow.execution.Event;
|
||||
import org.springframework.webflow.execution.FlowExecution;
|
||||
import org.springframework.webflow.execution.FlowExecutionKey;
|
||||
import org.springframework.webflow.execution.FlowExecutionKeyFactory;
|
||||
import org.springframework.webflow.execution.RequestContext;
|
||||
import org.springframework.webflow.execution.ScopeType;
|
||||
import org.springframework.webflow.test.MockRequestContext;
|
||||
|
||||
public class JSFFlowExecutionTests extends TestCase {
|
||||
|
||||
JSFMockHelper jsf;
|
||||
JSFManagedBean jsfBean;
|
||||
JSFModel jsfModel;
|
||||
MockViewHandler viewHandler;
|
||||
MockService service;
|
||||
GenericWebApplicationContext ctx;
|
||||
TrackingPhaseListener trackingListener;
|
||||
|
||||
Flow flow;
|
||||
FlowExecution execution;
|
||||
|
||||
ExpressionParser parser = new WebFlowELExpressionParser(new ExpressionFactoryImpl());
|
||||
|
||||
/**
|
||||
* TODO - The management of the JSF mocks has gotten rather convoluted now that we are tearing down and rebuilding
|
||||
* the FacesContext multiple times per request. Consider enhancing JSFMockHelper to manage things more appropriately
|
||||
* for SWF usage.
|
||||
*/
|
||||
protected void setUp() throws Exception {
|
||||
service = EasyMock.createMock(MockService.class);
|
||||
|
||||
trackingListener = new TrackingPhaseListener();
|
||||
jsfRequestSetup();
|
||||
|
||||
flow = Flow.create("jsf-flow", null);
|
||||
|
||||
ViewState view1 = new ViewState(flow, "viewState1", new JsfViewFactory(parser.parseExpression("/view1",
|
||||
RequestContext.class, String.class, null), null));
|
||||
view1.getTransitionSet().add(new Transition(on("event1"), to("doSomething")));
|
||||
view1.getTransitionSet().add(new Transition(on("event2"), to("evalSomething")));
|
||||
|
||||
ActionState doSomething = new ActionState(flow, "doSomething");
|
||||
doSomething.getActionList().add(
|
||||
new StubBeanAction(new MethodSignature("doSomething", new Parameter(String.class, parser
|
||||
.parseExpression("#{JsfBean.prop1}", RequestContext.class, String.class, null)))));
|
||||
doSomething.getTransitionSet().add(new Transition(on("success"), to("viewState2")));
|
||||
|
||||
ActionState evalSomething = new ActionState(flow, "evalSomething");
|
||||
evalSomething.getEntryActionList().add(
|
||||
new SetAction(parser.parseExpression("#{requestContext.flowScope.jsfModel}", RequestContext.class,
|
||||
String.class, null), ScopeType.FLOW, parser.parseExpression("#{'foo'}", RequestContext.class,
|
||||
String.class, null)));
|
||||
evalSomething.getActionList().add(
|
||||
new EvaluateAction(parser.parseExpression("#{JsfBean.addValue(jsfModel)}", RequestContext.class,
|
||||
String.class, null)));
|
||||
evalSomething.getTransitionSet().add(new Transition(on("success"), to("viewState2")));
|
||||
|
||||
ViewState viewState2 = new ViewState(flow, "viewState2", new JsfViewFactory(parser.parseExpression("/view2",
|
||||
RequestContext.class, String.class, null), null));
|
||||
viewState2.getEntryActionList().add(new ViewState2SetupAction());
|
||||
viewState2.getTransitionSet().add(new Transition(on("event1"), to("endState1")));
|
||||
|
||||
new EndState(flow, "endState1");
|
||||
|
||||
FlowExecutionImplFactory factory = new FlowExecutionImplFactory();
|
||||
factory.setExecutionKeyFactory(new SimpleFlowExecutionKeyFactory());
|
||||
execution = factory.createFlowExecution(flow);
|
||||
}
|
||||
|
||||
private void jsfRequestSetup() throws Exception {
|
||||
jsf = new JSFMockHelper();
|
||||
jsf.tearDown();
|
||||
jsf.setUp();
|
||||
FacesContext flowContext = new FlowFacesContext(new MockRequestContext(), jsf.facesContext());
|
||||
org.apache.shale.test.mock.MockFacesContext.setCurrentInstance(flowContext);
|
||||
|
||||
viewHandler = new NoRenderViewHandler();
|
||||
jsf.application().setViewHandler(viewHandler);
|
||||
trackingListener.reset();
|
||||
jsf.lifecycle().addPhaseListener(trackingListener);
|
||||
|
||||
CompositeELResolver baseResolver = (CompositeELResolver) jsf.facesContext().getELContext().getELResolver();
|
||||
baseResolver.add(new RequestContextELResolver());
|
||||
baseResolver.add(new ScopeSearchingELResolver());
|
||||
|
||||
jsf.externalContext().getRequestMap().put("JsfBean", new JSFManagedBean());
|
||||
}
|
||||
|
||||
protected void tearDown() throws Exception {
|
||||
jsf.tearDown();
|
||||
}
|
||||
|
||||
public void testManagedBeanExpression() {
|
||||
ValueBinding vb = jsf.application().createValueBinding("#{JsfBean}");
|
||||
jsfBean = (JSFManagedBean) vb.getValue(jsf.facesContext());
|
||||
assertNotNull(jsfBean);
|
||||
}
|
||||
|
||||
/*
|
||||
* public void testBeanAction() throws Exception { startFlow();
|
||||
*
|
||||
* jsfRequestSetup();
|
||||
*
|
||||
* testManagedBeanExpression(); jsfBean.setProp1("arg"); service.doSomething(jsfBean.getProp1());
|
||||
* EasyMock.replay(new Object[] { service });
|
||||
*
|
||||
* jsf.externalContext().getRequestMap().put(JsfView.EVENT_KEY, "event1");
|
||||
*
|
||||
* UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId("view1");
|
||||
* viewHandler.setRestoreView(existingRoot);
|
||||
*
|
||||
* execution.resume(getExternalContext());
|
||||
*
|
||||
* EasyMock.verify(new Object[] { service });
|
||||
*
|
||||
* ViewState currentState = (ViewState) execution.getActiveSession().getState(); assertEquals("viewState2",
|
||||
* currentState.getId()); }
|
||||
*
|
||||
* public void testEvalAction() throws Exception { startFlow();
|
||||
*
|
||||
* jsfRequestSetup();
|
||||
*
|
||||
* testManagedBeanExpression();
|
||||
*
|
||||
* jsf.externalContext().getRequestMap().put(JsfView.EVENT_KEY, "event2");
|
||||
*
|
||||
* UIViewRoot existingRoot = new UIViewRoot(); existingRoot.setViewId("view1");
|
||||
* viewHandler.setRestoreView(existingRoot);
|
||||
*
|
||||
* execution.resume(getExternalContext());
|
||||
*
|
||||
* assertFalse(jsfBean.getValues().isEmpty()); String addedValue = jsfBean.getValues().get(0).toString();
|
||||
* assertEquals(addedValue, "foo");
|
||||
*
|
||||
* ViewState currentState = (ViewState) execution.getActiveSession().getState(); assertEquals("viewState2",
|
||||
* currentState.getId()); }
|
||||
*/
|
||||
private static TransitionCriteria on(String event) {
|
||||
return new EventIdTransitionCriteria(event);
|
||||
}
|
||||
|
||||
private static TargetStateResolver to(String stateId) {
|
||||
return new DefaultTargetStateResolver(stateId);
|
||||
}
|
||||
|
||||
private void startFlow() {
|
||||
UIViewRoot view = new UIViewRoot();
|
||||
view.setViewId("view1");
|
||||
viewHandler.setCreateView(view);
|
||||
execution.start(getExternalContext());
|
||||
}
|
||||
|
||||
private ExternalContext getExternalContext() {
|
||||
jsf.request().setPathElements("myApp", "", "/flow", null);
|
||||
ExternalContext ext = new ServletExternalContext(jsf.servletContext(), jsf.request(), jsf.response());
|
||||
ExternalContextHolder.setExternalContext(ext);
|
||||
return ext;
|
||||
}
|
||||
|
||||
private class TestLifecycle extends FlowLifecycle {
|
||||
|
||||
boolean executed = false;
|
||||
|
||||
public TestLifecycle(Lifecycle delegate) {
|
||||
super(delegate);
|
||||
}
|
||||
|
||||
public void execute(FacesContext context) throws FacesException {
|
||||
assertFalse("Lifecycle executed more than once", executed);
|
||||
super.execute(context);
|
||||
executed = true;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
executed = false;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class StubBeanAction extends AbstractBeanInvokingAction {
|
||||
|
||||
protected StubBeanAction(MethodSignature methodSignature) {
|
||||
super(methodSignature);
|
||||
}
|
||||
|
||||
protected Object getBean(RequestContext context) throws Exception {
|
||||
return service;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class SimpleFlowExecutionKeyFactory implements FlowExecutionKeyFactory {
|
||||
public FlowExecutionKey getKey(FlowExecution execution) {
|
||||
return new FlowExecutionKey() {
|
||||
public String toString() {
|
||||
return "key";
|
||||
}
|
||||
|
||||
public boolean equals(Object o) {
|
||||
return true;
|
||||
}
|
||||
|
||||
public int hashCode() {
|
||||
return 0;
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
private class NoRenderViewHandler extends MockViewHandler {
|
||||
|
||||
public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
|
||||
// do nothing
|
||||
}
|
||||
}
|
||||
|
||||
private class TrackingPhaseListener implements PhaseListener {
|
||||
|
||||
private List phaseCallbacks = new ArrayList();
|
||||
|
||||
public void afterPhase(PhaseEvent event) {
|
||||
String phaseCallback = "AFTER_" + event.getPhaseId();
|
||||
assertFalse("Phase callback " + phaseCallback + " already executed.", phaseCallbacks
|
||||
.contains(phaseCallback));
|
||||
phaseCallbacks.add(phaseCallback);
|
||||
}
|
||||
|
||||
public void beforePhase(PhaseEvent event) {
|
||||
String phaseCallback = "BEFORE_" + event.getPhaseId();
|
||||
assertFalse("Phase callback " + phaseCallback + " already executed.", phaseCallbacks
|
||||
.contains(phaseCallback));
|
||||
phaseCallbacks.add(phaseCallback);
|
||||
}
|
||||
|
||||
public PhaseId getPhaseId() {
|
||||
return PhaseId.ANY_PHASE;
|
||||
}
|
||||
|
||||
public List getPhaseCallbacks() {
|
||||
return phaseCallbacks;
|
||||
}
|
||||
|
||||
public void reset() {
|
||||
phaseCallbacks.clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ViewState2SetupAction implements Action {
|
||||
|
||||
public Event execute(RequestContext context) throws Exception {
|
||||
jsfRequestSetup();
|
||||
UIViewRoot newRoot = new UIViewRoot();
|
||||
newRoot.setViewId("view2");
|
||||
viewHandler.setCreateView(newRoot);
|
||||
return new Event(this, "success");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -114,8 +114,10 @@ public class JSFMockHelper {
|
||||
"org.apache.shale.test.mock.MockApplicationFactory");
|
||||
FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY,
|
||||
"org.springframework.faces.webflow.MockBaseFacesContextFactory");
|
||||
FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY,
|
||||
"org.apache.shale.test.mock.MockFacesContextFactory");
|
||||
/*
|
||||
* FactoryFinder.setFactory(FactoryFinder.FACES_CONTEXT_FACTORY,
|
||||
* "org.apache.shale.test.mock.MockFacesContextFactory");
|
||||
*/
|
||||
FactoryFinder
|
||||
.setFactory(FactoryFinder.LIFECYCLE_FACTORY, "org.apache.shale.test.mock.MockLifecycleFactory");
|
||||
FactoryFinder.setFactory(FactoryFinder.RENDER_KIT_FACTORY,
|
||||
|
||||
@@ -64,10 +64,10 @@ public class JsfFinalResponseActionTests extends TestCase {
|
||||
trackingListener = new TrackingPhaseListener();
|
||||
jsfMock.lifecycle().addPhaseListener(trackingListener);
|
||||
jsfMock.facesContext().setViewRoot(null);
|
||||
jsfMock.application().setViewHandler(viewHandler);
|
||||
jsfMock.facesContext().getApplication().setViewHandler(viewHandler);
|
||||
lifecycle = new TestLifecycle(jsfMock.lifecycle());
|
||||
factory = new JsfViewFactory(parser.parseExpression("#{'" + VIEW_ID + "'}", RequestContext.class, String.class,
|
||||
null), null);
|
||||
null), null, lifecycle);
|
||||
finalResponseAction = new JsfFinalResponseAction(factory);
|
||||
RequestContextHolder.setRequestContext(context);
|
||||
ExternalContext ext = new MockExternalContext();
|
||||
@@ -80,7 +80,7 @@ public class JsfFinalResponseActionTests extends TestCase {
|
||||
|
||||
UIViewRoot newRoot = new UIViewRoot();
|
||||
newRoot.setViewId(VIEW_ID);
|
||||
newRoot.setRenderKitId("TEST_KIT");
|
||||
newRoot.setRenderKitId("HTML_BASIC");
|
||||
((MockViewHandler) viewHandler).setCreateView(newRoot);
|
||||
|
||||
EasyMock.replay(new Object[] { context });
|
||||
@@ -141,6 +141,7 @@ public class JsfFinalResponseActionTests extends TestCase {
|
||||
public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
|
||||
rendered = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -68,7 +68,7 @@ public class JsfViewFactoryTests extends TestCase {
|
||||
trackingListener = new TrackingPhaseListener();
|
||||
jsfMock.lifecycle().addPhaseListener(trackingListener);
|
||||
jsfMock.facesContext().setViewRoot(null);
|
||||
jsfMock.application().setViewHandler(viewHandler);
|
||||
jsfMock.facesContext().getApplication().setViewHandler(viewHandler);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -77,7 +77,8 @@ public class JsfViewFactoryTests extends TestCase {
|
||||
public final void testGetView_Create() {
|
||||
|
||||
lifecycle = new NoEventLifecycle(jsfMock.lifecycle());
|
||||
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, RequestContext.class, String.class, null), null);
|
||||
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, RequestContext.class, String.class, null), null,
|
||||
lifecycle);
|
||||
|
||||
UIViewRoot newRoot = new UIViewRoot();
|
||||
newRoot.setViewId(VIEW_ID);
|
||||
@@ -98,7 +99,8 @@ public class JsfViewFactoryTests extends TestCase {
|
||||
public final void testGetView_Restore_NoEvent() {
|
||||
|
||||
lifecycle = new NoEventLifecycle(jsfMock.lifecycle());
|
||||
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, RequestContext.class, String.class, null), null);
|
||||
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, RequestContext.class, String.class, null), null,
|
||||
lifecycle);
|
||||
|
||||
UIViewRoot existingRoot = new UIViewRoot();
|
||||
existingRoot.setViewId(VIEW_ID);
|
||||
@@ -119,7 +121,8 @@ public class JsfViewFactoryTests extends TestCase {
|
||||
public final void testGetView_Restore_EventSignaled() {
|
||||
|
||||
lifecycle = new EventSignalingLifecycle(jsfMock.lifecycle());
|
||||
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, RequestContext.class, String.class, null), null);
|
||||
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, RequestContext.class, String.class, null), null,
|
||||
lifecycle);
|
||||
|
||||
UIViewRoot existingRoot = new UIViewRoot();
|
||||
existingRoot.setViewId(VIEW_ID);
|
||||
@@ -170,7 +173,8 @@ public class JsfViewFactoryTests extends TestCase {
|
||||
public final void testGetView_ExternalViewRoot() {
|
||||
|
||||
lifecycle = new NoEventLifecycle(jsfMock.lifecycle());
|
||||
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, RequestContext.class, String.class, null), null);
|
||||
factory = new JsfViewFactory(parser.parseExpression(VIEW_ID, RequestContext.class, String.class, null), null,
|
||||
lifecycle);
|
||||
|
||||
UIViewRoot newRoot = new UIViewRoot();
|
||||
newRoot.setViewId(VIEW_ID);
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.springframework.webflow.core.collection.MutableAttributeMap;
|
||||
import org.springframework.webflow.execution.FlowExecutionContext;
|
||||
import org.springframework.webflow.execution.FlowExecutionKey;
|
||||
import org.springframework.webflow.execution.RequestContext;
|
||||
import org.springframework.webflow.test.MockExternalContext;
|
||||
|
||||
public class JsfViewTests extends TestCase {
|
||||
|
||||
@@ -54,12 +55,12 @@ public class JsfViewTests extends TestCase {
|
||||
protected void setUp() throws Exception {
|
||||
|
||||
jsfMock.setUp();
|
||||
jsfMock.application().setViewHandler(new MockViewHandler());
|
||||
jsfMock.facesContext().getApplication().setViewHandler(new MockViewHandler());
|
||||
jsfMock.application().setStateManager(new TestStateManager());
|
||||
jsfMock.facesContext().setResponseWriter(new MockResponseWriter(output, null, null));
|
||||
|
||||
UIViewRoot viewToRender = new UIViewRoot();
|
||||
viewToRender.setRenderKitId("TEST_KIT");
|
||||
viewToRender.setRenderKitId("HTML_BASIC");
|
||||
viewToRender.setViewId(VIEW_ID);
|
||||
jsfMock.facesContext().setViewRoot(viewToRender);
|
||||
|
||||
@@ -81,6 +82,7 @@ public class JsfViewTests extends TestCase {
|
||||
|
||||
public final void testRender() {
|
||||
|
||||
EasyMock.expect(requestContext.getExternalContext()).andStubReturn(new MockExternalContext());
|
||||
EasyMock.expect(requestContext.getFlashScope()).andStubReturn(flashMap);
|
||||
EasyMock.expect(requestContext.getFlowScope()).andStubReturn(flowMap);
|
||||
EasyMock.expect(requestContext.getFlowExecutionContext()).andStubReturn(flowExecutionContext);
|
||||
@@ -94,11 +96,11 @@ public class JsfViewTests extends TestCase {
|
||||
|
||||
EasyMock.verify(new Object[] { requestContext, flowExecutionContext, flowMap, flashMap });
|
||||
assertNull("The FacesContext was not released", FacesContext.getCurrentInstance());
|
||||
assertTrue(output.getBuffer().toString().contains(key.toString()));
|
||||
}
|
||||
|
||||
public final void testRenderException() {
|
||||
|
||||
EasyMock.expect(requestContext.getExternalContext()).andStubReturn(new MockExternalContext());
|
||||
EasyMock.expect(requestContext.getFlashScope()).andStubReturn(flashMap);
|
||||
EasyMock.expect(flashMap.put(EasyMock.matches("renderResponse"), EasyMock.anyObject())).andStubReturn(null);
|
||||
EasyMock.expect(flashMap.put(EasyMock.matches("responseComplete"), EasyMock.anyObject())).andStubReturn(null);
|
||||
|
||||
@@ -16,10 +16,16 @@ public class MockBaseFacesContextFactory extends FacesContextFactory {
|
||||
public FacesContext getFacesContext(Object context, Object request, Object response, Lifecycle lifecycle)
|
||||
throws FacesException {
|
||||
|
||||
ExternalContext ext = new MockExternalContext((ServletContext) context, (HttpServletRequest) request,
|
||||
(HttpServletResponse) response);
|
||||
if (FacesContext.getCurrentInstance() != null
|
||||
&& FacesContext.getCurrentInstance() instanceof MockBaseFacesContext) {
|
||||
return FacesContext.getCurrentInstance();
|
||||
} else {
|
||||
|
||||
return new MockBaseFacesContext(ext, lifecycle);
|
||||
ExternalContext ext = new MockExternalContext((ServletContext) context, (HttpServletRequest) request,
|
||||
(HttpServletResponse) response);
|
||||
|
||||
return new MockBaseFacesContext(ext, lifecycle);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -20,7 +20,6 @@ import java.util.Locale;
|
||||
|
||||
import javax.faces.FacesException;
|
||||
import javax.faces.application.ViewHandler;
|
||||
import javax.faces.application.StateManager.SerializedView;
|
||||
import javax.faces.component.UIViewRoot;
|
||||
import javax.faces.context.FacesContext;
|
||||
|
||||
@@ -70,8 +69,7 @@ public class MockViewHandler extends ViewHandler {
|
||||
*/
|
||||
public void renderView(FacesContext context, UIViewRoot viewToRender) throws IOException, FacesException {
|
||||
context.getViewRoot().encodeAll(context);
|
||||
SerializedView state = context.getApplication().getStateManager().saveSerializedView(context);
|
||||
context.getRenderKit().getResponseStateManager().writeState(context, state);
|
||||
|
||||
}
|
||||
|
||||
public UIViewRoot restoreView(FacesContext context, String viewId) {
|
||||
|
||||
Reference in New Issue
Block a user