package org.eclipse.ant.internal.core.ant;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.text.MessageFormat;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectComponent;
public class InternalProject extends Project {
private Hashtable<String, Class<?>> typeNameToClass = null;
public InternalProject() {
super();
}
@Override
public void init() throws BuildException {
setJavaVersionProperty();
try {
Class<?> taskClass = Class.forName("org.apache.tools.ant.taskdefs.Property");
addTaskDefinition("property", taskClass);
taskClass = Class.forName("org.apache.tools.ant.taskdefs.Typedef");
addTaskDefinition("typedef", taskClass);
taskClass = Class.forName("org.apache.tools.ant.taskdefs.Taskdef");
addTaskDefinition("taskdef", taskClass);
}
catch (NoClassDefFoundError e) {
throw new BuildException(InternalAntMessages.InternalAntRunner_Missing_Class, e);
}
catch (ClassNotFoundException c) {
throw new BuildException(InternalAntMessages.InternalAntRunner_Missing_Class, c);
}
setSystemProperties();
}
@Override
public Object createDataType(String typeName) throws BuildException {
if (typeNameToClass == null) {
initializeTypes();
}
Class<?> typeClass = typeNameToClass.get(typeName);
if (typeClass == null) {
return null;
}
Throwable thrown = null;
try {
Constructor<?> ctor = null;
boolean noArg = false;
try {
ctor = typeClass.getConstructor(new Class[0]);
noArg = true;
}
catch (NoSuchMethodException nse) {
ctor = typeClass.getConstructor(new Class[] { Project.class });
noArg = false;
}
Object o = null;
if (noArg) {
o = ctor.newInstance(new Object[0]);
} else {
o = ctor.newInstance(new Object[] { this });
}
if (o instanceof ProjectComponent) {
((ProjectComponent) o).setProject(this);
}
return o;
}
catch (InvocationTargetException ite) {
thrown = ite.getTargetException();
}
catch (IllegalArgumentException e) {
thrown = e;
}
catch (InstantiationException e) {
thrown = e;
}
catch (IllegalAccessException e) {
thrown = e;
}
catch (NoSuchMethodException nse) {
thrown = nse;
}
catch (NoClassDefFoundError ncdfe) {
thrown = ncdfe;
}
if (thrown != null) {
String message = MessageFormat.format(InternalAntMessages.InternalProject_could_not_create_type, new Object[] { typeName,
thrown.toString() });
throw new BuildException(message, thrown);
}
return null;
}
private void initializeTypes() {
typeNameToClass = new Hashtable<>(18);
try (InputStream in = Project.class.getResourceAsStream("/org/apache/tools/ant/types/defaults.properties")) {
if (in == null) {
return;
}
Properties props = new Properties();
props.load(in);
Enumeration<?> enumeration = props.propertyNames();
while (enumeration.hasMoreElements()) {
String typeName = (String) enumeration.nextElement();
String className = props.getProperty(typeName);
try {
Class<?> typeClass = Class.forName(className);
typeNameToClass.put(typeName, typeClass);
}
catch (NoClassDefFoundError e) {
}
catch (ClassNotFoundException c) {
}
}
}
catch (IOException ioe) {
return;
}
}
@Override
public Hashtable<String, Class<?>> getDataTypeDefinitions() {
if (typeNameToClass == null) {
initializeTypes();
}
return typeNameToClass;
}
@Override
public void addDataTypeDefinition(String typeName, Class<?> typeClass) {
getDataTypeDefinitions();
typeNameToClass.put(typeName, typeClass);
}
}