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/15 12:40:17 UTC

svn commit: r1373326 - in /ant/core/trunk: ./ src/main/org/apache/tools/ant/ src/main/org/apache/tools/ant/helper/ src/tests/antunit/core/extension/

Author: hibou
Date: Wed Aug 15 10:40:16 2012
New Revision: 1373326

URL: http://svn.apache.org/viewvc?rev=1373326&view=rev
Log:
BR 53550, thanks to Tim Pokorny
Improve the resolution of the extension point to bind to:
- first try the extension point which might be in the same file
- then try the one in the root file

Still some work to do: there might be intermediate file in the import stack which we would to resolve the name against, but the ProjectHelper doesn't hold the prefix stacking.


Added:
    ant/core/trunk/src/tests/antunit/core/extension/
    ant/core/trunk/src/tests/antunit/core/extension/include-test.xml   (with props)
    ant/core/trunk/src/tests/antunit/core/extension/module1.xml   (with props)
Modified:
    ant/core/trunk/WHATSNEW
    ant/core/trunk/src/main/org/apache/tools/ant/ProjectHelper.java
    ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java

Modified: ant/core/trunk/WHATSNEW
URL: http://svn.apache.org/viewvc/ant/core/trunk/WHATSNEW?rev=1373326&r1=1373325&r2=1373326&view=diff
==============================================================================
--- ant/core/trunk/WHATSNEW (original)
+++ ant/core/trunk/WHATSNEW Wed Aug 15 10:40:16 2012
@@ -88,6 +88,9 @@ Other changes:
    and extension points.
    Bugzilla Report 53549.
 
+ * Make extension point bindable to imported prefixed targets
+   Bugzilla Report 53550.
+
 Changes from Ant 1.8.3 TO Ant 1.8.4
 ===================================
 

