Wouldn't it be nicer to do that on the fly in the addEntry /
addEntries method instead of iterating after the list has been built ?

On Wed, Oct 21, 2009 at 16:24,  <[email protected]> wrote:
> 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
>
>
>



-- 
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com

Reply via email to