001/*
002 * Copyright 2006 - 2013
003 *     Stefan Balev     <stefan.balev@graphstream-project.org>
004 *     Julien Baudry    <julien.baudry@graphstream-project.org>
005 *     Antoine Dutot    <antoine.dutot@graphstream-project.org>
006 *     Yoann Pigné      <yoann.pigne@graphstream-project.org>
007 *     Guilhelm Savin   <guilhelm.savin@graphstream-project.org>
008 * 
009 * This file is part of GraphStream <http://graphstream-project.org>.
010 * 
011 * GraphStream is a library whose purpose is to handle static or dynamic
012 * graph, create them from scratch, file or any source and display them.
013 * 
014 * This program is free software distributed under the terms of two licenses, the
015 * CeCILL-C license that fits European law, and the GNU Lesser General Public
016 * License. You can  use, modify and/ or redistribute the software under the terms
017 * of the CeCILL-C license as circulated by CEA, CNRS and INRIA at the following
018 * URL <http://www.cecill.info> or under the terms of the GNU LGPL as published by
019 * the Free Software Foundation, either version 3 of the License, or (at your
020 * option) any later version.
021 * 
022 * This program is distributed in the hope that it will be useful, but WITHOUT ANY
023 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
024 * PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more details.
025 * 
026 * You should have received a copy of the GNU Lesser General Public License
027 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
028 * 
029 * The fact that you are presently reading this means that you have had
030 * knowledge of the CeCILL-C and LGPL licenses and that you accept their terms.
031 */
032package org.graphstream.stream.file;
033
034import java.io.BufferedReader;
035import java.io.FileInputStream;
036import java.io.IOException;
037import java.io.InputStream;
038import java.io.InputStreamReader;
039import java.io.Reader;
040import java.util.zip.GZIPInputStream;
041
042import org.graphstream.stream.file.dgs.DGSParser;
043import org.graphstream.util.parser.ParseException;
044import org.graphstream.util.parser.Parser;
045import org.graphstream.util.parser.ParserFactory;
046
047/**
048 * Class responsible for parsing files in the DGS format.
049 * 
050 * <p>
051 * The DGS file format is especially designed for storing dynamic graph
052 * definitions into a file. More information about the DGS file format will be
053 * found on the GraphStream web site: <a
054 * href="http://graphstream-project.org/">http://graphstream-project.org/</a>
055 * </p>
056 * 
057 * The usual file name extension used for this format is ".dgs".
058 * 
059 * @see FileSource
060 */
061public class FileSourceDGS extends FileSourceParser {
062        /*
063         * (non-Javadoc)
064         * 
065         * @see org.graphstream.stream.file.FileSourceParser#getNewParserFactory()
066         */
067        public ParserFactory getNewParserFactory() {
068                return new ParserFactory() {
069                        public Parser newParser(Reader reader) {
070                                return new DGSParser(FileSourceDGS.this, reader);
071                        }
072                };
073        }
074
075        @Override
076        public boolean nextStep() throws IOException {
077                try {
078                        return ((DGSParser) parser).nextStep();
079                } catch (ParseException e) {
080                        throw new IOException(e);
081                }
082        }
083
084        @Override
085        protected Reader createReaderForFile(String filename) throws IOException {
086                InputStream is = null;
087
088                is = new FileInputStream(filename);
089
090                if (is.markSupported())
091                        is.mark(128);
092
093                try {
094                        is = new GZIPInputStream(is);
095                } catch (IOException e1) {
096                        //
097                        // This is not a gzip input.
098                        // But gzip has eat some bytes so we reset the stream
099                        // or close and open it again.
100                        //
101                        if (is.markSupported()) {
102                                try {
103                                        is.reset();
104                                } catch (IOException e2) {
105                                        //
106                                        // Dirty but we hope do not get there
107                                        //
108                                        e2.printStackTrace();
109                                }
110                        } else {
111                                try {
112                                        is.close();
113                                } catch (IOException e2) {
114                                        //
115                                        // Dirty but we hope do not get there
116                                        //
117                                        e2.printStackTrace();
118                                }
119                                
120                                is = new FileInputStream(filename);
121                        }
122                }
123
124                return new BufferedReader(new InputStreamReader(is));
125        }
126}