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.OptionsBuilder;
019import org.ini4j.spi.OptionsFormatter;
020import org.ini4j.spi.OptionsHandler;
021import org.ini4j.spi.OptionsParser;
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 Options extends BasicOptionMap implements Persistable, Configurable
037{
038    private static final long serialVersionUID = -1119753444859181822L;
039    private String _comment;
040    private Config _config;
041    private File _file;
042
043    public Options()
044    {
045        _config = Config.getGlobal().clone();
046        _config.setEmptyOption(true);
047    }
048
049    public Options(Reader input) throws IOException, InvalidFileFormatException
050    {
051        this();
052        load(input);
053    }
054
055    public Options(InputStream input) throws IOException, InvalidFileFormatException
056    {
057        this();
058        load(input);
059    }
060
061    public Options(URL input) throws IOException, InvalidFileFormatException
062    {
063        this();
064        load(input);
065    }
066
067    public Options(File input) throws IOException, InvalidFileFormatException
068    {
069        this();
070        _file = input;
071        load();
072    }
073
074    public String getComment()
075    {
076        return _comment;
077    }
078
079    public void setComment(String value)
080    {
081        _comment = value;
082    }
083
084    @Override public Config getConfig()
085    {
086        return _config;
087    }
088
089    @Override public void setConfig(Config value)
090    {
091        _config = value;
092    }
093
094    @Override public File getFile()
095    {
096        return _file;
097    }
098
099    @Override public void setFile(File value)
100    {
101        _file = value;
102    }
103
104    @Override public void load() throws IOException, InvalidFileFormatException
105    {
106        if (_file == null)
107        {
108            throw new FileNotFoundException();
109        }
110
111        load(_file);
112    }
113
114    @Override public void load(InputStream input) throws IOException, InvalidFileFormatException
115    {
116        load(new InputStreamReader(input, getConfig().getFileEncoding()));
117    }
118
119    @Override public void load(Reader input) throws IOException, InvalidFileFormatException
120    {
121        OptionsParser.newInstance(getConfig()).parse(input, newBuilder());
122    }
123
124    @Override public void load(URL input) throws IOException, InvalidFileFormatException
125    {
126        OptionsParser.newInstance(getConfig()).parse(input, newBuilder());
127    }
128
129    @Override public void load(File input) throws IOException, InvalidFileFormatException
130    {
131        load(input.toURI().toURL());
132    }
133
134    @Override public void store() throws IOException
135    {
136        if (_file == null)
137        {
138            throw new FileNotFoundException();
139        }
140
141        store(_file);
142    }
143
144    @Override public void store(OutputStream output) throws IOException
145    {
146        store(new OutputStreamWriter(output, getConfig().getFileEncoding()));
147    }
148
149    @Override public void store(Writer output) throws IOException
150    {
151        store(OptionsFormatter.newInstance(output, getConfig()));
152    }
153
154    @Override public void store(File output) throws IOException
155    {
156        OutputStream stream = new FileOutputStream(output);
157
158        store(stream);
159        stream.close();
160    }
161
162    protected OptionsHandler newBuilder()
163    {
164        return OptionsBuilder.newInstance(this);
165    }
166
167    protected void store(OptionsHandler formatter) throws IOException
168    {
169        formatter.startOptions();
170        storeComment(formatter, _comment);
171        for (String name : keySet())
172        {
173            storeComment(formatter, getComment(name));
174            int n = getConfig().isMultiOption() ? length(name) : 1;
175
176            for (int i = 0; i < n; i++)
177            {
178                String value = get(name, i);
179
180                formatter.handleOption(name, value);
181            }
182        }
183
184        formatter.endOptions();
185    }
186
187    @Override boolean isPropertyFirstUpper()
188    {
189        return getConfig().isPropertyFirstUpper();
190    }
191
192    private void storeComment(OptionsHandler formatter, String comment)
193    {
194        if ((comment != null) && (comment.length() != 0))
195        {
196            formatter.handleComment(comment);
197        }
198    }
199}