1 // $Id: ModifierSet.java,v 1.13 2007-07-03 13:30:18 mike Exp $
3 package org.z3950.zing.cql;
4 import java.util.Vector;
5 import java.lang.StringBuffer;
8 * Represents a base String and a set of Modifiers.
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.
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.
18 * @version $Id: ModifierSet.java,v 1.13 2007-07-03 13:30:18 mike Exp $
20 public class ModifierSet {
22 Vector<Modifier> modifiers;
25 * Creates a new ModifierSet with the specified base.
27 public ModifierSet(String base) {
29 modifiers = new Vector<Modifier>();
33 * Returns the base string with which the ModifierSet was created.
35 public String getBase() {
40 * Adds a modifier of the specified <TT>type</TT>,
41 * <TT>comparison</TT> and <TT>value</TT> to a ModifierSet.
43 public void addModifier(String type, String comparison, String value) {
44 Modifier modifier = new Modifier(type, comparison, value);
45 modifiers.add(modifier);
49 * Adds a modifier of the specified <TT>type</TT>, but with no
50 * <TT>comparison</TT> and <TT>value</TT>, to a ModifierSet.
52 public void addModifier(String type) {
53 Modifier modifier = new Modifier(type);
54 modifiers.add(modifier);
58 * Returns the value of the modifier in the specified ModifierSet
59 * that corresponds to the specified type.
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))
72 * Returns an array of the modifiers in a ModifierSet.
74 * An array of Modifiers.
76 public Vector<Modifier> getModifiers() {
80 public String toXCQL(int level, String topLevelElement) {
81 return underlyingToXCQL(level, topLevelElement, "value");
84 public String sortKeyToXCQL(int level) {
85 return underlyingToXCQL(level, "key", "index");
88 private String underlyingToXCQL(int level, String topLevelElement,
89 String valueElement) {
90 StringBuffer buf = new StringBuffer();
91 buf.append(Utils.indent(level) + "<" + topLevelElement + ">\n");
92 buf.append(Utils.indent(level+1) +
93 "<" + valueElement + ">" + Utils.xq(base) +
94 "</" + valueElement + ">\n");
95 if (modifiers.size() > 0) {
96 buf.append(Utils.indent(level+1) + "<modifiers>\n");
97 for (int i = 0; i < modifiers.size(); i++) {
98 buf.append(modifiers.get(i).toXCQL(level+2, "comparison"));
100 buf.append(Utils.indent(level+1) + "</modifiers>\n");
102 buf.append(Utils.indent(level) + "</" + topLevelElement + ">\n");
103 return buf.toString();
106 public String toCQL() {
107 StringBuffer buf = new StringBuffer(base);
108 for (int i = 0; i < modifiers.size(); i++) {
109 buf.append("/" + modifiers.get(i).toCQL());
112 return buf.toString();
115 public static void main(String[] args) {
116 if (args.length < 1) {
117 System.err.println("Usage: ModifierSet <base> [<type> <comparison> <name>]...");
121 ModifierSet res = new ModifierSet(args[0]);
122 for (int i = 1; i < args.length; i += 3) {
123 res.addModifier(args[i], args[i+1], args[i+2]);
126 System.out.println(res.toCQL());