package org.jrack.utils;
import org.jrack.Context;
import org.jrack.JRack;
import org.jrack.Rack;
import org.jrack.RackResponse;
public class InvokerRack extends JRack {
public static final String DOT = ".";
public static final String STAR = "*";
public static final String ESCAPED_DOT = "\\" + DOT;
private final String mask;
public InvokerRack(String mask) {
mask = mask.replace(DOT, ESCAPED_DOT);
mask = mask.replace(STAR, DOT + STAR);
this.mask = mask;
}
@Override
public RackResponse call(Context<String> input) throws Exception {
String clazz = input.get(Rack.PATH_INFO);
clazz = getClasspathFromUrl(clazz);
assertValidClass(clazz);
JRack rack = getRack(clazz);
return rack.call(input);
}
private String getClasspathFromUrl(String clazz) {
int indexOf = clazz.lastIndexOf('/');
if (indexOf != -1) {
return clazz.substring(indexOf + 1);
}
return clazz;
}
private JRack getRack(String classpath) throws Exception {
return (JRack) Class.forName(classpath).newInstance();
}
private void assertValidClass(String classpath) throws Exception {
if (classpath != null && !classpath.matches(mask)) {
throw new Exception(String.format("Invalid class [%s] for mask [%s]", classpath, mask));
}
}
}