1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18 /**
19 * @author Nikolay A. Kuznetsov
20 */
21 package java.util.regex;
22
23 import java.util.ArrayList;
24
25 /**
26 * Positive lookbehind node.
27 *
28 * @author Nikolay A. Kuznetsov
29 */
30 class PositiveLookBehind extends AtomicJointSet {
31
32 public PositiveLookBehind(ArrayList children, FSet fSet) {
33 super(children, fSet);
34 }
35
36 /**
37 * Returns stringIndex+shift, the next position to match
38 */
39 public int matches(int stringIndex, CharSequence testString,
40 MatchResultImpl matchResult) {
41
42 int size = children.size();
43 int leftBound = matchResult.hasTransparentBounds()?
44 0 : matchResult.getLeftBound();
45
46 int shift = next.matches(stringIndex, testString, matchResult);
47 if (shift >= 0) {
48 //fSet will take this index to check if we at the right bound
49 // and return true if the current index equal to this one
50 matchResult.setConsumed(groupIndex, stringIndex);
51 for (int i = 0; i < size; i++) {
52 AbstractSet e = (AbstractSet) children.get(i);
53 // find limits could be calculated though e.getCharCount()
54 // fSet will return true only if string index at fSet equal
55 // to stringIndex
56 if (e.findBack(leftBound, stringIndex, testString, matchResult) >=0) {
57 matchResult.setConsumed(groupIndex, -1);
58 return shift;
59 }
60 }
61 }
62
63 return -1;
64 }
65
66 public boolean hasConsumed(MatchResultImpl matchResult) {
67 return false;
68 }
69
70 protected String getName() {
71 return "PosBehindJointSet"; //$NON-NLS-1$
72 }
73 }