Return-Path: Delivered-To: apmail-incubator-sling-commits-archive@locus.apache.org Received: (qmail 76465 invoked from network); 26 Sep 2008 15:44:48 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 26 Sep 2008 15:44:48 -0000 Received: (qmail 4199 invoked by uid 500); 26 Sep 2008 15:44:43 -0000 Delivered-To: apmail-incubator-sling-commits-archive@incubator.apache.org Received: (qmail 4166 invoked by uid 500); 26 Sep 2008 15:44:43 -0000 Mailing-List: contact sling-commits-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: sling-dev@incubator.apache.org Delivered-To: mailing list sling-commits@incubator.apache.org Received: (qmail 4012 invoked by uid 99); 26 Sep 2008 15:44:42 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 26 Sep 2008 08:44:42 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 26 Sep 2008 15:43:48 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id DC36423889B9; Fri, 26 Sep 2008 08:44:22 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r699373 - in /incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper: SlingContextFactory.java SlingRhinoDebugger.java Date: Fri, 26 Sep 2008 15:44:22 -0000 To: sling-commits@incubator.apache.org From: fmeschbe@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080926154422.DC36423889B9@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: fmeschbe Date: Fri Sep 26 08:44:22 2008 New Revision: 699373 URL: http://svn.apache.org/viewvc?rev=699373&view=rev Log: SLING-678 support enabling the debugger with a framework property and have better control over the debugger window (used for SLING-676) Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingContextFactory.java incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingRhinoDebugger.java Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingContextFactory.java URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingContextFactory.java?rev=699373&r1=699372&r2=699373&view=diff ============================================================================== --- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingContextFactory.java (original) +++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingContextFactory.java Fri Sep 26 08:44:22 2008 @@ -18,11 +18,13 @@ */ package org.apache.sling.scripting.javascript.helper; -import java.io.File; +import java.lang.reflect.Field; import org.mozilla.javascript.Context; import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.tools.debugger.ScopeProvider; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * The SlingContextFactory extends the standard Rhino @@ -32,10 +34,15 @@ */ public class SlingContextFactory extends ContextFactory { + /** default log */ + private final Logger log = LoggerFactory.getLogger(getClass()); + private SlingRhinoDebugger debugger; + private ScopeProvider scopeProvider; + private boolean debuggerActive; - + // conditionally setup the global ContextFactory to be ours. If // a global context factory has already been set, we have lost // and cannot set this one. @@ -45,22 +52,38 @@ initGlobal(new SlingContextFactory(sp)); } } - + + public static void teardown() { + ContextFactory factory = getGlobal(); + if (factory instanceof SlingContextFactory) { + ((SlingContextFactory) factory).dispose(); + } + } + // private as instances of this class are only used by setup() - private SlingContextFactory(ScopeProvider sp) - { + private SlingContextFactory(ScopeProvider sp) { scopeProvider = sp; + } + + private void dispose() { + // ensure the debugger is closed + exitDebugger(); - // TODO make this configurable via OSGi - File f = new File("/tmp/sling.debug"); - debuggerActive = f.exists(); + // reset the context factory class for future use + ContextFactory newGlobal = new ContextFactory(); + setField(newGlobal, "hasCustomGlobal", Boolean.FALSE); + setField(newGlobal, "global", newGlobal); + setField(newGlobal, "sealed", Boolean.FALSE); + setField(newGlobal, "listeners", null); + setField(newGlobal, "disabledListening", Boolean.FALSE); + setField(newGlobal, "applicationClassLoader", null); } - + @Override protected Context makeContext() { return new SlingContext(); } - + @Override protected boolean hasFeature(Context cx, int featureIndex) { if (featureIndex == Context.FEATURE_DYNAMIC_SCOPE) { @@ -69,7 +92,7 @@ return super.hasFeature(cx, featureIndex); } - + @Override protected void onContextCreated(Context cx) { super.onContextCreated(cx); @@ -77,19 +100,55 @@ } private void initDebugger(Context cx) { - if(!debuggerActive) { - return; + if (isDebugging()) { + try { + if (debugger == null) { + debugger = new SlingRhinoDebugger( + getClass().getSimpleName()); + debugger.setScopeProvider(scopeProvider); + debugger.attachTo(this); + } + } catch (Exception e) { + log.warn("initDebugger: Failed setting up the Rhino debugger", + e); + } + } + } + + public void exitDebugger() { + if (debugger != null) { + debugger.setScopeProvider(null); + debugger.detach(); + debugger.dispose(); + debugger = null; } + } + + void debuggerStopped() { + debugger = null; + } + + public void setDebugging(boolean enable) { + debuggerActive = enable; + } + + public boolean isDebugging() { + return debuggerActive; + } + + private void setField(Object instance, String fieldName, Object value) { try { - if (debugger == null) { - debugger = new SlingRhinoDebugger(getClass().getSimpleName()); - debugger.setScopeProvider(scopeProvider); - debugger.attachTo(this); + Field field = instance.getClass().getDeclaredField(fieldName); + if (!field.isAccessible()) { + field.setAccessible(true); } - } catch (Exception e) { - // TODO log - System.err.println("SlingContextFactory.initDebugger(): " + e); + field.set(instance, value); + } catch (IllegalArgumentException iae) { + // don't care, but it is strange anyhow + } catch (IllegalAccessException iae) { + // don't care, but it is strange anyhow + } catch (NoSuchFieldException nsfe) { + // don't care, but it is strange anyhow } } - } Modified: incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingRhinoDebugger.java URL: http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingRhinoDebugger.java?rev=699373&r1=699372&r2=699373&view=diff ============================================================================== --- incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingRhinoDebugger.java (original) +++ incubator/sling/trunk/scripting/javascript/src/main/java/org/apache/sling/scripting/javascript/helper/SlingRhinoDebugger.java Fri Sep 26 08:44:22 2008 @@ -16,13 +16,51 @@ */ package org.apache.sling.scripting.javascript.helper; +import java.awt.event.WindowEvent; +import java.awt.event.WindowStateListener; + +import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.tools.debugger.Dim; import org.mozilla.javascript.tools.debugger.SwingGui; class SlingRhinoDebugger extends Dim { + private SlingContextFactory slingContextFactory; + + private final SwingGui gui; + SlingRhinoDebugger(String windowTitle) { - final SwingGui gui = new SwingGui(this, windowTitle); + gui = new SwingGui(this, windowTitle); gui.pack(); gui.setVisible(true); + gui.setExitAction(new Runnable() { + public void run() { + if (slingContextFactory != null) { + slingContextFactory.debuggerStopped(); + } + } + }); + } + + @Override + public void attachTo(ContextFactory factory) { + super.attachTo(factory); + + if (factory instanceof SlingContextFactory) { + this.slingContextFactory = (SlingContextFactory) factory; + } + } + + @Override + public void detach() { + this.slingContextFactory = null; + super.detach(); + } + + @Override + public void dispose() { + clearAllBreakpoints(); + go(); + gui.dispose(); + super.dispose(); } }