blob: 45c82f7d2898915029038e56abbb1cea30758700 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
/*
* Copyright 2001-2004 Apache Software Foundation
*
* Licensed 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.types;
import java.util.Stack;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.util.regexp.Regexp;
import org.apache.tools.ant.util.regexp.RegexpFactory;
/***
* A regular expression datatype. Keeps an instance of the
* compiled expression for speed purposes. This compiled
* expression is lazily evaluated (it is compiled the first
* time it is needed). The syntax is the dependent on which
* regular expression type you are using. The system property
* "ant.regexp.regexpimpl" will be the classname of the implementation
* that will be used.
*
* <pre>
* For jdk <= 1.3, there are two available implementations:
* org.apache.tools.ant.util.regexp.JakartaOroRegexp (the default)
* Based on the jakarta-oro package
*
* org.apache.tools.ant.util.regexp.JakartaRegexpRegexp
* Based on the jakarta-regexp package
*
* For jdk >= 1.4 an additional implementation is available:
* org.apache.tools.ant.util.regexp.Jdk14RegexpRegexp
* Based on the jdk 1.4 built in regular expression package.
* </pre>
*
* <pre>
* <regexp [ [id="id"] pattern="expression" | refid="id" ]
* />
* </pre>
*
* @see org.apache.oro.text.regex.Perl5Compiler
* @see org.apache.regexp.RE
* @see java.util.regex.Pattern
*
* @see org.apache.tools.ant.util.regexp.Regexp
* @author Matthew Inger <a href="mailto:mattinger@mindless.com">mattinger@mindless.com</a>
*
* @ant.datatype name="regexp"
*/
public class RegularExpression extends DataType {
/** Name of this data type */
public static final String DATA_TYPE_NAME = "regexp";
private boolean alreadyInit = false;
// The regular expression factory
private static final RegexpFactory FACTORY = new RegexpFactory();
private Regexp regexp = null;
// temporary variable
private String myPattern;
private boolean setPatternPending = false;
/**
* default constructor
*/
public RegularExpression() {
}
private void init(Project p) {
if (!alreadyInit) {
this.regexp = FACTORY.newRegexp(p);
alreadyInit = true;
}
}
private void setPattern() {
if (setPatternPending) {
regexp.setPattern(myPattern);
setPatternPending = false;
}
}
/**
* sets the regular expression pattern
* @param pattern regular expression pattern
*/
public void setPattern(String pattern) {
if (regexp == null) {
myPattern = pattern;
setPatternPending = true;
} else {
regexp.setPattern(pattern);
}
}
/***
* Gets the pattern string for this RegularExpression in the
* given project.
* @param p project
* @return pattern
*/
public String getPattern(Project p) {
init(p);
if (isReference()) {
return getRef(p).getPattern(p);
}
setPattern();
return regexp.getPattern();
}
/**
* provides a reference to the Regexp contained in this
* @param p project
* @return Regexp instance associated with this RegularExpression instance
*/
public Regexp getRegexp(Project p) {
init(p);
if (isReference()) {
return getRef(p).getRegexp(p);
}
setPattern();
return this.regexp;
}
/***
* Get the RegularExpression this reference refers to in
* the given project. Check for circular references too
* @param p project
* @return resolved RegularExpression instance
*/
public RegularExpression getRef(Project p) {
if (!isChecked()) {
Stack stk = new Stack();
stk.push(this);
dieOnCircularReference(stk, p);
}
Object o = getRefid().getReferencedObject(p);
if (!(o instanceof RegularExpression)) {
String msg = getRefid().getRefId() + " doesn\'t denote a "
+ DATA_TYPE_NAME;
throw new BuildException(msg);
} else {
return (RegularExpression) o;
}
}
}
|