001/*
002 * Copyright 2005,2009 Ivan SZKIBA
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *      http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.ini4j;
017
018import org.ini4j.spi.IniBuilder;
019import org.ini4j.spi.IniFormatter;
020import org.ini4j.spi.IniHandler;
021import org.ini4j.spi.IniParser;
022
023import java.io.File;
024import java.io.FileNotFoundException;
025import java.io.FileOutputStream;
026import java.io.IOException;
027import java.io.InputStream;
028import java.io.InputStreamReader;
029import java.io.OutputStream;
030import java.io.OutputStreamWriter;
031import java.io.Reader;
032import java.io.Writer;
033
034import java.net.URL;
035
036public class Ini extends BasicProfile implements Persistable, Configurable
037{
038    private static final long serialVersionUID = -6029486578113700585L;
039    private Config _config;
040    private File _file;
041
042    public Ini()
043    {
044        _config = Config.getGlobal();
045    }
046
047    public Ini(Reader input) throws IOException, InvalidFileFormatException
048    {
049        this();
050        load(input);
051    }
052
053    public Ini(InputStream input) throws IOException, InvalidFileFormatException
054    {
055        this();
056        load(input);
057    }
058
059    public Ini(URL input) throws IOException, InvalidFileFormatException
060    {
061        this();
062        load(input);
063    }
064
065    public Ini(File input) throws IOException, InvalidFileFormatException
066    {
067        this();
068        _file = input;
069        load();
070    }
071
072    @Override public Config getConfig()
073    {
074        return _config;
075    }
076
077    @Override public void setConfig(Config value)
078    {
079        _config = value;
080    }
081
082    @Override public File getFile()
083    {
084        return _file;
085    }
086
087    @Override public void setFile(File value)
088    {
089        _file = value;
090    }
091
092    @Override public void load() throws IOException, InvalidFileFormatException
093    {
094        if (_file == null)
095        {
096            throw new FileNotFoundException();
097        }
098
099        load(_file);
100    }
101
102    @Override public void load(InputStream input) throws IOException, InvalidFileFormatException
103    {
104        load(new InputStreamReader(input, getConfig().getFileEncoding()));
105    }
106
107    @Override public void load(Reader input) throws IOException, InvalidFileFormatException
108    {
109        IniParser.newInstance(getConfig()).parse(input, newBuilder());
110    }
111
112    @Override public void load(File input) throws IOException, InvalidFileFormatException
113    {
114        load(input.toURI().toURL());
115    }
116
117    @Override public void load(URL input) throws IOException, InvalidFileFormatException
118    {
119        IniParser.newInstance(getConfig()).parse(input, newBuilder());
120    }
121
122    @Override public void store() throws IOException
123    {
124        if (_file == null)
125        {
126            throw new FileNotFoundException();
127        }
128
129        store(_file);
130    }
131
132    @Override public void store(OutputStream output) throws IOException
133    {
134        store(new OutputStreamWriter(output, getConfig().getFileEncoding()));
135    }
136
137    @Override public void store(Writer output) throws IOException
138    {
139        store(IniFormatter.newInstance(output, getConfig()));
140    }
141
142    @Override public void store(File output) throws IOException
143    {
144        OutputStream stream = new FileOutputStream(output);
145
146        store(stream);
147        stream.close();
148    }
149
150    protected IniHandler newBuilder()
151    {
152        return IniBuilder.newInstance(this);
153    }
154
155    @Override protected void store(IniHandler formatter, Profile.Section section)
156    {
157        if (getConfig().isEmptySection() || (section.size() != 0))
158        {
159            super.store(formatter, section);
160        }
161    }
162
163    @Override protected void store(IniHandler formatter, Profile.Section section, String option, int index)
164    {
165        if (getConfig().isMultiOption() || (index == (section.length(option) - 1)))
166        {
167            super.store(formatter, section, option, index);
168        }
169    }
170
171    @Override boolean isTreeMode()
172    {
173        return getConfig().isTree();
174    }
175
176    @Override char getPathSeparator()
177    {
178        return getConfig().getPathSeparator();
179    }
180
181    @Override boolean isPropertyFirstUpper()
182    {
183        return getConfig().isPropertyFirstUpper();
184    }
185}