c04bb88f7eee296ba5bedfa12eab2f1d917d80e2
[cql-java-moved-to-github.git] / src / main / java / org / z3950 / zing / cql / ModifierSet.java
1 // $Id: ModifierSet.java,v 1.13 2007-07-03 13:30:18 mike Exp $
2
3 package org.z3950.zing.cql;
4 import java.util.ArrayList;
5 import java.util.List;
6
7 /**
8  * Represents a base String and a set of Modifiers.
9  * <P>
10  * This class is used as a workhorse delegate by both CQLRelation and
11  * CQLProxNode - two functionally very separate classes that happen to
12  * require similar data structures and functionality.
13  * <P>
14  * A ModifierSet consists of a ``base'' string together with a set of
15  * zero or more <I>type</I> <I>comparison</I> <I>value</I> pairs,
16  * where type, comparison and value are all strings.
17  *
18  * @version $Id: ModifierSet.java,v 1.13 2007-07-03 13:30:18 mike Exp $
19  */
20 public class ModifierSet {
21     private String base;
22     private List<Modifier> modifiers;
23
24     /**
25      * Creates a new ModifierSet with the specified base.
26      */
27     public ModifierSet(String base) {
28         this.base = base;
29         modifiers = new ArrayList<Modifier>();
30     }
31
32     /**
33      * Returns the base string with which the ModifierSet was created.
34      */
35     public String getBase() {
36         return base;
37     }
38
39     /**
40      * Adds a modifier of the specified <TT>type</TT>,
41      * <TT>comparison</TT> and <TT>value</TT> to a ModifierSet.
42      */
43     public void addModifier(String type, String comparison, String value) {
44         Modifier modifier = new Modifier(type, comparison, value);
45         modifiers.add(modifier);
46     }
47
48     /**
49      * Adds a modifier of the specified <TT>type</TT>, but with no
50      * <TT>comparison</TT> and <TT>value</TT>, to a ModifierSet.
51      */
52     public void addModifier(String type) {
53         Modifier modifier = new Modifier(type);
54         modifiers.add(modifier);
55     }
56
57     /**
58      * Returns the value of the modifier in the specified ModifierSet
59      * that corresponds to the specified type.
60      */
61     public String modifier(String type) {
62         int n = modifiers.size();
63         for (int i = 0; i < n; i++) {
64             Modifier mod = modifiers.get(i);
65             if (mod.type.equals(type))
66                 return mod.value;
67         }
68         return null;
69     }
70
71     /**
72      * Returns an array of the modifiers in a ModifierSet.
73      * @return
74      *  An array of Modifiers.
75      */
76     public List<Modifier> getModifiers() {
77         return modifiers;
78     }
79
80     public String toXCQL(int level, String topLevelElement) {
81         return "";//underlyingToXCQL(level, topLevelElement, "value");
82     }
83
84     public String sortKeyToXCQL(int level) {
85         return "";//underlyingToXCQL(level, "key", "index");
86     }
87
88     protected XCQLBuilder toXCQLInternal(XCQLBuilder b, int level,
89         String topLevelElement) {
90         return toXCQLInternal(b, level, topLevelElement, "value");
91     }
92
93     private XCQLBuilder toXCQLInternal(XCQLBuilder b, int level, 
94         String topLevelElement, String valueElement) {
95         b.indent(level).append("<").append(topLevelElement).
96             append(">\n").indent(level + 1).append("<").
97             append(valueElement).append(">").xq(base).append("</").
98             append(valueElement).append(">\n");
99         if (modifiers.size() > 0) {
100             b.indent(level + 1).append("<modifiers>\n");
101             for (int i = 0; i < modifiers.size(); i++) {
102               modifiers.get(i).toXCQLInternal(b, level+2, "comparison");
103             }
104             b.indent(level + 1).append("</modifiers>\n");
105         }
106         b.indent(level).append("</").append(topLevelElement).append(">\n");
107         return b;
108     }
109
110     public String toCQL() {
111         StringBuilder buf = new StringBuilder(base);
112         for (int i = 0; i < modifiers.size(); i++) {
113             buf.append("/").append(modifiers.get(i).toCQL());
114         }
115
116         return buf.toString();
117     }
118
119     public static void main(String[] args) {
120         if (args.length < 1) {
121             System.err.println("Usage: ModifierSet <base> [<type> <comparison> <name>]...");
122             System.exit(1);
123         }
124
125         ModifierSet res = new ModifierSet(args[0]);
126         for (int i = 1; i < args.length; i += 3) {
127             res.addModifier(args[i], args[i+1], args[i+2]);
128         }
129
130         System.out.println(res.toCQL());
131     }
132 }