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    }