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