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

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

Fixed a problem that was causing lines with hash symbols in them to not be rendered properly

  • Property svn:keywords set to Author Date Id Revision
File size: 6.5 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 // if we haven't been given any args, don't bother looking for them
184 if (args == null)
185 {
186 return initial;
187 }
188 // If the string contains arguments we have to insert them.
189 StringBuffer complete = new StringBuffer();
190 // While we still have initial string left.
191 while (initial.length() > 0 && initial.indexOf('{') != -1 && initial.indexOf('}') != -1)
192 {
193 // Remove preamble
194 int opening = initial.indexOf('{');
195 int closing = initial.indexOf('}');
196 int comment_mark = initial.indexOf('-', opening); // May not exist
197 if (comment_mark > closing)
198 { // May also be detecting a later comment
199 comment_mark = -1;
200 }
201 complete.append(initial.substring(0, opening));
202
203 // Parse arg_num
204 String arg_str = null;
205 if (comment_mark != -1)
206 {
207 arg_str = initial.substring(opening + 1, comment_mark);
208 }
209 else
210 {
211 arg_str = initial.substring(opening + 1, closing);
212 }
213 if (closing + 1 < initial.length())
214 {
215 initial = initial.substring(closing + 1);
216 }
217 else
218 {
219 initial = "";
220 }
221 int arg_num = Integer.parseInt(arg_str);
222 // Insert argument
223 if (args != null && 0 <= arg_num && arg_num < args.length)
224 {
225 complete.append(args[arg_num]);
226 }
227 }
228 complete.append(initial);
229 return complete.toString();
230 }
231 catch (Exception e)
232 {
233 //logger.debug("Dictionary Error: couldn't find string for key:" + key +" in resource "+this.resource);
234 return null;
235 }
236 }
237}
Note: See TracBrowser for help on using the repository browser.