Package com.eclipsesource.tabris.internal

Source Code of com.eclipsesource.tabris.internal.TabrisClientProvider

/*******************************************************************************
* Copyright (c) 2012 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 com.eclipsesource.tabris.internal;

import static com.eclipsesource.tabris.device.ClientDevice.Platform.ANDROID;
import static com.eclipsesource.tabris.device.ClientDevice.Platform.IOS;
import static com.eclipsesource.tabris.internal.Clauses.when;
import static com.eclipsesource.tabris.internal.Constants.HEADER_SERVER_ID;
import static com.eclipsesource.tabris.internal.Constants.PROPERTY_VERSION_CHECK;
import static com.eclipsesource.tabris.internal.Constants.THEME_ID_ANDROID;
import static com.eclipsesource.tabris.internal.Constants.THEME_ID_IOS;
import static com.eclipsesource.tabris.internal.Constants.THEME_ID_IOS6;
import static com.eclipsesource.tabris.internal.Constants.USER_AGENT;
import static javax.servlet.http.HttpServletResponse.SC_PRECONDITION_FAILED;

import java.io.IOException;
import java.io.Serializable;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.rap.json.JsonValue;
import org.eclipse.rap.rwt.RWT;
import org.eclipse.rap.rwt.client.Client;
import org.eclipse.rap.rwt.internal.client.ClientProvider;
import org.eclipse.rap.rwt.internal.protocol.ProtocolMessageWriter;
import org.eclipse.rap.rwt.internal.theme.ThemeUtil;

import com.eclipsesource.tabris.device.ClientDevice.Platform;

@SuppressWarnings("restriction")
public class TabrisClientProvider implements ClientProvider, Serializable {

  private final String serverId;

  public TabrisClientProvider() {
    this( null );
  }

  public TabrisClientProvider( String serverId ) {
    verifyServerId( serverId );
    this.serverId = serverId;
  }

  private void verifyServerId( String serverId ) {
    if( serverId != null ) {
      when( serverId.isEmpty() ).throwIllegalArgument( "ServerId must not be empty" );
    }
  }

  @Override
  public boolean accept( HttpServletRequest request ) {
    Platform platform = DeviceUtil.getPlatform();
    boolean result = platform == ANDROID || platform == IOS;
    if( result ) {
      setPlatformTheme( platform );
      setServerId();
      validateVersion();
    }
    return result;
  }

  private void setPlatformTheme( Platform platform ) {
    if( platform == IOS ) {
      setThemeForIOS();
    } else if( platform == ANDROID ) {
      ThemeUtil.setCurrentThemeId( RWT.getUISession(), THEME_ID_ANDROID );
    }
  }

  private void setThemeForIOS() {
    String userAgent = RWT.getRequest().getHeader( USER_AGENT );
    if( userAgent.contains( "OS 6.1" ) ) {
      ThemeUtil.setCurrentThemeId( RWT.getUISession(), THEME_ID_IOS6 );
    } else {
      ThemeUtil.setCurrentThemeId( RWT.getUISession(), THEME_ID_IOS );
    }
  }

  private void setServerId() {
    HttpServletResponse response = RWT.getResponse();
    if( serverId != null ) {
      response.addHeader( HEADER_SERVER_ID, serverId );
    }
  }

  private void validateVersion() {
    if( wantsVersionCheck() ) {
      checkVersion();
    }
  }

  private void checkVersion() {
    VersionCheck versionCheck = new VersionCheck();
    if( !versionCheck.matches() ) {
      writeInvalidVersion( versionCheck.getServerVersion(), versionCheck.getClientVersion() );
    }
  }

  private boolean wantsVersionCheck() {
    String property = System.getProperty( PROPERTY_VERSION_CHECK );
    if( property != null && !Boolean.getBoolean( property ) ) {
      return false;
    }
    return true;
  }

  private void writeInvalidVersion( String serverVersion, String clientVersion ) {
    String errorMsg = "Incompatible Tabris Versions:\nClient " + clientVersion + " vs. Server " + serverVersion;
    HttpServletResponse response = RWT.getResponse();
    response.setStatus( SC_PRECONDITION_FAILED );
    ProtocolMessageWriter writer = new ProtocolMessageWriter();
    writer.appendHead( "error", JsonValue.valueOf( errorMsg ) );
    try {
      writer.createMessage().writeTo( response.getWriter() );
    } catch( IOException exception ) {
      throw new IllegalStateException( exception );
    }
  }

  @Override
  public Client getClient() {
    return new TabrisClientImpl();
  }
}
TOP

Related Classes of com.eclipsesource.tabris.internal.TabrisClientProvider

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.