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