choose an implementation of there own by setting a system property. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268264 13f79535-47bb-0310-9956-ffa450edef68master
| @@ -49,10 +49,10 @@ mkdir -p ${CLASSDIR} | |||
| echo ... Compiling Ant Classes | |||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/tar/*.java | |||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/util/regexp/RegexpMatcher.java ${TOOLS}/ant/util/regexp/RegexpMatcherFactory.java | |||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/util/*.java | |||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/types/*.java | |||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/*.java | |||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/util/regexp/RegexpMatcher.java | |||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/util/*.java | |||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/taskdefs/*.java | |||
| echo ... Copying Required Files | |||
| @@ -41,6 +41,7 @@ | |||
| <property name="build.compiler" value="classic"/> | |||
| <property name="build.compiler.emacs" value="on"/> | |||
| <property name="junit.fork" value="false" /> | |||
| <property name="javac.optimize" value="true" /> | |||
| <!-- =================================================================== --> | |||
| <!-- Define a global set of patterns that can be referenced by --> | |||
| @@ -96,7 +97,7 @@ | |||
| destdir="${build.classes}" | |||
| debug="on" | |||
| deprecation="off" | |||
| optimize="on" > | |||
| optimize="${javac.optimize}" > | |||
| <classpath refid="classpath" /> | |||
| <exclude name="**/Script.java" unless="bsf.present" /> | |||
| @@ -1,90 +0,0 @@ | |||
| <html> | |||
| <body> | |||
| <h2><a name="perforce">Perforce</a></h2> | |||
| <h3>Description</h3> | |||
| <p>Handles packages/modules retrieved from a <a href="http://www.perforce.com/">Perforce</a> repository.</p> | |||
| <h3>Parameters</h3> | |||
| <table border="1" cellpadding="2" cellspacing="0"> | |||
| <tr> | |||
| <td valign="top"><b>Attribute</b></td> | |||
| <td valign="top"><b>Description</b></td> | |||
| <td align="center" valign="top"><b>Required</b></td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">localpath</td> | |||
| <td valign="top">The local path of the file/directory to | |||
| write file(s) to.</td> | |||
| <td align="center" valign="top">Yes</td> | |||
| </tr> | |||
| <tr> | |||
| <td>user</td> | |||
| <td>Specifies the user name, overriding the value of $P4USER, | |||
| $USER, and $USERNAME in the environment.</td> | |||
| <td><p align="center">No</p> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td>port</td> | |||
| <td>Specifies the server's listen address, overriding the | |||
| value of $P4PORT in the environment and the default (perforce:1666).</td> | |||
| <td><p align="center">No</p> | |||
| </td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">version</td> | |||
| <td valign="top">The revision number of the file being | |||
| extracted.</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">date</td> | |||
| <td valign="top">Get files as of this date. Either [yyyy/mm/dd] | |||
| or [yyyy/mm/dd:hh:mm:ss]. Note that [yyyy/mm/dd] means [yyyy/mm/dd:00:00:00], | |||
| so if you want to include all events on that day refer to | |||
| the next day.</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">label</td> | |||
| <td valign="top">A label from which to check out files.</td> | |||
| <td align="center" valign="top">No</td> | |||
| </tr> | |||
| <tr> | |||
| <td valign="top">force</td> | |||
| <td valign="top">"[true|false]". Forces | |||
| resynchronization even if the client already has the | |||
| file, and clobbers writable files. This flag doesn't | |||
| affect open files.</td> | |||
| <td align="center" valign="top">No, default "false"</td> | |||
| </tr> | |||
| <tr> | |||
| <td>change</td> | |||
| <td>Gets the file(s) as they were when a specified change | |||
| number was applied.</td> | |||
| <td><p align="center">No</p> | |||
| </td> | |||
| </tr> | |||
| </table> | |||
| <h3>Examples</h3> | |||
| <pre> <perforce localpath="//path/to/source/..." | |||
| force="true" | |||
| change="4513" | |||
| /></pre> | |||
| <p>syncs the files in the source directory that are in the | |||
| Perforce repository, as of change number 4513, overwriting any | |||
| modified files in the current source tree is needed.</p> | |||
| <pre> <perforce localpath="//path/to/source/..." /></pre> | |||
| <p>Syncs with the latest version of the file in the repository.</p> | |||
| </body> | |||
| </html> | |||
| @@ -27,7 +27,7 @@ | |||
| <li>Dave Walend (<a href="mailto:dwalend@cs.tufts.edu">dwalend@cs.tufts.edu</a>)</li> | |||
| </ul> | |||
| <p>Version 1.3 - 2000/11/14</p> | |||
| <p>Version 1.3 - 2000/11/29</p> | |||
| <hr> | |||
| <h2>Table of Contents</h2> | |||
| @@ -4550,7 +4550,6 @@ it had been located at <code>htdocs/manual/ChangeLog.txt</code>.</p> | |||
| <li><a href="junit.html">JUnit</a></li> | |||
| <li><a href="native2ascii.html">Native2Ascii</a></li> | |||
| <li><a href="#netrexxc">NetRexxC</a></li> | |||
| <li><a href="P4desc.html">Perforce</a></li> | |||
| <li><a href="propertyfile.html">PropertyFile</a></li> | |||
| <li><a href="#renameexts">RenameExtensions</a></li> | |||
| <li><a href="#script">Script</a></li> | |||
| @@ -56,6 +56,7 @@ package org.apache.tools.ant.util; | |||
| import org.apache.tools.ant.BuildException; | |||
| import org.apache.tools.ant.util.regexp.RegexpMatcher; | |||
| import org.apache.tools.ant.util.regexp.RegexpMatcherFactory; | |||
| import java.util.Enumeration; | |||
| import java.util.Vector; | |||
| @@ -70,30 +71,23 @@ public class RegexpPatternMapper implements FileNameMapper { | |||
| protected RegexpMatcher reg = null; | |||
| protected char[] to = null; | |||
| protected StringBuffer result = new StringBuffer(); | |||
| protected Class regexpMatcherClass = null; | |||
| public RegexpPatternMapper() throws BuildException { | |||
| try { | |||
| regexpMatcherClass = Class.forName("org.apache.tools.ant.util.regexp.JakartaOroMatcher"); | |||
| if (regexpMatcherClass == null) { | |||
| regexpMatcherClass = Class.forName("org.apache.tools.ant.util.regexp.JakartaRegexpMatcher"); | |||
| } | |||
| } catch (ClassNotFoundException ce) { | |||
| } catch (NoClassDefFoundError ne) { | |||
| } | |||
| if (regexpMatcherClass == null) { | |||
| throw new BuildException("No supported regular expression matcher found"); | |||
| } | |||
| reg = (new RegexpMatcherFactory()).newRegexpMatcher(); | |||
| } | |||
| /** | |||
| * Sets the "from" pattern. Required. | |||
| */ | |||
| public void setFrom(String from) throws BuildException { | |||
| reg = createMatcher(from); | |||
| try { | |||
| reg.setPattern(from); | |||
| } catch (NoClassDefFoundError e) { | |||
| // depending on the implementation the actual RE won't | |||
| // get instantiated in the constructor. | |||
| throw new BuildException("Cannot load regular expression matcher", | |||
| e); | |||
| } | |||
| } | |||
| /** | |||
| @@ -144,19 +138,4 @@ public class RegexpPatternMapper implements FileNameMapper { | |||
| return result.toString(); | |||
| } | |||
| /** | |||
| * Create an implementation of RegexpMatcher based on the classes | |||
| * that can be loaded. | |||
| */ | |||
| protected RegexpMatcher createMatcher(String pattern) | |||
| throws BuildException { | |||
| try { | |||
| RegexpMatcher rm = (RegexpMatcher) regexpMatcherClass.newInstance(); | |||
| rm.setPattern(pattern); | |||
| return rm; | |||
| } catch (Throwable t) { | |||
| throw new BuildException(t); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,102 @@ | |||
| /* | |||
| * The Apache Software License, Version 1.1 | |||
| * | |||
| * Copyright (c) 2000 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.util.regexp; | |||
| import org.apache.tools.ant.BuildException; | |||
| /** | |||
| * Simple Factory Class that produces an implementation of | |||
| * RegexpMatcher based on the system property | |||
| * <code>ant.regexp.matcherimpl</code> and the classes | |||
| * available. | |||
| * | |||
| * <p>In a more general framework this class would be abstract and | |||
| * have a static newInstance method.</p> | |||
| * | |||
| * @author <a href="mailto:stefan.bodewig@epost.de">Stefan Bodewig</a> | |||
| */ | |||
| public class RegexpMatcherFactory { | |||
| public RegexpMatcherFactory() {} | |||
| public RegexpMatcher newRegexpMatcher() throws BuildException { | |||
| String systemDefault = System.getProperty("ant.regexp.matcherimpl"); | |||
| if (systemDefault != null) { | |||
| return createInstance(systemDefault); | |||
| // XXX should we silently possible exceptions and try to | |||
| // load a different implementation? | |||
| } | |||
| try { | |||
| return createInstance("org.apache.tools.ant.util.regexp.JakartaOroMatcher"); | |||
| } catch (BuildException be) {} | |||
| try { | |||
| return createInstance("org.apache.tools.ant.util.regexp.JakartaRegexpMatcher"); | |||
| } catch (BuildException be) {} | |||
| throw new BuildException("No supported regular expression matcher found"); | |||
| } | |||
| protected RegexpMatcher createInstance(String className) | |||
| throws BuildException { | |||
| try { | |||
| Class implClass = Class.forName(className); | |||
| return (RegexpMatcher) implClass.newInstance(); | |||
| } catch (Throwable t) { | |||
| throw new BuildException(t); | |||
| } | |||
| } | |||
| } | |||