|
Ant example source code file (ProjectHelper.java)
The ProjectHelper.java source code/* * 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.File; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Hashtable; import java.util.Locale; import java.util.Vector; import org.apache.tools.ant.helper.ProjectHelper2; import org.apache.tools.ant.util.LoaderUtils; import org.xml.sax.AttributeList; /** * Configures a Project (complete with Targets and Tasks) based on * a XML build file. It'll rely on a plugin to do the actual processing * of the xml file. * * This class also provide static wrappers for common introspection. * * All helper plugins must provide backward compatibility with the * original ant patterns, unless a different behavior is explicitly * specified. For example, if namespace is used on the <project> tag * the helper can expect the entire build file to be namespace-enabled. * Namespaces or helper-specific tags can provide meta-information to * the helper, allowing it to use new ( or different policies ). * * However, if no namespace is used the behavior should be exactly * identical with the default helper. * */ public class ProjectHelper { /** The URI for ant name space */ public static final String ANT_CORE_URI = "antlib:org.apache.tools.ant"; /** The URI for antlib current definitions */ public static final String ANT_CURRENT_URI = "ant:current"; /** The URI for defined types/tasks - the format is antlib:<package> */ public static final String ANTLIB_URI = "antlib:"; /** Polymorphic attribute */ public static final String ANT_TYPE = "ant-type"; /** * Name of JVM system property which provides the name of the * ProjectHelper class to use. */ public static final String HELPER_PROPERTY = "org.apache.tools.ant.ProjectHelper"; /** * The service identifier in jars which provide Project Helper * implementations. */ public static final String SERVICE_ID = "META-INF/services/org.apache.tools.ant.ProjectHelper"; /** * name of project helper reference that we add to a project */ public static final String PROJECTHELPER_REFERENCE = "ant.projectHelper"; /** * Configures the project with the contents of the specified XML file. * * @param project The project to configure. Must not be <code>null. * @param buildFile An XML file giving the project's configuration. * Must not be <code>null. * * @exception BuildException if the configuration is invalid or cannot * be read */ public static void configureProject(Project project, File buildFile) throws BuildException { ProjectHelper helper = ProjectHelper.getProjectHelper(); project.addReference(PROJECTHELPER_REFERENCE, helper); helper.parse(project, buildFile); } /** Default constructor */ public ProjectHelper() { } // -------------------- Common properties -------------------- // The following properties are required by import ( and other tasks // that read build files using ProjectHelper ). // A project helper may process multiple files. We'll keep track // of them - to avoid loops and to allow caching. The caching will // probably accelerate things like <antCall>. // The key is the absolute file, the value is a processed tree. // Since the tree is composed of UE and RC - it can be reused ! // protected Hashtable processedFiles=new Hashtable(); private Vector importStack = new Vector(); // Temporary - until we figure a better API /** EXPERIMENTAL WILL_CHANGE * */ // public Hashtable getProcessedFiles() { // return processedFiles; // } /** EXPERIMENTAL WILL_CHANGE * Import stack. * Used to keep track of imported files. Error reporting should * display the import path. * * @return the stack of import source objects. */ public Vector getImportStack() { return importStack; } // -------------------- Parse method -------------------- /** * Parses the project file, configuring the project as it goes. * * @param project The project for the resulting ProjectHelper to configure. * Must not be <code>null. * @param source The source for XML configuration. A helper must support * at least File, for backward compatibility. Helpers may * support URL, InputStream, etc or specialized types. * * @since Ant1.5 * @exception BuildException if the configuration is invalid or cannot * be read */ public void parse(Project project, Object source) throws BuildException { throw new BuildException("ProjectHelper.parse() must be implemented " + "in a helper plugin " + this.getClass().getName()); } /** * Discovers a project helper instance. Uses the same patterns * as JAXP, commons-logging, etc: a system property, a JDK1.3 * service discovery, default. * * @return a ProjectHelper, either a custom implementation * if one is available and configured, or the default implementation * otherwise. * * @exception BuildException if a specified helper class cannot * be loaded/instantiated. */ public static ProjectHelper getProjectHelper() throws BuildException { // Identify the class loader we will be using. Ant may be // in a webapp or embedded in a different app ProjectHelper helper = null; // First, try the system property String helperClass = System.getProperty(HELPER_PROPERTY); try { if (helperClass != null) { helper = newHelper(helperClass); } } catch (SecurityException e) { System.out.println("Unable to load ProjectHelper class \"" + helperClass + " specified in system property " + HELPER_PROPERTY); } // A JDK1.3 'service' ( like in JAXP ). That will plug a helper // automatically if in CLASSPATH, with the right META-INF/services. if (helper == null) { try { ClassLoader classLoader = LoaderUtils.getContextClassLoader(); InputStream is = null; if (classLoader != null) { is = classLoader.getResourceAsStream(SERVICE_ID); } if (is == null) { is = ClassLoader.getSystemResourceAsStream(SERVICE_ID); } if (is != null) { // 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)) { helper = newHelper(helperClassName); } } } catch (Exception ex) { System.out.println("Unable to load ProjectHelper " + "from service \"" + SERVICE_ID); } } if (helper != null) { return helper; } else { return new ProjectHelper2(); } } /** * Creates a new helper instance from the name of the class. * 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. * * @return a new instance of the specified class. * * @exception BuildException if the class cannot be found or * cannot be appropriate instantiated. */ private static ProjectHelper newHelper(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 ((ProjectHelper) clazz.newInstance()); } catch (Exception e) { throw new BuildException(e); } } /** * JDK1.1 compatible access to the context class loader. * Cut&paste from JAXP. * * @deprecated since 1.6.x. * Use LoaderUtils.getContextClassLoader() * * @return the current context class loader, or <code>null * if the context class loader is unavailable. */ public static ClassLoader getContextClassLoader() { if (!LoaderUtils.isContextLoaderAvailable()) { return null; } return LoaderUtils.getContextClassLoader(); } // -------------------- Static utils, used by most helpers ---------------- /** * Configures an object using an introspection handler. * * @param target The target object to be configured. * Must not be <code>null. * @param attrs A list of attributes to configure within the target. * Must not be <code>null. * @param project The project containing the target. * Must not be <code>null. * * @deprecated since 1.6.x. * Use IntrospectionHelper for each property. * * @exception BuildException if any of the attributes can't be handled by * the target */ public static void configure(Object target, AttributeList attrs, Project project) throws BuildException { if (target instanceof TypeAdapter) { target = ((TypeAdapter) target).getProxy(); } IntrospectionHelper ih = IntrospectionHelper.getHelper(project, target.getClass()); for (int i = 0; i < attrs.getLength(); i++) { // reflect these into the target String value = replaceProperties(project, attrs.getValue(i), project.getProperties()); try { ih.setAttribute(project, target, attrs.getName(i).toLowerCase(Locale.US), value); } catch (BuildException be) { // id attribute must be set externally if (!attrs.getName(i).equals("id")) { throw be; } } } } /** * Adds the content of #PCDATA sections to an element. * * @param project The project containing the target. * Must not be <code>null. * @param target The target object to be configured. * Must not be <code>null. * @param buf A character array of the text within the element. * Will not be <code>null. * @param start The start element in the array. * @param count The number of characters to read from the array. * * @exception BuildException if the target object doesn't accept text */ public static void addText(Project project, Object target, char[] buf, int start, int count) throws BuildException { addText(project, target, new String(buf, start, count)); } /** * Adds the content of #PCDATA sections to an element. * * @param project The project containing the target. * Must not be <code>null. * @param target The target object to be configured. * Must not be <code>null. * @param text Text to add to the target. * May be <code>null, in which case this * method call is a no-op. * * @exception BuildException if the target object doesn't accept text */ public static void addText(Project project, Object target, String text) throws BuildException { if (text == null) { return; } if (target instanceof TypeAdapter) { target = ((TypeAdapter) target).getProxy(); } IntrospectionHelper.getHelper(project, target.getClass()).addText(project, target, text); } /** * Stores a configured child element within its parent object. * * @param project Project containing the objects. * May be <code>null. * @param parent Parent object to add child to. * Must not be <code>null. * @param child Child object to store in parent. * Should not be <code>null. * @param tag Name of element which generated the child. * May be <code>null, in which case * the child is not stored. */ public static void storeChild(Project project, Object parent, Object child, String tag) { IntrospectionHelper ih = IntrospectionHelper.getHelper(project, parent.getClass()); ih.storeElement(project, parent, child, tag); } /** * Replaces <code>${xxx} style constructions in the given value with * the string value of the corresponding properties. * * @param project The project containing the properties to replace. * Must not be <code>null. * * @param value The string to be scanned for property references. * May be <code>null. * * @exception BuildException if the string contains an opening * <code>${ without a closing * <code>} * @return the original string with the properties replaced, or * <code>null if the original string is Other Ant examples (source code examples)Here is a short list of links related to this Ant ProjectHelper.java source code file: |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 Alvin Alexander, alvinalexander.com
All Rights Reserved.
A percentage of advertising revenue from
pages under the /java/jwarehouse
URI on this website is
paid back to open source projects.