You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicemix.apache.org by gn...@apache.org on 2008/11/06 00:44:58 UTC

svn commit: r711745 - /servicemix/smx4/kernel/trunk/main/src/main/java/org/apache/servicemix/kernel/main/SimpleFileLock.java

Author: gnodet
Date: Wed Nov  5 15:44:57 2008
New Revision: 711745

URL: http://svn.apache.org/viewvc?rev=711745&view=rev
Log:
SMX4KNL-130: Support configurable lock directory for container level locking (patch submitted by Jamie Goodyear)

Modified:
    servicemix/smx4/kernel/trunk/main/src/main/java/org/apache/servicemix/kernel/main/SimpleFileLock.java

Modified: servicemix/smx4/kernel/trunk/main/src/main/java/org/apache/servicemix/kernel/main/SimpleFileLock.java
URL: http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/main/src/main/java/org/apache/servicemix/kernel/main/SimpleFileLock.java?rev=711745&r1=711744&r2=711745&view=diff
==============================================================================
--- servicemix/smx4/kernel/trunk/main/src/main/java/org/apache/servicemix/kernel/main/SimpleFileLock.java (original)
+++ servicemix/smx4/kernel/trunk/main/src/main/java/org/apache/servicemix/kernel/main/SimpleFileLock.java Wed Nov  5 15:44:57 2008
@@ -26,12 +26,23 @@
 
 public class SimpleFileLock implements Lock {
 
+    private static final String PROPERTY_LOCK_DIR = "servicemix.lock.dir";
+    private static final String PROP_SERVICEMIX_BASE = "servicemix.base";
     private RandomAccessFile lockFile;
     private FileLock lock;
 
     public SimpleFileLock(Properties props) {
         try {
-            File base = new File(props.getProperty("servicemix.base"));
+            String lock = props.getProperty(PROPERTY_LOCK_DIR);
+
+            if (lock != null) {
+                File servicemixLock = getServiceMixLock(new File(lock), props);
+                props.setProperty(PROPERTY_LOCK_DIR, servicemixLock.getPath());
+            } else {
+                props.setProperty(PROPERTY_LOCK_DIR, System.getProperty(PROP_SERVICEMIX_BASE));
+            }
+
+            File base = new File(props.getProperty(PROPERTY_LOCK_DIR));
             lockFile = new RandomAccessFile(new File(base, "lock"), "rw");
         } catch (IOException e) {
             throw new RuntimeException("Could not create file lock", e);
@@ -52,4 +63,42 @@
         }
         lock = null;
     }
+
+    private static File getServiceMixLock(File lock,Properties props) {
+        File rc = null;
+
+        String path = lock.getPath();
+        if (path != null) {
+            rc = validateDirectoryExists(path, "Invalid " + PROPERTY_LOCK_DIR + " system property");
+        }
+
+        if (rc == null) {
+            path = props.getProperty(PROP_SERVICEMIX_BASE);
+            if (path != null) {
+                rc = validateDirectoryExists(path, "Invalid " + PROP_SERVICEMIX_BASE + " property");
+            }
+        }
+
+        if (rc == null) {
+            rc = lock;
+        }
+        return rc;
+    }
+
+    private static File validateDirectoryExists(String path, String errPrefix) {
+        File rc;
+        try {
+            rc = new File(path).getCanonicalFile();
+        } catch (IOException e) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : " + e.getMessage());
+        }
+        if (!rc.exists()) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : does not exist");
+        }
+        if (!rc.isDirectory()) {
+            throw new IllegalArgumentException(errPrefix + " '" + path + "' : is not a directory");
+        }
+        return rc;
+    }
+
 }