exception thrown by IntrospectionHelper PR: 31389 and 29499 Reported by: Tamas Szeredi and Jesse Glick git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@276882 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -23,6 +23,9 @@ Fixed bugs: | |||
| <exec>, <apply>, or <java> tasks was always logged to System.out | |||
| instead of to the managing Task. | |||
| * Incorrect task name with invalid "javac" task after a "presetdef. | |||
| Bugzilla reports 31389 and 29499. | |||
| Other changes: | |||
| -------------- | |||
| @@ -100,4 +100,22 @@ | |||
| </el.order2> | |||
| </target> | |||
| <target name="correct_taskname_badattr"> | |||
| <presetdef name="mytask"> | |||
| <javac srcdir="whatever"/> | |||
| </presetdef> | |||
| <javac srcdir="whatever" badattr="whatever"/> | |||
| </target> | |||
| <target name="correct_taskname_badel"> | |||
| <presetdef name="mytask"> | |||
| <javac srcdir="whatever"/> | |||
| </presetdef> | |||
| <javac srcdir="whatever"> | |||
| <badel/> | |||
| </javac> | |||
| </target> | |||
| </project> | |||
| @@ -490,7 +490,7 @@ public final class IntrospectionHelper implements BuildListener { | |||
| String msg = getElementName(p, element) | |||
| + " doesn't support the \"" + attributeName | |||
| + "\" attribute."; | |||
| throw new BuildException(msg); | |||
| throw new UnsupportedAttributeException(msg, attributeName); | |||
| } | |||
| } | |||
| try { | |||
| @@ -564,7 +564,7 @@ public final class IntrospectionHelper implements BuildListener { | |||
| String elementName) { | |||
| String msg = project.getElementName(parent) | |||
| + " doesn't support the nested \"" + elementName + "\" element."; | |||
| throw new BuildException(msg); | |||
| throw new UnsupportedElementException(msg, elementName); | |||
| } | |||
| private NestedCreator getNestedCreator( | |||
| @@ -825,7 +825,7 @@ public final class IntrospectionHelper implements BuildListener { | |||
| String msg = "Class " + bean.getName() | |||
| + " doesn't support the nested \"" + elementName | |||
| + "\" element."; | |||
| throw new BuildException(msg); | |||
| throw new UnsupportedElementException(msg, elementName); | |||
| } | |||
| return nt; | |||
| } | |||
| @@ -848,7 +848,7 @@ public final class IntrospectionHelper implements BuildListener { | |||
| if (at == null) { | |||
| String msg = "Class " + bean.getName() | |||
| + " doesn't support the \"" + attributeName + "\" attribute."; | |||
| throw new BuildException(msg); | |||
| throw new UnsupportedAttributeException(msg, attributeName); | |||
| } | |||
| return at; | |||
| } | |||
| @@ -892,7 +892,7 @@ public final class IntrospectionHelper implements BuildListener { | |||
| String msg = "Class " + bean.getName() | |||
| + " doesn't support the nested \"" + elementName | |||
| + "\" element."; | |||
| throw new BuildException(msg); | |||
| throw new UnsupportedElementException(msg, elementName); | |||
| } | |||
| return ((NestedCreator) creator).method; | |||
| } | |||
| @@ -914,7 +914,7 @@ public final class IntrospectionHelper implements BuildListener { | |||
| if (setter == null) { | |||
| String msg = "Class " + bean.getName() | |||
| + " doesn't support the \"" + attributeName + "\" attribute."; | |||
| throw new BuildException(msg); | |||
| throw new UnsupportedAttributeException(msg, attributeName); | |||
| } | |||
| return ((AttributeSetter) setter).method; | |||
| } | |||
| @@ -364,9 +364,26 @@ public class RuntimeConfigurable implements Serializable { | |||
| value = p.replaceProperties(value); | |||
| try { | |||
| ih.setAttribute(p, target, name, value); | |||
| } catch (BuildException be) { | |||
| } catch (UnsupportedAttributeException be) { | |||
| // id attribute must be set externally | |||
| if (!name.equals("id")) { | |||
| if (name.equals("id")) { | |||
| // Do nothing | |||
| } else if (getElementTag() == null) { | |||
| throw be; | |||
| } else { | |||
| be.setMessage( | |||
| getElementTag() | |||
| + " doesn't support the \"" | |||
| + be.getAttribute() | |||
| + "\" attribute"); | |||
| throw be; | |||
| } | |||
| } catch (BuildException be) { | |||
| if (name.equals("id")) { | |||
| // Assume that this is an not supported attribute type | |||
| // thrown for example by a dymanic attribute task | |||
| // Do nothing | |||
| } else { | |||
| throw be; | |||
| } | |||
| } | |||
| @@ -328,17 +328,25 @@ public class UnknownElement extends Task { | |||
| for (int i = 0; it.hasNext(); i++) { | |||
| RuntimeConfigurable childWrapper = parentWrapper.getChild(i); | |||
| UnknownElement child = (UnknownElement) it.next(); | |||
| if (!handleChild( | |||
| parentUri, ih, parent, child, childWrapper)) { | |||
| if (!(parent instanceof TaskContainer)) { | |||
| ih.throwNotSupported(getProject(), parent, | |||
| child.getTag()); | |||
| } else { | |||
| // a task container - anything could happen - just add the | |||
| // child to the container | |||
| TaskContainer container = (TaskContainer) parent; | |||
| container.addTask(child); | |||
| try { | |||
| if (!handleChild( | |||
| parentUri, ih, parent, child, childWrapper)) { | |||
| if (!(parent instanceof TaskContainer)) { | |||
| ih.throwNotSupported(getProject(), parent, | |||
| child.getTag()); | |||
| } else { | |||
| // a task container - anything could happen - just add the | |||
| // child to the container | |||
| TaskContainer container = (TaskContainer) parent; | |||
| container.addTask(child); | |||
| } | |||
| } | |||
| } catch (UnsupportedElementException ex) { | |||
| ex.setMessage( | |||
| parentWrapper.getElementTag() | |||
| + " doesn't support the nested \"" + ex.getElement() | |||
| + "\" element."); | |||
| throw ex; | |||
| } | |||
| } | |||
| } | |||
| @@ -530,7 +538,7 @@ public class UnknownElement extends Task { | |||
| /** | |||
| * Set the configured object | |||
| * | |||
| * @param realThing the configured object | |||
| * @since ant 1.7 | |||
| */ | |||
| public void setRealThing(Object realThing) { | |||
| @@ -0,0 +1,64 @@ | |||
| /* | |||
| * Copyright 2004 The Apache Software Foundation | |||
| * | |||
| * Licensed 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.tools.ant; | |||
| /** | |||
| * Used to report attempts to set an unsupported attribute | |||
| * | |||
| * @since Ant 1.7 | |||
| */ | |||
| public class UnsupportedAttributeException extends BuildException { | |||
| private String myMessage; | |||
| private String attribute; | |||
| /** | |||
| * Constructs an unsupport attribute exception | |||
| * @param msg The string containing the message | |||
| * @param attribute The unsupported attribute | |||
| */ | |||
| public UnsupportedAttributeException(String msg, String attribute) { | |||
| super(msg); | |||
| this.attribute = attribute; | |||
| this.myMessage = msg; | |||
| } | |||
| /** | |||
| * The attribute that is wrong | |||
| * | |||
| * @return the attribute name | |||
| */ | |||
| public String getAttribute() { | |||
| return attribute; | |||
| } | |||
| /** | |||
| * Override throwable#getMessage | |||
| * @return the message | |||
| */ | |||
| public String getMessage() { | |||
| return myMessage; | |||
| } | |||
| /** | |||
| * Set the message | |||
| * @param message a new message | |||
| */ | |||
| public void setMessage(String message) { | |||
| this.myMessage = message; | |||
| } | |||
| } | |||
| @@ -0,0 +1,78 @@ | |||
| /* | |||
| * Copyright 2004 The Apache Software Foundation | |||
| * | |||
| * Licensed 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.tools.ant; | |||
| /** | |||
| * Used to report attempts to set an unsupported element | |||
| * When the attempt to set the element is made, | |||
| * the code does not not know the name of the task/type | |||
| * based on a mapping from the classname to the task/type. | |||
| * However one class may be used by a lot of task/types. | |||
| * This exception may be caught by code that does know | |||
| * the task/type and it will reset the message to the | |||
| * correct message. | |||
| * This will be done once (in the case of a recursive | |||
| * call to handlechildren). | |||
| * | |||
| * @since Ant 1.6.3 or Ant 1.7 ? | |||
| */ | |||
| public class UnsupportedElementException extends BuildException { | |||
| private String myMessage = null; | |||
| private String element; | |||
| /** | |||
| * Constructs an unsupport element exception | |||
| * @param msg The string containing the message | |||
| * @param element The name of the incorrect element | |||
| */ | |||
| public UnsupportedElementException(String msg, String element) { | |||
| super(msg); | |||
| this.element = element; | |||
| } | |||
| /** | |||
| * The element that is wrong | |||
| * | |||
| * @return the element name | |||
| */ | |||
| public String getElement() { | |||
| return element; | |||
| } | |||
| /** | |||
| * Override throwable#getMessage | |||
| * @return the message | |||
| */ | |||
| public String getMessage() { | |||
| if (myMessage == null) { | |||
| return super.getMessage(); | |||
| } else { | |||
| return myMessage; | |||
| } | |||
| } | |||
| /** | |||
| * Set the message (If not set already) | |||
| * @param message a new message | |||
| */ | |||
| public void setMessage(String message) { | |||
| if (this.myMessage == null) { | |||
| this.myMessage = message; | |||
| } | |||
| } | |||
| } | |||
| @@ -70,6 +70,17 @@ public class PreSetDefTest extends BuildFileTest { | |||
| expectLog("antTypeTest", ""); | |||
| } | |||
| public void testCorrectTaskNameBadAttr() { | |||
| expectBuildExceptionContaining( | |||
| "correct_taskname_badattr", "attribute message", "javac doesn't support the"); | |||
| } | |||
| public void testCorrectTaskNameBadEl() { | |||
| expectBuildExceptionContaining( | |||
| "correct_taskname_badel", "element message", "javac doesn't support the"); | |||
| } | |||
| /** | |||
| * A test class to check default properties | |||
| */ | |||