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); | |||||
} | |||||
} | |||||
} |