ordercheck passes. git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@43 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/core/src/com/google/gwt/dev/shell/BrowserDialog.java b/dev/core/src/com/google/gwt/dev/shell/BrowserDialog.java index f0f886f..d91b146 100644 --- a/dev/core/src/com/google/gwt/dev/shell/BrowserDialog.java +++ b/dev/core/src/com/google/gwt/dev/shell/BrowserDialog.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -20,6 +34,12 @@ */ public class BrowserDialog extends DialogBase { + private final String html; + + private final URL url; + + private final TreeLogger logger; + public BrowserDialog(Shell parent, TreeLogger logger, String html) { super(parent, 550, 520, true, false); this.logger = logger; @@ -32,19 +52,20 @@ browser.addTitleListener(new TitleListener() { public void changed(TitleEvent event) { - BrowserDialog.this. - setText(event.title); - }}); + BrowserDialog.this.setText(event.title); + } + }); if (html != null) { browser.setText(html); } else if (url != null) { browser.setUrl(url.toString()); } - + browser.addLocationListener(new LocationListener() { public void changed(LocationEvent event) { } + public void changing(LocationEvent event) { event.doit = false; BrowserWidget.launchExternalBrowser(logger, event.location); @@ -53,8 +74,4 @@ return browser; } - - private final String html; - private final URL url; - private final TreeLogger logger; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/BrowserWidget.java b/dev/core/src/com/google/gwt/dev/shell/BrowserWidget.java index f5d75ce..5224c1f 100644 --- a/dev/core/src/com/google/gwt/dev/shell/BrowserWidget.java +++ b/dev/core/src/com/google/gwt/dev/shell/BrowserWidget.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -50,28 +64,34 @@ public abstract class BrowserWidget extends Composite { private class Toolbar extends HeaderBarBase implements SelectionListener { + private final ToolItem backButton; + + private final ToolItem forwardButton; + + private final ToolItem openWebModeButton; + + private final ToolItem refreshButton; + private final ToolItem stopButton; + public Toolbar(Composite parent) { super(parent); backButton = newItem("back.gif", " &Back ", "Go back one state"); backButton.addSelectionListener(this); - forwardButton = newItem("forward.gif", "&Forward", - "Go forward one state"); + forwardButton = newItem("forward.gif", "&Forward", "Go forward one state"); forwardButton.addSelectionListener(this); refreshButton = newItem("refresh.gif", " &Refresh ", "Reload the page"); refreshButton.addSelectionListener(this); - stopButton = newItem("stop.gif", " &Stop ", - "Stop loading the page"); + stopButton = newItem("stop.gif", " &Stop ", "Stop loading the page"); stopButton.addSelectionListener(this); newSeparator(); - openWebModeButton = newItem("new-web-mode-window.gif", - "&Compile/Browse", - "Compiles and opens the current URL in the system browser"); + openWebModeButton = newItem("new-web-mode-window.gif", "&Compile/Browse", + "Compiles and opens the current URL in the system browser"); openWebModeButton.addSelectionListener(this); openWebModeButton.setEnabled(false); } @@ -110,7 +130,7 @@ // Already logged by callee. // MessageBox msgBox = new MessageBox(getShell(), SWT.OK - | SWT.ICON_ERROR); + | SWT.ICON_ERROR); msgBox.setText("Compilation Failed"); msgBox.setMessage("Compilation failed. Please see the log in the development shell for details."); msgBox.open(); @@ -127,15 +147,6 @@ launchExternalBrowser(logger, locationText); } } - - private final ToolItem backButton; - private final ToolItem forwardButton; - - private final ToolItem openWebModeButton; - - private final ToolItem refreshButton; - - private final ToolItem stopButton; } static void launchExternalBrowser(TreeLogger logger, String location) { @@ -150,8 +161,8 @@ return; } catch (IOException e) { logger.log(TreeLogger.ERROR, - "Error launching GWT_EXTERNAL_BROWSER executable '" + browserCmd - + "'", e); + "Error launching GWT_EXTERNAL_BROWSER executable '" + browserCmd + + "'", e); return; } } @@ -164,10 +175,9 @@ Runtime.getRuntime().exec(browserCmd); return; } catch (IOException e) { - logger.log( - TreeLogger.ERROR, - "Error launching gwt.browser.default executable '" + browserCmd + "'", - e); + logger.log(TreeLogger.ERROR, + "Error launching gwt.browser.default executable '" + browserCmd + + "'", e); return; } } @@ -179,21 +189,39 @@ return; } else { logger.log(TreeLogger.ERROR, "Error launching external HTML program '" - + browserProgram.getName() + "'", null); + + browserProgram.getName() + "'", null); return; } } // We're out of options, so fail. logger.log(TreeLogger.ERROR, - "Unable to find a default external web browser", null); + "Unable to find a default external web browser", null); logger.log( - TreeLogger.WARN, - "Try setting the environment varable GWT_EXTERNAL_BROWSER to your web browser executable before launching the GWT shell", - null); + TreeLogger.WARN, + "Try setting the environment varable GWT_EXTERNAL_BROWSER to your web browser executable before launching the GWT shell", + null); } + protected Browser browser; + + private Color bgColor = new Color(null, 239, 237, 216); + + private Button goButton; + + private final BrowserWidgetHost host; + + private Text location; + + private final TreeLogger logger; + + private Label statusBar; + + private Toolbar toolbar; + + private Map moduleSpacesByName = new HashMap(); + public BrowserWidget(Composite parent, BrowserWidgetHost host) { super(parent, SWT.NONE); @@ -306,7 +334,7 @@ space.dispose(); logger.log(TreeLogger.SPAM, "Cleaning up resources for module " - + moduleName, null); + + moduleName, null); } moduleSpacesByName.clear(); @@ -429,13 +457,13 @@ // no opinion either way if (whitelistRuleFound == null && blacklistRuleFound == null) { if (DialogBase.confirmAction( - (Shell) getParent(), - "Browsing to remote sites is a security risk! A malicious site could\r\n" - + "execute Java code though this browser window. Only click \"Yes\" if you\r\n" - + "are sure you trust the remote site. See the log for details and\r\n" - + "configuration instructions.\r\n" + "\r\n" + "\r\n" - + "Allow access to '" + url - + "' for the rest of this session?\r\n", "Security Warning")) { + (Shell) getParent(), + "Browsing to remote sites is a security risk! A malicious site could\r\n" + + "execute Java code though this browser window. Only click \"Yes\" if you\r\n" + + "are sure you trust the remote site. See the log for details and\r\n" + + "configuration instructions.\r\n" + "\r\n" + "\r\n" + + "Allow access to '" + url + + "' for the rest of this session?\r\n", "Security Warning")) { evt.doit = true; BrowserWidgetHostChecker.whitelistURL(url); } else { @@ -470,13 +498,13 @@ break; } else { String msg = "Cannot find file '" + file.getAbsolutePath() - + "'"; + + "'"; TreeLogger branch = logger.branch(TreeLogger.ERROR, msg, null); if ("gwt-hosted.html".equalsIgnoreCase(file.getName())) { branch.log( - TreeLogger.ERROR, - "If you want to open compiled output within this hosted browser, add '?gwt.hybrid' to the end of the URL", - null); + TreeLogger.ERROR, + "If you want to open compiled output within this hosted browser, add '?gwt.hybrid' to the end of the URL", + null); } } file = file.getParentFile(); @@ -494,19 +522,18 @@ TreeLogger.Type msgType = TreeLogger.ERROR; if (!evt.doit) { header = logger.branch(msgType, "Unable to visit " + typeStr - + " URL: '" + url, null); + + " URL: '" + url, null); } else { msgType = TreeLogger.WARN; - header = logger.branch( - TreeLogger.WARN, - "Confirmation was required to visit " + typeStr + " URL: '" + url, - null); + header = logger.branch(TreeLogger.WARN, + "Confirmation was required to visit " + typeStr + " URL: '" + + url, null); } if (blacklistRuleFound == null) { BrowserWidgetHostChecker.notifyUntrustedHost(url, header, msgType); } else { BrowserWidgetHostChecker.notifyBlacklistedHost(blacklistRuleFound, - url, header, msgType); + url, header, msgType); } setLocationText(browser.getUrl()); } @@ -533,14 +560,4 @@ int length = text.length(); location.setSelection(length, length); } - - protected Browser browser; - private Color bgColor = new Color(null, 239, 237, 216); - private Button goButton; - private final BrowserWidgetHost host; - private Text location; - private final TreeLogger logger; - private Label statusBar; - private Toolbar toolbar; - private Map moduleSpacesByName = new HashMap(); }
diff --git a/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHost.java b/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHost.java index 4358bea..45e9984 100644 --- a/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHost.java +++ b/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHost.java
@@ -1,22 +1,37 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; import com.google.gwt.core.ext.UnableToCompleteException; /** - * Interface that unifies access to the <code>BrowserWidget</code>, <code>ModuleSpaceHost</code>, and the compiler. + * Interface that unifies access to the <code>BrowserWidget</code>, + * <code>ModuleSpaceHost</code>, and the compiler. */ public interface BrowserWidgetHost { - TreeLogger getLogger(); - - BrowserWidget openNewBrowserWindow() throws UnableToCompleteException; - - String normalizeURL(String whatTheUserTyped); + void compile(String[] modules) throws UnableToCompleteException; // Factor this out if BrowserWidget becomes decoupled from hosted mode ModuleSpaceHost createModuleSpaceHost(BrowserWidget widget, String moduleName) throws UnableToCompleteException; - void compile(String[] modules) throws UnableToCompleteException; + TreeLogger getLogger(); + + String normalizeURL(String whatTheUserTyped); + + BrowserWidget openNewBrowserWindow() throws UnableToCompleteException; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHostChecker.java b/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHostChecker.java index 11277a0..eedd9c5 100644 --- a/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHostChecker.java +++ b/dev/core/src/com/google/gwt/dev/shell/BrowserWidgetHostChecker.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -33,6 +47,22 @@ */ private static final Set validHttpHosts = new HashSet(); + static { + alwaysValidHttpHosts.add("^https?://localhost"); + alwaysValidHttpHosts.add("^file:"); + alwaysValidHttpHosts.add("^about:"); + alwaysValidHttpHosts.add("^res:"); + alwaysValidHttpHosts.add("^javascript:"); + alwaysValidHttpHosts.add("^([a-zA-Z][:])[/\\\\]"); + // matches c:\ and c:/ + alwaysValidHttpHosts.add("^https?://localhost/"); + alwaysValidHttpHosts.add("^https?://localhost[.]localdomain/"); + alwaysValidHttpHosts.add("^https?://127[.]0[.]0[.]1/"); + alwaysValidHttpHosts.add("^https?://localhost$"); + alwaysValidHttpHosts.add("^https?://localhost[.]localdomain$"); + alwaysValidHttpHosts.add("^https?://127[.]0[.]0[.]1$"); + } + /** * This method blacklists the supplied regexes, separated by comma or space. * @@ -84,29 +114,6 @@ return "^" + escapeString(raw); } - private static String escapeString(String raw) { - StringBuffer out = new StringBuffer(); - for (int i = 0; i < raw.length(); i++) { - char c = raw.charAt(i); - if (Character.isLetterOrDigit(c) || c == '-' || c == '_') { - out.append(c); - } else if (c == '\\') { - out.append("[\\\\]"); - } else if (c == ']') { - out.append("[\\]]"); - } else if (c == '^') { - out.append("[\\^]"); - } else if (c == '[') { - out.append("[\\[]"); - } else { - out.append("["); - out.append(c); - out.append("]"); - } - } - return out.toString(); - } - /** * This method formats the blacklist for display in the treeLogger. * @@ -188,9 +195,9 @@ public static void notifyBlacklistedHost(String blacklistRuleFound, String url, TreeLogger header, TreeLogger.Type msgType) { TreeLogger reason = header.branch(msgType, "reason: " + url - + " is blacklisted", null); + + " is blacklisted", null); reason.log(msgType, "To fix: remove \"" + blacklistRuleFound - + "\" from system property gwt.hosts.blacklist", null); + + "\" from system property gwt.hosts.blacklist", null); } /** @@ -207,18 +214,18 @@ String blackListStr = oldBlackList; String hostRegex = computeHostRegex(url); TreeLogger reason = header.branch(msgType, "reason: " + url - + " is not in the whitelist", null); + + " is not in the whitelist", null); reason.log(msgType, "whitelist: " + whiteListStr, null); reason.log(msgType, "blacklist: " + blackListStr, null); TreeLogger fix = header.branch(msgType, "To fix: add regex matching " - + "URL to -whitelist command line argument", null); + + "URL to -whitelist command line argument", null); fix.log(msgType, "Example: -whitelist=\"" + whiteListStr + " " + hostRegex - + "\"", null); + + "\"", null); TreeLogger reject = header.branch(msgType, - "To reject automatically: add regex matching " - + "URL to -blacklist command line argument", null); + "To reject automatically: add regex matching " + + "URL to -blacklist command line argument", null); reject.log(msgType, "Example: -blacklist=\"" + blackListStr + " " - + hostRegex + "\"", null); + + hostRegex + "\"", null); } /** @@ -271,20 +278,27 @@ return true; } - static { - alwaysValidHttpHosts.add("^https?://localhost"); - alwaysValidHttpHosts.add("^file:"); - alwaysValidHttpHosts.add("^about:"); - alwaysValidHttpHosts.add("^res:"); - alwaysValidHttpHosts.add("^javascript:"); - alwaysValidHttpHosts.add("^([a-zA-Z][:])[/\\\\]"); - // matches c:\ and c:/ - alwaysValidHttpHosts.add("^https?://localhost/"); - alwaysValidHttpHosts.add("^https?://localhost[.]localdomain/"); - alwaysValidHttpHosts.add("^https?://127[.]0[.]0[.]1/"); - alwaysValidHttpHosts.add("^https?://localhost$"); - alwaysValidHttpHosts.add("^https?://localhost[.]localdomain$"); - alwaysValidHttpHosts.add("^https?://127[.]0[.]0[.]1$"); + private static String escapeString(String raw) { + StringBuffer out = new StringBuffer(); + for (int i = 0; i < raw.length(); i++) { + char c = raw.charAt(i); + if (Character.isLetterOrDigit(c) || c == '-' || c == '_') { + out.append(c); + } else if (c == '\\') { + out.append("[\\\\]"); + } else if (c == ']') { + out.append("[\\]]"); + } else if (c == '^') { + out.append("[\\^]"); + } else if (c == '[') { + out.append("[\\[]"); + } else { + out.append("["); + out.append(c); + out.append("]"); + } + } + return out.toString(); } }
diff --git a/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java b/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java index 01dab92..f3022ef 100644 --- a/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java +++ b/dev/core/src/com/google/gwt/dev/shell/CheckForUpdates.java
@@ -75,6 +75,22 @@ private static final int VERSION_PARTS = 3; private static final String VERSION_REGEXP = "\\d+\\.\\d+\\.\\d+"; + static { + // Do this in a static initializer so we can ignore all exceptions. + // + boolean debugVersionCheck = false; + try { + if (System.getProperty("gwt.debugVersionCheck") != null) { + debugVersionCheck = true; + } + } catch (Throwable e) { + // Always silently ignore any errors. + // + } finally { + DEBUG_VERSION_CHECK = debugVersionCheck; + } + } + /** * Determines whether the server version is definitively newer than the client * version. If any errors occur in the comparison, this method returns false @@ -89,13 +105,13 @@ if (clientVersion == null || serverVersion == null) { return false; } - + // must match expected format if (!clientVersion.matches(VERSION_REGEXP) || !serverVersion.matches(VERSION_REGEXP)) { return false; } - + // extract the relevant parts String[] clientParts = clientVersion.split("\\."); String[] serverParts = serverVersion.split("\\."); @@ -112,7 +128,7 @@ if (serverPart < clientPart) { return false; } - + if (serverPart > clientPart) { return true; } @@ -477,20 +493,4 @@ return ua; } - - static { - // Do this in a static initializer so we can ignore all exceptions. - // - boolean debugVersionCheck = false; - try { - if (System.getProperty("gwt.debugVersionCheck") != null) { - debugVersionCheck = true; - } - } catch (Throwable e) { - // Always silently ignore any errors. - // - } finally { - DEBUG_VERSION_CHECK = debugVersionCheck; - } - } }
diff --git a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java index 02f92e1..454b759 100644 --- a/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java +++ b/dev/core/src/com/google/gwt/dev/shell/CompilingClassLoader.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -17,10 +31,10 @@ /** * - * TODO : we should refactor this class to move the getClassInfoByDispId, + * TODO : we should refactor this class to move the getClassInfoByDispId, * getDispId, getMethodDispatch and putMethodDispatch into a separate entity - * since they really do not interact with the CompilingClassLoader - * functionality. + * since they really do not interact with the CompilingClassLoader + * functionality. */ public final class CompilingClassLoader extends ClassLoader { @@ -31,6 +45,23 @@ private final class DispatchClassInfoOracle { /** + * Class identifier to DispatchClassInfo mapping. + */ + private final ArrayList classIdToClassInfo = new ArrayList(); + + /** + * Binary or source class name to DispatchClassInfo map. + */ + private final Map classNameToClassInfo = new HashMap(); + + /** + * Class to ClassInfo map - this is only necessary to make sure that we have + * only only {@link DispatchClassInfo} for all of the different permutations + * of binary and source name combinations. + */ + private final Map classToClassInfo = new HashMap(); + + /** * Clears out the contents of this oracle. */ public synchronized void clear() { @@ -165,11 +196,9 @@ * @return {@link DispatchClassInfo} associated with the binary or source * class name; null if there is none */ - private DispatchClassInfo getClassInfoFromClassName( - String className) { + private DispatchClassInfo getClassInfoFromClassName(String className) { - DispatchClassInfo dispClassInfo = (DispatchClassInfo) classNameToClassInfo - .get(className); + DispatchClassInfo dispClassInfo = (DispatchClassInfo) classNameToClassInfo.get(className); if (dispClassInfo != null) { // return the cached value return dispClassInfo; @@ -215,25 +244,16 @@ private int synthesizeDispId(int classId, int memberId) { return (classId << 16) | memberId; } - - /** - * Class identifier to DispatchClassInfo mapping. - */ - private final ArrayList classIdToClassInfo = new ArrayList(); - - /** - * Binary or source class name to DispatchClassInfo map. - */ - private final Map classNameToClassInfo = new HashMap(); - - /** - * Class to ClassInfo map - this is only necessary to make sure that we have - * only only {@link DispatchClassInfo} for all of the different permutations - * of binary and source name combinations. - */ - private final Map classToClassInfo = new HashMap(); } + private final ByteCodeCompiler compiler; + + private final DispatchClassInfoOracle dispClassInfoOracle = new DispatchClassInfoOracle(); + + private final TreeLogger logger; + + private final Map methodToDispatch = new HashMap(); + public CompilingClassLoader(TreeLogger logger, ByteCodeCompiler compiler) throws UnableToCompleteException { super(null); @@ -370,9 +390,4 @@ return false; } - - private final ByteCodeCompiler compiler; - private final DispatchClassInfoOracle dispClassInfoOracle = new DispatchClassInfoOracle(); - private final TreeLogger logger; - private final Map methodToDispatch = new HashMap(); }
diff --git a/dev/core/src/com/google/gwt/dev/shell/DialogBase.java b/dev/core/src/com/google/gwt/dev/shell/DialogBase.java index 363f07d..28ccb3a 100644 --- a/dev/core/src/com/google/gwt/dev/shell/DialogBase.java +++ b/dev/core/src/com/google/gwt/dev/shell/DialogBase.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.dev.GWTShell; @@ -20,18 +34,7 @@ public abstract class DialogBase extends Dialog implements DisposeListener { -/** - * Pops up a confirm/cancel dialog. - */ - public static boolean confirmAction(Shell shell, String msg, String msgTitle) { - MessageBox msgBox = new MessageBox(shell, SWT.ICON_WARNING - | SWT.YES | SWT.NO); - msgBox.setText(msgTitle); - msgBox.setMessage(msg); - return msgBox.open() == SWT.YES; - } - -private class Buttons extends GridPanel { + private class Buttons extends GridPanel { public Buttons(Composite parent) { super(parent, SWT.NONE, hasCancel ? 2 : 1, true); @@ -76,6 +79,33 @@ } } + /** + * Pops up a confirm/cancel dialog. + */ + public static boolean confirmAction(Shell shell, String msg, String msgTitle) { + MessageBox msgBox = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES + | SWT.NO); + msgBox.setText(msgTitle); + msgBox.setMessage(msg); + return msgBox.open() == SWT.YES; + } + + private Button cancelButton; + + private boolean cancelled = true; + + private boolean hasCancel; + + private boolean hasOk; + + private int minHeight; + + private int minWidth; + + private Button okButton; + + private Shell shell; + public DialogBase(Shell parent, int minWidth, int minHeight) { this(parent, minWidth, minHeight, true, true); } @@ -100,7 +130,7 @@ public boolean open(boolean autoSize) { Shell parent = getParent(); shell = new Shell(parent, SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL - | SWT.RESIZE); + | SWT.RESIZE); shell.setImages(GWTShell.getIcons()); shell.setText(getText()); shell.setLayout(new FillLayout()); @@ -180,13 +210,4 @@ protected void setOkEnabled(boolean enabled) { okButton.setEnabled(enabled); } - - private Button cancelButton; - private boolean cancelled = true; - private boolean hasCancel; - private boolean hasOk; - private int minHeight; - private int minWidth; - private Button okButton; - private Shell shell; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java b/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java index ff91481..c9e5b88 100644 --- a/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java +++ b/dev/core/src/com/google/gwt/dev/shell/DispatchClassInfo.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import java.lang.reflect.Field; @@ -13,6 +27,14 @@ */ public class DispatchClassInfo { + private Class cls; + + private final int clsId; + + private ArrayList memberById; + + private HashMap memberIdByName; + public DispatchClassInfo(Class cls, int classId) { this.cls = cls; clsId = classId; @@ -93,7 +115,7 @@ return "D"; } else if (type.equals(byte.class)) { return "B"; - } else { + } else { throw new RuntimeException("Unexpected primitive type: " + type.getName()); } @@ -116,19 +138,19 @@ e.printStackTrace(); } catch (NoSuchMethodException e) { /* - * Interfaces do not automatically inherit toString() implicitly. If they - * have not defined a toString() method then we will pick the one from - * java.lang.Object::toString() method and use that at slot zero. + * Interfaces do not automatically inherit toString() implicitly. If + * they have not defined a toString() method then we will pick the one + * from java.lang.Object::toString() method and use that at slot zero. * * TODO(mmendez): How should we handle the case where a user writes JSNI - * code to interact with an instance that is typed as a particular - * interface? Should a user write JSNI code as follows: - * - * x.@com.google.gwt.HasFocus::equals(Ljava/lang/Object;)(y) - * + * code to interact with an instance that is typed as a particular + * interface? Should a user write JSNI code as follows: + * + * x.@com.google.gwt.HasFocus::equals(Ljava/lang/Object;)(y) + * * or * - * x.@java.lang.Object::equals(Ljava/lang/Object;)(y) + * x.@java.lang.Object::equals(Ljava/lang/Object;)(y) */ if (cls.isInterface()) { try { @@ -137,10 +159,10 @@ e1.printStackTrace(); } } else { - e.printStackTrace(); + e.printStackTrace(); } } - + memberIdByName = new HashMap(); lazyInitTargetMembersUsingReflectionHelper(cls); } @@ -152,7 +174,7 @@ if (superclass != null) { lazyInitTargetMembersUsingReflectionHelper(superclass); } - + // Get the methods on this class/interface. // Method[] methods = targetClass.getDeclaredMethods(); @@ -169,12 +191,4 @@ addMember(fields[i], fields[i].getName()); } } - - private Class cls; - - private final int clsId; - - private ArrayList memberById; - - private HashMap memberIdByName; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java index d6a6b31..1dc3f54 100644 --- a/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java +++ b/dev/core/src/com/google/gwt/dev/shell/GWTShellServlet.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -34,14 +48,11 @@ */ public class GWTShellServlet extends HttpServlet { - /** - * When the GWT bootstrap JavaScript starts in hosted mode, it appends this - * query param to the url for the nocache file so that this servlet can - * generate one on-the-fly. - */ - private static final String HOSTED_MODE_QUERY_PARAM = "h"; - private static class RequestParts { + public final String moduleName; + + public final String partialPath; + public RequestParts(HttpServletRequest request) throws UnableToCompleteException { String pathInfo = request.getPathInfo(); @@ -59,11 +70,31 @@ } throw new UnableToCompleteException(); } - - public final String moduleName; - public final String partialPath; } + /** + * When the GWT bootstrap JavaScript starts in hosted mode, it appends this + * query param to the url for the nocache file so that this servlet can + * generate one on-the-fly. + */ + private static final String HOSTED_MODE_QUERY_PARAM = "h"; + + private final Map loadedModulesByName = new HashMap(); + + private final Map loadedServletsByClassName = new HashMap(); + + private final Map modulesByServletPath = new HashMap(); + + private final Map mimeTypes = new HashMap(); + + private int nextRequestId; + + private File outDir; + + private final Object requestIdLock = new Object(); + + private TreeLogger topLogger; + public GWTShellServlet() { initMimeTypes(); } @@ -100,7 +131,7 @@ parts = new RequestParts(request); } catch (UnableToCompleteException e) { sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND, - "Don't know what to do with this URL: '" + pathInfo + "'"); + "Don't know what to do with this URL: '" + pathInfo + "'"); return; } @@ -135,7 +166,7 @@ // Branch the logger in case we decide to log more below. logger = logger.branch(TreeLogger.TRACE, "Request " + id + ": " + url, - null); + null); } String servletClassName = null; @@ -179,19 +210,19 @@ if (servletClassName != null) { TreeLogger branch = logger.branch(TreeLogger.WARN, - "Use of deprecated hosted mode servlet path mapping", null); + "Use of deprecated hosted mode servlet path mapping", null); branch.log( - TreeLogger.WARN, - "The client code is invoking the servlet with a URL that is not module-relative: " - + path, null); + TreeLogger.WARN, + "The client code is invoking the servlet with a URL that is not module-relative: " + + path, null); branch.log( - TreeLogger.WARN, - "Prepend GWT.getModuleBaseURL() to the URL in client code to create a module-relative URL: /" - + moduleDef.getName() + path, null); + TreeLogger.WARN, + "Prepend GWT.getModuleBaseURL() to the URL in client code to create a module-relative URL: /" + + moduleDef.getName() + path, null); branch.log( - TreeLogger.WARN, - "Using module-relative URLs ensures correct URL-independent behavior in external servlet containers", - null); + TreeLogger.WARN, + "Using module-relative URLs ensures correct URL-independent behavior in external servlet containers", + null); } // Fall-through below, where we check servletClassName. @@ -207,8 +238,9 @@ if (delegatee == null) { logger.log(TreeLogger.ERROR, "Unable to dispatch request", null); sendErrorResponse(response, - HttpServletResponse.SC_INTERNAL_SERVER_ERROR, - "Unable to find/load mapped servlet class '" + servletClassName + "'"); + HttpServletResponse.SC_INTERNAL_SERVER_ERROR, + "Unable to find/load mapped servlet class '" + servletClassName + + "'"); return; } @@ -233,14 +265,14 @@ if ("favicon.ico".equalsIgnoreCase(parts.moduleName)) { sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND, - "Icon not available"); + "Icon not available"); return; } // Generate a generic empty host page. // String msg = "The development shell servlet received a request to generate a host page for module '" - + parts.moduleName + "' "; + + parts.moduleName + "' "; logger = logger.branch(TreeLogger.TRACE, msg, null); @@ -249,8 +281,8 @@ getModuleDef(logger, parts.moduleName); } catch (UnableToCompleteException e) { sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND, - "Unable to find/load module '" + parts.moduleName - + "' (see server log for details)"); + "Unable to find/load module '" + parts.moduleName + + "' (see server log for details)"); return; } @@ -290,7 +322,7 @@ // Create a logger branch for this request. String msg = "The development shell servlet received a request for '" - + partialPath + "' in module '" + moduleName + "' "; + + partialPath + "' in module '" + moduleName + "' "; logger = logger.branch(TreeLogger.TRACE, msg, null); // If the request is of the form ".../moduleName.nocache.html[?...]", then @@ -339,8 +371,8 @@ } } catch (UnableToCompleteException e) { sendErrorResponse(response, HttpServletResponse.SC_NOT_FOUND, - "Cannot find resource '" + partialPath - + "' in the public path of module '" + moduleName + "'"); + "Cannot find resource '" + partialPath + + "' in the public path of module '" + moduleName + "'"); return; } @@ -378,12 +410,12 @@ response.setStatus(HttpServletResponse.SC_OK); long now = new Date().getTime(); response.setHeader(HttpHeaders.DATE, - HttpHeaders.toInternetDateFormat(now)); + HttpHeaders.toInternetDateFormat(now)); response.setContentType(mimeType); String lastModifiedStr = HttpHeaders.toInternetDateFormat(lastModified); response.setHeader(HttpHeaders.LAST_MODIFIED, lastModifiedStr); - final long JAN_2_1980 = 315637200000L; - String inThePastStr = HttpHeaders.toInternetDateFormat(JAN_2_1980); + final long jan2nd1980 = 315637200000L; + String inThePastStr = HttpHeaders.toInternetDateFormat(jan2nd1980); response.setHeader(HttpHeaders.EXPIRES, inThePastStr); // Send the bytes. To keep it simple, we don't compute the length. @@ -453,11 +485,11 @@ String[] servletPaths = moduleDef.getServletPaths(); for (int i = 0; i < servletPaths.length; i++) { ModuleDef oldDef = (ModuleDef) modulesByServletPath.put( - servletPaths[i], moduleDef); + servletPaths[i], moduleDef); if (oldDef != null) { logger.log(TreeLogger.WARN, "Undefined behavior: Servlet path " - + servletPaths[i] + " conflicts in modules " - + moduleDef.getName() + " and " + oldDef.getName(), null); + + servletPaths[i] + " conflicts in modules " + + moduleDef.getName() + " and " + oldDef.getName(), null); } } // END BACKWARD COMPATIBILITY @@ -713,9 +745,9 @@ Class servletClass = Class.forName(className); Object newInstance = servletClass.newInstance(); if (!(newInstance instanceof HttpServlet)) { - logger.log(TreeLogger.ERROR, "Not compatible with HttpServlet: " - + className + " (does your service extend RemoteServiceServlet?)", - null); + logger.log(TreeLogger.ERROR, + "Not compatible with HttpServlet: " + className + + " (does your service extend RemoteServiceServlet?)", null); return null; } @@ -741,13 +773,4 @@ return null; } } - - private final Map loadedModulesByName = new HashMap(); - private final Map loadedServletsByClassName = new HashMap(); - private final Map modulesByServletPath = new HashMap(); - private final Map mimeTypes = new HashMap(); - private int nextRequestId; - private File outDir; - private final Object requestIdLock = new Object(); - private TreeLogger topLogger; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/GridPanel.java b/dev/core/src/com/google/gwt/dev/shell/GridPanel.java index 7892149..fb06ab7 100644 --- a/dev/core/src/com/google/gwt/dev/shell/GridPanel.java +++ b/dev/core/src/com/google/gwt/dev/shell/GridPanel.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import org.eclipse.swt.SWT; @@ -9,60 +23,71 @@ public class GridPanel extends Composite { - public GridPanel(Composite parent, int style, int numCols, boolean equalWidthCols, int marginWidth, int marginHeight) { - super(parent, style); - GridLayout gridLayout = new GridLayout(); - gridLayout.numColumns = numCols; - gridLayout.makeColumnsEqualWidth = equalWidthCols; - gridLayout.marginWidth = marginWidth; - gridLayout.marginHeight = marginHeight; - gridLayout.horizontalSpacing = 1; - gridLayout.verticalSpacing = 1; - setLayout(gridLayout); + protected static final int FILL = GridData.FILL; + + protected static final int CENTER = GridData.CENTER; + + protected static final int MIDDLE = GridData.CENTER; + + protected static final int LEFT = GridData.BEGINNING; + + protected static final int RIGHT = GridData.END; + + protected static final int TOP = GridData.BEGINNING; + protected static final int BOTTOM = GridData.END; + + public GridPanel(Composite parent, int style, int numCols, + boolean equalWidthCols) { + this(parent, style, numCols, equalWidthCols, 5, 5); + } + + public GridPanel(Composite parent, int style, int numCols, + boolean equalWidthCols, int marginWidth, int marginHeight) { + super(parent, style); + GridLayout gridLayout = new GridLayout(); + gridLayout.numColumns = numCols; + gridLayout.makeColumnsEqualWidth = equalWidthCols; + gridLayout.marginWidth = marginWidth; + gridLayout.marginHeight = marginHeight; + gridLayout.horizontalSpacing = 1; + gridLayout.verticalSpacing = 1; + setLayout(gridLayout); + } + + protected GridData getGridData(Control control) { + GridData gridData = (GridData) control.getLayoutData(); + if (gridData == null) { + gridData = new GridData(); + control.setLayoutData(gridData); + } + return gridData; + } + + protected GridData setGridData(Control control, int rowSpan, int colSpan, + int hAlign, int vAlign, boolean hGrab, boolean vGrab) { + return setGridData(control, rowSpan, colSpan, hAlign, vAlign, hGrab, vGrab, + SWT.DEFAULT, SWT.DEFAULT); + } + + protected GridData setGridData(Control control, int rowSpan, int colSpan, + int hAlign, int vAlign, boolean hGrab, boolean vGrab, int widthHint, + int heightHint) { + GridData gridData = getGridData(control); + gridData.horizontalSpan = colSpan; + gridData.verticalSpan = rowSpan; + gridData.horizontalAlignment = hAlign; + gridData.verticalAlignment = vAlign; + gridData.grabExcessHorizontalSpace = hGrab; + gridData.grabExcessVerticalSpace = vGrab; + if (heightHint != SWT.DEFAULT) { + gridData.heightHint = heightHint; } - public GridPanel(Composite parent, int style, int numCols, boolean equalWidthCols) { - this(parent, style, numCols, equalWidthCols, 5, 5); + if (widthHint != SWT.DEFAULT) { + gridData.widthHint = widthHint; } - protected GridData getGridData(Control control) { - GridData gridData = (GridData)control.getLayoutData(); - if (gridData == null) { - gridData = new GridData(); - control.setLayoutData(gridData); - } - return gridData; - } - - protected GridData setGridData(Control control, int rowSpan, int colSpan, int hAlign, int vAlign, boolean hGrab, boolean vGrab) { - return setGridData(control, rowSpan, colSpan, hAlign, vAlign, hGrab, vGrab, SWT.DEFAULT, SWT.DEFAULT); - } - - protected GridData setGridData(Control control, int rowSpan, int colSpan, int hAlign, int vAlign, boolean hGrab, boolean vGrab, int widthHint, int heightHint) { - GridData gridData = getGridData(control); - gridData.horizontalSpan = colSpan; - gridData.verticalSpan = rowSpan; - gridData.horizontalAlignment = hAlign; - gridData.verticalAlignment = vAlign; - gridData.grabExcessHorizontalSpace = hGrab; - gridData.grabExcessVerticalSpace = vGrab; - if (heightHint != SWT.DEFAULT) { - gridData.heightHint = heightHint; - } - - if (widthHint != SWT.DEFAULT) { - gridData.widthHint = widthHint; - } - - control.setLayoutData(gridData); - return gridData; - } - - protected static final int FILL = GridData.FILL; - protected static final int CENTER = GridData.CENTER; - protected static final int MIDDLE = GridData.CENTER; - protected static final int LEFT = GridData.BEGINNING; - protected static final int RIGHT = GridData.END; - protected static final int TOP = GridData.BEGINNING; - protected static final int BOTTOM = GridData.END; + control.setLayoutData(gridData); + return gridData; + } }
diff --git a/dev/core/src/com/google/gwt/dev/shell/Handle.java b/dev/core/src/com/google/gwt/dev/shell/Handle.java index 1bf5983..cb4ad56 100644 --- a/dev/core/src/com/google/gwt/dev/shell/Handle.java +++ b/dev/core/src/com/google/gwt/dev/shell/Handle.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import java.lang.reflect.Constructor; @@ -24,24 +38,14 @@ private static Object toBeReleasedLock = new Object(); private static Handle sImpl; - - protected Handle() { - if (sImpl != null) { - throw new RuntimeException("More than one Handle class!"); - } - sImpl = this; - } - protected abstract void lockPtr(int ptr); - protected abstract void unlockPtr(int ptr); - public static Object createHandle(Class type, int ptr) { try { checkThread(); - Constructor ctor = type.getDeclaredConstructor(new Class[]{Integer.TYPE}); + Constructor ctor = type.getDeclaredConstructor(new Class[] {Integer.TYPE}); ctor.setAccessible(true); - Object handle = ctor.newInstance(new Object[]{new Integer(ptr)}); + Object handle = ctor.newInstance(new Object[] {new Integer(ptr)}); sImpl.lockPtr(ptr); return handle; } catch (InstantiationException e) { @@ -59,6 +63,18 @@ } } + /** + * Moves this ptr into a queue of COM objects that are ready to be released. + */ + public static void enqueuePtr(int opaque) { + // Add to the queue to be released by the main thread later. + // + Integer intOpaque = new Integer(opaque); + synchronized (toBeReleasedLock) { + toBeReleased.add(intOpaque); + } + } + public static int getPtrFromHandle(Object handle) { try { checkThread(); @@ -67,7 +83,7 @@ while (handleClass != null && !handleClass.getName().equals(HANDLE_CLASS)) { handleClass = handleClass.getSuperclass(); } - + if (handleClass == null) { throw new RuntimeException("Error reading handle"); } @@ -104,18 +120,6 @@ } /** - * Moves this ptr into a queue of COM objects that are ready to be released. - */ - public static void enqueuePtr(int opaque) { - // Add to the queue to be released by the main thread later. - // - Integer intOpaque = new Integer(opaque); - synchronized (toBeReleasedLock) { - toBeReleased.add(intOpaque); - } - } - - /** * Ensures that the current thread is actually the UI thread. */ private static synchronized void checkThread() { @@ -125,4 +129,15 @@ throw new RuntimeException("This object has permanent thread affinity."); } } + + protected Handle() { + if (sImpl != null) { + throw new RuntimeException("More than one Handle class!"); + } + sImpl = this; + } + + protected abstract void lockPtr(int ptr); + + protected abstract void unlockPtr(int ptr); }
diff --git a/dev/core/src/com/google/gwt/dev/shell/HeaderBarBase.java b/dev/core/src/com/google/gwt/dev/shell/HeaderBarBase.java index 76cdfa4..4eb1678 100644 --- a/dev/core/src/com/google/gwt/dev/shell/HeaderBarBase.java +++ b/dev/core/src/com/google/gwt/dev/shell/HeaderBarBase.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import org.eclipse.swt.SWT; @@ -15,13 +29,14 @@ import org.eclipse.swt.widgets.ToolItem; /** - * Base class for <code>Composites</code> that contain <code>ToolItem</code> entities. + * Base class for <code>Composites</code> that contain <code>ToolItem</code> + * entities. */ public class HeaderBarBase extends Composite implements DisposeListener { - + private final Color bgColor; private final ToolBar toolBar; - + public HeaderBarBase(Composite parent) { super(parent, SWT.NONE); @@ -64,14 +79,10 @@ logoLabel.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END)); } - public void widgetDisposed(DisposeEvent e) { - bgColor.dispose(); - } - public ToolBar getToolBar() { return toolBar; } - + public ToolItem newItem(String imageName, String label, String tooltip) { ToolItem item = new ToolItem(toolBar, SWT.PUSH); item.setImage(LowLevel.loadImage(imageName)); @@ -81,8 +92,12 @@ item.setWidth(60); return item; } - + public void newSeparator() { new ToolItem(toolBar, SWT.SEPARATOR); } + + public void widgetDisposed(DisposeEvent e) { + bgColor.dispose(); + } }
diff --git a/dev/core/src/com/google/gwt/dev/shell/HostedModeSourceOracle.java b/dev/core/src/com/google/gwt/dev/shell/HostedModeSourceOracle.java index f86610a..9e79588 100644 --- a/dev/core/src/com/google/gwt/dev/shell/HostedModeSourceOracle.java +++ b/dev/core/src/com/google/gwt/dev/shell/HostedModeSourceOracle.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -14,8 +28,8 @@ */ public class HostedModeSourceOracle extends StandardSourceOracle { - private final CompilationUnitProvider CU_Meta = new StaticCompilationUnitProvider( - "com.google.gwt.core.client", "GWT", null) { + private final CompilationUnitProvider cuMeta = new StaticCompilationUnitProvider( + "com.google.gwt.core.client", "GWT", null) { public char[] getSource() { StringBuffer sb = new StringBuffer(); sb.append("package com.google.gwt.core.client;\n"); @@ -35,20 +49,20 @@ sb.append(" log(\"Uncaught exception escaped\", e);\n"); sb.append(" }\n"); sb.append(" };\n"); - + // Implement getUncaughtExceptionHandler() // - sb.append(" public static UncaughtExceptionHandler getUncaughtExceptionHandler() {\n"); - sb.append(" return sUncaughtExceptionHandler;\n"); + sb.append(" public static UncaughtExceptionHandler getUncaughtExceptionHandler() {\n"); + sb.append(" return sUncaughtExceptionHandler;\n"); sb.append(" }\n"); // Implement setUncaughtExceptionHandler() // - sb.append(" public static void setUncaughtExceptionHandler(\n"); - sb.append(" UncaughtExceptionHandler handler) {\n"); - sb.append(" sUncaughtExceptionHandler = handler;\n"); + sb.append(" public static void setUncaughtExceptionHandler(\n"); + sb.append(" UncaughtExceptionHandler handler) {\n"); + sb.append(" sUncaughtExceptionHandler = handler;\n"); sb.append(" }\n"); - + // Proxy create(). // sb.append(" public static Object create(Class classLiteral) {\n"); @@ -79,7 +93,7 @@ sb.append(moduleName); sb.append("\";\n"); sb.append(" }\n"); - + // Proxy getModuleBaseURL() to the Impl class. // sb.append(" public static String getModuleBaseURL() {\n"); @@ -92,12 +106,16 @@ sb.append(ShellGWT.class.getName()); sb.append(".log(message, e);\n"); sb.append(" }\n"); - + sb.append("}\n"); return sb.toString().toCharArray(); } }; + private final JsniInjector injector; + + private final String moduleName; + public HostedModeSourceOracle(TypeOracle typeOracle, String moduleName) { super(typeOracle); this.moduleName = moduleName; @@ -119,7 +137,7 @@ // the web mode version, so here we substitute the hosted mode version. // if (typeName.equals("com.google.gwt.core.client.GWT")) { - return CU_Meta; + return cuMeta; } // Otherwise, it's a regular translatable type, but we want to make sure @@ -129,7 +147,4 @@ return jsnified; } - - private final JsniInjector injector; - private final String moduleName; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/JavaDispatch.java b/dev/core/src/com/google/gwt/dev/shell/JavaDispatch.java index f889b08..1ef43e1 100644 --- a/dev/core/src/com/google/gwt/dev/shell/JavaDispatch.java +++ b/dev/core/src/com/google/gwt/dev/shell/JavaDispatch.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import java.lang.reflect.Field;
diff --git a/dev/core/src/com/google/gwt/dev/shell/JavaDispatchImpl.java b/dev/core/src/com/google/gwt/dev/shell/JavaDispatchImpl.java index 6fc8482..8d9ce4c 100644 --- a/dev/core/src/com/google/gwt/dev/shell/JavaDispatchImpl.java +++ b/dev/core/src/com/google/gwt/dev/shell/JavaDispatchImpl.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import java.lang.reflect.Field; @@ -10,6 +24,20 @@ */ public class JavaDispatchImpl implements JavaDispatch { + private final CompilingClassLoader classLoader; + + private final Object target; + + /** + * This constructor initializes a dispatcher for handling static members. + * + * @param ccl class loader to use for dispatching member access + */ + public JavaDispatchImpl(CompilingClassLoader ccl) { + classLoader = ccl; + target = null; + } + /** * This constructor initializes a dispatcher around a particular instance. * @@ -28,16 +56,6 @@ } /** - * This constructor initializes a dispatcher for handling static members. - * - * @param ccl class loader to use for dispatching member access - */ - public JavaDispatchImpl(CompilingClassLoader ccl) { - classLoader = ccl; - target = null; - } - - /** * @param dispId the unique number of a field * @return the field */ @@ -81,7 +99,7 @@ if (dispId < 0) { return false; } - + return getMember(dispId) instanceof Field; } @@ -93,7 +111,7 @@ if (dispId < 0) { return false; } - + return getMember(dispId) instanceof Method; } @@ -132,7 +150,4 @@ DispatchClassInfo clsInfo = classLoader.getClassInfoByDispId(dispId); return clsInfo.getMember(dispId); } - - private final CompilingClassLoader classLoader; - private final Object target; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/JavaScriptHost.java b/dev/core/src/com/google/gwt/dev/shell/JavaScriptHost.java index 9b765c0..4d67523 100644 --- a/dev/core/src/com/google/gwt/dev/shell/JavaScriptHost.java +++ b/dev/core/src/com/google/gwt/dev/shell/JavaScriptHost.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; /**
diff --git a/dev/core/src/com/google/gwt/dev/shell/JsniInjector.java b/dev/core/src/com/google/gwt/dev/shell/JsniInjector.java index a02c08e..5c0ba42 100644 --- a/dev/core/src/com/google/gwt/dev/shell/JsniInjector.java +++ b/dev/core/src/com/google/gwt/dev/shell/JsniInjector.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -38,6 +52,10 @@ static final String PKG_STRING = "java.lang"; static final String CLS_STRING = "String"; + public final JClassType javaLangString; + + public final JClassType javaScriptObject; + public CoreTypes(TreeLogger logger) throws UnableToCompleteException { javaScriptObject = getCoreType(logger, PKG_JSOBJECT, CLS_JSOBJECT); javaLangString = getCoreType(logger, PKG_STRING, CLS_STRING); @@ -53,15 +71,18 @@ throw new UnableToCompleteException(); } } - - public final JClassType javaLangString; - public final JClassType javaScriptObject; } /** * A chunk of replacement text and where to put it. */ private static class Replacement implements Comparable { + public final int end; + + public final int start; + + public final char[] text; + public Replacement(int start, int end, char[] text) { this.start = start; this.end = end; @@ -80,12 +101,14 @@ return 0; } } - - public final int end; - public final int start; - public final char[] text; } + private final TypeOracle oracle; + + private CoreTypes coreTypes; + + private final Map parsedJsByMethod = new IdentityHashMap(); + public JsniInjector(TypeOracle oracle) { this.oracle = oracle; } @@ -94,7 +117,7 @@ CompilationUnitProvider cup) throws UnableToCompleteException { logger = logger.branch(TreeLogger.SPAM, - "Checking for JavaScript native methods", null); + "Checking for JavaScript native methods", null); // Make sure the core types exist. // @@ -127,7 +150,7 @@ // No changes were made, so we return the original. // logger.log(TreeLogger.SPAM, "No JavaScript native methods were found", - null); + null); return cup; } } @@ -157,21 +180,21 @@ JParameter[] params = method.getParameters(); String paramNamesArray = getParamNamesArrayExpr(params); - final String TRY = "try "; - final String CATCH = " catch (e) {\\n" - + " __static[\\\"@" - + Jsni.JAVASCRIPTHOST_NAME - + "::exceptionCaught" - + "(ILjava/lang/String;Ljava/lang/String;)\\\"]" - + "((e && e.number) ? e.number : 0, e ? e.name : null , e ? e.message : null);\\n" - + "}\\n"; + final String jsTry = "try "; + final String jsCatch = " catch (e) {\\n" + + " __static[\\\"@" + + Jsni.JAVASCRIPTHOST_NAME + + "::exceptionCaught" + + "(ILjava/lang/String;Ljava/lang/String;)\\\"]" + + "((e && e.number) ? e.number : 0, e ? e.name : null , e ? e.message : null);\\n" + + "}\\n"; // Surround the original JS body statements with a try/catch so that // we can map JavaScript exceptions back into Java. // Note that the method body itself will print curly braces, so we don't // need them around the try/catch. // - String js = TRY + Jsni.generateEscapedJavaScript(jsniBody) + CATCH; + String js = jsTry + Jsni.generateEscapedJavaScript(jsniBody) + jsCatch; String jsniSig = Jsni.getJsniSignature(method); // figure out starting line number @@ -179,8 +202,8 @@ int line = Jsni.countNewlines(source, 0, bodyStart) + 1; sb.append(" " + Jsni.JAVASCRIPTHOST_NAME + ".createNative(\"" - + escapedFile + "\", " + line + ", " + "\"@" + jsniSig + "\", " - + paramNamesArray + ", \"" + js + "\");"); + + escapedFile + "\", " + line + ", " + "\"@" + jsniSig + "\", " + + paramNamesArray + ", \"" + js + "\");"); } sb.append("}"); return sb.toString().toCharArray(); @@ -203,7 +226,7 @@ } String methodDecl = method.getReadableDeclaration(false, true, false, - false, false); + false, false); sb.append(methodDecl + " {"); @@ -218,7 +241,7 @@ // String returnTypeName = returnType.getQualifiedSourceName(); sb.append("return (" + returnTypeName + ")" + Jsni.JAVASCRIPTHOST_NAME - + ".invokeNativeHandle"); + + ".invokeNativeHandle"); } else if (null != (primType = returnType.isPrimitive())) { // Primitives have special overloads. // @@ -293,7 +316,7 @@ if (i > 0) { sb.append(", "); } - + JParameter param = params[i]; sb.append('\"'); sb.append(param.getName()); @@ -349,7 +372,7 @@ // Parse it. // String js = new String(source, interval.start, interval.end - - interval.start); + - interval.start); int startLine = Jsni.countNewlines(source, 0, interval.start) + 1; JsBlock body = Jsni.parseAsFunctionBody(logger, js, loc, startLine); @@ -362,11 +385,11 @@ final int declEnd = method.getDeclEnd(); int expectedHeaderLines = Jsni.countNewlines(source, declStart, - interval.start); + interval.start); int expectedBodyLines = Jsni.countNewlines(source, interval.start, - interval.end); + interval.end); String newDecl = genNonNativeVersionOfJsniMethod(method, - expectedHeaderLines, expectedBodyLines); + expectedHeaderLines, expectedBodyLines); final char[] newSource = newDecl.toCharArray(); changes.add(new Replacement(declStart, declEnd, newSource)); @@ -374,7 +397,7 @@ } else { // report error String msg = "No JavaScript body found for native method '" + method - + "' in type '" + type + "'"; + + "' in type '" + type + "'"; logger.log(TreeLogger.ERROR, msg, null); throw new UnableToCompleteException(); } @@ -386,7 +409,7 @@ patched = (JMethod[]) patchedMethods.toArray(patched); TreeLogger branch = logger.branch(TreeLogger.SPAM, "Patched methods in '" - + type.getQualifiedSourceName() + "'", null); + + type.getQualifiedSourceName() + "'", null); for (int i = 0; i < patched.length; i++) { branch.log(TreeLogger.SPAM, patched[i].getReadableDeclaration(), null); @@ -407,8 +430,4 @@ changes.add(new Replacement(bodyStart, bodyStart, block)); } } - - private final TypeOracle oracle; - private CoreTypes coreTypes; - private final Map parsedJsByMethod = new IdentityHashMap(); }
diff --git a/dev/core/src/com/google/gwt/dev/shell/LowLevel.java b/dev/core/src/com/google/gwt/dev/shell/LowLevel.java index 5bc02f8..1eb08f9 100644 --- a/dev/core/src/com/google/gwt/dev/shell/LowLevel.java +++ b/dev/core/src/com/google/gwt/dev/shell/LowLevel.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.util.tools.Utility; @@ -15,17 +29,62 @@ */ public class LowLevel { - /** - * This class is not instantiable. - */ - private LowLevel() { - } - - public static final String PACKAGE_PATH = LowLevel.class.getPackage() - .getName().replace('.', '/').concat("/"); + public static final String PACKAGE_PATH = LowLevel.class.getPackage().getName().replace( + '.', '/').concat("/"); private static boolean sInitialized = false; + /** + * Clobbers a field on an object to which we do not have access. + */ + public static void clobberFieldObjectValue(Class victimClass, + Object victimObject, String fieldName, Object value) { + Throwable rethrow = null; + try { + Field victimField = victimClass.getDeclaredField(fieldName); + victimField.setAccessible(true); + victimField.set(victimObject, value); + return; + } catch (IllegalArgumentException e) { + rethrow = e; + } catch (SecurityException e) { + rethrow = e; + } catch (IllegalAccessException e) { + rethrow = e; + } catch (NoSuchFieldException e) { + rethrow = e; + } + throw new RuntimeException("Unable to clobber field '" + fieldName + + "' from class " + victimClass.getName(), rethrow); + } + + /** + * Clobbers a field on an object to which we do not have access. + */ + public static void clobberFieldObjectValue(Object victim, String fieldName, + Object value) { + if (victim != null) { + clobberFieldObjectValue(victim.getClass(), victim, fieldName, value); + } else { + throw new NullPointerException("victim must not be null"); + } + } + + /** + * Deletes a global ref on the specified object, invalidating its handle. + */ + public static void deleteGlobalRefInt(int globalRef) { + _deleteGlobalRefInt(globalRef); + } + + /** + * Gets an environment variable. This is to replace the deprecated + * {@link System#getenv(java.lang.String)}. + */ + public static String getEnv(String key) { + return _getEnv(key); + } + public static synchronized void init() { if (!sInitialized) { String libName = "gwt-ll"; @@ -72,57 +131,6 @@ } /** - * Clobbers a field on an object to which we do not have access. - */ - public static void clobberFieldObjectValue(Class victimClass, - Object victimObject, String fieldName, Object value) { - Throwable rethrow = null; - try { - Field victimField = victimClass.getDeclaredField(fieldName); - victimField.setAccessible(true); - victimField.set(victimObject, value); - return; - } catch (IllegalArgumentException e) { - rethrow = e; - } catch (SecurityException e) { - rethrow = e; - } catch (IllegalAccessException e) { - rethrow = e; - } catch (NoSuchFieldException e) { - rethrow = e; - } - throw new RuntimeException("Unable to clobber field '" + fieldName - + "' from class " + victimClass.getName(), rethrow); - } - - /** - * Clobbers a field on an object to which we do not have access. - */ - public static void clobberFieldObjectValue(Object victim, String fieldName, - Object value) { - if (victim != null) { - clobberFieldObjectValue(victim.getClass(), victim, fieldName, value); - } else { - throw new NullPointerException("victim must not be null"); - } - } - - /** - * Deletes a global ref on the specified object, invalidating its handle. - */ - public static void deleteGlobalRefInt(int globalRef) { - _deleteGlobalRefInt(globalRef); - } - - /** - * Gets an environment variable. This is to replace the deprecated - * {@link System#getenv(java.lang.String)}. - */ - public static String getEnv(String key) { - return _getEnv(key); - } - - /** * Creates a global ref on the specified object, returning its int handle. */ public static int newGlobalRefInt(Object o) { @@ -157,7 +165,7 @@ rethrow = e; } throw new RuntimeException("Unable to snatch field '" + fieldName - + "' from class " + victimClass.getName(), rethrow); + + "' from class " + victimClass.getName(), rethrow); } /** @@ -179,4 +187,10 @@ private static native Object _objFromGlobalRefInt(int globalRef); + /** + * This class is not instantiable. + */ + private LowLevel() { + } + }
diff --git a/dev/core/src/com/google/gwt/dev/shell/Messages.java b/dev/core/src/com/google/gwt/dev/shell/Messages.java index 1e2ca92..b13fc33 100644 --- a/dev/core/src/com/google/gwt/dev/shell/Messages.java +++ b/dev/core/src/com/google/gwt/dev/shell/Messages.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger;
diff --git a/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java b/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java index 8d14423..e0c2835 100644 --- a/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java +++ b/dev/core/src/com/google/gwt/dev/shell/ModuleSpace.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -15,13 +29,54 @@ */ public abstract class ModuleSpace implements ShellJavaScriptHost { - private final ModuleSpaceHost host; + protected static ThreadLocal sThrownJavaExceptionObject = new ThreadLocal(); + + protected static ThreadLocal sCaughtJavaExceptionObject = new ThreadLocal(); /** * Logger is thread local. */ private static ThreadLocal threadLocalLogger = new ThreadLocal(); + public static void setThrownJavaException(RuntimeException re) { + getLogger().log(TreeLogger.WARN, "Exception thrown into JavaScript", re); + sThrownJavaExceptionObject.set(re); + } + + protected static RuntimeException createJavaScriptException(ClassLoader cl, + String name, String desc) { + Exception caught; + try { + Class javaScriptExceptionClass = Class.forName( + "com.google.gwt.core.client.JavaScriptException", true, cl); + Class string = String.class; + Constructor ctor = javaScriptExceptionClass.getDeclaredConstructor(new Class[] { + string, string}); + return (RuntimeException) ctor.newInstance(new Object[] {name, desc}); + } catch (InstantiationException e) { + caught = e; + } catch (IllegalAccessException e) { + caught = e; + } catch (SecurityException e) { + caught = e; + } catch (ClassNotFoundException e) { + caught = e; + } catch (NoSuchMethodException e) { + caught = e; + } catch (IllegalArgumentException e) { + caught = e; + } catch (InvocationTargetException e) { + caught = e; + } + throw new RuntimeException("Error creating JavaScriptException", caught); + } + + protected static TreeLogger getLogger() { + return (TreeLogger) threadLocalLogger.get(); + } + + private final ModuleSpaceHost host; + protected ModuleSpace(final ModuleSpaceHost host) { this.host = host; TreeLogger hostLogger = host.getLogger(); @@ -32,11 +87,27 @@ // Tell the user-space JavaScript host object that we're done // clearJavaScriptHost(); - + // Clear out the class loader's cache host.getClassLoader().clear(); } + public void ditchHandle(int opaque) { + Handle.enqueuePtr(opaque); + } + + /** + * Allows client-side code to log to the tree logger. + */ + public void log(String message, Throwable e) { + TreeLogger logger = host.getLogger(); + TreeLogger.Type type = TreeLogger.INFO; + if (e != null) { + type = TreeLogger.ERROR; + } + logger.log(type, message, e); + } + /** * Runs the module's user startup code. */ @@ -63,12 +134,11 @@ entryPointTypeName = entryPoints[i]; Object module = rebindAndCreate(entryPointTypeName); Method onModuleLoad = module.getClass().getMethod("onModuleLoad", - null); + null); onModuleLoad.invoke(module, null); } } else { - logger - .log( + logger.log( TreeLogger.WARN, "The module has no entry points defined, so onModuleLoad() will never be called", null); @@ -84,9 +154,9 @@ caught = ((ExceptionInInitializerError) caught).getException(); } - final String UNABLE_TO_LOAD_MESSAGE = "Unable to load module entry point class " - + entryPointTypeName; - logger.log(TreeLogger.ERROR, UNABLE_TO_LOAD_MESSAGE, caught); + final String unableToLoadMessage = "Unable to load module entry point class " + + entryPointTypeName; + logger.log(TreeLogger.ERROR, unableToLoadMessage, caught); throw new UnableToCompleteException(); } } @@ -121,12 +191,97 @@ // initializers and other unusual places, which can obscure the problem. // String msg = "Failed to create an instance of '" + requestedClassName - + "' via deferred binding "; + + "' via deferred binding "; host.getLogger().log(TreeLogger.ERROR, msg, caught); throw new UnableToCompleteException(); } + protected String createNativeMethodInjector(String jsniSignature, + String[] paramNames, String js) { + String newScript = "window[\"" + jsniSignature + "\"] = function("; + + for (int i = 0; i < paramNames.length; ++i) { + if (i > 0) { + newScript += ", "; + } + + newScript += paramNames[i]; + } + + newScript += ") { " + js + " };\n"; + return newScript; + } + + protected CompilingClassLoader getIsolatedClassLoader() { + return host.getClassLoader(); + } + + /** + * Injects the magic needed to resolve JSNI references from module-space. + */ + protected abstract void initializeStaticDispatcher(); + + protected boolean isExceptionActive() { + return sCaughtJavaExceptionObject.get() != null; + } + + protected String rebind(String sourceName) throws UnableToCompleteException { + try { + String result = host.rebind(host.getLogger(), sourceName); + if (result != null) { + return result; + } else { + return sourceName; + } + } catch (UnableToCompleteException e) { + String msg = "Deferred binding failed for '" + sourceName + + "'; expect subsequent failures"; + host.getLogger().log(TreeLogger.ERROR, msg, e); + throw new UnableToCompleteException(); + } + } + + protected RuntimeException takeJavaException() { + RuntimeException re = (RuntimeException) sCaughtJavaExceptionObject.get(); + sCaughtJavaExceptionObject.set(null); + return re; + } + + /** + * Tricky one, this. Reaches over into this modules's JavaScriptHost class and + * sets its static 'host' field to be null. + * + * @see JavaScriptHost + */ + private void clearJavaScriptHost() { + // Find the application's JavaScriptHost interface. + // + Throwable caught; + try { + final String jsHostClassName = JavaScriptHost.class.getName(); + Class jsHostClass = Class.forName(jsHostClassName, true, + getIsolatedClassLoader()); + final Class[] paramTypes = new Class[] {ShellJavaScriptHost.class}; + Method setHostMethod = jsHostClass.getMethod("setHost", paramTypes); + setHostMethod.invoke(jsHostClass, new Object[] {null}); + return; + } catch (ClassNotFoundException e) { + caught = e; + } catch (SecurityException e) { + caught = e; + } catch (NoSuchMethodException e) { + caught = e; + } catch (IllegalArgumentException e) { + caught = e; + } catch (IllegalAccessException e) { + caught = e; + } catch (InvocationTargetException e) { + caught = e.getTargetException(); + } + throw new RuntimeException("Error unintializing JavaScriptHost", caught); + } + /** * Handles loading a class that might be nested given a source type name. */ @@ -149,65 +304,6 @@ } } - public void ditchHandle(int opaque) { - Handle.enqueuePtr(opaque); - } - - protected String createNativeMethodInjector(String jsniSignature, - String[] paramNames, String js) { - String newScript = "window[\"" + jsniSignature + "\"] = function("; - - for (int i = 0; i < paramNames.length; ++i) { - if (i > 0) { - newScript += ", "; - } - - newScript += paramNames[i]; - } - - newScript += ") { " + js + " };\n"; - return newScript; - } - - /** - * Injects the magic needed to resolve JSNI references from module-space. - */ - protected abstract void initializeStaticDispatcher(); - - /** - * Tricky one, this. Reaches over into this modules's JavaScriptHost class and - * sets its static 'host' field to be null. - * - * @see JavaScriptHost - */ - private void clearJavaScriptHost() { - // Find the application's JavaScriptHost interface. - // - Throwable caught; - try { - final String jsHostClassName = JavaScriptHost.class.getName(); - Class jsHostClass = Class.forName(jsHostClassName, true, - getIsolatedClassLoader()); - final Class[] paramTypes = new Class[]{ShellJavaScriptHost.class}; - Method setHostMethod = jsHostClass.getMethod("setHost", paramTypes); - setHostMethod.invoke(jsHostClass, new Object[]{null}); - return; - } catch (ClassNotFoundException e) { - caught = e; - } catch (SecurityException e) { - caught = e; - } catch (NoSuchMethodException e) { - caught = e; - } catch (IllegalArgumentException e) { - caught = e; - } catch (IllegalAccessException e) { - caught = e; - } catch (InvocationTargetException e) { - caught = e.getTargetException(); - } - throw new RuntimeException("Error unintializing JavaScriptHost", caught); - } - /** * Tricky one, this. Reaches over into this modules's JavaScriptHost class and * sets its static 'host' field to be this ModuleSpace instance. @@ -221,10 +317,10 @@ try { final String jsHostClassName = JavaScriptHost.class.getName(); Class jsHostClass = Class.forName(jsHostClassName, true, - getIsolatedClassLoader()); - final Class[] paramTypes = new Class[]{ShellJavaScriptHost.class}; + getIsolatedClassLoader()); + final Class[] paramTypes = new Class[] {ShellJavaScriptHost.class}; Method setHostMethod = jsHostClass.getMethod("setHost", paramTypes); - setHostMethod.invoke(jsHostClass, new Object[]{this}); + setHostMethod.invoke(jsHostClass, new Object[] {this}); return; } catch (ClassNotFoundException e) { caught = e; @@ -241,86 +337,4 @@ } throw new RuntimeException("Error intializing JavaScriptHost", caught); } - - protected static ThreadLocal sThrownJavaExceptionObject = new ThreadLocal(); - protected static ThreadLocal sCaughtJavaExceptionObject = new ThreadLocal(); - - protected boolean isExceptionActive() { - return sCaughtJavaExceptionObject.get() != null; - } - - protected RuntimeException takeJavaException() { - RuntimeException re = (RuntimeException) sCaughtJavaExceptionObject.get(); - sCaughtJavaExceptionObject.set(null); - return re; - } - - public static void setThrownJavaException(RuntimeException re) { - getLogger().log(TreeLogger.WARN, "Exception thrown into JavaScript", re); - sThrownJavaExceptionObject.set(re); - } - - protected static RuntimeException createJavaScriptException(ClassLoader cl, - String name, String desc) { - Exception caught; - try { - Class javaScriptExceptionClass = Class.forName( - "com.google.gwt.core.client.JavaScriptException", true, cl); - Class string = String.class; - Constructor ctor = javaScriptExceptionClass - .getDeclaredConstructor(new Class[]{string, string}); - return (RuntimeException) ctor.newInstance(new Object[]{name, desc}); - } catch (InstantiationException e) { - caught = e; - } catch (IllegalAccessException e) { - caught = e; - } catch (SecurityException e) { - caught = e; - } catch (ClassNotFoundException e) { - caught = e; - } catch (NoSuchMethodException e) { - caught = e; - } catch (IllegalArgumentException e) { - caught = e; - } catch (InvocationTargetException e) { - caught = e; - } - throw new RuntimeException("Error creating JavaScriptException", caught); - } - - protected CompilingClassLoader getIsolatedClassLoader() { - return host.getClassLoader(); - } - - protected static TreeLogger getLogger() { - return (TreeLogger) threadLocalLogger.get(); - } - - protected String rebind(String sourceName) throws UnableToCompleteException { - try { - String result = host.rebind(host.getLogger(), sourceName); - if (result != null) { - return result; - } else { - return sourceName; - } - } catch (UnableToCompleteException e) { - String msg = "Deferred binding failed for '" + sourceName - + "'; expect subsequent failures"; - host.getLogger().log(TreeLogger.ERROR, msg, e); - throw new UnableToCompleteException(); - } - } - - /** - * Allows client-side code to log to the tree logger. - */ - public void log(String message, Throwable e) { - TreeLogger logger = host.getLogger(); - TreeLogger.Type type = TreeLogger.INFO; - if (e != null) { - type = TreeLogger.ERROR; - } - logger.log(type, message, e); - } }
diff --git a/dev/core/src/com/google/gwt/dev/shell/ModuleSpaceHost.java b/dev/core/src/com/google/gwt/dev/shell/ModuleSpaceHost.java index 1544c29..61bbc32 100644 --- a/dev/core/src/com/google/gwt/dev/shell/ModuleSpaceHost.java +++ b/dev/core/src/com/google/gwt/dev/shell/ModuleSpaceHost.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger;
diff --git a/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java b/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java index 48cc548..1d89d94 100644 --- a/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java +++ b/dev/core/src/com/google/gwt/dev/shell/ModuleSpacePropertyOracle.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.BadPropertyValueException; @@ -13,6 +27,12 @@ public class ModuleSpacePropertyOracle implements PropertyOracle { + private final Properties props; + + private final ModuleSpace space; + + private final Map prevAnswers = new HashMap(); + public ModuleSpacePropertyOracle(Properties props, ModuleSpace space) { this.space = space; this.props = props; @@ -32,7 +52,7 @@ // Don't know this property; that's not good. // throw new IllegalArgumentException("unknown property name: " - + propertyName); + + propertyName); } String value; @@ -81,12 +101,12 @@ // Invoke the property provider function in JavaScript. // value = space.invokeNativeString(scriptFnName, null, Empty.CLASSES, - Empty.OBJECTS); + Empty.OBJECTS); } catch (RuntimeException e) { // Treat as an unknown value. // String msg = "Error while executing the JavaScript provider for property '" - + propertyName + "'"; + + propertyName + "'"; logger.log(TreeLogger.ERROR, msg, e); throw new BadPropertyValueException(propertyName, "<failed to compute>"); } @@ -103,8 +123,4 @@ private String makeScriptFnName(Property prop) { return "prop$" + prop.getName(); } - - private final Properties props; - private final ModuleSpace space; - private final Map prevAnswers = new HashMap(); }
diff --git a/dev/core/src/com/google/gwt/dev/shell/PlatformSpecific.java b/dev/core/src/com/google/gwt/dev/shell/PlatformSpecific.java index e2c0817..74f9033 100644 --- a/dev/core/src/com/google/gwt/dev/shell/PlatformSpecific.java +++ b/dev/core/src/com/google/gwt/dev/shell/PlatformSpecific.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger;
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellGWT.java b/dev/core/src/com/google/gwt/dev/shell/ShellGWT.java index 0f68191..d16ea46 100644 --- a/dev/core/src/com/google/gwt/dev/shell/ShellGWT.java +++ b/dev/core/src/com/google/gwt/dev/shell/ShellGWT.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; /**
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellJavaScriptHost.java b/dev/core/src/com/google/gwt/dev/shell/ShellJavaScriptHost.java index 224d710..ebea2e4 100644 --- a/dev/core/src/com/google/gwt/dev/shell/ShellJavaScriptHost.java +++ b/dev/core/src/com/google/gwt/dev/shell/ShellJavaScriptHost.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.UnableToCompleteException; @@ -9,8 +23,8 @@ * method called setHost() that must be called when a new application is * initialized. * - * This interface works with JavaScriptHost to keep running applications at - * arms-length via an isolated class loader (this requires that there be no + * This interface works with JavaScriptHost to keep running applications at + * arms-length via an isolated class loader (this requires that there be no * explicit dependencies between the shell and any client-side classes). */ public interface ShellJavaScriptHost { @@ -33,6 +47,11 @@ abstract void ditchHandle(int opaque); /** + * Call this when a JavaScript exception is caught. + */ + abstract void exceptionCaught(int number, String name, String description); + + /** * Invoke a native JavaScript function that returns a boolean value. */ abstract boolean invokeNativeBoolean(String name, Object jthis, @@ -105,18 +124,13 @@ Object[] args); /** + * Logs to the dev shell logger. + */ + abstract void log(String message, Throwable e); + + /** * Resolves a deferred binding request and create the requested object. */ abstract Object rebindAndCreate(String requestedTypeName) throws UnableToCompleteException; - - /** - * Call this when a JavaScript exception is caught. - */ - abstract void exceptionCaught(int number, String name, String description); - - /** - * Logs to the dev shell logger. - */ - abstract void log(String message, Throwable e); }
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java b/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java index 591f909..a2ff5c8 100644 --- a/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java +++ b/dev/core/src/com/google/gwt/dev/shell/ShellMainWindow.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -24,18 +38,25 @@ import org.eclipse.swt.widgets.ToolItem; /** - * Implements the GWTShell's main window control. + * Implements the GWTShell's main window control. */ public class ShellMainWindow extends Composite implements DisposeListener, ShellListener { private class Toolbar extends HeaderBarBase { + private ToolItem about; + + private ToolItem clearLog; + private ToolItem collapseAll; + private ToolItem expandAll; + private ToolItem newWindow; + public Toolbar(Composite parent) { super(parent); newWindow = newItem("new-window.gif", "&Hosted Browser", - "Opens a new hosted mode browser window for debugging"); + "Opens a new hosted mode browser window for debugging"); newWindow.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent event) { String startupUrl = serverWindow.normalizeURL("/"); @@ -44,7 +65,7 @@ bw.go(startupUrl); } catch (UnableToCompleteException e) { getLogger().log(TreeLogger.ERROR, - "Unable to open a new hosted browser window", e); + "Unable to open a new hosted browser window", e); } } }); @@ -52,7 +73,7 @@ newSeparator(); collapseAll = newItem("collapse.gif", "&Collapse All", - "Collapses all log entries"); + "Collapses all log entries"); collapseAll.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { logPane.collapseAll(); @@ -60,7 +81,7 @@ }); expandAll = newItem("expand.gif", "&Expand All", - "Expands all log entries"); + "Expands all log entries"); expandAll.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { logPane.expandAll(); @@ -68,7 +89,7 @@ }); clearLog = newItem("clear-log.gif", "Clear &Log", - "Removes all log entries"); + "Removes all log entries"); clearLog.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { logPane.removeAll(); @@ -84,8 +105,7 @@ if (aboutHtml != null) { String serial = verify("TwysxNpVumPBvFyBoxzLy"); StringBuffer sb = new StringBuffer(); - sb - .append("<div style='overflow:hidden;width:100%;white-space:nowrap;font-size:1px'><br/><br/><br/><br/><font style='background-color:gray;color:lightgrey'>"); + sb.append("<div style='overflow:hidden;width:100%;white-space:nowrap;font-size:1px'><br/><br/><br/><br/><font style='background-color:gray;color:lightgrey'>"); for (int i = 0; i < 100; ++i) { sb.append(serial); } @@ -94,30 +114,51 @@ int pos; while ((pos = aboutHtml.indexOf("<hr/>")) >= 0) { aboutHtml = aboutHtml.substring(0, pos) + serial - + aboutHtml.substring(pos + 5); + + aboutHtml.substring(pos + 5); } while ((pos = aboutHtml.indexOf("<body>")) >= 0) { aboutHtml = aboutHtml.substring(0, pos) - + "<body oncontextmenu='return false'>" - + aboutHtml.substring(pos + 6); + + "<body oncontextmenu='return false'>" + + aboutHtml.substring(pos + 6); } } else { aboutHtml = "Could not locate 'about.html' in installation directory."; } BrowserDialog browserDialog = new BrowserDialog(getShell(), - getLogger(), aboutHtml); + getLogger(), aboutHtml); browserDialog.open(true); } }); } - - private ToolItem about; - private ToolItem clearLog; - private ToolItem collapseAll; - private ToolItem expandAll; - private ToolItem newWindow; } + private static String verify(String hash) { + char[] in = hash.toCharArray(); + char[] ou = new char[in.length]; + for (int i = 0, c = 0; i < in.length; ++i) { + if (in[i] < 'a') { + c += in[i] - 'A'; + } else { + c += in[i] - 'a' - 26; + } + + if (c == 0) { + ou[i] = ' '; + } else { + ou[i] = (char) ('@' + c); + } + } + return String.valueOf(ou); + } + + private Color colorWhite; + + private TreeLoggerWidget logPane; + + private GWTShell serverWindow; + + private Toolbar toolbar; + public ShellMainWindow(GWTShell serverWindow, final Shell parent, int serverPort, boolean checkForUpdates) { super(parent, SWT.NONE); @@ -131,7 +172,8 @@ setLayout(new FillLayout()); if (serverPort > 0) { - parent.setText("Google Web Toolkit Development Shell / Port " + serverPort); + parent.setText("Google Web Toolkit Development Shell / Port " + + serverPort); } else { parent.setText("Google Web Toolkit Development Shell"); } @@ -168,8 +210,7 @@ // check for updates if (checkForUpdates) { try { - final CheckForUpdates updateChecker = PlatformSpecific - .createUpdateChecker(); + final CheckForUpdates updateChecker = PlatformSpecific.createUpdateChecker(); if (updateChecker != null) { final CheckForUpdates.UpdateAvailableCallback callback = new CheckForUpdates.UpdateAvailableCallback() { public void onUpdateAvailable(final String html) { @@ -213,10 +254,10 @@ boolean closeWindows = true; if (System.getProperty("gwt.shell.endquick") == null) { closeWindows = DialogBase.confirmAction((Shell) e.widget, - "Closing the development shell will close " + - "all hosted mode browsers. Continue?", "Confirm close"); - } - + "Closing the development shell will close " + + "all hosted mode browsers. Continue?", "Confirm close"); + } + if (closeWindows) { serverWindow.closeAllBrowserWindows(); e.doit = true; @@ -238,28 +279,4 @@ public void widgetDisposed(DisposeEvent e) { colorWhite.dispose(); } - - private static String verify(String hash) { - char[] in = hash.toCharArray(); - char[] ou = new char[in.length]; - for (int i = 0, c = 0; i < in.length; ++i) { - if (in[i] < 'a') { - c += in[i] - 'A'; - } else { - c += in[i] - 'a' - 26; - } - - if (c == 0) { - ou[i] = ' '; - } else { - ou[i] = (char) ('@' + c); - } - } - return String.valueOf(ou); - } - - private Color colorWhite; - private TreeLoggerWidget logPane; - private GWTShell serverWindow; - private Toolbar toolbar; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java b/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java index 3d6660d..ef02b08 100644 --- a/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java +++ b/dev/core/src/com/google/gwt/dev/shell/ShellModuleSpaceHost.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.TreeLogger; @@ -23,6 +37,20 @@ private static Map byteCodeCompilersByModule = new HashMap(); + protected final File genDir; + + protected final TypeOracle typeOracle; + + private CompilingClassLoader classLoader; + + private final TreeLogger logger; + + private final ModuleDef module; + + private RebindOracle rebindOracle; + + private ModuleSpace space; + /** * @param module the module associated with the hosted module space */ @@ -48,14 +76,15 @@ return logger; } - public void onModuleReady(ModuleSpace readySpace) throws UnableToCompleteException { + public void onModuleReady(ModuleSpace readySpace) + throws UnableToCompleteException { this.space = readySpace; // Create a host for the hosted mode compiler. // We add compilation units to it as deferred binding generators write them. // - SourceOracle srcOracle = - new HostedModeSourceOracle(typeOracle, module.getName()); + SourceOracle srcOracle = new HostedModeSourceOracle(typeOracle, + module.getName()); // Create or find the compiler to be used by the compiling class loader. // @@ -63,16 +92,15 @@ // Establish an environment for JavaScript property providers to run. // - ModuleSpacePropertyOracle propOracle = - new ModuleSpacePropertyOracle(module.getProperties(), readySpace); + ModuleSpacePropertyOracle propOracle = new ModuleSpacePropertyOracle( + module.getProperties(), readySpace); // Set up the rebind oracle for the module. // It has to wait until now because we need to inject javascript. // Rules rules = module.getRules(); - rebindOracle = - new StandardRebindOracle(typeOracle, propOracle, rules, genDir, - module.getCacheManager()); + rebindOracle = new StandardRebindOracle(typeOracle, propOracle, rules, + genDir, module.getCacheManager()); // Create a completely isolated class loader which owns all classes // associated with a particular module. This effectively builds a @@ -113,12 +141,4 @@ throw new IllegalStateException("Module initialization error"); } } - - protected final File genDir; - protected final TypeOracle typeOracle; - private CompilingClassLoader classLoader; - private final TreeLogger logger; - private final ModuleDef module; - private RebindOracle rebindOracle; - private ModuleSpace space; }
diff --git a/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java b/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java index 2d782ec..b7c86c7 100644 --- a/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java +++ b/dev/core/src/com/google/gwt/dev/shell/StandardGeneratorContext.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.GeneratorContext; @@ -47,6 +61,12 @@ public static class GeneratedCompilationUnitProvider extends StaticCompilationUnitProvider { + public CharArrayWriter caw; + + public PrintWriter pw; + + public char[] source; + public GeneratedCompilationUnitProvider(String packageName, String simpleTypeName) { super(packageName, simpleTypeName, null); @@ -71,10 +91,6 @@ } return source; } - - public CharArrayWriter caw; - public PrintWriter pw; - public char[] source; } private static final class GeneratedCUP extends URLCompilationUnitProvider { @@ -89,6 +105,20 @@ } } + private final CacheManager cacheManager; + + private final Set committedGeneratedCups = new HashSet(); + + private final File genDir; + + private final Set generatedTypeNames = new HashSet(); + + private final PropertyOracle propOracle; + + private final TypeOracle typeOracle; + + private final Map uncommittedGeneratedCupsByPrintWriter = new IdentityHashMap(); + /** * Normally, the compiler host would be aware of the same types that are * available in the supplied type oracle although it isn't strictly required. @@ -105,16 +135,14 @@ * Commits a pending generated type. */ public final void commit(TreeLogger logger, PrintWriter pw) { - GeneratedCompilationUnitProvider gcup = - (GeneratedCompilationUnitProvider) uncommittedGeneratedCupsByPrintWriter - .get(pw); + GeneratedCompilationUnitProvider gcup = (GeneratedCompilationUnitProvider) uncommittedGeneratedCupsByPrintWriter.get(pw); if (gcup != null) { gcup.commit(); uncommittedGeneratedCupsByPrintWriter.remove(pw); committedGeneratedCups.add(gcup); } else { logger.log(TreeLogger.WARN, - "Generator attempted to commit an unknown stream", null); + "Generator attempted to commit an unknown stream", null); } } @@ -140,16 +168,14 @@ TreeLogger subBranch = null; if (branch.isLoggable(TreeLogger.DEBUG)) { - subBranch = - branch - .branch(TreeLogger.DEBUG, "Generated source files...", null); + subBranch = branch.branch(TreeLogger.DEBUG, + "Generated source files...", null); } assert (cacheManager.getTypeOracle() == typeOracle); TypeOracleBuilder builder = new TypeOracleBuilder(cacheManager); for (Iterator iter = committedGeneratedCups.iterator(); iter.hasNext();) { - GeneratedCompilationUnitProvider gcup = - (GeneratedCompilationUnitProvider) iter.next(); + GeneratedCompilationUnitProvider gcup = (GeneratedCompilationUnitProvider) iter.next(); String typeName = gcup.getTypeName(); String genTypeName = gcup.getPackageName() + "." + typeName; genTypeNames.add(genTypeName); @@ -184,15 +210,11 @@ // Remind the user if there uncommitted cups. // if (!uncommittedGeneratedCupsByPrintWriter.isEmpty()) { - String msg = - "For the following type(s), generated source was never committed (did you forget to call commit()?)"; + String msg = "For the following type(s), generated source was never committed (did you forget to call commit()?)"; logger = logger.branch(TreeLogger.WARN, msg, null); - for (Iterator iter = - uncommittedGeneratedCupsByPrintWriter.values().iterator(); iter - .hasNext();) { - StaticCompilationUnitProvider cup = - (StaticCompilationUnitProvider) iter.next(); + for (Iterator iter = uncommittedGeneratedCupsByPrintWriter.values().iterator(); iter.hasNext();) { + StaticCompilationUnitProvider cup = (StaticCompilationUnitProvider) iter.next(); String typeName = cup.getPackageName() + "." + cup.getTypeName(); logger.log(TreeLogger.WARN, typeName, null); } @@ -221,17 +243,16 @@ JClassType existingType = typeOracle.findType(packageName, simpleTypeName); if (existingType != null) { logger.log(TreeLogger.DEBUG, "Type '" + typeName - + "' already exists and will not be re-created ", null); + + "' already exists and will not be re-created ", null); return null; } // Has anybody tried to create this type during this iteraion? // if (generatedTypeNames.contains(typeName)) { - final String msg = - "A request to create type '" - + typeName - + "' was received while the type itself was being created; this might be a generator or configuration bug"; + final String msg = "A request to create type '" + + typeName + + "' was received while the type itself was being created; this might be a generator or configuration bug"; logger.log(TreeLogger.WARN, msg, null); return null; } @@ -239,8 +260,8 @@ // The type isn't there, so we can let the caller create it. Remember that // it is pending so another attempt to create the same type will fail. // - GeneratedCompilationUnitProvider gcup = - new GeneratedCompilationUnitProvider(packageName, simpleTypeName); + GeneratedCompilationUnitProvider gcup = new GeneratedCompilationUnitProvider( + packageName, simpleTypeName); uncommittedGeneratedCupsByPrintWriter.put(gcup.pw, gcup); generatedTypeNames.add(typeName); @@ -281,24 +302,15 @@ Throwable caught = null; try { URL fileURL = srcFile.toURL(); - URLCompilationUnitProvider fileBaseCup = - new GeneratedCUP(fileURL, cup.getPackageName()); + URLCompilationUnitProvider fileBaseCup = new GeneratedCUP(fileURL, + cup.getPackageName()); return fileBaseCup; } catch (MalformedURLException e) { caught = e; } logger.log(TreeLogger.ERROR, - "Internal error: cannot build URL from synthesized file name '" - + srcFile.getAbsolutePath() + "'", caught); + "Internal error: cannot build URL from synthesized file name '" + + srcFile.getAbsolutePath() + "'", caught); throw new UnableToCompleteException(); } - - private final CacheManager cacheManager; - private final Set committedGeneratedCups = new HashSet(); - private final File genDir; - private final Set generatedTypeNames = new HashSet(); - private final PropertyOracle propOracle; - private final TypeOracle typeOracle; - private final Map uncommittedGeneratedCupsByPrintWriter = - new IdentityHashMap(); }
diff --git a/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java b/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java index 22078a3..e00406e 100644 --- a/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java +++ b/dev/core/src/com/google/gwt/dev/shell/StandardRebindOracle.java
@@ -1,4 +1,18 @@ -// Copyright 2006 Google Inc. All Rights Reserved. +/* + * Copyright 2006 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.shell; import com.google.gwt.core.ext.PropertyOracle; @@ -31,9 +45,15 @@ */ private final class Rebinder { + private final StandardGeneratorContext genCtx; + + private final Set usedRules = new HashSet(); + + private final List usedTypeNames = new ArrayList(); + public Rebinder(TypeOracle typeOracle, PropertyOracle propOracle) { genCtx = new StandardGeneratorContext(typeOracle, propOracle, genDir, - cacheManager); + cacheManager); } public String rebind(TreeLogger logger, String typeName) @@ -59,10 +79,8 @@ if (usedTypeNames.contains(typeName)) { // Found a cycle. // - String[] cycle = (String[]) Util - .toArray(String.class, usedTypeNames); - Messages.UNABLE_TO_REBIND_DUE_TO_CYCLE_IN_RULES - .log(logger, cycle, null); + String[] cycle = (String[]) Util.toArray(String.class, usedTypeNames); + Messages.UNABLE_TO_REBIND_DUE_TO_CYCLE_IN_RULES.log(logger, cycle, null); throw new UnableToCompleteException(); } @@ -74,7 +92,7 @@ // if (rules.isEmpty()) { logger.log(TreeLogger.DEBUG, - "No rules are defined, so no substitution can occur", null); + "No rules are defined, so no substitution can occur", null); return null; } @@ -84,7 +102,7 @@ // Branch the logger. // TreeLogger branch = Messages.TRACE_CHECKING_RULE.branch(logger, rule, - null); + null); if (rule.isApplicable(branch, genCtx, typeName)) { // See if this rule has already been used. This is needed to prevent @@ -112,11 +130,18 @@ // return null; } - - private final StandardGeneratorContext genCtx; - private final Set usedRules = new HashSet(); - private final List usedTypeNames = new ArrayList(); } + + private final CacheManager cacheManager; + + private final File genDir; + + private final PropertyOracle propOracle; + + private final Rules rules; + + private final TypeOracle typeOracle; + public StandardRebindOracle(TypeOracle typeOracle, PropertyOracle propOracle, Rules rules, File genDir, CacheManager cacheManager) { this.typeOracle = typeOracle; @@ -130,7 +155,8 @@ } } - public StandardRebindOracle(TypeOracle typeOracle, StaticPropertyOracle propOracle, Rules rules, File genDir) { + public StandardRebindOracle(TypeOracle typeOracle, + StaticPropertyOracle propOracle, Rules rules, File genDir) { // This is a path used for non-hosted mode execution; therefore no caching. this(typeOracle, propOracle, rules, genDir, null); } @@ -166,10 +192,4 @@ return false; } - private final CacheManager cacheManager; - private final File genDir; - private final PropertyOracle propOracle; - private final Rules rules; - private final TypeOracle typeOracle; - }