package freenet.config;
import java.util.Arrays;
import freenet.l10n.NodeL10n;
import freenet.support.URLDecoder;
import freenet.support.URLEncodedFormatException;
import freenet.support.URLEncoder;
import freenet.support.api.StringArrCallback;
public class StringArrOption extends Option<String[]> {
public static final String delimiter = ";";
public StringArrOption(SubConfig conf, String optionName, String[] defaultValue, int sortOrder,
boolean expert, boolean forceWrite, String shortDesc, String longDesc, StringArrCallback cb) {
super(conf, optionName, cb, sortOrder, expert, forceWrite, shortDesc, longDesc, Option.DataType.STRING_ARRAY);
this.defaultValue = (defaultValue==null)?new String[0]:defaultValue;
this.currentValue = (defaultValue==null)?new String[0]:defaultValue;
}
@Override
public String[] parseString(String val) throws InvalidConfigValueException {
if(val.length() == 0) return new String[0];
String[] out = val.split(delimiter);
try {
for (int i = 0; i < out.length; i++) {
if (out[i].equals(":"))
out[i] = "";
else
out[i] = URLDecoder.decode(out[i], true /* FIXME false */);
}
} catch (URLEncodedFormatException e) {
throw new InvalidConfigValueException(l10n("parseError", "error", e.getLocalizedMessage()));
}
return out;
}
public void setInitialValue(String[] val) throws InvalidConfigValueException {
this.currentValue = val;
}
private String l10n(String key, String pattern, String value) {
return NodeL10n.getBase().getString("StringArrOption."+key, pattern, value);
}
@Override
public String toString(String[] arr) {
if (arr == null)
return null;
StringBuilder sb = new StringBuilder();
for (int i = 0 ; i < arr.length ; i++) {
String val = arr[i];
if(val.length() == 0)
sb.append(":").append(delimiter);
else
sb.append(URLEncoder.encode(arr[i],false)).append(delimiter);
}
if(sb.length() > 0) sb.setLength(sb.length()-1); // drop surplus delimiter
return sb.toString();
}
public static String decode(String s) {
try {
return URLDecoder.decode(s, false);
} catch (URLEncodedFormatException e) {
return null;
}
}
@Override
public boolean isDefault() {
getValue();
return currentValue == null ? false : Arrays.equals(currentValue, defaultValue);
}
}