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 | echo ... Compiling Ant Classes | ||||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/tar/*.java | ${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/types/*.java | ||||
| ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/*.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 | ${JAVAC} -d ${CLASSDIR} ${TOOLS}/ant/taskdefs/*.java | ||||
| echo ... Copying Required Files | echo ... Copying Required Files | ||||
| @@ -41,6 +41,7 @@ | |||||
| <property name="build.compiler" value="classic"/> | <property name="build.compiler" value="classic"/> | ||||
| <property name="build.compiler.emacs" value="on"/> | <property name="build.compiler.emacs" value="on"/> | ||||
| <property name="junit.fork" value="false" /> | <property name="junit.fork" value="false" /> | ||||
| <property name="javac.optimize" value="true" /> | |||||
| <!-- =================================================================== --> | <!-- =================================================================== --> | ||||
| <!-- Define a global set of patterns that can be referenced by --> | <!-- Define a global set of patterns that can be referenced by --> | ||||
| @@ -96,7 +97,7 @@ | |||||
| destdir="${build.classes}" | destdir="${build.classes}" | ||||
| debug="on" | debug="on" | ||||
| deprecation="off" | deprecation="off" | ||||
| optimize="on" > | |||||
| optimize="${javac.optimize}" > | |||||
| <classpath refid="classpath" /> | <classpath refid="classpath" /> | ||||
| <exclude name="**/Script.java" unless="bsf.present" /> | <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> | <li>Dave Walend (<a href="mailto:dwalend@cs.tufts.edu">dwalend@cs.tufts.edu</a>)</li> | ||||
| </ul> | </ul> | ||||
| <p>Version 1.3 - 2000/11/14</p> | |||||
| <p>Version 1.3 - 2000/11/29</p> | |||||
| <hr> | <hr> | ||||
| <h2>Table of Contents</h2> | <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="junit.html">JUnit</a></li> | ||||
| <li><a href="native2ascii.html">Native2Ascii</a></li> | <li><a href="native2ascii.html">Native2Ascii</a></li> | ||||
| <li><a href="#netrexxc">NetRexxC</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="propertyfile.html">PropertyFile</a></li> | ||||
| <li><a href="#renameexts">RenameExtensions</a></li> | <li><a href="#renameexts">RenameExtensions</a></li> | ||||
| <li><a href="#script">Script</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.BuildException; | ||||
| import org.apache.tools.ant.util.regexp.RegexpMatcher; | import org.apache.tools.ant.util.regexp.RegexpMatcher; | ||||
| import org.apache.tools.ant.util.regexp.RegexpMatcherFactory; | |||||
| import java.util.Enumeration; | import java.util.Enumeration; | ||||
| import java.util.Vector; | import java.util.Vector; | ||||
| @@ -70,30 +71,23 @@ public class RegexpPatternMapper implements FileNameMapper { | |||||
| protected RegexpMatcher reg = null; | protected RegexpMatcher reg = null; | ||||
| protected char[] to = null; | protected char[] to = null; | ||||
| protected StringBuffer result = new StringBuffer(); | protected StringBuffer result = new StringBuffer(); | ||||
| protected Class regexpMatcherClass = null; | |||||
| public RegexpPatternMapper() throws BuildException { | 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. | * Sets the "from" pattern. Required. | ||||
| */ | */ | ||||
| public void setFrom(String from) throws BuildException { | 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(); | 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); | |||||
| } | |||||
| } | |||||
| } | |||||