package com.ponysdk.core.ui.basic;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.logging.Level;
import javax.json.Json;
import javax.json.JsonArrayBuilder;
import javax.json.JsonObject;
import javax.json.JsonObjectBuilder;
import javax.json.JsonValue;
import com.ponysdk.core.model.ServerToClientModel;
import com.ponysdk.core.model.WidgetType;
import com.ponysdk.core.writer.ModelWriter;
public abstract class PAddOn extends PObject {
private static final String ARGUMENTS_PROPERTY_NAME = "arg";
private static final String METHOD_PROPERTY_NAME = "m";
private final static Map<Level, Byte> LOG_LEVEL = new HashMap<>();
static {
byte level = 0;
LOG_LEVEL.put(Level.OFF, level++);
LOG_LEVEL.put(Level.SEVERE, level++);
LOG_LEVEL.put(Level.WARNING, level++);
LOG_LEVEL.put(Level.INFO, level++);
LOG_LEVEL.put(Level.CONFIG, level++);
LOG_LEVEL.put(Level.FINE, level++);
LOG_LEVEL.put(Level.FINER, level++);
LOG_LEVEL.put(Level.FINEST, level++);
LOG_LEVEL.put(Level.ALL, level++);
}
private JsonObject args;
protected PAddOn() {
}
protected PAddOn(final JsonObject args) {
this.args = args;
}
@Override
public boolean attach(final PWindow window) {
final boolean result = super.attach(window);
if (result) window.addDestroyListener(event -> onDestroy());
return result;
}
@Override
protected void enrichOnInit(final ModelWriter writer) {
super.enrichOnInit(writer);
writer.write(ServerToClientModel.FACTORY, getSignature());
if (args != null) {
writer.write(ServerToClientModel.NATIVE, args);
args = null;
}
}
public String getSignature() {
return getClass().getCanonicalName();
}
@Override
protected WidgetType getWidgetType() {
return WidgetType.ADDON;
}
protected void callTerminalMethod(final String methodName, final Object... args) {
final JsonObjectBuilder builder = Json.createObjectBuilder();
builder.add(METHOD_PROPERTY_NAME, methodName);
if (args.length > 0) {
final JsonArrayBuilder arrayBuilder = Json.createArrayBuilder();
for (final Object object : args) {
if (object != null) {
if (object instanceof JsonValue) {
arrayBuilder.add((JsonValue) object);
} else if (object instanceof Number) {
final Number number = (Number) object;
if (object instanceof Byte || object instanceof Short || object instanceof Integer)
arrayBuilder.add(number.intValue());
else if (object instanceof Long) arrayBuilder.add(number.longValue());
else if (object instanceof Float || object instanceof Double) arrayBuilder.add(number.doubleValue());
else if (object instanceof BigInteger) arrayBuilder.add((BigInteger) object);
else if (object instanceof BigDecimal) arrayBuilder.add((BigDecimal) object);
else arrayBuilder.add(number.doubleValue());
} else if (object instanceof Boolean) {
arrayBuilder.add((Boolean) object);
} else if (object instanceof JsonArrayBuilder) {
arrayBuilder.add(((JsonArrayBuilder) object).build());
} else if (object instanceof JsonObjectBuilder) {
arrayBuilder.add(((JsonObjectBuilder) object).build());
} else if (object instanceof Collection) {
throw new IllegalArgumentException(
"Collections are not supported for PAddOn, you need to convert it to JsonArray on primitive array");
} else {
arrayBuilder.add(object.toString());
}
} else {
arrayBuilder.addNull();
}
}
builder.add(ARGUMENTS_PROPERTY_NAME, arrayBuilder);
}
saveUpdate(writer -> writer.write(ServerToClientModel.NATIVE, builder.build()));
}
public void setLogLevel(final Level logLevel) {
callTerminalMethod("setLogLevel", LOG_LEVEL.get(logLevel));
}
public void destroy() {
saveUpdate(writer -> writer.write(ServerToClientModel.DESTROY));
}
}