You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2011/01/04 10:07:06 UTC

svn commit: r1054934 - in /sling/trunk: installer/core/src/main/java/org/apache/sling/installer/core/impl/ installer/core/src/test/java/org/apache/sling/installer/core/impl/ launchpad/base/src/main/resources/

Author: cziegeler
Date: Tue Jan  4 09:07:05 2011
New Revision: 1054934

URL: http://svn.apache.org/viewvc?rev=1054934&view=rev
Log:
SLING-1915 : Status information should be stored outside the bundle data directory

Added:
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/FileUtil.java   (with props)
Modified:
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java
    sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java
    sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/DictionaryDigestTest.java
    sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/MockBundleContext.java
    sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceComparatorTest.java
    sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceTest.java
    sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/TaskOrderingTest.java
    sling/trunk/launchpad/base/src/main/resources/sling.properties

Added: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/FileUtil.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/FileUtil.java?rev=1054934&view=auto
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/FileUtil.java (added)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/FileUtil.java Tue Jan  4 09:07:05 2011
@@ -0,0 +1,120 @@
+/*
+ * 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.sling.installer.core.impl;
+
+import java.io.File;
+
+import org.osgi.framework.BundleContext;
+
+/**
+ * Utility class for all file handling.
+ */
+public class FileUtil {
+
+    /**
+     * The name of the bundle context property defining the location for the
+     * installer files (value is "sling.installer.dir").
+     */
+    private static final String CONFIG_DIR = "sling.installer.dir";
+
+    /**
+     * The default configuration data directory if no location is configured
+     * (value is "installer").
+     */
+    private static final String DEFAULT_DIR = "installer";
+
+    private final File directory;
+
+    /**
+     * Create a file util instance and detect the installer directory.
+     */
+    public FileUtil( final BundleContext bundleContext ) {
+        String location = bundleContext.getProperty(CONFIG_DIR);
+
+        // no configured location, use the config dir in the bundle persistent
+        // area
+        if ( location == null ) {
+            final File locationFile = bundleContext.getDataFile( DEFAULT_DIR );
+            if ( locationFile != null ) {
+                location = locationFile.getAbsolutePath();
+            }
+        }
+
+        // fall back to the current working directory if the platform does
+        // not support filesystem based data area
+        if ( location == null ) {
+            location = System.getProperty( "user.dir" ) + File.separatorChar + DEFAULT_DIR;
+        }
+
+        // ensure the file is absolute
+        File locationFile = new File( location );
+        if ( !locationFile.isAbsolute() ) {
+            final File bundleLocationFile = bundleContext.getDataFile( locationFile.getPath() );
+            if ( bundleLocationFile != null ) {
+                locationFile = bundleLocationFile;
+            }
+
+            // ensure the file object is an absolute file object
+            locationFile = locationFile.getAbsoluteFile();
+        }
+
+        // check the location
+        if ( !locationFile.isDirectory() ) {
+            if ( locationFile.exists() ) {
+                throw new IllegalArgumentException( location + " is not a directory" );
+            }
+
+            if ( !locationFile.mkdirs() ) {
+                throw new IllegalArgumentException( "Cannot create directory " + location );
+            }
+        }
+
+        this.directory = locationFile;
+    }
+
+    /**
+     * Return the installer directory.
+     */
+    public File getDirectory() {
+        return this.directory;
+    }
+
+    /**
+     * Return a file with the given name in the installer directory.
+     * @param fileName The file name
+     */
+    public File getDataFile(final String fileName) {
+        return new File(this.directory, fileName);
+    }
+
+    /** Serial number to create unique file names in the data storage. */
+    private static long serialNumberCounter = System.currentTimeMillis();
+
+    private static long getNextSerialNumber() {
+        synchronized (RegisteredResourceImpl.class) {
+            return serialNumberCounter++;
+        }
+    }
+
+    /** Create a new unique data file. */
+    public File createNewDataFile(final String hint) {
+        final String filename = hint + "-resource-" + getNextSerialNumber() + ".ser";
+        return this.getDataFile(filename);
+    }
+}
\ No newline at end of file

Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/FileUtil.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/FileUtil.java
------------------------------------------------------------------------------
    svn:keywords = author date id revision rev url

