Revision 31596

View differences:

tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_sr.properties
1
#Translations for language [sr]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Prihvati
0 4

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_tr.properties
1
#Translations for language [tr]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Kabul et
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_ru.properties
1
#Translations for language [ru]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=\u041e\u041a
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_de.properties
1
#Translations for language [de]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=OK
4
Las_traducciones_no_pudieron_ser_cargadas=\u00dcbersetzung konnte nicht geladen werden
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=Keine bevorzugte Spracheinstellung. M\u00f6glicherweise wurde die Klasse nicht korrekt eingebunden 
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=Keine bevorzugte Spracheinstellung. M\u00f6glicherweise wurde die Klasse nicht korrekt eingebunden 
7
No_se_encontro_la_traduccion_para=Konnte \u00dcbersetzung nicht finden f\u00fcr\:
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_sw.properties
1
#Translations for language [sw]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Idhinisha
0 4

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_el.properties
1
#Translations for language [el]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=\u0391\u03c0\u03bf\u03b4\u03bf\u03c7\u03ae
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_en.properties
1
#Translations for language [en]
2
#Mon Sep 21 10:02:17 CEST 2009
3
aceptar=Accept
4
Las_traducciones_no_pudieron_ser_cargadas=Translations haven't could be loaded
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=There is no list of favorite languages probably you forgot initialice the class
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=There is not preferred languages list. Maybe the Messages class was not initiated
7
No_se_encontro_la_traduccion_para=Cannot find translation for
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_gl.properties
1
#Translations for language [gl]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Aceptar
4
Las_traducciones_no_pudieron_ser_cargadas=As traducci\u00f3ns non se puideron cargar
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=Non se atopou a lista de idiomas preferidos.Quiz\u00e1s non se lembrou de inicializar a clase
7
No_se_encontro_la_traduccion_para=Non se atopou a traducci\u00f3n para
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_cs.properties
1
#Translations for language [cs]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Budi\u017e
4
Las_traducciones_no_pudieron_ser_cargadas=
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=Neexistuje seznam obl\u00edben\u00fdch jazyk\u016f, mo\u017en\u00e1 jste zapom\u011bl inicializovat t\u0159\u00eddu
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=
7
No_se_encontro_la_traduccion_para=Nelze nal\u00e9zt p\u0159eklad pro
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_pt_BR.properties
1
#Translations for language [pt_BR]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=aceitar
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_fr.properties
1
#Translations for language [fr]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Accepter
4
Las_traducciones_no_pudieron_ser_cargadas=Les traductions ne peuvent pas \u00eatre charg\u00e9es.
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=Aucune liste de pr\u00e9f\u00e9rences du langage initialis\u00e9e.
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=Impossible de trouver la liste des langues pr\u00e9f\u00e9r\u00e9es. Vous avez peut-\u00eatre oubli\u00e9 d'installer la classe.
7
No_se_encontro_la_traduccion_para=Impossible de trouver les traductions pour
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_eu.properties
1
#Translations for language [eu]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Ados
4
Las_traducciones_no_pudieron_ser_cargadas=Itzulpenak ezin izan dira kargatu
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=\=Ez da hobetsitako hizkuntzen zerrenda aurkitu. Agian klasea hasieratzea ahaztu zaizu
7
No_se_encontro_la_traduccion_para=Ez da itzulpenik aurkitu honetarako\:
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_nl.properties
1
#Translations for language [nl]
2
#Tue Aug 11 10:49:16 CEST 2009
3
aceptar=
0 4

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_en_US.properties
1
#Translations for language [en_US]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Ok
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_pl.properties
1
#Translations for language [pl]
2
#Thu Oct 29 12:16:22 CET 2009
3
aceptar=Akceptuj
0 4

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_it.properties
1
#Translations for language [it]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Accetta
4
Las_traducciones_no_pudieron_ser_cargadas=Non \u00e8 stato possibile caricare le traduzioni
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=Non esiste la lista dei linguaggi preferiti. Probabilmente la classe Messages non \u00e8 stata inizializzata
7
No_se_encontro_la_traduccion_para=Non si \u00e9 incontrata la traduzione per
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_ro.properties
1
#Translations for language [ro]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Accept
0 4

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text.properties
1
#Translations for language [es]
2
#Mon Sep 21 10:02:17 CEST 2009
3
aceptar=Aceptar
4
Las_traducciones_no_pudieron_ser_cargadas=Las traducciones no pudieron ser cargadas
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=No hay lista de idiomas preferidos. Quiza olvido inicializar la clase
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=No hay lista de idiomas preferidos. Quiz\u00e1 olvid\u00f3 inicializar la clase.
7
No_se_encontro_la_traduccion_para=No se encontr\u00f3 la traducci\u00f3n para
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_zh.properties
1
#Translations for language [zh]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=\u786e\u5b9a
0 4

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_ca.properties
1
#Translations for language [ca]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Acceptar
4
Las_traducciones_no_pudieron_ser_cargadas=Les traduccions no s'han pogut carregar
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=No s'ha trobat la llista d'idiomes preferits. Potser ha oblidat inicialitzar la classe
7
No_se_encontro_la_traduccion_para=No s'ha trobat la traducci\u00f3 per a
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/config/text_pt.properties
1
#Translations for language [pt]
2
#Mon Sep 21 10:02:18 CEST 2009
3
aceptar=Aceitar
4
Las_traducciones_no_pudieron_ser_cargadas=As tradu\u00e7\u00f5es n\u00e3o poderam ser carregadas
5
No.hay.lista.de.idiomas.preferidos.quiza.olvido.inicializar.clase=N\u00e3o existe uma lista de idiomas preferidos. Talvez a classe n\u00e3o tenha sido iniciada.
6
No_hay_lista_de_idiomas_preferidos_quiza_olvido_inicializar_clase=N\u00e3o existe uma lista de idiomas preferidos. Talvez a classe n\u00e3o tenha sido iniciada.
7
No_se_encontro_la_traduccion_para=N\u00e3o se encontrou a tradu\u00e7\u00e3o de
0 8

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/src-utils/org/gvsig/i18n/utils/Keys.java
1
/**
2
 * 
3
 */
