1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  package com.mindtree.techworks.insight.preferences.xmlpersistence;
26  
27  import java.io.File;
28  import java.io.FileOutputStream;
29  import java.io.IOException;
30  import java.util.Iterator;
31  import java.util.List;
32  
33  import javax.xml.parsers.DocumentBuilder;
34  import javax.xml.parsers.DocumentBuilderFactory;
35  import javax.xml.parsers.ParserConfigurationException;
36  
37  import org.apache.xml.serialize.OutputFormat;
38  import org.apache.xml.serialize.XMLSerializer;
39  import org.w3c.dom.Document;
40  import org.w3c.dom.Element;
41  import org.w3c.dom.NodeList;
42  import org.xml.sax.SAXException;
43  
44  import com.mindtree.techworks.insight.preferences.PreferenceHandlerStoreException;
45  import com.mindtree.techworks.insight.preferences.model.ListPreferenceAttribute;
46  import com.mindtree.techworks.insight.preferences.model.Preference;
47  import com.mindtree.techworks.insight.preferences.model.PreferenceAttribute;
48  import com.mindtree.techworks.insight.preferences.model.PreferenceAttributeType;
49  import com.mindtree.techworks.insight.preferences.util.Crypt;
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  public class XMLDOMPreferenceDataWriter implements PreferenceXMLNameConstants {
63  
64  	
65  
66  
67  	private String preferenceFile;
68  
69  	
70  
71  
72  
73  
74  
75  	public XMLDOMPreferenceDataWriter (String preferenceFile) {
76  
77  		this.preferenceFile = preferenceFile;
78  	}
79  
80  	
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  	public void writePreferences (List preferences, String outputFile)
91  			throws PreferenceHandlerStoreException {
92  
93  		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
94  				.newInstance ();
95  		documentBuilderFactory.setNamespaceAware (true);
96  		try {
97  			DocumentBuilder documentBuilder = documentBuilderFactory
98  					.newDocumentBuilder ();
99  			Document document = documentBuilder
100 					.parse (new File (preferenceFile));
101 			processPreferenceList (preferences, document);
102 
103 			
104 			OutputFormat format = new OutputFormat ();
105 			format.setMethod ("xml");
106 			format.setIndenting (true);
107 			FileOutputStream fos = new FileOutputStream (outputFile);
108 			XMLSerializer serializer = new XMLSerializer (format
109 					.getEncodingInfo ().getWriter (fos), format);
110 			serializer.asDOMSerializer ();
111 			serializer.serialize (document);
112 			try {
113 				fos.close ();
114 			} catch (IOException e) {
115 				
116 			}
117 			serializer = null;
118 
119 		} catch (ParserConfigurationException e) {
120 			throw new PreferenceHandlerStoreException (
121 					"Parser Configuration Exception in DocumentBuilder", e);
122 		} catch (SAXException e) {
123 			throw new PreferenceHandlerStoreException (
124 					"SAX Exception in reading document", e);
125 		} catch (IOException e) {
126 			throw new PreferenceHandlerStoreException (
127 					"IO Exception in reading document", e);
128 		}
129 
130 	}
131 
132 	
133 
134 
135 
136 
137 
138 
139 
140 	private void processPreferenceList (List preferences, Document document) {
141 
142 		Element rootElement = document.getDocumentElement ();
143 
144 		NodeList nodeList = rootElement
145 				.getElementsByTagNameNS (DEFAULT_NAMESPACE, XMLNAME_PREFERENCE);
146 		int nodeCount = nodeList.getLength ();
147 
148 		Iterator preferencesIterator = preferences.iterator ();
149 		while (preferencesIterator.hasNext ()) {
150 			Preference preference = (Preference) preferencesIterator.next ();
151 			String id = preference.getId ();
152 
153 			
154 			Element oldElement = null;
155 			for (int i = 0; i < nodeCount; i++ ) {
156 				Element currentElement = (Element) nodeList.item (i);
157 				if (id.equals (currentElement
158 						.getAttribute (XMLNAME_PREFERENCE_ID))) {
159 					oldElement = currentElement;
160 					break;
161 				}
162 			}
163 
164 			
165 			if (null != oldElement) {
166 				Element newElement = createPreferenceElement (preference,
167 																document);
168 				rootElement.replaceChild (newElement, oldElement);
169 				if (preferencesIterator.hasNext ()) {
170 					nodeList = rootElement
171 							.getElementsByTagNameNS (DEFAULT_NAMESPACE,
172 														XMLNAME_PREFERENCE);
173 					nodeCount = nodeList.getLength ();
174 				}
175 			}
176 		}
177 
178 	}
179 
180 	
181 
182 
183 
184 
185 
186 
187 
188 
189 	private Element createPreferenceElement (Preference preference,
190 			Document document) {
191 
192 		
193 		Element preferenceElement = document
194 				.createElementNS (DEFAULT_NAMESPACE, XMLNAME_PREFERENCE);
195 
196 		
197 		preferenceElement.setAttribute (XMLNAME_PREFERENCE_ID, preference
198 				.getId ());
199 		preferenceElement.setAttribute (XMLNAME_PREFERENCE_NAME, preference
200 				.getName ());
201 		preferenceElement.setAttribute (XMLNAME_PREFERENCE_ISUSERMOD, String
202 				.valueOf (preference.isUserModifiable ()));
203 		preferenceElement.setAttribute (XMLNAME_PREFERENCE_ISAGGREGATED, String
204 				.valueOf (preference.isAggregated ()));
205 
206 		
207 		String displayClass = preference.getDisplayClass ();
208 		if (null != displayClass && displayClass.length () > 0) {
209 			preferenceElement.setAttribute (XMLNAME_PREFERENCE_DISPLAY_CLASS,
210 											displayClass);
211 		}
212 
213 		
214 		Iterator preferenceAttrItr = preference.iteratePreferenceAttributes ();
215 		while (preferenceAttrItr.hasNext ()) {
216 			preferenceElement.appendChild (createPreferenceAttributeElement (
217 								(PreferenceAttribute) preferenceAttrItr.next (),
218 								document));
219 		}
220 
221 		
222 		Iterator childPreferenceItr = preference.iterateChildPreferences ();
223 		while (null != childPreferenceItr && childPreferenceItr.hasNext ()) {
224 			preferenceElement
225 					.appendChild (createPreferenceElement (
226 								(Preference) childPreferenceItr.next (),
227 								document));
228 		}
229 
230 		return preferenceElement;
231 	}
232 
233 	
234 
235 
236 
237 
238 
239 
240 
241 
242 	private Element createPreferenceAttributeElement (
243 			PreferenceAttribute attribute, Document document) {
244 
245 		
246 		Element preferenceAttributeElement = document
247 				.createElementNS (DEFAULT_NAMESPACE,
248 									XMLNAME_PREFERENCE_ATTRIBUTE);
249 
250 		
251 		preferenceAttributeElement.setAttribute (XMLNAME_PREFERENCE_ATT_ID,
252 													attribute.getId ());
253 		preferenceAttributeElement.setAttribute (XMLNAME_PREFERENCE_ATT_NAME,
254 													attribute.getName ());
255 
256 		
257 		String defaultValue = attribute.getDefaultValue ();
258 		if (null != defaultValue && defaultValue.length () > 0) {
259 			int indexOfLT = defaultValue.indexOf ("<");
260 			if (indexOfLT > -1 && defaultValue.indexOf (">", indexOfLT) > -1) {
261 				preferenceAttributeElement.appendChild (createCDATAElement (
262 										DEFAULT_NAMESPACE,
263 										XMLNAME_PREF_ATT_DEFAULT_VALUE,
264 										defaultValue,
265 										document));
266 			} else {
267 				preferenceAttributeElement
268 						.appendChild (createTextElement (
269 										DEFAULT_NAMESPACE,
270 										XMLNAME_PREF_ATT_DEFAULT_VALUE,
271 										defaultValue,
272 										document));
273 			}
274 		}
275 
276 		if (attribute.isPersistant ()) {
277 			
278 			
279 			
280 			String value = attribute.getValue ();
281 			if(value == null)
282 				value = "";
283 			int indexOfLT = value.indexOf ("<");
284 			if (indexOfLT > -1 && value.indexOf (">", indexOfLT) > -1) {
285 				
286 				preferenceAttributeElement
287 						.appendChild (createCDATAElement (
288 										DEFAULT_NAMESPACE,
289 										XMLNAME_PREF_ATT_VALUE,
290 										(attribute.isEncrypted())?Crypt.encryptHexString(value):value, document));
291 			} else {
292 				preferenceAttributeElement
293 						.appendChild (createTextElement (
294 										DEFAULT_NAMESPACE,
295 										XMLNAME_PREF_ATT_VALUE,
296 										(attribute.isEncrypted())?Crypt.encryptHexString(value):value, document));
297 			}
298 		}
299 
300 		
301 		preferenceAttributeElement
302 				.appendChild (createTextElement (DEFAULT_NAMESPACE,
303 									XMLNAME_PREF_ATT_TYPE,
304 									attribute.getType ().getName (),
305 									document));
306 		if(attribute.isEncrypted()){
307 			preferenceAttributeElement
308 			.appendChild (createTextElement (DEFAULT_NAMESPACE,
309 					XMLNAME_PREF_ATT_ENCRYPTED,
310 					String.valueOf (attribute.isEncrypted ()),
311 					document));
312 		}
313 		preferenceAttributeElement
314 				.appendChild (createTextElement (DEFAULT_NAMESPACE,
315 									XMLNAME_PREF_ATT_PERSISTANT,
316 									String.valueOf (attribute.isPersistant ()),
317 									document));
318 		preferenceAttributeElement
319 				.appendChild (createTextElement (DEFAULT_NAMESPACE,
320 									XMLNAME_PREF_ATT_USER_MOD,
321 									String.valueOf (
322 									      attribute.isUserModifiable ()),
323 									document));
324 
325 		
326 		if (attribute.getType ().getType () == PreferenceAttributeType.LIST_TYPE
327 				&& attribute instanceof ListPreferenceAttribute) {
328 			preferenceAttributeElement
329 					.setAttributeNS (XSI_NAMESPACE, XMLNAME_XSI_TYPE,
330 										XMLNAME_LIST_PREFERENCE_ATTRIBUTE);
331 			Element optionsElement = document
332 					.createElementNS (DEFAULT_NAMESPACE,
333 										XMLNAME_PREF_ATT_OPTIONS);
334 
335 			ListPreferenceAttribute listPreferenceAttribute = (ListPreferenceAttribute) attribute;
336 			Iterator options = listPreferenceAttribute.iterateOptions ();
337 			while (options.hasNext ()) {
338 				String optionsValue = (String) options.next ();
339 				int indexOfLT = optionsValue.indexOf ("<");
340 				if (indexOfLT > -1
341 						&& optionsValue.indexOf (">", indexOfLT) > -1) {
342 					optionsElement
343 							.appendChild (createCDATAElement (DEFAULT_NAMESPACE,
344 										XMLNAME_PREF_ATT_OPTION_VAL,
345 										optionsValue,
346 										document));
347 				} else {
348 					optionsElement
349 							.appendChild (createTextElement (DEFAULT_NAMESPACE,
350 										XMLNAME_PREF_ATT_OPTION_VAL,
351 										optionsValue,
352 										document));
353 				}
354 			}
355 
356 			preferenceAttributeElement.appendChild (optionsElement);
357 		}
358 
359 		return preferenceAttributeElement;
360 	}
361 
362 	
363 
364 
365 
366 
367 
368 
369 
370 
371 
372 
373 
374 
375 
376 	private Element createTextElement (String namespace, String elementName,
377 			String value, Document document) {
378 
379 		Element textElement = null;
380 
381 		if (null == namespace) {
382 			textElement = document.createElement (elementName);
383 		} else {
384 			textElement = document.createElementNS (namespace, elementName);
385 		}
386 
387 		textElement.appendChild (document.createTextNode (value));
388 		return textElement;
389 	}
390 
391 	
392 
393 
394 
395 
396 
397 
398 
399 
400 
401 
402 
403 
404 
405 	private Element createCDATAElement (String namespace, String elementName,
406 			String value, Document document) {
407 
408 		Element cdataElement = null;
409 
410 		if (null == namespace) {
411 			cdataElement = document.createElement (elementName);
412 		} else {
413 			cdataElement = document.createElementNS (namespace, elementName);
414 		}
415 
416 		cdataElement.appendChild (document.createCDATASection (value));
417 		return cdataElement;
418 	}
419 
420 }