| /* |
| * Copyright 2009 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.dev.ui; |
| |
| import com.google.gwt.core.ext.TreeLogger; |
| import com.google.gwt.core.ext.TreeLogger.Type; |
| import com.google.gwt.dev.ModuleHandle; |
| import com.google.gwt.dev.util.log.PrintWriterTreeLogger; |
| |
| import java.net.URL; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| /** |
| * Defines the interaction between DevelopmentMode and the UI, so that |
| * alternate UIs can be implemented. |
| * <p> |
| * Sequence of calls: |
| * <ul> |
| * <li>{@link #initialize(Type)} |
| * <li>{@link #getTopLogger()} |
| * <li>possibly {@link #getWebServerLogger(String, byte[])} |
| * <li>{@link #setStartupUrls(Map)} |
| * <li>{@link #moduleLoadComplete(boolean)} or |
| * <li>zero or more {@link #getModuleLogger} |
| * </ul> |
| * {@link #setCallback(com.google.gwt.dev.ui.UiEvent.Type, UiCallback)} may be |
| * interspersed among these calls after {@link #initialize(Type)} is called. |
| */ |
| public abstract class DevModeUI { |
| |
| /** |
| * Map of callbacks. |
| */ |
| private final Map<UiEvent.Type<? extends UiCallback>, UiCallback> callbacks |
| = new HashMap<UiEvent.Type<? extends UiCallback>, UiCallback>(); |
| |
| /** |
| * A lazily-initialized console logger - see {@link #getConsoleLogger()}. |
| */ |
| private PrintWriterTreeLogger consoleLogger = null; |
| |
| /** |
| * Log level for all logging in this UI. |
| */ |
| private Type logLevel; |
| |
| /** |
| * Show that a module is loaded in the UI. |
| * |
| * <p>Note that the {@link CloseModuleEvent} should already have a callback |
| * registered when this is called if needed -- the UI is not required to |
| * change the UI if it is registered later. |
| * |
| * @param userAgent full user agent name |
| * @param remoteSocket name of remote socket endpoint in host:port format |
| * @param url URL of top-level window |
| * @param tabKey stable browser tab identifier, or the empty string if no |
| * such identifier is available |
| * @param moduleName the name of the module loaded |
| * @param sessionKey a unique session key |
| * @param agentTag short-form user agent identifier, suitable for use in |
| * a label for this connection |
| * @param agentIcon icon to use for the user agent (fits inside 24x24) or |
| * null if unavailable |
| * @param logLevel logging detail requested |
| * @return a handle to the module |
| */ |
| public abstract ModuleHandle getModuleLogger(String userAgent, |
| String remoteSocket, String url, String tabKey, String moduleName, |
| String sessionKey, String agentTag, byte[] agentIcon, Type logLevel); |
| |
| /** |
| * Create a top-level logger for messages which are not associated with the |
| * web server or any module. Defaults to logging to stdout. |
| * |
| * @return TreeLogger instance to use |
| */ |
| public TreeLogger getTopLogger() { |
| return getConsoleLogger(); |
| } |
| |
| /** |
| * Create the web server portion of the UI if not already created, and |
| * return its TreeLogger instance. |
| * |
| * <p>Note that the {@link RestartServerEvent} should already have a callback |
| * registered when this is called -- the UI is not required to change the |
| * UI if it is registered later. |
| * |
| * @param serverName short name of the web server or null if only the icon |
| * should be used |
| * @param serverIcon byte array containing an icon (fitting into 24x24) to |
| * use for the server, or null if only the name should be used |
| * @return TreeLogger instance |
| */ |
| public abstract TreeLogger getWebServerLogger(String serverName, |
| byte[] serverIcon); |
| |
| /** |
| * Initialize the UI - must be called exactly once and before any other method |
| * on this class. |
| * |
| * <p>Subclasses should call super.initialize(logLevel). |
| * |
| * @param logLevel log level for all logging |
| */ |
| public void initialize(Type logLevel) { |
| this.logLevel = logLevel; |
| } |
| |
| /** |
| * Indicates that all modules have been loaded (loading the XML, not |
| * completing onModuleLoad), and that URLs previously specified in |
| * {@link #setStartupUrls(Map)} may be launched if successful. |
| * |
| * @param success true if all modules were successfully loaded |
| */ |
| public void moduleLoadComplete(boolean success) { |
| // do nothing by default |
| } |
| |
| /** |
| * Sets the callback for a given event type.. |
| * |
| * @param <C> callback type |
| * @param type UI event type token |
| * @param callback event callback, or null to clear the callback |
| */ |
| public final <C extends UiCallback> void setCallback(UiEvent.Type<C> type, |
| C callback) { |
| assert type != null; |
| callbacks.put(type, callback); |
| } |
| |
| /** |
| * Set the URLs that should be available to start. |
| * |
| * @param urls map of URLs -- the key is the name supplied with -startupUrls, |
| * and the value is the mapped URL with all parameters included |
| */ |
| public void setStartupUrls(Map<String, URL> urls) { |
| // do nothing by default |
| } |
| |
| /** |
| * Show in the UI that the web server, identified by the logger returned from |
| * {@link #getWebServerLogger(String, byte[])}, is operating in a secure |
| * fashion. |
| * |
| * @param serverLogger |
| */ |
| public void setWebServerSecure(TreeLogger serverLogger) { |
| // do nothing by default |
| } |
| |
| /** |
| * Call callback for a given event. |
| * |
| * @param eventType type of event |
| * @return the UiCallback for this event or null if none |
| */ |
| @SuppressWarnings("unchecked") |
| protected final <C extends UiCallback> C getCallback( |
| UiEvent.Type<?> eventType) { |
| return (C) callbacks.get(eventType); |
| } |
| |
| /** |
| * @return a console-based logger. |
| */ |
| protected final TreeLogger getConsoleLogger() { |
| if (consoleLogger == null) { |
| consoleLogger = new PrintWriterTreeLogger(); |
| consoleLogger.setMaxDetail(getLogLevel()); |
| } |
| return consoleLogger; |
| } |
| |
| /** |
| * @return the log level for all logging. |
| */ |
| protected final Type getLogLevel() { |
| return logLevel; |
| } |
| |
| /** |
| * Returns true if a callback has been registered for an event. |
| * |
| * @param eventType type of event |
| * @return true if a callback has been registered for event |
| */ |
| protected final boolean hasCallback( |
| UiEvent.Type<? extends UiCallback> eventType) { |
| return callbacks.get(eventType) != null; |
| } |
| } |