Applied patch (FELIX-1179) to have File Install recognize files by content
rather than extension.


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@779295 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
index 7dd71d1..22a6698 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/DirectoryWatcher.java
@@ -23,6 +23,7 @@
 import java.net.URISyntaxException;
 import java.net.URI;
 
+import org.apache.felix.fileinstall.util.Util;
 import org.osgi.framework.*;
 import org.osgi.service.cm.*;
 import org.osgi.service.log.*;
@@ -443,15 +444,15 @@
         for (int i = 0; i < list.length; i++)
         {
             File file = new File(jardir, list[i]);
-            if (list[i].endsWith(".jar"))
+            if (list[i].endsWith(".cfg"))
+            {
+                configs.add(file.getAbsolutePath());
+            }
+            else if (Util.isValidJar(file.getAbsolutePath()))
             {
                 Jar jar = new Jar(file);
                 jars.put(jar.getPath(), jar);
             }
-            else if (list[i].endsWith(".cfg"))
-            {
-                configs.add(file.getAbsolutePath());
-            }
         }
     }
 
diff --git a/fileinstall/src/main/java/org/apache/felix/fileinstall/util/Util.java b/fileinstall/src/main/java/org/apache/felix/fileinstall/util/Util.java
index 88c0f49..f5c51ed 100644
--- a/fileinstall/src/main/java/org/apache/felix/fileinstall/util/Util.java
+++ b/fileinstall/src/main/java/org/apache/felix/fileinstall/util/Util.java
@@ -18,11 +18,11 @@
  */
 package org.apache.felix.fileinstall.util;
 
-
+import java.io.IOException;
 import java.util.Dictionary;
 import java.util.HashMap;
 import java.util.Map;
