/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.dashbuilder.navigation.json; import java.util.List; import org.dashbuilder.json.Json; import org.dashbuilder.json.JsonArray; import org.dashbuilder.json.JsonException; import org.dashbuilder.json.JsonObject; import org.dashbuilder.navigation.NavFactory; import org.dashbuilder.navigation.NavGroup; import org.dashbuilder.navigation.NavItem; import org.dashbuilder.navigation.NavTree; public class NavTreeJSONMarshaller { private static final String NAV_ITEM_ID = "id"; private static final String NAV_ITEM_TYPE = "type"; private static final String NAV_ITEM_NAME = "name"; private static final String NAV_ITEM_DESC = "description"; private static final String NAV_ITEM_MODIF = "modifiable"; private static final String NAV_ITEM_CTX = "context"; private static final String NAV_TREE_ROOT_ITEMS = "root_items"; private static final String NAV_GROUP_CHILDREN = "children"; private static NavTreeJSONMarshaller SINGLETON = new NavTreeJSONMarshaller(); public static NavTreeJSONMarshaller get() { return SINGLETON; } // To Json public JsonObject toJson(NavTree navTree) throws JsonException { JsonObject json = Json.createObject(); if (navTree != null) { json.put(NAV_TREE_ROOT_ITEMS, toJson(navTree.getRootItems())); } return json; } public JsonObject toJson(NavItem navItem) throws JsonException { JsonObject json = Json.createObject(); if (navItem != null) { json.put(NAV_ITEM_ID, navItem.getId()); json.put(NAV_ITEM_TYPE, navItem.getType().toString()); if (navItem.getType() != NavItem.Type.DIVIDER) { json.put(NAV_ITEM_NAME, navItem.getName()); json.put(NAV_ITEM_DESC, navItem.getDescription()); json.put(NAV_ITEM_MODIF, navItem.isModifiable()); json.put(NAV_ITEM_CTX, navItem.getContext()); if (navItem.getType() == NavItem.Type.GROUP) { json.put(NAV_GROUP_CHILDREN, toJson(((NavGroup) navItem).getChildren())); } } } return json; } public JsonArray toJson(List<NavItem> navItemList) throws JsonException { JsonArray json = Json.createArray(); if (navItemList != null) { for (int i=0; i<navItemList.size(); i++) { NavItem navItem = navItemList.get(i); json.set(i, toJson(navItem)); } } return json; } // From Json public NavTree fromJson(String jsonString) throws JsonException { if (jsonString == null || jsonString.trim().isEmpty()) { return null; } JsonObject json = Json.parse(jsonString); return fromJson(json); } public NavTree fromJson(JsonObject json) throws JsonException { if (json == null) { return null; } NavTree navTree = NavFactory.get().createNavTree(); for (int i = 0; i < json.size(); i++) { JsonArray rootItemArray = json.getArray(NAV_TREE_ROOT_ITEMS); parseNavItemArray(rootItemArray, navTree.getRootItems(), null); } return navTree; } private void parseNavItemArray(JsonArray json, List<NavItem> targetList, NavGroup parent) throws JsonException { if (json != null) { for (int i = 0; i < json.length(); i++) { NavItem navItem = parseNavItem(json.getObject(i)); if (navItem != null) { navItem.setParent(parent); targetList.add(navItem); } } } } private NavItem parseNavItem(JsonObject json) throws JsonException { if (json == null) { return null; } NavItem navItem = null; String type = json.getString(NAV_ITEM_TYPE); if (type == null) { throw new RuntimeException("Nav item type not specified"); } if (NavItem.Type.DIVIDER.toString().equals(type)) { navItem = NavFactory.get().createDivider(); } else if (NavItem.Type.GROUP.toString().equals(type)) { navItem = NavFactory.get().createNavGroup(); } else { navItem = NavFactory.get().createNavItem(); } String id = json.getString(NAV_ITEM_ID); if (id == null) { throw new RuntimeException("Nav item id not specified"); } String name = json.getString(NAV_ITEM_NAME); String desc = json.getString(NAV_ITEM_DESC); String modif = json.getString(NAV_ITEM_MODIF); String ctx = json.getString(NAV_ITEM_CTX); navItem.setId(id); navItem.setName(name); navItem.setDescription(desc); navItem.setModifiable(modif != null ? Boolean.parseBoolean(modif) : true); navItem.setContext(ctx); if (NavItem.Type.GROUP.toString().equals(type)) { JsonArray childrenArray = json.getArray(NAV_GROUP_CHILDREN); NavGroup navGroup = (NavGroup) navItem; parseNavItemArray(childrenArray, navGroup.getChildren(), navGroup); } return navItem; } }