Propchange: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/FileUtil.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java?rev=1054934&r1=1054933&r2=1054934&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/OsgiInstallerImpl.java Tue Jan  4 09:07:05 2011
@@ -91,9 +91,12 @@ public class OsgiInstallerImpl
     private BundleTaskCreator bundleTaskCreator;
     private ConfigTaskCreator configTaskCreator;
 
+    private final FileUtil fileUtil;
+
     /** Constructor */
     public OsgiInstallerImpl(final BundleContext ctx) {
         this.ctx = ctx;
+        this.fileUtil = new FileUtil(ctx);
     }
 
     /**
@@ -129,7 +132,7 @@ public class OsgiInstallerImpl
         this.configTaskCreator = new ConfigTaskCreator(ctx);
         this.bundleTaskCreator = new BundleTaskCreator(ctx);
         setName(getClass().getSimpleName());
-        final File f = ctx.getDataFile("RegisteredResourceList.ser");
+        final File f = this.fileUtil.getDataFile("RegisteredResourceList.ser");
         persistentList = new PersistentResourceList(f);
         logger.info("Apache Sling OSGi Installer Service started.");
     }
@@ -198,7 +201,7 @@ public class OsgiInstallerImpl
             createdResources = new ArrayList<RegisteredResource>();
             for(final InstallableResource r : resources ) {
                 try {
-                    final RegisteredResource rr = RegisteredResourceImpl.create(ctx, r, scheme);
+                    final RegisteredResource rr = RegisteredResourceImpl.create(ctx, r, scheme, this.fileUtil);
                     createdResources.add(rr);
                     logger.debug("Registering new resource: {}", rr);
                 } catch (final IOException ioe) {

Modified: sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java?rev=1054934&r1=1054933&r2=1054934&view=diff
==============================================================================
--- sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java (original)
+++ sling/trunk/installer/core/src/main/java/org/apache/sling/installer/core/impl/RegisteredResourceImpl.java Tue Jan  4 09:07:05 2011
@@ -89,9 +89,6 @@ public class RegisteredResourceImpl
     /** The current state of this resource. */
     private State state = State.INSTALL;
 
-    /** Serial number to create unique file names in the data storage. */
-    private static long serialNumberCounter = System.currentTimeMillis();
-
     /** Temporary attributes. */
     private transient Map<String, Object> temporaryAttributes;
 
@@ -145,7 +142,8 @@ public class RegisteredResourceImpl
      */
     public static RegisteredResourceImpl create(final BundleContext ctx,
             final InstallableResource input,
-            final String scheme) throws IOException {
+            final String scheme,
+            final FileUtil fileUtil) throws IOException {
         // installable resource has an id, a priority and either
         // an input stream or a dictionary
         InputStream is = input.getInputStream();
@@ -178,7 +176,8 @@ public class RegisteredResourceImpl
                 resourceType,
                 input.getDigest(),
                 input.getPriority(),
-                scheme);
+                scheme,
+                fileUtil);
     }
 
 	/**
@@ -194,7 +193,8 @@ public class RegisteredResourceImpl
 	        final String type,
 	        final String digest,
 	        final int priority,
-	        final String scheme) throws IOException {
+	        final String scheme,
+	        final FileUtil fileUtil) throws IOException {
         this.url = scheme + ':' + id;
         this.urlScheme = scheme;
 		this.resourceType = type;
@@ -203,7 +203,7 @@ public class RegisteredResourceImpl
 
 		if (resourceType.equals(InstallableResource.TYPE_BUNDLE)) {
             try {
-                this.dataFile = getDataFile(ctx);
+                this.dataFile = fileUtil.createNewDataFile(getType());
                 copyToLocalStorage(is);
                 setAttributesFromManifest();
                 final String name = (String)attributes.get(Constants.BUNDLE_SYMBOLICNAME);
@@ -258,12 +258,6 @@ public class RegisteredResourceImpl
 		}
 	}
 
-    private static long getNextSerialNumber() {
-        synchronized (RegisteredResourceImpl.class) {
-            return serialNumberCounter++;
-        }
-    }
-
 	@Override
 	public String toString() {
 	    return "RegisteredResource(url=" + this.getURL() +
@@ -272,11 +266,6 @@ public class RegisteredResourceImpl
 	        ", digest=" + this.getDigest() + ")";
 	}
 
-	protected File getDataFile(final BundleContext bundleContext) {
-		final String filename = getType() + "-resource-" + getNextSerialNumber() + ".ser";
-		return bundleContext.getDataFile(filename);
-	}
-
 	/**
 	 * @see org.apache.sling.installer.core.impl.RegisteredResource#cleanup()
 	 */