-
+import java.util.jar.JarFile;
 
 public class Util
 {
@@ -49,17 +49,17 @@
      * @return The value of the specified string after system property substitution.
      * @throws IllegalArgumentException If there was a syntax error in the
      *         property placeholder syntax or a recursive variable reference.
-    **/
-    public static String substVars( String val, String currentKey, Map cycleMap, Dictionary configProps )
+     **/
+    public static String substVars(String val, String currentKey, Map cycleMap, Dictionary configProps)
         throws IllegalArgumentException
     {
-        if ( cycleMap == null )
+        if (cycleMap == null)
         {
             cycleMap = new HashMap();
         }
 
         // Put the current key in the cycle map.
-        cycleMap.put( currentKey, currentKey );
+        cycleMap.put(currentKey, currentKey);
 
         // Assume we have a value that is something like:
         // "leading ${foo.${bar}} middle ${baz} trailing"
@@ -67,20 +67,20 @@
         // Find the first ending '}' variable delimiter, which
         // will correspond to the first deepest nested variable
         // placeholder.
-        int stopDelim = val.indexOf( DELIM_STOP );
+        int stopDelim = val.indexOf(DELIM_STOP);
 
         // Find the matching starting "${" variable delimiter
         // by looping until we find a start delimiter that is
         // greater than the stop delimiter we have found.
-        int startDelim = val.indexOf( DELIM_START );
-        while ( stopDelim >= 0 )
+        int startDelim = val.indexOf(DELIM_START);
+        while (stopDelim >= 0)
         {
-            int idx = val.indexOf( DELIM_START, startDelim + DELIM_START.length() );
-            if ( ( idx < 0 ) || ( idx > stopDelim ) )
+            int idx = val.indexOf(DELIM_START, startDelim + DELIM_START.length());
+            if ((idx < 0) || (idx > stopDelim))
             {
                 break;
             }
-            else if ( idx < stopDelim )
+            else if (idx < stopDelim)
             {
                 startDelim = idx;
             }
@@ -88,55 +88,86 @@
 
         // If we do not have a start or stop delimiter, then just
         // return the existing value.
-        if ( ( startDelim < 0 ) && ( stopDelim < 0 ) )
+        if ((startDelim < 0) && (stopDelim < 0))
         {
             return val;
         }
         // At this point, we found a stop delimiter without a start,
         // so throw an exception.
-        else if ( ( ( startDelim < 0 ) || ( startDelim > stopDelim ) ) && ( stopDelim >= 0 ) )
+        else if (((startDelim < 0) || (startDelim > stopDelim)) && (stopDelim >= 0))
         {
-            throw new IllegalArgumentException( "stop delimiter with no start delimiter: " + val );
+            throw new IllegalArgumentException("stop delimiter with no start delimiter: " + val);
         }
 
         // At this point, we have found a variable placeholder so
         // we must perform a variable substitution on it.
         // Using the start and stop delimiter indices, extract
         // the first, deepest nested variable placeholder.
-        String variable = val.substring( startDelim + DELIM_START.length(), stopDelim );
+        String variable = val.substring(startDelim + DELIM_START.length(), stopDelim);
 
         // Verify that this is not a recursive variable reference.
-        if ( cycleMap.get( variable ) != null )
+        if (cycleMap.get(variable) != null)
         {
-            throw new IllegalArgumentException( "recursive variable reference: " + variable );
+            throw new IllegalArgumentException("recursive variable reference: " + variable);
         }
 
         // Get the value of the deepest nested variable placeholder.
         // Try to configuration properties first.
-        String substValue = ( String ) ( ( configProps != null ) ? configProps.get( variable ) : null );
-        if ( substValue == null )
+        String substValue = (String) ((configProps != null) ? configProps.get(variable) : null);
+        if (substValue == null)
         {
             // Ignore unknown property values.
-            substValue = System.getProperty( variable, "" );
+            substValue = System.getProperty(variable, "");
         }
 
         // Remove the found variable from the cycle map, since
         // it may appear more than once in the value and we don't
         // want such situations to appear as a recursive reference.
-        cycleMap.remove( variable );
+        cycleMap.remove(variable);
 
         // Append the leading characters, the substituted value of
         // the variable, and the trailing characters to get the new
         // value.
-        val = val.substring( 0, startDelim ) + substValue
-            + val.substring( stopDelim + DELIM_STOP.length(), val.length() );
+        val = val.substring(0, startDelim) + substValue + val.substring(stopDelim + DELIM_STOP.length(), val.length());
 
         // Now perform substitution again, since there could still
         // be substitutions to make.
-        val = substVars( val, currentKey, cycleMap, configProps );
+        val = substVars(val, currentKey, cycleMap, configProps);
 
         // Return the value.
         return val;
     }
 
+    /**
+     * Check if a file is a legitimate Jar file
+     * @param path
+     * @return
+     */
+    public static boolean isValidJar(String path)
+    {
+        JarFile jar = null;
+        try
+        {
+            jar = new JarFile(path);
+            return true;
+        }
+        catch (IOException ioe)
+        {
+            return false;
+        }
+        finally
+        {
+            if (jar != null)
+            {
+                try
+                {
+                    jar.close();
+                }
+                catch (IOException e)
+                {
+                    //do nothing
+                }
+            }
+        }
+    }
 }
diff --git a/fileinstall/src/test/java/org/apache/felix/fileinstall/util/UtilTest.java b/fileinstall/src/test/java/org/apache/felix/fileinstall/util/UtilTest.java
index c74b79e..4e55071 100644
--- a/fileinstall/src/test/java/org/apache/felix/fileinstall/util/UtilTest.java
+++ b/fileinstall/src/test/java/org/apache/felix/fileinstall/util/UtilTest.java
@@ -26,25 +26,30 @@
 
 public class UtilTest extends TestCase
 {
-
     public void testBasicSubstitution()
     {
-        System.setProperty( "value1", "sub_value1" );
-        Dictionary  props = new Hashtable();
-        props.put( "key0", "value0" );
-        props.put( "key1", "${value1}" );
-        props.put( "key2", "${value2}" );
-        
-        for (Enumeration e = props.keys(); e.hasMoreElements(); )
+        System.setProperty("value1", "sub_value1");
+        Dictionary props = new Hashtable();
+        props.put("key0", "value0");
+        props.put("key1", "${value1}");
+        props.put("key2", "${value2}");
+
+        for (Enumeration e = props.keys(); e.hasMoreElements();)
         {
             String name = (String) e.nextElement();
             props.put(name,
-                Util.substVars(( String ) props.get(name), name, null, props));
-        }    
-        
-        assertEquals( "value0", props.get( "key0" ) );
-        assertEquals( "sub_value1", props.get( "key1" ) );
-        assertEquals( "", props.get( "key2" ) );
-        
+                Util.substVars((String) props.get(name), name, null, props));
+        }
+
+        assertEquals("value0", props.get("key0"));
+        assertEquals("sub_value1", props.get("key1"));
+        assertEquals("", props.get("key2"));
+
     }
-}
+
+    public void testCanRecognizeInvalidJar()
+    {
+        assertFalse(Util.isValidJar("src/test/resources/watched/firstjar.jar"));
+        assertFalse(Util.isValidJar("src/test/resources/watched/notexistentfile.jar"));
+    }
+}
\ No newline at end of file