diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/json/JsonObject.java @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/json/JsonObject.java	Tue Mar 18 16:23:26 2025 -0400
@@ -0,0 +1,371 @@
+package json;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+
+import structures.ByteBuilder;
+
+public class JsonObject {
+
+	public static void main(String[] args){
+		JsonObject bob=new JsonObject("name", "bob");
+		JsonObject joe=new JsonObject("name", "joe");
+		JsonObject sue=new JsonObject("name", "sue");
+		JsonObject dan=new JsonObject("name", "dan");
+		bob.add("joe", joe, true);
+		bob.add("sue", sue, true);
+		joe.add("dan", dan, true);
+		bob.add("a",1, true);
+		bob.add("b",2, true);
+		bob.add("c","3", true);
+		bob.add("a","4", true);
+		dan.add("e",5, true);
+		dan.add("f","6", true);
+		sue.add("g","7", true);
+
+		System.out.println("dan:\n"+dan);
+		System.out.println("sue:\n"+sue);
+		System.out.println("joe:\n"+joe);
+		System.out.println("bob:\n"+bob);
+		
+		ArrayList<JsonObject> list=new ArrayList<JsonObject>();
+		list.add(joe);
+		list.add(sue);
+		list.add(dan);
+		System.out.println("list:\n"+toString(list));
+	}
+	
+	public JsonObject(){}
+	
+	public JsonObject(String key, Object value){
+		add(key, value, true);
+	}
+	
+//	public JsonObject(String name_){
+//		name=name_;
+//	}
+//	
+//	public JsonObject(String name_, String key, Object value){
+//		name=name_;
+//		add(key, value);
+//	}
+
+	/** Adds a formatted value with specified decimal places */
+	public void addLiteral(String key0, double value, int decimals){
+		if(omap==null){omap=new LinkedHashMap<String, Object>(8);}
+		omap.put(key0, new JsonLiteral(value, decimals));
+	}
+
+	/** Does not add quotes for strings.
+	 * This method should be used with caution as it can produce incorrectly formatted files. */
+	public void addLiteral(String key0, String value){
+		if(omap==null){omap=new LinkedHashMap<String, Object>(8);}
+		omap.put(key0, new JsonLiteral(value));
+	}
+
+	public void add(String key0, Object value){add(key0, value, true);}
+	public void addAndRename(String key0, Object value){add(key0, value, false);}
+
+	private void add(String key0, Object value, boolean replace){
+		if(value!=null && value.getClass()==JsonObject.class){
+			add(key0, (JsonObject)value, replace);
+			return;
+		}
+		int x=2;
+		String key=key0;
+		if(omap==null){omap=new LinkedHashMap<String, Object>(8);}
+		while(!replace && omap.containsKey(key)){
+			key=key0+" "+x;
+			x++;
+		}
+		omap.put(key, value);
+	}
+
+	public void add(String key0, JsonObject value){add(key0, value, true);}
+	public void addAndRename(String key0, JsonObject value){add(key0, value, false);}
+
+	private void add(final String key0, JsonObject value, boolean replace){
+		int x=2;
+		String key=key0;
+		if(jmap==null){jmap=new LinkedHashMap<String, JsonObject>(8);}
+		while(!replace && jmap.containsKey(key)){
+			key=key0+" "+x;
+			x++;
+		}
+		jmap.put(key, value);
+	}
+	
+	public static String toString(ArrayList<JsonObject> list) {
+		ByteBuilder sb=new ByteBuilder();
+		int commas=list.size()-1;
+		for(JsonObject j : list){
+			j.append(0, sb, false);
+			if(commas>0){
+				sb.append(",\n");
+			}
+			commas--;
+		}
+		return sb.toString();
+	}
+	
+	public ByteBuilder toText(){
+		return toText(null, 0, false);
+	}
+	
+	public ByteBuilder toText(ByteBuilder sb, int level, boolean inArray){
+		if(sb==null){sb=new ByteBuilder();}
+		append(level, sb, inArray);
+		return sb;
+	}
+	
+	public String toString(String name){
+		ByteBuilder sb=new ByteBuilder();
+		sb.append('{').append('\n');
+		for(int i=0; i<padmult; i++){sb.append(' ');}
+		sb.append('"').append(name).append('"').append(':').append(' ');
+		toText(sb, 1, false);
+		sb.append('\n').append('}');
+		return sb.toString();
+	}
+	
+	public static String toString(Object[] array){
+		ByteBuilder sb=new ByteBuilder();
+		appendArray(sb, array, 0);
+		return sb.toString();
+	}
+	
+	@Override
+	public String toString(){
+		return toText(null, 0, false).toString();
+	}
+	
+	public String toStringln(){
+		return toText(null, 0, false).nl().toString();
+	}
+	
+	public void append(int level, ByteBuilder sb, boolean inArray){
+		int pad=padmult*level;
+		int pad2=padmult*(level+1);
+		
+		sb.append('{');
+		if(!inArray){sb.append('\n');}
+		
+		int commas=(omap==null ? 0 : omap.size())+(jmap==null ? 0 : jmap.size())-1;
+		
+		if(omap!=null){
+			for(Entry<String, Object> e : omap.entrySet()){
+				String key=e.getKey();
+				Object value=e.getValue();
+				if(!inArray){for(int i=0; i<pad2; i++){sb.append(' ');}}
+				
+				appendEntry(sb, key, value, level, inArray);
+
+				if(commas>0){sb.append(',');}
+				if(!inArray){sb.append('\n');}
+				commas--;
+			}
+		}
+		
+		if(jmap!=null){
+			for(Entry<String, JsonObject> e : jmap.entrySet()){
+				String key=e.getKey();
+				JsonObject value=e.getValue();
+				if(!inArray){for(int i=0; i<pad2; i++){sb.append(' ');}}
+				appendKey(sb, key);
+				
+				value.append(level+(inArray ? 0 : 1), sb, inArray);
+				if(commas>0){sb.append(',');}
+				if(!inArray){sb.append('\n');}
+				commas--;
+			}
+		}
+		
+		if(!inArray){for(int i=0; i<pad; i++){sb.append(' ');}}
+		sb.append('}');
+	}
+	
+	private static void appendEntry(ByteBuilder sb, String key, Object value, int level, boolean inArray){
+		appendKey(sb, key);
+		appendValue(sb, value, level, inArray);
+	}
+	
+	private static void appendKey(ByteBuilder sb, String key){
+		sb.append('"').append(key).append("\": ");
+	}
+	
+	private static void appendValue(ByteBuilder sb, Object value, int level, boolean inArray){
+		final Class<?> c=(value==null ? null : value.getClass());
+		if(c==null || value==null){
+			sb.append("null");
+		}else if(c==String.class){
+			sb.append("\"").append(value.toString()).append('"');
+		}else if(c==JsonLiteral.class){
+			sb.append(((JsonLiteral)value).toString());
+		}else if(c==Double.class && restictDecimals>=0){
+			sb.append(((Double)value).doubleValue(), restictDecimals);
+		}else if(c==Float.class && restictDecimals>=0){
+			sb.append(((Float)value).floatValue(), restictDecimals);
+		}else if(c==JsonObject.class){
+			((JsonObject)value).append(level+(inArray ? 0 : 1), sb, inArray);
+		}else if(c.isArray()){
+			appendArray(sb, (Object[])value, level);
+		}else if(c==Boolean.class || value instanceof Number){//long, int, boolean
+			sb.append(value.toString());
+		}else if(value instanceof Collection){
+			appendCollection(sb, (Collection<?>)value, level);
+		}else{//Default behavior for unhandled classes
+			sb.append("\"").append(value.toString()).append('"');
+		}
+	}
+	
+	private static void appendArray(ByteBuilder sb, Object[] array, int level){
+		int commas=(array==null ? 0 : array.length)-1;
+		sb.append('[');
+		if(array!=null){
+			for(Object value : array){
+				appendValue(sb, value, level, noNewlinesInArrays);
+				if(commas>0){sb.append(',').append(' ');}
+				commas--;
+			}
+		}
+		sb.append(']');
+	}
+	
+	private static void appendCollection(ByteBuilder sb, Collection<?> stuff, int level){
+		int commas=(stuff==null ? 0 : stuff.size())-1;
+		sb.append('[');
+		if(stuff!=null){
+			for(Object value : stuff){
+				appendValue(sb, value, level, noNewlinesInArrays);
+				if(commas>0){sb.append(',').append(' ');}
+				commas--;
+			}
+		}
+		sb.append(']');
+	}
+
+	public String getString(String key){
+		if(omap==null){return null;}
+		Object o=omap.get(key);
+		if(o==null){return null;}
+		assert(o.getClass()==String.class) : "Wrong class: "+o.getClass()+"\n"+o;
+		return (String)o;
+	}
+
+	public Long getLong(String key){
+		if(omap==null){return null;}
+		Object o=omap.get(key);
+		if(o==null){return null;}
+		assert(o.getClass()==Long.class) : "Wrong class: "+o.getClass()+"\n"+o;
+		return (Long)o;
+	}
+
+	public Integer getInt(String key){
+		assert(omap!=null);
+		Object o=omap.get(key);
+//		assert(o!=null);
+		assert(o==null || o.getClass()==Integer.class) : "Wrong class: "+o.getClass()+"\n"+o;
+//		long x=((Long)o).longValue();
+//		assert(x>=Integer.MIN_VALUE && x<=Integer.MAX_VALUE);
+//		return (int)x;
+		return (Integer)o;
+	}
+	
+	public boolean containsKey(String key){
+		if(omap!=null && omap.containsKey(key)){return true;}
+		if(jmap!=null && jmap.containsKey(key)){return true;}
+		return false;
+	}
+
+//	public Double getDouble(String key){
+//		if(smap==null){return null;}
+//		Object o=smap.get(key);
+//		if(o==null){return null;}
+//		assert(o.getClass()==Double.class) : "Wrong class: "+o.getClass()+"\n"+o;
+//		return (Double)o;
+//	}
+
+	public Double getDouble(String key){
+		if(omap==null){return null;}
+		Object o=omap.get(key);
+		if(o==null){return null;}
+		if(o.getClass()==Long.class){
+			return ((Long)o).doubleValue();
+		}
+		assert(o.getClass()==Double.class) : "Wrong class: "+o.getClass()+"\n"+o;
+		return (Double)o;
+	}
+
+	public Number getNumber(String key){
+		if(omap==null){return null;}
+		Object o=omap.get(key);
+		if(o==null){return null;}
+		Class<?> c=o.getClass();
+		assert(c==Double.class || c==Long.class || c==Integer.class || c==Float.class) : "Wrong class: "+c+"\n"+o;
+		return (Number)o;
+	}
+
+	public Object[] getArray(String key){
+		if(omap==null){return null;}
+		Object o=omap.get(key);
+		if(o==null){return null;}
+		assert(o.getClass()==Object[].class) : "Wrong class: "+o.getClass()+"\n"+o;
+		return (Object[])o;
+	}
+
+	public JsonObject getJson(String key){
+		if(jmap==null){return null;}
+		return jmap.get(key);
+	}
+
+	public JsonObject removeJson(String key){
+		if(jmap==null){return null;}
+		return jmap.remove(key);
+	}
+
+	public Object removeObject(String key){
+		if(omap==null){return null;}
+		return omap.remove(key);
+	}
+
+	public void clearJson(){
+		jmap=null;
+	}
+
+	public void clearOmap(){
+		omap=null;
+	}
+	
+	public Object[] toJmapArray() {
+		if(jmap==null){return null;}
+		Object[] array=new Object[jmapSize()];
+		int i=0;
+		for(Entry<String, JsonObject> e : jmap.entrySet()){
+			array[i]=e.getValue();
+			i++;
+		}
+		return array;
+	}
+	
+	public int jmapSize(){return jmap==null ? 0 : jmap.size();}
+	public int omapSize(){return omap==null ? 0 : omap.size();}
+	
+//	public String name;
+	public LinkedHashMap<String, Object> omap;
+	public LinkedHashMap<String, JsonObject> jmap;
+
+	private static int restictDecimals=-1;
+	private static String decimalFormat="%."+restictDecimals+"f";
+	public static synchronized void setDecimals(int d){
+		if(d!=restictDecimals){
+			d=restictDecimals;
+			decimalFormat="%."+restictDecimals+"f";
+		}
+	}
+	
+	public static final int padmult=3;
+	public static boolean noNewlinesInArrays=false;
+	
+}