1 package net.sf.jhunlang.jmorph.sword;
2
3 import java.util.Iterator;
4 import java.util.Map;
5 import java.util.TreeMap;
6
7 import java.io.Serializable;
8
9 import net.sf.jhunlang.jmorph.util.Comparables;
10
11 /***
12 * Case instances represent prefix and affix categories.
13 * They are mapped by their {@link #name}s.
14 */
15 public class Case implements Serializable
16 {
17 public final static String[] ZERO_MORPHS =
18 {
19 "NOM",
20 "PRES_INDIC_INDEF_SG_3"
21 };
22
23 /***
24 * The map of Case instances by their {@link #name}s.
25 */
26 protected final static Map cases = new TreeMap();
27 /***
28 * Convenience constant for the empty Case.
29 */
30 public final static Case empty = getCase("");
31 /***
32 * The affix morpheme
33 */
34 protected String affix;
35 /***
36 * The morpheme (allomorph) of this Case.
37 */
38 protected String name;
39
40 protected boolean zero;
41
42 /***
43 * Return a Case instance for <code>name</code> with zero morpheme.
44 * Return the Case instance from {@link #cases} for <code>name</code> if any.
45 * Create and return a new one otherwise.
46 * @param name the name of the case
47 * @return the Case instance for <code>name</code> with zero morpheme
48 */
49 public static Case getCase(String name)
50 {
51 return getCase("", name);
52 }
53
54 /***
55 * Return a Case instance for <code>name</code> with allomorph
56 * <code>affix</code>. Return the Case instance from {@link #cases}
57 * for <code>affix</code> and <code>name</code> if any. Create and
58 * return a new one otherwise.
59 * @param affix the allomorph of the case
60 * @param name the name of the case
61 * @return the Case instance for <code>name</code> with allomorph
62 * <code>affix</code>
63 */
64 public static Case getCase(String affix, String name)
65 {
66 Comparables c = new Comparables(affix, name, false);
67 Case cas = (Case)cases.get(c);
68 if (cas == null)
69 {
70 for(int i = 0; i < ZERO_MORPHS.length; i++)
71 {
72 if (name.equalsIgnoreCase(ZERO_MORPHS[i]))
73 {
74 cas = new Case(affix, name, true);
75 }
76 }
77 if (cas == null)
78 {
79 cas = new Case(affix, name, false);
80 }
81 cases.put(c, cas);
82 }
83 return cas;
84 }
85
86 /***
87 * Return an iterator for all the Case instances created so far.
88 * @return an iterator for all the Case instances created so far
89 */
90 public static Iterator getCaseIterator()
91 {
92 return cases.values().iterator();
93 }
94
95 /***
96 * Create a Case instance for <code>name</code> with allomorph
97 * <code>affix</code>.
98 * @param affix the allomorph of the case
99 * @param name the name of the case
100 */
101 protected Case(String affix, String name, boolean zero)
102 {
103 this.affix = affix.intern();
104 this.name = name.intern();
105 this.zero = zero;
106 }
107
108 public boolean zero()
109 {
110 return zero;
111 }
112
113 /***
114 * Return the name of this Case instance.
115 * @return the name of this Case instance
116 */
117 public String getName()
118 {
119 return name;
120 }
121
122 /***
123 * Return the allomorph of this Case instance.
124 * @return the allomorph of this Case instance
125 */
126 public String getAffix()
127 {
128 return affix;
129 }
130
131 public String morphString()
132 {
133 return affix.length() == 0 ? name : (affix + ", " + name);
134 }
135
136 public String contentString()
137 {
138 return morphString();
139 }
140
141 public String toString()
142 {
143 return "{" + contentString() + "}";
144 }
145 }
146