4
package org.gvsig.i18n.utils;
5

  
6
import java.io.BufferedReader;
7
import java.io.File;
8
import java.io.FileInputStream;
9
import java.io.FileNotFoundException;
10
import java.io.FileOutputStream;
11
import java.io.IOException;
12
import java.io.InputStreamReader;
13
import java.io.UnsupportedEncodingException;
14
import java.util.HashMap;
15
import java.util.HashSet;
16
import java.util.Iterator;
17
import java.util.regex.Matcher;
18
import java.util.regex.Pattern;
19

  
20
import org.kxml2.io.KXmlParser;
21
import org.xmlpull.v1.XmlPullParserException;
22

  
23
/**
24
 * @author cesar
25
 *
26
 */
27
public class Keys {
28
	private ConfigOptions config;
29
	
30
	public Keys(ConfigOptions config) {
31
		this.config = config;
32
	}
33
	
34
	public void load() {
35
		Project project;
36
		for (int currentProject=0; currentProject<config.projects.size(); currentProject++) {
37
			project = ((Project)config.projects.get(currentProject));
38
			/**
39
			 * There is two options, "properties" and "sources". "sources" is the default, so
40
			 * if there was something different to "properties", we assume "sources".
41
			 */
42
			if (!project.sourceKeys.equals("properties")) {
43
				project.dictionaries = loadProjectFromSources(project);
44
			}
45
			else {
46
				// load the keys for each language from the property file
47
			 	project.dictionaries = loadProjectFromProperties(project);
48
			 	// add missing keys to each language
49
			 	completeKeys(project);
50
			 }
51
		}
52
	}
53
	
54
	public void save() {
55
		Project project;
56
		OrderedProperties dict;
57
		FileOutputStream stream=null;
58
		String lang;
59
		
60
		for (int currentProject=0; currentProject<config.projects.size(); currentProject++) {
61
			project = ((Project)config.projects.get(currentProject));
62
			
63
			for (int currentLang=0; currentLang<config.languages.length; currentLang++) {
64
				lang = (String) config.languages[currentLang];
65
				dict = (OrderedProperties) project.dictionaries.get(lang);
66
				
67
				if (dict.size()>0) {
68
					// ensure the directory exists
69
					File propertyDir = new File(project.propertyDir);
70
					if (propertyDir.mkdirs())
71
						System.out.println("Aviso -- directorio creado: "+project.propertyDir);
72
					
73
					try {
74
						// different for spanish...
75
						if (lang.equals("es")) {
76
							stream = new FileOutputStream(project.propertyDir+File.separator+project.basename+".properties");
77
						}
78
						else {
79
							stream = new FileOutputStream(project.propertyDir+File.separator+project.basename+"_"+lang+".properties");
80
						}
81
					} catch (FileNotFoundException e) {
82
						// TODO Auto-generated catch block
83
						e.printStackTrace();
84
					}
85
	
86
					try {
87
						dict.store(stream, "Translations for language ["+lang+"]");
88
					} catch (IOException e) {
89
						// TODO Auto-generated catch block
90
						e.printStackTrace();
91
					}
92
				}
93
			}
94
		}	
95
	}
96
	
97
	private HashMap loadProjectFromSources(Project project) {
98
		// always start with an empty HashMap when loading
99
		HashMap dictionaries = new HashMap();		
100
		String lang;
101
		
102
		/**
103
		 * The keys obtained from the sources and the config.xml files of the
104
		 * plugins.
105
		 */
106
		HashSet keys = new HashSet();
107
		/**
108
		 * The translations loaded from the property files of the project.
109
		 */
110
		
111
		dictionaries =  loadProjectFromProperties(project);
112
		
113
		for (int i=0; i<project.srcDirs.length; i++) {
114
			try {
115
				keys = loadKeysFromSources(ConfigOptions.getAbsolutePath(File.separator, project.dir+File.separator+project.srcDirs[i]), keys);
116
			}
117
			catch (IOException ex) {
118
				// It there was an error reading the directory, just warn and skip the dir
119
				System.err.println(project.dir +" -- Aviso: no se pudo leer el directorio "+project.dir+File.separator+project.srcDirs[i]);
120
			}
121
		}
122
		
123
		for (int currentLang=0; currentLang<config.languages.length; currentLang++) {
124
			lang = config.languages[currentLang];
125

  
126
			OrderedProperties currentDict = (OrderedProperties) dictionaries.get(lang);
127
			Iterator keysIterator = keys.iterator();
128
			String key;
129
			// add missing keys
130
			while (keysIterator.hasNext()) {
131
				key = (String) keysIterator.next();
132
				if (!currentDict.containsKey(key)) {
133
					currentDict.put(key, "");
134
					System.out.println(project.dir+" -- Aviso -- clave a?adida: "+key);
135
				}
136
			}
137
			
138
			// remove extra keys
139
			// first make a list of keys to remove, because it's not possible to access the iterator and the TreeMap at the same time
140
		/*	HashSet removedKeys = new HashSet();
141
			Iterator dictKey = currentDict.keySet().iterator();
142
			while (dictKey.hasNext()) {
143
				key = (String) dictKey.next();
144
				if (!keys.contains(key)) {
145
					removedKeys.add(key);
146
					System.out.println(project.dir+" -- Aviso -- clave eliminada: "+key);
147
				}
148
			}
149
			// now we really remove the keys
150
			Iterator removedKeysIt = removedKeys.iterator();
151
			while (removedKeysIt.hasNext()) {
152
				key = (String) removedKeysIt.next();
153
				currentDict.remove(key);
154
			}*/	
155
		}
156

  
157
		return dictionaries;
158
	}
159
	
160
	/**
161
	 * Reads the keys from all the languages, to make a unique list containing
162
	 * all the keys. 
163
	 */
164
	public void completeKeys(Project project) {
165
		/* The list of all the keys */
166
		HashSet keys = new HashSet();
167
		// always start with an empty HashMap when loading
168
		//HashMap dictionaries = new HashMap();		
169
		String lang;
170
		
171
		// calculate all the keys
172
		for (int currentLang=0; currentLang<config.languages.length; currentLang++) {
173
			lang = config.languages[currentLang];
174
			
175
			OrderedProperties currentDict = (OrderedProperties) project.dictionaries.get(lang);
176
			if (currentDict==null) {
177
				currentDict = new OrderedProperties();
178
				project.dictionaries.put(lang, currentDict);
179
			}
180
			else {
181
				Iterator keysIterator = currentDict.keySet().iterator();
182
				String key;
183
				// add missing keys
184
				while (keysIterator.hasNext()) {
185
					key = (String) keysIterator.next();
186
					keys.add(key);
187
				}	
188
			}
189
		}
190
		
191
		// add missing keys to each language
192
		for (int currentLang=0; currentLang<config.languages.length; currentLang++) {
193
			lang = config.languages[currentLang];
194
			
195
			OrderedProperties currentDict = (OrderedProperties) project.dictionaries.get(lang);
196
			Iterator keysIterator = keys.iterator();
197
			String key;
198
			// add missing keys
199
			while (keysIterator.hasNext()) {
200
				key = (String) keysIterator.next();
201
				if (!currentDict.containsKey(key)) {
202
					currentDict.put(key, "");
203
					System.out.println(project.dir+" -- Aviso -- clave a?adida: "+key);
204
				}
205
			}			
206
		}
207
	}
208
	
209
	
210
	private HashSet loadKeysFromSources(String directory, HashSet keys) {
211
		String key;
212
		File dir = new File(directory);
213
		File files[] = dir.listFiles();
214
		final int BLOCKSIZE = 8192;
215
		char[] partialBuffer = new char[BLOCKSIZE+1];
216
		String text;
217
		StringBuffer buffer;
218
		
219
		// stores the position of the newlines
220
		//ArrayList newLines = new ArrayList();
221
		//	int lineNumber;
222
		
223
		if (files!=null) {
224
			//Pattern keyPattern = Pattern.compile("(PluginServices|Messages)\\.(getText|getString|get)\\([^\"\\)]*\"([^\"]*)\"[^\\)]*\\)");
225
			Pattern keyPattern = Pattern.compile(
226
					"(PluginServices|Messages|RasterToolsUtil)\\p{Space}*\\.\\p{Space}*(getText|getString|get)\\p{Space}*\\([^\"\\)]*\"([^\"]*)\"[^\\+\\)]*(\\+[^\\)]*)*\\)");
227
			Matcher keyMatcher = keyPattern.matcher("");
228
					//"(PluginServices|Messages)\\.(getText|getString|get)\\p{Space}*\\([^\"\\)]*\"([^\"]*)\"[^\\+\\)]*(\\+[^\"]*\"([^\"]*)\"[^\\+\\)]*)*\\)");
229
			//Pattern newLinePattern = Pattern.compile("\n");
230
			//Matcher newLineMatcher = newLinePattern.matcher("");
231
			
232
			for (int i=0; i<files.length; i++) {
233
				if (files[i].isDirectory()) {
234
					keys = loadKeysFromSources(files[i].toString(), keys);
235
					continue;
236
				}
237
				else if (files[i].getName().toLowerCase().equals("PluginServices.java")) {
238
					
239
					//[Messages.]getText(...)
240
					Pattern PsPattern = Pattern.compile("(Messages\\.)*getText\\([^\"\\)]*\"([^\"]*)\"[^\\)]*\\)");
241
					Matcher PsMatcher = PsPattern.matcher("");
242
					
243
					FileInputStream fis=null;
244
					try {
245
						fis = new FileInputStream(files[i]);
246
						
247
						buffer = new StringBuffer();
248
						BufferedReader currentFile=null;
249
						
250
						currentFile = new BufferedReader(new InputStreamReader(fis, config.sourcesEncoding));
251
						while (currentFile.read(partialBuffer, 0, BLOCKSIZE)!=-1) {
252
							buffer.append(partialBuffer);
253
						}
254
						text = buffer.toString();
255
						
256
						
257
						PsMatcher.reset(text);
258
						
259
						while (PsMatcher.find()) {
260
							key = PsMatcher.group(2);
261
							if (!key.trim().equals(""))
262
								keys.add(key);
263
						}
264
						currentFile.close();
265
					} catch (UnsupportedEncodingException e1) {
266
						System.err.println(e1.getLocalizedMessage());
267
						continue;
268
					}
269
					catch (IOException e1) {
270
						System.err.println(e1.getLocalizedMessage());
271
						continue;
272
					}
273
				}
274
				else if (files[i].getName().toLowerCase().endsWith(".java")) {
275
					FileInputStream fis=null;
276
					try {
277
						fis = new FileInputStream(files[i]);
278
						BufferedReader currentFile=null;
279
						
280
						currentFile = new BufferedReader(new InputStreamReader(fis, config.sourcesEncoding));
281
						buffer = new StringBuffer();
282
						
283
						int readChars; // number of characters which were read
284
						while ( (readChars = currentFile.read(partialBuffer, 0, BLOCKSIZE)) != -1) {
285
							buffer.append(partialBuffer, 0, readChars);
286
						}
287
						text = buffer.toString();
288
						
289
						/*newLineMatcher.reset(text);
290
						 while (newLineMatcher.find()) {
291
						 newLines.add(new Integer(newLineMatcher.end()-1));
292
						 }*/
293
						// lineNumber=1;
294
						
295
						keyMatcher.reset(text);
296
						
297
						while (keyMatcher.find()) {
298
							
299
							// find out in which line number we are
300
							/*while (keyMatcher.start() > ((Integer)newLines.get(lineNumber)).intValue() ) lineNumber++;
301
							 System.out.println("FileName: "+files[i].getCanonicalPath()+"; lineNumber: "+lineNumber);*/
302
							
303
//							StringBuffer keyBuffer = new StringBuffer();
304
							
305
//							for (int ii=0; ii<=keyMatcher.groupCount(); ii++) {
306
//							System.out.println("group: "+ ii+ "; " + keyMatcher.group(ii));
307
//							}
308
//							for (int groupNumb=3; groupNumb<=keyMatcher.groupCount(); groupNumb+=2) {
309
//							if (keyMatcher.group(groupNumb)!=null)
310
//							keyBuffer.append(keyMatcher.group(groupNumb));
311
//							}
312
							
313
							if (keyMatcher.group(4)!=null) {
314
								System.err.println("\nError: clave repartida en varias l?neas");
315
								System.err.println("Fichero: "+files[i].getCanonicalPath());
316
								System.err.println("C?digo: ");
317
								System.err.println(keyMatcher.group());
318
							}
319
							else {
320
								key = keyMatcher.group(3);
321
								if (!key.trim().equals(""))
322
									keys.add(key);
323
							}
324
						}
325
						currentFile.close();
326
					} catch (UnsupportedEncodingException e1) {
327
						System.err.println(e1.getLocalizedMessage());
328
						continue;
329
					}
330
					catch (IOException e1) {
331
						System.err.println(e1.getLocalizedMessage());
332
						continue;
333
					}
334
				}
335
				else if (files[i].getName().equalsIgnoreCase("config.xml")) {
336
					keys = loadKeysFromXml(files[i], keys);
337
				}
338
			}
339
		}
340
		
341
		return keys;
342
	}
343
	
344
	
345
	private HashSet loadKeysFromXml(File fileName, HashSet keys) {
346
		KXmlParser parser = new KXmlParser();
347
		String tagname, attribute;
348
		
349
		// we use null encoding, in this way kxml2 tries to detect the encoding
350
		try {
351
			parser.setInput(new FileInputStream(fileName), null);
352
		} catch (FileNotFoundException e1) {
353
			System.err.println(e1.getLocalizedMessage());
354
			return keys;
355
		} catch (XmlPullParserException e1) {
356
			// No podemos leer el fichero de configuraci?n. Usamos valores por defecto
357
			System.err.println("Aviso: error al cargar el fichero "+fileName);
358
			return keys;
359
		}
360
		
361
		try {
362
			for (parser.next(); parser.getEventType()!=KXmlParser.END_DOCUMENT; parser.next()) {
363
				// este bucle externo recorre las etiquetas de primer y segundo nivel
364
				if (parser.getEventType()==KXmlParser.START_TAG) {
365
					tagname = parser.getName();
366
					if (tagname.equals("menu") || tagname.equals("action-tool") || tagname.equals("selectable-tool") || tagname.equals("entry")) {
367
						attribute = parser.getAttributeValue(null, "text");
368
						if (attribute!=null) {
369
							String menuParts[] = attribute.split("/");
370
							for (int i=0; i<menuParts.length; i++) {
371
								if (!menuParts[i].trim().equals(""))
372
									keys.add(menuParts[i]);
373
							}
374
						}
375
						
376
						attribute = parser.getAttributeValue(null, "tooltip");
377
						if (attribute!=null && !attribute.trim().equals("")) {
378
							keys.add(attribute);
379
						}
380
						
381
						
382
					}
383
					else if (tagname.equals("combo-scale")) {
384
						attribute = parser.getAttributeValue(null, "label");
385
						if (attribute!=null && !attribute.trim().equals("")) {
386
							keys.add(attribute);
387
						}
388
					}
389
					else if (tagname.equals("tool-bar")) {
390
						attribute = parser.getAttributeValue(null, "name");
391
						if (attribute!=null && !attribute.trim().equals("")) {
392
							keys.add(attribute);
393
						}
394
					}
395

  
396
				}
397
			}	
398
		} catch (XmlPullParserException e1) {
399
			e1.getLocalizedMessage();
400
		} catch (IOException e1) {
401
			e1.getLocalizedMessage();
402
		}
403
		return keys;
404
	}
405
	
406
	private HashMap loadProjectFromProperties(Project project) {
407
		// always start with an empty HashMap when loading
408
		HashMap dictionaries = new HashMap();
409
		String lang;
410
		OrderedProperties dictionary;
411
		
412
		FileInputStream stream=null;
413
		
414
		for (int currentLang=0; currentLang<config.languages.length; currentLang++) {
415
			lang = config.languages[currentLang];
416
			dictionary = new OrderedProperties();
417
			try {
418
				// different for spanish...
419
				if (lang.equals("es")) {
420
					stream = new FileInputStream(project.propertyDir+File.separator+project.basename+".properties");
421
				}
422
				else {
423
					stream = new FileInputStream(project.propertyDir+File.separator+project.basename+"_"+lang+".properties");
424
				}
425
				try {
426
					dictionary.load(stream);
427
				} catch (IOException e) {
428
					System.err.println("Error cargando la base de datos para el idioma: ["+lang+"]. "+e.getLocalizedMessage());
429
				}
430
			} catch (FileNotFoundException e) {
431
				System.err.println(project.dir + " -- Error cargando la base de datos para el idioma: ["+lang+"]. "+e.getLocalizedMessage());
432
			}
433
			dictionaries.put(lang, dictionary);
434
		}
435
		return dictionaries;
436
	}
437
}
0 438

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/src-utils/org/gvsig/i18n/utils/ConfigOptions.java
1
package org.gvsig.i18n.utils;
2

  
3
import java.io.File;
4
import java.io.FileInputStream;
5
import java.io.FileNotFoundException;
6
import java.io.IOException;
7
import java.util.ArrayList;
8

  
9
import org.kxml2.io.KXmlParser;
10
import org.xmlpull.v1.XmlPullParserException;
11

  
12
public class ConfigOptions {
13
	// Default values
14
	public String defaultBaseName = "text";
15
	public String defaultBaseDir = ".";
16
	public String databaseDir = "database";
17
	private String configFileName = "config.xml";
18
	public String[] languages;
19
	public ArrayList projects = new ArrayList();
20
	private String defaultLangList="ca;cs;de;en;es;eu;fr;gl;it;pt";
21
	public String sourceKeys = "sources";
22
	private String defaultPropertyDir = "config";
23
	public String[] outputLanguages={"en", "es"};
24
	public String outputDir="output";
25
	public String inputDir="input";
26
	public String[] defaultSrcDirs={"src"};
27
	
28
	
29
	/**
30
	 * The character encoding of the Java source files, used to search keys in the sources.
31
	 */
32
	public String sourcesEncoding = "ISO8859_1";
33
	/**
34
	 * The character encoding of the generated output files for missing keys.
35
	 */
36
	public String outputEncoding = "UTF8";
37
	
38
	/**
39
	 * Creates a new ConfigOptions object.
40
	 */
41
	public ConfigOptions() {
42
		// Now we transform all directories to absolute canonical paths, so
43
		// that the are easier to manage afterwards.
44
		// It's also done at the end of parseVars method, but we must also do
45
		// it here, because parseVars() might not get executed.
46
		try {
47
			this.defaultBaseDir = getAbsolutePath(".", this.defaultBaseDir);
48
			this.databaseDir = getAbsolutePath(this.defaultBaseDir, this.databaseDir);
49
			this.outputDir = getAbsolutePath(this.defaultBaseDir, this.outputDir);
50
			this.inputDir = getAbsolutePath(this.defaultBaseDir, this.inputDir);
51
			
52
			/*
53
			 * 
54
			 File baseDirFile = new File(this.defaultBaseDir);
55
			this.defaultBaseDir = baseDirFile.getCanonicalPath();
56
			File databaseDirFile = new File(this.databaseDir);
57
			if (databaseDirFile.isAbsolute()) {
58
				this.databaseDir = databaseDirFile.getCanonicalPath();
59
			}
60
			else {
61
				this.databaseDir = (new File(this.defaultBaseDir+File.separator+this.databaseDir)).getCanonicalPath();
62
			}
63
			File outputDirFile = new File(this.outputDir);
64
			if (outputDirFile.isAbsolute()) {
65
				this.outputDir = outputDirFile.getCanonicalPath();
66
			}
67
			else {
68
				this.outputDir = (new File(this.defaultBaseDir+File.separator+this.outputDir)).getCanonicalPath();
69
			}
70
			File inputDirFile = new File(this.inputDir);
71
			if (inputDirFile.isAbsolute()) {
72
				this.inputDir = inputDirFile.getCanonicalPath();
73
			}
74
			else {
75
				this.inputDir = (new File(this.defaultBaseDir+File.separator+this.inputDir)).getCanonicalPath();
76
			}
77
			*/
78
		} catch (IOException e) {
79
			System.err.println("Error accediendo a los directorios de las traducciones: "+e.getLocalizedMessage());
80
		}
81
	}
82
	
83
	/**
84
	 *  Creates a new ConfigOptions object, defining the config file to use.
85
	 *  
86
	 * @param configFileName The file name of the config file to use.
87
	 */
88
	public ConfigOptions(String configFileName) {
89
		this.configFileName = configFileName;
90
		
91
		// Now we transform all directories to absolute canonical paths, so
92
		// that the are easier to manage afterwards.
93
		// It's also done at the end of parseVars method, but we must also do
94
		// it here, because parseVars() might not get executed.
95
		try {
96
			this.defaultBaseDir = getAbsolutePath(".", this.defaultBaseDir);
97
			this.databaseDir = getAbsolutePath(this.defaultBaseDir, this.databaseDir);
98
			this.outputDir = getAbsolutePath(this.defaultBaseDir, this.outputDir);
99
			this.inputDir = getAbsolutePath(this.defaultBaseDir, this.inputDir);
100
			
101
			/*File baseDirFile = new File(this.defaultBaseDir);
102
			this.defaultBaseDir = baseDirFile.getCanonicalPath();
103
			File databaseDirFile = new File(this.databaseDir);
104
			if (databaseDirFile.isAbsolute()) {
105
				this.databaseDir = databaseDirFile.getCanonicalPath();
106
			}
107
			else {
108
				this.databaseDir = (new File(this.defaultBaseDir+File.separator+this.databaseDir)).getCanonicalPath();
109
			}
110
			File outputDirFile = new File(this.outputDir);
111
			if (outputDirFile.isAbsolute()) {
112
				this.outputDir = outputDirFile.getCanonicalPath();
113
			}
114
			else {
115
				this.outputDir = (new File(this.defaultBaseDir+File.separator+this.outputDir)).getCanonicalPath();
116
			}
117
			File inputDirFile = new File(this.inputDir);
118
			if (inputDirFile.isAbsolute()) {
119
				this.inputDir = inputDirFile.getCanonicalPath();
120
			}
121
			else {
122
				this.inputDir = (new File(this.defaultBaseDir+File.separator+this.inputDir)).getCanonicalPath();
123
			}*/
124
		} catch (IOException e) {
125
			System.err.println("Error accediendo a los directorios de las traducciones: "+e.getLocalizedMessage());
126
		}
127
	}
128
	
129
	/**
130
	 * Sets the name of the config file to use.
131
	 * 
132
	 * @param configFileName
133
	 */
134
	public void setConfigFile(String configFileName) {
135
		this.configFileName = configFileName;
136
	}
137
	
138
	/**
139
	 * Gets the name of the config file in use.
140
	 * 
141
	 * @return The name of the config file in use.
142
	 */
143
	public String getConfigFile() {
144
		return configFileName;
145
	}
146
	
147
	/**
148
	 *  Loads the config parameters and the projects to consider from the XML
149
	 * config file */
150
	public boolean load() {
151
		KXmlParser parser = new KXmlParser();
152
		
153
		// we use null encoding, in this way kxml2 tries to detect the encoding
154
		try {
155
			parser.setInput(new FileInputStream(configFileName), null);
156
		} catch (FileNotFoundException e1) {
157
			System.err.println(e1.getLocalizedMessage());
158
			return false;
159
		} catch (XmlPullParserException e1) {
160
			// No podemos leer el fichero de configuraci?n. Usamos valores por defecto
161
			System.err.println("Aviso: no se pudo leer correctamente el fichero de configuraci?n. Se usar?n los valores por defecto.");
162
			return false;
163
		}
164
		
165
		try {
166
			for (parser.next(); parser.getEventType()!=KXmlParser.END_DOCUMENT; parser.next()) {
167
				// este bucle externo recorre las etiquetas de primer y segundo nivel
168
				if (parser.getEventType()==KXmlParser.START_TAG) {
169
					if (parser.getName().equals("config")) {
170
						parseVars(parser);
171
					}
172
					else if (parser.getName().equals("projects")) {
173
						parseProjects(parser);
174
					}
175
				}
176
			}	
177
		} catch (XmlPullParserException e1) {
178
			e1.getLocalizedMessage();
179
		} catch (IOException e1) {
180
			e1.getLocalizedMessage();
181
		}
182
		
183
		File outputDirFile = new File(outputDir);
184
		outputDirFile.mkdirs();
185
		File databaseDirFile = new File(databaseDir);
186
		databaseDirFile.mkdirs();
187
		return true;
188
	}
189

  
190
	private void parseVars(KXmlParser parser) throws XmlPullParserException, IOException {
191
		// recorremos todas las etiquetas 'variable' dentro de config
192
		int state;
193
		String name, value;
194
		
195
		for (state = parser.next(); state!=KXmlParser.END_TAG || !parser.getName().equals("config") ; state=parser.next()) {
196
			if (state==KXmlParser.START_TAG) {
197
				if (parser.getName().equals("variable")) {
198
					name = parser.getAttributeValue(null, "name");
199
					value = parser.getAttributeValue(null, "value");
200
					if (name!=null && value!=null) {
201
						value = parser.getAttributeValue(null, "value");
202
						if (parser.getAttributeValue(null, "name").equals("basename")) {
203
							defaultBaseName = parser.getAttributeValue(null, "value");
204
						}
205
						else if (parser.getAttributeValue(null, "name").equals("basedir")) {
206
							defaultBaseDir = parser.getAttributeValue(null, "value");
207
						}
208
						else if (parser.getAttributeValue(null, "name").equals("databaseDir")) {
209
							databaseDir = parser.getAttributeValue(null, "value");
210
						}
211
						else if (parser.getAttributeValue(null, "name").equals("defaultPropertyDir")) {
212
							defaultPropertyDir = parser.getAttributeValue(null, "value");
213
						}
214
						else if (parser.getAttributeValue(null, "name").equals("outputDir")) {
215
							outputDir = parser.getAttributeValue(null, "value");
216
						}
217
						else if (parser.getAttributeValue(null, "name").equals("inputDir")) {
218
							inputDir = parser.getAttributeValue(null, "value");
219
						}
220
						else if (parser.getAttributeValue(null, "name").equals("sourceKeys")) {
221
							sourceKeys = parser.getAttributeValue(null, "value");
222
						}
223
						else if (parser.getAttributeValue(null, "name").equals("srcDirs")) {
224
							String srcDirs = parser.getAttributeValue(null, "value");
225
							this.defaultSrcDirs = srcDirs.split(";");
226
						}
227
						else if (parser.getAttributeValue(null, "name").equals("languages")) {
228
							languages = parser.getAttributeValue(null, "value").split(";");
229
							if (languages.length==0) {
230
								System.err.println("Aviso: No se definieron idiomas a considerar. Se usar? la lista de idiomas\n por defecto: "+defaultLangList);
231
								languages = defaultLangList.split(";");
232
							}
233
						}
234
					}
235
					else {
236
						if (name==null)
237
							System.err.println("Error leyendo el fichero de configuraci?n. No se encontr? el atributo 'name'\nrequerido en la etiqueta <variable>. La etiqueta ser? ignorada.");
238
						if (value==null)
239
							System.err.println("Error leyendo el fichero de configuraci?n. No se encontr? el atributo 'value'\nrequerido en la etiqueta <variable>. La etiqueta ser? ignorada.");
240
					}
241
				}
242
				else {
243
					System.err.println("Aviso: se ignor? una etiqueta desconocida o inesperada: " + parser.getName());
244
				}
245
			}
246
		}
247
		
248
		// Now we transform all directories to absolute canonical paths, so
249
		// that they are easier to manage afterwards.
250
		try {
251
			this.defaultBaseDir = getAbsolutePath(".", this.defaultBaseDir);
252
			this.databaseDir = getAbsolutePath(this.defaultBaseDir, this.databaseDir);
253
			this.outputDir = getAbsolutePath(this.defaultBaseDir, this.outputDir);
254
			this.inputDir = getAbsolutePath(this.defaultBaseDir, this.inputDir);
255
			/**
256
			File baseDirFile = new File(this.defaultBaseDir);
257
			this.defaultBaseDir = baseDirFile.getCanonicalPath();
258
			System.out.println(this.defaultBaseDir);
259
			File databaseDirFile = new File(this.databaseDir);
260
			if (databaseDirFile.isAbsolute()) {
261
				this.databaseDir = databaseDirFile.getCanonicalPath();
262
			}
263
			else {
264
				this.databaseDir = (new File(this.defaultBaseDir+File.separator+this.databaseDir)).getCanonicalPath();
265
			}
266
			File outputDirFile = new File(this.outputDir);
267
			if (outputDirFile.isAbsolute()) {
268
				this.outputDir = outputDirFile.getCanonicalPath();
269
			}
270
			else {
271
				this.outputDir = (new File(this.defaultBaseDir+File.separator+this.outputDir)).getCanonicalPath();
272
			}
273
			File inputDirFile = new File(this.inputDir);
274
			if (inputDirFile.isAbsolute()) {
275
				this.inputDir = inputDirFile.getCanonicalPath();
276
			}
277
			else {
278
				this.inputDir = (new File(this.defaultBaseDir+File.separator+this.inputDir)).getCanonicalPath();
279
			}
280
			*/
281
		} catch (IOException e) {
282
			System.err.println("Error accediendo a los directorios de las traducciones: "+e.getLocalizedMessage());
283
		}
284
	}
285
	
286
	/**
287
	 * Parse the lines containing <project /> tags (between <projects> and </projects>).
288
	 * 
289
	 * @param parser The KXmlParser, pointing to the next <project /> tag (if any)
290
	 * @throws XmlPullParserException
291
	 * @throws IOException
292
	 */
293
	private void parseProjects(KXmlParser parser) throws XmlPullParserException, IOException {
294
		// recorremos todos los proyectos dentro de 'projects'
295
		int state;
296
		String dir;
297
		File dirFile;
298
		Project project;
299
		
300
		for (state = parser.next(); state!=KXmlParser.END_TAG || !parser.getName().equals("projects") ; state=parser.next()) {
301
			if (state==KXmlParser.START_TAG) {
302
				if (parser.getName().equals("project")) {
303
					if (parser.getAttributeValue(null, "dir")!=null) {
304
						dir = parser.getAttributeValue(null,  "dir");
305
						if (dir!=null) {
306
							// we transform it to absolute canonical paths, so
307
							// that it is easier to manage afterwards.
308
							dirFile = new File(dir);
309
							try {
310
								if (dirFile.isAbsolute()) {
311
									dir = dirFile.getCanonicalPath();
312
								}
313
								else {
314
									dir = new File(this.defaultBaseDir+File.separator+dir).getCanonicalPath();
315
								}
316
							} catch (IOException e) {
317
								System.err.println("Error accediendo a los directorios de las traducciones: "+e.getLocalizedMessage());
318
							}
319
							project = new Project();
320
							project.dir = dir;
321
							project.basename = parser.getAttributeValue(null, "basename");
322
							if (project.basename==null)
323
								project.basename = this.defaultBaseName;
324
							
325
							project.propertyDir = parser.getAttributeValue(null, "propertyDir");
326
							if (project.propertyDir==null) {
327
								project.propertyDir = this.defaultPropertyDir;
328
							}
329
							// we transform it to absolute canonical paths, so
330
							// that it is easier to manage afterwards.
331
							File propDirFile = new File(project.propertyDir);
332
							try {
333
								if (propDirFile.isAbsolute()) {
334
									project.propertyDir = propDirFile.getCanonicalPath();
335
								}
336
								else {
337
									project.propertyDir = new File(dir+File.separator+project.propertyDir).getCanonicalPath();
338
								}
339
							} catch (IOException e) {
340
								System.err.println("Error accediendo a los directorios de las traducciones: "+e.getLocalizedMessage());
341
							}
342

  
343
							String srcDirs = parser.getAttributeValue(null, "srcDirs");
344
							if (srcDirs!=null) {
345
								project.srcDirs = srcDirs.split(";");
346
							}
347
							else {
348
								project.srcDirs = this.defaultSrcDirs;
349
							}
350

  
351
							project.sourceKeys = parser.getAttributeValue(null, "sourceKeys");
352
							if (project.sourceKeys==null)
353
								project.sourceKeys = this.sourceKeys;
354
							projects.add(project);
355
						}
356
						else
357
							System.err.println("Error leyendo el fichero de configuraci?n. No se encontr? el atributo 'dir'\nrequerido en la etiqueta <project>. La etiqueta ser? ignorada.");
358
					}
359
				}
360
				else {
361
					System.err.println("Aviso: se ignorar? una etiqueta desconocida o inesperada: " + parser.getName());
362
				}
363
			}
364
		}
365

  
366
	}
367
	
368
	public void setLanguages(String[] languages) {
369
		this.languages = languages; 
370
	}
371
	
372
	public void setProjects(ArrayList projectList) {
373
		this.projects = projectList;
374
	}
375
	
376
	/**
377
	 * Calculates the canonical path for the given path.
378
	 * If the given path is relative, it is calculated from
379
	 * the given baseDir.
380
	 * The 'path' parameter uses the '/' character to as path
381
	 * separator. The returned value uses the default system
382
	 * separator as path separator.  
383
	 * 
384
	 * @param baseDir
385
	 * @param path
386
	 * @return
387
	 * @throws IOException 
388
	 */
389
	public static String getAbsolutePath(String baseDir, String path) throws IOException {
390
		if ('/'!=File.separatorChar)
391
			path = path.replace('/', File.separatorChar);
392
		File pathFile = new File(path);
393
		if (pathFile.isAbsolute())
394
			path = pathFile.getCanonicalPath();
395
		else {
396
			File newFile = new File(baseDir+File.separator+path);
397
			path = newFile.getAbsolutePath();
398
		}
399
		return path;
400
	}
401
}
0 402

  
tags/gvsig_redes-1_0_0-1234/libraries/libInternationalization/src-utils/org/gvsig/i18n/utils/OrderedProperties.java
1
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 * 
3
 * This class is based on GNU Classpath's Properties.java
