001/**
002 * Copyright (C) 2014  Universidade de Aveiro, DETI/IEETA, Bioinformatics Group - http://bioinformatics.ua.pt/
003 *
004 * This file is part of Dicoogle/dicoogle.
005 *
006 * Dicoogle/dicoogle is free software: you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published by
008 * the Free Software Foundation, either version 3 of the License, or
009 * (at your option) any later version.
010 *
011 * Dicoogle/dicoogle is distributed in the hope that it will be useful,
012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
014 * GNU General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with Dicoogle.  If not, see <http://www.gnu.org/licenses/>.
018 */
019package pt.ua.dicoogle.core;
020
021import java.io.File;
022import java.io.FileInputStream;
023import java.io.FileNotFoundException;
024import java.io.FileOutputStream;
025import java.io.IOException;
026import java.io.PrintWriter;
027
028import javax.xml.transform.OutputKeys;
029import javax.xml.transform.Transformer;
030import javax.xml.transform.TransformerConfigurationException;
031import javax.xml.transform.TransformerFactory;
032import javax.xml.transform.sax.SAXTransformerFactory;
033import javax.xml.transform.sax.TransformerHandler;
034import javax.xml.transform.stream.StreamResult;
035
036import org.xml.sax.Attributes;
037import org.xml.sax.InputSource;
038import org.xml.sax.SAXException;
039import org.xml.sax.XMLReader;
040import org.xml.sax.helpers.AttributesImpl;
041import org.xml.sax.helpers.DefaultHandler;
042import org.xml.sax.helpers.XMLReaderFactory;
043
044import pt.ua.dicoogle.sdk.Utils.Platform;
045
046/**
047 *
048 * @author Samuel da Costa Campos <samuelcampos@ua.pt>
049 */
050public class XMLClientSupport extends DefaultHandler {
051
052    private String filePath;
053
054    private ClientSettings cs;
055
056    private boolean isViewer = false;
057    private boolean isHost = false;
058    private boolean isPort = false;
059    private boolean isTempDir = false;
060    private boolean isUsername = false;
061    private boolean isPassword = false;
062    private boolean isAutoConnect = false;
063
064    public XMLClientSupport() {
065        filePath = Platform.homePath() + "clientConfig.xml";
066        
067        cs = ClientSettings.getInstance();
068    }
069
070    @Override
071    public void startElement(String uri, String localName, String qName, Attributes attribs) {
072        if (localName.equals("ExternalViewer")) {
073            isViewer = true;
074        }
075        else if(localName.equals("DefaultServerHost")){
076            isHost = true;
077        }
078        else if(localName.equals("DefaultServerPort")){
079            isPort = true;
080        }
081        else if(localName.equals("DefaultUsername")){
082            isUsername = true;
083        }
084        else if(localName.equals("DefaultPassword")){
085            isPassword = true;
086        }
087        else if(localName.equals("TempFilesDir")){
088            isTempDir = true;
089        }
090        else if(localName.equals("AutoConnect")){
091            isAutoConnect = true;
092        }
093
094
095    }
096
097    @Override
098    public void endElement(String uri, String localName, String qName) {
099        if (localName.equals("ExternalViewer")) {
100            isViewer = false;
101        }
102        else if(localName.equals("DefaultServerHost")){
103            isHost = false;
104        }
105        else if(localName.equals("DefaultServerPort")){
106            isPort = false;
107        }
108        else if(localName.equals("DefaultUsername")){
109            isUsername = false;
110        }
111        else if(localName.equals("DefaultPassword")){
112            isPassword = false;
113        }
114        else if(localName.equals("TempFilesDir")){
115            isTempDir = false;
116        }
117        else if(localName.equals("AutoConnect")){
118            isAutoConnect = false;
119        }
120    }
121
122    @Override
123    public void characters(char[] data, int start, int length) {
124        if (isViewer) {
125            String sView = new String(data, start, length);
126            cs.setExtV(sView);
127            return;
128        }
129        if(isHost){
130            String sView = new String(data, start, length);
131            cs.setDefaultServerHost(sView);
132            return;
133        }
134        if(isPort){
135            String sPort = new String(data, start, length);
136            cs.setDefaultServerPort(Integer.parseInt(sPort));
137            return;
138        }
139        if(isUsername){
140            String sUsername = new String(data, start, length);
141            cs.setDefaultUserName(sUsername);
142            return;
143        }
144        if(isPassword){
145            String sPassword = new String(data, start, length);
146            cs.setDefaultPassword(sPassword);
147            return;
148        }
149        if(isTempDir){
150            String sDir = new String(data, start, length);
151            cs.setTempFilesDir(sDir);
152            return;
153        }
154        if(isAutoConnect)
155        {
156             String sView = new String(data, start, length);
157             boolean result = false;
158             if (sView.compareToIgnoreCase("true") == 0)
159                result = true;
160             cs.setAutoConnect(result);
161             return;
162         }
163    }
164
165    public ClientSettings getXML()
166    {
167        try
168        {
169            File file = new File(filePath);
170            if (!file.exists())
171            {
172                cs.setDefaultSettings();
173                printXML();
174                return cs;
175            }
176            InputSource src = new InputSource( new FileInputStream(file) );
177            XMLReader r = XMLReaderFactory.createXMLReader();
178            r.setContentHandler(this);
179            r.parse(src);
180            return cs;
181        }
182        catch (IOException ex)
183        {
184
185        }
186        catch (SAXException ex)
187        {
188
189        }
190        return null;
191    }
192
193    public void printXML() {
194        FileOutputStream out = null;
195        try {
196            out = new FileOutputStream(filePath);
197            PrintWriter pw = new PrintWriter(out);
198            StreamResult streamResult = new StreamResult(pw);
199            SAXTransformerFactory tf = (SAXTransformerFactory) TransformerFactory.newInstance();
200            //      SAX2.0 ContentHandler.
201            TransformerHandler hd = tf.newTransformerHandler();
202            Transformer serializer = hd.getTransformer();
203            serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
204            serializer.setOutputProperty(OutputKeys.METHOD, "xml");
205            serializer.setOutputProperty(OutputKeys.INDENT, "yes");
206            serializer.setOutputProperty(OutputKeys.STANDALONE, "yes");
207            hd.setResult(streamResult);
208            hd.startDocument();
209
210            //Get a processing instruction
211            //hd.processingInstruction("xml-stylesheet", "type=\"text/xsl\" href=\"mystyle.xsl\"");
212            AttributesImpl atts = new AttributesImpl();
213
214            String curTitle;
215
216            //root element
217            hd.startElement("", "", "Config", atts);  
218
219            hd.startElement("", "", "DirectorySettings", atts);
220
221            curTitle = cs.getExtV();
222            //external viewer
223            hd.startElement("", "", "ExternalViewer", atts);
224            hd.characters(curTitle.toCharArray(), 0, curTitle.length());
225            hd.endElement("", "", "ExternalViewer");
226
227
228            curTitle = cs.getTempFilesDir();
229            //external viewer
230            hd.startElement("", "", "TempFilesDir", atts);
231            hd.characters(curTitle.toCharArray(), 0, curTitle.length());
232            hd.endElement("", "", "TempFilesDir");
233
234            hd.endElement("", "", "DirectorySettings");
235
236            hd.startElement("", "", "DefaultGUIServer", atts);
237
238            curTitle = cs.getDefaultServerHost();
239            //external viewer
240            hd.startElement("", "", "DefaultServerHost", atts);
241            hd.characters(curTitle.toCharArray(), 0, curTitle.length());
242            hd.endElement("", "", "DefaultServerHost");
243
244            curTitle = String.valueOf(cs.getDefaultServerPort());
245            //external viewer
246            hd.startElement("", "", "DefaultServerPort", atts);
247            hd.characters(curTitle.toCharArray(), 0, curTitle.length());
248            hd.endElement("", "", "DefaultServerPort");
249
250            curTitle = cs.getDefaultUserName();
251            //external viewer
252            hd.startElement("", "", "DefaultUsername", atts);
253            hd.characters(curTitle.toCharArray(), 0, curTitle.length());
254            hd.endElement("", "", "DefaultUsername");
255
256            curTitle = cs.getDefaultPassword();
257            //external viewer
258            hd.startElement("", "", "DefaultPassword", atts);
259            hd.characters(curTitle.toCharArray(), 0, curTitle.length());
260            hd.endElement("", "", "DefaultPassword");
261
262            if (cs.getAutoConnect())
263                curTitle = "true";
264            else
265                curTitle = "false";
266
267            //Enable P2P
268            hd.startElement("", "", "AutoConnect", atts);
269            hd.characters(curTitle.toCharArray(), 0, curTitle.length());
270            hd.endElement("", "", "AutoConnect");
271
272            hd.endElement("", "", "DefaultGUIServer");
273
274            hd.endElement("", "", "Config");
275
276            hd.endDocument();
277
278        } catch (TransformerConfigurationException ex) {
279        } catch (SAXException ex) {
280        } catch (FileNotFoundException ex) {
281        } finally {
282            try {
283                out.close();
284            } catch (IOException ex) {
285            }
286        }
287    }
288}