Finish (more or less) to CQL-to-PQF translator.
[cql-java-moved-to-github.git] / src / org / z3950 / zing / cql / ModifierSet.java
1 // $Id: ModifierSet.java,v 1.4 2002-11-06 20:13:45 mike Exp $
2
3 package org.z3950.zing.cql;
4 import java.util.Vector;
5 import java.lang.StringBuffer;
6
7 /**
8  * Represents a base String and a set of modifier Strings.
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 the same data structures and functionality.
13  *
14  * @version $Id: ModifierSet.java,v 1.4 2002-11-06 20:13:45 mike Exp $
15  */
16 public class ModifierSet {
17     String base;
18     Vector modifiers;
19
20     public ModifierSet(String base) {
21         this.base = base;
22         modifiers = new Vector();
23     }
24
25     public String getBase() {
26         return base;
27     }
28
29     public void addModifier(String type, String value) {
30         Vector modifier = new Vector();
31         modifier.add(type);
32         modifier.add(value);
33         modifiers.add(modifier);
34     }
35
36     public String modifier(String type) {
37         int n = modifiers.size();
38         for (int i = 0; i < n; i++) {
39             Vector pair = (Vector) modifiers.get(i);
40             if (pair.get(0).equals(type))
41                 return (String) pair.get(1);
42         }
43         return null;
44     }
45
46     public Vector[] getModifiers() {
47         int n = modifiers.size();
48         Vector[] res = new Vector[n];
49         for (int i = 0; i < n; i++) {
50             res[i] = (Vector) modifiers.get(i);
51         }
52
53         return res;
54     }
55
56     public String toXCQL(int level, String topLevelElement) {
57         StringBuffer buf = new StringBuffer();
58         buf.append (Utils.indent(level) + "<" + topLevelElement + ">\n" +
59                     Utils.indent(level+1) + "<value>" + Utils.xq(base) +
60                     "</value>\n");
61         Vector[] mods = getModifiers();
62         if (mods.length > 0) {
63             buf.append(Utils.indent(level+1) + "<modifiers>\n");
64             for (int i = 0; i < mods.length; i++) {
65                 Vector modifier = mods[i];
66                 buf.append(Utils.indent(level+2)).
67                     append("<modifier>");
68                 if (modifier.get(0) != null)
69                     buf.append("<type>").
70                         append(Utils.xq((String) modifier.get(0))).
71                         append("</type>");
72                 buf.append("<value>").
73                     append(Utils.xq((String) modifier.get(1))).
74                     append("</value>");
75                 buf.append("</modifier>\n");
76             }
77             buf.append(Utils.indent(level+1) + "</modifiers>\n");
78         }
79         buf.append(Utils.indent(level) + "</" + topLevelElement + ">\n");
80         return buf.toString();
81     }
82
83     public String toCQL() {
84         StringBuffer buf = new StringBuffer(base);
85         Vector[] mods = getModifiers();
86         for (int i = 0; i < mods.length; i++) {
87             buf.append("/").append(mods[i].get(1));
88         }
89
90         return buf.toString();
91     }
92
93     public static void main(String[] args) {
94         if (args.length < 1) {
95             System.err.println("Usage: ModifierSet <base> [<type> <name>]...");
96             System.exit(1);
97         }
98
99         ModifierSet res = new ModifierSet(args[0]);
100         for (int i = 1; i < args.length; i += 2) {
101             res.addModifier(args[i], args[i+1]);
102         }
103
104         System.out.println(res.toCQL());
105     }
106 }