From f459b079b9997708f2233fda21776456dbfc37df Mon Sep 17 00:00:00 2001
From: pb
Date: Wed, 15 Feb 2012 00:49:15 +0000
Subject: [PATCH] =?UTF-8?q?Installation=20developerSupport=20umgestellt=20?=
=?UTF-8?q?von=20package-based=20auf=20(legacy-compatible)=20web.Applicati?=
=?UTF-8?q?on=20based,=20Voraussetzung=20f=C3=BCr=20Umstellung=20auf=20leg?=
=?UTF-8?q?acy=20free=20application.=20Update=20Skript=20im=20Moment=20noc?=
=?UTF-8?q?h=20nicht=20erforderlich.=20Ansonsten=20verschiedene=20Formatie?=
=?UTF-8?q?rungen,=20Kleinigkeiten,=20etc.?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
git-svn-id: https://svn.libreccm.org/ccm/trunk@1511 8810af33-2d31-482b-a856-94f89814c4df
---
ccm-cms/src/com/arsdigita/cms/Service.java | 2 +-
.../src/com/arsdigita/cms/ServiceServlet.java | 313 ++++++++++++++++++
.../com/arsdigita/cms/WorkspaceServlet.java | 2 +-
.../cms/dispatcher/ServiceDispatcher.java | 7 +-
.../arsdigita/webdevsupport/WebDevSupport.pdl | 28 ++
.../src/com/arsdigita/core/Initializer.java | 12 +
...lTree.java => CallTree.java.nolongerInUse} | 0
...ava => Comodifications.java.nolongerInUse} | 0
...ounter.java => Counter.java.nolongerInUse} | 0
... => LoggerConfigurator.java.nolongerInUse} | 0
...y.java => LoggingProxy.java.nolongerInUse} | 0
...=> LoggingProxyFactory.java.nolongerInUse} | 0
...java => MutableInteger.java.nolongerInUse} | 0
...ace.java => StackTrace.java.nolongerInUse} | 0
.../doc-files/PNSystem.java.txt | 135 --------
.../src/com/arsdigita/kernel/Initializer.java | 4 +-
.../src/com/arsdigita/loader/CoreLoader.java | 97 ++++--
.../ui/permissions/PermissionsDispatcher.java | 2 +
.../arsdigita/webdevsupport/Dispatcher.java | 22 +-
.../com/arsdigita/webdevsupport/QueryLog.java | 2 +-
.../webdevsupport/QueryPlanComponent.java | 6 +-
.../webdevsupport/WebDevSupport.java | 241 ++------------
.../webdevsupport/WebDevSupportListener.java | 247 ++++++++++++++
.../com/arsdigita/docrepo/DocBlobject.java | 12 -
.../arsdigita/docrepo/RepositoryServlet.java | 52 +++
.../heirloom/packages/docrepo/xsl/docrepo.xsl | 2 +-
.../templates/ccm-portalworkspace/index.jsp | 8 +-
27 files changed, 780 insertions(+), 414 deletions(-)
create mode 100644 ccm-cms/src/com/arsdigita/cms/ServiceServlet.java
create mode 100755 ccm-core/pdl/com/arsdigita/webdevsupport/WebDevSupport.pdl
rename ccm-core/src/com/arsdigita/developersupport/{CallTree.java => CallTree.java.nolongerInUse} (100%)
rename ccm-core/src/com/arsdigita/developersupport/{Comodifications.java => Comodifications.java.nolongerInUse} (100%)
rename ccm-core/src/com/arsdigita/developersupport/{Counter.java => Counter.java.nolongerInUse} (100%)
rename ccm-core/src/com/arsdigita/developersupport/{LoggerConfigurator.java => LoggerConfigurator.java.nolongerInUse} (100%)
rename ccm-core/src/com/arsdigita/developersupport/{LoggingProxy.java => LoggingProxy.java.nolongerInUse} (100%)
rename ccm-core/src/com/arsdigita/developersupport/{LoggingProxyFactory.java => LoggingProxyFactory.java.nolongerInUse} (100%)
rename ccm-core/src/com/arsdigita/developersupport/{MutableInteger.java => MutableInteger.java.nolongerInUse} (100%)
rename ccm-core/src/com/arsdigita/developersupport/{StackTrace.java => StackTrace.java.nolongerInUse} (100%)
delete mode 100755 ccm-core/src/com/arsdigita/developersupport/doc-files/PNSystem.java.txt
create mode 100755 ccm-core/src/com/arsdigita/webdevsupport/WebDevSupportListener.java
diff --git a/ccm-cms/src/com/arsdigita/cms/Service.java b/ccm-cms/src/com/arsdigita/cms/Service.java
index 34b38238c..4ec542966 100644
--- a/ccm-cms/src/com/arsdigita/cms/Service.java
+++ b/ccm-cms/src/com/arsdigita/cms/Service.java
@@ -44,7 +44,7 @@ import org.apache.log4j.Logger;
*/
public class Service extends Application {
- private static final Logger s_log = Logger.getLogger(ContentSection.class);
+ private static final Logger s_log = Logger.getLogger(Service.class);
// pdl stuff (constants)
public static final String BASE_DATA_OBJECT_TYPE =
diff --git a/ccm-cms/src/com/arsdigita/cms/ServiceServlet.java b/ccm-cms/src/com/arsdigita/cms/ServiceServlet.java
new file mode 100644
index 000000000..6385cc856
--- /dev/null
+++ b/ccm-cms/src/com/arsdigita/cms/ServiceServlet.java
@@ -0,0 +1,313 @@
+/*
+ * Copyright (C) 2012 Peter Boy All Rights Reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public License
+ * as published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+package com.arsdigita.cms;
+
+import com.arsdigita.cms.dispatcher.ResourceHandler;
+import com.arsdigita.cms.dispatcher.SimpleCache;
+import com.arsdigita.developersupport.DeveloperSupport;
+import com.arsdigita.dispatcher.DispatcherHelper;
+import com.arsdigita.dispatcher.RequestContext;
+import com.arsdigita.util.Assert;
+import com.arsdigita.web.Application;
+import com.arsdigita.web.ApplicationFileResolver;
+import com.arsdigita.web.BaseApplicationServlet;
+
+import com.arsdigita.web.Web;
+import com.arsdigita.xml.XML;
+import java.io.IOException;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.log4j.Logger;
+import org.xml.sax.helpers.DefaultHandler;
+
+/**
+ * CMS Service application servlet serves all request made for the CMS
+ * service application.
+ *
+ * URLs of the available services are stored in a XML file which is processed
+ * into a cache of services on a request by request basis (lazy loading).
+ *
+ * @author Peter Boy
+ * @version $Id: WorkspaceServlet.java 2161 2011-02-02 00:16:13Z pboy $
+ */
+public class ServiceServlet extends BaseApplicationServlet {
+
+ /**Error logging */
+ private static Logger s_log = Logger
+ .getLogger(ServiceServlet.class.getName());
+
+
+ /** The path of the file that maps resources (relative urls - corresponding
+ * class names). */
+ private final static String MAP_FILE = "WEB-INF/resources/cms-service-map.xml";
+
+ /** Mapping between a relative URL and the class name of a ResourceHandler.*/
+ private static HashMap s_pageClasses = new HashMap();
+
+ /**
+ * Instantiated ResourceHandler cache. This allows for lazy loading.
+ */
+ private static SimpleCache s_pages = new SimpleCache();
+
+ /** List of URLs which require a trailing slash. These are required for
+ * creating virtual directories, so that relative URLs and redirects
+ * work. */
+ private ArrayList m_trailingSlashList = new ArrayList();
+
+ /** Path to directory containg ccm-cms template files */
+ private String m_templatePath;
+ /** Resolvers to find templages (JSP) and other stuff stored in file system.*/
+ private ApplicationFileResolver m_resolver;
+
+
+ /**
+ * Use parent's class initialization extension point to perform additional
+ * initialisation tasks.
+ */
+ @Override
+ protected void doInit() {
+ if (s_log.isDebugEnabled()) {
+ s_log.info("starting doInit method");
+ }
+
+ /* Initialize List with an empty URL. Later URL's are added which are
+ * provided w/o trailing slash rsp. file extension. */
+ requireTrailingSlash("");
+
+ /* Process mapping file. */
+ readFromFile(MAP_FILE);
+
+ m_templatePath = ContentSection.getConfig().getTemplateRoot();
+ Assert.exists(m_templatePath, String.class);
+ Assert.isTrue(m_templatePath.startsWith("/"),
+ "template-path must start with '/'");
+ Assert.isTrue(!m_templatePath.endsWith("/"),
+ "template-path must not end with '/'");
+ m_resolver = Web.getConfig().getApplicationFileResolver();
+
+ }
+
+ /**
+ * Implements the (abstract) doService method of BaseApplicationServlet to
+ * create the Worspace page.
+ *
+ * @see com.arsdigita.web.BaseApplicationServlet#doService
+ * (HttpServletRequest, HttpServletResponse, Application)
+ */
+ protected void doService( HttpServletRequest sreq,
+ HttpServletResponse sresp,
+ Application app)
+ throws ServletException, IOException {
+ if (s_log.isDebugEnabled()) {
+ s_log.info("starting doService method");
+ }
+ DeveloperSupport.startStage("ServiceServlet.doService");
+
+ Service service = (Service) app;
+
+ RequestContext ctx = DispatcherHelper.getRequestContext();
+ String url = ctx.getRemainingURLPart(); // here SiteNodeRequestContext
+ String originalUrl = ctx.getOriginalURL();
+ String requestUri = sreq.getRequestURI();
+
+ // An empty remaining URL or a URL which doesn't end in trailing slash:
+ // probably want to redirect.
+ if ( m_trailingSlashList.contains(url) && !originalUrl.endsWith("/") ) {
+ DispatcherHelper.sendRedirect(sresp, originalUrl + "/");
+ return;
+ }
+
+ // Check user access.
+ // Deprecated and here implemented as a No-OP method!
+ /* heckUserAccess(request, response, actx); */
+
+ ResourceHandler page = getResource(url);
+ if ( page != null ) {
+ // Serve the page.
+ page.init();
+ page.dispatch(sreq, sresp, ctx);
+ } else {
+ // Fall back on the JSP application dispatcher.
+ // m_notFoundHandler.dispatch(request, response, actx);
+ if (s_log.isInfoEnabled()) {
+ s_log.info("NOT serving content item");
+ }
+
+ /* Store content section in http request to make it available
+ * or admin index,jsp */
+ // sreq.setAttribute(CONTENT_SECTION, section);
+
+ RequestDispatcher rd = m_resolver.resolve(m_templatePath,
+ sreq, sresp, app);
+ if (rd != null) {
+ if (s_log.isDebugEnabled()) {
+ s_log.debug("Got dispatcher " + rd);
+ }
+ sreq = DispatcherHelper.restoreOriginalRequest(sreq);
+ rd.forward(sreq,sresp);
+ } else {
+ // sresp.sendError(404, packageURL + " not found on this server.");
+ sresp.sendError(404, requestUri + " not found on this server.");
+ }
+
+ }
+
+
+ DeveloperSupport.endStage("ServiceServlet.doService");
+ if (s_log.isDebugEnabled()) {
+ s_log.info("doService method completed");
+ }
+ }
+
+
+ /**
+ * Fetch a page based on the URL stub.
+ *
+ * @param url The URL stub following the site-node URL
+ * @return A ResourceHandler or null if none exists.
+ * @pre (url != null)
+ */
+ protected ResourceHandler getResource(String url) throws ServletException {
+
+ // First check the pages cache for existing pages.
+ ResourceHandler page = (ResourceHandler) s_pages.get(url);
+ if ( page == null ) {
+
+ // Next check if the URL maps to a page class.
+ String pageClassName = (String) s_pageClasses.get(url);
+ if ( pageClassName != null ) {
+
+ Class pageClass;
+ try {
+ pageClass = Class.forName(pageClassName);
+ } catch (ClassNotFoundException e) {
+ s_log.error("error fetching class for ResourceHandler", e);
+ throw new ServletException(e);
+ }
+
+ // Try and instantiate the page.
+ try {
+ page = (ResourceHandler) pageClass.newInstance();
+ } catch (InstantiationException e) {
+ s_log.error("error instantiating a ResourceHandler", e);
+ throw new ServletException(e);
+ } catch (IllegalAccessException e) {
+ s_log.error("error instantiating a ResourceHandler", e);
+ throw new ServletException(e);
+ }
+
+ page.init();
+ s_pages.put(url, page);
+ }
+ }
+ return page;
+ }
+
+
+ /**
+ *
+ * Initializes URL-to-Page/Dispatcher/Servlet mappings from a file.
+ *
+ * Format of the file is XML:
+ *
+ * <dispatcher-configuration>
+ * <url-mapping
+ * <url>my-page</url>
+ * OR <page-class>com.arsdigita.Page.class</page-class>
+ * <url-mapping
+ * </dispatcher-configuration>
+ *
+ */
+ private void readFromFile(final String file) {
+
+ // XML.parseResource(file, newParseConfigHandler(s_pageClasses));
+ XML.parseResource(file, new PageClassConfigHandler(s_pageClasses));
+
+ }
+
+ /**
+ * Adds a URL to the list of URLs that are required to have trailing
+ * slashes. A request for url will be redirected to url + "/"
+ * if the original URL request (what you see in your browser)
+ * doesn't include a trailing slash. This is required for
+ * creating virtual directories, so that relative URLs and redirects
+ * work.
+ */
+ public void requireTrailingSlash(String url) {
+ m_trailingSlashList.add(url);
+ }
+
+
+ /**
+ * Returns a SAX event handler object for setting up a MapDispatcher
+ * using an XML config file.
+ * @param map A map to configure
+ * @return a SAX DefaultHandler object for handling SAX events
+ * @pre md.m_map != null
+ */
+// protected DefaultHandler newParseConfigHandler(Map map) {
+// return new PageClassConfigHandler(map);
+// }
+
+
+ /**
+ *
+ * SAX event handler class for parsing configuration file.
+ */
+ protected static class PageClassConfigHandler extends DefaultHandler {
+
+ private Map m_map;
+ private StringBuffer m_buffer;
+ private String m_url;
+ private String m_className;
+
+ public PageClassConfigHandler(Map map) {
+ m_map = map;
+ m_buffer = new StringBuffer();
+ }
+
+ @Override
+ public void characters(char[] ch, int start, int len) {
+ for (int i = 0; i < len; i++) {
+ m_buffer.append(ch[start + i]);
+ }
+ }
+
+ @Override
+ public void endElement(String uri, String localName, String qn) {
+ if ( qn.equals("url") ) {
+ m_url = m_buffer.toString().trim();
+ } else if ( qn.equals("page-class") ) {
+ m_className = m_buffer.toString().trim();
+ } else if ( qn.equals("url-mapping") ) {
+ m_map.put(m_url, m_className);
+ }
+ m_buffer = new StringBuffer();
+ }
+ }
+
+}
diff --git a/ccm-cms/src/com/arsdigita/cms/WorkspaceServlet.java b/ccm-cms/src/com/arsdigita/cms/WorkspaceServlet.java
index 34e720289..5b49f503a 100644
--- a/ccm-cms/src/com/arsdigita/cms/WorkspaceServlet.java
+++ b/ccm-cms/src/com/arsdigita/cms/WorkspaceServlet.java
@@ -94,7 +94,7 @@ public class WorkspaceServlet extends BaseApplicationServlet {
DeveloperSupport.endStage("ContentCenterServlet.doService");
if (s_log.isDebugEnabled()) {
- s_log.info("doService method competed");
+ s_log.info("doService method completed");
}
}
diff --git a/ccm-cms/src/com/arsdigita/cms/dispatcher/ServiceDispatcher.java b/ccm-cms/src/com/arsdigita/cms/dispatcher/ServiceDispatcher.java
index 75cdc8f6a..9ab07d1dd 100755
--- a/ccm-cms/src/com/arsdigita/cms/dispatcher/ServiceDispatcher.java
+++ b/ccm-cms/src/com/arsdigita/cms/dispatcher/ServiceDispatcher.java
@@ -96,7 +96,7 @@ public class ServiceDispatcher extends LockableImpl implements Dispatcher {
public ServiceDispatcher() {
super();
- m_trailingSlashList = new ArrayList();
+ // m_trailingSlashList = new ArrayList();
requireTrailingSlash("");
setNotFoundDispatcher(JSPApplicationDispatcher.getInstance());
@@ -130,7 +130,8 @@ public class ServiceDispatcher extends LockableImpl implements Dispatcher {
}
// Check user access.
- checkUserAccess(request, response, actx);
+ // Deprecated and here implemented as a No-OP method!
+ /* heckUserAccess(request, response, actx); */
ResourceHandler page = getResource(url);
if ( page != null ) {
@@ -267,7 +268,7 @@ public class ServiceDispatcher extends LockableImpl implements Dispatcher {
*
* @exception ServletException If there is an exception thrown while
* trying to redirect, wrap that exception in a ServletException
- **/
+ */
protected void redirectToLoginPage(HttpServletRequest req,
HttpServletResponse resp)
throws ServletException {
diff --git a/ccm-core/pdl/com/arsdigita/webdevsupport/WebDevSupport.pdl b/ccm-core/pdl/com/arsdigita/webdevsupport/WebDevSupport.pdl
new file mode 100755
index 000000000..be44c8c0d
--- /dev/null
+++ b/ccm-core/pdl/com/arsdigita/webdevsupport/WebDevSupport.pdl
@@ -0,0 +1,28 @@
+//
+// Copyright (C) 2011 Peter Boy All Rights Reserved.
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public License
+// as published by the Free Software Foundation; either version 2.1 of
+// the License, or (at your option) any later version.
+//
+// This library 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
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+//
+// $Id: WebDevSupport.pdl 1230 2012-02-22 11:50:59Z pboy $
+// $DateTime: 2012/02/16 18:10:38 $
+
+model com.arsdigita.webdevsupport;
+
+import com.arsdigita.web.Application;
+
+object type WebDevSupport extends Application {
+ // nothing to persist yet
+ // reference key (webdevsupport.application_id);
+}
diff --git a/ccm-core/src/com/arsdigita/core/Initializer.java b/ccm-core/src/com/arsdigita/core/Initializer.java
index 72ded48ec..656cc7188 100755
--- a/ccm-core/src/com/arsdigita/core/Initializer.java
+++ b/ccm-core/src/com/arsdigita/core/Initializer.java
@@ -52,6 +52,7 @@ import com.arsdigita.search.converter.OOConverter;
import com.arsdigita.search.converter.WordConverter;
import com.arsdigita.search.converter.TextConverter;
+import com.arsdigita.webdevsupport.WebDevSupport;
import org.apache.log4j.Logger;
@@ -138,6 +139,17 @@ public class Initializer extends CompoundInitializer {
}
});
+ /* domain.ReflectionInstantiator instantiator for
+ * dataObject com.arsdigita.webdevsupport.WebDevSupport */
+ e.getFactory().registerInstantiator
+ (WebDevSupport.BASE_DATA_OBJECT_TYPE,
+ new ACSObjectInstantiator() {
+ @Override
+ public DomainObject doNewInstance(final DataObject data) {
+ return new WebDevSupport(data);
+ }
+ });
+
e.getFactory().registerInstantiator
(Admin.BASE_DATA_OBJECT_TYPE,
new ACSObjectInstantiator() {
diff --git a/ccm-core/src/com/arsdigita/developersupport/CallTree.java b/ccm-core/src/com/arsdigita/developersupport/CallTree.java.nolongerInUse
similarity index 100%
rename from ccm-core/src/com/arsdigita/developersupport/CallTree.java
rename to ccm-core/src/com/arsdigita/developersupport/CallTree.java.nolongerInUse
diff --git a/ccm-core/src/com/arsdigita/developersupport/Comodifications.java b/ccm-core/src/com/arsdigita/developersupport/Comodifications.java.nolongerInUse
similarity index 100%
rename from ccm-core/src/com/arsdigita/developersupport/Comodifications.java
rename to ccm-core/src/com/arsdigita/developersupport/Comodifications.java.nolongerInUse
diff --git a/ccm-core/src/com/arsdigita/developersupport/Counter.java b/ccm-core/src/com/arsdigita/developersupport/Counter.java.nolongerInUse
similarity index 100%
rename from ccm-core/src/com/arsdigita/developersupport/Counter.java
rename to ccm-core/src/com/arsdigita/developersupport/Counter.java.nolongerInUse
diff --git a/ccm-core/src/com/arsdigita/developersupport/LoggerConfigurator.java b/ccm-core/src/com/arsdigita/developersupport/LoggerConfigurator.java.nolongerInUse
similarity index 100%
rename from ccm-core/src/com/arsdigita/developersupport/LoggerConfigurator.java
rename to ccm-core/src/com/arsdigita/developersupport/LoggerConfigurator.java.nolongerInUse
diff --git a/ccm-core/src/com/arsdigita/developersupport/LoggingProxy.java b/ccm-core/src/com/arsdigita/developersupport/LoggingProxy.java.nolongerInUse
similarity index 100%
rename from ccm-core/src/com/arsdigita/developersupport/LoggingProxy.java
rename to ccm-core/src/com/arsdigita/developersupport/LoggingProxy.java.nolongerInUse
diff --git a/ccm-core/src/com/arsdigita/developersupport/LoggingProxyFactory.java b/ccm-core/src/com/arsdigita/developersupport/LoggingProxyFactory.java.nolongerInUse
similarity index 100%
rename from ccm-core/src/com/arsdigita/developersupport/LoggingProxyFactory.java
rename to ccm-core/src/com/arsdigita/developersupport/LoggingProxyFactory.java.nolongerInUse
diff --git a/ccm-core/src/com/arsdigita/developersupport/MutableInteger.java b/ccm-core/src/com/arsdigita/developersupport/MutableInteger.java.nolongerInUse
similarity index 100%
rename from ccm-core/src/com/arsdigita/developersupport/MutableInteger.java
rename to ccm-core/src/com/arsdigita/developersupport/MutableInteger.java.nolongerInUse
diff --git a/ccm-core/src/com/arsdigita/developersupport/StackTrace.java b/ccm-core/src/com/arsdigita/developersupport/StackTrace.java.nolongerInUse
similarity index 100%
rename from ccm-core/src/com/arsdigita/developersupport/StackTrace.java
rename to ccm-core/src/com/arsdigita/developersupport/StackTrace.java.nolongerInUse
diff --git a/ccm-core/src/com/arsdigita/developersupport/doc-files/PNSystem.java.txt b/ccm-core/src/com/arsdigita/developersupport/doc-files/PNSystem.java.txt
deleted file mode 100755
index 328501624..000000000
--- a/ccm-core/src/com/arsdigita/developersupport/doc-files/PNSystem.java.txt
+++ /dev/null
@@ -1,135 +0,0 @@
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * The value of this class lies in its fairly unpredictable call tree.
- *
- * This program expects sequences of 0 and 1 as input. Each such sequence is
- * reduced by the application of the rules:
- *
- *
- * Rule 1. 0xyS --> S00
- * Rule 2. 1xyS --> S1101
- *
- *
- * where x and y can be any binary digit, and
- * S any binary sequence, including the empty sequence.
- *
- * For example, 01011 reduces as follows
- *
- *
- * 01011 --> 1100 --> 01101 --> 0100 --> 000
- * rule1 rule2 rule1 rule1
- *
- *
- * Some sequences don't a finite reduction chain. For example,
- * 1001 loops indefinitely.
- *
- * Usage:
- *
- *
- * $ java PNSystem 0101 01010
- *
- *
- *
- * @author: Vadim Nasardinov (vadimn@redhat.com)
- * @since: 2004-02-12
- * @version: $Id: PNSystem.java.txt 287 2005-02-22 00:29:02Z sskracic $
- **/
-public final class PNSystem implements Runnable {
- private final String m_input;
- private final Map m_visited;
- private int m_rule1Count;
- private int m_rule2Count;
-
- private PNSystem(String input) {
- m_input = input;
- m_visited = new HashMap();
- m_rule1Count = 0;
- m_rule2Count = 0;
- }
-
- public static void main(String[] args) {
- if ( args.length==0 ) {
- usage();
- return;
- }
-
- for (int ii=0; ii " + reduce(m_input) +
- " (" + times("Rule 1", m_rule1Count) +
- ", " + times("Rule 2", m_rule2Count) + ".)");
- } catch (StackOverflowError err) {
- log("stack overflow");
- }
- }
- }
-
- private static String times(String rule, int count) {
- return rule + " applied " + count +
- (count==1 ? " time" : " times");
- }
-
- private boolean checksOutOK() {
- String illegal =
- m_input.replace('0', ' ').replace('1', ' ').trim();
- if ("".equals(illegal)) { return true; }
-
- log("Characters other than 0 or 1 are not allowed: '" +
- illegal + "'");
- return false;
- }
-
- private String reduce(String str) {
- final int count = m_rule1Count + m_rule2Count;
-
- if ( m_visited.containsKey(str) ) {
- Integer ordinal = (Integer) m_visited.get(str);
- return "loops starting with " + str + " at position " +
- count + " with a period of " +
- (count - ordinal.intValue() + ".");
- }
- m_visited.put(str, new Integer(count));
-
- if ( str.length() < 4 ) {
- return str;
- }
-
- if ( str.charAt(0) == '0' ) {
- return rule1(str);
- } else {
- return rule2(str);
- }
- }
-
- private String rule1(String str) {
- m_rule1Count++;
- return reduce(str.substring(3) + "00");
- }
-
- private String rule2(String str) {
- m_rule2Count++;
- return reduce(str.substring(3) + "1101");
- }
-}
diff --git a/ccm-core/src/com/arsdigita/kernel/Initializer.java b/ccm-core/src/com/arsdigita/kernel/Initializer.java
index d60ccb6ba..af98cd126 100755
--- a/ccm-core/src/com/arsdigita/kernel/Initializer.java
+++ b/ccm-core/src/com/arsdigita/kernel/Initializer.java
@@ -27,7 +27,7 @@ import com.arsdigita.persistence.OID;
import com.arsdigita.runtime.ContextInitEvent;
import com.arsdigita.runtime.DomainInitEvent;
import com.arsdigita.runtime.GenericInitializer;
-import com.arsdigita.webdevsupport.WebDevSupport;
+import com.arsdigita.webdevsupport.WebDevSupportListener;
import java.math.BigDecimal;
@@ -170,7 +170,7 @@ public class Initializer extends GenericInitializer {
Boolean active = KernelConfig.getConfig().isWebdevSupportActive();
if (Boolean.TRUE.equals(active)) {
s_log.debug("Registering webdev listener");
- DeveloperSupport.addListener(WebDevSupport.getInstance());
+ DeveloperSupport.addListener(WebDevSupportListener.getInstance());
}
s_log.debug("kernel context init completed");
diff --git a/ccm-core/src/com/arsdigita/loader/CoreLoader.java b/ccm-core/src/com/arsdigita/loader/CoreLoader.java
index 5a5faeff7..989625e74 100755
--- a/ccm-core/src/com/arsdigita/loader/CoreLoader.java
+++ b/ccm-core/src/com/arsdigita/loader/CoreLoader.java
@@ -58,6 +58,7 @@ import com.arsdigita.web.ApplicationType;
import com.arsdigita.web.Host;
import com.arsdigita.web.Web;
+import com.arsdigita.webdevsupport.WebDevSupport;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -76,6 +77,8 @@ import java.util.Map;
import javax.mail.internet.InternetAddress;
import org.apache.log4j.Logger;
+
+
/**
* CoreLoader
*
@@ -260,12 +263,14 @@ public class CoreLoader extends PackageLoader {
s_log.debug("CoreLoader: Going to init KeyStorage.");
KeyStorage.KERNEL_KEY_STORE.init();
+
s_log.debug("CoreLoader: Going to execute loadHost().");
loadHost();
+
s_log.debug("CoreLoader: Going to execute loadSubsite().");
loadSubsite(loadKernel());
- s_log.debug("CoreLoader: Going to execute loadBebop().");
- loadBebop();
+ // !! s_log.debug("CoreLoader: Going to execute loadBebop().");
+ // !! loadBebop();
s_log.debug("CoreLoader: Going to execute loadWebDev().");
loadWebDev();
s_log.debug("CoreLoader: Going to execute loadSiteMapAdminApp().");
@@ -278,6 +283,7 @@ public class CoreLoader extends PackageLoader {
loadMimeTypes();
s_log.debug("CoreLoader: Going to execute loadGlobalization().");
loadGlobalization();
+
}
}.run();
s_log.debug("CoreLoader run method completed.");
@@ -314,8 +320,33 @@ public class CoreLoader extends PackageLoader {
//--com.arsdigita.search.lucene.LegacyInitializer.LOADER.load();
}
+ private void loadSubsite(SiteNode rootNode) {
+ s_log.debug("CoreLoader: Going to execute method loadSubsite().");
+ String sDispatcher = "";
+
+ PackageInstance packageInstance = rootNode.getPackageInstance();
+ if (packageInstance == null) {
+ throw new IllegalStateException
+ ("No package instance mounted at the root node");
+ }
+ PackageType subsite = packageInstance.getType();
+
+ // getType() returns a disconnected object. To get a connected object
+ // we do a findByKey(key).
+ String packageKey = subsite.getKey();
+ try {
+ subsite = PackageType.findByKey(packageKey);
+ } catch (DataObjectNotFoundException e) {
+ throw new IllegalStateException
+ ("Package Type with key \"" + packageKey + "\" was not found.\n");
+ }
+
+ // Set subsite dispatcher class.
+ subsite.setDispatcherClass(getDispatcher());
+ }
+
/**
- * Create Root Site Node
+ * Create Root Site Node for loadSubsite()
* @return root node
*/
private SiteNode loadKernel() {
@@ -341,9 +372,12 @@ public class CoreLoader extends PackageLoader {
return rootNode;
}
- // Ensure that at least one User with universal "admin" permission
- // exists after installation.
+
+ /**
+ * Ensure that at least one User with universal "admin" permission exists
+ * after installation.
+ */
private void createSystemAdministrator() {
s_log.debug("CoreLoader: execution of method createSystemAdministrator().");
final String DO_NOT_CREATE = "*do not create*";
@@ -405,31 +439,8 @@ public class CoreLoader extends PackageLoader {
}
- private void loadSubsite(SiteNode rootNode) {
- s_log.debug("CoreLoader: Going to execute method loadSubsite().");
- String sDispatcher = "";
-
- PackageInstance packageInstance = rootNode.getPackageInstance();
- if (packageInstance == null) {
- throw new IllegalStateException
- ("No package instance mounted at the root node");
- }
- PackageType subsite = packageInstance.getType();
-
- // getType() returns a disconnected object. To get a connected object
- // we do a findByKey(key).
- String packageKey = subsite.getKey();
- try {
- subsite = PackageType.findByKey(packageKey);
- } catch (DataObjectNotFoundException e) {
- throw new IllegalStateException
- ("Package Type with key \"" + packageKey + "\" was not found.\n");
- }
-
- // Set subsite dispatcher class.
- subsite.setDispatcherClass(getDispatcher());
- }
-
+// Not really used. Commented out in run() method
+/*
private void loadBebop() {
// Create Package Types and Instances
@@ -439,9 +450,11 @@ public class CoreLoader extends PackageLoader {
bebop.createInstance("Bebop Service");
}
+*/
private void loadWebDev() {
// Add the package type to the database
+/*
PackageType packType = PackageType.create
("webdev-support", "WebDeveloper Support", "WebDeveloper Supports",
"http://arsdigita.com/webdev-support");
@@ -453,6 +466,25 @@ public class CoreLoader extends PackageLoader {
// Map the package type to a dispatcher class
packType.setDispatcherClass("com.arsdigita.webdevsupport.Dispatcher");
+*/
+ ApplicationType webDevType = ApplicationType
+ .createApplicationType("webdev-support",
+ "WebDeveloper Support",
+ WebDevSupport.BASE_DATA_OBJECT_TYPE);
+ webDevType.setDispatcherClass("com.arsdigita.webdevsupport.Dispatcher");
+ webDevType.setDescription("WebDeveloper Support application");
+ webDevType.save();
+
+ Application webDev = Application.createApplication(webDevType,
+ "ds",
+ "WebDeveloper Support",
+ null);
+ webDev.setDescription("The default WEB developer service instance.");
+ webDev.save();
+
+
+
+
}
private Application loadAdminApp() {
@@ -511,11 +543,6 @@ public class CoreLoader extends PackageLoader {
* Load core's basic portal infrastructure.
*/
private void loadPortal() {
-/* Portal now legacy free. To be deleted when transistion is completed.
- s_log.info("Adding package type: portal");
- PackageType packageType = PackageType.create
- ("portal", "Portal", "Portals", "http://arsdigita.com/portal");
-*/
s_log.info("Adding resource type: portal");
// ResourceType manages the entries in table application_types and
// therefore actually creates a sort of new style legacy free
diff --git a/ccm-core/src/com/arsdigita/ui/permissions/PermissionsDispatcher.java b/ccm-core/src/com/arsdigita/ui/permissions/PermissionsDispatcher.java
index b60364989..294e08422 100755
--- a/ccm-core/src/com/arsdigita/ui/permissions/PermissionsDispatcher.java
+++ b/ccm-core/src/com/arsdigita/ui/permissions/PermissionsDispatcher.java
@@ -54,6 +54,7 @@ public class PermissionsDispatcher extends BebopMapDispatcher
Page index = buildIndexPage();
Page single = buildItemPage();
+ // BebopMapDispatcher manages url - pages mapping
addPage("", index);
addPage("index", index);
addPage("one", single);
@@ -61,6 +62,7 @@ public class PermissionsDispatcher extends BebopMapDispatcher
addPage("denied", buildDeniedPage());
}
+ @Override
protected void preprocessRequest(HttpServletRequest req,
HttpServletResponse resp,
RequestContext ctx,
diff --git a/ccm-core/src/com/arsdigita/webdevsupport/Dispatcher.java b/ccm-core/src/com/arsdigita/webdevsupport/Dispatcher.java
index 7feed9e99..30df7ae0e 100755
--- a/ccm-core/src/com/arsdigita/webdevsupport/Dispatcher.java
+++ b/ccm-core/src/com/arsdigita/webdevsupport/Dispatcher.java
@@ -155,13 +155,13 @@ public class Dispatcher extends BebopMapDispatcher {
ActionLink enable = new ActionLink("Enable request logging") {
public boolean isVisible(PageState state) {
- return !DeveloperSupport.containsListener(WebDevSupport.getInstance())
+ return !DeveloperSupport.containsListener(WebDevSupportListener.getInstance())
&& super.isVisible(state);
}
};
enable.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
- DeveloperSupport.addListener(WebDevSupport.getInstance());
+ DeveloperSupport.addListener(WebDevSupportListener.getInstance());
throw new RedirectSignal(URL.request(e.getPageState().getRequest(),
null), true);
}
@@ -172,14 +172,14 @@ public class Dispatcher extends BebopMapDispatcher {
ActionLink disable = new ActionLink("Disable request logging") {
public boolean isVisible(PageState state) {
- return DeveloperSupport.containsListener(WebDevSupport.getInstance())
+ return DeveloperSupport.containsListener(WebDevSupportListener.getInstance())
&& super.isVisible(state);
}
};
disable.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
- DeveloperSupport.removeListener(WebDevSupport.getInstance());
- WebDevSupport.getInstance().clearRequestHistory();
+ DeveloperSupport.removeListener(WebDevSupportListener.getInstance());
+ WebDevSupportListener.getInstance().clearRequestHistory();
throw new RedirectSignal(URL.request(e.getPageState().getRequest(),
null), true);
}
@@ -188,7 +188,7 @@ public class Dispatcher extends BebopMapDispatcher {
BoxPanel logs = new BoxPanel(BoxPanel.VERTICAL) {
public boolean isVisible(PageState state) {
- return DeveloperSupport.containsListener(WebDevSupport.getInstance())
+ return DeveloperSupport.containsListener(WebDevSupportListener.getInstance())
&& super.isVisible(state);
}
};
@@ -196,7 +196,7 @@ public class Dispatcher extends BebopMapDispatcher {
logs.add(new Label("") {
public String getLabel(PageState ps) {
return "Currently storing the last " +
- WebDevSupport.getInstance().getMaxRequests() + " requests";
+ WebDevSupportListener.getInstance().getMaxRequests() + " requests";
}
});
Label toggle = new Label("") {
@@ -298,7 +298,7 @@ public class Dispatcher extends BebopMapDispatcher {
public TableModel makeModel(Table t, final PageState s) {
Integer request_id = (Integer)s.getValue(m_request_id);
RequestInfo ri =
- WebDevSupport.getInstance().getRequest(request_id.intValue());
+ WebDevSupportListener.getInstance().getRequest(request_id.intValue());
final Iterator iter = (ri == null) ? new ArrayList().iterator() :
ri.getQueries();
@@ -483,7 +483,7 @@ public class Dispatcher extends BebopMapDispatcher {
public TableModel makeModel(Table t, PageState s) {
return new TableModel() {
ListIterator iter =
- WebDevSupport.getInstance().getRequestsReverse();
+ WebDevSupportListener.getInstance().getRequestsReverse();
private RequestInfo current = null;
public int getColumnCount() {
@@ -568,7 +568,7 @@ public class Dispatcher extends BebopMapDispatcher {
public void generateXML(PageState state, Element parent) {
Integer request_id = (Integer)state.getValue(m_request_id);
RequestInfo ri =
- WebDevSupport.getInstance().getRequest(request_id.intValue());
+ WebDevSupportListener.getInstance().getRequest(request_id.intValue());
if (ri != null) {
Container param_list;
Container form_list;
@@ -679,7 +679,7 @@ public class Dispatcher extends BebopMapDispatcher {
Integer request_id = (Integer)state.getValue(m_query_request_id);
Integer query_id = (Integer)state.getValue(m_query_id);
RequestInfo ri =
- WebDevSupport.getInstance().getRequest(request_id.intValue());
+ WebDevSupportListener.getInstance().getRequest(request_id.intValue());
if (ri != null) {
QueryInfo qi = ri.getQuery(query_id.intValue());
if (qi != null) {
diff --git a/ccm-core/src/com/arsdigita/webdevsupport/QueryLog.java b/ccm-core/src/com/arsdigita/webdevsupport/QueryLog.java
index ad33e7627..c5fb6b5be 100755
--- a/ccm-core/src/com/arsdigita/webdevsupport/QueryLog.java
+++ b/ccm-core/src/com/arsdigita/webdevsupport/QueryLog.java
@@ -69,7 +69,7 @@ public class QueryLog implements com.arsdigita.dispatcher.Dispatcher {
Integer request_id = (Integer)m_request_id.transformValue(req);
Integer query_id = (Integer)m_query_id.transformValue(req);
RequestInfo ri =
- WebDevSupport.getInstance().getRequest(request_id.intValue());
+ WebDevSupportListener.getInstance().getRequest(request_id.intValue());
final Iterator iter = (ri == null) ? new ArrayList().iterator() :
ri.getQueries();
diff --git a/ccm-core/src/com/arsdigita/webdevsupport/QueryPlanComponent.java b/ccm-core/src/com/arsdigita/webdevsupport/QueryPlanComponent.java
index 21477f02e..1d67bb714 100755
--- a/ccm-core/src/com/arsdigita/webdevsupport/QueryPlanComponent.java
+++ b/ccm-core/src/com/arsdigita/webdevsupport/QueryPlanComponent.java
@@ -261,7 +261,7 @@ class QueryPlanComponent extends com.arsdigita.bebop.SimpleContainer {
Integer request_id = (Integer) s.getValue(m_request_id);
Integer query_id = (Integer) s.getValue(m_query_id);
- RequestInfo ri = WebDevSupport.getInstance().getRequest(
+ RequestInfo ri = WebDevSupportListener.getInstance().getRequest(
request_id.intValue()
);
if (ri != null) {
@@ -277,7 +277,7 @@ class QueryPlanComponent extends com.arsdigita.bebop.SimpleContainer {
Integer request_id = (Integer) s.getValue(m_request_id);
Integer query_id = (Integer) s.getValue(m_query_id);
- RequestInfo ri = WebDevSupport.getInstance().getRequest(
+ RequestInfo ri = WebDevSupportListener.getInstance().getRequest(
request_id.intValue()
);
if (ri != null) {
@@ -294,7 +294,7 @@ class QueryPlanComponent extends com.arsdigita.bebop.SimpleContainer {
Integer request_id = (Integer) s.getValue(m_request_id);
Integer query_id = (Integer) s.getValue(m_query_id);
RequestInfo ri =
- WebDevSupport.getInstance().getRequest(request_id.intValue());
+ WebDevSupportListener.getInstance().getRequest(request_id.intValue());
if (ri != null) {
QueryInfo qi = ri.getQuery(query_id.intValue());
if (qi != null) {
diff --git a/ccm-core/src/com/arsdigita/webdevsupport/WebDevSupport.java b/ccm-core/src/com/arsdigita/webdevsupport/WebDevSupport.java
index 50d7d2c2f..98ce825b2 100755
--- a/ccm-core/src/com/arsdigita/webdevsupport/WebDevSupport.java
+++ b/ccm-core/src/com/arsdigita/webdevsupport/WebDevSupport.java
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
+ * Copyright (C) 2010 Peter Boy All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@@ -16,224 +16,55 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
+
package com.arsdigita.webdevsupport;
-import com.arsdigita.developersupport.DeveloperSupportListener;
-import com.arsdigita.dispatcher.RequestEvent;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.ListIterator;
+import com.arsdigita.domain.DataObjectNotFoundException;
+import com.arsdigita.persistence.DataObject;
+import com.arsdigita.persistence.OID;
+import com.arsdigita.web.Application;
import org.apache.log4j.Logger;
-
-
/**
- * WebDevSupport
- * DeveloperSupportListener for Web Development Support package.
- *
- *
- *
- * @author Joseph A. Bank (jbank@alum.mit.edu)
- * @version 1.0
- **/
-public class WebDevSupport extends DeveloperSupportListener {
- public static final String versionId = "$Id: WebDevSupport.java 1460 2007-03-02 14:36:38Z sskracic $ by $Author: sskracic $, $DateTime: 2004/08/16 18:10:38 $";
+ * Site wide Web Developer Support application domain base class simply provides
+ * the infrastructure to load the application type and application instance.
+ *
+ * Currently a trivial subclass of com.arsdigita.web.Application
+ * @see com.arsdigita.web.Application
+ *
+ * @author pb
+ * @version $Id: WebDevSupport.java $
+ */
+public class WebDevSupport extends Application {
- private static final Logger s_log =
- Logger.getLogger( WebDevSupport.class );
+ /** Private logger instance to faciliate debugging procedures */
+ private static final Logger s_log = Logger.getLogger(WebDevSupport.class);
- private static WebDevSupport s_instance;
- public static synchronized WebDevSupport getInstance() {
- if (s_instance == null) {
- s_instance = new WebDevSupport();
- }
- return s_instance;
+
+ // pdl stuff (constants)
+ /** */
+ public static final String BASE_DATA_OBJECT_TYPE =
+ "com.arsdigita.webdevsupport.WebDevSupport";
+
+ public WebDevSupport(DataObject obj) {
+ super(obj);
}
- private WebDevSupport() {
- //empty for now
- }
+ public WebDevSupport(OID oid)
+ throws DataObjectNotFoundException {
- private static int s_max_requests = 100;
- public void setMaxRequests(int max_requests) {
- s_max_requests = max_requests;
- }
-
- public int getMaxRequests() {
- return s_max_requests;
- }
-
- //We store a HashTable that maps Threads to their most recent
- //request object. This gets cleaned up when requests end
- private HashMap m_threadRequestMap = new HashMap();
- private ArrayList m_requests = new ArrayList();
-
- private synchronized void registerNewRequest(RequestInfo ri) {
- m_threadRequestMap.put(Thread.currentThread(), ri);
- m_requests.add(ri);
- if (s_max_requests != -1) {
- int to_remove = m_requests.size() - s_max_requests;
- //this is kindof expensive, but usually just one at a time
- for (int i = 0; i
+ *
+ *
+ * @author Joseph A. Bank (jbank@alum.mit.edu)
+ * @version 1.0
+ * @version $Id: WebDevSupportListener.java 1460 2007-03-02 14:36:38Z sskracic $
+ */
+public class WebDevSupportListener extends DeveloperSupportListener {
+
+ private static final Logger s_log =
+ Logger.getLogger( WebDevSupportListener.class );
+
+ private static WebDevSupportListener s_instance;
+ public static synchronized WebDevSupportListener getInstance() {
+ if (s_instance == null) {
+ s_instance = new WebDevSupportListener();
+ }
+ return s_instance;
+ }
+
+ private WebDevSupportListener() {
+ //empty for now
+ }
+
+ private static int s_max_requests = 100;
+ public void setMaxRequests(int max_requests) {
+ s_max_requests = max_requests;
+ }
+
+ public int getMaxRequests() {
+ return s_max_requests;
+ }
+
+ //We store a HashTable that maps Threads to their most recent
+ //request object. This gets cleaned up when requests end
+ private HashMap m_threadRequestMap = new HashMap();
+ private ArrayList m_requests = new ArrayList();
+
+ private synchronized void registerNewRequest(RequestInfo ri) {
+ m_threadRequestMap.put(Thread.currentThread(), ri);
+ m_requests.add(ri);
+ if (s_max_requests != -1) {
+ int to_remove = m_requests.size() - s_max_requests;
+ //this is kindof expensive, but usually just one at a time
+ for (int i = 0; i
-
+
diff --git a/ccm-portalworkspace/web/templates/ccm-portalworkspace/index.jsp b/ccm-portalworkspace/web/templates/ccm-portalworkspace/index.jsp
index 7b0aaebb0..55087a451 100755
--- a/ccm-portalworkspace/web/templates/ccm-portalworkspace/index.jsp
+++ b/ccm-portalworkspace/web/templates/ccm-portalworkspace/index.jsp
@@ -21,14 +21,14 @@
viewWorkspace.addRequestListener(
new ApplicationAuthenticationListener(PrivilegeDescriptor.READ));
}
-
+
-
-
+
((AbstractWorkspaceComponent) view).setWorkspaceModel(
new DefaultWorkspaceSelectionModel());
-
+