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 2014/04/27 20:32:35 UTC

svn commit: r1590448 - /ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/

Author: hibou
Date: Sun Apr 27 18:32:34 2014
New Revision: 1590448

URL: http://svn.apache.org/r1590448
Log:
Add the possibility to have a flat classpath instead of an OSGi one

Added:
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/ClasspathManager.java   (with props)
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/FlatClasspathManager.java   (with props)
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiClasspathManager.java
      - copied, changed from r1553270, ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java
Removed:
    ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java
Modified:
    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/AntPathManager.java

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=1590448&r1=1590447&r2=1590448&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 Sun Apr 27 18:32:34 2014
@@ -65,7 +65,7 @@ public abstract class AbstractAntDslProj
 
     public static final String REFID_FUNCTION_REGISTRY = "antdsl.function.registry";
 
-    public static final String REFID_OSGI_FRAMEWORK_MANAGER = "antdsl.osgi.framework.manager";
+    public static final String REFID_CLASSPATH_MANAGER = "antdsl.classpath.manager";
 
     public static final String REFID_RELOAD_BUNDLES = "antdsl.reload.bundles";
 
@@ -73,6 +73,8 @@ public abstract class AbstractAntDslProj
 
     public static final String REFID_ANT_PATH = "antdsl.path";
 
+    private static final String PROP_CLASSPATH_MANAGER = "antdsl.classpath-manager";
+
     public String getDefaultBuildFile() {
         return "build.ant";
     }
@@ -175,8 +177,8 @@ public abstract class AbstractAntDslProj
         }
     }
 