4
 * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005  Free Software Foundation, Inc.
5
 * Copyright (C) 2006 IVER T.I. and Generalitat Valenciana.
6
 *
7
 * This program is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU General Public License
9
 * as published by the Free Software Foundation; either version 2
10
 * of the License, or (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
20
 *
21
 * For more information, contact:
22
 *
23
 *  Generalitat Valenciana
24
 *   Conselleria d'Infraestructures i Transport
25
 *   Av. Blasco Ib??ez, 50
26
 *   46010 VALENCIA
27
 *   SPAIN
28
 *
29
 *      +34 963862235
30
 *   gvsig@gva.es
31
 *      www.gvsig.gva.es
32
 *
33
 *    or
34
 *
35
 *   IVER T.I. S.A
36
 *   Salamanca 50
37
 *   46005 Valencia
38
 *   Spain
39
 *
40
 *   +34 963163400
41
 *   dac@iver.es
42
 */
43

  
44

  
45
package org.gvsig.i18n.utils;
46

  
47
import java.io.BufferedReader;
48
import java.io.IOException;
49
import java.io.InputStream;
50
import java.io.InputStreamReader;
51
import java.io.OutputStream;
52
import java.io.OutputStreamWriter;
53
import java.io.PrintStream;
54
import java.io.PrintWriter;
55
import java.util.Calendar;
56
import java.util.Collections;
57
import java.util.Comparator;
58
import java.util.Enumeration;
59
import java.util.HashSet;
60
import java.util.Iterator;
61
import java.util.PropertyResourceBundle;
62
import java.util.Set;
63
import java.util.TreeMap;
64
import java.util.Map.Entry;
65

  
66
/**
67
* A set of persistent properties, which can be saved or loaded from a stream.
68
* A property list may also contain defaults, searched if the main list
69
* does not contain a property for a given key.
70
*
71
* An example of a properties file for the german language is given
72
* here.  This extends the example given in ListResourceBundle.
73
* Create a file MyResource_de.properties with the following contents
74
* and put it in the CLASSPATH.  (The character
75
* <code>\</code><code>u00e4</code> is the german umlaut)
76
*
77
* 
78
<pre>s1=3
79
s2=MeineDisk
80
s3=3. M\<code></code>u00e4rz 96
81
s4=Die Diskette ''{1}'' enth\<code></code>u00e4lt {0} in {2}.
82
s5=0
83
s6=keine Dateien
84
s7=1
85
s8=eine Datei
86
s9=2
87
s10={0,number} Dateien
88
s11=Das Formatieren schlug fehl mit folgender Exception: {0}
89
s12=FEHLER
90
s13=Ergebnis
91
s14=Dialog
92
s15=Auswahlkriterium
93
s16=1,3</pre>
94
*
95
* <p>Although this is a sub class of a hash table, you should never
96
* insert anything other than strings to this property, or several
97
* methods, that need string keys and values, will fail.  To ensure
98
* this, you should use the <code>get/setProperty</code> method instead
99
* of <code>get/put</code>.
100
*
101
* Properties are saved in the specified encoding. If no encoding is
102
* specified, then the ISO 8859-1 encoding is used, with Unicode escapes with
103
* a single <code>u</code> for any character which cannot be represented.
104
*
105
* @author Jochen Hoenicke
106
* @author Eric Blake (ebb9@email.byu.edu)
107
* @author Cesar Martinez Izquierdo (cesar.martinez@iver.es)
108
* @see PropertyResourceBundle
109
* @status updated to 1.4
110
*/
111
public class OrderedProperties extends TreeMap
112
{
113
	
114
/**
115
* The property list that contains default values for any keys not
116
* in this property list.
117
*
118
* @serial the default properties
119
*/
120
protected OrderedProperties defaults;
121

  
122
/**
123
* Compatible with JDK 1.0+.
124
*/
125
private static final long serialVersionUID = -5087876565919950510L;
126

  
127
/**
128
* Creates a new empty property list with no default values.
129
*/
130
public OrderedProperties()
131
{
132
	super(new StringComparator());
133
}
134

  
135
/**
136
* Create a new empty property list with the specified default values.
137
*
138
* @param defaults a Properties object containing the default values
139
*/
140
public OrderedProperties(OrderedProperties defaults)
141
{
142
	super(new StringComparator());
143
	this.defaults = defaults;
144
}
145

  
146
/**
147
* Adds the given key/value pair to this properties.  This calls
148
* the hashtable method put.
149
*
150
* @param key the key for this property
151
* @param value the value for this property
152
* @return The old value for the given key
153
* @see #getProperty(String)
154
* @since 1.2
155
*/
156
public Object setProperty(String key, String value)
157
{
158
 return put(key, value);
159
}
160

  
161
/**
162
* Reads a property list from an input stream.  The stream should
163
* have the following format: <br>
164
*
165
* An empty line or a line starting with <code>#</code> or
166
* <code>!</code> is ignored.  An backslash (<code>\</code>) at the
167
* end of the line makes the line continueing on the next line
168
* (but make sure there is no whitespace after the backslash).
169
* Otherwise, each line describes a key/value pair. <br>
170
*
171
* The chars up to the first whitespace, = or : are the key.  You
172
* can include these caracters in the key, if you precede them with
173
* a backslash (<code>\</code>). The key is followed by optional
174
* whitespaces, optionally one <code>=</code> or <code>:</code>,
175
* and optionally some more whitespaces.  The rest of the line is
176
* the resource belonging to the key. <br>
177
*
178
* Escape sequences <code>\t, \n, \r, \\, \", \', \!, \#, \ </code>(a
179
* space), and unicode characters with the
180
* <code>\\u</code><em>xxxx</em> notation are detected, and
181
* converted to the corresponding single character. <br>
182
*
183
* 
184
<pre># This is a comment
185
key     = value
186
k\:5      \ a string starting with space and ending with newline\n
187
# This is a multiline specification; note that the value contains
188
# no white space.
189
weekdays: Sunday,Monday,Tuesday,Wednesday,\\
190
       Thursday,Friday,Saturday
191
# The safest way to include a space at the end of a value:
192
label   = Name:\\u0020</pre>
193
*
194
* @param inStream the input stream
195
* @throws IOException if an error occurred when reading the input
196
* @throws NullPointerException if in is null
197
*/
198
public void load(InputStream inStream) throws IOException
199
{
200
 // The spec says that the file must be encoded using ISO-8859-1.
201
 BufferedReader reader =
202
   new BufferedReader(new InputStreamReader(inStream, "ISO-8859-1"));
203
 String line;
204

  
205
 while ((line = reader.readLine()) != null)
206
   {
207
     char c = 0;
208
     int pos = 0;
209
	// Leading whitespaces must be deleted first.
210
     while (pos < line.length()
211
            && Character.isWhitespace(c = line.charAt(pos)))
212
       pos++;
213

  
214
     // If empty line or begins with a comment character, skip this line.
215
     if ((line.length() - pos) == 0
216
	    || line.charAt(pos) == '#' || line.charAt(pos) == '!')
217
       continue;
218

  
219
     // The characters up to the next Whitespace, ':', or '='
220
     // describe the key.  But look for escape sequences.
221
	// Try to short-circuit when there is no escape char.
222
	int start = pos;
223
	boolean needsEscape = line.indexOf('\\', pos) != -1;
224
     StringBuffer key = needsEscape ? new StringBuffer() : null;
225
     while (pos < line.length()
226
            && ! Character.isWhitespace(c = line.charAt(pos++))
227
            && c != '=' && c != ':')
228
       {
229
         if (needsEscape && c == '\\')
230
           {
231
             if (pos == line.length())
232
               {
233
                 // The line continues on the next line.  If there
234
                 // is no next line, just treat it as a key with an
235
                 // empty value.
236
                 line = reader.readLine();
237
		    if (line == null)
238
		      line = "";
239
                 pos = 0;
240
                 while (pos < line.length()
241
                        && Character.isWhitespace(c = line.charAt(pos)))
242
                   pos++;
243
               }
244
             else
245
               {
246
                 c = line.charAt(pos++);
247
                 switch (c)
248
                   {
249
                   case 'n':
250
                     key.append('\n');
251
                     break;
252
                   case 't':
253
                     key.append('\t');
254
                     break;
255
                   case 'r':
256
                     key.append('\r');
257
                     break;
258
                   case 'u':
259
                     if (pos + 4 <= line.length())
260
                       {
261
                         char uni = (char) Integer.parseInt
262
                           (line.substring(pos, pos + 4), 16);
263
                         key.append(uni);
264
                         pos += 4;
265
                       }        // else throw exception?
266
                     break;
267
                   default:
268
                     key.append(c);
269
                     break;
270
                   }
271
               }
272
           }
273
         else if (needsEscape)
274
           key.append(c);
275
       }
276

  
277
     boolean isDelim = (c == ':' || c == '=');
278

  
279
	String keyString;
280
	if (needsEscape)
281
	  keyString = key.toString();
282
	else if (isDelim || Character.isWhitespace(c))
283
	  keyString = line.substring(start, pos - 1);
284
	else
285
	  keyString = line.substring(start, pos);
286

  
287
     while (pos < line.length()
288
            && Character.isWhitespace(c = line.charAt(pos)))
289
       pos++;
290

  
291
     if (! isDelim && (c == ':' || c == '='))
292
       {
293
         pos++;
294
         while (pos < line.length()
295
                && Character.isWhitespace(c = line.charAt(pos)))
296
           pos++;
297
       }
298

  
299
	// Short-circuit if no escape chars found.
300
	if (!needsEscape)
301
	  {
302
	    put(keyString, line.substring(pos));
303
	    continue;
304
	  }
305

  
306
	// Escape char found so iterate through the rest of the line.
307
     StringBuffer element = new StringBuffer(line.length() - pos);
308
     while (pos < line.length())
309
       {
310
         c = line.charAt(pos++);
311
         if (c == '\\')
312
           {
313
             if (pos == line.length())
314
               {
315
                 // The line continues on the next line.
316
                 line = reader.readLine();
317

  
318
		    // We might have seen a backslash at the end of
319
		    // the file.  The JDK ignores the backslash in
320
		    // this case, so we follow for compatibility.
321
		    if (line == null)
322
		      break;
323

  
324
                 pos = 0;
325
                 while (pos < line.length()
326
                        && Character.isWhitespace(c = line.charAt(pos)))
327
                   pos++;
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff