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 */
016 package org.ini4j;
017
018 import org.ini4j.spi.EscapeTool;
019
020 import java.io.IOException;
021 import java.io.InputStream;
022 import java.io.OutputStream;
023 import java.io.OutputStreamWriter;
024 import java.io.Reader;
025 import java.io.Writer;
026
027 import java.net.URL;
028
029 public class Options extends OptionMapImpl
030 {
031 private static final char OPERATOR = '=';
032 private static final String NEWLINE = "\n";
033 private Config _config;
034
035 public Options()
036 {
037 _config = Config.getGlobal().clone();
038 _config.setEmptyOption(true);
039 }
040
041 public Options(Reader input) throws IOException, InvalidIniFormatException
042 {
043 this();
044 load(input);
045 }
046
047 public Options(InputStream input) throws IOException, InvalidIniFormatException
048 {
049 this();
050 load(input);
051 }
052
053 public Options(URL input) throws IOException, InvalidIniFormatException
054 {
055 this();
056 load(input);
057 }
058
059 public void setConfig(Config value)
060 {
061 _config = value;
062 }
063
064 public void load(InputStream input) throws IOException, InvalidIniFormatException
065 {
066 OptionParser.newInstance(getConfig()).parse(input, new Builder());
067 }
068
069 public void load(Reader input) throws IOException, InvalidIniFormatException
070 {
071 OptionParser.newInstance(getConfig()).parse(input, new Builder());
072 }
073
074 public void load(URL input) throws IOException, InvalidIniFormatException
075 {
076 OptionParser.newInstance(getConfig()).parse(input, new Builder());
077 }
078
079 public void store(OutputStream output) throws IOException
080 {
081 format(new OutputStreamWriter(output));
082 }
083
084 public void store(Writer output) throws IOException
085 {
086 format(output);
087 }
088
089 protected Config getConfig()
090 {
091 return _config;
092 }
093
094 protected String escape(String input)
095 {
096 return getConfig().isEscape() ? EscapeTool.getInstance().escape(input) : input;
097 }
098
099 protected void format(Writer output) throws IOException
100 {
101 for (String name : keySet())
102 {
103 int n = getConfig().isMultiOption() ? length(name) : 1;
104
105 for (int i = 0; i < n; i++)
106 {
107 String value = get(name, i);
108
109 if ((value != null) || getConfig().isEmptyOption())
110 {
111 output.append(escape(name));
112 output.append(OPERATOR);
113 if (value != null)
114 {
115 output.append(escape(value));
116 }
117
118 output.append(NEWLINE);
119 }
120 }
121 }
122
123 output.flush();
124 }
125
126 private class Builder implements OptionHandler
127 {
128 @Override public void handleOption(String name, String value)
129 {
130 if (getConfig().isMultiOption())
131 {
132 add(name, value);
133 }
134 else
135 {
136 put(name, value);
137 }
138 }
139 }
140 }