Modified: sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/DictionaryDigestTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/DictionaryDigestTest.java?rev=1054934&r1=1054933&r2=1054934&view=diff
==============================================================================
--- sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/DictionaryDigestTest.java (original)
+++ sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/DictionaryDigestTest.java Tue Jan  4 09:07:05 2011
@@ -26,7 +26,6 @@ import java.util.Dictionary;
 import java.util.Hashtable;
 
 import org.apache.sling.installer.api.InstallableResource;
-import org.apache.sling.installer.core.impl.RegisteredResourceImpl;
 
 
 public class DictionaryDigestTest {
@@ -38,7 +37,7 @@ public class DictionaryDigestTest {
 	}
 
     private RegisteredResourceImpl create(final InstallableResource is) throws IOException {
-        return RegisteredResourceImpl.create(new MockBundleContext(), is, "test");
+        return RegisteredResourceImpl.create(new MockBundleContext(), is, "test", new FileUtil(new MockBundleContext()));
     }
 
     private String testDigestChanged(Dictionary<String, Object> d,

Modified: sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/MockBundleContext.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/MockBundleContext.java?rev=1054934&r1=1054933&r2=1054934&view=diff
==============================================================================
--- sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/MockBundleContext.java (original)
+++ sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/MockBundleContext.java Tue Jan  4 09:07:05 2011
@@ -98,12 +98,16 @@ public class MockBundleContext implement
     }
 
     public String getProperty(String key) {
-        // TODO Auto-generated method stub
         return null;
     }
 
     public File getDataFile(String filename) {
         try {
+            if ( "installer".equals(filename) ) {
+                final File dir = this.getDataFile("test").getParentFile();
+                dir.deleteOnExit();
+                return new File(dir, filename);
+            }
             final File f = File.createTempFile(filename, ".data");
             f.deleteOnExit();
             return f;

Modified: sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceComparatorTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceComparatorTest.java?rev=1054934&r1=1054933&r2=1054934&view=diff
==============================================================================
--- sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceComparatorTest.java (original)
+++ sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceComparatorTest.java Tue Jan  4 09:07:05 2011
@@ -30,8 +30,6 @@ import java.util.SortedSet;
 import java.util.TreeSet;
 
 import org.apache.sling.installer.api.InstallableResource;
-import org.apache.sling.installer.core.impl.RegisteredResource;
-import org.apache.sling.installer.core.impl.RegisteredResourceImpl;
 import org.junit.Test;
 
 public class RegisteredResourceComparatorTest {
@@ -56,7 +54,7 @@ public class RegisteredResourceComparato
             data.put("foo", "bar");
         }
         final InstallableResource r = new InstallableResource(url, null, data, digest, null, priority);
-        return RegisteredResourceImpl.create(null, r, "test");
+        return RegisteredResourceImpl.create(null, r, "test", new FileUtil(new MockBundleContext()));
     }
 
     private void assertOrder(RegisteredResource[] inOrder) {

Modified: sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceTest.java?rev=1054934&r1=1054933&r2=1054934&view=diff
==============================================================================
--- sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceTest.java (original)
+++ sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/RegisteredResourceTest.java Tue Jan  4 09:07:05 2011
@@ -79,16 +79,17 @@ public class RegisteredResourceTest {
 	@org.junit.Test public void testLocalFileCopy() throws Exception {
 	    final File localFile = File.createTempFile("testLocalFileCopy", ".data");
         localFile.deleteOnExit();
-	    final BundleContext bc = new MockBundleContext() {
+	    final BundleContext bc = new MockBundleContext();
+	    final File f = getTestBundle("testbundle-1.0.jar");
+        final InputStream s = new FileInputStream(f);
+		RegisteredResourceImpl.create(bc, new InstallableResource("test:1.jar", s, null, "somedigest", null, null), "test", new FileUtil(bc) {
 
-            public File getDataFile(String filename) {
+            @Override
+            public File createNewDataFile(final String hint) {
                 return localFile;
             }
 
-	    };
-	    final File f = getTestBundle("testbundle-1.0.jar");
-        final InputStream s = new FileInputStream(f);
-		RegisteredResourceImpl.create(bc, new InstallableResource("test:1.jar", s, null, "somedigest", null, null), "test");
+		});
 		assertTrue("Local file exists", localFile.exists());
 
 		assertEquals("Local file length matches our data", f.length(), localFile.length());
@@ -159,6 +160,6 @@ public class RegisteredResourceTest {
     }
 
     private RegisteredResourceImpl create(final InstallableResource is) throws IOException {
-        return RegisteredResourceImpl.create(new MockBundleContext(), is, "test");
+        return RegisteredResourceImpl.create(new MockBundleContext(), is, "test", new FileUtil(new MockBundleContext()));
     }
 }
\ No newline at end of file

Modified: sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/TaskOrderingTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/TaskOrderingTest.java?rev=1054934&r1=1054933&r2=1054934&view=diff
==============================================================================
--- sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/TaskOrderingTest.java (original)
+++ sling/trunk/installer/core/src/test/java/org/apache/sling/installer/core/impl/TaskOrderingTest.java Tue Jan  4 09:07:05 2011
@@ -27,9 +27,6 @@ import java.util.Set;
 import java.util.TreeSet;
 
 import org.apache.sling.installer.api.InstallableResource;
-import org.apache.sling.installer.core.impl.EntityResourceList;
-import org.apache.sling.installer.core.impl.OsgiInstallerTask;
-import org.apache.sling.installer.core.impl.RegisteredResourceImpl;
 import org.apache.sling.installer.core.impl.config.ConfigInstallTask;
 import org.apache.sling.installer.core.impl.config.ConfigRemoveTask;
 import org.apache.sling.installer.core.impl.tasks.BundleInstallTask;
@@ -55,7 +52,7 @@ public class TaskOrderingTest {
 	    final EntityResourceList erl = new EntityResourceList();
 	    erl.addOrUpdate(RegisteredResourceImpl.create(null,
 		        new InstallableResource(url, null, new Hashtable<String, Object>(), null, null, null),
-		        "test"));
+		        "test", new FileUtil(new MockBundleContext())));
 	    return erl;
 	}
 

Modified: sling/trunk/launchpad/base/src/main/resources/sling.properties
URL: http://svn.apache.org/viewvc/sling/trunk/launchpad/base/src/main/resources/sling.properties?rev=1054934&r1=1054933&r2=1054934&view=diff
==============================================================================
--- sling/trunk/launchpad/base/src/main/resources/sling.properties (original)
+++ sling/trunk/launchpad/base/src/main/resources/sling.properties Tue Jan  4 09:07:05 2011
@@ -107,6 +107,10 @@ obr.repository.url = http://sling.apache
 felix.cm.dir = ${sling.home}/config
 
 #
+# Sling Installer file directory
+sling.installer.dir = ${sling.home}/installer
+
+#
 # Felix Framework profile directory. This is by default the "felix" directory
 # below the application home directory.
 org.osgi.framework.storage = ${sling.home}/felix