/*******************************************************************************
* 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;
import java.io.IOException;
import java.text.Format;
import java.text.MessageFormat;
import javax.servlet.http.HttpServletRequest;
import org.eclipse.rwt.Adaptable;
import org.eclipse.rwt.internal.browser.Browser;
import org.eclipse.rwt.internal.lifecycle.HtmlResponseWriter;
import org.eclipse.rwt.internal.service.*;
import com.w4t.IWindowManager.IWindow;
import com.w4t.ajax.AjaxStatusUtil;
import com.w4t.dhtml.Item;
import com.w4t.engine.lifecycle.standard.EventQueue;
import com.w4t.engine.lifecycle.standard.IRenderingSchedule;
import com.w4t.engine.util.FormManager;
import com.w4t.engine.util.WindowManager;
import com.w4t.event.WebDataEvent;
import com.w4t.internal.adaptable.IRenderInfoAdapter;
import com.w4t.util.RendererCache;
/**
* <p>This class contains utility methods used by the lifecycle
* implementation.</p>
* <p>This class is not inteded to be used by clients.</p>
*/
// TODO [rh] JavaDoc necessary?
public class LifeCycleHelper {
private static final String ATTR_RENDERING_SCHEDULE
= IRenderingSchedule.class.getName();
private LifeCycleHelper() {
}
public static void readData( final WebComponent component ) {
Browser browser = W4TContext.getBrowser();
retrieveRenderer( component, browser ).readData( component );
}
public static void applyRequestValue( final IInputValueHolder valueHolder,
final String value )
{
String oldValue = valueHolder.getValue();
String newValue = value == null ? "" : value;
if( !oldValue.equals( newValue ) ) {
Format formatter = valueHolder.getFormatter();
if( formatter != null ) {
valueHolder.setValue( ConverterUtil.parse( formatter, newValue ) );
} else {
valueHolder.setValue( newValue );
}
if( WebDataEvent.hasListener( valueHolder ) ) {
WebDataEvent evt = new WebDataEvent( valueHolder,
WebDataEvent.VALUE_CHANGED,
oldValue,
newValue );
EventQueue.getEventQueue().addToQueue( evt );
}
}
}
public static void processAction( final WebComponent component ) {
Browser browser = W4TContext.getBrowser();
retrieveRenderer( component, browser ).processAction( component );
}
public final static void render( final WebComponent component )
throws IOException
{
render( component, component );
}
public final static void render( final Adaptable questioner,
final WebComponent component )
throws IOException
{
Browser browser = W4TContext.getBrowser();
Browser detectedBrowser = getStateInfo().getDetectedBrowser();
WebComponent parentComponent = getParentComponent( component );
if( component.isVisible() ) {
createRenderInfo( questioner );
AjaxStatusUtil.startEnvelope( questioner );
Renderer renderer = retrieveRenderer( questioner, browser );
renderer.renderStateInfoMarkup( component );
renderer.render( component );
AjaxStatusUtil.endEnvelope( questioner );
} else if( detectedBrowser.isAjaxEnabled()
&& getSchedule().isScheduled( parentComponent ) )
{
AjaxStatusUtil.startEnvelope( component );
HtmlResponseWriter out = getStateInfo().getResponseWriter();
RenderUtil.appendAjaxPlaceholder( out, component, false );
AjaxStatusUtil.endEnvelope( component );
}
}
private static WebComponent getParentComponent( final WebComponent cmp ) {
WebComponent result = null;
if( cmp instanceof Item ) {
result = ( ( Item )cmp ).getParentNode();
} else {
result = cmp.getParent();
}
return result;
}
public static void setSchedule( final IRenderingSchedule schedule ) {
getStateInfo().setAttribute( ATTR_RENDERING_SCHEDULE, schedule );
}
public static IRenderingSchedule getSchedule() {
Object attribute = getStateInfo().getAttribute( ATTR_RENDERING_SCHEDULE );
return ( IRenderingSchedule )attribute;
}
private static IServiceStateInfo getStateInfo() {
return ContextProvider.getStateInfo();
}
private static void createRenderInfo( final Adaptable questioner ) {
Class clazz = IRenderInfoAdapter.class;
Object adapter = questioner.getAdapter( clazz );
IRenderInfoAdapter infoAdapter = ( IRenderInfoAdapter )adapter;
if( infoAdapter != null ) {
infoAdapter.createInfo();
}
}
private static Renderer retrieveRenderer( final Object questioner,
final Browser browser )
{
RendererCache cache = RendererCache.getInstance();
return cache.retrieveRenderer( questioner.getClass(), browser );
}
public static String createUIRootId() {
String windowId = WindowManager.getActive().getId();
String formId = FormManager.getActive().getUniqueID();
return createUIRootId( windowId, formId );
}
public static String getRequestWindowId() {
HttpServletRequest request = ContextProvider.getRequest();
String uiRoot = request.getParameter( RequestParams.UIROOT );
String result = null;
if( uiRoot != null ) {
String[] parts = uiRoot.split( ";" );
result = parts[ 0 ];
}
return result;
}
public static String getRequestFormId() {
HttpServletRequest request = ContextProvider.getRequest();
String uiRoot = request.getParameter( RequestParams.UIROOT );
String result = null;
if( uiRoot != null ) {
String[] parts = uiRoot.split( ";" );
result = parts[ 1 ];
}
return result;
}
public static String createUIRootId( final WebForm form ) {
String formId = form.getUniqueID();
IWindow window = WindowManager.getInstance().findWindow( form );
if( window == null ) {
String text = "The form with id ''{0}'' is not associated with a window.";
Object[] args = new Object[] { form.getUniqueID() };
String msg = MessageFormat.format( text, args );
throw new IllegalStateException( msg );
}
return createUIRootId( window.getId(), formId );
}
private static String createUIRootId( final String windowId,
final String formId )
{
StringBuffer uiRoot = new StringBuffer();
uiRoot.append( windowId );
uiRoot.append( ";" );
uiRoot.append( formId );
return uiRoot.toString();
}
}