diff --git a/WHATSNEW b/WHATSNEW index eded0c2bf..af87578c3 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -83,6 +83,11 @@ Other changes: it is more portable. For backwards compatibility reasons "warn" will still create "gnu" extensions rather than "posix" extensions. + * The ProjectHelper class now exposes a method to be used by third party + implementations to properly resolve the binding between target extensions + and extension points. + Bugzilla Report 53549. + Changes from Ant 1.8.3 TO Ant 1.8.4 =================================== diff --git a/src/main/org/apache/tools/ant/ProjectHelper.java b/src/main/org/apache/tools/ant/ProjectHelper.java index 7b61160ba..b600de483 100644 --- a/src/main/org/apache/tools/ant/ProjectHelper.java +++ b/src/main/org/apache/tools/ant/ProjectHelper.java @@ -606,4 +606,51 @@ public class ProjectHelper { public String getDefaultBuildFile() { return Main.DEFAULT_BUILD_FILENAME; } + + /** + * Check extensionStack and inject all targets having extensionOf attributes + * into extensionPoint. + *

+ * This method allow you to defer injection and have a powerful control of + * extensionPoint wiring. + *

+ *

+ * This should be invoked by each concrete implementation of ProjectHelper + * when the root "buildfile" and all imported/included buildfile are loaded. + *

+ * + * @param project The project containing the target. Must not be + * null. + * @exception BuildException if OnMissingExtensionPoint.FAIL and + * extensionPoint does not exist + * @see OnMissingExtensionPoint + * @since 1.9 + */ + public void resolveExtensionOfAttributes(Project project) + throws BuildException { + for (String[] extensionInfo : getExtensionStack()) { + String tgName = extensionInfo[0]; + String name = extensionInfo[1]; + OnMissingExtensionPoint missingBehaviour = OnMissingExtensionPoint.valueOf(extensionInfo[2]); + Hashtable projectTargets = project.getTargets(); + if (!projectTargets.containsKey(tgName)) { + String message = "can't add target " + name + + " to extension-point " + tgName + + " 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); + } + } else { + Target t = (Target) projectTargets.get(tgName); + if (!(t instanceof ExtensionPoint)) { + throw new BuildException("referenced target " + tgName + + " is not an extension-point"); + } + t.addDependency(name); + } + } + } } diff --git a/src/main/org/apache/tools/ant/helper/ProjectHelper2.java b/src/main/org/apache/tools/ant/helper/ProjectHelper2.java index 24d74df19..b6dd419f7 100644 --- a/src/main/org/apache/tools/ant/helper/ProjectHelper2.java +++ b/src/main/org/apache/tools/ant/helper/ProjectHelper2.java @@ -180,34 +180,7 @@ public class ProjectHelper2 extends ProjectHelper { context.getImplicitTarget().execute(); // resolve extensionOf attributes - for (String[] extensionInfo : getExtensionStack()) { - String tgName = extensionInfo[0]; - String name = extensionInfo[1]; - OnMissingExtensionPoint missingBehaviour = OnMissingExtensionPoint - .valueOf(extensionInfo[2]); - Hashtable projectTargets = project.getTargets(); - if (!projectTargets.containsKey(tgName)) { - String message = "can't add target " + name - + " to extension-point " + tgName - + " 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); - context.getProject().log(target, - "Warning: " + message, - Project.MSG_WARN); - } - } else { - Target t = (Target) projectTargets.get(tgName); - if (!(t instanceof ExtensionPoint)) { - throw new BuildException("referenced target " - + tgName - + " is not an extension-point"); - } - t.addDependency(name); - } - } + resolveExtensionOfAttributes(project); } }