/* * Copyright 2012 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.core.shared; /** * Supports core functionality that in some cases requires direct support from * the compiler and runtime systems such as runtime type information and * deferred binding. */ public final class GWT { /** * Always <code>null</code> in Production Mode; in Development Mode provides * the implementation for certain methods. */ private static GWTBridge sGWTBridge = null; /** * Instantiates a class via deferred binding. * * <p> * The argument to {@link #create(Class)} <i>must</i> be a class literal * because the Production Mode compiler must be able to statically determine * the requested type at compile-time. This can be tricky because using a * {@link Class} variable may appear to work correctly in Development Mode. * </p> * * @param classLiteral a class literal specifying the base class to be * instantiated * @return the new instance, which must be cast to the requested class */ public static <T> T create(Class<?> classLiteral) { if (sGWTBridge == null) { /* * In Production Mode, the compiler directly replaces calls to this method * with a new Object() type expression of the correct rebound type. */ throw new UnsupportedOperationException( "ERROR: GWT.create() is only usable in client code! It cannot be called, " + "for example, from server code. If you are running a unit test, " + "check that your test case extends GWTTestCase and that GWT.create() " + "is not called from within an initializer or constructor."); } else { return sGWTBridge.<T> create(classLiteral); } } /** * Returns the empty string when running in Production Mode, but returns a * unique string for each thread in Development Mode (for example, different * windows accessing the dev mode server will each have a unique id, and * hitting refresh without restarting dev mode will result in a new unique id * for a particular window. * * TODO(unnurg): Remove this function once Dev Mode rewriting classes are in * gwt-dev. */ public static String getUniqueThreadId() { if (sGWTBridge != null) { return sGWTBridge.getThreadUniqueID(); } return ""; } /** * Get a human-readable representation of the GWT version used, or null if * this is running on the client. * * @return a human-readable version number, such as {@code "2.5"} */ public static String getVersion() { return sGWTBridge == null ? null : sGWTBridge.getVersion(); } /** * Returns <code>true</code> when running inside the normal GWT environment, * either in Development Mode or Production Mode. Returns <code>false</code> * if this code is running in a plain JVM. This might happen when running * shared code on the server, or during the bootstrap sequence of a * GWTTestCase test. */ public static boolean isClient() { // Replaced with "true" by GWT compiler. return sGWTBridge != null && sGWTBridge.isClient(); } /** * Returns <code>true</code> when running in production mode. Returns * <code>false</code> when running either in development mode, or when running * in a plain JVM. */ public static boolean isProdMode() { // Replaced with "true" by GWT compiler. return false; } /** * Determines whether or not the running program is script or bytecode. */ public static boolean isScript() { // Replaced with "true" by GWT compiler. return false; } /** * Logs a message to the development shell logger in Development Mode. Calls * are optimized out in Production Mode. */ public static void log(String message) { log(message, null); } /** * Logs a message to the development shell logger in Development Mode. Calls * are optimized out in Production Mode. */ public static void log(String message, Throwable e) { if (sGWTBridge != null) { sGWTBridge.log(message, e); } } /** * Called via reflection in Development Mode; do not ever call this method in * Production Mode. May be called in server code to initialize server bridge. */ public static void setBridge(GWTBridge bridge) { sGWTBridge = bridge; } }