You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ma...@apache.org on 2009/12/21 11:18:29 UTC

svn commit: r892744 - in /felix/trunk/dependencymanager: core/src/main/java/org/apache/felix/dm/resources/ test/src/test/java/org/apache/felix/dm/test/

Author: marrs
Date: Mon Dec 21 10:18:28 2009
New Revision: 892744

URL: http://svn.apache.org/viewvc?rev=892744&view=rev
Log:
refactored resources to include a unique identifier

Modified:
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/BundleResourceRepository.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/Resource.java
    felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java
    felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
    felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/BundleResourceRepository.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/BundleResourceRepository.java?rev=892744&r1=892743&r2=892744&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/BundleResourceRepository.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/BundleResourceRepository.java Mon Dec 21 10:18:28 2009
@@ -21,8 +21,8 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
+import java.util.Dictionary;
 import java.util.Enumeration;
-import java.util.Properties;
 
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Filter;
@@ -31,92 +31,149 @@
 import org.osgi.framework.ServiceReference;
 
 public class BundleResourceRepository {
-
-	private final Bundle bundle;
+	private final Bundle m_bundle;
 
 	public BundleResourceRepository(Bundle bundle) {
-		this.bundle = bundle;
+		this.m_bundle = bundle;
 	}
 
 	public synchronized void addHandler(ServiceReference ref, ResourceHandler handler) {
-
 		String filter = (String) ref.getProperty("filter"); // "(&(repository=a)(path=b)(name=*.xml))"
-
 		Filter filterObject = null;
-
 		try {
 			filterObject = FrameworkUtil.createFilter(filter);
-		} catch (InvalidSyntaxException e) {
+		} 
+		catch (InvalidSyntaxException e) {
 			e.printStackTrace();
 			return;
 		}
-
-		Enumeration entries = bundle.findEntries("/", null, true);
+		Enumeration entries = m_bundle.findEntries("/", null, true);
 		while (entries.hasMoreElements()) {
-			URL entry = (URL) entries.nextElement();
-
-			Properties props = new Properties();
-			props.setProperty(Resource.REPOSITORY, bundle.getSymbolicName() + "_" + bundle.getHeaders().get("Bundle-Version"));
-			props.setProperty(Resource.PATH, entry.getPath());
-			props.setProperty(Resource.NAME, entry.getFile());
-
-			if (filterObject.match(props))
-				handler.added(new EntryResource(entry));
-
+			EntryResource resource = new EntryResource(m_bundle, (URL) entries.nextElement());
+			if (filterObject.match(resource)) {
+                handler.added(resource);
+			}
 		}
 	}
 
 	public synchronized void removeHandler(ServiceReference ref, ResourceHandler handler) {
-
 		String filter = (String) ref.getProperty("filter"); // "(&(repository=a)(path=b)(name=*.xml))"
-
 		Filter filterObject = null;
-
 		try {
 			filterObject = FrameworkUtil.createFilter(filter);
-		} catch (InvalidSyntaxException e) {
+		}
+		catch (InvalidSyntaxException e) {
 			e.printStackTrace();
 			return;
 		}
-
-		Enumeration entries = bundle.findEntries("/", null, true);
-		while (entries.hasMoreElements()) {
-			URL entry = (URL) entries.nextElement();
-
-			Properties props = new Properties();
-			props.setProperty(Resource.REPOSITORY, bundle.getSymbolicName() + "_" + bundle.getHeaders().get("Bundle-Version"));
-			props.setProperty(Resource.PATH, entry.getPath());
-			props.setProperty(Resource.NAME, entry.getFile());
-
-			if (filterObject.match(props))
-				handler.removed(new EntryResource(entry));
-
-		}
+		Enumeration entries = m_bundle.findEntries("/", null, true);
+        while (entries.hasMoreElements()) {
+            EntryResource resource = new EntryResource(m_bundle, (URL) entries.nextElement());
+            if (filterObject.match(resource)) {
+                handler.removed(resource);
+            }
+        }
 	}
 
-	class EntryResource implements Resource {
-
-		URL entry;
-
-		EntryResource(URL entry) {
-			this.entry = entry;
-		}
-
-		public String getName() {
-			return entry.getFile();
-		}
-
-		public String getPath() {
-			return entry.getPath();
-		}
-
-		public String getRepository() {
-
-			return bundle.getSymbolicName() + "_" + bundle.getHeaders().get("Bundle-Version");
-		}
-
-		public InputStream openStream() throws IOException {
-			return entry.openStream();
-		}
+	static class EntryResource extends Dictionary implements Resource {
+		private final URL m_entry;
+        private final String m_id;
+        private final String m_repository;
+        private final String m_path;
+        private final String m_name;
+        private static Object[] m_keys;
+        private Object[] m_values;
+
+		public EntryResource(Bundle bundle, URL entry) {
+			m_entry = entry;
+			// TODO is this unique? can we have the same url in more than one repository?
+			m_id = m_entry.toString();
+			m_repository = bundle.getSymbolicName() + "_" + bundle.getHeaders().get("Bundle-Version");
+			m_path = entry.getPath();
+			m_name = entry.getFile();
+		}
+
+		public final String getID() {
+		    return m_id;
+		}
+		
+		public final String getName() {
+			return m_name;
+		}
+
+		public final String getPath() {
+			return m_path;
+		}
+		
+		public final String getRepository() {
+			return m_repository;
+		}
+
+		public final InputStream openStream() throws IOException {
+			return m_entry.openStream();
+		}
+
+        public Enumeration elements() {
+            if (m_values == null) {
+                m_values = new Object[] { m_id, m_repository, m_path, m_name };
+            }
+            return new ArrayEnumeration(m_values);
+        }
+
+        public Object get(Object key) {
+            if (Resource.ID.equals(key)) {
+                return m_id;
+            }
+            else if (Resource.REPOSITORY.equals(key)) {
+                return m_repository;
+            }
+            else if (Resource.PATH.equals(key)) {
+                return m_path;
+            }
+            else if (Resource.NAME.equals(key)) {
+                return m_name;
+            }
+            return null;
+        }
+
+        public boolean isEmpty() {
+            return false;
+        }
+
+        public Enumeration keys() {
+            if (m_keys == null) {
+                m_keys = new Object[] { Resource.ID, Resource.REPOSITORY, Resource.PATH, Resource.NAME };
+            }
+            return new ArrayEnumeration(m_keys);
+        }
+
+        public Object put(Object key, Object value) {
+            return null;
+        }
+
+        public Object remove(Object key) {
+            return null;
+        }
+
+        public int size() {
+            return 4;
+        }
+	}
+	
+	static class ArrayEnumeration implements Enumeration {
+	    private int m_counter = 0;
+	    private Object[] m_elements;
+	    
+	    public ArrayEnumeration(Object[] array) {
+	        m_elements = array;
+	    }
+	    
+	    public boolean hasMoreElements() {
+	        return (m_counter < m_elements.length);
+	    }
+	    
+	    public Object nextElement() {
+	        return m_elements[m_counter++];
+	    }
 	}
 }

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/Resource.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/Resource.java?rev=892744&r1=892743&r2=892744&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/Resource.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/Resource.java Mon Dec 21 10:18:28 2009
@@ -22,19 +22,26 @@
 import java.io.InputStream;
 
 /** 
- * Interface that defines a resource. 
+ * Interface that defines a resource. Each resource has a unique ID, which should be
+ * used for equality tests. Resources also have a repository name, path and name, which
+ * can all be used to filter on. To access a resource, use the <code>openStream()</code>
+ * method.
  */
 public interface Resource {
+    public static final String ID = "id";
     public static final String FILTER = "filter";
 	public static final String PATH = "path";
 	public static final String NAME = "name";
 	public static final String REPOSITORY = "repository";
 	
-	String getName();
-	
-	String getPath();
-	
-	String getRepository();
-	
-	InputStream openStream() throws IOException;
+	/** Returns the unique identification of this resource. */
+	public String getID();
+	/** Returns the name of this resource. */
+	public String getName();
+	/** Returns the path of this resource. */
+	public String getPath();
+	/** Returns the repository of this resource. */
+	public String getRepository();
+	/**	Returns an input stream containing all data behind this resource. */
+	public InputStream openStream() throws IOException;
 }

Modified: felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java?rev=892744&r1=892743&r2=892744&view=diff
==============================================================================
--- felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java (original)
+++ felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/resources/ResourceHandler.java Mon Dec 21 10:18:28 2009
@@ -22,7 +22,10 @@
  * Service interface for anybody wanting to be notified of changes to resources. 
  */
 public interface ResourceHandler {
-	void added(Resource resource);
-	void changed(Resource resource);
-	void removed(Resource resource);
+    /** Invoked whenever a new resource is added. */
+	public void added(Resource resource);
+	/** Invoked whenever an existing resource changes. */
+	public void changed(Resource resource);
+	/** Invoked whenever an existing resource is removed. */
+	public void removed(Resource resource);
 }

Modified: felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java?rev=892744&r1=892743&r2=892744&view=diff
==============================================================================
--- felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java (original)
+++ felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/ResourceDependencyTest.java Mon Dec 21 10:18:28 2009
@@ -78,7 +78,6 @@
     static class ResourceConsumer {
         private volatile int m_counter;
         public void add(Resource resource) {
-            System.out.println("RC:ADD " + resource);
             m_counter++;
             try {
                 resource.openStream();
@@ -88,7 +87,6 @@
             }
         }
         public void remove(Resource resource) {
-            System.out.println("RC:REMOVE " + resource);
             m_counter--;
         }
         public void ensure() {
@@ -175,15 +173,21 @@
     }
     
     static class StaticResource implements Resource {
+        private String m_id;
         private String m_name;
         private String m_path;
         private String m_repository;
 
         public StaticResource(String name, String path, String repository) {
+            m_id = repository + ":" + path + "/" + name;
             m_name = name;
             m_path = path;
             m_repository = repository;
         }
+        
+        public String getID() {
+            return m_id;
+        }
 
         public String getName() {
             return m_name;
@@ -199,6 +203,7 @@
         
         public Dictionary getProperties() {
             return new Properties() {{
+                put(Resource.ID, getID());
                 put(Resource.NAME, getName());
                 put(Resource.PATH, getPath());
                 put(Resource.REPOSITORY, getRepository());

Modified: felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java
URL: http://svn.apache.org/viewvc/felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java?rev=892744&r1=892743&r2=892744&view=diff
==============================================================================
--- felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java (original)
+++ felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/SharingDependenciesWithMultipleServicesTest.java Mon Dec 21 10:18:28 2009
@@ -281,15 +281,21 @@
     }
     
     static class StaticResource implements Resource {
+        private String m_id;
         private String m_name;
         private String m_path;
         private String m_repository;
 
         public StaticResource(String name, String path, String repository) {
+            m_id = repository + ":" + path + "/" + name;
             m_name = name;
             m_path = path;
             m_repository = repository;
         }
+        
+        public String getID() {
+            return m_id;
+        }
 
         public String getName() {
             return m_name;