All Downloads are FREE. Search and download functionalities are using the official Maven repository.

aQute.lib.json.StringHandler Maven / Gradle / Ivy

Go to download

A main program (executable JAR) that will listen to port 29998. At first, it can only answer that it is an Envoy (a limited agent). The only function it supports is installing a -runpath. It will then create a framework + agent and transfer the connection to the just installed agent who will then install the bundles. This JAR is a main command for JPM called bndremote. In JPM, it will start up with debug enabled. This JAR does some highly complicated class loading wizardy to ensure that it does not enforce any constraints on the -runpath.

The newest version!
package aQute.lib.json;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.Map;

public class StringHandler extends Handler {

	@Override
	public void encode(Encoder app, Object object, Map visited) throws IOException {
		string(app, object.toString());
	}

	static void string(Appendable app, String s) throws IOException {

		app.append('"');
		for (int i = 0; i < s.length(); i++) {
			char c = s.charAt(i);
			switch (c) {
				case '"' :
					app.append("\\\"");
					break;

				case '\\' :
					app.append("\\\\");
					break;

				case '\b' :
					app.append("\\b");
					break;

				case '\f' :
					app.append("\\f");
					break;

				case '\n' :
					app.append("\\n");
					break;

				case '\r' :
					app.append("\\r");
					break;

				case '\t' :
					app.append("\\t");
					break;

				default :
					if (Character.isISOControl(c)) {
						app.append("\\u");
						app.append("0123456789ABCDEF".charAt(0xF & (c >> 12)));
						app.append("0123456789ABCDEF".charAt(0xF & (c >> 8)));
						app.append("0123456789ABCDEF".charAt(0xF & (c >> 4)));
						app.append("0123456789ABCDEF".charAt(0xF & (c >> 0)));
					} else
						app.append(c);
			}
		}
		app.append('"');
	}

	@Override
	public Object decode(Decoder dec, String s) throws Exception {
		return s;
	}

	@Override
	public Object decode(Decoder dec, Number s) {
		return s.toString();
	}

	@Override
	public Object decode(Decoder dec, boolean s) {
		return Boolean.toString(s);
	}

	@Override
	public Object decode(Decoder dec) {
		return null;
	}

	/**
	 * An object can be assigned to a string. This means that the stream is
	 * interpreted as the object but stored in its complete in the string.
	 */
	@Override
	public Object decodeObject(Decoder r) throws Exception {
		return collect(r, '}');
	}

	/**
	 * An array can be assigned to a string. This means that the stream is
	 * interpreted as the array but stored in its complete in the string.
	 */
	@Override
	public Object decodeArray(Decoder r) throws Exception {
		return collect(r, ']');
	}

	/**
	 * Gather the input until you find the the closing character making sure
	 * that new blocks are are take care of.
	 * 

* This method parses the input for a complete block so that it can be * stored in a string. This allows envelopes. */ private Object collect(Decoder isr, @SuppressWarnings("unused") char close) throws Exception { boolean instring = false; int level = 1; StringBuilder sb = new StringBuilder(); int c = isr.current(); while (c > 0 && level > 0) { sb.append((char) c); if (instring) switch (c) { case '"' : instring = true; break; case '[' : case '{' : level++; break; case ']' : case '}' : level--; break; } else switch (c) { case '"' : instring = false; break; case '\\' : sb.append((char) isr.read()); break; } c = isr.read(); } return sb.toString(); } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy