001 /*
002 GRANITE DATA SERVICES
003 Copyright (C) 2007-2010 ADEQUATE SYSTEMS SARL
004
005 This file is part of Granite Data Services.
006
007 Granite Data Services is free software; you can redistribute it and/or modify
008 it under the terms of the GNU Library General Public License as published by
009 the Free Software Foundation; either version 2 of the License, or (at your
010 option) any later version.
011
012 Granite Data Services is distributed in the hope that it will be useful, but
013 WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
014 FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License
015 for more details.
016
017 You should have received a copy of the GNU Library General Public License
018 along with this library; if not, see <http://www.gnu.org/licenses/>.
019 */
020
021 package org.granite.builder.util;
022
023 import java.io.BufferedReader;
024 import java.io.BufferedWriter;
025 import java.io.File;
026 import java.io.FileInputStream;
027 import java.io.FileOutputStream;
028 import java.io.FileReader;
029 import java.io.IOException;
030 import java.io.InputStreamReader;
031 import java.io.OutputStreamWriter;
032 import java.io.Reader;
033 import java.io.StringWriter;
034
035 import com.thoughtworks.xstream.XStream;
036 import com.thoughtworks.xstream.converters.reflection.Sun14ReflectionProvider;
037
038 /**
039 * @author Franck WOLFF
040 */
041 public class XStreamUtil {
042
043 public static final String DEFAULT_CHARSET = "UTF-8";
044 private static final String ENCODING_ATTR = "encoding=\"";
045
046 public static <T> T load(File file, Class<T> clazz) throws IOException {
047 String charset = null;
048
049 String xmlDeclaration = null;
050 BufferedReader reader = null;
051 try {
052 reader = new BufferedReader(new FileReader(file));
053 xmlDeclaration = reader.readLine();
054 } finally {
055 if (reader != null)
056 reader.close();
057 }
058
059 if (xmlDeclaration != null && xmlDeclaration.startsWith("<?xml") && xmlDeclaration.endsWith("?>")) {
060 int iEncoding = xmlDeclaration.indexOf(ENCODING_ATTR);
061 if (iEncoding != -1) {
062 int iEndEncoding = xmlDeclaration.indexOf('"', iEncoding + ENCODING_ATTR.length());
063 if (iEndEncoding != -1)
064 charset = xmlDeclaration.substring(iEncoding + ENCODING_ATTR.length(), iEndEncoding);
065 }
066 }
067
068 return load(file, clazz, charset);
069 }
070
071 @SuppressWarnings("unchecked")
072 public static <T> T load(File file, Class<T> clazz, String charset) throws IOException {
073 Reader reader = null;
074 try {
075 if (charset != null)
076 reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));
077 else
078 reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
079
080 XStream xs = new XStream(new Sun14ReflectionProvider());
081 xs.processAnnotations(clazz);
082 return (T)xs.fromXML(reader);
083 } finally {
084 if (reader != null)
085 reader.close();
086 }
087 }
088
089 public static void save(File file, Object o) throws IOException {
090 save(file, o, null);
091 }
092
093 public static void save(File file, Object o, String charset) throws IOException {
094 if (charset == null)
095 charset = DEFAULT_CHARSET;
096
097 BufferedWriter writer = null;
098 try {
099 writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset));
100 writer.write("<?xml version=\"1.0\" encoding=\"" + charset + "\"?>");
101 writer.newLine();
102
103 XStream xs = new XStream(new Sun14ReflectionProvider());
104 xs.processAnnotations(o.getClass());
105 xs.toXML(o, writer);
106 } finally {
107 if (writer != null)
108 writer.close();
109 }
110 }
111
112 public static String toString(Object o) {
113 StringWriter writer = new StringWriter();
114 XStream xs = new XStream(new Sun14ReflectionProvider());
115 xs.processAnnotations(o.getClass());
116 xs.toXML(o, writer);
117 return writer.toString();
118 }
119 }