You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by st...@apache.org on 2004/10/19 17:16:07 UTC

svn commit: rev 55067 - in incubator/jackrabbit/trunk/src: conf java/org/apache/jackrabbit/core java/org/apache/jackrabbit/core/config test/org/apache/jackrabbit/test

Author: stefan
Date: Tue Oct 19 08:16:07 2004
New Revision: 55067

Modified:
   incubator/jackrabbit/trunk/src/conf/repository.xml
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java
   incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/config/config.dtd
   incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/JackrabbitRepositoryStub.java
Log:
- adding shutdown hook that shuts down the repository gracefully
- adding inline dtd to repository.xml

Modified: incubator/jackrabbit/trunk/src/conf/repository.xml
==============================================================================
--- incubator/jackrabbit/trunk/src/conf/repository.xml	(original)
+++ incubator/jackrabbit/trunk/src/conf/repository.xml	Tue Oct 19 08:16:07 2004
@@ -1,17 +1,96 @@
 <?xml version="1.0" encoding="ISO-8859-1"?>
 <!-- <!DOCTYPE Repository PUBLIC "-//The Apache Software Foundation//DTD Repository//EN" "file://config.dtd"> -->
+<!DOCTYPE Repository [
+    <!--
+        the Repository element configures a repository instance;
+        individual workspaces of the repository are configured through
+        separate configuration files called workspace.xml which are
+        located in a subfolder of the workspaces root directory
+        (see Workspaces element).
+
+        it consists of
+
+            a FileSystem element (the virtual file system
+            used by the repository to persist global state such as
+            registered namespaces, custom node types, etc..
+
+            a Workspaces element that specifies to the location of
+            workspaces root directory and the name of default workspace
+
+            a Workspace element that is used as a workspace configuration
+            template; it is used to create the initial workspace if there's
+            no workspace yet and for creating additional workspaces through
+            the api
+    -->
+    <!ELEMENT Repository (FileSystem,Workspaces,Workspace)>
+
+    <!--
+        a virtual file system
+    -->
+    <!ELEMENT FileSystem (param*)>
+    <!ATTLIST FileSystem
+      class CDATA #REQUIRED>
+
+    <!--
+        generic parameter (name/value pair)
+    -->
+    <!ELEMENT param EMPTY>
+    <!ATTLIST param
+      name CDATA #REQUIRED
+      value CDATA #REQUIRED>
+
+    <!--
+        the Workspaces element specifies the workspaces root directory
+        (rootPath attribute) and the name of the default workspace
+        (defaultWorkspace attribute).
+
+        individual workspaces are configured through individual workspace.xml
+        files located in a subfolder each of the workspaces root directory.
+    -->
+    <!ELEMENT Workspaces EMPTY>
+    <!ATTLIST Workspaces
+      rootPath CDATA #REQUIRED
+      defaultWorkspace CDATA #REQUIRED>
+
+    <!--
+        the Workspace element serves as a workspace configuration template;
+        it is used to create the initial workspace if there's no workspace yet
+        and for creating additional workspaces through the api
+    -->
+    <!ELEMENT Workspace (FileSystem,PersistenceManager,SearchIndex)>
+    <!ATTLIST Workspace
+      name CDATA #REQUIRED>
+
+    <!--
+        the PersistenceManager element configures the persistence manager
+        to be used for the workspace; the class attribute specifies the
+        FQN of the class implementing PersistenceManager interface
+    -->
+    <!ELEMENT PersistenceManager (param*)>
+    <!ATTLIST PersistenceManager
+      class CDATA #REQUIRED>
+
+    <!--
+        the SearchIndex element specifies the locaction of the search index
+        (used by the QueryManager)
+    -->
+    <!ELEMENT SearchIndex EMPTY>
+    <!ATTLIST SearchIndex
+      path CDATA #REQUIRED>
+]>
+<!-- Example Repository Configuration File -->
 <Repository>
     <!--
         virtual file system where the repository stores global state
         (e.g. registered namespaces, custom node types, etc.)
     -->
     <FileSystem class="org.apache.jackrabbit.core.fs.local.LocalFileSystem">
-    	<param name="path" value="${rep.home}/repository"/>
+        <param name="path" value="${rep.home}/repository"/>
     </FileSystem>
     <!--
         location of workspaces root directory and name of default workspace
     -->
-    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default" />
+    <Workspaces rootPath="${rep.home}/workspaces" defaultWorkspace="default"/>
     <!--
         workspace configuration template:
         used to create the initial workspace if there's no workspace yet
@@ -25,7 +104,7 @@
             <param name="path" value="${wsp.home}"/>
         </FileSystem>
         <!--
-            persistence of the workspace:
+            persistence manager of the workspace:
             class: FQN of class implementing PersistenceManager interface
         -->
         <PersistenceManager class="org.apache.jackrabbit.core.state.xml.XMLPersistenceManager">

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/RepositoryImpl.java	Tue Oct 19 08:16:07 2004
@@ -66,6 +66,7 @@
     public static final String STATS_PROP_COUNT_PROPERTY = "jcr.repository.stats.properties.count";
 
     // pre-defined values of well known repository properties
+    // @todo update as necessary
     private static final String SPEC_VERSION = "0.14";
     private static final String SPEC_NAME = "Content Repository API for Java(TM) Technology Specification";
     private static final String REP_VENDOR = "Apache Software Foundation";
@@ -117,6 +118,9 @@
     private long nodesCount = 0;
     private long propsCount = 0;
 
+    // flag indicating if respository has been shut down
+    private boolean disposed = false;
+
     /**
      * private constructor
      *
@@ -309,6 +313,13 @@
                         "/", true, null, null, false);
             }
         }
+
+        // finally register shutdown hook
+        Runtime.getRuntime().addShutdownHook(new Thread() {
+            public void run() {
+                shutdown();
+            }
+        });
     }
 
     /**
@@ -326,27 +337,57 @@
     }
 
     RepositoryConfig getConfig() {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         return repConfig;
     }
 
     NamespaceRegistryImpl getNamespaceRegistry() {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         return nsReg;
     }
 
     NodeTypeRegistry getNodeTypeRegistry() {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         return ntReg;
     }
 
     VersionManager getVersionManager() {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         return vMgr;
     }
 
     String getRootNodeUUID() {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         return rootNodeUUID;
     }
 
     synchronized PersistentItemStateManager getWorkspaceStateManager(String workspaceName)
             throws NoSuchWorkspaceException, RepositoryException {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         WorkspaceConfig wspConfig = (WorkspaceConfig) wspConfigs.get(workspaceName);
         if (wspConfig == null) {
             throw new NoSuchWorkspaceException(workspaceName);
@@ -370,6 +411,11 @@
 
     synchronized ReferenceManager getWorkspaceReferenceManager(String workspaceName)
             throws NoSuchWorkspaceException, RepositoryException {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         WorkspaceConfig wspConfig = (WorkspaceConfig) wspConfigs.get(workspaceName);
         if (wspConfig == null) {
             throw new NoSuchWorkspaceException(workspaceName);
@@ -387,6 +433,11 @@
 
     synchronized ObservationManagerFactory getObservationManagerFactory(String workspaceName)
             throws NoSuchWorkspaceException {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         if (!wspConfigs.containsKey(workspaceName)) {
             throw new NoSuchWorkspaceException(workspaceName);
         }
@@ -414,6 +465,11 @@
      */
     synchronized SearchManager getSearchManager(String workspaceName)
             throws NoSuchWorkspaceException, RepositoryException {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         WorkspaceConfig wspConfig = (WorkspaceConfig) wspConfigs.get(workspaceName);
         SearchManager searchMgr
                 = (SearchManager) wspSearchMgrs.get(workspaceName);
@@ -437,6 +493,11 @@
 
     synchronized SystemSession getSystemSession(String workspaceName)
             throws NoSuchWorkspaceException, RepositoryException {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         WorkspaceConfig wspConfig = (WorkspaceConfig) wspConfigs.get(workspaceName);
         if (wspConfig == null) {
             throw new NoSuchWorkspaceException(workspaceName);
@@ -451,9 +512,18 @@
     }
 
     /**
-     * Shuts down this repository
+     * Shuts down this repository. Note that this method is called automatically
+     * through a shutdown hook.
+     *
+     * @see Runtime#addShutdownHook(Thread)
      */
-    protected void shutdown() {
+    protected synchronized void shutdown() {
+        // check state
+        if (disposed) {
+            // there's nothing to do here because the repository has already been shut down
+            return;
+        }
+
         // persist repository properties
         try {
             storeRepProps();
@@ -483,6 +553,9 @@
         } catch (FileSystemException e) {
             log.error("Error while closing filesystem", e);
         }
+
+        // make sure this instance is not used anymore
+        disposed = true;
     }
 
     private void loadRepProps() throws RepositoryException {
@@ -541,6 +614,11 @@
      * @return
      */
     public Properties getProperties() {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         return (Properties) repProps.clone();
     }
 
@@ -549,6 +627,11 @@
      * @return
      */
     public String getProperty(String key) {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         return repProps.getProperty(key);
     }
 
@@ -560,6 +643,11 @@
      * @throws RepositoryException
      */
     public NodeImpl getSystemRootNode(SessionImpl session) throws RepositoryException {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         return ((NodeImpl) session.getRootNode()).getNode(SYSTEM_ROOT_NAME);
     }
 
@@ -569,6 +657,11 @@
      */
     public Session login(Credentials credentials, String workspaceName)
             throws LoginException, NoSuchWorkspaceException, RepositoryException {
+        // check state
+        if (disposed) {
+            throw new IllegalStateException("repository instance has been shut down");
+        }
+
         if (workspaceName == null) {
             workspaceName = repConfig.getDefaultWorkspaceName();
         }
@@ -591,11 +684,17 @@
         }
     }
 
-    //-----------------------------------------------------------< Repository >
+    //--------------------------------------------------------< EventListener >
     /**
      * @see EventListener#onEvent(EventIterator)
      */
     public synchronized void onEvent(EventIterator events) {
+        // check state
+        if (disposed) {
+            // ignore, repository instance has been shut down
+            return;
+        }
+
         while (events.hasNext()) {
             Event event = events.nextEvent();
             long type = event.getType();

Modified: incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/config/config.dtd
==============================================================================
--- incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/config/config.dtd	(original)
+++ incubator/jackrabbit/trunk/src/java/org/apache/jackrabbit/core/config/config.dtd	Tue Oct 19 08:16:07 2004
@@ -15,37 +15,79 @@
  * limitations under the License.
  */
 -->
-<!-- -->
-<!ELEMENT Repository (FileSystem)>
-
-<!-- -->
+<!--
+    the Repository element configures a repository instance;
+    individual workspaces of the repository are configured through
+    separate configuration files called workspace.xml which are
+    located in a subfolder of the workspaces root directory
+    (see Workspaces element).
+
+    it consists of
+
+        a FileSystem element (the virtual file system
+        used by the repository to persist global state such as
+        registered namespaces, custom node types, etc..
+
+        a Workspaces element that specifies to the location of
+        workspaces root directory and the name of default workspace
+
+        a Workspace element that is used as a workspace configuration
+        template; it is used to create the initial workspace if there's
+        no workspace yet and for creating additional workspaces through
+        the api
+-->
+<!ELEMENT Repository (FileSystem,Workspaces,Workspace)>
+
+<!--
+    a virtual file system
+-->
 <!ELEMENT FileSystem (param*)>
 <!ATTLIST FileSystem
   class CDATA #REQUIRED>
 
-<!-- -->
+<!--
+    generic parameter (name/value pair)
+-->
 <!ELEMENT param EMPTY>
 <!ATTLIST param
   name CDATA #REQUIRED
   value CDATA #REQUIRED>
 
-<!-- -->
+<!--
+    the Workspaces element specifies the workspaces root directory
+    (rootPath attribute) and the name of the default workspace
+    (defaultWorkspace attribute).
+
+    individual workspaces are configured through individual workspace.xml
+    files located in a subfolder each of the workspaces root directory.
+-->
 <!ELEMENT Workspaces EMPTY>
 <!ATTLIST Workspaces
   rootPath CDATA #REQUIRED
-  name CDATA #REQUIRED>
+  defaultWorkspace CDATA #REQUIRED>
 
-<!-- -->
-<!ELEMENT Workspace (FileSystem,PersistenceManager)>
+<!--
+    the Workspace element serves as a workspace configuration template;
+    it is used to create the initial workspace if there's no workspace yet
+    and for creating additional workspaces through the api
+-->
+<!ELEMENT Workspace (FileSystem,PersistenceManager,SearchIndex)>
 <!ATTLIST Workspace
   name CDATA #REQUIRED>
 
-<!-- -->
+<!--
+    the PersistenceManager element configures the persistence manager
+    to be used for the workspace; the class attribute specifies the
+    FQN of the class implementing PersistenceManager interface
+-->
 <!ELEMENT PersistenceManager (param*)>
 <!ATTLIST PersistenceManager
   class CDATA #REQUIRED>
 
-<!-- -->
+<!--
+    the SearchIndex element specifies the locaction of the search index
+    (used by the QueryManager)
+-->
 <!ELEMENT SearchIndex EMPTY>
 <!ATTLIST SearchIndex
   path CDATA #REQUIRED>

Modified: incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/JackrabbitRepositoryStub.java
==============================================================================
--- incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/JackrabbitRepositoryStub.java	(original)
+++ incubator/jackrabbit/trunk/src/test/org/apache/jackrabbit/test/JackrabbitRepositoryStub.java	Tue Oct 19 08:16:07 2004
@@ -81,13 +81,6 @@
                 RegistryHelper.registerRepository(ctx, repName, repConfig, repHome, true);
                 repository = (Repository) ctx.lookup(repName);
 */
-/*
-                Runtime.getRuntime().addShutdownHook(new Thread() {
-                    public void run() {
-                        repository.shutdown();
-                    }
-                });
-*/
             } catch (Exception e) {
                 throw new RepositoryStubException(e.toString());
             }