You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by jl...@apache.org on 2013/05/24 14:57:49 UTC

svn commit: r1486043 - in /ant/easyant/core/trunk/src: main/java/org/apache/easyant/core/ant/listerners/ main/java/org/apache/easyant/core/services/impl/ main/java/org/apache/easyant/tasks/ test/java/org/apache/easyant/core/services/

Author: jlboudart
Date: Fri May 24 12:57:49 2013
New Revision: 1486043

URL: http://svn.apache.org/r1486043
Log:
EASYANT-57 Task declared in imported/included build script are not handled by PluginService 


Added:
    ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/TaskCollectorFromImplicitTargetListener.java
Modified:
    ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java
    ant/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/LoadModule.java
    ant/easyant/core/trunk/src/test/java/org/apache/easyant/core/services/PluginServiceTest.java

Added: ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/TaskCollectorFromImplicitTargetListener.java
URL: http://svn.apache.org/viewvc/ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/TaskCollectorFromImplicitTargetListener.java?rev=1486043&view=auto
==============================================================================
--- ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/TaskCollectorFromImplicitTargetListener.java (added)
+++ ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/ant/listerners/TaskCollectorFromImplicitTargetListener.java Fri May 24 12:57:49 2013
@@ -0,0 +1,103 @@
+/*
+ *  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.easyant.core.ant.listerners;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.easyant.tasks.Import;
+import org.apache.easyant.tasks.ParameterTask;
+import org.apache.easyant.tasks.PathTask;
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.BuildListener;
+import org.apache.tools.ant.ComponentHelper;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Property;
+import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.Path;
+
+public class TaskCollectorFromImplicitTargetListener implements BuildListener {
+    private List<Task> tasksCollected = new ArrayList<Task>();
+    private List<Class<?>> supportedClasses = new ArrayList<Class<?>>();
+
+    public TaskCollectorFromImplicitTargetListener() {
+        supportedClasses.add(ParameterTask.class);
+        supportedClasses.add(Property.class);
+        supportedClasses.add(Import.class);
+        supportedClasses.add(Path.class);
+        supportedClasses.add(PathTask.class);
+        supportedClasses.add(FileSet.class);
+    }
+
+    public void taskStarted(BuildEvent buildEvent) {
+        if (buildEvent.getTarget().getName().equals("")) {
+            Task task = buildEvent.getTask();
+            if (task.getTaskType() != null) {
+                Class<?> taskClass = ComponentHelper.getComponentHelper(buildEvent.getProject()).getComponentClass(
+                        task.getTaskType());
+                if (taskClass != null) {
+                    for (Class<?> supportedClass : supportedClasses) {
+                        if (supportedClass.isAssignableFrom(taskClass)) {
+                            tasksCollected.add(task);
+                        }
+                    }
+                }
+            }
+
+        }
+    }
+
+    public List<Task> getTasksCollected() {
+        return tasksCollected;
+    }
+
+    public List<Class<?>> getSupportedClasses() {
+        return supportedClasses;
+    }
+
+    public void buildFinished(BuildEvent buildEvent) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void buildStarted(BuildEvent buildEvent) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void messageLogged(BuildEvent buildEvent) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void targetFinished(BuildEvent buildEvent) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void targetStarted(BuildEvent buildEvent) {
+        // TODO Auto-generated method stub
+
+    }
+
+    public void taskFinished(BuildEvent buildEvent) {
+        // TODO Auto-generated method stub
+
+    }
+
+}

Modified: ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java
URL: http://svn.apache.org/viewvc/ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java?rev=1486043&r1=1486042&r2=1486043&view=diff
==============================================================================
--- ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java (original)
+++ ant/easyant/core/trunk/src/main/java/org/apache/easyant/core/services/impl/DefaultPluginServiceImpl.java Fri May 24 12:57:49 2013
@@ -29,6 +29,7 @@ import java.util.Map.Entry;
 import org.apache.easyant.core.EasyAntConstants;
 import org.apache.easyant.core.EasyAntMagicNames;
 import org.apache.easyant.core.ant.ProjectUtils;
+import org.apache.easyant.core.ant.listerners.TaskCollectorFromImplicitTargetListener;
 import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
 import org.apache.easyant.core.descriptor.PluginType;
 import org.apache.easyant.core.descriptor.PropertyDescriptor;
@@ -63,6 +64,7 @@ import org.apache.ivy.plugins.repository
 import org.apache.ivy.plugins.resolver.DependencyResolver;
 import org.apache.ivy.util.Message;
 import org.apache.tools.ant.BuildException;
+import org.apache.tools.ant.BuildListener;
 import org.apache.tools.ant.ComponentHelper;
 import org.apache.tools.ant.ExtensionPoint;
 import org.apache.tools.ant.Location;
@@ -206,6 +208,8 @@ public class DefaultPluginServiceImpl im
         project.setNewProperty(EasyAntMagicNames.AUDIT_MODE, "true");
         project.setNewProperty(EasyAntMagicNames.SKIP_CORE_REVISION_CHECKER, "true");
         project.addReference(EasyAntMagicNames.EASYANT_IVY_INSTANCE, easyantIvySettings);
+        project.addBuildListener(new TaskCollectorFromImplicitTargetListener());
+
         if (properties != null) {
             for (Entry<String, String> entry : properties.entrySet()) {
                 project.setNewProperty(entry.getKey(), entry.getValue());
@@ -217,40 +221,28 @@ public class DefaultPluginServiceImpl im
     }
 
     private void analyseProject(Project project, EasyAntReport eaReport, String conf) throws IOException, Exception {
+        // handle tasks from implicit target
+        // When using import/include, ant create a "implicit target" to process root tasks. When tasks are declared
+        // outside of a target in root project we are able to parse them "normally" as this implicit target is added to
+        // the project. However this is not the case for tasks declared outside any target in imported build script.
+        // So we use a listener to collect required informations
+        for (BuildListener buildListener : project.getBuildListeners()) {
+            if (buildListener instanceof TaskCollectorFromImplicitTargetListener) {
+                TaskCollectorFromImplicitTargetListener taskCollectorFromImplicitTargetListener = (TaskCollectorFromImplicitTargetListener) buildListener;
+                for (Task task : taskCollectorFromImplicitTargetListener.getTasksCollected()) {
+                    handleTask(project, eaReport, conf, task);
+                }
+            }
+        }
+
+        // handle tasks declared in targets
         Map<String, Target> targets = ProjectUtils.removeDuplicateTargets(project.getTargets());
         for (Target target : targets.values()) {
-            handleTarget(target, eaReport);
-            for (int i = 0; i < target.getTasks().length; i++) {
-                Task task = target.getTasks()[i];
-                Class<?> taskClass = ComponentHelper.getComponentHelper(project).getComponentClass(task.getTaskType());
-                if (taskClass == null) {
-                    continue;
-                }
-                if (ParameterTask.class.isAssignableFrom(taskClass)) {
-                    ParameterTask parameterTask = (ParameterTask) maybeConfigureTask(task);
-                    handleParameterTask(parameterTask, eaReport);
-                }
-                if (Property.class.isAssignableFrom(taskClass)) {
-                    Property propertyTask = (Property) maybeConfigureTask(task);
-                    handleProperty(propertyTask, eaReport);
-                }
-                if (Import.class.isAssignableFrom(taskClass)) {
-                    Import importTask = (Import) maybeConfigureTask(task);
-                    handleImport(importTask, eaReport, conf);
-                }
-                if (Path.class.isAssignableFrom(taskClass)) {
-                    Path path = (Path) maybeConfigureTask(task);
-                    handlePathParameter(task.getRuntimeConfigurableWrapper().getId(), path, task.getOwningTarget(),
-                            eaReport);
-                }
-                if (PathTask.class.isAssignableFrom(taskClass)) {
-                    PathTask pathTask = (PathTask) maybeConfigureTask(task);
-                    handlePathParameter(pathTask, eaReport);
-                }
-                if (FileSet.class.isAssignableFrom(taskClass)) {
-                    FileSet fileSet = (FileSet) maybeConfigureTask(task);
-                    handleFilesetParameter(task.getRuntimeConfigurableWrapper().getId(), fileSet, task
-                            .getOwningTarget(), eaReport);
+            if (!"".equals(target.getName())) {
+                handleTarget(target, eaReport);
+                for (int i = 0; i < target.getTasks().length; i++) {
+                    Task task = target.getTasks()[i];
+                    handleTask(project, eaReport, conf, task);
                 }
             }
         }
@@ -270,6 +262,38 @@ public class DefaultPluginServiceImpl im
         }
     }
 
+    private void handleTask(Project project, EasyAntReport eaReport, String conf, Task task) throws Exception {
+        Class<?> taskClass = ComponentHelper.getComponentHelper(project).getComponentClass(task.getTaskType());
+        if (taskClass != null) {
+            if (ParameterTask.class.isAssignableFrom(taskClass)) {
+                ParameterTask parameterTask = (ParameterTask) maybeConfigureTask(task);
+                handleParameterTask(parameterTask, eaReport);
+            }
+            if (Property.class.isAssignableFrom(taskClass)) {
+                Property propertyTask = (Property) maybeConfigureTask(task);
+                handleProperty(propertyTask, eaReport);
+            }
+            if (Import.class.isAssignableFrom(taskClass)) {
+                Import importTask = (Import) maybeConfigureTask(task);
+                handleImport(importTask, eaReport, conf);
+            }
+            if (Path.class.isAssignableFrom(taskClass)) {
+                Path path = (Path) maybeConfigureTask(task);
+                handlePathParameter(task.getRuntimeConfigurableWrapper().getId(), path, task.getOwningTarget(),
+                        eaReport);
+            }
+            if (PathTask.class.isAssignableFrom(taskClass)) {
+                PathTask pathTask = (PathTask) maybeConfigureTask(task);
+                handlePathParameter(pathTask, eaReport);
+            }
+            if (FileSet.class.isAssignableFrom(taskClass)) {
+                FileSet fileSet = (FileSet) maybeConfigureTask(task);
+                handleFilesetParameter(task.getRuntimeConfigurableWrapper().getId(), fileSet, task.getOwningTarget(),
+                        eaReport);
+            }
+        }
+    }
+
     private void handleImport(Import importTask, EasyAntReport eaReport, String conf) throws Exception {
         ImportedModuleReport importedModuleReport = new ImportedModuleReport();
 
@@ -391,57 +415,55 @@ public class DefaultPluginServiceImpl im
     }
 
     private void handleTarget(Target target, EasyAntReport eaReport) {
-        if (!"".equals(target.getName())) {
-            boolean isExtensionPoint = target instanceof ExtensionPoint;
-            if (!isExtensionPoint) {
-                TargetReport targetReport = new TargetReport();
-                targetReport.setName(target.getName());
-                StringBuilder sb = new StringBuilder();
-                Enumeration<?> targetDeps = target.getDependencies();
-                while (targetDeps.hasMoreElements()) {
-                    String t = (String) targetDeps.nextElement();
-                    sb.append(t);
-                    if (targetDeps.hasMoreElements()) {
-                        sb.append(",");
-                    }
-                }
-                targetReport.setDepends(sb.toString());
-                targetReport.setDescription(target.getDescription());
-                targetReport.setIfCase(target.getIf());
-                targetReport.setUnlessCase(target.getUnless());
-                for (Iterator<?> iterator = target.getProject().getTargets().values().iterator(); iterator.hasNext();) {
-                    Target currentTarget = (Target) iterator.next();
-                    if (currentTarget instanceof ExtensionPoint) {
-                        Enumeration<?> dependencies = currentTarget.getDependencies();
-                        while (dependencies.hasMoreElements()) {
-                            String dep = (String) dependencies.nextElement();
-                            if (dep.equals(target.getName())) {
-                                targetReport.setExtensionPoint(currentTarget.getName());
-                            }
+        boolean isExtensionPoint = target instanceof ExtensionPoint;
+        if (!isExtensionPoint) {
+            TargetReport targetReport = new TargetReport();
+            targetReport.setName(target.getName());
+            StringBuilder sb = new StringBuilder();
+            Enumeration<?> targetDeps = target.getDependencies();
+            while (targetDeps.hasMoreElements()) {
+                String t = (String) targetDeps.nextElement();
+                sb.append(t);
+                if (targetDeps.hasMoreElements()) {
+                    sb.append(",");
+                }
+            }
+            targetReport.setDepends(sb.toString());
+            targetReport.setDescription(target.getDescription());
+            targetReport.setIfCase(target.getIf());
+            targetReport.setUnlessCase(target.getUnless());
+            for (Iterator<?> iterator = target.getProject().getTargets().values().iterator(); iterator.hasNext();) {
+                Target currentTarget = (Target) iterator.next();
+                if (currentTarget instanceof ExtensionPoint) {
+                    Enumeration<?> dependencies = currentTarget.getDependencies();
+                    while (dependencies.hasMoreElements()) {
+                        String dep = (String) dependencies.nextElement();
+                        if (dep.equals(target.getName())) {
+                            targetReport.setExtensionPoint(currentTarget.getName());
                         }
-
                     }
+
                 }
+            }
 
-                eaReport.addTargetReport(targetReport);
+            eaReport.addTargetReport(targetReport);
 
-                Message.debug("Ant file has a target called : " + targetReport.getName());
-            } else {
-                ExtensionPointReport extensionPoint = new ExtensionPointReport(target.getName());
-                StringBuilder sb = new StringBuilder();
-                Enumeration<?> targetDeps = target.getDependencies();
-                while (targetDeps.hasMoreElements()) {
-                    String t = (String) targetDeps.nextElement();
-                    sb.append(t);
-                    if (targetDeps.hasMoreElements()) {
-                        sb.append(",");
-                    }
+            Message.debug("Ant file has a target called : " + targetReport.getName());
+        } else {
+            ExtensionPointReport extensionPoint = new ExtensionPointReport(target.getName());
+            StringBuilder sb = new StringBuilder();
+            Enumeration<?> targetDeps = target.getDependencies();
+            while (targetDeps.hasMoreElements()) {
+                String t = (String) targetDeps.nextElement();
+                sb.append(t);
+                if (targetDeps.hasMoreElements()) {
+                    sb.append(",");
                 }
-                extensionPoint.setDepends(sb.toString());
-                extensionPoint.setDescription(target.getDescription());
-                eaReport.addExtensionPointReport(extensionPoint);
-                Message.debug("Ant file has an extensionPoint called : " + extensionPoint.getName());
             }
+            extensionPoint.setDepends(sb.toString());
+            extensionPoint.setDescription(target.getDescription());
+            eaReport.addExtensionPointReport(extensionPoint);
+            Message.debug("Ant file has an extensionPoint called : " + extensionPoint.getName());
         }
     }
 
@@ -484,13 +506,14 @@ public class DefaultPluginServiceImpl im
 
         Project p = buildProject(null);
         Target implicitTarget = ProjectUtils.createTopLevelTarget();
-        p.addTarget("", implicitTarget);
+        p.addTarget(implicitTarget);
         LoadModule loadModule = new LoadModule();
         loadModule.setBuildModule(moduleDescriptor);
         loadModule.setBuildFile(optionalAntModule);
         loadModule.setOwningTarget(implicitTarget);
         loadModule.setLocation(new Location(ProjectUtils.emulateMainScript(p).getAbsolutePath()));
         loadModule.setProject(p);
+        loadModule.setTaskName("load-module");
         loadModule.execute();
         ProjectHelper projectHelper = ProjectUtils.getConfiguredProjectHelper(p);
         projectHelper.resolveExtensionOfAttributes(p);

Modified: ant/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/LoadModule.java
URL: http://svn.apache.org/viewvc/ant/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/LoadModule.java?rev=1486043&r1=1486042&r2=1486043&view=diff
==============================================================================
--- ant/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/LoadModule.java (original)
+++ ant/easyant/core/trunk/src/main/java/org/apache/easyant/tasks/LoadModule.java Fri May 24 12:57:49 2013
@@ -250,7 +250,7 @@ public class LoadModule extends Abstract
             }
         }
 
-        initTask(projectIvyInstance).execute();
+        initTask(projectIvyInstance).perform();
 
         // FIXME: hack as ResolutionCacheManager use XmlModuleDescriptorParser under the hood
         EasyAntRepositoryCacheManager cacheManager = new EasyAntRepositoryCacheManager("default-project-cache",
@@ -268,7 +268,7 @@ public class LoadModule extends Abstract
         ImportTask importTask = new ImportTask();
         importTask.setFile(buildModule.getAbsolutePath());
         importTask.setOptional(true);
-        initTask(importTask).execute();
+        initTask(importTask).perform();
     }
 
     protected void loadBuildModule(File buildModule) {
@@ -302,7 +302,7 @@ public class LoadModule extends Abstract
                     propTask.setBuildConfigurations(property.getBuildConfigurations());
                     propTask.setTaskType("antlib:org.apache.easyant:property");
                     getOwningTarget().addTask(propTask);
-                    initTask(propTask).execute();
+                    initTask(propTask).perform();
                 }
             }
             if (md.getConfigureProjectDescriptor() != null) {
@@ -312,7 +312,7 @@ public class LoadModule extends Abstract
                 configureProject.setBasedir(descriptor.getBasedir());
                 configureProject.setTaskType("antlib:org.apache.easyant:configure-project");
                 getOwningTarget().addTask(configureProject);
-                initTask(configureProject).execute();
+                initTask(configureProject).perform();
             }
 
             if (md.getBuildType() != null) {
@@ -329,7 +329,7 @@ public class LoadModule extends Abstract
 
                     importTask.setTaskType("antlib:org.apache.easyant:import");
                     getOwningTarget().addTask(importTask);
-                    initTask(importTask).execute();
+                    initTask(importTask).perform();
                 }
             }
             for (Iterator<?> iterator = md.getPlugins().iterator(); iterator.hasNext();) {
@@ -347,7 +347,7 @@ public class LoadModule extends Abstract
                     importTask.setExcludes(plugin.getExcludes());
                     importTask.setTaskType("antlib:org.apache.easyant:import");
                     getOwningTarget().addTask(importTask);
-                    initTask(importTask).execute();
+                    initTask(importTask).perform();
                 }
             }
             // Apply ExtensionPointMapping
@@ -356,7 +356,7 @@ public class LoadModule extends Abstract
                 bindTarget.setTarget(epMapping.getTarget());
                 bindTarget.setExtensionOf(epMapping.getExtensionPoint());
                 bindTarget.setBuildConfigurations(epMapping.getBuildConfigurations());
-                initTask(bindTarget).execute();
+                initTask(bindTarget).perform();
             }
         } catch (Exception e) {
             throw new BuildException("problem while parsing Ivy module file: " + e.getMessage(), e);
@@ -473,7 +473,7 @@ public class LoadModule extends Abstract
         configureBuildScopedRepository.setSettingsRef(IvyInstanceHelper.buildProjectIvyReference(getProject()));
         configureBuildScopedRepository.setGenerateWrapperResoler(true);
         getProject().setProperty(EasyAntMagicNames.EASYANT_BUILD_REPOSITORY, EasyAntConstants.BUILD_SCOPE_REPOSITORY);
-        initTask(configureBuildScopedRepository).execute();
+        initTask(configureBuildScopedRepository).perform();
     }
 
 }

Modified: ant/easyant/core/trunk/src/test/java/org/apache/easyant/core/services/PluginServiceTest.java
URL: http://svn.apache.org/viewvc/ant/easyant/core/trunk/src/test/java/org/apache/easyant/core/services/PluginServiceTest.java?rev=1486043&r1=1486042&r2=1486043&view=diff
==============================================================================
--- ant/easyant/core/trunk/src/test/java/org/apache/easyant/core/services/PluginServiceTest.java (original)
+++ ant/easyant/core/trunk/src/test/java/org/apache/easyant/core/services/PluginServiceTest.java Fri May 24 12:57:49 2013
@@ -92,7 +92,7 @@ public class PluginServiceTest {
 
         // the report should contain the run-java plugin
         boolean containsBuildType = false;
-        boolean containsPlugin = true;
+        boolean containsPlugin = false;
         for (ImportedModuleReport importedModule : eaReport.getImportedModuleReports()) {
             if (importedModule.getModuleMrid().equals("org.apache.easyant.buildtypes#build-std-java;0.9")) {
                 containsBuildType = true;
@@ -154,4 +154,23 @@ public class PluginServiceTest {
         String description = pluginService.getPluginDescription("org.apache.easyant.plugins#run-java;0.9");
         Assert.assertEquals("This module provides java bytecode execution feature.", description);
     }
+
+    @Test
+    public void testGetPluginInfo() throws Exception {
+        EasyAntReport pluginInfo = pluginService.getPluginInfo("org.apache.easyant.plugins#compile-java;0.9");
+        Assert.assertNotNull(pluginInfo);
+        Assert.assertEquals(2, pluginInfo.getImportedModuleReports().size());
+        ImportedModuleReport importedModuleReport = pluginInfo.getImportedModuleReport("abstract-compile");
+        Assert.assertNotNull(importedModuleReport);
+        Assert.assertNotNull(importedModuleReport.getEasyantReport());
+        // abstract-compile import abstract-provisioning
+        Assert.assertEquals(1, importedModuleReport.getEasyantReport().getImportedModuleReports().size());
+
+        Assert.assertNotNull(pluginInfo.getPropertyDescriptors().get("compile.java.includes.pattern"));
+        Assert.assertEquals("**/*.java", pluginInfo.getPropertyDescriptors().get("compile.java.includes.pattern")
+                .getDefaultValue());
+        Assert.assertNotNull(pluginInfo.getPropertyDescriptors().get("target.test.integration.classes"));
+        Assert.assertEquals("target/integration-test/classes", pluginInfo.getPropertyDescriptors().get(
+                "target.test.integration.classes").getDefaultValue());
+    }
 }