/*******************************************************************************
* Copyright (c) 2002-2006 Innoopract Informationssysteme GmbH.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Innoopract Informationssysteme GmbH - initial API and implementation
******************************************************************************/
package com.w4t.engine.lifecycle;
import org.eclipse.rwt.internal.browser.Default;
import org.eclipse.rwt.internal.browser.Ie6;
import org.eclipse.rwt.internal.lifecycle.LifeCycle;
import org.eclipse.rwt.internal.service.*;
import org.eclipse.rwt.lifecycle.*;
import junit.framework.TestCase;
import com.w4t.*;
import com.w4t.IWindowManager.IWindow;
import com.w4t.ajax.AjaxStatusUtil;
import com.w4t.engine.W4TModelUtil;
import com.w4t.engine.util.FormManager;
import com.w4t.engine.util.WindowManager;
import com.w4t.internal.adaptable.IFormAdapter;
public class FormCloseAndUnload_Test extends TestCase {
// opens a new form in a new window and closes and unloads the current
private final class DispatchHandler implements PhaseListener {
private static final long serialVersionUID = 1L;
WebForm newForm;
public void afterPhase( final PhaseEvent event ) {
}
public void beforePhase( final PhaseEvent event ) {
WebForm oldActive = FormManager.getActive();
IWindow window = W4TContext.getWindowManager().findWindow( oldActive );
if( window != null ) {
window.close();
}
oldActive.unload();
newForm = W4TFixture.loadStartupForm();
W4TContext.showInNewWindow( newForm );
}
public PhaseId getPhaseId() {
return PhaseId.PROCESS_ACTION;
}
}
protected void setUp() throws Exception {
W4TFixture.setUp();
W4TFixture.createContext();
}
protected void tearDown() throws Exception {
W4TFixture.tearDown();
W4TFixture.removeContext();
}
public void testSimpleClose_Script() throws Exception {
// prepare 'fake' environment
W4TFixture.fakeResponseWriter();
W4TFixture.fakeBrowser( new Default( true, false ) );
W4TModelUtil.initModel();
final WebForm form = prepareFormAndRequestParms();
//
// run request -> closes the window of the current form
LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
lifeCycle.addPhaseListener( new PhaseListener() {
private static final long serialVersionUID = 1L;
public void afterPhase( final PhaseEvent event ) {
}
public void beforePhase( final PhaseEvent event ) {
IWindow window = W4TContext.getWindowManager().findWindow( form );
if( window != null ) {
window.close();
}
}
public PhaseId getPhaseId() {
return PhaseId.PROCESS_ACTION;
}
} );
lifeCycle.execute();
// obtain generated markup
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
assertTrue( allMarkup.indexOf( "windowManager.closeWindow()" ) != -1 );
}
public void testCloseTwoWindows_Script() throws Exception {
// prepare 'fake' environment
W4TFixture.fakeResponseWriter();
W4TFixture.fakeBrowser( new Default( true, false ) );
W4TModelUtil.initModel();
final WebForm form1 = prepareFormAndRequestParms();
final WebForm form2 = W4TFixture.getEmptyWebFormInstance();
FormManager.add( form2 );
IWindow window1 = WindowManager.getInstance().findWindow( form1 );
IWindow window2 = WindowManager.getInstance().create( form2 );
//
// run request -> closes the window of the current form
LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
PhaseListener phaseListener = new PhaseListener() {
private static final long serialVersionUID = 1L;
public void afterPhase( final PhaseEvent event ) {
}
public void beforePhase( final PhaseEvent event ) {
form1.closeWindow();
form2.closeWindow();
}
public PhaseId getPhaseId() {
return PhaseId.PROCESS_ACTION;
}
};
lifeCycle.addPhaseListener( phaseListener );
lifeCycle.execute();
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
assertTrue( allMarkup.indexOf( "windowManager.closeWindow()" ) != -1 );
String expected
= "refreshWindow( 'http://fooserver:8080/fooapp/W4TDelegate?"
+ "uiRoot="
+ window2.getId()
+ ";"
+ form2.getUniqueID();
assertTrue( allMarkup.indexOf( expected ) != -1 );
assertEquals( true, WindowManager.isClosing( window1 ) );
assertEquals( true, WindowManager.isClosed( window1 ) );
assertEquals( true, WindowManager.isClosing( window2 ) );
assertEquals( false, WindowManager.isClosed( window2 ) );
// simulate 'refresh'-request of form2
IFormAdapter adapter = W4TFixture.getFormAdapter( form2 );
String requestCounter = String.valueOf( adapter.getRequestCounter() - 1 );
W4TFixture.fakeFormRequestParams( requestCounter,
window2.getId(),
form2.getUniqueID() );
FormManager.setActive( null );
WindowManager.setActive( null );
W4TFixture.fakeResponseWriter();
lifeCycle.removePhaseListener( phaseListener );
lifeCycle.execute();
allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
assertTrue( allMarkup.indexOf( "windowManager.closeWindow()" ) != -1 );
assertTrue( allMarkup.indexOf( "refreshWindow" ) == -1 );
}
public void testSimpleClose_Ajax() throws Exception {
// prepare 'fake' environment
W4TFixture.fakeResponseWriter();
W4TFixture.fakeBrowser( new Ie6( true, true ) );
W4TModelUtil.initModel();
final WebForm form = prepareFormAndRequestParms();
AjaxStatusUtil.preRender( form );
AjaxStatusUtil.postRender( form );
W4TFixture.fakeRequestParam( RequestParams.IS_AJAX_REQUEST, "true" );
//
// run request -> closes the window of the current form
LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
lifeCycle.addPhaseListener( new PhaseListener() {
private static final long serialVersionUID = 1L;
public void afterPhase( final PhaseEvent event ) {
}
public void beforePhase( final PhaseEvent event ) {
form.closeWindow();
}
public PhaseId getPhaseId() {
return PhaseId.PROCESS_ACTION;
}
} );
lifeCycle.execute();
// obtain generated markup
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
assertTrue( allMarkup.indexOf( "ajax-response" ) != -1 );
String expected
= "<script type=\"text/javascript\">"
+ "windowManager.closeWindow();"
+ "</script>";
assertTrue( allMarkup.indexOf( expected ) != -1 );
}
public void testCloseTwoWindows_Ajax() throws Exception {
// prepare 'fake' environment
W4TFixture.fakeResponseWriter();
W4TFixture.fakeBrowser( new Ie6( true, true ) );
W4TModelUtil.initModel();
final WebForm form1 = prepareFormAndRequestParms();
final WebForm form2 = W4TFixture.getEmptyWebFormInstance();
FormManager.add( form2 );
IWindow window2 = WindowManager.getInstance().create( form2 );
AjaxStatusUtil.preRender( form1 );
AjaxStatusUtil.postRender( form1 );
W4TFixture.fakeRequestParam( RequestParams.IS_AJAX_REQUEST, "true" );
//
// run request -> closes the window of the current form
LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
lifeCycle.addPhaseListener( new PhaseListener() {
private static final long serialVersionUID = 1L;
public void afterPhase( final PhaseEvent event ) {
}
public void beforePhase( final PhaseEvent event ) {
form1.closeWindow();
form2.closeWindow();
}
public PhaseId getPhaseId() {
return PhaseId.PROCESS_ACTION;
}
} );
lifeCycle.execute();
// obtain generated markup
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
assertTrue( allMarkup.indexOf( "ajax-response" ) != -1 );
String expected = "windowManager.closeWindow();";
assertTrue( allMarkup.indexOf( expected ) != -1 );
expected
= "refreshWindow( 'http://fooserver:8080/fooapp/W4TDelegate?"
+ "uiRoot="
+ window2.getId()
+ ";"
+ form2.getUniqueID();
assertTrue( allMarkup.indexOf( expected ) != -1 );
}
public void testShowInNewWindowAndUnload_Noscript() throws Exception {
// prepare 'fake' environment
W4TFixture.fakeResponseWriter();
W4TFixture.fakeBrowser( new Default( false, false ) );
W4TModelUtil.initModel();
WebForm originatingForm = prepareFormAndRequestParms();
IWindow originatingWindow
= WindowManager.getInstance().findWindow( originatingForm );
// run request -> switches form with closing and unloading old one
LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
DispatchHandler dispatchHandler = new DispatchHandler();
lifeCycle.addPhaseListener( dispatchHandler );
lifeCycle.execute();
// obtain generated markup
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
// new form must be marked as active
assertEquals( FormManager.getActive(), originatingForm );
// old form must be marked as closing
assertEquals( true, WindowManager.isClosing( originatingWindow ) );
// old form must not be found in FormManager
assertNull( FormManager.findById( originatingForm.getUniqueID() ) );
assertEquals( 1, FormManager.getAll().length );
// window of old form must not be found in WindowManager
IWindow window
= WindowManager.getInstance().findById( originatingWindow.getId() );
assertNull( window );
// render output must contain markup for old form
String expected = "<form id=\"" + originatingForm.getUniqueID();
assertTrue( allMarkup.indexOf( expected ) != -1 );
// ... and include code to close open new form (in its new window)
// must look like openNewWindow( ... 'newWindowId'
expected
= "<meta http-equiv=\"refresh\" content=\"0; "
+ "url=http://fooserver:8080/fooapp/W4TDelegate?uiRoot=w2;"
+ dispatchHandler.newForm.getUniqueID();
assertTrue( allMarkup.indexOf( expected ) != -1 );
// simulate 'refresh'-request of newForm
IFormAdapter adapter = W4TFixture.getFormAdapter( dispatchHandler.newForm );
String requestCounter = String.valueOf( adapter.getRequestCounter() - 1 );
W4TFixture.fakeFormRequestParams( requestCounter,
"w2",
dispatchHandler.newForm.getUniqueID() );
FormManager.setActive( null );
WindowManager.setActive( null );
W4TFixture.fakeResponseWriter();
lifeCycle.removePhaseListener( dispatchHandler );
lifeCycle.execute();
allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
assertTrue( allMarkup.indexOf( "http-equiv=\"refresh\"" ) == -1 );
}
public void testShowInNewWindowAndUnload_Script() throws Exception {
// prepare 'fake' environment
W4TFixture.fakeResponseWriter();
W4TFixture.fakeBrowser( new Default( true, false ) );
W4TModelUtil.initModel();
WebForm originatingForm = prepareFormAndRequestParms();
IWindow originatingWindow
= WindowManager.getInstance().findWindow( originatingForm );
// run request -> switches form with closing and unloading old one
LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
DispatchHandler dispatchHandler = new DispatchHandler();
lifeCycle.addPhaseListener( dispatchHandler );
lifeCycle.execute();
// obtain generated markup
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
// new form must be marked as active
assertEquals( FormManager.getActive(), originatingForm );
// old form must be marked as closing
assertEquals( true, WindowManager.isClosing( originatingWindow ) );
// old form must not be found in FormManager
assertNull( FormManager.findById( originatingForm.getUniqueID() ) );
assertEquals( 1, FormManager.getAll().length );
// window of old form must not be found in WindowManager
IWindow window
= WindowManager.getInstance().findById( originatingWindow.getId() );
assertNull( window );
// render output must contain markup for old form
String expected = "<form id=\"" + originatingForm.getUniqueID();
assertTrue( allMarkup.indexOf( expected ) != -1 );
// ... and include code to close open new form (in its new window)
// must look like openNewWindow( ... 'newWindowId'
int indexOfOpenNewWindow = allMarkup.indexOf( "openNewWindow(" );
assertTrue( indexOfOpenNewWindow != -1 );
IWindow newWindow
= WindowManager.getInstance().findWindow( dispatchHandler.newForm );
assertTrue( allMarkup.indexOf( newWindow.getId() ) > indexOfOpenNewWindow );
// ... and include code to close window of old form
assertTrue( allMarkup.indexOf( "closeWindow()" ) != -1 );
}
public void testShowInNewWindowAndUnload_Ajax() throws Exception {
// prepare 'fake' environment
W4TFixture.fakeResponseWriter();
W4TFixture.fakeBrowser( new Ie6( true, true ) );
W4TModelUtil.initModel();
WebForm originatingForm = prepareFormAndRequestParms();
AjaxStatusUtil.preRender( originatingForm );
AjaxStatusUtil.postRender( originatingForm );
W4TFixture.fakeRequestParam( RequestParams.IS_AJAX_REQUEST, "true" );
IWindow originatingWindow
= WindowManager.getInstance().findWindow( originatingForm );
// run request -> switches form with closing and unloading old one
LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
DispatchHandler dispatchHandler = new DispatchHandler();
lifeCycle.addPhaseListener( dispatchHandler );
lifeCycle.execute();
// obtain generated markup
IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
// new form must be marked as active
assertEquals( FormManager.getActive(), originatingForm );
// old window must be marked as closing
assertEquals( true, WindowManager.isClosing( originatingWindow ) );
// old form must not be found in FormManager nay more
assertNull( FormManager.findById( originatingForm.getUniqueID() ) );
assertEquals( 1, FormManager.getAll().length );
// window of old form must not be found in WindowManager
IWindow window
= WindowManager.getInstance().findById( originatingWindow.getId() );
assertNull( window );
// render output must be an ajax-response containing the javaScript to
// close old form and open new form in new window
assertTrue( allMarkup.indexOf( "<ajax-response>" ) != -1 );
// ... and include code to close open new form (in its new window)
// must look like openNewWindow( ... 'newWindowId'
int indexOfOpenNewWindow = allMarkup.indexOf( "openNewWindow(" );
assertTrue( indexOfOpenNewWindow != -1 );
IWindow newWindow
= WindowManager.getInstance().findWindow( dispatchHandler.newForm );
assertTrue( allMarkup.indexOf( newWindow.getId() ) > indexOfOpenNewWindow );
// ... and include code to close window of old form
assertTrue( allMarkup.indexOf( "closeWindow()" ) != -1 );
}
// TODO [rh] [WFT-29] Find a decent way to handle requests to closed windows
//
// public void testRequestUnloadedForm_Script() throws Exception {
// // 1. prepare 'fake' environment
// W4TFixture.fakeResponseWriter();
// W4TFixture.fakeBrowser( new Default( false, true ) );
// W4TModelUtil.getW4TModel();
// WebForm originatingForm = prepareFormAndRequestParms();
// // 2. run request -> switches form with closing and unloading old one
// LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
// DispatchHandler dispatchHandler = new DispatchHandler();
// lifeCycle.addPhaseListener( dispatchHandler );
// lifeCycle.execute();
// // 3. Fake request that asks for the just unloaded form
// FormManager.setActive( null );
// WindowManager.setActive( null );
// W4TFixture.fakeResponseWriter();
// lifeCycle.removePhaseListener( dispatchHandler );
// lifeCycle.execute();
// IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
// String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
// String notExpected = "<form id=\"p5\"";
// // assertTrue( allMarkup.indexOf( notExpected ) == -1 );
// System.out.println( allMarkup );
// }
//
// public void testRequestUnloadedForm_Ajax() throws Exception {
// // 1. prepare 'fake' environment
// W4TFixture.fakeResponseWriter();
// W4TFixture.fakeBrowser( new Default( true, true ) );
// W4TModelUtil.getW4TModel();
// WebForm originatingForm = prepareFormAndRequestParms();
// AjaxStatusUtil.update( originatingForm );
// AjaxStatusUtil.reset( originatingForm );
// W4TFixture.fakeRequestParam( RequestParams.AJAX_REQUEST, "true" );
// // 2. run request -> switches form with closing and unloading old one
// LifeCycle lifeCycle = ( LifeCycle )W4TContext.getLifeCycle();
// DispatchHandler dispatchHandler = new DispatchHandler();
// lifeCycle.addPhaseListener( dispatchHandler );
// lifeCycle.execute();
//
// // 3. Fake request that asks for the just unloaded form
// FormManager.setActive( null );
// WindowManager.setActive( null );
// W4TFixture.fakeResponseWriter();
// lifeCycle.removePhaseListener( dispatchHandler );
// lifeCycle.execute();
//
// IServiceStateInfo stateInfo = ContextProvider.getStateInfo();
// String allMarkup = W4TFixture.getAllMarkup( stateInfo.getResponseWriter() );
//
// String notExpected = "<form id=\"p5\"";
//// assertTrue( allMarkup.indexOf( notExpected ) == -1 );
//System.out.println( allMarkup );
// }
private WebForm prepareFormAndRequestParms() throws Exception {
WebForm result = W4TFixture.loadStartupForm();
IWindow window = WindowManager.getInstance().create( result );
IFormAdapter adapter = W4TFixture.getFormAdapter( result );
adapter.increase();
String formId = result.getUniqueID();
String requestCounter = String.valueOf( adapter.getRequestCounter() - 1 );
W4TFixture.fakeFormRequestParams( requestCounter, window.getId(), formId );
return result;
}
}