package org.fenixedu.bennu.portal.api.json;
import org.fenixedu.bennu.core.groups.Group;
import org.fenixedu.bennu.core.json.JsonBuilder;
import org.fenixedu.bennu.core.json.JsonCreator;
import org.fenixedu.bennu.core.json.JsonUpdater;
import org.fenixedu.bennu.core.json.JsonViewer;
import org.fenixedu.bennu.portal.domain.MenuContainer;
import org.fenixedu.bennu.portal.domain.MenuFunctionality;
import org.fenixedu.bennu.portal.domain.MenuItem;
import org.fenixedu.bennu.portal.domain.PortalConfiguration;
import org.fenixedu.commons.i18n.LocalizedString;
import pt.ist.fenixframework.FenixFramework;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
public class MenuItemAdapter implements JsonViewer<MenuItem>, JsonUpdater<MenuItem>, JsonCreator<MenuContainer> {
@Override
public MenuItem update(JsonElement json, MenuItem item, JsonBuilder ctx) {
JsonObject jsonObj = json.getAsJsonObject();
if (jsonObj.has("title")) {
item.setTitle(LocalizedString.fromJson(jsonObj.get("title").getAsJsonObject()));
}
if (jsonObj.has("description")) {
item.setDescription(LocalizedString.fromJson(jsonObj.get("description").getAsJsonObject()));
}
if (jsonObj.has("layout")) {
item.setLayout(jsonObj.get("layout").getAsString());
} else {
item.setLayout(null);
}
if (jsonObj.has("icon")) {
item.setIcon(jsonObj.get("icon").getAsString());
} else {
item.setIcon(null);
}
if (jsonObj.has("visible")) {
item.setVisible(jsonObj.get("visible").getAsBoolean());
}
if (jsonObj.has("accessExpression")) {
item.setAccessGroup(Group.parse(jsonObj.get("accessExpression").getAsString()));
}
if (item.isMenuFunctionality() && jsonObj.has("documentationUrl")) {
item.getAsMenuFunctionality().setDocumentationUrl(jsonObj.get("documentationUrl").getAsString());
}
return item;
}
@Override
public JsonElement view(MenuItem obj, JsonBuilder ctx) {
JsonObject json = new JsonObject();
json.addProperty("id", obj.getExternalId());
json.addProperty("order", obj.getOrd());
json.addProperty("path", obj.getPath());
json.addProperty("fullPath", obj.getFullPath());
json.addProperty("accessExpression", obj.getAccessGroup().getExpression());
json.addProperty("functionality", obj.isMenuFunctionality());
json.addProperty("visible", obj.isVisible());
json.addProperty("layout", obj.getLayout());
json.addProperty("icon", obj.getIcon());
json.add("description", ctx.view(obj.getDescription()));
json.add("title", ctx.view(obj.getTitle()));
if (obj.isMenuContainer()) {
MenuContainer container = obj.getAsMenuContainer();
if (container.isRoot()) {
json.add("title", ctx.view(PortalConfiguration.getInstance().getApplicationTitle()));
json.addProperty("appRoot", true);
}
json.add("menu", ctx.view(container.getOrderedChild(), MenuItemAdapter.class));
json.addProperty("subRoot", container.isSubRoot());
} else {
MenuFunctionality functionality = obj.getAsMenuFunctionality();
json.addProperty("key", functionality.getItemKey());
json.addProperty("provider", functionality.getProvider());
json.addProperty("documentationUrl", functionality.getDocumentationUrl());
json.addProperty("documentationUrlProcessed", functionality.getParsedDocumentationUrl());
}
return json;
}
@Override
public MenuContainer create(JsonElement json, JsonBuilder ctx) {
JsonObject jsonObj = json.getAsJsonObject();
MenuContainer parent = FenixFramework.getDomainObject(jsonObj.get("parent").getAsString());
boolean visible = jsonObj.get("visible").getAsBoolean();
String accessGroup = jsonObj.get("accessExpression").getAsString();
LocalizedString description = LocalizedString.fromJson(jsonObj.get("description"));
LocalizedString title = LocalizedString.fromJson(jsonObj.get("title"));
String path = jsonObj.get("path").getAsString();
MenuContainer container = new MenuContainer(parent, visible, accessGroup, description, title, path);
if (jsonObj.has("layout")) {
container.setLayout(jsonObj.get("layout").getAsString());
}
return container;
}
}