You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by hi...@apache.org on 2012/08/27 15:48:38 UTC

svn commit: r1377682 - in /ant/sandbox/antdsl/branches/import-experiment: ./ org.apache.ant.antdsl/src/org/apache/ant/antdsl/AbstractAntDslProjectHelper.java org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java test/test-module.bnd

Author: hibou
Date: Mon Aug 27 13:48:38 2012
New Revision: 1377682

URL: http://svn.apache.org/viewvc?rev=1377682&view=rev
Log:
Fix the classloader used by the typedef

Modified:
    ant/sandbox/antdsl/branches/import-experiment/   (props changed)
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AbstractAntDslProjectHelper.java
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java
    ant/sandbox/antdsl/branches/import-experiment/test/test-module.bnd

Propchange: ant/sandbox/antdsl/branches/import-experiment/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Mon Aug 27 13:48:38 2012
@@ -2,3 +2,4 @@ build
 lib
 build-deps
 *.classpath
+.ant

Modified: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AbstractAntDslProjectHelper.java
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AbstractAntDslProjectHelper.java?rev=1377682&r1=1377681&r2=1377682&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AbstractAntDslProjectHelper.java (original)
+++ ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AbstractAntDslProjectHelper.java Mon Aug 27 13:48:38 2012
@@ -97,16 +97,6 @@ public abstract class AbstractAntDslProj
             project.addReference(REFID_FUNCTION_REGISTRY, functionRegistry);
         }
 
-        OSGiFrameworkManager osgiFrameworkManager = project.getReference(REFID_OSGI_FRAMEWORK_MANAGER);
-        if (osgiFrameworkManager == null) {
-            try {
-                osgiFrameworkManager = new OSGiFrameworkManager();
-            } catch (BundleException e) {
-                throw new BuildException("Unable to boot the OSGi framwork (" + e.getMessage() + ")", e);
-            }
-            project.addReference(REFID_OSGI_FRAMEWORK_MANAGER, osgiFrameworkManager);
-        }
-
         Stack<ClassLoader> classloaderStack = project.getReference(REFID_CLASSLOADER_STACK);
         if (classloaderStack == null) {
             classloaderStack = new Stack<ClassLoader>();
@@ -134,8 +124,6 @@ public abstract class AbstractAntDslProj
             }
         } else {
             // top level file
-            classloaderStack.push(getOSGiFrameworkManager(project).getGodClassLoader());
-
             context.setCurrentTargets(new HashMap<String, Target>());
             parse(project, source, context);
 
@@ -262,6 +250,17 @@ public abstract class AbstractAntDslProj
             }
         }
 
+        OSGiFrameworkManager osgiFrameworkManager = project.getReference(REFID_OSGI_FRAMEWORK_MANAGER);
+        if (osgiFrameworkManager == null) {
+            try {
+                osgiFrameworkManager = new OSGiFrameworkManager(project.getBaseDir());
+            } catch (BundleException e) {
+                throw new BuildException("Unable to boot the OSGi framwork (" + e.getMessage() + ")", e);
+            }
+            project.addReference(REFID_OSGI_FRAMEWORK_MANAGER, osgiFrameworkManager);
+        }
+        getClassloaderStack(project).push(osgiFrameworkManager.getGodClassLoader());
+
         String antFileProp = MagicNames.ANT_FILE + "." + context.getCurrentProjectName();
         String dup = project.getProperty(antFileProp);
         String typeProp = MagicNames.ANT_FILE_TYPE + "." + context.getCurrentProjectName();
@@ -415,6 +414,9 @@ public abstract class AbstractAntDslProj
         ProjectHelper subHelper = ProjectHelperRepository.getInstance().getProjectHelperForBuildFile(urlResource);
 
         ClassLoader childCl = getOSGiFrameworkManager(project).getClassLoader(buildModule, buildUrl);
+        if (childCl == null) {
+            throw new RuntimeException("Unable to find the classloader of the resource " + buildUrl);
+        }
         getClassloaderStack(project).push(childCl);
 
         // push current stacks into the sub helper

Modified: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java?rev=1377682&r1=1377681&r2=1377682&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java (original)
+++ ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java Mon Aug 27 13:48:38 2012
@@ -1,6 +1,7 @@
 package org.apache.ant.antdsl;
 
 import java.io.BufferedReader;
+import java.io.File;
 import java.io.IOException;
 import java.io.InputStreamReader;
 import java.net.URL;
@@ -36,9 +37,11 @@ public class OSGiFrameworkManager {
 
     private GodClassLoader godClassLoader = new GodClassLoader();
 
-    public OSGiFrameworkManager() throws BundleException {
+    public OSGiFrameworkManager(File basedir) throws BundleException {
         Map<String, String> configMap = new HashMap<String, String>();
         configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, ANT_PACKAGES);
+        configMap.put(Constants.FRAMEWORK_STORAGE, new File(basedir, ".ant/.felix-cache").getAbsolutePath());
+        configMap.put(Constants.FRAMEWORK_STORAGE_CLEAN, "true");
         framework = getFrameworkFactory().newFramework(configMap);
         framework.init();
     }
@@ -128,20 +131,38 @@ public class OSGiFrameworkManager {
     /**
      * Find which classloader is responsible for resolving holding url
      * 
-     * @param url
      * @return
      */
     public ClassLoader getClassLoader(String resource, URL url) {
         for (Bundle bundle : bundles) {
             BundleWiring wiring = bundle.adapt(BundleWiring.class);
-            List<URL> entries = wiring.findEntries(resource, null, 0);
-            if (!entries.isEmpty()) {
+            int i = resource.lastIndexOf('/');
+            String path = resource.substring(0, i);
+            String name = resource.substring(i + 1);
+            List<URL> entries = wiring.findEntries(path, name, 0);
+            if (!entries.isEmpty() && containsUrls(entries, url)) {
                 return wiring.getClassLoader();
             }
         }
         return null;
     }
 
+    private boolean containsUrls(List<URL> urls, URL url) {
+        for (URL u : urls) {
+            if (urlEquals(u, url)) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    private boolean urlEquals(URL url1, URL url2) {
+        if (!url1.getProtocol().equals("bundle") || !url2.getProtocol().equals("bundle")) {
+            return url1.equals(url2);
+        }
+        return url1.getHost().equals(url2.getHost()) && url1.getPath().equals(url2.getPath());
+    }
+
     private class GodClassLoader extends ClassLoader {
 
         private GodClassLoader() {

Modified: ant/sandbox/antdsl/branches/import-experiment/test/test-module.bnd
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/test/test-module.bnd?rev=1377682&r1=1377681&r2=1377682&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/test/test-module.bnd (original)
+++ ant/sandbox/antdsl/branches/import-experiment/test/test-module.bnd Mon Aug 27 13:48:38 2012
@@ -3,4 +3,5 @@ version=1.0
 Bundle-Version: ${version}
 Bundle-SymbolicName: org.apache.ant.antdsl.test
 Include-Resource: test-module
-Export-Package: org.apache.ant.antdsl.test.*
\ No newline at end of file
+Export-Package: org.apache.ant.antdsl.test.*
+Import-Package: org.apache.ant.antunit
\ No newline at end of file