package gr.ntua.ivml.athena.mapping;
import java.util.ArrayList;
import java.util.Iterator;
import net.sf.json.*;
public class JSONMappingHandler {
JSONObject object = null;
JSONMappingHandler(JSONObject mapping) {
if(mapping == null) {
throw new NullPointerException();
} else {
this.object = mapping;
}
}
public String toString() {
return object.toString();
}
public boolean isTopLevelMapping()
{
if(object.has("template")) {
return true;
}
return false;
}
public boolean isElement()
{
if(object.has("name")) {
if(!object.getString("name").startsWith("@")) {
return true;
}
}
return false;
}
public boolean isAttribute()
{
if(object.has("name")) {
if(object.getString("name").startsWith("@")) {
return true;
}
}
return false;
}
public JSONObject getGroup(String name) {
if(object.has("groups")) {
JSONArray groups = object.getJSONArray("groups");
Iterator i = groups.iterator();
while(i.hasNext()) {
JSONObject group = (JSONObject) i.next();
if(group.has("element")) {
if(group.getString("element").compareTo(name) == 0) {
return group;
}
}
}
}
return null;
}
public JSONMappingHandler getGroupHandler(String name) {
JSONObject group = this.getGroup(name);
if(group != null) {
JSONObject contents = group.getJSONObject("contents");
return new JSONMappingHandler(contents);
}
return null;
}
public JSONArray getAttributes() {
if(object.has("attributes")) {
return object.getJSONArray("attributes");
}
return null;
}
public JSONArray getChildren() {
if(object.has("children")) {
return object.getJSONArray("children");
}
return null;
}
public void setString(String key, String value) {
object.element(key, value);
}
public void setObject(String key, JSONObject value) {
object.element(key, value);
}
public void setArray(String key, JSONArray value) {
object.element(key, value);
}
public String getString(String key) {
if(object.has(key)) {
return object.getString(key);
}
return null;
}
public String getOptString(String key) {
if(object.has(key)) {
return object.getString(key);
}
return "";
}
public JSONObject getObject(String key) {
if(object.has(key)) {
return object.getJSONObject(key);
}
return null;
}
public JSONMappingHandler getHandler(String key) {
if(object.has(key)) {
return new JSONMappingHandler(object.getJSONObject(key));
}
return null;
}
public JSONArray getArray(String key) {
if(object.has(key)) {
return object.getJSONArray(key);
}
return null;
}
public ArrayList<JSONMappingHandler> getHandlersForPath(String path) {
if(this.isTopLevelMapping()) {
if(path.startsWith("/")) { path = path.replaceFirst("/", ""); }
String[] tokens = path.split("/", 2);
if(tokens.length > 0) {
JSONObject group = this.getGroup(tokens[0]);
if(group != null) {
JSONObject contents = group.getJSONObject("contents");
return JSONMappingHandler.getHandlersForPath(contents, path);
}
}
} else {
return JSONMappingHandler.getHandlersForPath(object, path);
}
return new ArrayList<JSONMappingHandler>();
}
private static ArrayList<JSONMappingHandler> getHandlersForPath(JSONObject object, String path) {
ArrayList<JSONMappingHandler> result = new ArrayList<JSONMappingHandler>();
if(path.startsWith("/")) { path = path.replaceFirst("/", ""); }
String[] tokens = path.split("/", 2);
if(tokens.length > 0) {
if(object.has("name")) {
if(tokens[0].equals(object.getString("name"))) {
if(tokens.length == 1) {
result.add(new JSONMappingHandler(object));
} else {
String tail = tokens[1];
if(tail.startsWith("@")) {
if(object.has("attributes")) {
return JSONMappingHandler.getHandlersForPath(object.getJSONArray("attributes"), tail);
}
} else {
if(object.has("children")) {
return JSONMappingHandler.getHandlersForPath(object.getJSONArray("children"), tail);
}
}
}
}
}
}
return result;
}
private static ArrayList<JSONMappingHandler> getHandlersForPath(JSONArray array, String path) {
ArrayList<JSONMappingHandler> result = new ArrayList<JSONMappingHandler>();
Iterator i = array.iterator();
while(i.hasNext()) {
JSONObject o = (JSONObject) i.next();
result.addAll(JSONMappingHandler.getHandlersForPath(o, path));
}
return result;
}
public ArrayList<JSONMappingHandler> getHandlersForName(String name) {
ArrayList<JSONMappingHandler> result = new ArrayList<JSONMappingHandler>();
if(this.isTopLevelMapping()) {
JSONArray groups = object.getJSONArray("groups");
Iterator i = groups.iterator();
while(i.hasNext()) {
JSONObject group = (JSONObject) i.next();
JSONObject contents = group.getJSONObject("contents");
result.addAll(JSONMappingHandler.getHandlersForName(contents, name));
}
} else {
if(this.getOptString("name").compareTo(name) == 0) {
result.add(this);
}
result.addAll(JSONMappingHandler.getHandlersForName(this.getAttributes(), name));
result.addAll(JSONMappingHandler.getHandlersForName(this.getChildren(), name));
}
return result;
}
private static ArrayList<JSONMappingHandler> getHandlersForName(JSONObject object, String name) {
return new JSONMappingHandler(object).getHandlersForName(name);
}
private static ArrayList<JSONMappingHandler> getHandlersForName(JSONArray array, String name) {
ArrayList<JSONMappingHandler> result = new ArrayList<JSONMappingHandler>();
if(array != null) {
Iterator i = array.iterator();
while(i.hasNext()) {
JSONObject o = (JSONObject) i.next();
result.addAll(JSONMappingHandler.getHandlersForName(o, name));
}
}
return result;
}
}