/*******************************************************************************
* Copyright (c) 2013, 2015 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.rap.rwt.internal.remote;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.rap.json.JsonObject;
import org.eclipse.rap.json.JsonValue;
import org.eclipse.rap.rwt.internal.protocol.ProtocolMessageWriter;
/**
* A remote object implementation that does not write operations directly, but keeps them in a
* render queue. The {@link RemoteObjectLifeCycleAdapter} will write the operations by calling the
* <code>render</code> method.
*/
public class DeferredRemoteObject extends RemoteObjectImpl {
private final List<RenderRunnable> renderQueue;
private boolean created;
public DeferredRemoteObject( final String id, final String createType ) {
super( id );
renderQueue = new ArrayList<>();
if( createType != null ) {
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendCreate( id, createType );
}
} );
}
}
@Override
public void set( final String name, final int value ) {
super.set( name, value );
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendSet( getId(), name, value );
}
} );
}
@Override
public void set( final String name, final double value ) {
super.set( name, value );
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendSet( getId(), name, value );
}
} );
}
@Override
public void set( final String name, final boolean value ) {
super.set( name, value );
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendSet( getId(), name, value );
}
} );
}
@Override
public void set( final String name, final String value ) {
super.set( name, value );
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendSet( getId(), name, value );
}
} );
}
@Override
public void set( final String name, final JsonValue value ) {
super.set( name, value );
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendSet( getId(), name, value );
}
} );
}
@Override
public void listen( final String eventType, final boolean listen ) {
super.listen( eventType, listen );
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendListen( getId(), eventType, listen );
}
} );
}
@Override
public void call( final String method, final JsonObject parameters ) {
super.call( method, parameters );
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendCall( getId(), method, parameters );
}
} );
}
@Override
public void destroy() {
super.destroy();
renderQueue.add( new RenderRunnable() {
@Override
public void render( ProtocolMessageWriter writer ) {
writer.appendDestroy( getId() );
}
} );
}
public void render( ProtocolMessageWriter writer ) {
if( isDestroyed() && !created ) {
// skip rendering for objects that are disposed just after creation (see bug 395272)
} else {
for( RenderRunnable runnable : renderQueue ) {
runnable.render( writer );
}
created = true;
}
renderQueue.clear();
}
private static interface RenderRunnable extends Serializable {
void render( ProtocolMessageWriter writer );
}
}