Author: ozzy
Date: Wed Oct 21 14:24:37 2009
New Revision: 828032

URL: http://svn.apache.org/viewvc?rev=828032&view=rev
Log:
ARIES-25 allow Blueprint extender to find blueprint XML within bundle private 
storage.

Modified:
    
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java

Modified: 
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java
URL: 
http://svn.apache.org/viewvc/incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java?rev=828032&r1=828031&r2=828032&view=diff
==============================================================================
--- 
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java
 (original)
+++ 
incubator/aries/trunk/blueprint/blueprint-core/src/main/java/org/apache/aries/blueprint/container/BlueprintExtender.java
 Wed Oct 21 14:24:37 2009
@@ -18,12 +18,15 @@
  */
 package org.apache.aries.blueprint.container;
 
+import java.io.File;
+import java.net.MalformedURLException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.Executors;
@@ -38,8 +41,8 @@
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.Constants;
-import org.osgi.framework.SynchronousBundleListener;
 import org.osgi.framework.ServiceReference;
+import org.osgi.framework.SynchronousBundleListener;
 import org.osgi.service.blueprint.container.BlueprintContainer;
 import org.osgi.service.blueprint.container.BlueprintEvent;
 import org.slf4j.Logger;
@@ -172,6 +175,18 @@
         }
     }
     
+    private String getFilePart(URL url)
+    {
+      String path = url.getPath();
+      int index = path.lastIndexOf('/');
+      return path.substring(index+1);
+    }
+    
+    private String cachePath(Bundle bundle, String filePath)
+    {
+      return bundle.getSymbolicName() + "/" + bundle.getVersion() + "/" + 
filePath;
+    }     
+    
     private void checkBundle(Bundle bundle) {
         LOGGER.debug("Scanning bundle {} for blueprint application", 
bundle.getSymbolicName());
         try {
@@ -202,7 +217,45 @@
                         addEntry(bundle, name, pathList);
                     }                    
                 }
-            }            
+            }
+            
+            //Override bundle specified blueprint XML with 
+            //XML already in the private storage.
+                       Iterator<Object> pathIter = pathList.iterator();
+                       List<Object> overridden = new ArrayList<Object>();
+                       while (pathIter.hasNext()) {
+                               Object path = pathIter.next();
+                               if (path instanceof URL) {
+                                       URL url = (URL) path;
+                                       File privateDataVersion = 
context.getDataFile(cachePath(
+                                                       bundle, 
"OSGI-INF/blueprint/" + getFilePart(url)));
+                                       if (privateDataVersion != null && 
privateDataVersion.exists()) {
+                                               try {
+                                                       
overridden.add(privateDataVersion.toURL());
+                                                       pathIter.remove();
+                                               } catch (MalformedURLException 
e) {
+                                                       
LOGGER.error("Unexpected URL Conversion Issue", e);
+                                               }
+                                       }
+                               } else if (path instanceof String) {
+                                       String s = (String) path;
+                                       File privateDataVersion = 
context.getDataFile(cachePath(
+                                                       bundle, s));
+                                       if (privateDataVersion != null  && 
privateDataVersion.exists()) {
+                                               try {
+                                                       
overridden.add(privateDataVersion.toURL());
+                                                       pathIter.remove();
+                                               } catch (MalformedURLException 
e) {
+                                                       
LOGGER.error("Unexpected URL Conversion Issue", e);
+                                               }
+                                       }
+                               } else {
+                                       throw new 
IllegalArgumentException("Unexpected path type: "
+                                                       + path.getClass());
+                               }
+                       }
+                       pathList.addAll(overridden);          
+            
             if (!pathList.isEmpty()) {
                 LOGGER.debug("Found blueprint application in bundle {} with 
paths: {}", bundle.getSymbolicName(), pathList);
                 // Check compatibility


Reply via email to