-    private OSGiFrameworkManager getOSGiFrameworkManager(Project p) {
-        return p.getReference(REFID_OSGI_FRAMEWORK_MANAGER);
+    private ClasspathManager getClasspathManager(Project p) {
+        return p.getReference(REFID_CLASSPATH_MANAGER);
     }
 
     private Stack<ClassLoader> getClassloaderStack(Project p) {
@@ -324,36 +326,30 @@ public abstract class AbstractAntDslProj
         project.addTarget("", context.getImplicitTarget());
         context.setCurrentTarget(context.getImplicitTarget());
 
+        AntPathManager.loadProperties(project);
+
         List<File> antPath = new ArrayList<File>();
         boolean update = AntPathManager.readAntPath(project, antPath);
 
-        OSGiFrameworkManager osgiFrameworkManager = project.getReference(REFID_OSGI_FRAMEWORK_MANAGER);
-        if (osgiFrameworkManager == null) {
-            try {
-                osgiFrameworkManager = new OSGiFrameworkManager(project.getBaseDir(), update);
-            } 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());
-
-        if (update) {
-            for (File file : antPath) {
+        ClasspathManager classpathManager = project.getReference(REFID_CLASSPATH_MANAGER);
+        if (classpathManager == null) {
+            String classpathManagerType = project.getProperty(PROP_CLASSPATH_MANAGER);
+            if (classpathManagerType == null || classpathManagerType.equals("flat")) {
+                classpathManager = new FlatClasspathManager();
+            } else if (classpathManagerType.equals("osgi")) {
                 try {
-                    osgiFrameworkManager.install(file);
+                    classpathManager = new OSGiClasspathManager(project.getBaseDir(), update);
                 } catch (BundleException e) {
-                    throw new BuildException("Unable to install the bundle " + file.getAbsolutePath() + " ("
-                            + e.getMessage() + ")", e);
+                    throw new BuildException("Unable to boot the OSGi framwork (" + e.getMessage() + ")", e);
                 }
+            } else {
+                throw new BuildException("Unsupported classpath manager: " + classpathManagerType);
             }
+            project.addReference(REFID_CLASSPATH_MANAGER, classpathManager);
         }
+        getClassloaderStack(project).push(classpathManager.getMainClassLoader());
 
-        try {
-            osgiFrameworkManager.start();
-        } catch (BundleException e) {
-            throw new BuildException("Unable to start the OSGi framework (" + e.getMessage() + ")", e);
-        }
+        classpathManager.start(update, antPath);
     }
 
     private String getTargetPrefix(AntXMLContext context) {
@@ -399,7 +395,7 @@ public abstract class AbstractAntDslProj
 
         ProjectHelper subHelper = ProjectHelperRepository.getInstance().getProjectHelperForBuildFile(urlResource);
 
-        ClassLoader childCl = getOSGiFrameworkManager(project).getClassLoader(buildModule, buildUrl);
+        ClassLoader childCl = getClasspathManager(project).getClassLoader(buildModule, buildUrl);
         if (childCl == null) {
             throw new RuntimeException("Unable to find the classloader of the resource " + buildUrl);
         }

Modified: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntPathManager.java
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntPathManager.java?rev=1590448&r1=1590447&r2=1590448&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntPathManager.java (original)
+++ ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/AntPathManager.java Sun Apr 27 18:32:34 2014
@@ -42,6 +42,7 @@ import org.apache.ivy.util.filter.Filter
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Property;
 import org.apache.tools.ant.util.FileUtils;
 
 class AntPathManager {
@@ -50,9 +51,13 @@ class AntPathManager {
 
     private static final String IVY_FIXED_XML_LOCATION = "ant/ivy-fixed.xml";
 
-    private static final String ANT_PATH_LOCATION = "ant/ant.path";
+    private static final String BUILD_PROPERTIES_LOCATION = "ant/build.properties";
 
-    static final String OSGI_STORAGE_LOCATION = "ant/osgi-storage";
+    private static final String LOCAL_BUILD_PROPERTIES_LOCATION = "ant/local.build.properties";
+
+    static final String CACHE_LOCATION = "ant/.cache";
+
+    private static final String ANT_PATH_LOCATION = CACHE_LOCATION + "/ant.path";
 
     private static final Charset UTF8 = Charset.forName("UTF-8");
 
@@ -60,6 +65,23 @@ class AntPathManager {
         // Utility class
     }
 
+    static void loadProperties(Project project) {
+        File localPropFile = new File(project.getBaseDir(), LOCAL_BUILD_PROPERTIES_LOCATION);
+        if (localPropFile.exists()) {
+            Property property = new Property();
+            property.setProject(project);
+            property.setFile(localPropFile);
+            property.execute();
+        }
+        File propFile = new File(project.getBaseDir(), BUILD_PROPERTIES_LOCATION);
+        if (propFile.exists()) {
+            Property property = new Property();
+            property.setProject(project);
+            property.setFile(propFile);
+            property.execute();
+        }
+    }
+
     static boolean readAntPath(Project project, List<File> antPath) {
         File ivyFile = new File(project.getBaseDir(), IVY_XML_LOCATION);
         if (!ivyFile.exists()) {

Added: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/ClasspathManager.java
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/ClasspathManager.java?rev=1590448&view=auto
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/ClasspathManager.java (added)
+++ ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/ClasspathManager.java Sun Apr 27 18:32:34 2014
@@ -0,0 +1,32 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.ant.antdsl;
+
+import java.io.File;
+import java.net.URL;
+import java.util.List;
+
+abstract class ClasspathManager {
+
+    abstract public ClassLoader getClassLoader(String buildModule, URL buildUrl);
+
+    abstract public ClassLoader getMainClassLoader();
+
+    abstract public void start(boolean update, List<File> antPath);
+
+}

Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/ClasspathManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/ClasspathManager.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/ClasspathManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/FlatClasspathManager.java
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/FlatClasspathManager.java?rev=1590448&view=auto
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/FlatClasspathManager.java (added)
+++ ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/FlatClasspathManager.java Sun Apr 27 18:32:34 2014
@@ -0,0 +1,56 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+package org.apache.ant.antdsl;
+
+import java.io.File;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.List;
+
+import org.apache.tools.ant.BuildException;
+
+class FlatClasspathManager extends ClasspathManager {
+
+    private URLClassLoader classloader;
+
+    @Override
+    public void start(boolean update, List<File> antPath) {
+        URL[] urls = new URL[antPath.size()];
+        int i = 0;
+        for(File file : antPath) {
+            try {
+                urls[i++] = file.getAbsoluteFile().toURI().toURL();
+            } catch (MalformedURLException e) {
+                throw new BuildException("Unexpected malformed url to file resolved by Ivy: " + file, e);
+            }
+        }
+        classloader = new URLClassLoader(urls);
+    }
+
+    @Override
+    public ClassLoader getMainClassLoader() {
+        return classloader;
+    }
+
+    @Override
+    public ClassLoader getClassLoader(String buildModule, URL buildUrl) {
+        return classloader;
+    }
+
+}

Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/FlatClasspathManager.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/FlatClasspathManager.java
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/FlatClasspathManager.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Copied: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiClasspathManager.java (from r1553270, 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/OSGiClasspathManager.java?p2=ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiClasspathManager.java&p1=ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java&r1=1553270&r2=1590448&rev=1590448&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/OSGiClasspathManager.java Sun Apr 27 18:32:34 2014
@@ -38,7 +38,9 @@ import org.osgi.framework.launch.Framewo
 import org.osgi.framework.launch.FrameworkFactory;
 import org.osgi.framework.wiring.BundleWiring;
 
-class OSGiFrameworkManager {
+class OSGiClasspathManager extends ClasspathManager {
+
+    private static final String OSGI_STORAGE_LOCATION = AntPathManager.CACHE_LOCATION + "/.osgi-storage";
 
     //@formatter:off
     private static final String ANT_PACKAGES =
@@ -53,11 +55,10 @@ class OSGiFrameworkManager {
 
     private GodClassLoader godClassLoader = new GodClassLoader();
 
-    OSGiFrameworkManager(File basedir, boolean update) throws BundleException {
+    OSGiClasspathManager(File basedir, boolean update) 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, AntPathManager.OSGI_STORAGE_LOCATION).getAbsolutePath());
+        configMap.put(Constants.FRAMEWORK_STORAGE, new File(basedir, OSGI_STORAGE_LOCATION).getAbsolutePath());
         if (update) {
             configMap.put(Constants.FRAMEWORK_STORAGE_CLEAN, "true");
         }
@@ -68,7 +69,7 @@ class OSGiFrameworkManager {
     private FrameworkFactory getFrameworkFactory() {
         Enumeration<URL> urls;
         try {
-            urls = OSGiFrameworkManager.class.getClassLoader().getResources(
+            urls = OSGiClasspathManager.class.getClassLoader().getResources(
                     "META-INF/services/org.osgi.framework.launch.FrameworkFactory");
         } catch (IOException e) {
             throw new BuildException(e);
@@ -111,6 +112,26 @@ class OSGiFrameworkManager {
         throw new BuildException("No OSGi framework factory found");
     }
 
+    @Override
+    public void start(boolean update, List<File> antPath) {
+        if (update) {
+            for (File file : antPath) {
+                try {
+                    install(file);
+                } catch (BundleException e) {
+                    throw new BuildException("Unable to install the bundle " + file.getAbsolutePath() + " ("
+                            + e.getMessage() + ")", e);
+                }
+            }
+        }
+
+        try {
+            start();
+        } catch (BundleException e) {
+            throw new BuildException("Unable to start the OSGi framework (" + e.getMessage() + ")", e);
+        }
+    }
+
     void install(File bundle) throws BundleException {
         String url;
         try {
@@ -138,7 +159,8 @@ class OSGiFrameworkManager {
         });
     }
 
-    GodClassLoader getGodClassLoader() {
+    @Override
+    public ClassLoader getMainClassLoader() {
         return godClassLoader;
     }
 
@@ -147,7 +169,8 @@ class OSGiFrameworkManager {
      * 
      * @return
      */
-    ClassLoader getClassLoader(String resource, URL url) {
+    @Override
+    public ClassLoader getClassLoader(String resource, URL url) {
         for (Bundle bundle : framework.getBundleContext().getBundles()) {
             BundleWiring wiring = (BundleWiring) bundle.adapt(BundleWiring.class);
             int i = resource.lastIndexOf('/');