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 00:08:33 UTC

[44/51] [partial] incubator-juneau git commit: Initial Juno contents from IBM JazzHub repo

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java
new file mode 100755
index 0000000..980f88c
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/RestMicroservice.java
@@ -0,0 +1,554 @@
+/*******************************************************************************
+ * Licensed Materials - Property of IBM
+ * � 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.microservice;
+
+import java.io.File;
+import java.util.*;
+import java.util.logging.*;
+
+import javax.servlet.Servlet;
+
+import org.eclipse.jetty.security.ConstraintMapping;
+import org.eclipse.jetty.security.ConstraintSecurityHandler;
+import org.eclipse.jetty.security.HashLoginService;
+import org.eclipse.jetty.security.SecurityHandler;
+import org.eclipse.jetty.security.authentication.BasicAuthenticator;
+import org.eclipse.jetty.server.*;
+import org.eclipse.jetty.server.ssl.SslSocketConnector;
+import org.eclipse.jetty.servlet.*;
+import org.eclipse.jetty.util.security.Constraint;
+import org.eclipse.jetty.util.security.Credential;
+import org.eclipse.jetty.util.ssl.SslContextFactory;
+
+import com.ibm.juno.core.ObjectMap;
+import com.ibm.juno.core.ini.ConfigFile;
+import com.ibm.juno.core.json.JsonSerializer;
+import com.ibm.juno.core.parser.ParseException;
+import com.ibm.juno.core.utils.*;
+import com.ibm.juno.microservice.resources.LogEntryFormatter;
+import com.ibm.juno.server.annotation.RestResource;
+
+
+/**
+ * Entry point for Juno microservice that implements a REST interface using Jetty on a single port.
+ * 
+ * <h6 class='topic'>Jetty Server Details</h6>
+ * <p>
+ * The Jetty server is created by the {@link #createServer()} method and started with the {@link #startServer()} method.
+ * These methods can be overridden to provided customized behavior.
+ * <p>
+ * 
+ * <h6 class='topic'>Defining REST Resources</h6>
+ * <p>
+ * Top-level REST resources are defined by the {@link #getResourceMap()} method.
+ * This method can be overridden to provide a customized list of REST resources.
+ * <p>
+ * 
+ * <h6 class='topic'>Logging</h6>
+ * <p>
+ * Logging is initialized by the {@link #initLogging()} method.
+ * This method can be overridden to provide customized logging behavior.
+ *
+ * <h6 class='topic'>Lifecycle Listener Methods</h6>
+ * Subclasses can optionally implement the following event listener methods:
+ * <ul>
+ * 	<li>{@link #onStart()} - Gets executed before {@link #start()}.
+ * 	<li>{@link #onStop()} - Gets executed before {@link #stop()}.
+ * 	<li>{@link #onCreateServer()} - Gets executed before {@link #createServer()}.
+ * 	<li>{@link #onStartServer()} - Gets executed before {@link #startServer()}.
+ * 	<li>{@link #onPostStartServer()} - Gets executed after {@link #startServer()}.
+ * 	<li>{@link #onStopServer()} - Gets executed before {@link #stop()}.
+ * 	<li>{@link #onPostStopServer()} - Gets executed after {@link #stop()}.
+ * </ul>
+ *
+ * @author jbognar@us.ibm.com
+ */
+public class RestMicroservice extends Microservice {
+
+	Server server;
+	int port;
+	Logger logger;
+
+	/**
+	 * Main method.
+	 * Subclasses must also implement this method!
+	 * 
+	 * @param args Command line arguments.
+	 * @throws Exception 
+	 */
+	public static void main(String[] args) throws Exception {
+		new RestMicroservice(args).start();
+	}
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param args The command line arguments.
+	 * @throws Exception 
+	 */
+	public RestMicroservice(String[] args) throws Exception {
+		super(args);
+	}
+
+	//--------------------------------------------------------------------------------
+	// Methods implemented on Microservice API
+	//--------------------------------------------------------------------------------
+
+	@Override /* Microservice */
+	protected void start() throws Exception {
+		super.start();
+		initLogging();
+		createServer();
+		startServer();
+	}
+
+	@Override /* Microservice */
+	public void stop() {
+		Thread t = new Thread() {
+			@Override /* Thread */
+			public void run() {
+				try {
+					onStopServer();
+					logger.warning("Stopping server.");
+					System.out.println();
+					server.stop();
+					logger.warning("Server stopped.");
+					onPostStopServer();
+				} catch (Exception e) {
+					logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
+				}
+			}
+		};
+		t.start();
+		try {
+			t.join();
+		} catch (InterruptedException e) {
+			e.printStackTrace();
+		}
+		super.stop();
+	}
+
+	//--------------------------------------------------------------------------------
+	// RestMicroservice API methods.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Initialize the logging for this microservice.
+	 * <p>
+	 * Subclasses can override this method to provide customized logging.
+	 * <p>
+	 * The default implementation uses the <cs>Logging</cs> section in the config file to set up logging:
+	 * <p class='bcode'>
+	 * 	<cc>#================================================================================
+	 * 	# Logger settings
+	 * 	# See FileHandler Java class for details.
+	 * 	#================================================================================</cc>
+	 * 	<cs>[Logging]</cs>
+	 * 	
+	 * 	<cc># The directory where to create the log file.
+	 * 	# Default is ".".</cc>
+	 * 	<ck>logDir</ck> = logs
+	 * 	
+	 * 	<cc># The name of the log file to create for the main logger.
+	 * 	# The logDir and logFile make up the pattern that's passed to the FileHandler
+	 * 	# constructor.
+	 * 	# If value is not specified, then logging to a file will not be set up.</cc>
+	 * 	<ck>logFile</ck> = microservice.%g.log
+	 * 	
+	 * 	<cc># Whether to append to the existing log file or create a new one.
+	 * 	# Default is false.</cc>
+	 * 	<ck>append</ck> =
+	 * 	
+	 * 	<cc># The SimpleDateFormat format to use for dates.
+	 * 	# Default is "yyyy.MM.dd hh:mm:ss".</cc>
+	 * 	<ck>dateFormat</ck> = 
+	 * 	
+	 * 	<cc># The log message format.
+	 * 	# The value can contain any of the following variables:
+	 * 	# 	{date} - The date, formatted per dateFormat.
+	 * 	#	{class} - The class name.
+	 * 	#	{method} - The method name.
+	 * 	#	{logger} - The logger name.
+	 * 	#	{level} - The log level name.
+	 * 	#	{msg} - The log message.
+	 * 	#	{threadid} - The thread ID.
+	 * 	#	{exception} - The localized exception message.
+	 * 	# Default is "[{date} {level}] {msg}%n".</cc>
+	 * 	<ck>format</ck> = 
+	 * 	
+	 * 	<cc># The maximum log file size.
+	 * 	# Suffixes available for numbers.
+	 * 	# See ConfigFile.getInt(String,int) for details.
+	 * 	# Default is 1M.</cc>
+	 * 	<ck>limit</ck> = 10M
+	 * 	
+	 * 	<cc># Max number of log files.
+	 * 	# Default is 1.</cc>
+	 * 	<ck>count</ck> = 5
+	 * 
+	 * 	<cc># Default log levels.
+	 * 	# Keys are logger names.
+	 * 	# Values are serialized Level POJOs.</cc>
+	 * 	<ck>levels</ck> = { com.ibm.juno:'INFO' }
+	 * 	
+	 * 	<cc># Only print unique stack traces once and then refer to them by a simple 8 character hash identifier.
+	 * 	# Useful for preventing log files from filling up with duplicate stack traces.
+	 * 	# Default is false.</cc>
+	 * 	<ck>useStackTraceHashes</ck> = true
+	 * 	
+	 * 	<cc># The default level for the console logger.
+	 * 	# Default is WARNING.</cc>
+	 * 	<ck>consoleLevel</ck> = WARNING
+	 * </p>
+	 * 
+	 * @throws Exception 
+	 */
+	protected void initLogging() throws Exception {
+		ConfigFile cf = getConfig();
+		logger = Logger.getLogger("");
+		String logFile = cf.getString("Logging/logFile");
+		if (! StringUtils.isEmpty(logFile)) {
+			LogManager.getLogManager().reset();
+			String logDir = cf.getString("Logging/logDir", ".");
+			FileUtils.mkdirs(new File(logDir), false);
+			boolean append = cf.getBoolean("Logging/append");
+			int limit = cf.getInt("Logging/limit", 1024*1024);
+			int count = cf.getInt("Logging/count", 1);
+			FileHandler fh = new FileHandler(logDir + '/' + logFile, limit, count, append);
+
+			boolean useStackTraceHashes = cf.getBoolean("Logging/useStackTraceHashes");
+			String format = cf.getString("Logging/format", "[{date} {level}] {msg}%n");
+			String dateFormat = cf.getString("Logging/dateFormat", "yyyy.MM.dd hh:mm:ss");
+			fh.setFormatter(new LogEntryFormatter(format, dateFormat, useStackTraceHashes));
+			logger.addHandler(fh);
+
+			ConsoleHandler ch = new ConsoleHandler();
+			ch.setLevel(Level.parse(cf.getString("Logging/consoleLevel", "WARNING")));
+			ch.setFormatter(new LogEntryFormatter(format, dateFormat, false));
+			logger.addHandler(ch);
+		}
+		ObjectMap loggerLevels = cf.getObject(ObjectMap.class, "Logging/levels");
+		if (loggerLevels != null)
+		for (String l : loggerLevels.keySet())
+			Logger.getLogger(l).setLevel(loggerLevels.get(Level.class, l));
+	}
+
+	/**
+	 * Method used to create (but not start) an instance of a Jetty server.
+	 * <p>
+	 * Subclasses can override this method to customize the Jetty server before it is started.
+	 * <p>
+	 * The default implementation is configured by the following values in the config file:
+	 * <p>
+	 * <p class='bcode'>
+	 * 	<cc>#================================================================================
+	 * 	# REST settings
+	 * 	#================================================================================</cc>
+	 * 	<cs>[REST]</cs>
+	 * 	
+	 * 	<cc># The HTTP port number to use.
+	 * 	# Default is Rest-Port setting in manifest file, or 8000.</cc>
+	 * 	<ck>port</ck> = 10000
+	 * 	
+	 * 	<cc># The context root of the Jetty server.
+	 * 	# Default is Rest-ContextPath in manifest file, or "/".</cc>
+	 * 	<ck>contextPath</ck> = 10000
+	 * 
+	 * 	<cc># Authentication:  NONE, BASIC.
+	 * 	# Default is Rest-AuthType in manifest file, or NONE.</cc>
+	 * 	<ck>authType</ck> = NONE
+	 * 
+	 * 	<cc># The BASIC auth username.
+	 * 	# Default is Rest-LoginUser in manifest file.</cc>
+	 * 	<ck>loginUser</ck> = 
+	 * 	
+	 * 	<cc># The BASIC auth password.
+	 * 	# Default is Rest-LoginPassword in manifest file.</cc>
+	 * 	<ck>loginPassword</ck> = 
+	 * 	
+	 * 	<cc># The BASIC auth realm.
+	 * 	# Default is Rest-AuthRealm in manifest file.</cc>
+	 * 	<ck>authRealm</ck> = 
+	 * 	
+	 * 	<cc># Enable SSL support.</cc>
+	 * 	<ck>useSsl</ck> = false
+	 * 
+	 * 	<cc>#================================================================================
+	 * 	# Bean properties on the org.eclipse.jetty.util.ssl.SslSocketFactory class
+	 * 	#--------------------------------------------------------------------------------
+	 * 	# Ignored if REST/useSsl is false.
+	 * 	#================================================================================</cc>
+	 * 	<cs>[REST-SslContextFactory]</cs>
+	 * 	<ck>keyStorePath</ck> = client_keystore.jks
+	 * 	<ck>keyStorePassword*</ck> = {HRAaRQoT}
+	 * 	<ck>excludeCipherSuites</ck> = TLS_DHE.*, TLS_EDH.*
+	 * 	<ck>excludeProtocols</ck> = SSLv3
+	 * 	<ck>allowRenegotiate</ck> = false
+	 * </p>
+	 * 
+	 * @return The newly-created server. 
+	 * @throws Exception 
+	 */
+	protected Server createServer() throws Exception {
+		onCreateServer();
+
+		ConfigFile cf = getConfig();
+		ObjectMap mf = getManifest();
+		
+		port = cf.getInt("REST/port", mf.getInt("Rest-Port", 8000));
+		String contextPath = cf.getString("REST/contextPath", mf.getString("Rest-ContextPath", "/"));
+
+		if (cf.getBoolean("REST/useSsl")) {
+
+			SslContextFactory sslContextFactory = new SslContextFactory();
+
+			// Write the properties in REST-SslContextFactory to the bean setters on sslContextFactory.
+			// Throws an exception if section contains unknown properties.
+			// Only look for bean properties of type String/String/boolean/int since class has multiple
+			// 	setters with the same name (e.g. setKeyStore(KeyStore) and setKeyStore(String)).
+			ObjectMap m = cf.writeProperties("REST-SslContextFactory", sslContextFactory, false, String.class, String[].class, boolean.class, int.class);
+
+			// We're using Jetty 8 that doesn't allow regular expression matching in SslContextFactory.setExcludeCipherSuites(), 
+			// so to prevent having the config file list all old cipher suites, exclude the known bad ones.
+			String[] excludeCipherSuites = ArrayUtils.combine(
+				StringUtils.split("SSL_RSA_WITH_DES_CBC_SHA,SSL_DHE_RSA_WITH_DES_CBC_SHA,SSL_DHE_DSS_WITH_DES_CBC_SHA,SSL_RSA_EXPORT_WITH_RC4_40_MD5,SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,TLS_DHE_RSA_WITH_AES_256_CBC_SHA256,TLS_DHE_DSS_WITH_AES_256_CBC_SHA256,TLS_DHE_RSA_WITH_AES_256_CBC_SHA,TLS_DHE_DSS_WITH_AES_256_CBC_SHA,TLS_DHE_RSA_WITH_AES_128_CBC_SHA256,TLS_DHE_DSS_WITH_AES_128_CBC_SHA256,TLS_DHE_RSA_WITH_AES_128_CBC_SHA,TLS_DHE_DSS_WITH_AES_128_CBC_SHA", ','),
+				sslContextFactory.getExcludeCipherSuites()
+			);
+			sslContextFactory.setExcludeCipherSuites(excludeCipherSuites);
+			
+			logger.log(Level.WARNING, "SSL properties set: {0}", JsonSerializer.DEFAULT_LAX.toString(m));
+
+			SslSocketConnector connector = new SslSocketConnector(sslContextFactory);
+			connector.setPort(port);
+
+			server = new Server();
+			server.setConnectors(new Connector[] { connector });
+
+		} else {
+			server = new Server(port);
+		}
+
+		ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
+
+		String authType = cf.getString("REST/authType", mf.getString("Rest-AuthType", "NONE"));
+		if (authType.equals("BASIC"))
+			context.setSecurityHandler(basicAuth(cf, mf));
+
+		context.setContextPath(contextPath);
+		server.setHandler(context);
+
+		for (Map.Entry<String,Class<? extends Servlet>> e : getResourceMap().entrySet())
+			context.addServlet(e.getValue(), e.getKey()).setInitOrder(0);
+
+		return server;
+	}
+
+	/**
+	 * Method used to start the Jetty server created by {@link #createServer()}.
+	 * <p>
+	 * Subclasses can override this method to customize server startup.
+	 * 
+	 * @throws Exception 
+	 */
+	protected void startServer() throws Exception {
+		onStartServer();
+		server.start();
+		logger.warning("Server started on port " + port);
+		onPostStartServer();
+		server.join();
+	}
+
+	/**
+	 * Returns the resource map to use for this microservice.
+	 * <p>
+	 * <p>
+	 * Subclasses can override this method to programmatically specify their resources.
+	 * <p>
+	 * The default implementation is configured by the following values in the config file:
+	 * <p>
+	 * <p class='bcode'>
+	 * 
+	 * 	<cc>#================================================================================
+	 * 	# REST settings
+	 * 	#================================================================================</cc>
+	 * 	<cs>[REST]</cs>
+	 * 	
+	 * 	<cc># A JSON map of servlet paths to servlet classes.
+	 * 	# Example:  
+	 * 	# 	resourceMap = {'/*':'com.ibm.MyServlet'}
+	 * 	# Either resourceMap or resources must be specified if it's not defined in 
+	 * 	# the manifest file.</cc>
+	 * 	<ck>resourceMap</ck> = 
+	 * 
+	 * 	<cc># A comma-delimited list of names of classes that extend from Servlet.
+	 * 	# Resource paths are pulled from @RestResource.path() annotation, or
+	 * 	# 	"/*" if annotation not specified.
+	 * 	# Example:  
+	 * 	# 	resources = com.ibm.MyServlet
+	 * 	 * 	# Default is Rest-Resources in manifest file.
+	 * 	# Either resourceMap or resources must be specified if it's not defined in 
+	 * 	# the manifest file.</cc>
+	 * 	<ck>resources</ck> =
+	 * </p>
+	 * <p>
+	 * 	In most cases, the rest resources will be specified in the manifest file since
+	 * 	it's not likely to be a configurable property:
+	 * <p>
+	 * <p class='bcode'>
+	 * 	<mk>Rest-Resources:</mk> com.ibm.juno.microservice.sample.RootResources
+	 * </p> 
+	 * 
+	 * @return The map of REST resources. 
+	 * @throws ClassNotFoundException 
+	 * @throws ParseException 
+	 */
+	@SuppressWarnings("unchecked")
+	protected Map<String,Class<? extends Servlet>> getResourceMap() throws ClassNotFoundException, ParseException {
+		ConfigFile cf = getConfig();
+		ObjectMap mf = getManifest();
+		Map<String,Class<? extends Servlet>> rm = new LinkedHashMap<String,Class<? extends Servlet>>();
+
+		ObjectMap resourceMap = cf.getObject(ObjectMap.class, "REST/resourceMap");
+		String[] resources = cf.getStringArray("REST/resources", mf.getStringArray("Rest-Resources"));
+
+		if (resourceMap != null && ! resourceMap.isEmpty()) {
+			for (Map.Entry<String,Object> e : resourceMap.entrySet()) {
+				Class<?> c = Class.forName(e.getValue().toString());
+				if (! ClassUtils.isParentClass(Servlet.class, c))
+					throw new ClassNotFoundException("Invalid class specified as resource.  Must be a Servlet.  Class='"+c.getName()+"'");
+				rm.put(e.getKey(), (Class<? extends Servlet>)c);
+			}
+		} else if (resources.length > 0) {
+			for (String resource : resources) {
+				Class<?> c = Class.forName(resource);
+				if (! ClassUtils.isParentClass(Servlet.class, c))
+					throw new ClassNotFoundException("Invalid class specified as resource.  Must be a Servlet.  Class='"+c.getName()+"'");
+				RestResource rr = c.getAnnotation(RestResource.class);
+				String path = rr == null ? "/*" : rr.path();
+				if (! path.endsWith("*"))
+					path += (path.endsWith("/") ? "*" : "/*");
+				rm.put(path, (Class<? extends Servlet>)c);
+			}
+		}
+		return rm;
+	}
+
+	/**
+	 * Called when {@link ConfigFile#save()} is called on the config file.
+	 * <p>
+	 * The default behavior is configured by the following value in the config file:
+	 * <p>
+	 * <p class='bcode'>
+	 * 	<cs>[REST]</cs>
+	 * 	
+	 * 	<cc># What to do when the config file is saved.
+	 * 	# Possible values:
+	 * 	# 	NOTHING - Don't do anything. (default)
+	 * 	#	RESTART_SERVER - Restart the Jetty server.
+	 * 	#	RESTART_SERVICE - Shutdown and exit with code '3'.</cc>
+	 * 	<ck>saveConfigAction</ck> = RESTART_SERVER
+	 * </p>
+	 */
+	@Override /* Microservice */
+	protected void onConfigSave(ConfigFile cf) {
+		try {
+			String saveConfigAction = cf.getString("REST/saveConfigAction", "NOTHING");
+			if (saveConfigAction.equals("RESTART_SERVER")) {
+				new Thread() {
+					@Override /* Thread */
+					public void run() {
+						try {
+							RestMicroservice.this.stop();
+							RestMicroservice.this.start();
+						} catch (Exception e) {
+							logger.log(Level.SEVERE, e.getLocalizedMessage(), e);
+						}
+					}
+				}.start();
+			} else if (saveConfigAction.equals("RESTART_SERVICE")) {
+				stop();
+				System.exit(3);
+			}
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	//--------------------------------------------------------------------------------
+	// Lifecycle listener methods.
+	//--------------------------------------------------------------------------------
+
+	/**
+	 * Called before {@link #createServer()} is called.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onCreateServer() {}
+
+	/**
+	 * Called before {@link #startServer()} is called.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onStartServer() {}
+
+	/**
+	 * Called after the Jetty server is started.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onPostStartServer() {}
+
+	/**
+	 * Called before the Jetty server is stopped.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onStopServer() {}
+
+	/**
+	 * Called after the Jetty server is stopped.
+	 * <p>
+	 * Subclasses can override this method to hook into the lifecycle of this application.
+	 */
+	protected void onPostStopServer() {}
+
+	//--------------------------------------------------------------------------------
+	// Other methods.
+	//--------------------------------------------------------------------------------
+
+	private static final SecurityHandler basicAuth(ConfigFile cf, ObjectMap mf) {
+
+		HashLoginService l = new HashLoginService();
+		String user = cf.getString("REST/loginUser", mf.getString("Rest-LoginUser"));
+		String pw = cf.getString("REST/loginPassword", mf.getString("Rest-LoginPassword"));
+		String realm = cf.getString("REST/authRealm", mf.getString("Rest-AuthRealm", ""));
+		String ctx = cf.getString("REST/contextPath", mf.getString("Rest-ContextPath", "/"));
+
+		l.putUser(user, Credential.getCredential(pw), new String[] { "user" });
+		l.setName(realm);
+
+		Constraint constraint = new Constraint();
+		constraint.setName(Constraint.__BASIC_AUTH);
+		constraint.setRoles(new String[] { "user" });
+		constraint.setAuthenticate(true);
+
+		ConstraintMapping cm = new ConstraintMapping();
+		cm.setConstraint(constraint);
+		cm.setPathSpec(ctx);
+
+		ConstraintSecurityHandler csh = new ConstraintSecurityHandler();
+		csh.setAuthenticator(new BasicAuthenticator());
+		csh.setRealmName("myrealm");
+		csh.addConstraintMapping(cm);
+		csh.setLoginService(l);
+
+		return csh;
+	}
+}

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build1.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build1.png
new file mode 100755
index 0000000..008c6b5
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build2.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build2.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build2.png
new file mode 100755
index 0000000..9e55346
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/build2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/helloworld1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/helloworld1.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/helloworld1.png
new file mode 100755
index 0000000..f5f0c7c
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/helloworld1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions1.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions1.png
new file mode 100755
index 0000000..1234828
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions2.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions2.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions2.png
new file mode 100755
index 0000000..4589f19
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions2.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions3.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions3.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions3.png
new file mode 100755
index 0000000..21808c0
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions3.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions4.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions4.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions4.png
new file mode 100755
index 0000000..b5e8471
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions4.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions5.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions5.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions5.png
new file mode 100755
index 0000000..50504de
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions5.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions6.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions6.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions6.png
new file mode 100755
index 0000000..e730d32
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/instructions6.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/manifest1.png
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/manifest1.png b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/manifest1.png
new file mode 100755
index 0000000..77604c1
Binary files /dev/null and b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/doc-files/manifest1.png differ

http://git-wip-us.apache.org/repos/asf/incubator-juneau/blob/7e4f63e6/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/javadoc.css
----------------------------------------------------------------------
diff --git a/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/javadoc.css b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/javadoc.css
new file mode 100755
index 0000000..036160c
--- /dev/null
+++ b/com.ibm.team.juno.microservice/src/com/ibm/juno/microservice/javadoc.css
@@ -0,0 +1,1039 @@
+/* Javadoc style sheet */
+/*
+Overall document style
+*/
+body {
+	background-image: linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -o-linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -moz-linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -webkit-linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -ms-linear-gradient(top, #cddddf 0, #eaeded 20px, #ffffff 70px);
+	background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #cddddf), color-stop(20px, #eaeded), color-stop(70px, #ffffff) );
+	background-repeat: no-repeat;
+	background-attachment: fixed;
+	color: #353833;
+	font-family: Arial, Helvetica, sans-serif;
+	font-size: 76%;
+	margin: 0;
+}
+
+a:link,a:visited {
+	text-decoration: none;
+	color: #4c6b87;
+}
+
+a:hover,a:focus {
+	text-decoration: none;
+	color: #bb7a2a;
+}
+
+a:active {
+	text-decoration: none;
+	color: #4c6b87;
+}
+
+a[name] {
+	color: #353833;
+}
+
+a[name]:hover {
+	text-decoration: none;
+	color: #353833;
+}
+
+h1 {
+	font-size: 1.5em;
+}
+
+h2 {
+	font-size: 1.4em;
+}
+
+h3 {
+	font-size: 1.3em;
+}
+
+h4 {
+	font-size: 1.2em;
+}
+
+h5 {
+	font-size: 1.1em;
+}
+
+h6 {
+	font-size: 1.0em;
+}
+
+ul {
+	list-style-type: disc;
+}
+
+code, 
+tt, 
+pre,
+dt code {
+	font-size: 9pt;
+}
+
+table tr td dt code {
+	font-size: 9pt;
+	vertical-align: top;
+}
+
+sup {
+	font-size: .6em;
+}
+
+/*
+Document title and Copyright styles
+*/
+.clear {
+	clear: both;
+	height: 0px;
+	overflow: hidden;
+}
+
+.aboutLanguage {
+	float: right;
+	padding: 0px 21px;
+	font-size: .8em;
+	z-index: 200;
+	margin-top: -7px;
+}
+
+.legalCopy {
+	margin-left: .5em;
+}
+
+.bar a,
+.bar a:link,
+.bar a:visited,
+.bar a:active {
+	color: #ffffff;
+	text-decoration: none;
+}
+
+.bar a:hover,
+.bar a:focus {
+	color: #bb7a2a;
+}
+
+.tab {
+	background-color: #0066ff;
+	background-image: url('data:image/gif;base64,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');
+	background-position: left top;
+	background-repeat: no-repeat;
+	color: #ffffff;
+	padding: 8px;
+	width: 5em;
+	font-weight: bold;
+}
+/*
+Navigation bar styles
+*/
+.bar {
+	background-image: url('data:image/gif;base64,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');
+	background-repeat: repeat-x;
+	color: #ffffff;
+	padding: .8em .5em .4em .8em;
+	height: auto; /*height:1.8em;*/
+	font-size: 1em;
+	margin: 0;
+}
+
+.topNav {
+	background-image: url('data:image/gif;base64,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');
+	background-repeat: repeat-x;
+	color: #ffffff;
+	float: left;
+	padding: 0;
+	width: 100%;
+	clear: right;
+	height: 2.8em;
+	padding-top: 10px;
+	overflow: hidden;
+}
+
+.bottomNav {
+	margin-top: 10px;
+	background-image: url('data:image/gif;base64,R0lGODlhMgBwAOYAAAAAAP///z1bcT5ccj9dc0NieUBedERjekFfdUtthlZ6lTxbcT1ccjxbcD5dcz1ccTtZbUJieUFhdz9edD5dcjxZbjxabjtYbEZogEVmfkVnfkRlfENjekJieEBfdT9ecz1bbzxZbUZof0VmfURle0NjeUJhd0BfdD1abk5zjEtvh0pthUlrg0hqgURkek1xiUxviExwiEtuhklrglN5k1F2kFB1jk9zjE5xik5yiktthVJ2kFJ3kFF2j05xiVd9mFV6lVR5k1F1jld9l1Z7lVV6lFqAm1l/mVh9mFh+mFqAml2DnluAm1uBm1p/mV2DnWGIo2CGoV+FoF+Fn16Dnl6Enl2CnGKIo2KJo2GHomGIomCFoGCGoGKHomKIomGGoWGHoWOIo2OJozxbb0VofzxbbjtZbEZpgDxabUhrgkJid0Fhdklsg0hrgTxZbE5ziz1abU90jElrgUhqgFN5klB1jVR6k1F2jll/mFqAmVyCm12DnP///wAAAAAAAAAAACH5BAEAAHwALAAAAAAyAHAAAAf/gGYhgmaFgiGIg4OEi4WJiISGkIuNh4mWgheGbpOWipqFnJchoI+ToGZuFhUQrK2trrAQs6+vFbG1rLe5s7quaMDAcCgoaCjDw8EhwcPFx8fMxMbB0c7DZWUg2iBj3Nnb2djb3N7j291j3+bo3wsLDe/wAg0P8A32C/Px+fT2/vz19t0DCI/BAAYPBgx4gPAgg4YLDyZc2PDhw4kME1bEWJEBAQoEHBD46ICCSAciKagcKZKkyZAnR5p82bLlzJMfDBjI+aFnzp0TJvTUuXOnT50fJhT1+bOp0aE7T0iVigDBCQ8IPEjValUr1a5Zp369alXsiapktUqQsMZEWxMm/9aumbtGTdy5buHGZUs3L1y5btu+3Tu3Q4QIJQp0KHF4MWLEHQwjVsw
 4gmPGiR1bnjxZs2MXB0qI5uCiBIcDHEq4cJG6tGjTpU+3fk3adOjXo2OjLrGBhO/evUlsGA5cuG/jwYknN858efLhGTKMGCE9unUN0bFn0DC9uvXt0qlTt969/PftZDCoV3+GjAgMItKvP/N+vnv48u3XX68f/5wWc8zRBoD/EdhCG3IcSOCAAbZgYIAMFgghhAYSyAYbaczAwoYbsqEhCxdiiOGHHHq4YYYcdogiiimamIAOCSQgQ4wzxriCjCvosMKNMtIYYwI89iikj0LWCKQKMcAAg/8KSi6pApNKQtmklE9KueSUUGaJJZM4vJDDl116+cKYOeDgAw5oflkmmWN6qWaYObip5ppijpnCDW/cgOcbceDZp55vBIonoHz6CSihfQo66J6J9mlDHXXcIcQdNlA6KaQ2CKGpEJFOWmmmd0DaKaWWdjrqp5fysAMPrO6wQw871MBqDzz0QKusrb4a66ysqqorrr36CiuuNNBABx1BFEuHHcfSkKyxxx777LLNBiGtssxKe62x2dJQhAJEEAGuuEQUYS4RQABRRLjhjguuueu2K2+87s5r7g9JIJFEEvj2+wO+QwyBhL768mvwv/gW3C+/BSt88L95OCExHng4gUf/xBFffMQRFE9c8cVOZOyxxRFPPDLIESthhBFMNKGEyka43AQTSjDR8sotv7yyzEyw7DLMTfjss84xK9GEHnpYobQVeuxhhdNI77FH004v3fTTTCdttdNVL6301VA/scQSVFDxxBNVVIG22FSovUQVZJuNttpux3122mxTYffca0uxxd9TTOH331xwMQUXfh8OuOB/b1H4FIsP3jjkWwQueeFgRPEFF19kHoXmYIDBReabg7F555+DLvrpnmt+Ouupdw5GF6FnQfvsXWThBRheeNFF7rXf/rvuvINhe+jDG0/78bgTL8YVXlwRxvRePH+FGNVfcX0Y0U/PvfXYd0/9//Pdi/+99s9DoQUU7GOBhRZavM/+
 Fe2v3/778a9vPxTuw2///v3Ln/sGSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jCFrrwhTCMoQxnSMMa2vCGOMyhDnfIwx76EIb0AyD+5AcF+vFPiPCTHxLhx74lvo980hsf+rK3PfNRMXxRPF/5snjF2zFveLvrXfKUh7zchZGMzSPjF80YOs1xrnWyG50bTffG2IWOc3X83Bdel0fVSc5yjXsc4irHhcgF0nCGbFzlEuk4Lohtb3hzW9vEBrey3Y1uj7Qk3+IGSUwizf9rYMua1KgGSq5lrZRY89rXTKkHmOUMaEajmc2CNjRYzqyWOxPaK3dmtJJZ7GMYI9nGOvZLkoXMYifzZcWKiTInJGxfC0NYEgI2sHxB82HPPBjD9uUwf/3gW/IiF7zQpS52kUuc5wrnu9RpryIoC1nYqtY7ozWtblkLntyi57aoRQcaqKpXrhoWr2zFA2AFdFe1AuivgpUrgfLgUaeyVKjqkKlNRRRUopIUqTJlKo2iKlR3yhOjDEWoPIk0UI061EgVddJCFapLb2ITmcyEJhzEtE5yolOc5gQmmb4ASVHa0pSaFNQoPYmoVNLSlYzKpBcRyUg3kkGOdvTUHwWpRkb/KhKRgHQhFpXoQyFKw4hSBKIPeVVFGjprWVnwHwo1yEAIUpBbJdRWAVVoQnZ9a4Dyw577xIc/9AGsX/mKgfbshz+FHWx0zPMd7TiWsdcJj3cWKx7xnEcDwUHOb4ij2d80h7OdXU5ohwMa2uimNaxRDW5qIxvV5sY2uHltayWTmcpcBjK0pUxjMNMZ23KmtruNAGAGIxe62IUvfiFMX4jLlsAkt7hmQQtWvMKVq0xFumERC3bNchawaMUpTEFKUKCylKMApbxQAa95P/CRkMikJCdJyUrc65L40vcm9LUJfENiEIhkxCH+lYhC/msR/25EwBTRCAPc8Y95BGQg8mhwZ
 j8EEuEHSzgg4jhHOcABggxrgx3m+PCG17FhaqChGcZARjGAsQxhSOMZcKjGNEyM4mesghe76AUuXOELWuBYF70Ico4VcYpNdOIRmTDyKEphiiSHghGG8IQiHBEJRyC5Ep2osicCAQA7');
+	background-repeat: repeat-x;
+	color: #ffffff;
+	float: left;
+	padding: 0;
+	width: 100%;
+	clear: right;
+	height: 2.8em;
+	padding-top: 10px;
+	overflow: hidden;
+}
+
+.subNav {
+	background-color: #dee3e9;
+	border-bottom: 1px solid #9eadc0;
+	float: left;
+	width: 100%;
+	overflow: hidden;
+}
+
+.subNav div {
+	clear: left;
+	float: left;
+	padding: 0 0 5px 6px;
+}
+
+ul.navList,
+ul.subNavList {
+	float: left;
+	margin: 0 25px 0 0;
+	padding: 0;
+}
+
+ul.navList li {
+	list-style: none;
+	float: left;
+	padding: 3px 6px;
+}
+
+ul.subNavList li {
+	list-style: none;
+	float: left;
+	font-size: 90%;
+}
+
+.topNav a:link,
+.topNav a:active,
+.topNav a:visited,
+.bottomNav a:link,
+.bottomNav a:active,
+.bottomNav a:visited {
+	color: #ffffff;
+	text-decoration: none;
+}
+
+.topNav a:hover,
+.bottomNav a:hover {
+	text-decoration: none;
+	color: #bb7a2a;
+}
+
+.navBarCell1Rev {
+	background-image: url('data:image/gif;base64,R0lGODlhAwAeANUAAAAAAP///9+VNfChOu+gOeKXNr58Kr18Krp6KbZ3KMyGLr9+K7t6Krh4KbZ3KdKKMM+IL8yGL8mELsiDLsWBLcWCLcKALLl4KtKLMd+UNdyRNNmPM9WNMvCgOuqcOOaZN+WYN+KWNtqQNPGhO+yeOuucOeeaOPOiPP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAACgALAAAAAADAB4AAAZAwJNwMBoQOgSS0lPymJ4f0CdUCGUEGY12I9pwvpgHBkJWRBQTyaRCqVjei/jBcGAgGI1LI+FI5Pd9f3x+eoJ9QQA7');
+	background-color: #a88834;
+	color: #ffffff;
+	margin: auto 5px;
+	border: 1px solid #c9aa44;
+}
+/*
+Page header and footer styles
+*/
+.header,
+.footer {
+	clear: both;
+	margin: 0 20px;
+	padding: 5px 0 0 0;
+}
+
+.indexHeader {
+	margin: 10px;
+	position: relative;
+}
+
+.indexHeader h1 {
+	font-size: 1.3em;
+}
+
+.title {
+	color: #2c4557;
+	margin: 10px 0;
+}
+
+.subTitle {
+	margin: 5px 0 0 0;
+}
+
+.header ul {
+	margin: 0 0 25px 0;
+	padding: 0;
+}
+
+.footer ul {
+	margin: 20px 0 5px 0;
+}
+
+.header ul li/*,
+.footer ul li*/ {
+	list-style: none;
+	font-size: 1.2em;
+}
+/*
+Heading styles
+*/
+div.details ul.blockList ul.blockList ul.blockList li.blockList h4,
+div.details ul.blockList ul.blockList ul.blockListLast li.blockList h4 {
+	background-color: #dee3e9;
+	border-top: 1px solid #9eadc0;
+	border-bottom: 1px solid #9eadc0;
+	margin: 0 0 6px -8px;
+	padding: 2px 5px;
+}
+
+ul.blockList ul.blockList ul.blockList li.blockList h3 {
+	background-color: #dee3e9;
+	border-top: 1px solid #9eadc0;
+	border-bottom: 1px solid #9eadc0;
+	margin: 0 0 6px -8px;
+	padding: 2px 5px;
+}
+
+ul.blockList ul.blockList li.blockList h3 {
+	padding: 0;
+	margin: 15px 0;
+}
+
+ul.blockList li.blockList h2 {
+	padding: 0px 0 20px 0;
+}
+/*
+Page layout container styles
+*/
+.contentContainer,
+.sourceContainer,
+.classUseContainer,
+.serializedFormContainer,
+.constantValuesContainer {
+	clear: both;
+	padding: 10px 20px;
+	position: relative;
+}
+
+.indexContainer {
+	margin: 10px;
+	position: relative;
+	font-size: 1.0em;
+}
+
+.indexContainer h2 {
+	font-size: 1.1em;
+	padding: 0 0 3px 0;
+}
+
+.indexContainer ul {
+	margin: 0;
+	padding: 0;
+}
+
+.indexContainer ul li {
+	list-style: none;
+}
+
+.contentContainer .description dl dt,
+.contentContainer .details dl dt,
+.serializedFormContainer dl dt {
+	font-size: 1.1em;
+	font-weight: bold;
+	margin: 10px 0 0 0;
+	color: #4e4e4e;
+}
+
+.contentContainer .description dl dd,
+.contentContainer .details dl dd,
+.serializedFormContainer dl dd {
+	margin: 10px 0 10px 20px;
+}
+
+.serializedFormContainer dl.nameValue dt {
+	margin-left: 1px;
+	font-size: 1.1em;
+	display: inline;
+	font-weight: bold;
+}
+
+.serializedFormContainer dl.nameValue dd {
+	margin: 0 0 0 1px;
+	font-size: 1.1em;
+	display: inline;
+}
+/*
+List styles
+*/
+ul.horizontal li {
+	display: inline;
+	font-size: 0.9em;
+}
+
+ul.inheritance {
+	margin: 0;
+	padding: 0;
+}
+
+ul.inheritance li {
+	display: inline;
+	list-style: none;
+}
+
+ul.inheritance li ul.inheritance {
+	margin-left: 15px;
+	padding-left: 15px;
+	padding-top: 1px;
+}
+
+ul.blockList,
+ul.blockListLast {
+	margin: 10px 0 10px 0;
+	padding: 0;
+}
+
+ul.blockList li.blockList,
+ul.blockListLast li.blockList {
+	list-style: none;
+	margin-bottom: 25px;
+}
+
+ul.blockList ul.blockList li.blockList,
+ul.blockList ul.blockListLast li.blockList {
+	padding: 0px 20px 5px 10px;
+	border: 1px solid #9eadc0;
+	background-color: #f9f9f9;
+}
+
+ul.blockList ul.blockList ul.blockList li.blockList,
+ul.blockList ul.blockList ul.blockListLast li.blockList {
+	padding: 0 0 5px 8px;
+	background-color: #ffffff;
+	border: 1px solid #9eadc0;
+	border-top: none;
+}
+
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockList {
+	margin-left: 0;
+	padding-left: 0;
+	padding-bottom: 15px;
+	border: none;
+	border-bottom: 1px solid #9eadc0;
+}
+
+ul.blockList ul.blockList ul.blockList ul.blockList li.blockListLast {
+	list-style: none;
+	border-bottom: none;
+	padding-bottom: 0;
+}
+
+table tr td dl,
+table tr td dl dt,
+table tr td dl dd {
+	margin-top: 0;
+	margin-bottom: 1px;
+}
+/*
+Table styles
+*/
+.contentContainer table,
+.classUseContainer table,
+.constantValuesContainer table {
+	border-bottom: 1px solid #9eadc0;
+	width: 100%;
+}
+
+.contentContainer ul li table,
+.classUseContainer ul li table,
+.constantValuesContainer ul li table {
+	width: 100%;
+}
+
+.contentContainer .description table,
+.contentContainer .details table {
+	border-bottom: none;
+}
+
+.contentContainer ul li table th.colOne,
+.contentContainer ul li table th.colFirst,
+.contentContainer ul li table th.colLast,
+.classUseContainer ul li table th,
+.constantValuesContainer ul li table th,
+.contentContainer ul li table td.colOne,
+.contentContainer ul li table td.colFirst,
+.contentContainer ul li table td.colLast,
+.classUseContainer ul li table td,
+.constantValuesContainer ul li table td {
+	vertical-align: top;
+	padding-right: 20px;
+}
+
+.contentContainer ul li table th.colLast,
+.classUseContainer ul li table th.colLast,
+.constantValuesContainer ul li table th.colLast,
+.contentContainer ul li table td.colLast,
+.classUseContainer ul li table td.colLast,
+.constantValuesContainer ul li table td.colLast,
+.contentContainer ul li table th.colOne,
+.classUseContainer ul li table th.colOne,
+.contentContainer ul li table td.colOne,
+.classUseContainer ul li table td.colOne {
+	padding-right: 3px;
+}
+
+.overviewSummary caption,
+.packageSummary caption,
+.contentContainer ul.blockList li.blockList caption,
+.summary caption,
+.classUseContainer caption,
+.constantValuesContainer caption {
+	position: relative;
+	text-align: left;
+	background-repeat: no-repeat;
+	color: #ffffff;
+	font-weight: bold;
+	clear: none;
+	overflow: hidden;
+	padding: 0px;
+	margin: 0px;
+}
+
+caption a:link,
+caption a:hover,
+caption a:active,
+caption a:visited {
+	color: #ffffff;
+}
+
+.overviewSummary caption span,
+.packageSummary caption span,
+.contentContainer ul.blockList li.blockList caption span,
+.summary caption span,
+.classUseContainer caption span,
+.constantValuesContainer caption span {
+	white-space: nowrap;
+	padding-top: 8px;
+	padding-left: 8px;
+	display: block;
+	float: left;
+	background-image: url(resources/titlebar.gif);
+	height: 18px;
+}
+
+.overviewSummary .tabEnd,.packageSummary .tabEnd,
+.contentContainer ul.blockList li.blockList .tabEnd,
+.summary .tabEnd,
+.classUseContainer .tabEnd,
+.constantValuesContainer .tabEnd {
+	width: 10px;
+	background-image: url('data:image/gif;base64,R0lGODlhEwAoAOYAAAAAAP////CgOe6fON+VNfChOu+gOeKXNvGiO+2fOtqOML58Kr17Kr18Krt6Kbp6KbZ2KLZ3KNuPMdqOMdqPMcyFLsyGLsiDLcOALMB+K799K79+K758K7t6Krh3Kbh4KbZ3KdKKMNKLMM+IL8yGL8mELsiDLsiELsaCLcWBLcWCLcJ/LMKALLl4Krh4KtKLMc+JMOWYNuOXNt+UNdyRNNmPM9WNMvCgOuqcOOibOOaYN+aZN+WYN+KWNt2SNdqQNNmQNNWOM/GhO/CgO+2eOuyeOuucOeudOeqcOeeaOPOiPN2VP92XQd+bSOezd+i1evnt4Pvy6v///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAFIALAAAAAATACgAAAf/gBQTCoQUChSGgoVNT1EBSpCRkpNDOkxQBQUICEIFnZ6ZnJkFO04GBpk3BqqrpwWqAgUDS0UJtkW4ubUJuLZECjhIR0dGOMXGwcTGSEgUSTlJ0dLS0NE50BM7PNs82jve3NoxPBQ9Mj09B+no6ufq5j0SM/MzBPXz9vj3BBI0PjQAAwb8N5CGghoIa/xQiHBhwxpAgNSgYCOIRRsYM1YMojHIhBcvQogMCTJESZMiTE4YAaPliJcwWcJ4OXMEBQsVSOi0QMICT5w7dZJQYKLEiRMlippQajRpiQsnJKhAQTWFCqtXp6KwuhXFBBYYWIgdOzasWAwrMEzYoCFDhg1wruOyfbvhbQYKDRowYLCgQV+/efnmbcBBQocHDhw8ONyBMeLFDyJT+OD
 iw4cWly1jroz5socJESJAgAAiQmnToUmHBgFicuXMnTdn9gxatOrTp1Wbbk1Z82zZsT+nvr06NW7erzHH7h18Qm/YvjlrFm67NG7jq5H7Xi6d9nDrxUUfd709+m/qo8GjFp+dPPTM3VugJ75eN2v3ys03/74+93hEiEwgSIAACijBIBQEAgA7');
+	background-repeat: no-repeat;
+	background-position: top right;
+	position: relative;
+	float: left;
+}
+
+ul.blockList ul.blockList li.blockList table {
+	margin: 0 0 12px 0px;
+	width: 100%;
+}
+
+.tableSubHeadingColor {
+	background-color: #EEEEFF;
+}
+
+.altColor {
+	background-color: #eeeeef;
+}
+
+.rowColor {
+	background-color: #ffffff;
+}
+
+.overviewSummary td,
+.packageSummary td,
+.contentContainer ul.blockList li.blockList td,
+.summary td,
+.classUseContainer td,.constantValuesContainer td {
+	text-align: left;
+	padding: 3px 3px 3px 7px;
+}
+
+th.colFirst,
+th.colLast,
+th.colOne,
+.constantValuesContainer th {
+	background: #dee3e9;
+	border-top: 1px solid #9eadc0;
+	border-bottom: 1px solid #9eadc0;
+	text-align: left;
+	padding: 3px 3px 3px 7px;
+}
+
+td.colOne a:link,
+td.colOne a:active,
+td.colOne a:visited,
+td.colOne a:hover,
+td.colFirst a:link,
+td.colFirst a:active,
+td.colFirst a:visited,
+td.colFirst a:hover,
+td.colLast a:link,
+td.colLast a:active,
+td.colLast a:visited,
+td.colLast a:hover,
+.constantValuesContainer td a:link,
+.constantValuesContainer td a:active,
+.constantValuesContainer td a:visited,
+.constantValuesContainer td a:hover {
+	font-weight: bold;
+}
+
+td.colFirst,
+th.colFirst {
+	border-left: 1px solid #9eadc0;
+	white-space: nowrap;
+}
+
+td.colLast,
+th.colLast {
+	border-right: 1px solid #9eadc0;
+}
+
+td.colOne,
+th.colOne {
+	border-right: 1px solid #9eadc0;
+	border-left: 1px solid #9eadc0;
+}
+
+table.overviewSummary {
+	padding: 0px;
+	margin-left: 0px;
+}
+
+table.overviewSummary td.colFirst,
+table.overviewSummary th.colFirst,
+table.overviewSummary td.colOne,
+table.overviewSummary th.colOne {
+	width: 25%;
+	vertical-align: middle;
+}
+
+table.packageSummary td.colFirst,
+table.overviewSummary th.colFirst {
+	width: 25%;
+	vertical-align: middle;
+}
+/*
+Content styles
+*/
+.description pre {
+	margin-top: 0;
+}
+
+.deprecatedContent {
+	margin: 0;
+	padding: 10px 0;
+}
+
+.docSummary {
+	padding: 0;
+}
+
+/*
+Formatting effect styles
+*/
+.sourceLineNo {
+	color: green;
+	padding: 0 30px 0 0;
+}
+
+h1.hidden {
+	visibility: hidden;
+	overflow: hidden;
+	font-size: .9em;
+}
+
+.block {
+	display: block;
+	margin: 0px;
+}
+
+.strong {
+	font-weight: bold;
+}
+
+/*--- Juno-specific styles --------------------------------------------------*/
+
+property {
+	font-size: 9pt;
+	font-family: monospace;
+	font-weight: bold;
+}
+
+/*--- Bordered code ---*/
+p.bcode {
+	font-size: 9pt;
+	white-space: pre;
+	border: 1px solid black;
+	margin: 0px 20px;
+	border-radius: 10px;
+	overflow: hidden;
+	font-family: monospace;
+	background-color: #f8f8f8;
+	border-color: #cccccc;
+	-moz-tab-size: 3;
+	tab-size: 3;
+	-o-tab-size: 3;
+}
+
+.fixedWidth {
+	max-width: 800px;
+}
+
+/* Override padding bottom in javadoc comments. */
+.blockList p.bcode {
+	padding-bottom: 0px !important;
+}
+
+/*--- Unbordered code ---*/
+p.code {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+	padding-bottom: 15px;
+	margin: -15px;
+}
+
+td.code {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+}
+
+table.code {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+}
+
+/*--- Java code effects ---*/
+jc,jd,jt,jk,js,jf,jsf,jsm,ja {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+}
+/* Comment */
+jc {
+	color: green;
+}
+/* Javadoc comment */
+jd {
+	color: #3f5fbf;
+}
+/* Javadoc tag */
+jt {
+	color: #7f9fbf;
+	font-weight: bold;
+}
+/* Primitive */
+jk {
+	color: #7f0055;
+	font-weight: bold;
+}
+/* String */
+js {
+	color: blue;
+}
+/* Field */
+jf {
+	color: blue;
+}
+/* Static field */
+jsf {
+	color: blue;
+	font-style: italic;
+}
+/* Static method */
+jsm {
+	font-style: italic;
+}
+/* Annotation */
+ja {
+	color: grey;
+}
+
+/*--- XML code effects ---*/
+xt,xa,xc,xs {
+	font-size: 9pt;
+	white-space: pre;
+	font-family: monospace;
+}
+
+xt {
+	color: DarkCyan;
+}
+
+xa {
+	color: purple;
+}
+
+xc {
+	color: mediumblue;
+}
+
+xs {
+	color: blue;
+	font-style: italic;
+}
+
+/*--- Override formatting on <table class='styled'> ---*/
+table.styled,.contentContainer .description table.styled,.contentContainer ul li table.styled,ul.blockList ul.blockList li.blockList table.styled
+	{
+	padding: 0px;
+	position: relative;
+	font-size: 1.1em;
+	width: auto;
+	border: 1px solid #9eadc0;
+	margin-left: 20px;
+	margin-right: 20px;
+	border-collapse: collapse;
+}
+
+table.styled th {
+	background-color: #dee3e9;
+	border: 1px solid #9eadc0;
+	padding: 3px 10px 3px 10px;
+}
+
+table.styled td {
+	padding: 3px;
+}
+
+table.styled ul {
+	padding: 0px 10px;
+}
+
+table.styled tr:nth-child(1) {
+	background-color: #dee3e9;
+}
+
+table.styled tr:nth-child(2n+2) {
+	background-color: #eeeeef;
+}
+
+table.styled tr:nth-child(2n+3) {
+	background-color: white;
+}
+
+/* Same as r1 except with a border on the bottom */
+table.styled tr.bb {
+	border-bottom: 1px solid #9eadc0
+}
+
+table.styled tr.light {
+	background-color: white !important;
+}
+
+table.styled tr.dark {
+	background-color: #eeeeef !important;
+}
+
+/*--- Juno topic headers ---*/
+h2.topic,
+h3.topic,
+h4.topic {
+	margin-bottom: 20px;
+	margin-top: 25px;
+	padding-top: 3px;
+	padding-left: 25px;
+	color: #2c4557;
+	border-top: 2px groove #9eadc0;
+	background-image: url('data:image/gif;base64,R0lGODlhEAAQAIQfACZJcSdKcjFTejVWfT5fhUFih0ZnjEhojUxskFFwk1Z0l1d1mFp4ml98nmaComiEpGuHpnKNq3SOrHiRroGZtYeeuJGmv5erwp+yx6O1yqm6zrDA0sTQ3s3X4+Dn7v///yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAB8ALAAAAAAQABAAAAVk4CeOZGmWgmEQG/k0MHw4UY0gY1PvfG3kvaBhUqk4IMgkcuGrdJ7QaCfDiBgunKx2m1VYP5KNeEze0H4VjHrNVh9+HodlTq9bEr9PhMLv+ykOAyIaNEE8ACMFiouMigEnkJGQIQA7');
+	background-repeat: no-repeat;
+	background-position: left center;
+}
+
+h2.closed,
+h3.closed,
+h4.closed {
+	background-image: url('data:image/gif;base64,R0lGODlhEAAQAIQYADNVfDhagUNkiUZnjEhojUxskE9vklFwlFd1mF17nWJ/oGaCo2+KqXKNq3aQrX2WsoGZtYObtoeeuJKowJ2wxqm6zrbF1sTQ3v///////////////////////////////yH+EUNyZWF0ZWQgd2l0aCBHSU1QACH5BAEAAB8ALAAAAAAQABAAAAVi4CeOZGmST6EGpLK8cNHMi6GI8qzvcyEikqBwGByIIJekcpmEiByWqHQadYgYlax2m2WIFpSweBxeiBKTtHqdTvwi8LgcjhAdHPi8Hn8QERiAgYKABCIAAoiJiogAJ46PjiEAOw==') !important;
+}
+
+div.topic {
+	margin-left: 10px;
+}
+
+h5.topic,
+h6.topic {
+	margin-bottom: 10px;
+	margin-top: 20px;
+	color: #2c4557;
+	text-decoration: underline;
+}
+
+h6 {
+	margin: 10px 0px;
+}
+
+h6.figure {
+	color: #2c4557;
+	margin-left: 30px;
+	margin-right: 30px;
+	margin-top: 10px;
+	margin-bottom: 0px;
+	font-style: italic;
+}
+
+/*--- Override how Javadoc handles unordered lists inside .footer ---*/
+ul.normal {
+	margin-top: 0px;
+}
+
+ul.normal li {
+	font-size: 100%;
+	list-style: disc;
+}
+
+/*--- Bordered images ---*/
+.bordered {
+	border: 1px solid #cccccc;
+	margin: 0px 20px;
+	border-radius: 10px;
+}
+
+.padded {
+	padding-left: 20px;
+	padding-right: 20px;
+}
+
+/*--- Rows with bottom borders ---*/
+tr.borderbottom td {
+	border-bottom: 1px solid #9eadc0
+}
+
+/* Article links */
+a.doclink {
+	font-weight: bold;
+}
+
+.nomargin {
+	margin: 0px;
+}
+
+ol.toc,
+ul.toc,
+.toc ol,
+.toc ul {
+	background: #dee3e9;
+	margin: 0px;
+	padding: 0px;
+}
+
+ul.toc,
+.toc ul {
+	list-style: disc;
+}
+
+ol.toc p,
+ul.toc p,
+.toc ol p,
+.toc ul p,
+ol.toc div,
+ul.toc div,
+.toc ol div,
+.toc ul div {
+	color: #353833;
+	font: normal 1em Arial, Helvetica, sans-serif;
+	font-size: 1em;
+	padding-bottom: 5px;
+	margin: 0px;
+}
+
+.toc li {
+	background: #FFFFFF;
+	margin-left: 30px;
+	padding-left: 5px;
+}
+
+/* Linear gradients */
+
+/* Light-colored background headers */
+h5.toc,
+h6.toc, 
+h2.title,
+div.docSummary > div.block,
+div.contentContainer > div.block > p:first-child {
+	background: linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;
+	background: -moz-linear-gradient(to bottom, #F5F5F5, #DEE3E9) repeat scroll 0% 0% transparent;
+	background: -webkit-gradient(linear, left top, left bottom, from(#F5F5F5), to(#DEE3E9) );
+}
+
+/* Dark-colored background headers */
+div.header > div.subTitle > div.block,
+div.footer > div.subTitle > div.block > p:first-child, 
+h1.title,
+div.contentContainer > h2:first-of-type,
+body > p:first-child {
+	background: linear-gradient(to bottom, #3B596D, #6289A3) repeat scroll 0% 0% transparent;
+	background: -moz-linear-gradient(to bottom, #3B596D, #6289A3) repeat scroll 0% 0% transparent;
+	background: -webkit-gradient(linear, left top, left bottom, from(#3B596D), to(#6289A3) );
+}
+
+/* Header styles */
+
+h5.toc,
+h6.toc {
+	color: #2C4557;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 15px 15px 15px 0px;
+	text-decoration: none;
+}
+
+/* Light-colored title on package summary pages */
+div.docSummary > div.block,
+div.contentContainer > div.block > p:first-child {
+	font-size: 1.2em;
+	font-weight: bold;
+	color: #2C4557;
+	margin-top: 0px;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 0px 0px 15px 15px;
+	text-decoration: none;
+}
+
+/* Dark-colored title on overview page */
+div.header > div.subTitle > div.block,
+div.footer > div.subTitle > div.block > p:first-child,
+body > p:first-child {
+	font-size: 1.2em;
+	font-weight: bold;
+	color: white;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 15px;
+	text-decoration: none;
+}
+
+/* Dark-colored package title on package summary pages */
+h1.title,
+div.contentContainer > h2:first-of-type {
+	font-size: 1.2em;
+	font-weight: bold;
+	color: white;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 15px 15px 0px 0px;
+	text-decoration: none;
+}
+
+/* Class titles */
+h2.title {
+	font-size: 1.2em;
+	font-weight: bold;
+	color: #2C4557;
+	margin-top: 0px;
+	margin-bottom: 0px;
+	padding: 5px 30px;
+	border-radius: 15px;
+	text-decoration: none;
+}
+
+
+.spaced-list li { padding:5px; }
+.footer .spaced-list ul { margin:0 }