package de.kilobyte22.lib.config;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import com.google.common.base.Splitter;
import static de.kilobyte22.lib.config.Configuration.*;
public class ConfigCategory implements Map<String, Property>
{
private String name;
private String comment;
private ArrayList<ConfigCategory> children = new ArrayList<ConfigCategory>();
private Map<String, Property> properties = new TreeMap<String, Property>();
public final ConfigCategory parent;
public ConfigCategory(String name)
{
this(name, null);
}
public ConfigCategory(String name, ConfigCategory parent)
{
this.name = name;
this.parent = parent;
if (parent != null)
{
parent.children.add(this);
}
}
public boolean equals(Object obj)
{
if (obj instanceof ConfigCategory)
{
ConfigCategory cat = (ConfigCategory)obj;
return name.equals(cat.name) && children.equals(cat.children);
}
return false;
}
public String getQualifiedName()
{
return getQualifiedName(name, parent);
}
public static String getQualifiedName(String name, ConfigCategory parent)
{
return (parent == null ? name : parent.getQualifiedName() + Configuration.CATEGORY_SPLITTER + name);
}
public ConfigCategory getFirstParent()
{
return (parent == null ? this : parent.getFirstParent());
}
public boolean isChild()
{
return parent != null;
}
public Map<String, Property> getValues()
{
return properties;
}
public void setComment(String comment)
{
this.comment = comment;
}
public boolean containsKey(String key)
{
return properties.containsKey(key);
}
public Property get(String key)
{
return properties.get(key);
}
public void set(String key, Property value)
{
properties.put(key, value);
}
public void write(BufferedWriter out, int indent) throws IOException
{
String pad = getIndent(indent);
out.write(pad + "####################" + NEW_LINE);
out.write(pad + "# " + name + NEW_LINE);
if (comment != null)
{
out.write(pad + "#===================" + NEW_LINE);
Splitter splitter = Splitter.onPattern("\r?\n");
for (String line : splitter.split(comment))
{
out.write(pad + "# " + line + NEW_LINE);
}
}
out.write(pad + "####################" + NEW_LINE + NEW_LINE);
if (!allowedProperties.matchesAllOf(name))
{
name = '"' + name + '"';
}
out.write(pad + name + " {" + NEW_LINE);
pad = getIndent(indent + 1);
Property[] props = properties.values().toArray(new Property[properties.size()]);
for (int x = 0; x < props.length; x++)
{
Property prop = props[x];
if (prop.comment != null)
{
if (x != 0)
{
out.newLine();
}
Splitter splitter = Splitter.onPattern("\r?\n");
for (String commentLine : splitter.split(prop.comment))
{
out.write(pad + "# " + commentLine + NEW_LINE);
}
}
String propName = prop.getName();
if (!allowedProperties.matchesAllOf(propName))
{
propName = '"' + propName + '"';
}
if (prop.isList())
{
out.write(String.format(pad + "%s:%s <" + NEW_LINE, prop.getType().getID(), propName));
pad = getIndent(indent + 2);
for (String line : prop.valueList)
{
out.write(pad + line + NEW_LINE);
}
out.write(getIndent(indent + 1) + " >" + NEW_LINE);
}
else if (prop.getType() == null)
{
out.write(String.format(pad + "%s=%s" + NEW_LINE, propName, prop.value));
}
else
{
out.write(String.format(pad + "%s:%s=%s" + NEW_LINE, prop.getType().getID(), propName, prop.value));
}
}
for (ConfigCategory child : children)
{
child.write(out, indent + 1);
}
out.write(getIndent(indent) + "}" + NEW_LINE + NEW_LINE);
}
private String getIndent(int indent)
{
StringBuilder buf = new StringBuilder("");
for (int x = 0; x < indent; x++)
{
buf.append(" ");
}
return buf.toString();
}
//Map bouncer functions for compatibility with older mods, to be removed once all mods stop using it.
@Override public int size(){ return properties.size(); }
@Override public boolean isEmpty() { return properties.isEmpty(); }
@Override public boolean containsKey(Object key) { return properties.containsKey(key); }
@Override public boolean containsValue(Object value){ return properties.containsValue(value); }
@Override public Property get(Object key) { return properties.get(key); }
@Override public Property put(String key, Property value) { return properties.put(key, value); }
@Override public Property remove(Object key) { return properties.remove(key); }
@Override public void putAll(Map<? extends String, ? extends Property> m) { properties.putAll(m); }
@Override public void clear() { properties.clear(); }
@Override public Set<String> keySet() { return properties.keySet(); }
@Override public Collection<Property> values() { return properties.values(); }
@Override public Set<java.util.Map.Entry<String, Property>> entrySet() { return properties.entrySet(); }
}