src/main/java/js/net/HttpRmiServlet.java
private static String className(String classPath) {
		StringBuilder className = new StringBuilder();
		char separator = '.';
		char c = classPath.charAt(1);
		// i = 1 to skip leading path separator
		for (int i = 1;;) {
			if (c == '/') {
				c = separator;
			}
			className.append(c);

			if (++i == classPath.length()) {
				break;
			}

			c = classPath.charAt(i);
			// after first class detected change separator to dollar since rest are inner classes
			// this solution copes well with not restricted inner level
			if (Character.isUpperCase(c)) {
				separator = '$';
			}
		}
		return className.toString();
	}
private static String className(String classPath) {
		StringBuilder className = new StringBuilder();
		char separator = '.';
		char c = classPath.charAt(1);
		// i = 1 to skip leading path separator
		for (int i = 1;;) {
			if (c == '/') {
				c = separator;
			}
			className.append(c);

			if (++i == classPath.length()) {
				break;
			}

			c = classPath.charAt(i);
			// after first class detected change separator to dollar since rest are inner classes
			// this solution copes well with not restricted inner level
			if (Character.isUpperCase(c)) {
				separator = '$';
			}
		}
		return className.toString();
	}
private static String className ( String classPath ) { StringBuilder className = new StringBuilder ( ) ; char separator = ' ' ; char c = classPath . charAt ( 1 ) ; // i = 1 to skip leading path separator
 for ( int i = 1 ; ; ) { if ( c == ' ' ) { c = separator ; } className . append ( c ) ; if ( ++ i == classPath . length ( ) ) { break ; } c = classPath . charAt ( i ) ; // after first class detected change separator to dollar since rest are inner classes
 // this solution copes well with not restricted inner level
 if ( Character . isUpperCase ( c ) ) { separator = ' ' ; } } return className . toString ( ) ; }
Extract qualified class name, including inner classes, from class path part of the request path. Class path parameter is
the class name but with slash as separator, e.g. <code>/sixqs/site/controller/ParticipantController</code>. This helper
handles inner classes using standard notation with '$' separator; for example
<code>/js/test/net/RmiController/Query</code> is converted to <code>js.test.net.RmiController$Query</code>.
<p>
Class nesting is not restricted to a single level. For example <code>/js/test/net/RmiController/Query/Item</code> is
converted to <code>js.test.net.RmiController$Query$Item</code>.
<p>
It is expected that class path argument to be well formed. If class path argument is not valid this method behavior is
not defined.

@param classPath qualified class name using slash as separator and with leading path separator.
@return qualified class name using dollar notation for inner classes.
Extract qualified class name including inner classes from class path part of the request path . Class path parameter is the class name but with slash as separator e . g . <code > / sixqs / site / controller / ParticipantController< / code > . This helper handles inner classes using standard notation with $ separator ; for example <code > / js / test / net / RmiController / Query< / code > is converted to <code > js . test . net . RmiController$Query< / code > . <p > Class nesting is not restricted to a single level . For example <code > / js / test / net / RmiController / Query / Item< / code > is converted to <code > js . test . net . RmiController$Query$Item< / code > . <p > It is expected that class path argument to be well formed . If class path argument is not valid this method behavior is not defined .