You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@juneau.apache.org by ja...@apache.org on 2016/08/01 15:49:20 UTC

[02/51] [partial] incubator-juneau git commit: Merge changes from GitHub repo.

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.java
deleted file mode 100755
index 3050209..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ProcBuilder.java
+++ /dev/null
@@ -1,382 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-import java.io.*;
-import java.lang.reflect.*;
-import java.util.*;
-import java.util.logging.*;
-
-import com.ibm.juno.core.utils.IOPipe.LineProcessor;
-
-/**
- * Utility class for running operating system processes.
- * <p>
- * Similar to {@link java.lang.ProcessBuilder} but with additional features.
- *
- * @author James Bognar (jbognar@us.ibm.com)
- */
-@SuppressWarnings("hiding")
-public class ProcBuilder {
-
-	private java.lang.ProcessBuilder pb = new java.lang.ProcessBuilder();
-	private TeeWriter outWriters = new TeeWriter(), logWriters = new TeeWriter();
-	private LineProcessor lp;
-	private Process p;
-	private int maxExitStatus = 0;
-	private boolean byLines;
-	private String divider = "--------------------------------------------------------------------------------";
-
-	/**
-	 * Creates a process builder with the specified arguments.
-	 * Equivalent to calling <code>ProcessBuilder.create().command(args);</code>
-	 *
-	 * @param args The command-line arguments.
-	 * @return A new process builder.
-	 */
-	public static ProcBuilder create(Object...args) {
-		return new ProcBuilder().command(args);
-	}
-
-	/**
-	 * Creates an empty process builder.
-	 *
-	 * @return A new process builder.
-	 */
-	public static ProcBuilder create() {
-		return new ProcBuilder().command();
-	}
-
-	/**
-	 * Command arguments.
-	 * Arguments can be collections or arrays and will be automatically expanded.
-	 *
-	 * @param args The command-line arguments.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder command(Object...args) {
-		return commandIf(ANY, args);
-	}
-
-	/**
-	 * Command arguments if the specified matcher matches.
-	 * Can be used for specifying os-specific commands.
-	 * Example:
-	 * <p class='bcode'>
-	 * 	ProcessBuilder pb = ProcessBuilder
-	 * 		.create()
-	 * 		.commandIf(<jsf>WINDOWS</jsf>, <js>"cmd /c dir"</js>)
-	 * 		.commandIf(<jsf>UNIX</jsf>, <js>"bash -c ls"</js>)
-	 * 		.merge()
-	 * 		.execute();
-	 * </p>
-	 *
-	 * @param m The matcher.
-	 * @param args The command line arguments if matcher matches.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder commandIf(Matcher m, Object...args) {
-		if (m.matches())
-			pb.command(toList(args));
-		return this;
-	}
-
-	/**
-	 * Append to the command arguments.
-	 * Arguments can be collections or arrays and will be automatically expanded.
-	 *
-	 * @param args The command-line arguments.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder append(Object...args) {
-		return appendIf(ANY, args);
-	}
-
-	/**
-	 * Append to the command arguments if the specified matcher matches.
-	 * Arguments can be collections or arrays and will be automatically expanded.
-	 *
-	 * @param m The matcher.
-	 * @param args The command line arguments if matcher matches.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder appendIf(Matcher m, Object...args) {
-		if (m.matches())
-			pb.command().addAll(toList(args));
-		return this;
-	}
-
-	/**
-	 * Merge STDOUT and STDERR into a single stream.
-	 *
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder merge() {
-		pb.redirectErrorStream(true);
-		return this;
-	}
-
-	/**
-	 * Use by-lines mode.
-	 * Flushes output after every line of input.
-	 *
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder byLines() {
-		this.byLines = true;
-		return this;
-	}
-
-	/**
-	 * Pipe output to the specified writer.
-	 * The method can be called multiple times to write to multiple writers.
-	 *
-	 * @param w The writer to pipe to.
-	 * @param close Close the writer afterwards.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder pipeTo(Writer w, boolean close) {
-		this.outWriters.add(w, close);
-		return this;
-	}
-
-	/**
-	 * Pipe output to the specified writer, but don't close the writer.
-	 *
-	 * @param w The writer to pipe to.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder pipeTo(Writer w) {
-		return pipeTo(w, false);
-	}
-
-	/**
-	 * Pipe output to the specified writer, including the command and return code.
-	 * The method can be called multiple times to write to multiple writers.
-	 *
-	 * @param w The writer to pipe to.
-	 * @param close Close the writer afterwards.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder logTo(Writer w, boolean close) {
-		this.logWriters.add(w, close);
-		this.outWriters.add(w, close);
-		return this;
-	}
-
-	/**
-	 * Pipe output to the specified writer, including the command and return code.
-	 * The method can be called multiple times to write to multiple writers.
-	 * Don't close the writer afterwards.
-	 *
-	 * @param w The writer to pipe to.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder logTo(Writer w) {
-		return logTo(w, false);
-	}
-
-	/**
-	 * Pipe output to the specified writer, including the command and return code.
-	 * The method can be called multiple times to write to multiple writers.
-	 *
-	 * @param level The log level.
-	 * @param logger The logger to log to.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder logTo(final Level level, final Logger logger) {
-		if (logger.isLoggable(level)) {
-			logTo(new StringWriter() {
-				private boolean isClosed;  // Prevents messages from being written twice.
-				@Override /* Writer */
-				public void close() {
-					if (! isClosed)
-						logger.log(level, this.toString());
-					isClosed = true;
-				}
-			}, true);
-		}
-		return this;
-	}
-
-	/**
-	 * Line processor to use to process/convert lines of output returned by the process.
-	 *
-	 * @param lp The new line processor.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder lp(LineProcessor lp) {
-		this.lp = lp;
-		return this;
-	}
-
-	/**
-	 * Append the specified environment variables to the process.
-	 *
-	 * @param env The new set of environment variables.
-	 * @return This object (for method chaining).
-	 */
-	@SuppressWarnings({"rawtypes", "unchecked"})
-	public ProcBuilder env(Map env) {
-		if (env != null)
-		for (Map.Entry e : (Set<Map.Entry>)env.entrySet())
-			environment(e.getKey().toString(), e.getValue() == null ? null : e.getValue().toString());
-		return this;
-	}
-
-	/**
-	 * Append the specified environment variable.
-	 *
-	 * @param key The environment variable name.
-	 * @param val The environment variable value.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder environment(String key, String val) {
-		pb.environment().put(key, val);
-		return this;
-	}
-
-	/**
-	 * Sets the directory where the command will be executed.
-	 *
-	 * @param directory The directory.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder directory(File directory) {
-		pb.directory(directory);
-		return this;
-	}
-
-	/**
-	 * Sets the maximum allowed return code on the process call.
-	 * If the return code exceeds this value, an IOException is returned on the {@link #run()} command.
-	 * The default value is '0'.
-	 *
-	 * @param maxExitStatus The maximum exit status.
-	 * @return This object (for method chaining).
-	 */
-	public ProcBuilder maxExitStatus(int maxExitStatus) {
-		this.maxExitStatus = maxExitStatus;
-		return this;
-	}
-
-	/**
-	 * Run this command and pipes the output to the specified writer or output stream.
-	 *
-	 * @return The exit code from the process.
-	 * @throws IOException
-	 * @throws InterruptedException
-	 */
-	public int run() throws IOException, InterruptedException {
-		if (pb.command().size() == 0)
-			throw new IOException("No command specified in ProcBuilder.");
-		try {
-			logWriters.append(divider).append("\n").flush();
-			logWriters.append(StringUtils.join(pb.command(), " ")).append("\n").flush();
-				p = pb.start();
-			IOPipe.create(p.getInputStream(), outWriters).lineProcessor(lp).byLines(byLines).run();
-			int rc = p.waitFor();
-			logWriters.append("Exit: ").append(String.valueOf(p.exitValue())).append("\n").flush();
-			if (rc > maxExitStatus)
-				throw new IOException("Return code "+rc+" from command " + StringUtils.join(pb.command(), " "));
-			return rc;
-		} finally {
-			close();
-		}
-	}
-
-	/**
-	 * Run this command and returns the output as a simple string.
-	 *
-	 * @return The output from the command.
-	 * @throws IOException
-	 * @throws InterruptedException
-	 */
-	public String getOutput() throws IOException, InterruptedException {
-		StringWriter sw = new StringWriter();
-		pipeTo(sw).run();
-		return sw.toString();
-	}
-
-	/**
-	 * Returns the output from this process as a {@link Scanner}.
-	 *
-	 * @return The output from the process as a Scanner object.
-	 * @throws IOException
-	 * @throws InterruptedException
-	 */
-	public Scanner getScanner() throws IOException, InterruptedException {
-		StringWriter sw = new StringWriter();
-		pipeTo(sw, true);
-		run();
-		return new Scanner(sw.toString());
-	}
-
-	/**
-	 * Destroys the underlying process.
-	 * This method is only needed if the {@link #getScanner()} method was used.
-	 */
-	private void close() {
-		IOUtils.closeQuietly(logWriters, outWriters);
-		if (p != null)
-			p.destroy();
-	}
-
-	/**
-	 * Specifies interface for defining OS-specific commands.
-	 */
-	public abstract static class Matcher {
-		abstract boolean matches();
-	}
-
-	private static String OS = System.getProperty("os.name").toLowerCase();
-
-	/** Operating system matcher: Any operating system. */
-	public final static Matcher ANY = new Matcher() {
-			@Override boolean matches() {
-				return true;
-			}
-	};
-
-	/** Operating system matcher: Any Windows system. */
-	public final static Matcher WINDOWS = new Matcher() {
-			@Override boolean matches() {
-				return OS.indexOf("win") >= 0;
-			}
-	};
-
-	/** Operating system matcher: Any Mac system. */
-	public final static Matcher MAC = new Matcher() {
-			@Override boolean matches() {
-				return OS.indexOf("mac") >= 0;
-			}
-	};
-
-	/** Operating system matcher: Any Unix or Linux system. */
-	public final static Matcher UNIX = new Matcher() {
-			@Override boolean matches() {
-				return OS.indexOf("nix") >= 0 || OS.indexOf("nux") >= 0 || OS.indexOf("aix") > 0;
-			}
-	};
-
-	private static List<String> toList(Object...args) {
-		List<String> l = new LinkedList<String>();
-		for (Object o : args) {
-			if (o.getClass().isArray())
-				for (int i = 0; i < Array.getLength(o); i++)
-					l.add(Array.get(o, i).toString());
-			else if (o instanceof Collection)
-				for (Object o2 : (Collection<?>)o)
-					l.add(o2.toString());
-			else
-				l.add(o.toString());
-		}
-		return l;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.class
deleted file mode 100755
index 2088152..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.java
deleted file mode 100755
index b8ddc56..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/ReflectionUtils.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-import static com.ibm.juno.core.utils.CollectionUtils.*;
-
-import java.io.*;
-import java.lang.annotation.*;
-import java.util.*;
-
-/**
- * Reflection utilities.
- *
- * @author James Bognar (jbognar@us.ibm.com)
- */
-public final class ReflectionUtils {
-
-	/**
-	 * Similar to {@link Class#getAnnotation(Class)} except also searches annotations on interfaces.
-	 *
-	 * @param <T> The annotation class type.
-	 * @param a The annotation class.
-	 * @param c The annotated class.
-	 * @return The annotation, or <jk>null</jk> if not found.
-	 */
-	public static <T extends Annotation> T getAnnotation(Class<T> a, Class<?> c) {
-		if (c == null)
-			return null;
-
-		T t = getDeclaredAnnotation(a, c);
-		if (t != null)
-			return t;
-
-		t = getAnnotation(a, c.getSuperclass());
-		if (t != null)
-			return t;
-
-		for (Class<?> c2 : c.getInterfaces()) {
-			t = getAnnotation(a, c2);
-			if (t != null)
-				return t;
-		}
-		return null;
-	}
-
-	/**
-	 * Returns the specified annotation only if it's been declared on the specified class.
-	 * <p>
-	 * 	More efficient than calling {@link Class#getAnnotation(Class)} since it doesn't
-	 * 	recursively look for the class up the parent chain.
-	 *
-	 * @param <T> The annotation class type.
-	 * @param a The annotation class.
-	 * @param c The annotated class.
-	 * @return The annotation, or <jk>null</jk> if not found.
-	 */
-	@SuppressWarnings("unchecked")
-	public static <T extends Annotation> T getDeclaredAnnotation(Class<T> a, Class<?> c) {
-		for (Annotation a2 : c.getDeclaredAnnotations())
-			if (a2.annotationType() == a)
-				return (T)a2;
-		return null;
-	}
-
-	/**
-	 * Returns all instances of the specified annotation on the specified class.
-	 * <p>
-	 * Searches all superclasses and superinterfaces.
-	 * <p>
-	 * Results are ordered child-to-parent.
-	 *
-	 * @param <T> The annotation class type.
-	 * @param a The annotation class type.
-	 * @param c The class being searched.
-	 * @return The found matches, or an empty array if annotation was not found.
-	 */
-	public static <T extends Annotation> List<T> findAnnotations(Class<T> a, Class<?> c) {
-		List<T> l = new LinkedList<T>();
-		appendAnnotations(a, c, l);
-		return l;
-	}
-
-	/**
-	 * Sames as {@link #findAnnotations(Class, Class)} except returns the annotations as a map
-	 * with the keys being the class on which the annotation was found.
-	 * <p>
-	 * Results are ordered child-to-parent.
-	 *
-	 * @param <T> The annotation class type.
-	 * @param a The annotation class type.
-	 * @param c The class being searched.
-	 * @return The found matches, or an empty array if annotation was not found.
-	 */
-	public static <T extends Annotation> LinkedHashMap<Class<?>,T> findAnnotationsMap(Class<T> a, Class<?> c) {
-		LinkedHashMap<Class<?>,T> m = new LinkedHashMap<Class<?>,T>();
-		findAnnotationsMap(a, c, m);
-		return m;
-	}
-
-	private static <T extends Annotation> void findAnnotationsMap(Class<T> a, Class<?> c, Map<Class<?>,T> m) {
-		if (c == null)
-			return;
-
-		T t = getDeclaredAnnotation(a, c);
-		if (t != null)
-			m.put(c, t);
-
-		findAnnotationsMap(a, c.getSuperclass(), m);
-
-		for (Class<?> c2 : c.getInterfaces())
-			findAnnotationsMap(a, c2, m);
-	}
-
-	/**
-	 * Finds and appends the specified annotation on the specified class and superclasses/interfaces to the specified list.
-	 *
-	 * @param a The annotation.
-	 * @param c The class.
-	 * @param l The list of annotations.
-	 */
-	public static <T extends Annotation> void appendAnnotations(Class<T> a, Class<?> c, List<T> l) {
-		if (c == null)
-			return;
-
-		addIfNotNull(l, getDeclaredAnnotation(a, c));
-
-		if (c.getPackage() != null)
-			addIfNotNull(l, c.getPackage().getAnnotation(a));
-
-		appendAnnotations(a, c.getSuperclass(), l);
-
-		for (Class<?> c2 : c.getInterfaces())
-			appendAnnotations(a, c2, l);
-	}
-
-	/**
-	 * Similar to {@link Class#getResourceAsStream(String)} except looks up the
-	 * parent hierarchy for the existence of the specified resource.
-	 *
-	 * @param c The class to return the resource on.
-	 * @param name The resource name.
-	 * @return An input stream on the specified resource, or <jk>null</jk> if the resource could not be found.
-	 */
-	public static InputStream getResource(Class<?> c, String name) {
-		while (c != null) {
-			InputStream is = c.getResourceAsStream(name);
-			if (is != null)
-				return is;
-			c = c.getSuperclass();
-		}
-		return null;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.class
deleted file mode 100755
index 5509806..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.java
deleted file mode 100755
index a19a76d..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceBundle.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-import java.text.*;
-import java.util.*;
-
-/**
- * Wraps a {@link ResourceBundle} to gracefully handle missing bundles and entries.
- * <p>
- * If the bundle isn't found, <code>getString(key)</code> returns <js>"{!!key}"</js>.
- * <p>
- * If the key isn't found, <code>getString(key)</code> returns <js>"{!key}"</js>.
- *
- * @author James Bognar (jbognar@us.ibm.com)
- */
-public class SafeResourceBundle extends ResourceBundle {
-
-	private ResourceBundle rb;
-	private String className = null;
-	Map<String,String> classPrefixedKeys = new HashMap<String,String>();
-
-	SafeResourceBundle() {}
-
-	/**
-	 * Constructor.
-	 *
-	 * @param rb The resource bundle to wrap.  Can be <jk>null</jk> to indicate a missing bundle.
-	 * @param forClass The class using this resource bundle.
-	 */
-	public SafeResourceBundle(ResourceBundle rb, Class<?> forClass) {
-		this.rb = rb;
-		if (forClass != null)
-			className = forClass.getSimpleName();
-		if (rb != null) {
-			String c = className + '.';
-			for (Enumeration<String> e = getKeys(); e.hasMoreElements();) {
-				String key = e.nextElement();
-				if (key.startsWith(c))
-					classPrefixedKeys.put(key.substring(className.length() + 1), key);
-			}
-		}
-	}
-
-	@Override /* ResourceBundle */
-	public boolean containsKey(String key) {
-		return rb != null && (rb.containsKey(key) || classPrefixedKeys.containsKey(key));
-	}
-
-	/**
-	 * Similar to {@link ResourceBundle#getString(String)} except allows you to pass in {@link MessageFormat} objects.
-	 *
-	 * @param key The resource bundle key.
-	 * @param args Optional variable replacement arguments.
-	 * @return The resolved value.  Never <jk>null</jk>.  <js>"{!!key}"</j> if the bundle is missing.  <js>"{!key}"</j> if the key is missing.
-	 */
-	public String getString(String key, Object...args) {
-		if (rb == null)
-			return "{!!"+key+"}";
-		if (! containsKey(key))
-			return "{!" + key + "}";
-		String val = getString(key);
-		if (args.length > 0)
-			return MessageFormat.format(val, args);
-		return val;
-	}
-
-	/**
-	 * Looks for all the specified keys in the resource bundle and returns the first value that exists.
-	 *
-	 * @param keys
-	 * @return The resolved value, or <jk>null</jk> if no value is found or the resource bundle is missing.
-	 */
-	public String findFirstString(String...keys) {
-		if (rb == null)
-			return null;
-		for (String k : keys) {
-			if (containsKey(k))
-				return getString(k);
-		}
-		return null;
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override /* ResourceBundle */
-	public Set<String> keySet() {
-		if (rb == null)
-			return Collections.emptySet();
-		return new MultiSet<String>(rb.keySet(), classPrefixedKeys.keySet()) ;
-	}
-
-	/**
-	 * Returns all keys in this resource bundle with the specified prefix.
-	 *
-	 * @param prefix The prefix.
-	 * @return The set of all keys in the resource bundle with the prefix.
-	 */
-	public Set<String> keySet(String prefix) {
-		Set<String> set = new HashSet<String>();
-		for (String s : keySet()) {
-			if (s.equals(prefix) || (s.startsWith(prefix) && s.charAt(prefix.length()) == '.'))
-				set.add(s);
-		}
-		return set;
-	}
-
-	@Override /* ResourceBundle */
-	public Enumeration<String> getKeys() {
-		if (rb == null)
-			return new Vector<String>(0).elements();
-		return rb.getKeys();
-	}
-
-	@Override /* ResourceBundle */
-	protected Object handleGetObject(String key) {
-		if (rb == null)
-			return "{!!"+key+"}";
-		try {
-			if (classPrefixedKeys.containsKey(key))
-				key = classPrefixedKeys.get(key);
-			return rb.getObject(key);
-		} catch (Exception e) {
-			return "{!"+key+"}";
-		}
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.class
deleted file mode 100755
index 5e239a4..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.java
deleted file mode 100755
index fcf4ccc..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SafeResourceMultiBundle.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-import java.util.*;
-
-/**
- * A collection of {@link SafeResourceBundle} objects.
- * Allows servlets to define resource bundles for different classes in the class hierarchy.
- *
- * @author James Bognar (jbognar@us.ibm.com)
- */
-public final class SafeResourceMultiBundle extends SafeResourceBundle {
-
-	private List<SafeResourceBundle> bundles = new ArrayList<SafeResourceBundle>();
-
-	/**
-	 * Constructor.
-	 *
-	 * @param bundles The resource bundles to wrap.  Can be <jk>null</jk> to indicate a missing bundle.
-	 */
-	public SafeResourceMultiBundle(Collection<SafeResourceBundle> bundles) {
-		this.bundles.addAll(bundles);
- 	}
-
-	@Override /* SafeResourceBundle */
-	public String findFirstString(String...keys) {
-		for (String key : keys)
-			for (SafeResourceBundle srb : bundles)
-				if (srb.containsKey(key))
-					return srb.getString(key);
-		return null;
-	}
-
-	@Override /* ResourceBundle */
-	public boolean containsKey(String key) {
-		for (SafeResourceBundle srb : bundles)
-			if (srb.containsKey(key))
-				return true;
-		return false;
-	}
-
-	@Override /* SafeResourceBundle */
-	public String getString(String key, Object...args) {
-		for (SafeResourceBundle srb : bundles)
-			if (srb.containsKey(key))
-				return srb.getString(key, args);
-		return "{!" + key + "}";
-	}
-
-	@Override /* ResourceBundle */
-	@SuppressWarnings("unchecked")
-	public Set<String> keySet() {
-		MultiSet<String> s = new MultiSet<String>();
-		for (SafeResourceBundle rb : bundles)
-			s.append(rb.keySet());
-		return s;
-	}
-
-	@Override /* ResourceBundle */
-	@SuppressWarnings("unchecked")
-	public Enumeration<String> getKeys() {
-		MultiSet<String> s = new MultiSet<String>();
-		for (SafeResourceBundle rb : bundles)
-			s.append(rb.keySet());
-		return s.enumerator();
-	}
-
-	@Override /* ResourceBundle */
-	protected Object handleGetObject(String key) {
-		for (SafeResourceBundle srb : bundles)
-			if (srb.containsKey(key))
-				return srb.handleGetObject(key);
-		return "{!"+key+"}";
-	}
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$1.class
deleted file mode 100755
index e935d78..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$1.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$SimpleMapEntry.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$SimpleMapEntry.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$SimpleMapEntry.class
deleted file mode 100755
index c515bc1..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap$SimpleMapEntry.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.class
deleted file mode 100755
index 03c32ce..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.java
deleted file mode 100755
index 21bd047..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/SimpleMap.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-import static com.ibm.juno.core.utils.ArrayUtils.*;
-import static com.ibm.juno.core.utils.ThrowableUtils.*;
-
-import java.text.*;
-import java.util.*;
-
-/**
- * An instance of a <code>Map</code> where the keys and values
- * 	are simple <code>String[]</code> and <code>Object[]</code> arrays.
- * <p>
- * 	Typically more efficient than <code>HashMaps</code> for small maps (e.g. &lt;10 entries).
- * <p>
- * 	Does not support adding or removing entries.
- * <p>
- * 	Setting values overwrites the value on the underlying value array.
- *
- * @author James Bognar (jbognar@us.ibm.com)
- */
-public final class SimpleMap extends AbstractMap<String,Object> {
-
-	private final String[] keys;
-	private final Object[] values;
-	private final Map.Entry<String,Object>[] entries;
-
-	/**
-	 * Constructor.
-	 *
-	 * @param keys The map keys.  Must not be <jk>null</jk>.
-	 * @param values The map values.  Must not be <jk>null</jk>.
-	 */
-	public SimpleMap(String[] keys, Object[] values) {
-		assertFieldNotNull(keys, "keys");
-		assertFieldNotNull(values, "values");
-		if (keys.length != values.length)
-			illegalArg("keys ''{0}'' and values ''{1}'' array lengths differ", keys.length, values.length);
-
-		this.keys = keys;
-		this.values = values;
-		entries = new SimpleMapEntry[keys.length];
-		for (int i = 0; i < keys.length; i++) {
-			if (keys[i] == null)
-				illegalArg("Keys array cannot contain a null value.");
-			entries[i] = new SimpleMapEntry(i);
-	}
-	}
-
-	@Override /* Map */
-	public Set<Map.Entry<String,Object>> entrySet() {
-		return asSet(entries);
-	}
-
-	@Override /* Map */
-	public Object get(Object key) {
-		for (int i = 0; i < keys.length; i++)
-			if (keys[i].equals(key))
-				return values[i];
-		return null;
-	}
-
-	@Override /* Map */
-	public Set<String> keySet() {
-		return asSet(keys);
-	}
-
-	@Override /* Map */
-	public Object put(String key, Object value) {
-		for (int i = 0; i < keys.length; i++) {
-			if (keys[i].equals(key)) {
-				Object v = values[i];
-				values[i] = value;
-				return v;
-			}
-		}
-		throw new IllegalArgumentException(MessageFormat.format("No key ''{0}'' defined in map", key));
-	}
-
-	private class SimpleMapEntry implements Map.Entry<String,Object> {
-
-		private int index;
-
-		private SimpleMapEntry(int index) {
-			this.index = index;
-		}
-
-		@Override /* Map.Entry */
-		public String getKey() {
-			return keys[index];
-		}
-
-		@Override /* Map.Entry */
-		public Object getValue() {
-			return values[index];
-		}
-
-		@Override /* Map.Entry */
-		public Object setValue(Object val) {
-			Object v = values[index];
-			values[index] = val;
-			return v;
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.class
deleted file mode 100755
index c1f9118..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.java
deleted file mode 100755
index 8fffbdb..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringBuilderWriter.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-import java.io.*;
-
-/**
- * Similar to {@link StringWriter}, but uses a {@link StringBuilder} instead to avoid synchronization overhead.
- * <p>
- * Note that this class is NOT thread safe.
- *
- * @author James Bognar (jbognar@us.ibm.com)
- */
-public final class StringBuilderWriter extends Writer {
-
-	private StringBuilder sb;
-
-	/**
-	 * Create a new string writer using the default initial string-builder size.
-	 */
-	public StringBuilderWriter() {
-		sb = new StringBuilder();
-		lock = null;
-	}
-
-	/**
-	 * Create a new string writer using the specified initial string-builder size.
-	 *
-	 * @param initialSize The number of <tt>char</tt> values that will fit into this buffer before it is automatically expanded
-	 * @throws IllegalArgumentException If <tt>initialSize</tt> is negative
-	 */
-	public StringBuilderWriter(int initialSize) {
-		sb = new StringBuilder(initialSize);
-		lock = null;
-	}
-
-	@Override /* Writer */
-	public void write(int c) {
-		sb.append((char) c);
-	}
-
-	@Override /* Writer */
-	public void write(char cbuf[], int start, int length) {
-		sb.append(cbuf, start, length);
-	}
-
-	@Override /* Writer */
-	public void write(String str) {
-		sb.append(str);
-	}
-
-	@Override /* Writer */
-	public void write(String str, int off, int len) {
-		sb.append(str.substring(off, off + len));
-	}
-
-	@Override /* Writer */
-	public StringBuilderWriter append(CharSequence csq) {
-		if (csq == null)
-			write("null");
-		else
-			write(csq.toString());
-		return this;
-	}
-
-	@Override /* Writer */
-	public StringBuilderWriter append(CharSequence csq, int start, int end) {
-		CharSequence cs = (csq == null ? "null" : csq);
-		write(cs.subSequence(start, end).toString());
-		return this;
-	}
-
-	@Override /* Writer */
-	public StringBuilderWriter append(char c) {
-		write(c);
-		return this;
-	}
-
-	@Override /* Object */
-	public String toString() {
-		return sb.toString();
-	}
-
-	@Override /* Writer */
-	public void flush() {}
-
-	@Override /* Writer */
-	public void close() throws IOException {}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.class
deleted file mode 100755
index 82ed33f..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.java
deleted file mode 100755
index 4621af4..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringUtils.java
+++ /dev/null
@@ -1,873 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-import static com.ibm.juno.core.utils.ThrowableUtils.*;
-
-import java.io.*;
-import java.math.*;
-import java.util.*;
-import java.util.concurrent.atomic.*;
-import java.util.regex.*;
-
-import javax.xml.bind.*;
-
-import com.ibm.juno.core.parser.*;
-
-/**
- * Reusable string utility methods.
- */
-public final class StringUtils {
-
-	private static final AsciiSet numberChars = new AsciiSet("-xX.+-#pP0123456789abcdefABCDEF");
-	private static final AsciiSet firstNumberChars = new AsciiSet("+-.#0123456789");
-	private static final AsciiSet octChars = new AsciiSet("01234567");
-	private static final AsciiSet decChars = new AsciiSet("0123456789");
-	private static final AsciiSet hexChars = new AsciiSet("0123456789abcdefABCDEF");
-
-	// Maps 6-bit nibbles to BASE64 characters.
-	private static final char[] base64m1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
-
-	// Maps BASE64 characters to 6-bit nibbles.
-	private static final byte[] base64m2 = new byte[128];
-	static {
-		for (int i = 0; i < 64; i++)
-			base64m2[base64m1[i]] = (byte)i;
-	}
-
-	/**
-	 * Parses a number from the specified reader stream.
-	 *
-	 * @param r The reader to parse the string from.
-	 * @param type The number type to created. <br>
-	 * 	Can be any of the following:
-	 * 	<ul>
-	 * 		<li> Integer
-	 * 		<li> Double
-	 * 		<li> Float
-	 * 		<li> Long
-	 * 		<li> Short
-	 * 		<li> Byte
-	 * 		<li> BigInteger
-	 * 		<li> BigDecimal
-	 * 	</ul>
-	 * 	If <jk>null</jk>, uses the best guess.
-	 * @throws IOException If a problem occurred trying to read from the reader.
-	 * @return The parsed number.
-	 * @throws ParseException
-	 */
-	public static Number parseNumber(ParserReader r, Class<? extends Number> type) throws IOException, ParseException {
-		return parseNumber(parseNumberString(r), type);
-	}
-
-	/**
-	 * Reads a numeric string from the specified reader.
-	 *
-	 * @param r The reader to read form.
-	 * @return The parsed number string.
-	 * @throws IOException
-	 */
-	public static String parseNumberString(ParserReader r) throws IOException {
-		r.mark();
-		int c = 0;
-		while (true) {
-			c = r.read();
-			if (c == -1)
-				break;
-			if (! numberChars.contains((char)c)) {
-				r.unread();
-				break;
-			}
-		}
-		return r.getMarked();
-	}
-
-	/**
-	 * Parses a number from the specified string.
-	 *
-	 * @param s The string to parse the number from.
-	 * @param type The number type to created. <br>
-	 * 	Can be any of the following:
-	 * 	<ul>
-	 * 		<li> Integer
-	 * 		<li> Double
-	 * 		<li> Float
-	 * 		<li> Long
-	 * 		<li> Short
-	 * 		<li> Byte
-	 * 		<li> BigInteger
-	 * 		<li> BigDecimal
-	 * 	</ul>
-	 * 	If <jk>null</jk>, uses the best guess.
-	 * @return The parsed number.
-	 * @throws ParseException
-	 */
-	public static Number parseNumber(String s, Class<? extends Number> type) throws ParseException {
-
-		if (s.isEmpty())
-			s = "0";
-		if (type == null)
-			type = Number.class;
-
-		try {
-			// Determine the data type if it wasn't specified.
-			boolean isAutoDetect = (type == Number.class);
-			boolean isDecimal = false;
-			if (isAutoDetect) {
-				// If we're auto-detecting, then we use either an Integer, Long, or Double depending on how
-				// long the string is.
-				// An integer range is -2,147,483,648 to 2,147,483,647
-				// An long range is -9,223,372,036,854,775,808 to +9,223,372,036,854,775,807
-				isDecimal = isDecimal(s);
-				if (isDecimal) {
-					if (s.length() > 20)
-						type = Double.class;
-					else if (s.length() >= 10)
-					type = Long.class;
-					else
-						type = Integer.class;
-				}
-				else if (isFloat(s))
-					type = Double.class;
-				else
-					throw new NumberFormatException(s);
-			}
-
-			if (type == Double.class || type == Double.TYPE) {
-				Double d = Double.valueOf(s);
-				if (isAutoDetect && (! isDecimal) && d >= -Float.MAX_VALUE && d <= Float.MAX_VALUE)
-					return d.floatValue();
-				return d;
-			}
-			if (type == Float.class || type == Float.TYPE)
-				return Float.valueOf(s);
-			if (type == BigDecimal.class)
-				return new BigDecimal(s);
-			if (type == Long.class || type == Long.TYPE || type == AtomicLong.class) {
-				try {
-				Long l = Long.decode(s);
-					if (type == AtomicLong.class)
-						return new AtomicLong(l);
-					if (isAutoDetect && l >= Integer.MIN_VALUE && l <= Integer.MAX_VALUE) {
-						// This occurs if the string is 10 characters long but is still a valid integer value.
-					return l.intValue();
-					}
-				return l;
-				} catch (NumberFormatException e) {
-					if (isAutoDetect) {
-						// This occurs if the string is 20 characters long but still falls outside the range of a valid long.
-						return Double.valueOf(s);
-					}
-					throw e;
-				}
-			}
-			if (type == Integer.class || type == Integer.TYPE)
-				return Integer.decode(s);
-			if (type == Short.class || type == Short.TYPE)
-				return Short.decode(s);
-			if (type == Byte.class || type == Byte.TYPE)
-				return Byte.decode(s);
-			if (type == BigInteger.class)
-				return new BigInteger(s);
-			if (type == AtomicInteger.class)
-				return new AtomicInteger(Integer.decode(s));
-			throw new ParseException("Unsupported Number type: {0}", type.getName());
-		} catch (NumberFormatException e) {
-			throw new ParseException("Could not convert string ''{0}'' to class ''{1}''", s, type.getName()).initCause(e);
-		}
-	}
-
-   private final static Pattern fpRegex = Pattern.compile(
-      "[+-]?(NaN|Infinity|((((\\p{Digit}+)(\\.)?((\\p{Digit}+)?)([eE][+-]?(\\p{Digit}+))?)|(\\.((\\p{Digit}+))([eE][+-]?(\\p{Digit}+))?)|(((0[xX](\\p{XDigit}+)(\\.)?)|(0[xX](\\p{XDigit}+)?(\\.)(\\p{XDigit}+)))[pP][+-]?(\\p{Digit}+)))[fFdD]?))[\\x00-\\x20]*"
-   );
-
-	/**
-	 * Returns <jk>true</jk> if this string can be parsed by {@link #parseNumber(String, Class)}.
-	 *
-	 * @param s The string to check.
-	 * @return <jk>true</jk> if this string can be parsed without causing an exception.
-	 */
-	public static boolean isNumeric(String s) {
-		if (s == null || s.isEmpty())
-			return false;
-		if (! firstNumberChars.contains(s.charAt(0)))
-			return false;
-		return isDecimal(s) || isFloat(s);
-	}
-
-	/**
-	 * Returns <jk>true</jk> if the specified string is a floating point number.
-	 *
-	 * @param s The string to check.
-	 * @return <jk>true</jk> if the specified string is a floating point number.
-	 */
-	public static boolean isFloat(String s) {
-		if (s == null || s.isEmpty())
-			return false;
-		if (! firstNumberChars.contains(s.charAt(0)))
-			return (s.equals("NaN") || s.equals("Infinity"));
-		int i = 0;
-		int length = s.length();
-		char c = s.charAt(0);
-		if (c == '+' || c == '-')
-			i++;
-		if (i == length)
-			return false;
-		c = s.charAt(i++);
-		if (c == '.' || decChars.contains(c)) {
-			return fpRegex.matcher(s).matches();
-		}
-		return false;
-	}
-
-	/**
-	 * Returns <jk>true</jk> if the specified string is numeric.
-	 *
-	 * @param s The string to check.
-	 * @return <jk>true</jk> if the specified string is numeric.
-	 */
-	public static boolean isDecimal(String s) {
-		if (s == null || s.isEmpty())
-			return false;
-		if (! firstNumberChars.contains(s.charAt(0)))
-			return false;
-		int i = 0;
-		int length = s.length();
-		char c = s.charAt(0);
-		boolean isPrefixed = false;
-		if (c == '+' || c == '-') {
-			isPrefixed = true;
-			i++;
-		}
-		if (i == length)
-			return false;
-		c = s.charAt(i++);
-		if (c == '0' && length > (isPrefixed ? 2 : 1)) {
-			c = s.charAt(i++);
-			if (c == 'x' || c == 'X') {
-				for (int j = i; j < length; j++) {
-					if (! hexChars.contains(s.charAt(j)))
-						return false;
-				}
-			} else if (octChars.contains(c)) {
-				for (int j = i; j < length; j++)
-					if (! octChars.contains(s.charAt(j)))
-						return false;
-			} else {
-				return false;
-			}
-		} else if (c == '#') {
-			for (int j = i; j < length; j++) {
-				if (! hexChars.contains(s.charAt(j)))
-					return false;
-			}
-		} else if (decChars.contains(c)) {
-			for (int j = i; j < length; j++)
-				if (! decChars.contains(s.charAt(j)))
-					return false;
-		} else {
-			return false;
-		}
-		return true;
-	}
-
-	/**
-	 * Convenience method for getting a stack trace as a string.
-	 *
-	 * @param t The throwable to get the stack trace from.
-	 * @return The same content that would normally be rendered via <code>t.printStackTrace()</code>
-	 */
-	public static String getStackTrace(Throwable t) {
-		StringWriter sw = new StringWriter();
-		PrintWriter pw = new PrintWriter(sw);
-		t.printStackTrace(pw);
-		pw.flush();
-		pw.close();
-		return sw.toString();
-	}
-
-	/**
-	 * Join the specified tokens into a delimited string.
-	 *
-	 * @param tokens The tokens to join.
-	 * @param separator The delimiter.
-	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
-	 */
-	public static String join(Object[] tokens, String separator) {
-		if (tokens == null)
-			return null;
-		StringBuilder sb = new StringBuilder();
-		for (int i = 0; i < tokens.length; i++) {
-			if (i > 0)
-				sb.append(separator);
-			sb.append(tokens[i]);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Join the specified tokens into a delimited string.
-	 *
-	 * @param tokens The tokens to join.
-	 * @param d The delimiter.
-	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
-	 */
-	public static String join(int[] tokens, String d) {
-		if (tokens == null)
-			return null;
-		StringBuilder sb = new StringBuilder();
-		for (int i = 0; i < tokens.length; i++) {
-			if (i > 0)
-				sb.append(d);
-			sb.append(tokens[i]);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Join the specified tokens into a delimited string.
-	 *
-	 * @param tokens The tokens to join.
-	 * @param d The delimiter.
-	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
-	 */
-	public static String join(Collection<?> tokens, String d) {
-		if (tokens == null)
-			return null;
-		StringBuilder sb = new StringBuilder();
-		for (Iterator<?> iter = tokens.iterator(); iter.hasNext();) {
-			sb.append(iter.next());
-			if (iter.hasNext())
-				sb.append(d);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Join the specified tokens into a delimited string.
-	 *
-	 * @param tokens The tokens to join.
-	 * @param d The delimiter.
-	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
-	 */
-	public static String join(Object[] tokens, char d) {
-		if (tokens == null)
-			return null;
-		StringBuilder sb = new StringBuilder();
-		for (int i = 0; i < tokens.length; i++) {
-			if (i > 0)
-				sb.append(d);
-			sb.append(tokens[i]);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Join the specified tokens into a delimited string.
-	 *
-	 * @param tokens The tokens to join.
-	 * @param d The delimiter.
-	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
-	 */
-	public static String join(int[] tokens, char d) {
-		if (tokens == null)
-			return null;
-		StringBuilder sb = new StringBuilder();
-		for (int i = 0; i < tokens.length; i++) {
-			if (i > 0)
-				sb.append(d);
-			sb.append(tokens[i]);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Join the specified tokens into a delimited string.
-	 *
-	 * @param tokens The tokens to join.
-	 * @param d The delimiter.
-	 * @return The delimited string.  If <code>tokens</code> is <jk>null</jk>, returns <jk>null</jk>.
-	 */
-	public static String join(Collection<?> tokens, char d) {
-		if (tokens == null)
-			return null;
-		StringBuilder sb = new StringBuilder();
-		for (Iterator<?> iter = tokens.iterator(); iter.hasNext();) {
-			sb.append(iter.next());
-			if (iter.hasNext())
-				sb.append(d);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Splits a character-delimited string into a string array.
-	 * Does not split on escaped-delimiters (e.g. "\,");
-	 * Resulting tokens are trimmed of whitespace.
-	 * NOTE:  This behavior is different than the Jakarta equivalent.
-	 * split("a,b,c",',') -> {"a","b","c"}
-	 * split("a, b ,c ",',') -> {"a","b","c"}
-	 * split("a,,c",',') -> {"a","","c"}
-	 * split(",,",',') -> {"","",""}
-	 * split("",',') -> {}
-	 * split(null,',') -> null
-	 * split("a,b\,c,d", ',', false) -> {"a","b\,c","d"}
-	 * split("a,b\\,c,d", ',', false) -> {"a","b\","c","d"}
-	 * split("a,b\,c,d", ',', true) -> {"a","b,c","d"}
-	 *
-	 * @param s The string to split.  Can be <jk>null</jk>.
-	 * @param c The character to split on.
-	 * @return The tokens.
-	 */
-	public static String[] split(String s, char c) {
-
-		char[] unEscapeChars = new char[]{'\\', c};
-
-		if (s == null)
-			return null;
-		if (isEmpty(s))
-			return new String[0];
-
-		List<String> l = new LinkedList<String>();
-		char[] sArray = s.toCharArray();
-		int x1 = 0, escapeCount = 0;
-		for (int i = 0; i < sArray.length; i++) {
-			if (sArray[i] == '\\') escapeCount++;
-			else if (sArray[i]==c && escapeCount % 2 == 0) {
-				String s2 = new String(sArray, x1, i-x1);
-				String s3 = unEscapeChars(s2, unEscapeChars);
-				l.add(s3.trim());
-				x1 = i+1;
-			}
-			if (sArray[i] != '\\') escapeCount = 0;
-		}
-		String s2 = new String(sArray, x1, sArray.length-x1);
-		String s3 = unEscapeChars(s2, unEscapeChars);
-		l.add(s3.trim());
-
-		return l.toArray(new String[l.size()]);
-	}
-
-	/**
-	 * Returns <jk>true</jk> if specified string is <jk>null</jk> or empty.
-	 *
-	 * @param s The string to check.
-	 * @return <jk>true</jk> if specified string is <jk>null</jk> or empty.
-	 */
-	public static boolean isEmpty(String s) {
-		return s == null || s.isEmpty();
-	}
-
-	/**
-	 * Returns <jk>true</jk> if specified string is <jk>null</jk> or it's {@link #toString()} method returns an empty string.
-	 *
-	 * @param s The string to check.
-	 * @return <jk>true</jk> if specified string is <jk>null</jk> or it's {@link #toString()} method returns an empty string.
-	 */
-	public static boolean isEmpty(Object s) {
-		return s == null || s.toString().isEmpty();
-	}
-
-	/**
-	 * Returns <jk>null</jk> if the specified string is <jk>null</jk> or empty.
-	 *
-	 * @param s The string to check.
-	 * @return <jk>null</jk> if the specified string is <jk>null</jk> or empty, or the same string if not.
-	 */
-	public static String nullIfEmpty(String s) {
-		if (s == null || s.isEmpty())
-			return null;
-		return s;
-	}
-
-	/**
-	 * Removes escape characters (\) from the specified characters.
-	 *
-	 * @param s The string to remove escape characters from.
-	 * @param toEscape The characters escaped.
-	 * @return A new string if characters were removed, or the same string if not or if the input was <jk>null</jk>.
-	 */
-	public static String unEscapeChars(String s, char[] toEscape) {
-		return unEscapeChars(s, toEscape, '\\');
-	}
-
-	/**
-	 * Removes escape characters (specified by escapeChar) from the specified characters.
-	 *
-	 * @param s The string to remove escape characters from.
-	 * @param toEscape The characters escaped.
-	 * @param escapeChar The escape character.
-	 * @return A new string if characters were removed, or the same string if not or if the input was <jk>null</jk>.
-	 */
-	public static String unEscapeChars(String s, char[] toEscape, char escapeChar) {
-		if (s == null) return null;
-		if (s.length() == 0 || toEscape == null || toEscape.length == 0 || escapeChar == 0) return s;
-		StringBuffer sb = new StringBuffer(s.length());
-		char[] sArray = s.toCharArray();
-		for (int i = 0; i < sArray.length; i++) {
-			char c = sArray[i];
-
-			if (c == escapeChar) {
-				if (i+1 != sArray.length) {
-					char c2 = sArray[i+1];
-					boolean isOneOf = false;
-					for (int j = 0; j < toEscape.length && ! isOneOf; j++)
-						isOneOf = (c2 == toEscape[j]);
-					if (isOneOf) {
-						i++;
-					} else if (c2 == escapeChar) {
-						sb.append(escapeChar);
-						i++;
-					}
-				}
-			}
-			sb.append(sArray[i]);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Debug method for rendering non-ASCII character sequences.
-	 *
-	 * @param s The string to decode.
-	 * @return A string with non-ASCII characters converted to <js>"[hex]"</js> sequences.
-	 */
-	public static String decodeHex(String s) {
-		if (s == null)
-			return null;
-		StringBuilder sb = new StringBuilder();
-		for (char c : s.toCharArray()) {
-			if (c < ' ' || c > '~')
-				sb.append("["+Integer.toHexString(c)+"]");
-			else
-				sb.append(c);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * An efficient method for checking if a string starts with a character.
-	 *
-	 * @param s The string to check.  Can be <jk>null</jk>.
-	 * @param c The character to check for.
-	 * @return <jk>true</jk> if the specified string is not <jk>null</jk> and starts with the specified character.
-	 */
-	public static boolean startsWith(String s, char c) {
-		if (s != null) {
-			int i = s.length();
-			if (i > 0)
-				return s.charAt(0) == c;
-		}
-		return false;
-	}
-
-	/**
-	 * An efficient method for checking if a string ends with a character.
-	 *
-	 * @param s The string to check.  Can be <jk>null</jk>.
-	 * @param c The character to check for.
-	 * @return <jk>true</jk> if the specified string is not <jk>null</jk> and ends with the specified character.
-	 */
-	public static boolean endsWith(String s, char c) {
-		if (s != null) {
-			int i = s.length();
-			if (i > 0)
-				return s.charAt(i-1) == c;
-		}
-		return false;
-	}
-
-	/**
-	 * Tests two strings for equality, but gracefully handles nulls.
-	 *
-	 * @param s1 String 1.
-	 * @param s2 String 2.
-	 * @return <jk>true</jk> if the strings are equal.
-	 */
-	public static boolean isEquals(String s1, String s2) {
-		if (s1 == null)
-			return s2 == null;
-		if (s2 == null)
-			return false;
-		return s1.equals(s2);
-	}
-
-	/**
-	 * Shortcut for calling <code>base64Encode(in.getBytes(<js>"UTF-8"</js>))</code>
-	 *
-	 * @param in The input string to convert.
-	 * @return The string converted to BASE-64 encoding.
-	 */
-	public static String base64EncodeToString(String in) {
-		if (in == null)
-			return null;
-		return base64Encode(in.getBytes(IOUtils.UTF8));
-	}
-
-	/**
-	 * BASE64-encodes the specified byte array.
-	 *
-	 * @param in The input byte array to convert.
-	 * @return The byte array converted to a BASE-64 encoded string.
-	 */
-	public static String base64Encode(byte[] in) {
-		int outLength = (in.length * 4 + 2) / 3;   // Output length without padding
-		char[] out = new char[((in.length + 2) / 3) * 4];  // Length includes padding.
-		int iIn = 0;
-		int iOut = 0;
-		while (iIn < in.length) {
-			int i0 = in[iIn++] & 0xff;
-			int i1 = iIn < in.length ? in[iIn++] & 0xff : 0;
-			int i2 = iIn < in.length ? in[iIn++] & 0xff : 0;
-			int o0 = i0 >>> 2;
-			int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
-			int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
-			int o3 = i2 & 0x3F;
-			out[iOut++] = base64m1[o0];
-			out[iOut++] = base64m1[o1];
-			out[iOut] = iOut < outLength ? base64m1[o2] : '=';
-			iOut++;
-			out[iOut] = iOut < outLength ? base64m1[o3] : '=';
-			iOut++;
-		}
-		return new String(out);
-	}
-
-	/**
-	 * Shortcut for calling <code>base64Decode(String)</code> and converting the
-	 * 	result to a UTF-8 encoded string.
-	 *
-	 * @param in The BASE-64 encoded string to decode.
-	 * @return The decoded string.
-	 */
-	public static String base64DecodeToString(String in) {
-		byte[] b = base64Decode(in);
-		if (b == null)
-			return null;
-		return new String(b, IOUtils.UTF8);
-	}
-
-	/**
-	 * BASE64-decodes the specified string.
-	 *
-	 * @param in The BASE-64 encoded string.
-	 * @return The decoded byte array.
-	 */
-	public static byte[] base64Decode(String in) {
-		if (in == null)
-			return null;
-
-		byte bIn[] = in.getBytes(IOUtils.UTF8);
-
-		if (bIn.length % 4 != 0)
-			illegalArg("Invalid BASE64 string length.  Must be multiple of 4.");
-
-		// Strip out any trailing '=' filler characters.
-		int inLength = bIn.length;
-		while (inLength > 0 && bIn[inLength - 1] == '=')
-			inLength--;
-
-		int outLength = (inLength * 3) / 4;
-		byte[] out = new byte[outLength];
-		int iIn = 0;
-		int iOut = 0;
-		while (iIn < inLength) {
-			int i0 = bIn[iIn++];
-			int i1 = bIn[iIn++];
-			int i2 = iIn < inLength ? bIn[iIn++] : 'A';
-			int i3 = iIn < inLength ? bIn[iIn++] : 'A';
-			int b0 = base64m2[i0];
-			int b1 = base64m2[i1];
-			int b2 = base64m2[i2];
-			int b3 = base64m2[i3];
-			int o0 = (b0 << 2) | (b1 >>> 4);
-			int o1 = ((b1 & 0xf) << 4) | (b2 >>> 2);
-			int o2 = ((b2 & 3) << 6) | b3;
-			out[iOut++] = (byte)o0;
-			if (iOut < outLength)
-				out[iOut++] = (byte)o1;
-			if (iOut < outLength)
-				out[iOut++] = (byte)o2;
-		}
-		return out;
-	}
-
-	/**
-	 * Generated a random UUID with the specified number of characters.
-	 * Characters are composed of lower-case ASCII letters and numbers only.
-	 * This method conforms to the restrictions for hostnames as specified in <a href='https://tools.ietf.org/html/rfc952'>RFC 952</a>
-	 * Since each character has 36 possible values, the square approximation formula for
-	 * 	the number of generated IDs that would produce a 50% chance of collision is:
-	 * <code>sqrt(36^N)</code>.
-	 * Dividing this number by 10 gives you an approximation of the number of generated IDs
-	 * 	needed to produce a <1% chance of collision.
-	 * For example, given 5 characters, the number of generated IDs need to produce a <1% chance of
-	 * 	collision would be:
-	 * <code>sqrt(36^5)/10=777</code>
-	 *
-	 * @param numchars The number of characters in the generated UUID.
-	 * @return A new random UUID.
-	 */
-	public static String generateUUID(int numchars) {
-		Random r = new Random();
-		StringBuilder sb = new StringBuilder(numchars);
-		for (int i = 0; i < numchars; i++) {
-			int c = r.nextInt(36) + 97;
-			if (c > 'z')
-				c -= ('z'-'0'+1);
-			sb.append((char)c);
-		}
-		return sb.toString();
-	}
-
-	/**
-	 * Same as {@link String#trim()} but prevents <code>NullPointerExceptions</code>.
-	 *
-	 * @param s The string to trim.
-	 * @return The trimmed string, or <jk>null</jk> if the string was <jk>null</jk>.
-	 */
-	public static String trim(String s) {
-		if (s == null)
-			return null;
-		return s.trim();
-	}
-
-	/**
-	 * Parses an ISO8601 string into a date.
-	 *
-	 * @param date The date string.
-	 * @return The parsed date.
-	 * @throws IllegalArgumentException
-	 */
-	@SuppressWarnings("nls")
-	public static Date parseISO8601Date(String date) throws IllegalArgumentException {
-		if (isEmpty(date))
-			return null;
-		date = date.trim().replace(' ', 'T');  // Convert to 'standard' ISO8601
-		if (date.indexOf(',') != -1)  // Trim milliseconds
-			date = date.substring(0, date.indexOf(','));
-		if (date.matches("\\d{4}"))
-			date += "-01-01T00:00:00";
-		else if (date.matches("\\d{4}\\-\\d{2}"))
-			date += "-01T00:00:00";
-		else if (date.matches("\\d{4}\\-\\d{2}\\-\\d{2}"))
-			date += "T00:00:00";
-		else if (date.matches("\\d{4}\\-\\d{2}\\-\\d{2}T\\d{2}"))
-			date += ":00:00";
-		else if (date.matches("\\d{4}\\-\\d{2}\\-\\d{2}T\\d{2}\\:\\d{2}"))
-			date += ":00";
-		return DatatypeConverter.parseDateTime(date).getTime();
-	}
-
-	/**
-	 * Simple utility for replacing variables of the form <js>"{key}"</js> with values
-	 * 	in the specified map.
-	 * <p>
-	 * Nested variables are supported in both the input string and map values.
-	 * <p>
-	 * If the map does not contain the specified value, the variable is not replaced.
-	 *	<p>
-	 *	<jk>null</jk> values in the map are treated as blank strings.
-	 *
-	 * @param s The string containing variables to replace.
-	 * @param m The map containing the variable values.
-	 * @return The new string with variables replaced, or the original string if it didn't have variables in it.
-	 */
-	public static String replaceVars(String s, Map<String,Object> m) {
-
-		if (s.indexOf('{') == -1)
-			return s;
-
-		int S1 = 1;	   // Not in variable, looking for {
-		int S2 = 2;    // Found {, Looking for }
-
-		int state = S1;
-		boolean hasInternalVar = false;
-		int x = 0;
-		int depth = 0;
-		int length = s.length();
-		StringBuilder out = new StringBuilder();
-		for (int i = 0; i < length; i++) {
-			char c = s.charAt(i);
-			if (state == S1) {
-				if (c == '{') {
-					state = S2;
-					x = i;
-				} else {
-					out.append(c);
-				}
-			} else /* state == S2 */ {
-				if (c == '{') {
-					depth++;
-					hasInternalVar = true;
-				} else if (c == '}') {
-					if (depth > 0) {
-						depth--;
-					} else {
-						String key = s.substring(x+1, i);
-						key = (hasInternalVar ? replaceVars(key, m) : key);
-						hasInternalVar = false;
-						if (! m.containsKey(key))
-							out.append('{').append(key).append('}');
-						else {
-							Object val = m.get(key);
-							if (val == null)
-								val = "";
-							String v = val.toString();
-							// If the replacement also contains variables, replace them now.
-							if (v.indexOf('{') != -1)
-								v = replaceVars(v, m);
-							out.append(v);
-						}
-						state = 1;
-					}
-				}
-			}
-		}
-		return out.toString();
-	}
-
-	/**
-	 * Returns <jk>true</jk> if the specified path string is prefixed with the specified prefix.
-	 * <p>
-	 * Examples:
-	 * <p class='bcode'>
-	 * 	pathStartsWith(<js>"foo"</js>, <js>"foo"</js>);  <jc>// true</jc>
-	 * 	pathStartsWith(<js>"foo/bar"</js>, <js>"foo"</js>);  <jc>// true</jc>
-	 * 	pathStartsWith(<js>"foo2"</js>, <js>"foo"</js>);  <jc>// false</jc>
-	 * 	pathStartsWith(<js>"foo2"</js>, <js>""</js>);  <jc>// false</jc>
-	 * </p>
-	 *
-	 * @param path The path to check.
-	 * @param pathPrefix The prefix.
-	 * @return <jk>true</jk> if the specified path string is prefixed with the specified prefix.
-	 */
-	public static boolean pathStartsWith(String path, String pathPrefix) {
-		if (path == null || pathPrefix == null)
-			return false;
-		if (path.startsWith(pathPrefix))
-			return path.length() == pathPrefix.length() || path.charAt(pathPrefix.length()) == '/';
-		return false;
-	}
-
-	/**
-	 * Same as {@link #pathStartsWith(String, String)} but returns <jk>true</jk> if at least one prefix matches.
-	 * <p>
-	 *
-	 * @param path The path to check.
-	 * @param pathPrefixes The prefixes.
-	 * @return <jk>true</jk> if the specified path string is prefixed with any of the specified prefixes.
-	 */
-	public static boolean pathStartsWith(String path, String[] pathPrefixes) {
-		for (String p : pathPrefixes)
-			if (pathStartsWith(path, p))
-				return true;
-		return false;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.class
deleted file mode 100755
index 3aa5049..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.java
deleted file mode 100755
index c09e88b..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVar.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-/**
- * Interface for the resolution of string variables using the {@link StringVarResolver} API.
- *
- * @author jbognar
- */
-public abstract class StringVar {
-
-	/**
-	 * The method called from {@link StringVarResolver}.
-	 * Can be overridden to intercept the request and do special handling.
-	 * Default implementation simply calls resolve(String).
-	 *
-	 * @param arg The inside argument of the variable.
-	 * @return The resolved value.
-	 */
-	protected String doResolve(String arg) {
-		return resolve(arg);
-	}
-
-	/**
-	 * The interface that needs to be implemented for string vars.
-	 *
-	 * @param arg The inside argument of the variable.
-	 * @return The resolved value.
-	 */
-	public abstract String resolve(String arg);
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.class
deleted file mode 100755
index 3d6cef6..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.java
deleted file mode 100755
index 5f9b8be..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarMultipart.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-
-/**
- * Interface for the resolution of string vars that consist of a comma-delimited list.
- * <p>
- * (e.g. <js>"$X{foo, bar, baz}"</js>)
- */
-public abstract class StringVarMultipart extends StringVar {
-
-	/**
-	 * The interface that needs to be implemented for this interface.
-	 *
-	 * @param args The arguments inside the variable.
-	 * @return The resolved variable.
-	 */
-	public abstract String resolve(String[] args);
-
-	@Override /* StringVar*/
-	public String resolve(String s) {
-		String[] s2 = s.indexOf(',') == -1 ? new String[]{s} : StringUtils.split(s, ',');
-		return resolve(s2);
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$1.class
deleted file mode 100755
index 91f4947..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$1.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$2.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$2.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$2.class
deleted file mode 100755
index 18f9577..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver$2.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.class
deleted file mode 100755
index f65f3b7..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.java
deleted file mode 100755
index 5abffd7..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarResolver.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2014, 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-import static com.ibm.juno.core.utils.StringUtils.*;
-import static com.ibm.juno.core.utils.ThrowableUtils.*;
-
-import java.io.*;
-import java.util.*;
-
-/**
- * Utility class for resolving  variables of the form <code>$X{key}</code> in strings.
- * <p>
- * This class implements the following two methods for resolving variables in strings:
- * <ul>
- * 	<li>{@link #resolve(String)} - Returns a new string with variables replaced.
- * 	<li>{@link #writeTo(String,Writer)} - Resolves variables in the string and sends the result to the writer.
- * </ul>
- * <p>
- * Variables are of the form <code>$X{key}</code>, where <code>X</code> can consist of zero or more ASCII characters.<br>
- * The variable key can contain anything, even nested variables that get recursively resolved.
- * <p>
- * Variable types are defined through the {@link #addVar(String, StringVar)} method.
- * <p>
- * The {@link StringVar} interface defines a simple method for replacing a variable key with a value.
- * <p>
- * <h6 class='topic'>Example:</h6>
- * <p class='bcode'>
- * 	<jc>// Create a variable resolver that resolves system properties (e.g. "$S{java.home}")</jc>
- * 	StringVarResolver r = <jk>new</jk> StringVarResolver()
- * 		.addVar(<js>"S"</js>, <jk>new</jk> StringVar() {
- * 			<ja>@Override</ja>
- * 			<jk>public</jk> String resolve(String varVal) {
- * 				<jk>return</jk> System.<jsm>getProperty</jsm>(varVal);
- * 			}
- * 		});
- *
- * 	System.<jsf>out</jsf>.println(r.resolve(<js>"java.home is set to $S{java.home}"</js>));
- * </p>
- * <p>
- * Subclasses of {@link StringVar} are provided for special purposes:
- * <ul>
- * 	<li>{@link StringVarMultipart} - Interface for the resolution of vars that consist of a comma-delimited list (e.g. <js>"$X{foo, bar, baz}"</js>)
- * 	<li>{@link StringVarWithDefault} - Interface for the resolution of vars with a default value if the <code>resolve(String)</code> method returns <jk>null</jk> (e.g. <js>"$S{myProperty,not found}"</js>).
- * </ul>
- *	<p>
- *	The {@link #DEFAULT} instance is a reusable variable resolver that includes support for system properties and environment variables.
- * <p>
- * <code>StringVarResolvers</code> can be extended by using the {@link #StringVarResolver(StringVarResolver)} constructor.
- * <p>
- * <h6 class='topic'>Example:</h6>
- * <p class='bcode'>
- * 	<jc>// Create a var resolver that extends the default resolver and appends our own "$URLEncode{...}" variable</jc>
- * 	StringVarResolver r = <jk>new</jk> StringVarResolver(StringVarResolver.<jsf>DEFAULT</jsf>)
- * 		.addVar(<js>"URLEncode"</js>, <jk>new</jk> StringVar() {
- * 			<ja>@Override</ja>
- * 			<jk>public</jk> String resolve(String varVal) {
- * 				<jk>return</jk> URLEncoder.<jsm>encode</jsm>(varVal, <js>"UTF-8"</js>);
- * 			}
- * 		});
- *
- * 	<jc>// Retrieve a system property and URL-encode it if necessary.</jc>
- * 	String myProperty = r.resolve(<js>"$URLEncode{$S{my.property}}"</js>);
- * <p>
- * Variables can be nested arbitrarily deep.
- * <p>
- * <h6 class='topic'>Example:</h6>
- * <p class='bcode'>
- * 	<jc>// Look up a property in the following order:
- * 	// 1) MYPROPERTY environment variable.
- * 	// 2) 'my.property' system property if environment variable not found.
- * 	// 3) 'not found' string if system property not found.</jc>
- * 	String myproperty = StringVarResolver.<jsf>DEFAULT</jsf>.resolve(<js>"$E{MYPROPERTY,$S{my.property,not found}}"</js>);
- * </p>
- * <p>
- * Resolved variables can also contain variables.
- * <p class='bcode'>
- * 	<jc>// If MYPROPERTY is "$S{my.property}", and the system property "my.property" is "foo",
- * 	// then the following resolves to "foo".</jc>
- * 	String myproperty = StringVarResolver.<jsf>DEFAULT</jsf>.resolve(<js>"$E{MYPROPERTY}"</js>);
- * </p>
- * <p>
- * <h6 class='topic'>Other notes:</h6>
- * <ul class='spaced-list'>
- * 	<li>The escape character <js>'\'</js> can be used when necessary to escape the following characters: <code>$ , { }</code>
- * 	<li><b>WARNING:</b>  It is possible to cause {@link StackOverflowError StackOverflowErrors} if your nested variables result in
- * 		a recursive loop (e.g. the environment variable <code>'MYPROPERTY'</code> has the value <code>'$E{MYPROPERTY}'</code>).
- * 		So don't do that!
- * 	<li>As a general rule, this class tries to be as efficient as possible by not creating new strings when not needed.<br>
- * 		For example, calling the resolve method on a string that doesn't contain variables (e.g. <code>resolver.resolve(<js>"foobar"</js>)</code>)
- * 		will simply be a no-op and return the same string.
- *
- *
- * @author James Bognar (jbognar@us.ibm.com)
- */
-public class StringVarResolver {
-
-	/**
-	 * Default string variable resolver with support for system properties and environment variables:
-	 * <p>
-	 * <ul>
-	 * 	<li><code>$S{key}</code>,<code>$S{key,default}</code> - System properties.
-	 * 	<li><code>$E{key}</code>,<code>$E{key,default}</code> - Environment variables.
-	 * </ul>
-	 */
-	public static final StringVarResolver DEFAULT = new StringVarResolver()
-		// System properties.
-		.addVar("S", new StringVarWithDefault() {
-			@Override /* StringVar */
-			public String resolve(String varVal) {
-				return System.getProperty(varVal);
-			}
-		})
-		// Environment variables.
-		.addVar("E", new StringVarWithDefault() {
-			@Override /* StringVar */
-			public String resolve(String varVal) {
-				return System.getenv(varVal);
-			}
-		})
-	;
-
-	// Map of Vars added through addVar() method.
-	private Map<String,StringVar> varMap = new TreeMap<String,StringVar>();
-
-	private StringVarResolver parent;
-
-	/**
-	 * Construct an empty var resolver.
-	 */
-	public StringVarResolver() {}
-
-	/**
-	 * Construct an empty var resolver with the specified parent.
-	 *
-	 * @param parent The parent string variable resolver.  Can be <jk>null</jk>.
-	 */
-	public StringVarResolver(StringVarResolver parent) {
-		this.parent = parent;
-	}
-
-	/**
-	 * Register a new variable with this resolver.
-	 *
-	 * @param varName The variable name (e.g. <js>"X"</js> resolves <js>"$X{...}"</js> variables).
-	 * @param v The variable resolver.
-	 * @return This object (for method chaining).
-	 */
-	public StringVarResolver addVar(String varName, StringVar v) {
-		assertFieldNotNull(v, "v");
-
-		// Need to make sure only ASCII characters are used.
-		for (int i = 0; i < varName.length(); i++) {
-			char c = varName.charAt(i);
-			if (c < 'A' || c > 'z' || (c > 'Z' && c < 'a'))
-				illegalArg("Invalid var name.  Must consist of only uppercase and lowercase ASCII letters.");
-		}
-		varMap.put(varName, v);
-		return this;
-	}
-
-	/**
-	 * Resolve all variables in the specified string.
-	 *
-	 * @param s The string to resolve variables in.
-	 * @return The new string with all variables resolved, or the same string if no variables were found.
-	 * 	Null input results in a blank string.
-	 */
-	public String resolve(String s) {
-
-		if (s == null)
-			return "";
-		if (s.indexOf('$') == -1 && s.indexOf('\\') == -1)
-			return s;
-
-		// Special case where value consists of a single variable with no embedded variables (e.g. "$X{...}").
-		// This is a common case, so we want an optimized solution that doesn't involve string builders.
-		if (isSimpleVar(s)) {
-			String var = s.substring(1, s.indexOf('{'));
-			String val = s.substring(s.indexOf('{')+1, s.length()-1);
-			StringVar v = getVar(var);
-			if (v != null) {
-				s = v.doResolve(val);
-				return resolve(s);
-			}
-			return s;
-		}
-
-		try {
-			return writeTo(s, new StringWriter()).toString();
-		} catch (IOException e) {
-			throw new RuntimeException(e); // Never happens.
-		}
-	}
-
-	/**
-	 * Checks to see if string is of the simple form "$X{...}" with no embedded variables.
-	 * This is a common case, and we can avoid using StringWriters.
-	 */
-	private boolean isSimpleVar(String s) {
-		int S1 = 1;	   // Not in variable, looking for $
-		int S2 = 2;    // Found $, Looking for {
-		int S3 = 3;    // Found {, Looking for }
-		int S4 = 4;    // Found }
-
-		int length = s.length();
-		int state = S1;
-		for (int i = 0; i < length; i++) {
-			char c = s.charAt(i);
-			if (state == S1) {
-				if (c == '$') {
-					state = S2;
-				} else {
-					return false;
-				}
-			} else if (state == S2) {
-				if (c == '{') {
-					state = S3;
-				} else if (c < 'A' || c > 'z' || (c > 'Z' && c < 'a')) {   // False trigger "$X "
-					return false;
-				}
-			} else if (state == S3) {
-				if (c == '}')
-					state = S4;
-				else if (c == '{' || c == '$')
-					return false;
-			} else if (state == S4) {
-				return false;
-			}
-		}
-		return state == S4;
-	}
-
-	/**
-	 * Resolves variables in the specified string and sends the output to the specified writer.
-	 * More efficient than first parsing to a string and then serializing to the writer since this
-	 * method doesn't need to construct a large string.
-	 *
-	 * @param s The string to resolve variables in.
-	 * @param out The writer to write to.
-	 * @return The same writer.
-	 * @throws IOException
-	 */
-	public Writer writeTo(String s, Writer out) throws IOException {
-
-		int S1 = 1;	   // Not in variable, looking for $
-		int S2 = 2;    // Found $, Looking for {
-		int S3 = 3;    // Found {, Looking for }
-
-		int state = S1;
-		boolean isInEscape = false;
-		boolean hasInternalVar = false;
-		boolean hasInnerEscapes = false;
-		String varType = null;
-		String varVal = null;
-		int x = 0, x2 = 0;
-		int depth = 0;
-		int length = s.length();
-		for (int i = 0; i < length; i++) {
-			char c = s.charAt(i);
-			if (state == S1) {
-				if (isInEscape) {
-					if (c == '\\' || c == '$') {
-						out.append(c);
-					} else {
-						out.append('\\').append(c);
-					}
-					isInEscape = false;
-				} else if (c == '\\') {
-					isInEscape = true;
-				} else if (c == '$') {
-					x = i;
-					x2 = i;
-					state = S2;
-				} else {
-					out.append(c);
-				}
-			} else if (state == S2) {
-				if (isInEscape) {
-					isInEscape = false;
-				} else if (c == '\\') {
-					hasInnerEscapes = true;
-					isInEscape = true;
-				} else if (c == '{') {
-					varType = s.substring(x+1, i);
-					x = i;
-					state = S3;
-				} else if (c < 'A' || c > 'z' || (c > 'Z' && c < 'a')) {  // False trigger "$X "
-					if (hasInnerEscapes)
-						out.append(unEscapeChars(s.substring(x, i+1), new char[]{'\\','{'}));
-					else
-						out.append(s, x, i+1);
-					x = i + 1;
-					state = S1;
-					hasInnerEscapes = false;
-				}
-			} else if (state == S3) {
-				if (isInEscape) {
-					isInEscape = false;
-				} else if (c == '\\') {
-					isInEscape = true;
-					hasInnerEscapes = true;
-				} else if (c == '{') {
-					depth++;
-					hasInternalVar = true;
-				} else if (c == '}') {
-					if (depth > 0) {
-						depth--;
-					} else {
-						varVal = s.substring(x+1, i);
-						varVal = (hasInternalVar ? resolve(varVal) : varVal);
-						StringVar r = getVar(varType);
-						if (r == null) {
-							if (hasInnerEscapes)
-								out.append(unEscapeChars(s.substring(x2, i+1), new char[]{'\\','$','{','}'}));
-							else
-								out.append(s, x2, i+1);
-							x = i+1;
-						} else {
-							String replacement = r.doResolve(varVal);
-							if (replacement == null)
-								replacement = "";
-							// If the replacement also contains variables, replace them now.
-							if (replacement.indexOf('$') != -1)
-								replacement = resolve(replacement);
-							out.append(replacement);
-							x = i+1;
-						}
-						state = 1;
-						hasInnerEscapes = false;
-					}
-				}
-			}
-		}
-		if (isInEscape)
-			out.append("\\");
-		else if (state == S2)
-			out.append("$").append(unEscapeChars(s.substring(x+1), new char[]{'{', '\\'}));
-		else if (state == S3)
-			out.append("$").append(varType).append('{').append(unEscapeChars(s.substring(x+1), new char[]{'\\','$','{','}'}));
-		return out;
-	}
-
-	private StringVar getVar(String varType) {
-		StringVar v = varMap.get(varType);
-		if (v == null && parent != null)
-			v = parent.getVar(varType);
-		return v;
-	}
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.class
deleted file mode 100755
index 901efeb..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.java b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.java
deleted file mode 100755
index e1f63eb..0000000
--- a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/StringVarWithDefault.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Licensed Materials - Property of IBM
- * (c) Copyright IBM Corporation 2015. All Rights Reserved.
- *
- *  The source code for this program is not published or otherwise
- *  divested of its trade secrets, irrespective of what has been
- *  deposited with the U.S. Copyright Office.
- *******************************************************************************/
-package com.ibm.juno.core.utils;
-
-
-/**
- * Interface for the resolution of string vars with a default value if the <code>resolve(String)</code> method returns <jk>null</jk>.
- * <p>
- * For example, to resolve the system property <js>"myProperty"</js> but resolve to <js>"not found"</js> if the property doesn't exist:
- * <js>"$S{myProperty,not found}"</js>
- */
-public abstract class StringVarWithDefault extends StringVar {
-
-	@Override /* StringVar*/
-	public String doResolve(String s) {
-		int i = s.indexOf(',');
-		if (i == -1)
-			return resolve(s);
-		String[] s2 = StringUtils.split(s, ',');
-		String v = resolve(s2[0]);
-		if (v == null)
-			v = s2[1];
-		return v;
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$1.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$1.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$1.class
deleted file mode 100755
index 6ca8b6e..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$1.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$NoCloseOutputStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$NoCloseOutputStream.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$NoCloseOutputStream.class
deleted file mode 100755
index d759a42..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream$NoCloseOutputStream.class and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/30947fd7/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.class
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.class b/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.class
deleted file mode 100755
index edffdca..0000000
Binary files a/com.ibm.team.juno.releng/bin/core/com/ibm/juno/core/utils/TeeOutputStream.class and /dev/null differ