/******************************************************************************* * Copyright (c) 2010 EclipseSource and others. 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: * EclipseSource - initial API and implementation *******************************************************************************/ package org.eclipse.rwt.internal.protocol; import org.eclipse.rwt.internal.lifecycle.RWTRequestVersionControl; import org.eclipse.rwt.lifecycle.AbstractWidgetLCA; import org.eclipse.rwt.lifecycle.WidgetUtil; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Widget; public class ChunkDistributor implements IStreamListener { private Composite root; private int requestCount; public ChunkDistributor( final Composite root ) { this.root = root; } public void objectFinished( final String key, final Object object ) { if( key.equals( IProtocolConstants.MESSAGE_WIDGETS ) ) { handleWidgetPayloads( object ); } else if( key.equals( IProtocolConstants.MESSAGE_META ) ) { handleMetaPayload( object ); } } private void handleWidgetPayloads( final Object object ) { if( object instanceof Chunk ) { Chunk chunk = ( Chunk )object; String widgetId = ( String )chunk.getValue( IProtocolConstants.WIDGETS_ID ); String payloadType = ( String )chunk.getValue( IProtocolConstants.WIDGETS_TYPE ); Chunk payload = ( Chunk )chunk.getValue( IProtocolConstants.WIDGETS_PAYLOAD ); handlePayload( widgetId, payloadType, payload ); } } private void handlePayload( final String widgetId, final String payloadType, final Chunk payload ) { Widget widget = WidgetUtil.find( root, widgetId ); if( widget != null ) { if( payloadType.equals( IProtocolConstants.PAYLOAD_SYNCHRONIZE ) ) { handleSynchronizePayload( payload, widget ); } else if( payloadType.equals( IProtocolConstants.PAYLOAD_FIRE_EVENT ) ) { String eventName = ( String )payload.getValue( IProtocolConstants.KEY_EVENT ); handleFireEventPayload( eventName, widget ); } } } private void handleSynchronizePayload( final Chunk payload, final Widget widget ) { AbstractWidgetLCA lca = WidgetUtil.getLCA( widget ); if( lca instanceof IChunkAdapter ) { ( ( IChunkAdapter)lca ).readData( widget, payload ); } } private void handleFireEventPayload( final String eventName, final Widget widget ) { AbstractWidgetLCA lca = WidgetUtil.getLCA( widget ); if( lca instanceof IChunkAdapter ) { ( ( IChunkAdapter)lca ).processEvent( widget, eventName ); } } private void handleMetaPayload( final Object object ) { if( object instanceof Chunk ) { Chunk chunk = ( Chunk )object; Integer value = ( Integer )chunk.getValue( IProtocolConstants.KEY_REQUEST_COUNTER ); requestCount = value.intValue(); } } public boolean isRequestValid() { return RWTRequestVersionControl.isValid( requestCount ); } }