diff options
Diffstat (limited to 'framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java')
-rw-r--r-- | framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java | 337 |
1 files changed, 0 insertions, 337 deletions
diff --git a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java b/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java deleted file mode 100644 index 1dd44124..00000000 --- a/framework/src/ant/apache-ant-1.9.6/src/main/org/apache/tools/ant/ProjectHelperRepository.java +++ /dev/null @@ -1,337 +0,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. - * - */ -package org.apache.tools.ant; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.lang.reflect.Constructor; -import java.net.URL; -import java.net.URLConnection; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.Iterator; -import java.util.List; - -import org.apache.tools.ant.helper.ProjectHelper2; -import org.apache.tools.ant.types.Resource; -import org.apache.tools.ant.util.LoaderUtils; - -/** - * Repository of {@link ProjectHelper} found in the classpath or via - * some System properties. - * - * <p>See the ProjectHelper documentation in the manual.</p> - * - * @since Ant 1.8.0 - */ -public class ProjectHelperRepository { - - private static final String DEBUG_PROJECT_HELPER_REPOSITORY = - "ant.project-helper-repo.debug"; - - // The message log level is not accessible here because everything - // is instanciated statically - private static final boolean DEBUG = - "true".equals(System.getProperty(DEBUG_PROJECT_HELPER_REPOSITORY)); - - private static ProjectHelperRepository instance = - new ProjectHelperRepository(); - - private List<Constructor<? extends ProjectHelper>> helpers = new ArrayList<Constructor<? extends ProjectHelper>>(); - - private static Constructor<ProjectHelper2> PROJECTHELPER2_CONSTRUCTOR; - - static { - try { - PROJECTHELPER2_CONSTRUCTOR = ProjectHelper2.class.getConstructor(); - } catch (Exception e) { - // ProjectHelper2 must be available - throw new RuntimeException(e); - } - } - - public static ProjectHelperRepository getInstance() { - return instance; - } - - private ProjectHelperRepository() { - collectProjectHelpers(); - } - - private void collectProjectHelpers() { - // First, try the system property - Constructor<? extends ProjectHelper> projectHelper = getProjectHelperBySystemProperty(); - registerProjectHelper(projectHelper); - - // A JDK1.3 'service' ( like in JAXP ). That will plug a helper - // automatically if in CLASSPATH, with the right META-INF/services. - try { - ClassLoader classLoader = LoaderUtils.getContextClassLoader(); - if (classLoader != null) { - Enumeration<URL> resources = - classLoader.getResources(ProjectHelper.SERVICE_ID); - while (resources.hasMoreElements()) { - URL resource = resources.nextElement(); - URLConnection conn = resource.openConnection(); - conn.setUseCaches(false); - projectHelper = - getProjectHelperByService(conn.getInputStream()); - registerProjectHelper(projectHelper); - } - } - - InputStream systemResource = - ClassLoader.getSystemResourceAsStream(ProjectHelper.SERVICE_ID); - if (systemResource != null) { - projectHelper = getProjectHelperByService(systemResource); - registerProjectHelper(projectHelper); - } - } catch (Exception e) { - System.err.println("Unable to load ProjectHelper from service " - + ProjectHelper.SERVICE_ID + " (" - + e.getClass().getName() - + ": " + e.getMessage() + ")"); - if (DEBUG) { - e.printStackTrace(System.err); - } - } - } - - /** - * Register the specified project helper into the repository. - * <p> - * The helper will be added after all the already registered helpers, but - * before the default one (ProjectHelper2) - * - * @param helperClassName - * the fully qualified name of the helper - * @throws BuildException - * if the class cannot be loaded or if there is no constructor - * with no argument - * @since Ant 1.8.2 - */ - public void registerProjectHelper(String helperClassName) - throws BuildException { - registerProjectHelper(getHelperConstructor(helperClassName)); - } - - /** - * Register the specified project helper into the repository. - * <p> - * The helper will be added after all the already registered helpers, but - * before the default one (ProjectHelper2) - * - * @param helperClass - * the class of the helper - * @throws BuildException - * if there is no constructor with no argument - * @since Ant 1.8.2 - */ - public void registerProjectHelper(Class<? extends ProjectHelper> helperClass) throws BuildException { - try { - registerProjectHelper(helperClass.getConstructor()); - } catch (NoSuchMethodException e) { - throw new BuildException("Couldn't find no-arg constructor in " - + helperClass.getName()); - } - } - - private void registerProjectHelper(Constructor<? extends ProjectHelper> helperConstructor) { - if (helperConstructor == null) { - return; - } - if (DEBUG) { - System.out.println("ProjectHelper " - + helperConstructor.getClass().getName() + " registered."); - } - helpers.add(helperConstructor); - } - - private Constructor<? extends ProjectHelper> getProjectHelperBySystemProperty() { - String helperClass = System.getProperty(ProjectHelper.HELPER_PROPERTY); - try { - if (helperClass != null) { - return getHelperConstructor(helperClass); - } - } catch (SecurityException e) { - System.err.println("Unable to load ProjectHelper class \"" - + helperClass + " specified in system property " - + ProjectHelper.HELPER_PROPERTY + " (" - + e.getMessage() + ")"); - if (DEBUG) { - e.printStackTrace(System.err); - } - } - return null; - } - - private Constructor<? extends ProjectHelper> getProjectHelperByService(InputStream is) { - try { - // This code is needed by EBCDIC and other strange systems. - // It's a fix for bugs reported in xerces - InputStreamReader isr; - try { - isr = new InputStreamReader(is, "UTF-8"); - } catch (java.io.UnsupportedEncodingException e) { - isr = new InputStreamReader(is); - } - BufferedReader rd = new BufferedReader(isr); - - String helperClassName = rd.readLine(); - rd.close(); - - if (helperClassName != null && !"".equals(helperClassName)) { - return getHelperConstructor(helperClassName); - } - } catch (Exception e) { - System.out.println("Unable to load ProjectHelper from service " - + ProjectHelper.SERVICE_ID + " (" + e.getMessage() + ")"); - if (DEBUG) { - e.printStackTrace(System.err); - } - } - return null; - } - - /** - * Get the constructor with not argument of an helper from its class name. - * It'll first try the thread class loader, then Class.forName() will load - * from the same loader that loaded this class. - * - * @param helperClass - * The name of the class to create an instance of. Must not be - * <code>null</code>. - * - * @return the constructor of the specified class. - * - * @exception BuildException - * if the class cannot be found or if a constructor with no - * argument cannot be found. - */ - private Constructor<? extends ProjectHelper> getHelperConstructor(String helperClass) throws BuildException { - ClassLoader classLoader = LoaderUtils.getContextClassLoader(); - try { - Class<?> clazz = null; - if (classLoader != null) { - try { - clazz = classLoader.loadClass(helperClass); - } catch (ClassNotFoundException ex) { - // try next method - } - } - if (clazz == null) { - clazz = Class.forName(helperClass); - } - return clazz.asSubclass(ProjectHelper.class).getConstructor(); - } catch (Exception e) { - throw new BuildException(e); - } - } - - /** - * Get the helper that will be able to parse the specified build file. The helper - * will be chosen among the ones found in the classpath - * - * @return the first ProjectHelper that fit the requirement (never <code>null</code>). - */ - public ProjectHelper getProjectHelperForBuildFile(Resource buildFile) throws BuildException { - for (Iterator<ProjectHelper> it = getHelpers(); it.hasNext();) { - ProjectHelper helper = it.next(); - if (helper.canParseBuildFile(buildFile)) { - if (DEBUG) { - System.out.println("ProjectHelper " - + helper.getClass().getName() - + " selected for the build file " - + buildFile); - } - return helper; - } - } - throw new RuntimeException("BUG: at least the ProjectHelper2 should " - + "have supported the file " + buildFile); - } - - /** - * Get the helper that will be able to parse the specified antlib. The helper - * will be chosen among the ones found in the classpath - * - * @return the first ProjectHelper that fit the requirement (never <code>null</code>). - */ - public ProjectHelper getProjectHelperForAntlib(Resource antlib) throws BuildException { - for (Iterator<ProjectHelper> it = getHelpers(); it.hasNext();) { - ProjectHelper helper = it.next(); - if (helper.canParseAntlibDescriptor(antlib)) { - if (DEBUG) { - System.out.println("ProjectHelper " - + helper.getClass().getName() - + " selected for the antlib " - + antlib); - } - return helper; - } - } - throw new RuntimeException("BUG: at least the ProjectHelper2 should " - + "have supported the file " + antlib); - } - - /** - * Get an iterator on the list of project helpers configured. The iterator - * will always return at least one element as there will always be the - * default project helper configured. - * - * @return an iterator of {@link ProjectHelper} - */ - public Iterator<ProjectHelper> getHelpers() { - return new ConstructingIterator(helpers.iterator()); - } - - private static class ConstructingIterator implements Iterator<ProjectHelper> { - private final Iterator<Constructor<? extends ProjectHelper>> nested; - private boolean empty = false; - - ConstructingIterator(Iterator<Constructor<? extends ProjectHelper>> nested) { - this.nested = nested; - } - - public boolean hasNext() { - return nested.hasNext() || !empty; - } - - public ProjectHelper next() { - Constructor<? extends ProjectHelper> c; - if (nested.hasNext()) { - c = nested.next(); - } else { - // last but not least, ant default project helper - empty = true; - c = PROJECTHELPER2_CONSTRUCTOR; - } - try { - return c.newInstance(); - } catch (Exception e) { - throw new BuildException("Failed to invoke no-arg constructor" - + " on " + c.getName()); - } - } - - public void remove() { - throw new UnsupportedOperationException("remove is not supported"); - } - } -} |