/*
* Copyright (c) 2001-2004 Ant-Contrib project. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package net.sf.antcontrib.inifile;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.util.*;
/****************************************************************************
* Class representing a windows style .ini file.
*
* @author <a href='mailto:mattinger@yahoo.com'>Matthew Inger</a>
*
****************************************************************************/
public class IniFile
{
private List sections;
private Map sectionMap;
/***
* Create a new IniFile object
*/
public IniFile()
{
super();
this.sections = new ArrayList();
this.sectionMap = new HashMap();
}
/***
* Gets the List of IniSection objects contained in this IniFile
* @return a List of IniSection objects
*/
public List getSections()
{
return sections;
}
/***
* Gets the IniSection with the given name
* @param name the name of the section
*/
public IniSection getSection(String name)
{
return (IniSection)sectionMap.get(name);
}
/***
* Sets an IniSection object. If a section with the given
* name already exists, it is replaced with the passed in section.
* @param section The section to set.
*/
public void setSection(IniSection section)
{
IniSection sec = (IniSection)sectionMap.get(section.getName());
if (sec != null)
{
int idx = sections.indexOf(sec);
sections.set(idx, section);
}
else
{
sections.add(section);
}
sectionMap.put(section.getName(), section);
}
/***
* Removes an entire section from the IniFile
* @param name The name of the section to remove
*/
public void removeSection(String name)
{
IniSection sec = (IniSection)sectionMap.get(name);
if (sec != null)
{
int idx = sections.indexOf(sec);
sections.remove(idx);
sectionMap.remove(name);
}
}
/***
* Gets a named property from a specific section
* @param section The name of the section
* @param property The name of the property
* @return The property value, or null, if either the section or property
* does not exist.
*/
public String getProperty(String section, String property)
{
String value = null;
IniSection sec = getSection(section);
if (sec != null)
{
IniProperty prop = sec.getProperty(property);
if (prop != null)
{
value = prop.getValue();
}
}
return value;
}
/***
* Sets the value of a property in a given section. If the section does
* not exist, it is automatically created.
* @param section The name of the section
* @param property The name of the property
* @param value The value of the property
*/
public void setProperty(String section, String property, String value)
{
IniSection sec = getSection(section);
if (sec == null)
{
sec = new IniSection(section);
setSection(sec);
}
sec.setProperty(new IniProperty(property, value));
}
/***
* Removes a property from a section.
* @param section The name of the section
* @param property The name of the property
*/
public void removeProperty(String section, String property)
{
IniSection sec = getSection(section);
if (sec != null)
{
sec.removeProperty(property);
}
}
/***
* Writes the current iniFile instance to a Writer object for
* serialization.
* @param writer The writer to write to
* @throws IOException
*/
public void write(Writer writer)
throws IOException
{
Iterator it = sections.iterator();
IniSection section = null;
while (it.hasNext())
{
section = (IniSection)it.next();
section.write(writer);
writer.write(System.getProperty("line.separator"));
}
}
/***
* Reads from a Reader into the current IniFile instance. Reading
* appends to the current instance, so if the current instance has
* properties, those properties will still exist.
* @param reader The reader to read from.
* @throws IOException
*/
public void read(Reader reader)
throws IOException
{
BufferedReader br = new BufferedReader(reader);
String line = null;
IniSection currentSection = new IniSection("NONE");
while ((line = br.readLine()) != null)
{
line = line.trim();
if (line.length() > 0 && !line.startsWith("#") && !line.startsWith(";"))
{
if(line.startsWith("[") && line.endsWith("]"))
{
String secName = line.substring(1, line.length()-1);
currentSection = getSection(secName);
if (currentSection == null)
{
currentSection = new IniSection(secName);
setSection(currentSection);
}
}
else
{
String name = line;
String value = "";
int pos = line.indexOf("=");
if (pos != -1)
{
name = line.substring(0,pos);
value = line.substring(pos+1);
}
currentSection.setProperty(new IniProperty(name,value));
}
}
}
}
}