package org.simpleframework.xml.strategy; import java.net.URI; class PackageParser { private static final String scheme = "http://"; public Class revert(String reference) throws Exception { URI uri = new URI(reference); String domain = uri.getHost(); String path = uri.getPath(); String[] list = domain.split("\\."); if(list.length > 1) { domain = list[1] + "." + list[0]; } else { domain = list[0]; } String type = domain + path.replaceAll("\\/+", "."); return Class.forName(type); } public String parse(String className) throws Exception { return new Convert(className).fastParse(); } public String parse(Class type) throws Exception { return new Convert(type.getName()).fastParse(); } public static class Convert { private char[] array; private int count; private int mark; private int size; private int pos; public Convert(String type) { this.array = type.toCharArray(); } public String fastParse() throws Exception { char[] work = new char[array.length + 10]; scheme(work); domain(work); path(work); return new String(work, 0, pos); } private void scheme(char[] work) { "http://".getChars(0, 7, work, 0); pos += 7; } private void path(char[] work) { for(int i = size; i < array.length; i++) { if(array[i] == '.') { work[pos++] = '/'; } else { work[pos++] = array[i]; } } } private void domain(char[] work) { while(size < array.length) { if(array[size] == '.') { if(count++ == 1) { break; } mark = size + 1; } size++; } for(int i = 0; i < size - mark; i++) { work[pos++] = array[mark + i]; } work[pos++] = '.'; work[size + 7] = '/'; for(int i = 0; i < mark - 1; i++) { work[pos++] = array[i]; } } } }