Browse Source

Moved the instantiation of the RE matcher to a factory. Users can now

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-ffa450edef68
master
Stefan Bodewig 24 years ago
parent
commit
4c5c8d89be
6 changed files with 117 additions and 126 deletions
  1. +2
    -2
      bootstrap.sh
  2. +2
    -1
      build.xml
  3. +0
    -90
      docs/P4desc.html
  4. +1
    -2
      docs/index.html
  5. +10
    -31
      src/main/org/apache/tools/ant/util/RegexpPatternMapper.java
  6. +102
    -0
      src/main/org/apache/tools/ant/util/regexp/RegexpMatcherFactory.java

+ 2
- 2
bootstrap.sh View File

@@ -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


+ 2
- 1
build.xml View File

@@ -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" />


+ 0
- 90
docs/P4desc.html View File

@@ -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">&quot;[true|false]&quot;. 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 &quot;false&quot;</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> &lt;perforce localpath=&quot;//path/to/source/...&quot;
force=&quot;true&quot;
change=&quot;4513&quot;
/&gt;</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> &lt;perforce localpath=&quot;//path/to/source/...&quot; /&gt;</pre>

<p>Syncs with the latest version of the file in the repository.</p>
</body>
</html>

+ 1
- 2
docs/index.html View File

@@ -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>


+ 10
- 31
src/main/org/apache/tools/ant/util/RegexpPatternMapper.java View File

@@ -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 &quot;from&quot; pattern. Required. * Sets the &quot;from&quot; 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);
}
}
} }

+ 102
- 0
src/main/org/apache/tools/ant/util/regexp/RegexpMatcherFactory.java View File

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

Loading…
Cancel
Save