/*******************************************************************************
* Copyright (c) 2002, 2008 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 org.eclipse.rwt.internal.engine;
import javax.servlet.ServletContextEvent;
import junit.framework.TestCase;
import org.eclipse.rwt.*;
import org.eclipse.rwt.branding.AbstractBranding;
import org.eclipse.rwt.internal.*;
import org.eclipse.rwt.internal.branding.BrandingManager;
import org.eclipse.rwt.internal.lifecycle.*;
import org.eclipse.rwt.internal.resources.ResourceManager;
import org.eclipse.rwt.internal.resources.ResourceRegistry;
import org.eclipse.rwt.internal.service.ContextProvider;
import org.eclipse.rwt.lifecycle.*;
import org.eclipse.rwt.resources.IResource;
import org.eclipse.rwt.resources.IResourceManager.RegisterOptions;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.*;
public class RWTServletContextListener_Test extends TestCase {
private static final String ENTRYPOINT
= RWTServletContextListener.ENTRY_POINTS_PARAM;
private static final String RESOURCE_MANAGER_FACTORY
= RWTServletContextListener.RESOURCE_MANAGER_FACTORY_PARAM;
private static final String ADAPTER_FACTORY
= RWTServletContextListener.ADAPTER_FACTORIES_PARAM;
private static final String PHASE_LISTENER_PARAM
= RWTServletContextListener.PHASE_LISTENERS_PARAM;
private static final String RESOURCE_PARAM
= RWTServletContextListener.RESOURCES_PARAM;
private static final String BRANDING_PARAM
= RWTServletContextListener.BRANDINGS_PARAM;
private static String phaseListenerLog = "";
public static class TestEntryPointWithShell implements IEntryPoint {
Composite shell;
public int createUI() {
Display display = new Display();
shell = new Shell( display , SWT.NONE );
return -15;
}
}
public static class TestPhaseListener implements PhaseListener {
private static final long serialVersionUID = 1L;
public void beforePhase( final PhaseEvent event ) {
phaseListenerLog += "before";
}
public void afterPhase( final PhaseEvent event ) {
phaseListenerLog += "after";
}
public PhaseId getPhaseId() {
return PhaseId.ANY;
}
}
public static class TestResource implements IResource {
public String getCharset() {
return null;
}
public ClassLoader getLoader() {
return null;
}
public String getLocation() {
return null;
}
public RegisterOptions getOptions() {
return null;
}
public boolean isExternal() {
return false;
}
public boolean isJSLibrary() {
return false;
}
}
public static class TestBranding extends AbstractBranding {
}
protected void setUp() throws Exception {
Fixture.fakeContext();
System.setProperty( IInitialization.PARAM_LIFE_CYCLE,
RWTLifeCycle.class.getName() );
}
protected void tearDown() throws Exception {
Fixture.tearDown();
AdapterFactoryRegistry.clear();
}
public void testAdapterFactoryRegistryInitialization() {
RWTServletContextListener listener = new RWTServletContextListener();
TestServletContext servletContext = new TestServletContext();
String factoryName = TestAdapterFactory.class.getName();
String adaptableName = TestAdaptable.class.getName();
String factoryParams = "\n "
+ factoryName
+ "#"
+ adaptableName
+ ",\n \t "
+ factoryName
+ "#"
+ adaptableName
+ " \n";
servletContext.setInitParameter( ADAPTER_FACTORY,
factoryParams );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
AdapterFactoryRegistry.register();
TestAdaptable testAdaptable = new TestAdaptable();
Runnable runnable = ( Runnable )testAdaptable.getAdapter( Runnable.class );
assertNotNull( runnable );
deregisterResourceManager();
}
public void testResourceManagerInitialization() {
RWTServletContextListener listener = new RWTServletContextListener();
TestServletContext servletContext = new TestServletContext();
String factoryName = TestResourceManagerFactory.class.getName();
servletContext.setInitParameter( RESOURCE_MANAGER_FACTORY,
factoryName );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
assertTrue( ResourceManager.getInstance() instanceof TestResourceManager );
deregisterResourceManager();
}
public void testEntryPointInitialization() {
// org.eclipse.swt: TestEntryPoint
RWTServletContextListener listener = new RWTServletContextListener();
TestServletContext servletContext = new TestServletContext();
servletContext.setInitParameter( ENTRYPOINT,
TestEntryPointWithShell.class.getName() );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
int returnVal = EntryPointManager.createUI( EntryPointManager.DEFAULT );
assertEquals( -15, returnVal );
Display.getCurrent().dispose();
EntryPointManager.deregister( EntryPointManager.DEFAULT );
deregisterResourceManager();
AdapterFactoryRegistry.clear();
// org.eclipse.swt: TestEntryPoint#param1
String entryPointParam
= TestEntryPointWithShell.class.getName() + "#param1";
servletContext.setInitParameter( ENTRYPOINT, entryPointParam );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
returnVal = EntryPointManager.createUI( "param1" );
assertEquals( -15, returnVal );
Display.getCurrent().dispose();
EntryPointManager.deregister( "param1" );
deregisterResourceManager();
AdapterFactoryRegistry.clear();
// org.eclipse.swt: TestEntryPoint#param1
entryPointParam = "\n "
+ TestEntryPointWithShell.class.getName()
+ ",\n \t "
+ TestEntryPointWithShell.class.getName()
+ "#param1"
+ " \n";
servletContext.setInitParameter( ENTRYPOINT, entryPointParam );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
returnVal = EntryPointManager.createUI( EntryPointManager.DEFAULT );
assertEquals( -15, returnVal );
Display.getCurrent().dispose();
returnVal = EntryPointManager.createUI( "param1" );
assertEquals( -15, returnVal );
Display.getCurrent().dispose();
EntryPointManager.deregister( EntryPointManager.DEFAULT );
EntryPointManager.deregister( "param1" );
deregisterResourceManager();
AdapterFactoryRegistry.clear();
// org.eclipse.swt: <null>
servletContext.setInitParameter( ENTRYPOINT, null );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
deregisterResourceManager();
}
public void testDestroyed() {
// org.eclipse.swt: TestEntryPoint
RWTServletContextListener listener = new RWTServletContextListener();
TestServletContext servletContext = new TestServletContext();
servletContext.setInitParameter( ENTRYPOINT,
TestEntryPointWithShell.class.getName() );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
listener = new RWTServletContextListener();
listener.contextDestroyed( new ServletContextEvent( servletContext ) );
try {
EntryPointManager.createUI( EntryPointManager.DEFAULT );
fail( "contextDestroyed did not deregister entry point" );
} catch( IllegalArgumentException e ) {
// expected
}
deregisterResourceManager();
}
public void testPhaseListenerInitialization() throws Exception {
// Reading the phaseListeners from servlet context must pass without a
// context (session, request, etc) being present
ContextProvider.disposeContext();
// read phase listener from servlet context init parameter
RWTServletContextListener listener = new RWTServletContextListener();
TestServletContext servletContext = new TestServletContext();
servletContext.setInitParameter( PHASE_LISTENER_PARAM,
TestPhaseListener.class.getName() );
String factoryName = TestResourceManagerFactory.class.getName();
servletContext.setInitParameter( RESOURCE_MANAGER_FACTORY,
factoryName );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
// Prepare and execute a life cycle to ensure that the phase listener
// was loaded and gets executed
TestResponse response = new TestResponse();
TestRequest request = new TestRequest();
request.setSession( new TestSession() );
Fixture.fakeContextProvider( response, request );
EntryPointManager.register( EntryPointManager.DEFAULT,
TestEntryPointWithShell.class );
Fixture.fakeResponseWriter();
RWTLifeCycle lifeCycle = ( RWTLifeCycle )LifeCycleFactory.getLifeCycle();
phaseListenerLog = "";
lifeCycle.execute();
assertTrue( phaseListenerLog.length() > 0 );
// Ensure that phase listeners are removed from the registry when context
// is destroyed
listener = new RWTServletContextListener();
listener.contextDestroyed( new ServletContextEvent( servletContext ) );
PhaseListener[] phaseListeners = PhaseListenerRegistry.get();
for( int i = 0; i < phaseListeners.length; i++ ) {
if( phaseListeners[ i ] instanceof TestPhaseListener ) {
fail( "Failed to remove phase listener when context was destroyed" );
}
}
// clean up
deregisterResourceManager();
EntryPointManager.deregister( EntryPointManager.DEFAULT );
}
public void testResourceInitialization() throws Exception {
ContextProvider.disposeContext();
// read phase listener from servlet context init parameter
RWTServletContextListener listener = new RWTServletContextListener();
TestServletContext servletContext = new TestServletContext();
servletContext.setInitParameter( RESOURCE_PARAM,
TestResource.class.getName() );
String factoryName = TestResourceManagerFactory.class.getName();
servletContext.setInitParameter( RESOURCE_MANAGER_FACTORY,
factoryName );
listener.contextInitialized( new ServletContextEvent( servletContext ) );
// Prepare and execute a life cycle to ensure that the phase listener
// was loaded and gets executed
TestResponse response = new TestResponse();
TestRequest request = new TestRequest();
request.setSession( new TestSession() );
Fixture.fakeContextProvider( response, request );
EntryPointManager.register( EntryPointManager.DEFAULT,
TestEntryPointWithShell.class );
Fixture.fakeResponseWriter();
RWTLifeCycle lifeCycle = ( RWTLifeCycle )LifeCycleFactory.getLifeCycle();
lifeCycle.execute();
assertTrue( ResourceRegistry.get()[ 0 ] instanceof TestResource );
assertTrue( ResourceRegistry.get().length == 1 );
// Ensure that phase listeners are removed when context is destroyed
listener = new RWTServletContextListener();
listener.contextDestroyed( new ServletContextEvent( servletContext ) );
assertTrue( ResourceRegistry.get().length == 0 );
deregisterResourceManager();
EntryPointManager.deregister( EntryPointManager.DEFAULT );
}
public void testBrandingInitialization() {
ContextProvider.disposeContext();
RWTServletContextListener listener = new RWTServletContextListener();
TestServletContext servletContext = new TestServletContext();
servletContext.setInitParameter( BRANDING_PARAM,
TestBranding.class.getName() );
// simulate context initialization
listener.contextInitialized( new ServletContextEvent( servletContext ) );
assertEquals( 1, BrandingManager.getAll().length );
assertEquals( TestBranding.class,
BrandingManager.getAll()[ 0 ].getClass() );
// simulate context de-initialization
TestResponse response = new TestResponse();
TestRequest request = new TestRequest();
request.setSession( new TestSession() );
Fixture.fakeContextProvider( response, request );
listener.contextDestroyed( new ServletContextEvent( servletContext ) );
assertEquals( 0, BrandingManager.getAll().length );
// clean up
deregisterResourceManager();
}
private void deregisterResourceManager() {
Fixture.setPrivateField( ResourceManager.class, null, "_instance", null );
Fixture.setPrivateField( ResourceManager.class, null, "factory", null );
}
}