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/25 19:21:06 UTC
svn commit: r1377330 - in /ant/sandbox/antdsl/branches/import-experiment: ./
org.apache.ant.antdsl/ org.apache.ant.antdsl/src/org/apache/ant/antdsl/
org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/ test/
Author: hibou
Date: Sat Aug 25 17:21:05 2012
New Revision: 1377330
URL: http://svn.apache.org/viewvc?rev=1377330&view=rev
Log:
Start experimenting an import model based on OSGi:
- Ant + AntDSLProjectHelper + Felix is the framework
- Ant task jars are bundles: test/build.ant is working
- imported build files should be "within" a bundle: not working at all, need to access some OSGi classloader...
Added:
ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java (with props)
ant/sandbox/antdsl/branches/import-experiment/test/ant-antunit-1.2.bnd
ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh (with props)
Modified:
ant/sandbox/antdsl/branches/import-experiment/build.xml
ant/sandbox/antdsl/branches/import-experiment/ivy-fixed.xml
ant/sandbox/antdsl/branches/import-experiment/ivy.xml
ant/sandbox/antdsl/branches/import-experiment/ivysettings.xml
ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/.classpath
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/xtext/AntDSL.xtext
ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java
ant/sandbox/antdsl/branches/import-experiment/test/ (props changed)
ant/sandbox/antdsl/branches/import-experiment/test/build.ant
Modified: ant/sandbox/antdsl/branches/import-experiment/build.xml
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/build.xml?rev=1377330&r1=1377329&r2=1377330&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/build.xml (original)
+++ ant/sandbox/antdsl/branches/import-experiment/build.xml Sat Aug 25 17:21:05 2012
@@ -57,6 +57,7 @@
</path>
<echo message="${toString:antruntime.classpath}" file=".antruntime.classpath" />
<echo message="${toString:generate.classpath}" file=".generate.classpath" />
+ <ivy:retrieve conf="osgi" pattern="${basedir}/org.apache.ant.antdsl/lib/[type]s/[artifact]-[revision](.[ext])" sync="true" />
<copy file="${basedir}/build-deps/apache-ant-1.9.0alpha/lib/ant.jar" tofile="${basedir}/org.apache.ant.antdsl/lib/jars/ant-1.9.0alpha.jar" />
<jar destfile="${basedir}/org.apache.ant.antdsl/lib/sources/ant-1.9.0alpha.jar" basedir="${basedir}/build-deps/apache-ant-1.9.0alpha/src/main" />
</target>
Modified: ant/sandbox/antdsl/branches/import-experiment/ivy-fixed.xml
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/ivy-fixed.xml?rev=1377330&r1=1377329&r2=1377330&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/ivy-fixed.xml (original)
+++ ant/sandbox/antdsl/branches/import-experiment/ivy-fixed.xml Sat Aug 25 17:21:05 2012
@@ -4,7 +4,7 @@
module="ant-dsl"
revision="1.0.0"
status="integration"
- publication="20120825184447"
+ publication="20120822212844"
/>
<configurations>
<conf name="default" visibility="public"/>
@@ -28,6 +28,7 @@
<conf name="use_org.eclipse.xtend2.lib" visibility="public" description="Exported package org.eclipse.xtend2.lib" extends="default"/>
<conf name="antruntime" visibility="public" extends="default"/>
<conf name="generate" visibility="public" extends="optional"/>
+ <conf name="osgi" visibility="public"/>
</configurations>
<publications>
</publications>
@@ -157,5 +158,6 @@
<dependency org="bundle" name="org.eclipse.ui.navigator.resources" rev="3.4.400.v20120523-1955" force="true" transitive="false" conf="transitive-optional->default"/>
<dependency org="bundle" name="org.eclipse.ui.views.properties.tabbed" rev="3.5.300.v20120523-1955" force="true" transitive="false" conf="transitive-optional->default"/>
<dependency org="bundle" name="org.eclipse.emf.mwe2.lib" rev="2.2.0.v201112070431" force="true" transitive="false" conf="generate->default"/>
+ <dependency org="org.apache.felix" name="org.apache.felix.framework" rev="4.0.3" force="true" transitive="false" conf="osgi->default,compile,runtime,master,sources"/>
</dependencies>
</ivy-module>
Modified: ant/sandbox/antdsl/branches/import-experiment/ivy.xml
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/ivy.xml?rev=1377330&r1=1377329&r2=1377330&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/ivy.xml (original)
+++ ant/sandbox/antdsl/branches/import-experiment/ivy.xml Sat Aug 25 17:21:05 2012
@@ -5,6 +5,7 @@
<configurations>
<conf name="antruntime" extends="default" />
<conf name="generate" extends="optional" />
+ <conf name="osgi" />
</configurations>
<dependencies>
<!-- ambiguity fix -->
@@ -16,6 +17,8 @@
<!-- some optional dependency we do need -->
<dependency org="bundle" name="org.eclipse.emf.mwe2.lib" rev="2.2.0+" conf="generate->default" />
+ <dependency org="org.apache.felix" name="org.apache.felix.framework" rev="4.0.3" conf="osgi->default,sources" />
+
<!-- provided -->
<exclude org="package" module="javax.xml.parsers" />
<exclude org="package" module="javax.xml.transform" />
Modified: ant/sandbox/antdsl/branches/import-experiment/ivysettings.xml
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/ivysettings.xml?rev=1377330&r1=1377329&r2=1377330&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/ivysettings.xml (original)
+++ ant/sandbox/antdsl/branches/import-experiment/ivysettings.xml Sat Aug 25 17:21:05 2012
@@ -10,6 +10,7 @@
</caches>
<resolvers>
+ <ibiblio name="maven" m2compatible="true" />
<updatesite name="eclipse-juno" url="http://download.eclipse.org/releases/juno" cache="eclipse-juno" requirementStrategy="first" />
<updatesite name="xtext" url="http://download.itemis.com/updates/releases" cache="xtext" requirementStrategy="first" />
@@ -17,6 +18,7 @@
<chain name="all" returnFirst="true">
<resolver ref="eclipse-juno" />
<resolver ref="xtext" />
+ <resolver ref="maven" />
</chain>
</resolvers>
Modified: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/.classpath
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/.classpath?rev=1377330&r1=1377329&r2=1377330&view=diff
==============================================================================
Binary files - no diff available.
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=1377330&r1=1377329&r2=1377330&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 Sat Aug 25 17:21:05 2012
@@ -68,6 +68,10 @@ 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_CLASSLOADER_STACK = "antdsl.classloader.stack";
+
public String getDefaultBuildFile() {
return "build.ant";
}
@@ -93,6 +97,22 @@ 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>();
+ project.addReference(REFID_CLASSLOADER_STACK, classloaderStack);
+ }
+
if (getImportStack().size() > 1) {
context.setIgnoreProjectTag(true);
Target currentTarget = context.getCurrentTarget();
@@ -114,6 +134,8 @@ public abstract class AbstractAntDslProj
}
} else {
// top level file
+ classloaderStack.push(getOSGiFrameworkManager(project).getGodClassLoader());
+
context.setCurrentTargets(new HashMap<String, Target>());
parse(project, source, context);
@@ -145,6 +167,14 @@ public abstract class AbstractAntDslProj
}
}
+ private OSGiFrameworkManager getOSGiFrameworkManager(Project p) {
+ return p.getReference(REFID_OSGI_FRAMEWORK_MANAGER);
+ }
+
+ private Stack<ClassLoader> getClassloaderStack(Project p) {
+ return p.getReference(REFID_CLASSLOADER_STACK);
+ }
+
private void parse(Project project, Object source, AntDslContext context) {
File buildFile = null;
URL url = null;
@@ -306,6 +336,96 @@ public abstract class AbstractAntDslProj
return projectName;
}
+ protected void setupAntpath(Project project, AntDslContext context, List<InnerElement> antpathElements) {
+ UnknownElement element = new UnknownElement("path");
+ element.setProject(project);
+ RuntimeConfigurable wrapper = new RuntimeConfigurable(element, element.getTaskName());
+ context.pushWrapper(wrapper);
+ for (InnerElement antpathElement : antpathElements) {
+ UnknownElement child = mapUnknown(project, context, antpathElement, false);
+ element.addChild(child);
+ }
+ context.popWrapper();
+
+ Path path = new Path(project);
+ element.configure(path);
+
+ OSGiFrameworkManager osgiFrameworkManager = getOSGiFrameworkManager(project);
+ Iterator<Resource> itResources = path.iterator();
+ while (itResources.hasNext()) {
+ Resource resource = itResources.next();
+ String url;
+ if (resource instanceof URLProvider) {
+ url = ((URLProvider) resource).getURL().toExternalForm();
+ } else if (resource instanceof FileProvider) {
+ try {
+ url = ((FileProvider) resource).getFile().toURI().toURL().toExternalForm();
+ } catch (MalformedURLException e) {
+ throw new BuildException("Unable to get url of " + resource, e);
+ }
+ } else {
+ // very speculative, but let's try
+ url = resource.getName();
+ }
+ try {
+ osgiFrameworkManager.install(url);
+ } catch (BundleException e) {
+ throw new BuildException("Unable to install the bundle " + resource.getName() + " (" + e.getMessage() + ")", e);
+ }
+ }
+ }
+
+ protected void importAntlib(Project project, AntDslContext context, String name, String resource) {
+ // FIXME seems ugly
+ String uri = UUID.randomUUID().toString();
+
+ ClassLoader cl = getClassloaderStack(project).peek();
+
+ Taskdef taskdef = new Taskdef();
+ taskdef.setProject(project);
+ taskdef.setResource(resource);
+ taskdef.setURI(uri);
+ taskdef.setAntlibClassLoader(cl);
+ taskdef.execute();
+ context.addNamespace(name, uri);
+ }
+
+ protected void importBuildModule(Project project, AntDslContext context, String buildModule) {
+ ClassLoader cl = getClassloaderStack(project).peek();
+
+ URL buildUrl = cl.getResource(buildModule);
+ if (buildUrl == null) {
+ throw new BuildException("Unable to find the build module " + buildModule);
+ }
+ URLResource urlResource = new URLResource(buildUrl);
+
+ Vector<Object> importStack = getImportStack();
+
+ if (importStack.contains(urlResource)) {
+ project.log("Skipped already imported file:\n" + urlResource + "\n", Project.MSG_VERBOSE);
+ return;
+ }
+
+ ProjectHelper subHelper = ProjectHelperRepository.getInstance().getProjectHelperForBuildFile(urlResource);
+
+ // TODO
+ // add to the classloader stack the classloader of the imported build
+
+ // push current stacks into the sub helper
+ subHelper.getImportStack().addAll(this.getImportStack());
+ subHelper.getExtensionStack().addAll(this.getExtensionStack());
+ project.addReference(ProjectHelper.PROJECTHELPER_REFERENCE, subHelper);
+
+ subHelper.parse(project, urlResource);
+
+ // push back the stack from the sub helper to the main one
+ project.addReference(ProjectHelper.PROJECTHELPER_REFERENCE, this);
+ getImportStack().clear();
+ getImportStack().addAll(subHelper.getImportStack());
+ getExtensionStack().clear();
+ getExtensionStack().addAll(subHelper.getExtensionStack());
+ }
+
public void mapCommonTarget(
Target target, Project project, AntDslContext context, String name, String description, List<String> depends, List<String> extensionsOf,
String onMiss) {
Added: 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=1377330&view=auto
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java (added)
+++ ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java Sat Aug 25 17:21:05 2012
@@ -0,0 +1,179 @@
+package org.apache.ant.antdsl;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.tools.ant.BuildException;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.launch.Framework;
+import org.osgi.framework.launch.FrameworkFactory;
+
+public class OSGiFrameworkManager {
+
+ private static final String ANT_PACKAGES = "org.apache.tools.ant," + "org.apache.tools.ant.types," + "org.apache.tools.ant.taskdefs.condition,"
+ + "org.apache.tools.ant.taskdefs," + "org.apache.tools.ant.util";
+
+ private Framework framework;
+
+ private List<Bundle> bundleToStart = new ArrayList<Bundle>();
+
+ private Map<String, ClassLoader> classloaders = new LinkedHashMap<String, ClassLoader>();
+
+ private GodClassLoader godClassLoader;
+
+ public OSGiFrameworkManager() throws BundleException {
+ Map<String, String> configMap = new HashMap<String, String>();
+ configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES_EXTRA, ANT_PACKAGES);
+ framework = getFrameworkFactory().newFramework(configMap);
+ framework.init();
+ godClassLoader = new GodClassLoader();
+ }
+
+ private FrameworkFactory getFrameworkFactory() {
+ URL url = OSGiFrameworkManager.class.getClassLoader().getResource("META-INF/services/org.osgi.framework.launch.FrameworkFactory");
+ if (url == null) {
+ throw new BuildException("No OSGi framework could be found in Ant's classpath");
+ }
+ BufferedReader br = null;
+ try {
+ br = new BufferedReader(new InputStreamReader(url.openStream()));
+ for (String s = br.readLine(); s != null; s = br.readLine()) {
+ s = s.trim();
+ // Try to load first non-empty, non-commented line.
+ if ((s.length() > 0) && (s.charAt(0) != '#')) {
+ return (FrameworkFactory) Class.forName(s).newInstance();
+ }
+ }
+ } catch (Exception e) {
+ throw new BuildException("The OSGi framework factory could not be instanciated (" + e.getMessage() + ")", e);
+ } finally {
+ if (br != null) {
+ try {
+ br.close();
+ } catch (IOException e) {
+ // don't care
+ }
+ }
+ }
+ throw new BuildException("No OSGi framework factory found");
+ }
+
+ public void install(String bundleURI) throws BundleException {
+ Bundle bundle = framework.getBundleContext().installBundle(bundleURI);
+ classloaders.put(bundleURI, new BundleClassLoader(bundle));
+ if (!isFragment(bundle)) {
+ bundleToStart.add(bundle);
+ }
+ }
+
+ private static boolean isFragment(Bundle bundle) {
+ return bundle.getHeaders().get(Constants.FRAGMENT_HOST) != null;
+ }
+
+ public void start() throws BundleException {
+ framework.start();
+ Runtime.getRuntime().addShutdownHook(new Thread("OSGi Framwork Shutdown Hook") {
+ public void run() {
+ try {
+ if (framework != null) {
+ framework.stop();
+ framework.waitForStop(0);
+ }
+ } catch (Exception ex) {
+ System.err.println("Error stopping framework: " + ex);
+ }
+ }
+ });
+ for (Bundle bundle : bundleToStart) {
+ bundle.start();
+ }
+ }
+
+ public ClassLoader getClassloader(String bundleURI) {
+ return classloaders.get(bundleURI);
+ }
+
+ public GodClassLoader getGodClassLoader() {
+ return godClassLoader;
+ }
+
+ private static class BundleClassLoader extends ClassLoader {
+
+ private Bundle bundle;
+
+ private BundleClassLoader(Bundle bundle) {
+ super(null);
+ this.bundle = bundle;
+ }
+
+ @Override
+ public URL getResource(String name) {
+ return bundle.getResource(name);
+ }
+
+ @Override
+ public Enumeration<URL> getResources(String name) throws IOException {
+ return bundle.getResources(name);
+ }
+
+ @Override
+ public Class< ? > loadClass(String name) throws ClassNotFoundException {
+ return bundle.loadClass(name);
+ }
+ }
+
+ private class GodClassLoader extends ClassLoader {
+
+ private GodClassLoader() {
+ super(null);
+ }
+
+ @Override
+ public URL getResource(String name) {
+ for (ClassLoader cl : classloaders.values()) {
+ URL url = cl.getResource(name);
+ if (url != null) {
+ return url;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public Enumeration<URL> getResources(String name) throws IOException {
+ List<URL> urls = new ArrayList<URL>();
+ for (ClassLoader cl : classloaders.values()) {
+ Enumeration<URL> resources = cl.getResources(name);
+ if (resources != null) {
+ urls.addAll(Collections.list(resources));
+ }
+ }
+ return Collections.enumeration(urls);
+ }
+
+ @Override
+ public Class< ? > loadClass(String name) throws ClassNotFoundException {
+ for (ClassLoader cl : classloaders.values()) {
+ try {
+ return cl.loadClass(name);
+ } catch (ClassNotFoundException e) {
+ // next...
+ }
+ }
+ throw new ClassNotFoundException();
+ }
+
+ }
+
+}
Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/OSGiFrameworkManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext?rev=1377330&r1=1377329&r2=1377330&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext (original)
+++ ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDSL.xtext Sat Aug 25 17:21:05 2012
@@ -28,13 +28,22 @@ EProject:
& ('default' ':' default=Identifier)?
& ('basedir' ':' basedir=StringLiteral)?
)
- ('namespaces' '{' namespaces+=ENamespace* '}')?
+ ('antpath' '{' antpath+=EInnerElement* '}')?
+ ('import' imports+=EImport)*
tasks=ETaskLists?
(targets+=ETarget | extensionPoints+=EExtensionPoint | functionDefs+=EFunctionDef)*
;
-ENamespace:
- name=Identifier ':' uri=StringLiteral
+EImport:
+ EAntlibImport | EBuildImport
+;
+
+EAntlibImport:
+ 'antlib' resource=StringLiteral 'as' name=Identifier
+;
+
+EBuildImport:
+ 'module' name=QualifiedName
;
EExtensionPoint:
@@ -353,6 +362,11 @@ terminal Identifier:
| '`' !('`')+ '`'
;
+terminal QualifiedName:
+ Identifier*
+ ('.' Identifier)*
+;
+
terminal fragment Letter:
'\u0024'
| '\u0041'..'\u005a'
Modified: ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java?rev=1377330&r1=1377329&r2=1377330&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java (original)
+++ ant/sandbox/antdsl/branches/import-experiment/org.apache.ant.antdsl/src/org/apache/ant/antdsl/xtext/AntDslXTextProjectHelper.java Sat Aug 25 17:21:05 2012
@@ -64,10 +64,12 @@ import org.apache.ant.antdsl.expr.Ternar
import org.apache.ant.antdsl.expr.VariableAntExpression;
import org.apache.ant.antdsl.xtext.antdsl.EAdditiveExpr;
import org.apache.ant.antdsl.xtext.antdsl.EAndExpr;
+import org.apache.ant.antdsl.xtext.antdsl.EAntlibImport;
import org.apache.ant.antdsl.xtext.antdsl.EArgument;
import org.apache.ant.antdsl.xtext.antdsl.EArguments;
import org.apache.ant.antdsl.xtext.antdsl.EBooleanLiteralExpr;
import org.apache.ant.antdsl.xtext.antdsl.EBranch;
+import org.apache.ant.antdsl.xtext.antdsl.EBuildImport;
import org.apache.ant.antdsl.xtext.antdsl.ECharacterLiteralExpr;
import org.apache.ant.antdsl.xtext.antdsl.EConditionedTasks;
import org.apache.ant.antdsl.xtext.antdsl.EConditionnalAndExpr;
@@ -85,6 +87,7 @@ import org.apache.ant.antdsl.xtext.antds
import org.apache.ant.antdsl.xtext.antdsl.EFuncExpr;
import org.apache.ant.antdsl.xtext.antdsl.EFunctionDef;
import org.apache.ant.antdsl.xtext.antdsl.EHexLiteralExpr;
+import org.apache.ant.antdsl.xtext.antdsl.EImport;
import org.apache.ant.antdsl.xtext.antdsl.EInclusiveOrExpr;
import org.apache.ant.antdsl.xtext.antdsl.EInnerElement;
import org.apache.ant.antdsl.xtext.antdsl.EInnerElements;
@@ -92,7 +95,6 @@ import org.apache.ant.antdsl.xtext.antds
import org.apache.ant.antdsl.xtext.antdsl.ELocalAssignment;
import org.apache.ant.antdsl.xtext.antdsl.ELocalPropertyFuncArgument;
import org.apache.ant.antdsl.xtext.antdsl.EMultiplicativeExpr;
-import org.apache.ant.antdsl.xtext.antdsl.ENamespace;
import org.apache.ant.antdsl.xtext.antdsl.ENullExpr;
import org.apache.ant.antdsl.xtext.antdsl.EOctalLiteralExpr;
import org.apache.ant.antdsl.xtext.antdsl.EProject;
@@ -162,10 +164,27 @@ public class AntDslXTextProjectHelper ex
setupProject(project, context, name, basedir, def);
- EList<ENamespace> namespaces = eProject.getNamespaces();
- if (namespaces != null) {
- for (ENamespace namespace : namespaces) {
- context.addNamespace(readIdentifier(namespace.getName()), readString(namespace.getUri()));
+ EList<EInnerElement> eAntpathElements = eProject.getAntpath();
+ if (eAntpathElements != null) {
+ List<InnerElement> antpathElements = new ArrayList<InnerElement>();
+ for (EInnerElement eAntpathElement : eAntpathElements) {
+ antpathElements.add(mapInnerElement(project, context, eAntpathElement));
+ }
+ setupAntpath(project, context, antpathElements);
+ }
+
+ EList<EImport> eImports = eProject.getImports();
+ if (eImports != null) {
+ for (EImport eImport : eImports) {
+ if (eImport instanceof EAntlibImport) {
+ EAntlibImport eAntlibImport = (EAntlibImport) eImport;
+ importAntlib(project, context, readIdentifier(eAntlibImport.getName()), readString(eAntlibImport.getResource()));
+ } else if (eImport instanceof EBuildImport) {
+ EBuildImport eBuildImport = (EBuildImport) eImport;
+ // TODO
+ } else {
+ throw new IllegalArgumentException("Unsupported import " + eImport.getClass().getName());
+ }
}
}
Propchange: ant/sandbox/antdsl/branches/import-experiment/test/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Sat Aug 25 17:21:05 2012
@@ -0,0 +1,2 @@
+org.apache.ant.antunit-1.2.jar
+ant-antunit-1.2.jar
Added: ant/sandbox/antdsl/branches/import-experiment/test/ant-antunit-1.2.bnd
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/test/ant-antunit-1.2.bnd?rev=1377330&view=auto
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/test/ant-antunit-1.2.bnd (added)
+++ ant/sandbox/antdsl/branches/import-experiment/test/ant-antunit-1.2.bnd Sat Aug 25 17:21:05 2012
@@ -0,0 +1,4 @@
+version=1.2
+
+Bundle-Version: ${version}
+Bundle-SymbolicName: org.apache.ant.antunit
Modified: ant/sandbox/antdsl/branches/import-experiment/test/build.ant
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/test/build.ant?rev=1377330&r1=1377329&r2=1377330&view=diff
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/test/build.ant (original)
+++ ant/sandbox/antdsl/branches/import-experiment/test/build.ant Sat Aug 25 17:21:05 2012
@@ -1,72 +1,13 @@
name : myproject
default : build
-namespaces {
- antunit : "antlib:org.apache.ant.antunit"
+antpath {
+ file(file = "test/org.apache.ant.antunit-1.2.jar")
}
+import antlib "org/apache/ant/antunit/antlib.xml" as antunit
-{
- prop foo = "hello world!"
- echo(message = ${foo})
-}
-
-# Some documentation of the function
-function myfunction(local t = "myfunction")
-{
- echo(message = ${t})
-}
-
-function myfunction2(local dest, implicit element source)
-{
- copy(todir = ${dest}, {
- source()
- })
-}
-
-target dep {
- echo(message = "target dependency")
-}
-
-target notexecuted
- unless isset(property = "foo")
-{
- echo(message = "must not be printed")
-}
-
-# description of the target
-# which is on a multiline
target build
- depends dep, notexecuted
{
- copy(file = ${basedir} + "/test/build.ant", tofile = ${basedir} + "/build/test/build.ant.copy")
- // some comment
- jar(file = ${basedir} + "/build/test/my.jar" {
- fileset(dir = ${basedir} + "/test", includes = "*.ant")
- })
- myfunction()
- myfunction(t = "simple function")
- /*
- * Some multiline comment
- */
- if (available(file = ${basedir} + "/test/build.ant")) {
- myfunction2(dest = ${basedir} + "/build/test/dest", {
- fileset(dir = ${basedir}, includes = "build.*")
- })
- } else {
- fail(message = "fail !")
- }
- if (isset(property = "foo") && !isset(property = "notsetproperty")) {
- echo(message = "test ok")
- } else {
- fail(message = "fail !")
- }
- echo(message = "test encoding\\backslash")
- echo(message = "test encoding\ttab")
- echo(message = "test encoding\nline")
-
- local test = "hello" + ' ' + "world !"
- echo(message = ${test})
- local test2 = ((12345 + 6789) % 98765 == 12.4f)
- echo(message = ${test2})
- echo(message = eval("${test2}"))
+ antunit:assertEquals(expected = "test", actual = "test")
+ antunit:assertEquals(expected = "test", actual = "nok")
}
Added: ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh
URL: http://svn.apache.org/viewvc/ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh?rev=1377330&view=auto
==============================================================================
--- ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh (added)
+++ ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh Sat Aug 25 17:21:05 2012
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+wget "http://repo1.maven.org/maven2/org/apache/ant/ant-antunit/1.2/ant-antunit-1.2.jar"
+bnd wrap -output org.apache.ant.antunit-1.2.jar -properties ant-antunit-1.2.bnd ant-antunit-1.2.jar
Propchange: ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh
------------------------------------------------------------------------------
svn:executable = *
Propchange: ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh
------------------------------------------------------------------------------
svn:keywords = Date Revision Author HeadURL Id
Propchange: ant/sandbox/antdsl/branches/import-experiment/test/getAntUnitOSGi.sh
------------------------------------------------------------------------------
svn:mime-type = text/plain