Installation developerSupport umgestellt von package-based auf (legacy-compatible) web.Application based, Voraussetzung für Umstellung auf legacy free application. Update Skript im Moment noch nicht erforderlich. Ansonsten verschiedene Formatierungen, Kleinigkeiten, etc.
git-svn-id: https://svn.libreccm.org/ccm/trunk@1511 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
16fedf169b
commit
f459b079b9
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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 <pboy@barkhof.uni-bremen.de>
|
||||
* @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:
|
||||
* <pre>
|
||||
* <dispatcher-configuration>
|
||||
* <url-mapping
|
||||
* <url>my-page</url>
|
||||
* OR <page-class>com.arsdigita.Page.class</page-class>
|
||||
* <url-mapping
|
||||
* </dispatcher-configuration>
|
||||
* </pre>
|
||||
*/
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,28 @@
|
|||
//
|
||||
// Copyright (C) 2011 Peter Boy <pb@zes.uni-bremen.de> 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);
|
||||
}
|
||||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -1,135 +0,0 @@
|
|||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* The value of this class lies in its fairly unpredictable call tree.
|
||||
*
|
||||
* <p>This program expects sequences of 0 and 1 as input. Each such sequence is
|
||||
* reduced by the application of the rules:</p>
|
||||
*
|
||||
* <pre>
|
||||
* Rule 1. 0xyS --> S00
|
||||
* Rule 2. 1xyS --> S1101
|
||||
* </pre>
|
||||
*
|
||||
* <p>where <code>x</code> and <code>y</code> can be any binary digit, and
|
||||
* <code>S</code> any binary sequence, including the empty sequence.</p>
|
||||
*
|
||||
* <p>For example, <code>01011</code> reduces as follows</p>
|
||||
*
|
||||
* <pre>
|
||||
* 01011 --> 1100 --> 01101 --> 0100 --> 000
|
||||
* rule1 rule2 rule1 rule1
|
||||
* </pre>
|
||||
*
|
||||
* <p>Some sequences don't a finite reduction chain. For example,
|
||||
* <code>1001</code> loops indefinitely.</p>
|
||||
*
|
||||
* <p>Usage:</p>
|
||||
*
|
||||
* <pre>
|
||||
* $ java PNSystem 0101 01010
|
||||
* </pre>
|
||||
*
|
||||
*
|
||||
* @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<args.length; ii++) {
|
||||
Thread tt = new Thread(new PNSystem(args[ii]));
|
||||
tt.setName("thread" + ii);
|
||||
tt.start();
|
||||
}
|
||||
}
|
||||
|
||||
private static void log(String str) {
|
||||
System.out.println(str);
|
||||
}
|
||||
|
||||
private static void usage() {
|
||||
log("Usage:");
|
||||
log(" java PNSystem [arg1 [arg2 ...]]");
|
||||
log("Example:");
|
||||
log(" java PNSystem 1000100101 0111");
|
||||
}
|
||||
|
||||
public void run() {
|
||||
if ( checksOutOK() ) {
|
||||
try {
|
||||
log(Thread.currentThread().getName() + ": " +
|
||||
m_input + " --> " + 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");
|
||||
}
|
||||
}
|
||||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
||||
* Copyright (C) 2010 Peter Boy <pb@zes.uni-bremen.de> 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.
|
||||
* <p>
|
||||
* Site wide Web Developer Support application domain base class simply provides
|
||||
* the infrastructure to load the application type and application instance.
|
||||
*
|
||||
* </p>
|
||||
* @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 $";
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
private WebDevSupport() {
|
||||
//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<to_remove; i++) {
|
||||
m_requests.remove(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
synchronized void clearRequestHistory() {
|
||||
m_requests.clear();
|
||||
}
|
||||
|
||||
private RequestInfo getCurrentRequest() {
|
||||
return (RequestInfo)m_threadRequestMap.get(Thread.currentThread());
|
||||
}
|
||||
|
||||
private synchronized void unRegisterRequest() {
|
||||
m_threadRequestMap.remove(Thread.currentThread());
|
||||
}
|
||||
|
||||
public ListIterator getRequestsReverse() {
|
||||
//need to copy the requests to allow the iterator
|
||||
//to work in spite of concurrent modifications
|
||||
ArrayList lst = (ArrayList)m_requests.clone();
|
||||
return lst.listIterator(lst.size());
|
||||
}
|
||||
|
||||
public ListIterator getRequests() {
|
||||
//need to copy the requests to allow the iterator
|
||||
//to work in spite of concurrent modifications
|
||||
ArrayList lst = (ArrayList)m_requests.clone();
|
||||
return lst.listIterator();
|
||||
}
|
||||
|
||||
public RequestInfo getRequest(int id) {
|
||||
Iterator iter = m_requests.iterator();
|
||||
while (iter.hasNext()) {
|
||||
RequestInfo ri = (RequestInfo)iter.next();
|
||||
if (ri.getID() == id) {
|
||||
return ri;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* requestStart
|
||||
* Callback indicating a new request has started.
|
||||
* Request is an opaque pointer for now for linkage purposes (don't want
|
||||
* to have dependencies on the dispatcher here) and for making this
|
||||
* infrastructure more general.
|
||||
* Currently a trivial subclass of com.arsdigita.web.Application
|
||||
* @see com.arsdigita.web.Application
|
||||
*
|
||||
* @author pb
|
||||
* @version $Id: WebDevSupport.java $
|
||||
*/
|
||||
public void requestStart(Object request) {
|
||||
if (request instanceof RequestEvent && getCurrentRequest() == null) {
|
||||
registerNewRequest(new RequestInfo((RequestEvent)request));
|
||||
public class WebDevSupport extends Application {
|
||||
|
||||
/** Private logger instance to faciliate debugging procedures */
|
||||
private static final Logger s_log = Logger.getLogger(WebDevSupport.class);
|
||||
|
||||
|
||||
// pdl stuff (constants)
|
||||
/** */
|
||||
public static final String BASE_DATA_OBJECT_TYPE =
|
||||
"com.arsdigita.webdevsupport.WebDevSupport";
|
||||
|
||||
public WebDevSupport(DataObject obj) {
|
||||
super(obj);
|
||||
}
|
||||
|
||||
public WebDevSupport(OID oid)
|
||||
throws DataObjectNotFoundException {
|
||||
|
||||
super(oid);
|
||||
}
|
||||
|
||||
/**
|
||||
* requestAddProperty
|
||||
* Add a new property about this request.
|
||||
* Getter to retrieve the base database object type name
|
||||
*
|
||||
* @return base data aoject type as String
|
||||
*/
|
||||
public void requestAddProperty(Object request, String property, Object value) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.addProperty(property, value);
|
||||
}
|
||||
@Override
|
||||
protected String getBaseDataObjectType() {
|
||||
return BASE_DATA_OBJECT_TYPE;
|
||||
}
|
||||
|
||||
/**
|
||||
* requestEnd
|
||||
* Callback indicating the request ended
|
||||
*/
|
||||
public void requestEnd(Object request) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.finish();
|
||||
}
|
||||
unRegisterRequest();
|
||||
}
|
||||
|
||||
/**
|
||||
* logQuery
|
||||
* Callback logging a database query
|
||||
*/
|
||||
public void logQuery(String connection_id,
|
||||
String type,
|
||||
String query,
|
||||
HashMap bindvars,
|
||||
long time,
|
||||
java.sql.SQLException sqle) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.logQuery(new QueryInfo(ri.numQueries()+1,
|
||||
connection_id,
|
||||
type,
|
||||
query,
|
||||
bindvars,
|
||||
time,
|
||||
sqle));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* logQuery
|
||||
* Callback logging a database query
|
||||
*/
|
||||
public void logQueryCompletion(String connection_id,
|
||||
String type,
|
||||
String query,
|
||||
HashMap bindvars,
|
||||
long time,
|
||||
long totaltime,
|
||||
java.sql.SQLException sqle) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
QueryInfo qi = ri.findQuery(connection_id, type, query, bindvars, time);
|
||||
if (qi == null) {
|
||||
s_log.warn("Could not find query: " + query + "\nBinds: " + bindvars);
|
||||
} else {
|
||||
qi.setCompletion(totaltime, sqle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* logComment
|
||||
* Log a generic comment
|
||||
*/
|
||||
public void logComment(String comment) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.logComment(comment);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* startStage
|
||||
* Callback indicating a new stage has started.
|
||||
* Stages can be used to log help mark the time
|
||||
* taken to perform various parts of requests.
|
||||
*/
|
||||
public void startStage(String stagename) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.startStage(stagename);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* endStage
|
||||
* Callback indicating a stage has ended.
|
||||
* Stages can be used to log help mark the time
|
||||
* taken to perform various parts of requests.
|
||||
*/
|
||||
public void endStage(String stagename) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.endStage(stagename);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,247 @@
|
|||
/*
|
||||
* Copyright (C) 2001-2004 Red Hat Inc. 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.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 org.apache.log4j.Logger;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* WebDevSupportListener
|
||||
* DeveloperSupportListener for Web Development Support package.
|
||||
* <p>
|
||||
*
|
||||
* </p>
|
||||
* @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<to_remove; i++) {
|
||||
m_requests.remove(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
synchronized void clearRequestHistory() {
|
||||
m_requests.clear();
|
||||
}
|
||||
|
||||
private RequestInfo getCurrentRequest() {
|
||||
return (RequestInfo)m_threadRequestMap.get(Thread.currentThread());
|
||||
}
|
||||
|
||||
private synchronized void unRegisterRequest() {
|
||||
m_threadRequestMap.remove(Thread.currentThread());
|
||||
}
|
||||
|
||||
public ListIterator getRequestsReverse() {
|
||||
//need to copy the requests to allow the iterator
|
||||
//to work in spite of concurrent modifications
|
||||
ArrayList lst = (ArrayList)m_requests.clone();
|
||||
return lst.listIterator(lst.size());
|
||||
}
|
||||
|
||||
public ListIterator getRequests() {
|
||||
//need to copy the requests to allow the iterator
|
||||
//to work in spite of concurrent modifications
|
||||
ArrayList lst = (ArrayList)m_requests.clone();
|
||||
return lst.listIterator();
|
||||
}
|
||||
|
||||
public RequestInfo getRequest(int id) {
|
||||
Iterator iter = m_requests.iterator();
|
||||
while (iter.hasNext()) {
|
||||
RequestInfo ri = (RequestInfo)iter.next();
|
||||
if (ri.getID() == id) {
|
||||
return ri;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* requestStart
|
||||
* Callback indicating a new request has started.
|
||||
* Request is an opaque pointer for now for linkage purposes (don't want
|
||||
* to have dependencies on the dispatcher here) and for making this
|
||||
* infrastructure more general.
|
||||
*/
|
||||
@Override
|
||||
public void requestStart(Object request) {
|
||||
if (request instanceof RequestEvent && getCurrentRequest() == null) {
|
||||
registerNewRequest(new RequestInfo((RequestEvent)request));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* requestAddProperty
|
||||
* Add a new property about this request.
|
||||
*/
|
||||
@Override
|
||||
public void requestAddProperty(Object request, String property, Object value) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.addProperty(property, value);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* requestEnd
|
||||
* Callback indicating the request ended
|
||||
*/
|
||||
@Override
|
||||
public void requestEnd(Object request) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.finish();
|
||||
}
|
||||
unRegisterRequest();
|
||||
}
|
||||
|
||||
/**
|
||||
* logQuery
|
||||
* Callback logging a database query
|
||||
*/
|
||||
@Override
|
||||
public void logQuery(String connection_id,
|
||||
String type,
|
||||
String query,
|
||||
HashMap bindvars,
|
||||
long time,
|
||||
java.sql.SQLException sqle) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.logQuery(new QueryInfo(ri.numQueries()+1,
|
||||
connection_id,
|
||||
type,
|
||||
query,
|
||||
bindvars,
|
||||
time,
|
||||
sqle));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* logQuery
|
||||
* Callback logging a database query
|
||||
*/
|
||||
@Override
|
||||
public void logQueryCompletion(String connection_id,
|
||||
String type,
|
||||
String query,
|
||||
HashMap bindvars,
|
||||
long time,
|
||||
long totaltime,
|
||||
java.sql.SQLException sqle) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
QueryInfo qi = ri.findQuery(connection_id, type, query, bindvars, time);
|
||||
if (qi == null) {
|
||||
s_log.warn("Could not find query: " + query + "\nBinds: " + bindvars);
|
||||
} else {
|
||||
qi.setCompletion(totaltime, sqle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* logComment
|
||||
* Log a generic comment
|
||||
*/
|
||||
@Override
|
||||
public void logComment(String comment) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.logComment(comment);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* startStage
|
||||
* Callback indicating a new stage has started.
|
||||
* Stages can be used to log help mark the time
|
||||
* taken to perform various parts of requests.
|
||||
*/
|
||||
@Override
|
||||
public void startStage(String stagename) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.startStage(stagename);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* endStage
|
||||
* Callback indicating a stage has ended.
|
||||
* Stages can be used to log help mark the time
|
||||
* taken to perform various parts of requests.
|
||||
*/
|
||||
@Override
|
||||
public void endStage(String stagename) {
|
||||
RequestInfo ri = getCurrentRequest();
|
||||
if (ri != null) {
|
||||
ri.endStage(stagename);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -19,23 +19,11 @@
|
|||
package com.arsdigita.docrepo;
|
||||
|
||||
|
||||
//import com.arsdigita.web.Web;
|
||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||
//import com.arsdigita.domain.DomainObjectFactory;
|
||||
import com.arsdigita.domain.DomainObject;
|
||||
//import com.arsdigita.kernel.Kernel;
|
||||
import com.arsdigita.db.Sequences;
|
||||
//import com.arsdigita.kernel.KernelExcursion;
|
||||
//import com.arsdigita.persistence.DataCollection;
|
||||
import com.arsdigita.persistence.DataObject;
|
||||
//import com.arsdigita.persistence.DataOperation;
|
||||
//import com.arsdigita.persistence.DataQuery;
|
||||
//import com.arsdigita.persistence.Filter;
|
||||
import com.arsdigita.persistence.OID;
|
||||
//import com.arsdigita.persistence.PersistenceException;
|
||||
//import com.arsdigita.persistence.Session;
|
||||
//import com.arsdigita.persistence.SessionManager;
|
||||
//import com.arsdigita.persistence.metadata.ObjectType;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
|
|
|
|||
|
|
@ -19,8 +19,34 @@
|
|||
|
||||
package com.arsdigita.docrepo;
|
||||
|
||||
import com.arsdigita.bebop.ActionLink;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.TabbedPane;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.bebop.event.PrintEvent;
|
||||
import com.arsdigita.bebop.event.PrintListener;
|
||||
import com.arsdigita.bebop.page.BebopApplicationServlet;
|
||||
import com.arsdigita.bebop.page.BebopMapDispatcher;
|
||||
import com.arsdigita.dispatcher.DispatcherHelper;
|
||||
import com.arsdigita.dispatcher.ObjectNotFoundException;
|
||||
import com.arsdigita.dispatcher.RequestContext;
|
||||
import com.arsdigita.docrepo.File;
|
||||
import com.arsdigita.kernel.permissions.PrivilegeDescriptor;
|
||||
import com.arsdigita.domain.DataObjectNotFoundException;
|
||||
import com.arsdigita.web.Web;
|
||||
import com.arsdigita.persistence.Session;
|
||||
import com.arsdigita.persistence.SessionManager;
|
||||
import com.arsdigita.persistence.DataQuery;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import org.apache.log4j.Category;
|
||||
|
||||
import java.io.*;
|
||||
import java.math.BigDecimal;
|
||||
|
||||
import javax.servlet.ServletException;
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
/**
|
||||
|
|
@ -32,4 +58,30 @@ public class RepositoryServlet extends BebopApplicationServlet {
|
|||
/** Private logger instance to faciliate debugging procedures */
|
||||
private static final Logger s_log = Logger.getLogger(RepositoryServlet.class);
|
||||
|
||||
|
||||
/**
|
||||
* Servlet Initialisation, builds the UI elements (various panes)
|
||||
* @throws ServletException
|
||||
*/
|
||||
@Override
|
||||
public void init() throws ServletException {
|
||||
super.init();
|
||||
s_log.debug("creating DocRepo page");
|
||||
|
||||
|
||||
// Page index = buildIndexPage();
|
||||
// Page admin = buildAdminIndexPage();
|
||||
|
||||
// put("/", index);
|
||||
// put("/index.jsp", index);
|
||||
// put("/one.jsp", index);
|
||||
|
||||
// put("admin", admin);
|
||||
// put("admin/index.jsp", admin);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
xmlns:docs="http://www.redhat.com/docs/1.0"
|
||||
version="1.0">
|
||||
|
||||
<xsl:import href="../../content-section/xsl/cms.xsl"/>
|
||||
<xsl:import href="../../cms/xsl/cms.xsl"/>
|
||||
<xsl:import href="../../acs-admin/xsl/admin_en.xsl"/>
|
||||
<xsl:import href="../../categorization/xsl/categorization.xsl"/>
|
||||
<xsl:import href="../../bebop/xsl/DimensionalNavbar.xsl"/>
|
||||
|
|
|
|||
Loading…
Reference in New Issue