to the project object and the ability to log messages through that project. The IntrospectionHelper cooperates to ensure DataTypes created as nested elements are correctly setup git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@269458 13f79535-47bb-0310-9956-ffa450edef68master
@@ -322,7 +322,11 @@ public class IntrospectionHelper implements BuildListener { | |||
throw new BuildException(msg); | |||
} | |||
try { | |||
return nc.create(element); | |||
Object nestedElement = nc.create(element); | |||
if (nestedElement instanceof ProjectComponent) { | |||
((ProjectComponent)nestedElement).setProject(project); | |||
} | |||
return nestedElement; | |||
} catch (IllegalAccessException ie) { | |||
// impossible as getMethods should only return public methods | |||
throw new BuildException(ie); | |||
@@ -565,7 +569,11 @@ public class IntrospectionHelper implements BuildListener { | |||
String value) | |||
throws InvocationTargetException, IllegalAccessException, BuildException { | |||
try { | |||
m.invoke(parent, new Object[] {c.newInstance(new String[] {value})}); | |||
Object attribute = c.newInstance(new String[] {value}); | |||
if (attribute instanceof ProjectComponent) { | |||
((ProjectComponent)attribute).setProject(p); | |||
} | |||
m.invoke(parent, new Object[] {attribute}); | |||
} catch (InstantiationException ie) { | |||
throw new BuildException(ie); | |||
} | |||
@@ -0,0 +1,110 @@ | |||
/* | |||
* The Apache Software License, Version 1.1 | |||
* | |||
* Copyright (c) 2001 The Apache Software Foundation. All rights | |||
* reserved. | |||
* | |||
* Redistribution and use in source and binary forms, with or without | |||
* modification, are permitted provided that the following conditions | |||
* are met: | |||
* | |||
* 1. Redistributions of source code must retain the above copyright | |||
* notice, this list of conditions and the following disclaimer. | |||
* | |||
* 2. Redistributions in binary form must reproduce the above copyright | |||
* notice, this list of conditions and the following disclaimer in | |||
* the documentation and/or other materials provided with the | |||
* distribution. | |||
* | |||
* 3. The end-user documentation included with the redistribution, if | |||
* any, must include the following acknowlegement: | |||
* "This product includes software developed by the | |||
* Apache Software Foundation (http://www.apache.org/)." | |||
* Alternately, this acknowlegement may appear in the software itself, | |||
* if and wherever such third-party acknowlegements normally appear. | |||
* | |||
* 4. The names "The Jakarta Project", "Ant", and "Apache Software | |||
* Foundation" must not be used to endorse or promote products derived | |||
* from this software without prior written permission. For written | |||
* permission, please contact apache@apache.org. | |||
* | |||
* 5. Products derived from this software may not be called "Apache" | |||
* nor may "Apache" appear in their names without prior written | |||
* permission of the Apache Group. | |||
* | |||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED | |||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | |||
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |||
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR | |||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |||
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF | |||
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | |||
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |||
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT | |||
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||
* SUCH DAMAGE. | |||
* ==================================================================== | |||
* | |||
* This software consists of voluntary contributions made by many | |||
* individuals on behalf of the Apache Software Foundation. For more | |||
* information on the Apache Software Foundation, please see | |||
* <http://www.apache.org/>. | |||
*/ | |||
package org.apache.tools.ant; | |||
/** | |||
* Base class for components of a project, including tasks and data types. Provides | |||
* common facilities. | |||
* | |||
* @author <a href="mailto:conor@apache.org">Conor MacNeill</a> | |||
*/ | |||
public abstract class ProjectComponent { | |||
protected Project project = null; | |||
/** | |||
* Sets the project object of this component. This method is used by | |||
* project when a component is added to it so that the component has | |||
* access to the functions of the project. It should not be used | |||
* for any other purpose. | |||
* | |||
* @param project Project in whose scope this component belongs. | |||
*/ | |||
public void setProject(Project project) { | |||
this.project = project; | |||
} | |||
/** | |||
* Get the Project to which this component belongs | |||
* | |||
* @return the components's project. | |||
*/ | |||
public Project getProject() { | |||
return project; | |||
} | |||
/** | |||
* Log a message with the default (INFO) priority. | |||
* | |||
* @param the message to be logged. | |||
*/ | |||
public void log(String msg) { | |||
log(msg, Project.MSG_INFO); | |||
} | |||
/** | |||
* Log a mesage with the give priority. | |||
* | |||
* @param the message to be logged. | |||
* @param msgLevel the message priority at which this message is to be logged. | |||
*/ | |||
public void log(String msg, int msgLevel) { | |||
if (project != null) { | |||
project.log(msg, msgLevel); | |||
} | |||
} | |||
} | |||
@@ -60,9 +60,8 @@ package org.apache.tools.ant; | |||
* <p>Use {@link Project#createTask Project.createTask} to create a new Task. | |||
*/ | |||
public abstract class Task { | |||
public abstract class Task extends ProjectComponent { | |||
protected Project project = null; | |||
protected Target target = null; | |||
protected String description=null; | |||
protected Location location = Location.UNKNOWN_LOCATION; | |||
@@ -70,27 +69,6 @@ public abstract class Task { | |||
protected String taskType = null; | |||
protected RuntimeConfigurable wrapper; | |||
/** | |||
* Sets the project object of this task. This method is used by | |||
* project when a task is added to it so that the task has | |||
* access to the functions of the project. It should not be used | |||
* for any other purpose. | |||
* | |||
* @param project Project in whose scope this task belongs. | |||
*/ | |||
public void setProject(Project project) { | |||
this.project = project; | |||
} | |||
/** | |||
* Get the Project to which this task belongs | |||
* | |||
* @return the task's project. | |||
*/ | |||
public Project getProject() { | |||
return project; | |||
} | |||
/** | |||
* Sets the target object of this task. | |||
* | |||
@@ -136,26 +114,6 @@ public abstract class Task { | |||
this.taskType = type; | |||
} | |||
/** | |||
* Log a message with the default (INFO) priority. | |||
* | |||
* @param the message to be logged. | |||
*/ | |||
public void log(String msg) { | |||
log(msg, Project.MSG_INFO); | |||
} | |||
/** | |||
* Log a mesage with the give priority. | |||
* | |||
* @param the message to be logged. | |||
* @param msgLevel the message priority at which this message is to be logged. | |||
*/ | |||
public void log(String msg, int msgLevel) { | |||
project.log(this, msg, msgLevel); | |||
} | |||
/** Sets a description of the current action. It will be usefull in commenting | |||
* what we are doing. | |||
*/ | |||
@@ -58,6 +58,7 @@ package org.apache.tools.ant.types; | |||
import java.util.Stack; | |||
import org.apache.tools.ant.BuildException; | |||
import org.apache.tools.ant.Project; | |||
import org.apache.tools.ant.ProjectComponent; | |||
/** | |||
* Base class for those classes that can appear inside the build file | |||
@@ -71,7 +72,7 @@ import org.apache.tools.ant.Project; | |||
* | |||
* @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
*/ | |||
public abstract class DataType { | |||
public abstract class DataType extends ProjectComponent { | |||
/** | |||
* The descriptin the user has set. | |||
*/ | |||
@@ -161,6 +162,26 @@ public abstract class DataType { | |||
checked = true; | |||
} | |||
/** | |||
* Performs the check for circular references and returns the | |||
* referenced object. | |||
*/ | |||
protected Object getCheckedRef(Class requiredClass, String dataTypeName) { | |||
if (!checked) { | |||
Stack stk = new Stack(); | |||
stk.push(this); | |||
dieOnCircularReference(stk, getProject()); | |||
} | |||
Object o = ref.getReferencedObject(getProject()); | |||
if (!(requiredClass.isAssignableFrom(o.getClass()))) { | |||
String msg = ref.getRefId()+" doesn\'t denote a " + dataTypeName; | |||
throw new BuildException(msg); | |||
} else { | |||
return o; | |||
} | |||
} | |||
/** | |||
* Creates an exception that indicates that refid has to be the | |||
* only attribute if it is set. | |||