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("\\,\\'\\{", ",\\{");
}
}