Team:Freiburg software/Code/MenuItem.java
From 2009.igem.org
/* Copyright: synbiowave License: GPL Authors: Paul Staab Version: 0.1 DESCRIPTION: This class can be used do generate SynBioWave-Menus, to generate JSON-Strings out of it and menus back of JSON-String. Each item can contain options and recusivly other MenuItems later displayed as subitems. */ package org.synbiowave.menu; import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.json.simple.JSONObject; import org.json.simple.JSONValue; public class MenuItem { private LinkedHashMap<String, String> options = new LinkedHashMap<String, String>(); private List<MenuItem> subItemList = new ArrayList<MenuItem>(); /** * generates a menu from a JSONObject * @param JSON JSONObject * @throws Exception */ public MenuItem(JSONObject JSON) throws Exception { readJSON(JSON); } /** * generates a menu form a JSON-String * @param JSONString JSON-conform String * @throws Exception */ public MenuItem(String JSONString) throws Exception { readJSON(JSONString); } /** * generates a menu item * @param type Type of the menu item * @param label Label of the menu item */ public MenuItem(String type, String label, String key) { this.options.put("type", type); this.options.put("label", label); this.options.put("key", key + label); } /** * Returns a saved option of the menu item * @param key option like "type","label" or "key" * @return Value of the option */ public String getOption(String name) { return this.options.get(name); } public String setOption(String name, String value) { return this.options.put(name, value); } /** * Getter for the SubItems included in this menu item * @return */ public List<MenuItem> getSubItemList() { return this.subItemList; } /** * Creates a new Sub-MenuItem * @param type Type of the Sub-MenuItem * @param label Label of the Sub-MenuItem * @param key Key of the Sub-MenuItem; use generateKey(); * @return Sub-MenuItem */ public MenuItem createSubItem(String type, String label, String key) { MenuItem subitem = new MenuItem(type, label, key); subItemList.add(subitem); return subItemList.get(subItemList.lastIndexOf(subitem)); } /** * Adds a existing MenuItem as a SubItem to this MenuItem * @param menuItem the MenuItem a append * @return this */ public MenuItem appendSubItem(MenuItem menuItem) { this.subItemList.add(menuItem); return this; } /** * Removes all Sub-MenuItems */ public void removeAllSubItems() { subItemList.removeAll(subItemList); } /** * Adds all Sub-MenuItem of menu to this Menu Item * @param menu */ public void importMenu(MenuItem menu) { for (MenuItem importItem : menu.getSubItemList()) { boolean exists = false; for (MenuItem exisitingItem : this.getSubItemList()) { if (importItem.getOption("label").contentEquals(exisitingItem.getOption("label"))) { exisitingItem.importMenu(importItem); exists = true; continue; } } if ( ! exists ) { this.appendSubItem(importItem); } } } private void readJSON(String jsonText) throws Exception { jsonText = jsonText.replaceAll("'", "\""); Object obj = JSONValue.parse(jsonText); readJSON((JSONObject)obj); } private void readJSON(JSONObject JSON) throws Exception { Iterator<String> iterator1 = JSON.keySet().iterator(); while (iterator1.hasNext()) { String key = iterator1.next(); if ( JSON.get(key).getClass() == new String().getClass() ) { this.options.put(key, (String)JSON.get(key)); } else if ( JSON.get(key).getClass() == new JSONObject().getClass() ) { JSONObject subitem = (JSONObject)JSON.get(key); Iterator<Entry<String, JSONObject>> iterator2 = subitem.entrySet().iterator(); while( iterator2.hasNext() ) { Map.Entry<String, JSONObject> entry = iterator2.next(); MenuItem submenu = new MenuItem(entry.getValue()); this.subItemList.add(submenu); } } } } /** * Generates a JSON-String representing the Information of this MenuItem * @return JSON-String */ public String writeJson() { Map<String,String> obj = new LinkedHashMap<String, String>(); obj.putAll(options); if ( subItemList.size() > 0 ) { Map<String,String> obj2 = new LinkedHashMap<String, String>(); Iterator<MenuItem> iterator = subItemList.iterator(); while ( iterator.hasNext() ) { MenuItem next = iterator.next(); obj2.put(next.getOption("key"), next.writeJson() ); } obj.put("subitem", JSONValue.toJSONString(obj2)); } return repairJSON(JSONValue.toJSONString(obj)); } private String repairJSON(String JSON) { return JSON.replaceAll("\"", "'") //JSONStringer produces invalid JSON... .replaceAll("\\\\+", "") //with MUCH escaping like \\\\\\\\\\\\\\\\" .replaceAll("\\{\\'\\{", "\\{\\{") //and to much quotes ... .replaceAll("\\}\\'\\}", "\\}\\}") .replaceAll(":\\'\\{", ":\\{") .replaceAll("\\}\\'\\}", "\\}\\}") .replaceAll("\\}\\',", "\\},") .replaceAll("\\,\\'\\{", ",\\{"); } }