package php.runtime.ext.core.classes.util;
import php.runtime.Memory;
import php.runtime.annotation.Reflection.Name;
import php.runtime.annotation.Reflection.Namespace;
import php.runtime.annotation.Reflection.Nullable;
import php.runtime.annotation.Reflection.Signature;
import php.runtime.common.StringUtils;
import php.runtime.env.Environment;
import php.runtime.ext.CoreExtension;
import php.runtime.ext.core.classes.stream.Stream;
import php.runtime.lang.BaseObject;
import php.runtime.lang.ForeachIterator;
import php.runtime.memory.ArrayMemory;
import php.runtime.memory.LongMemory;
import php.runtime.memory.StringMemory;
import php.runtime.memory.TrueMemory;
import php.runtime.reflection.ClassEntity;
import java.io.*;
import java.util.Map;
import java.util.Properties;
@Name("Configuration")
@Namespace(CoreExtension.NAMESPACE + "util")
public class WrapConfiguration extends BaseObject {
protected Properties properties;
public WrapConfiguration(Environment env, Properties properties) {
super(env);
this.properties = properties;
}
public WrapConfiguration(Environment env, ClassEntity clazz) {
super(env, clazz);
}
@Signature
public void __construct() throws IOException {
__construct(null);
}
@Signature
public void __construct(@Nullable InputStream in) throws IOException {
__construct(in, "UTF-8");
}
@Signature
public void __construct(@Nullable InputStream in, String encoding) throws IOException {
properties = new Properties();
if (in != null) {
load(in, encoding);
}
}
@Signature
public Memory get(String key, Memory def) {
if (!properties.containsKey(key)) {
return def;
}
return StringMemory.valueOf(properties.getProperty(key, def.toString()));
}
@Signature
public boolean has(String key) {
return properties.containsKey(key);
}
@Signature
public String remove(String key) {
Object remove = properties.remove(key);
return remove == null ? null : remove.toString();
}
@Signature
public Memory get(String key) {
return get(key, Memory.NULL);
}
@Signature
public Memory getArray(String key, ArrayMemory def) {
if (has(key)) {
Memory memory = get(key);
String[] split = StringUtils.split(memory.toString(), '|');
ArrayMemory result = new ArrayMemory();
for (String s : split) {
result.add(s.trim());
}
return result.toConstant();
} else {
return def;
}
}
@Signature
public Memory getArray(String key) {
return getArray(key, new ArrayMemory().toConstant());
}
@Signature
public boolean getBoolean(String key, boolean def) {
return get(key, TrueMemory.valueOf(def)).toBoolean();
}
@Signature
public boolean getBoolean(String key) {
return getBoolean(key, false);
}
@Signature
public Memory getNumber(String key, Memory def) {
def = def.toNumeric();
return get(key, def).toNumeric();
}
@Signature
public Memory getNumber(String key) {
return getNumber(key, Memory.CONST_INT_0);
}
@Signature
public long getInteger(String key, long def) {
return get(key, LongMemory.valueOf(def)).toLong();
}
@Signature
public long getInteger(String key) {
return getInteger(key, 0l);
}
@Signature
public String set(String key, Memory value) {
String s = value.toString();
if (value.isArray()) {
s = StringUtils.join(value.toValue(ArrayMemory.class).toStringArray(), "|");
}
Object property = properties.setProperty(key, s);
return property == null ? null : property.toString();
}
@Signature
public void put(Environment env, ForeachIterator iterator) throws Throwable {
while (iterator.next()) {
env.invokeMethod(this, "set", iterator.getMemoryKey(), iterator.getValue());
}
}
@Signature
public void clear() {
properties.clear();
}
@Signature
public void load(InputStream in, String encoding) throws IOException {
properties.load(new InputStreamReader(in, encoding));
}
@Signature
public void load(InputStream in) throws IOException {
load(in, "UTF-8");
}
@Signature
public void save(Environment env, Memory path, String encoding) throws IOException {
OutputStream out = Stream.getOutputStream(env, path);
if (out == null) {
throw new IOException();
}
try {
properties.store(new OutputStreamWriter(out, encoding), null);
} finally {
Stream.closeStream(env, out);
}
}
@Signature
public void save(Environment env, Memory path) throws IOException {
save(env, path, "UTF-8");
}
@Signature
public Memory toArray() {
ArrayMemory result = new ArrayMemory(true);
for (Map.Entry<Object, Object> entry : properties.entrySet()) {
result.putAsKeyString(entry.getKey().toString(), StringMemory.valueOf(entry.getValue().toString()));
}
return result.toConstant();
}
@Signature
protected void __clone() {
}
}