blob: d9b3f7920ed411952ce445ee694872746910a455 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 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.protocol;
import static org.eclipse.rap.rwt.internal.protocol.ClientMessageConst.REQUEST_COUNTER;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.rap.json.JsonValue;
import org.eclipse.rap.rwt.internal.protocol.Operation.CallOperation;
import org.eclipse.rap.rwt.internal.protocol.Operation.NotifyOperation;
import org.eclipse.rap.rwt.internal.protocol.Operation.SetOperation;
import org.eclipse.rap.rwt.internal.service.ContextProvider;
import org.eclipse.rap.rwt.internal.service.ServiceStore;
import org.eclipse.rap.rwt.internal.util.SharedInstanceBuffer;
import org.eclipse.rap.rwt.internal.util.SharedInstanceBuffer.InstanceCreator;
import org.eclipse.rap.rwt.remote.OperationHandler;
public final class ProtocolUtil {
private static final Pattern FONT_NAME_FILTER_PATTERN = Pattern.compile( "\"|\\\\" );
private static final String CLIENT_MESSAGE = ProtocolUtil.class.getName() + "#clientMessage";
//////////////////////////////////////////////////////////////////////////////
// TODO [fappel]: Experimental - profiler seems to indicate that buffering
// improves performance - still under investigation.
private final static SharedInstanceBuffer<String,String[]> parsedFonts
= new SharedInstanceBuffer<>();
private final static InstanceCreator<String, String[]> parsedFontsCreator
= new InstanceCreator<String, String[]>() {
@Override
public String[] createInstance( String name ) {
return parseFontNameInternal( name );
}
};
//////////////////////////////////////////////////////////////////////////////
private ProtocolUtil() {
// prevent instantiation
}
public static ClientMessage getClientMessage() {
ServiceStore serviceStore = ContextProvider.getServiceStore();
return ( ClientMessage )serviceStore.getAttribute( CLIENT_MESSAGE );
}
public static void setClientMessage( ClientMessage clientMessage ) {
ServiceStore serviceStore = ContextProvider.getServiceStore();
serviceStore.setAttribute( CLIENT_MESSAGE, clientMessage );
}
public static void handleOperation( OperationHandler handler, Operation operation ) {
if( operation instanceof SetOperation ) {
SetOperation setOperation = ( SetOperation )operation;
handler.handleSet( setOperation.getProperties() );
} else if( operation instanceof CallOperation ) {
CallOperation callOperation = ( CallOperation )operation;
handler.handleCall( callOperation.getMethodName(), callOperation.getParameters() );
} else if( operation instanceof NotifyOperation ) {
NotifyOperation notifyOperation = ( NotifyOperation )operation;
handler.handleNotify( notifyOperation.getEventName(), notifyOperation.getProperties() );
}
}
public static JsonValue readPropertyValue( String target, String property ) {
SetOperation operation = getClientMessage().getLastSetOperationFor( target, property );
return operation != null ? operation.getProperties().get( property ) : null;
}
public static JsonValue readEventPropertyValue( String target, String eventName, String property ) {
NotifyOperation operation = getClientMessage().getLastNotifyOperationFor( target, eventName );
return operation != null ? operation.getProperties().get( property ) : null;
}
public static boolean wasEventSent( String target, String eventName ) {
ClientMessage message = getClientMessage();
NotifyOperation operation = message.getLastNotifyOperationFor( target, eventName );
return operation != null;
}
public static String[] parseFontName( final String name ) {
return parsedFonts.get( name, parsedFontsCreator );
}
public static boolean isInitialRequest( RequestMessage message ) {
return JsonValue.valueOf( 0 ).equals( message.getHead().get( REQUEST_COUNTER ) );
}
private static String[] parseFontNameInternal( String name ) {
String[] result = name.split( "," );
for( int i = 0; i < result.length; i++ ) {
result[ i ] = result[ i ].trim();
Matcher matcher = FONT_NAME_FILTER_PATTERN.matcher( result[ i ] );
result[ i ] = matcher.replaceAll( "" );
}
return result;
}
}