KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > gnu > xquery > util > RelativeStepFilter


1 // Copyright (c) 2006 Per M.A. Bothner.
2
// This is free software; for terms and warranty disclaimer see ./COPYING.
3

4 package gnu.xquery.util;
5 import gnu.lists.*;
6 import gnu.kawa.xml.*;
7
8 /** Used to filter the output of RelativeStep.
9  * Atomic values are passed though as-is, while node values are sorted
10  * by document order and duplicates removed. An exception is thrown
11  * if there is a mix of atoms and nodes.
12  * Informally: {@code E1/E2} is implemented as:
13  * {@code RelativeStepFilter(for $dot in E1 return E2)}.
14  */

15
16 public class RelativeStepFilter extends FilterConsumer
17   implements PositionConsumer
18 {
19   // 'A' for atomic, 'N' for nodes, '\0' for neither.
20
char seen;
21
22   SortedNodes snodes;
23
24   public RelativeStepFilter (Consumer base)
25   {
26     super(base);
27   }
28
29   // Not sure if this is ever called ...
30
public void consume(SeqPosition position)
31   {
32     writePosition(position.sequence, position.ipos);
33   }
34
35   public void writeObject(Object JavaDoc v)
36   {
37     if (v instanceof SeqPosition)
38       {
39         SeqPosition n = (SeqPosition) v;
40         writePosition(n.sequence, n.ipos);
41       }
42     else
43       super.writeObject(v);
44   }
45
46   protected void beforeContent ()
47   {
48     if (seen == 'N')
49       throw new Error JavaDoc("path returns mix of atoms and nodes");
50     seen = 'A';
51   }
52
53   public void writePosition(AbstractSequence seq, int ipos)
54   {
55     if (seen == 'A')
56       throw new Error JavaDoc("path returns mix of atoms and nodes");
57     seen = 'N';
58     if (snodes == null)
59       snodes = new SortedNodes();
60     snodes.writePosition(seq, ipos);
61   }
62
63   public void finish ()
64   {
65     if (snodes != null)
66       snodes.consume(base);
67     snodes = null;
68   }
69 }
70
Popular Tags