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('/');