You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by mr...@apache.org on 2009/04/09 14:13:57 UTC

svn commit: r763617 - in /jackrabbit/trunk/jackrabbit-core/src: main/java/org/apache/jackrabbit/core/RepositoryImpl.java test/java/org/apache/jackrabbit/core/integration/RepositoryLockTest.java

Author: mreutegg
Date: Thu Apr  9 12:13:56 2009
New Revision: 763617

URL: http://svn.apache.org/viewvc?rev=763617&view=rev
Log:
JCR-2057: When creating multiple repository instances pointing to the same home, opening a second session will remove the .lock file

Added:
    jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RepositoryLockTest.java   (with props)
Modified:
    jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java

Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java?rev=763617&r1=763616&r2=763617&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/RepositoryImpl.java Thu Apr  9 12:13:56 2009
@@ -242,23 +242,26 @@
     private WorkspaceEventChannel createWorkspaceEventChannel;
 
     /**
-     * private constructor
+     * Protected constructor.
      *
-     * @param repConfig
+     * @param repConfig the repository configuration.
+     * @throws RepositoryException if there is already another repository
+     *                             instance running on the given configuration
+     *                             or another error occurs.
      */
     protected RepositoryImpl(RepositoryConfig repConfig) throws RepositoryException {
 
+        // Acquire a lock on the repository home
+        repLock = repConfig.getRepositoryLockMechanism();
+        repLock.init(repConfig.getHomeDir());
+        repLock.acquire();
+
         log.info("Starting repository...");
 
         boolean succeeded = false;
         try {
             this.repConfig = repConfig;
 
-            // Acquire a lock on the repository home
-            repLock = repConfig.getRepositoryLockMechanism();
-            repLock.init(repConfig.getHomeDir());
-            repLock.acquire();
-
             // setup file systems
             repStore = repConfig.getFileSystem();
             String fsRootPath = "/meta";

Added: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RepositoryLockTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RepositoryLockTest.java?rev=763617&view=auto
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RepositoryLockTest.java (added)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RepositoryLockTest.java Thu Apr  9 12:13:56 2009
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.core.integration;
+
+import java.io.File;
+
+import javax.jcr.RepositoryException;
+
+import org.apache.jackrabbit.core.config.RepositoryConfig;
+import org.apache.jackrabbit.core.RepositoryImpl;
+
+import junit.framework.TestCase;
+
+/**
+ * <code>RepositoryLockTest</code> checks if multiple instatiations of a
+ * repository are prevented and the repository lock file is respected (i.e. not
+ * deleted). See also JCR-2057.
+ */
+public class RepositoryLockTest extends TestCase {
+
+    private static final File TARGET = new File("target");
+
+    private static final File REPO_HOME = new File(TARGET, "repository-lock-test");
+
+    private static final File REPO_CONF = new File(new File(TARGET, "repository"), "repository.xml");
+
+    private RepositoryImpl repo;
+
+    /**
+     * Makes sure the repository is shutdown.
+     */
+    protected void tearDown() throws Exception {
+        if (repo != null) {
+            repo.shutdown();
+            repo = null;
+        }
+        super.tearDown();
+    }
+
+    public void testMultipleInstantiation() throws Exception {
+        RepositoryConfig config = RepositoryConfig.create(
+                REPO_CONF.getAbsolutePath(), REPO_HOME.getAbsolutePath());
+        repo = RepositoryImpl.create(config);
+
+        for (int i = 0; i < 3; i++) {
+            // try again
+            try {
+                repo = RepositoryImpl.create(config);
+                fail("Multiple instantiation must not be possible");
+            } catch (RepositoryException e) {
+                // expected
+            }
+            // check if lock file is still there, see JCR-2057
+            assertTrue("repository lock file deleted", new File(REPO_HOME, ".lock").exists());
+        }
+    }
+}
+
+

Propchange: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/integration/RepositoryLockTest.java
------------------------------------------------------------------------------
    svn:eol-style = native