001: package org.ofbiz.rules.parse;
002:
003: import java.util.*;
004:
005: /**
006: * <p><b>Title:</b> Sequence
007: * <p><b>Description:</b> None
008: * <p>Copyright (c) 1999 Steven J. Metsker.
009: * <p>Copyright (c) 2001 The Open For Business Project - www.ofbiz.org
010: *
011: * <p>Permission is hereby granted, free of charge, to any person obtaining a
012: * copy of this software and associated documentation files (the "Software"),
013: * to deal in the Software without restriction, including without limitation
014: * the rights to use, copy, modify, merge, publish, distribute, sublicense,
015: * and/or sell copies of the Software, and to permit persons to whom the
016: * Software is furnished to do so, subject to the following conditions:
017: *
018: * <p>The above copyright notice and this permission notice shall be included
019: * in all copies or substantial portions of the Software.
020: *
021: * <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
022: * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
023: * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
024: * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
025: * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
026: * OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
027: * THE USE OR OTHER DEALINGS IN THE SOFTWARE.
028: *
029: * <br>
030: * <p>A <code>Sequence</code> object is a collection of
031: * parsers, all of which must in turn match against an
032: * assembly for this parser to successfully match.
033: *
034: * @author Steven J. Metsker
035: * @version 1.0
036: */
037: public class Sequence extends CollectionParser {
038:
039: /**
040: * Constructs a nameless sequence.
041: */
042: public Sequence() {
043: }
044:
045: /**
046: * Constructs a sequence with the given name.
047: *
048: * @param name a name to be known by
049: */
050: public Sequence(String name) {
051: super (name);
052: }
053:
054: /**
055: * Accept a "visitor" and a collection of previously visited
056: * parsers.
057: *
058: * @param pv the visitor to accept
059: *
060: * @param visited a collection of previously visited parsers
061: */
062: public void accept(ParserVisitor pv, List visited) {
063: pv.visitSequence(this , visited);
064: }
065:
066: /**
067: * Given a set of assemblies, this method matches this
068: * sequence against all of them, and returns a new set
069: * of the assemblies that result from the matches.
070: *
071: * @return a List of assemblies that result from
072: * matching against a beginning set of assemblies
073: *
074: * @param in a vector of assemblies to match against
075: *
076: */
077: public List match(List in) {
078: List out = in;
079: Enumeration e = Collections.enumeration(subparsers);
080:
081: while (e.hasMoreElements()) {
082: Parser p = (Parser) e.nextElement();
083:
084: out = p.matchAndAssemble(out);
085: if (out.isEmpty()) {
086: return out;
087: }
088: }
089: return out;
090: }
091:
092: /**
093: * Create a random expansion for each parser in this
094: * sequence and return a collection of all these expansions.
095: */
096: protected List randomExpansion(int maxDepth, int depth) {
097: List v = new ArrayList();
098: Enumeration e = Collections.enumeration(subparsers);
099:
100: while (e.hasMoreElements()) {
101: Parser p = (Parser) e.nextElement();
102: List w = p.randomExpansion(maxDepth, depth++);
103: Enumeration f = Collections.enumeration(w);
104:
105: while (f.hasMoreElements()) {
106: v.add(f.nextElement());
107: }
108: }
109: return v;
110: }
111:
112: /**
113: * Returns the string to show between the parsers this
114: * parser is a sequence of. This is an empty string,
115: * since convention indicates sequence quietly. For
116: * example, note that in the regular expression
117: * <code>(a|b)c</code>, the lack of a delimiter between
118: * the expression in parentheses and the 'c' indicates a
119: * sequence of these expressions.
120: */
121: protected String toStringSeparator() {
122: return "";
123: }
124: }
|