Modified: ant/core/trunk/src/main/org/apache/tools/ant/ProjectHelper.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/ProjectHelper.java?rev=1373326&r1=1373325&r2=1373326&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/ProjectHelper.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/ProjectHelper.java Wed Aug 15 10:40:16 2012
@@ -629,27 +629,52 @@ public class ProjectHelper {
     public void resolveExtensionOfAttributes(Project project)
             throws BuildException {
         for (String[] extensionInfo : getExtensionStack()) {
-            String tgName = extensionInfo[0];
-            String name = extensionInfo[1];
+            String extPointName = extensionInfo[0];
+            String targetName = extensionInfo[1];
             OnMissingExtensionPoint missingBehaviour = OnMissingExtensionPoint.valueOf(extensionInfo[2]);
+            // if the file has been included or imported, it may have a prefix
+            // we should consider when trying to resolve the target it is
+            // extending
+            String prefixAndSep = extensionInfo.length > 3 ? extensionInfo[3] : null;
+
+            // find the target we're extending
             Hashtable projectTargets = project.getTargets();
-            if (!projectTargets.containsKey(tgName)) {
-                String message = "can't add target " + name
-                        + " to extension-point " + tgName
+            Target extPoint = null;
+            if (prefixAndSep == null) {
+                // no prefix - not from an imported/included build file
+                extPoint = (Target) projectTargets.get(extPointName);
+            } else {
+                // we have a prefix, which means we came from an include/import
+
+                // FIXME: here we handle no particular level of include. We try
+                // the fully prefixed name, and then the non-prefixed name. But
+                // there might be intermediate project in the import stack,
+                // which prefix should be tested before testing the non-prefix
+                // root name.
+
+                extPoint = (Target) projectTargets.get(prefixAndSep + extPointName);
+                if (extPoint == null) {
+                    extPoint = (Target) projectTargets.get(extPointName);
+                }
+            }
+
+            // make sure we found a point to extend on
+            if (extPoint == null) {
+                String message = "can't add target " + targetName
+                        + " to extension-point " + extPointName
                         + " because the extension-point is unknown.";
                 if (missingBehaviour == OnMissingExtensionPoint.FAIL) {
                     throw new BuildException(message);
                 } else if (missingBehaviour == OnMissingExtensionPoint.WARN) {
-                    Target target = (Target) projectTargets.get(name);
-                    project.log(target, "Warning: " + message, Project.MSG_WARN);
+                    Target t = (Target) projectTargets.get(targetName);
+                    project.log(t, "Warning: " + message, Project.MSG_WARN);
                 }
             } else {
-                Target t = (Target) projectTargets.get(tgName);
-                if (!(t instanceof ExtensionPoint)) {
-                    throw new BuildException("referenced target " + tgName
+                if (!(extPoint instanceof ExtensionPoint)) {
+                    throw new BuildException("referenced target " + extPointName
                             + " is not an extension-point");
                 }
-                t.addDependency(name);
+                extPoint.addDependency(targetName);
             }
         }
     }

Modified: ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java?rev=1373326&r1=1373325&r2=1373326&view=diff
==============================================================================
--- ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java (original)
+++ ant/core/trunk/src/main/org/apache/tools/ant/helper/ProjectHelper2.java Wed Aug 15 10:40:16 2012
@@ -1011,17 +1011,24 @@ public class ProjectHelper2 extends Proj
                 ProjectHelper helper =
                     (ProjectHelper) context.getProject().
                     getReference(ProjectHelper.PROJECTHELPER_REFERENCE);
-                for (String tgName : Target.parseDepends(extensionPoint, name, "extensionOf")) {
-                    if (isInIncludeMode()) {
-                        tgName = prefix + sep + tgName;
-                    }
+                for (String extPointName : Target.parseDepends(extensionPoint, name, "extensionOf")) {
                     if (extensionPointMissing == null) {
                         extensionPointMissing = OnMissingExtensionPoint.FAIL;
                     }
                     // defer extensionpoint resolution until the full
                     // import stack has been processed
-                    helper.getExtensionStack().add(new String[] {
-                            tgName, name, extensionPointMissing.name() });
+                    if (isInIncludeMode()) {
+                        // if in include mode, provide prefix we're including by
+                        // so that we can try and resolve extension point from
+                        // the local file first
+                        helper.getExtensionStack().add(
+                                new String[] {extPointName, target.getName(),
+                                        extensionPointMissing.name(), prefix + sep});
+                    } else {
+                        helper.getExtensionStack().add(
+                                new String[] {extPointName, target.getName(),
+                                        extensionPointMissing.name()});
+                    }
                 }
             }
         }

Added: ant/core/trunk/src/tests/antunit/core/extension/include-test.xml
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/core/extension/include-test.xml?rev=1373326&view=auto
==============================================================================
--- ant/core/trunk/src/tests/antunit/core/extension/include-test.xml (added)
+++ ant/core/trunk/src/tests/antunit/core/extension/include-test.xml Wed Aug 15 10:40:16 2012
@@ -0,0 +1,34 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<project xmlns:au="antlib:org.apache.ant.antunit" default="antunit">
+
+    <import file="../../antunit-base.xml" />
+
+    <!-- declare a target that depends on the extension point -->
+    <target name="compile" depends="all.compile" />
+
+    <!-- declare our extension point -->
+    <extension-point name="all.compile" />
+
+    <!-- import all our modules -->
+    <import file="module1.xml" as="module1" />
+
+    <target name="testImport" depends="compile">
+        <au:assertLogContains text="In module1 compile. Yay!" />
+    </target>
+</project>

Propchange: ant/core/trunk/src/tests/antunit/core/extension/include-test.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/core/trunk/src/tests/antunit/core/extension/include-test.xml
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/core/trunk/src/tests/antunit/core/extension/include-test.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml

Added: ant/core/trunk/src/tests/antunit/core/extension/module1.xml
URL: http://svn.apache.org/viewvc/ant/core/trunk/src/tests/antunit/core/extension/module1.xml?rev=1373326&view=auto
==============================================================================
--- ant/core/trunk/src/tests/antunit/core/extension/module1.xml (added)
+++ ant/core/trunk/src/tests/antunit/core/extension/module1.xml Wed Aug 15 10:40:16 2012
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!--
+  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.
+-->
+<project name="module1">
+
+	<!-- declare a target with the same name as one in the master -->
+	<target name="compile" extensionOf="all.compile">
+		<echo message="In module1 compile. Yay!"/>
+	</target>
+
+</project>

Propchange: ant/core/trunk/src/tests/antunit/core/extension/module1.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: ant/core/trunk/src/tests/antunit/core/extension/module1.xml
------------------------------------------------------------------------------
    svn:keywords = Date Revision Author HeadURL Id

Propchange: ant/core/trunk/src/tests/antunit/core/extension/module1.xml
------------------------------------------------------------------------------
    svn:mime-type = text/xml