001: /*
002: * Copyright 2004-2005 The Apache Software Foundation
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.apache.commons.net.ftp.parser;
018:
019: import org.apache.commons.net.ftp.FTPFileEntryParserImpl;
020: import org.apache.oro.text.regex.MalformedPatternException;
021: import org.apache.oro.text.regex.MatchResult;
022: import org.apache.oro.text.regex.Pattern;
023: import org.apache.oro.text.regex.PatternMatcher;
024: import org.apache.oro.text.regex.Perl5Compiler;
025: import org.apache.oro.text.regex.Perl5Matcher;
026:
027: /**
028: * This abstract class implements both the older FTPFileListParser and
029: * newer FTPFileEntryParser interfaces with default functionality.
030: * All the classes in the parser subpackage inherit from this.
031: *
032: * This is the base for all regular based FTPFileEntryParser
033: *
034: * @author Steve Cohen <scohen@apache.org>
035: */
036: public abstract class RegexFTPFileEntryParserImpl extends
037: FTPFileEntryParserImpl {
038: /**
039: * internal pattern the matcher tries to match, representing a file
040: * entry
041: */
042: private Pattern pattern = null;
043:
044: /**
045: * internal match result used by the parser
046: */
047: private MatchResult result = null;
048:
049: /**
050: * Internal PatternMatcher object used by the parser. It has protected
051: * scope in case subclasses want to make use of it for their own purposes.
052: */
053: protected PatternMatcher _matcher_ = null;
054:
055: /**
056: * The constructor for a RegexFTPFileEntryParserImpl object.
057: *
058: * @param regex The regular expression with which this object is
059: * initialized.
060: *
061: * @exception IllegalArgumentException
062: * Thrown if the regular expression is unparseable. Should not be seen in
063: * normal conditions. It it is seen, this is a sign that a subclass has
064: * been created with a bad regular expression. Since the parser must be
065: * created before use, this means that any bad parser subclasses created
066: * from this will bomb very quickly, leading to easy detection.
067: */
068:
069: public RegexFTPFileEntryParserImpl(String regex) {
070: super ();
071: try {
072: _matcher_ = new Perl5Matcher();
073: pattern = new Perl5Compiler().compile(regex);
074: } catch (MalformedPatternException e) {
075: throw new IllegalArgumentException(
076: "Unparseable regex supplied: " + regex);
077: }
078: }
079:
080: /**
081: * Convenience method delegates to the internal MatchResult's matches()
082: * method.
083: *
084: * @param s the String to be matched
085: * @return true if s matches this object's regular expression.
086: */
087:
088: public boolean matches(String s) {
089: this .result = null;
090: if (_matcher_.matches(s.trim(), this .pattern)) {
091: this .result = _matcher_.getMatch();
092: }
093: return null != this .result;
094: }
095:
096: /**
097: * Convenience method delegates to the internal MatchResult's groups()
098: * method.
099: *
100: * @return the number of groups() in the internal MatchResult.
101: */
102:
103: public int getGroupCnt() {
104: if (this .result == null) {
105: return 0;
106: }
107: return this .result.groups();
108: }
109:
110: /**
111: * Convenience method delegates to the internal MatchResult's group()
112: * method.
113: *
114: * @param matchnum match group number to be retrieved
115: *
116: * @return the content of the <code>matchnum'th<code> group of the internal
117: * match or null if this method is called without a match having
118: * been made.
119: */
120: public String group(int matchnum) {
121: if (this .result == null) {
122: return null;
123: }
124: return this .result.group(matchnum);
125: }
126:
127: /**
128: * For debugging purposes - returns a string shows each match group by
129: * number.
130: *
131: * @return a string shows each match group by number.
132: */
133:
134: public String getGroupsAsString() {
135: StringBuffer b = new StringBuffer();
136: for (int i = 1; i <= this .result.groups(); i++) {
137: b.append(i).append(") ").append(this .result.group(i))
138: .append(System.getProperty("line.separator"));
139: }
140: return b.toString();
141: }
142:
143: }
|