package org.fenixedu.bennu.portal.api.json;
import org.fenixedu.bennu.core.annotation.DefaultJsonAdapter;
import org.fenixedu.bennu.core.api.json.DomainObjectViewer;
import org.fenixedu.bennu.core.json.JsonBuilder;
import org.fenixedu.bennu.core.json.JsonUpdater;
import org.fenixedu.bennu.core.json.JsonViewer;
import org.fenixedu.bennu.core.util.CoreConfiguration;
import org.fenixedu.bennu.portal.domain.PortalConfiguration;
import org.fenixedu.bennu.portal.servlet.PortalInitializer;
import org.fenixedu.commons.i18n.LocalizedString;
import com.google.common.base.Strings;
import com.google.common.io.BaseEncoding;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
@DefaultJsonAdapter(PortalConfiguration.class)
public class PortalConfigurationAdapter implements JsonViewer<PortalConfiguration>, JsonUpdater<PortalConfiguration> {
private static final boolean developmentMode = CoreConfiguration.getConfiguration().developmentMode();
@Override
public JsonElement view(PortalConfiguration configuration, JsonBuilder ctx) {
JsonObject object = new JsonObject();
object.addProperty("id", configuration.getExternalId());
object.add("applicationTitle", configuration.getApplicationTitle().json());
object.add("htmlTitle", configuration.getHtmlTitle().json());
object.add("applicationSubTitle", configuration.getApplicationSubTitle().json());
object.add("applicationCopyright", configuration.getApplicationCopyright().json());
object.addProperty("developmentMode", developmentMode);
object.addProperty("supportEmailAddress", configuration.getSupportEmailAddress());
object.addProperty("systemEmailAddress", configuration.getSystemEmailAddress());
object.addProperty("theme", configuration.getTheme());
object.addProperty("defaultDocumentationBaseUrl", configuration.getDocumentationBaseUrl());
if (configuration.getLogo() != null) {
if (!Strings.isNullOrEmpty(configuration.getLogoLinkUrl())) {
object.addProperty("logoLinkUrl", configuration.getLogoLinkUrl());
}
if (!Strings.isNullOrEmpty(configuration.getLogoTooltip())) {
object.addProperty("logoTooltip", configuration.getLogoTooltip());
}
}
JsonArray themes = new JsonArray();
for (String theme : PortalInitializer.getThemes()) {
themes.add(new JsonPrimitive(theme));
}
object.add("themes", themes);
object.add("menu", ctx.view(configuration.getMenu(), DomainObjectViewer.class));
return object;
}
@Override
public PortalConfiguration update(JsonElement json, PortalConfiguration configuration, JsonBuilder ctx) {
JsonObject object = json.getAsJsonObject();
if (object.has("applicationTitle")) {
configuration.setApplicationTitle(LocalizedString.fromJson(object.get("applicationTitle")));
}
if (object.has("htmlTitle")) {
configuration.setHtmlTitle(LocalizedString.fromJson(object.get("htmlTitle")));
}
if (object.has("applicationSubTitle")) {
configuration.setApplicationSubTitle(LocalizedString.fromJson(object.get("applicationSubTitle")));
}
if (object.has("applicationCopyright")) {
configuration.setApplicationCopyright(LocalizedString.fromJson(object.get("applicationCopyright")));
}
if (object.has("supportEmailAddress")) {
configuration.setSupportEmailAddress(object.get("supportEmailAddress").getAsString());
}
if (object.has("systemEmailAddress")) {
configuration.setSystemEmailAddress(object.get("systemEmailAddress").getAsString());
}
if (object.has("theme")) {
configuration.setTheme(object.get("theme").getAsString());
}
if (object.has("logo")) {
configuration.setLogo(BaseEncoding.base64().decode(object.get("logo").getAsString()));
}
if (object.has("logoType")) {
configuration.setLogoType(object.get("logoType").getAsString());
}
if (object.has("logoLinkUrl")) {
configuration.setLogoLinkUrl(object.get("logoLinkUrl").getAsString());
}
if (object.has("logoTooltip")) {
configuration.setLogoTooltip(object.get("logoTooltip").getAsString());
}
if (object.has("favicon")) {
configuration.setFavicon(BaseEncoding.base64().decode(object.get("favicon").getAsString()));
}
if (object.has("faviconType")) {
configuration.setFaviconType(object.get("faviconType").getAsString());
}
if (object.has("defaultDocumentationBaseUrl")) {
configuration.setDocumentationBaseUrl(object.get("defaultDocumentationBaseUrl").getAsString());
}
return configuration;
}
}