source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/util/Dictionary.java@ 26254

Last change on this file since 26254 was 26254, checked in by sjm84, 12 years ago

Reformatting this file

  • Property svn:keywords set to Author Date Id Revision
File size: 6.6 KB
Line 
1/*
2 * Dictionary.java
3 * Copyright (C) 2005 New Zealand Digital Library, http://www.nzdl.org
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 */
19package org.greenstone.gsdl3.util;
20
21import java.util.ResourceBundle;
22import java.util.Locale;
23import java.util.Enumeration;
24
25import org.apache.log4j.*;
26
27public class Dictionary
28{
29
30 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.util.Dictionary.class.getName());
31
32 /** The locale of this dictionary. */
33 protected Locale locale = null;
34
35 /** The resource that has been loaded */
36 protected String resource = null;
37
38 /**
39 * The ResourceBundle which contains the raw key-value mappings. Loaded from
40 * a file named "resource_locale.properties
41 */
42 private ResourceBundle raw = null;
43
44 /**
45 * Constructs the Dictionary class by first creating a locale from the
46 * specified language, (or using the default locale if this didn't work),
47 * then loading a resource bundle based on this locale.
48 */
49 public Dictionary(String resource, String lang)
50 {
51 // Initialize.
52
53 this.locale = new Locale(lang);
54 this.resource = resource;
55 if (this.locale == null)
56 {
57 this.locale = Locale.getDefault();
58 }
59 try
60 {
61 this.raw = ResourceBundle.getBundle(this.resource, this.locale);
62 }
63 catch (Exception e)
64 {
65 //logger.debug("Dictionary: couldn't locate a resource bundle for "+resource);
66 }
67 }
68
69 public Dictionary(String resource, Locale locale)
70 {
71 this.locale = locale;
72 this.resource = resource;
73 try
74 {
75 this.raw = ResourceBundle.getBundle(this.resource, this.locale);
76 }
77 catch (Exception e)
78 {
79 //logger.debug("Dictionary: couldn't locate a resource bundle for "+resource);
80 }
81 }
82
83 /**
84 * Constructs the Dictionary class by first creating a locale from the
85 * specified language, (or using the default locale if this didn't work),
86 * then loading a resource bundle based on this locale. A classloader is
87 * specified which can be used to find the resource.
88 */
89 public Dictionary(String resource, String lang, ClassLoader loader)
90 {
91 // Initialize.
92 this.locale = new Locale(lang);
93 this.resource = resource;
94 if (this.locale == null)
95 {
96 this.locale = Locale.getDefault();
97 }
98 // try the specified class loader
99 try
100 {
101 this.raw = ResourceBundle.getBundle(this.resource, this.locale, loader);
102 return;
103 }
104 catch (Exception e)
105 {
106 }
107 ;
108
109 try
110 {
111 this.raw = ResourceBundle.getBundle(this.resource, this.locale);
112 }
113 catch (Exception ex)
114 {
115 //logger.debug("Dictionary: couldn't locate a resource bundle for "+resource);
116 }
117 }
118
119 public Enumeration getKeys()
120 {
121 if (this.raw != null)
122 {
123 return this.raw.getKeys();
124 }
125 return null;
126 }
127
128 /**
129 * Overloaded to call get with both a key and an empty argument array.
130 *
131 * @param key
132 * A <strong>String</strong> which is mapped to a initial String
133 * within the ResourceBundle.
134 * @return A <strong>String</strong> which has been referenced by the key
135 * String and that contains no argument fields.
136 */
137 public String get(String key)
138 {
139 return get(key, null);
140 }
141
142 /**
143 * Used to retrieve a property value from the Locale specific
144 * ResourceBundle, based upon the key and arguments supplied. If the key
145 * cannot be found or if some other part of the call fails a default
146 * (English) error message is returned. <BR>
147 * Here the get recieves a second argument which is an array of Strings used
148 * to populate argument fields, denoted {<I>n</I>}, within the value String
149 * returned.
150 *
151 * @param key
152 * A <strong>String</strong> which is mapped to a initial String
153 * within the ResourceBundle.
154 * @param args
155 * A <strong>String[]</strong> used to populate argument fields
156 * within the complete String.
157 * @return A <strong>String</strong> which has been referenced by the key
158 * String and that either contains no argument fields, or has had
159 * the argument fields populated with argument Strings provided in
160 * the get call.
161 */
162 public String get(String key, String args[])
163 {
164 String argsStr = "";
165 if (args != null)
166 {
167 for (String arg : args)
168 {
169 argsStr += arg + " ";
170 }
171 }
172
173 if (this.raw == null)
174 {
175 return null;
176 }
177 try
178 {
179 String initial_raw = this.raw.getString(key);
180 // convert to unicode, copied from gatherer dictionary
181 String initial = new String(initial_raw.getBytes("ISO-8859-1"), "UTF-8");
182
183 // Remove any comments from the string
184 if (initial.indexOf("#") != -1)
185 {
186 initial = initial.substring(0, initial.indexOf("#"));
187 }
188 // if we haven't been given any args, don't bother looking for them
189 if (args == null)
190 {
191 return initial;
192 }
193 // If the string contains arguments we have to insert them.
194 StringBuffer complete = new StringBuffer();
195 // While we still have initial string left.
196 while (initial.length() > 0 && initial.indexOf('{') != -1 && initial.indexOf('}') != -1)
197 {
198 // Remove preamble
199 int opening = initial.indexOf('{');
200 int closing = initial.indexOf('}');
201 int comment_mark = initial.indexOf('-', opening); // May not exist
202 if (comment_mark > closing)
203 { // May also be detecting a later comment
204 comment_mark = -1;
205 }
206 complete.append(initial.substring(0, opening));
207
208 // Parse arg_num
209 String arg_str = null;
210 if (comment_mark != -1)
211 {
212 arg_str = initial.substring(opening + 1, comment_mark);
213 }
214 else
215 {
216 arg_str = initial.substring(opening + 1, closing);
217 }
218 if (closing + 1 < initial.length())
219 {
220 initial = initial.substring(closing + 1);
221 }
222 else
223 {
224 initial = "";
225 }
226 int arg_num = Integer.parseInt(arg_str);
227 // Insert argument
228 if (args != null && 0 <= arg_num && arg_num < args.length)
229 {
230 complete.append(args[arg_num]);
231 }
232 }
233 complete.append(initial);
234 return complete.toString();
235 }
236 catch (Exception e)
237 {
238 //logger.debug("Dictionary Error: couldn't find string for key:" + key +" in resource "+this.resource);
239 return null;
240 }
241 }
242}
Note: See TracBrowser for help on using the repository browser.