From 92690547592afc5eac903b9570864d28997415ff Mon Sep 17 00:00:00 2001 From: David Caruana Date: Tue, 13 Mar 2007 18:54:51 +0000 Subject: [PATCH] 1) Consolidate creation of template image resolver in Web Scripts 2) Add Help to stand-alone Web Scripts test server 3) Add server-side JavaScript Debugger git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@5385 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../messages/workflow-interpreter-help.txt | 4 + config/alfresco/script-services-context.xml | 3 + .../jscript/AlfrescoRhinoScriptDebugger.java | 165 ++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 source/java/org/alfresco/repo/jscript/AlfrescoRhinoScriptDebugger.java diff --git a/config/alfresco/messages/workflow-interpreter-help.txt b/config/alfresco/messages/workflow-interpreter-help.txt index 23712969a3..35d9fbf282 100644 --- a/config/alfresco/messages/workflow-interpreter-help.txt +++ b/config/alfresco/messages/workflow-interpreter-help.txt @@ -15,6 +15,10 @@ ok> user [] Switch to specified . If is omitted, the currently selected user is shown. +ok> quit | exit + + Quit this workflow console. + ok> use Show current workflow context. diff --git a/config/alfresco/script-services-context.xml b/config/alfresco/script-services-context.xml index 1818644106..3550fbbcb3 100644 --- a/config/alfresco/script-services-context.xml +++ b/config/alfresco/script-services-context.xml @@ -8,6 +8,9 @@ + + + diff --git a/source/java/org/alfresco/repo/jscript/AlfrescoRhinoScriptDebugger.java b/source/java/org/alfresco/repo/jscript/AlfrescoRhinoScriptDebugger.java new file mode 100644 index 0000000000..3278dba6cc --- /dev/null +++ b/source/java/org/alfresco/repo/jscript/AlfrescoRhinoScriptDebugger.java @@ -0,0 +1,165 @@ +/* + * Copyright (C) 2005-2007 Alfresco Software Limited. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + + * As a special exception to the terms and conditions of version 2.0 of + * the GPL, you may redistribute this Program in connection with Free/Libre + * and Open Source Software ("FLOSS") applications as described in Alfresco's + * FLOSS exception. You should have recieved a copy of the text describing + * the FLOSS exception, and it is also available here: + * http://www.alfresco.com/legal/licensing" + */ +package org.alfresco.repo.jscript; + +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.mozilla.javascript.ContextFactory; +import org.mozilla.javascript.Kit; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.tools.debugger.Dim; +import org.mozilla.javascript.tools.debugger.ScopeProvider; +import org.mozilla.javascript.tools.debugger.SwingGui; +import org.mozilla.javascript.tools.shell.Global; + + +/** + * Alfresco implementation of Rhino JavaScript debugger + * + * Provides support for authenticated access to object inspection. + * + * @author davidc + */ +public class AlfrescoRhinoScriptDebugger extends Dim +{ + // Logger + private static final Log logger = LogFactory.getLog(AlfrescoRhinoScriptDebugger.class); + + + /** + * Start the Debugger + */ + public void start() + { + if (logger.isDebugEnabled()) + { + ContextFactory factory = ContextFactory.getGlobal(); + Global global = new Global(); + global.init(factory); + + AlfrescoRhinoScriptDebugger dim = new AlfrescoRhinoScriptDebugger(); + dim.setBreakOnExceptions(true); + dim.setBreakOnEnter(true); + dim.setBreakOnReturn(true); + + dim.attachTo(factory); + dim.setScopeProvider(IProxy.newScopeProvider((Scriptable)global)); + + SwingGui gui = new SwingGui(dim, "Alfresco JavaScript Debugger"); + gui.pack(); + gui.setSize(600, 460); + gui.setVisible(true); + } + } + + /* (non-Javadoc) + * @see org.mozilla.javascript.tools.debugger.Dim#objectToString(java.lang.Object) + */ + @Override + public String objectToString(final Object arg0) + { + // execute command in context of currently selected user + return AuthenticationUtil.runAs(new RunAsWork() + { + @SuppressWarnings("synthetic-access") + public String doWork() throws Exception + { + return AlfrescoRhinoScriptDebugger.super.objectToString(arg0); + } + }, AuthenticationUtil.getSystemUserName()); + } + + + /** + * Class to consolidate all internal implementations of interfaces to avoid + * class generation bloat. + */ + private static class IProxy implements Runnable, ScopeProvider + { + + // Constants for 'type'. + public static final int EXIT_ACTION = 1; + + public static final int SCOPE_PROVIDER = 2; + + /** + * The type of interface. + */ + private final int type; + + /** + * The scope object to expose when {@link #type} = + * {@link #SCOPE_PROVIDER}. + */ + private Scriptable scope; + + /** + * Creates a new IProxy. + */ + public IProxy(int type) + { + this.type = type; + } + + /** + * Creates a new IProxy that acts as a {@link ScopeProvider}. + */ + public static ScopeProvider newScopeProvider(Scriptable scope) + { + IProxy scopeProvider = new IProxy(SCOPE_PROVIDER); + scopeProvider.scope = scope; + return scopeProvider; + } + + // ContextAction + + /** + * Exit action. + */ + public void run() + { + if (type != EXIT_ACTION) + Kit.codeBug(); + System.exit(0); + } + + // ScopeProvider + + /** + * Returns the scope for script evaluations. + */ + public Scriptable getScope() + { + if (type != SCOPE_PROVIDER) + Kit.codeBug(); + if (scope == null) + Kit.codeBug(); + return scope; + } + } + +}