package water.api;
import java.util.HashMap;
import java.util.Map;
import hex.GridSearch;
import hex.glm.GLM2;
import hex.la.DMatrix;
import water.*;
import water.api.RequestBuilders.Response;
import water.fvec.Frame;
import water.util.RString;
import water.util.UIUtils;
/**
* This is just a simple Spring-like name-driven request redirector.
*
* <p>The page never returns actual content, but provides a
* redirect to proper page.</p>
*
* <p>
* Note: The best redirector would be based on a simple pattern:
* incoming class name is suffixed by "View" which composes a redirect link.</p>
*
*/
public class Inspector extends Request2 {
static final int API_WEAVER=1; // This file has auto-gen'd doc & json fields
static public DocGen.FieldDoc[] DOC_FIELDS; // Initialized from Auto-Gen code.
private static Map<Class, String[]> REDIRECTS;
static {
REDIRECTS = new HashMap<Class, String[]>();
// All attempts to view frame redirect to Inspect frame
REDIRECTS.put(Frame.class, sa("/2/Inspect2", "src_key"));
// All attempts to view a model redirect to <model_name>View
REDIRECTS.put(Model.class, sa("/2/%typename{}View", "_modelKey"));
REDIRECTS.put(GLM2.GLMGrid.class, sa("/2/GLMGridView", "grid_key"));
REDIRECTS.put(GridSearch.class, sa("/2/%typename{}Progress", "destination_key"));
REDIRECTS.put(DMatrix.MatrixMulStats.class,sa("/2/MMStats","src_key"));
}
@API(help="H2O key to inspect.", filter=Default.class, json=true, required=true, gridable=false)
Key src_key;
@Override protected Response serve() {
Value v = DKV.get(src_key);
if (v==null) throw new IllegalArgumentException("Key " + src_key + " does not exist!");
String typename = v.className();
try {
Class klazz = Class.forName(typename);
if (REDIRECTS.containsKey(klazz)) {
String[] r = REDIRECTS.get(klazz);
return redirect(klazz.getSimpleName(), r[0], r[1]);
} else {
// Find first matching class
for (Class k : REDIRECTS.keySet()) {
if (k.isAssignableFrom(klazz)) {
String[] r = REDIRECTS.get(k);
return redirect(klazz.getSimpleName(), r[0], r[1]);
}
}
}
} catch (ClassNotFoundException e) {
// This is critical error since it should not happen
return Response.error(e);
}
throw new IllegalArgumentException("Unknown key type! Key = " + src_key + " and type = " + typename);
}
public static String link(String txt, String key) {
return UIUtils.link(Inspector.class, "src_key", key, txt);
}
private Response redirect(String typename, String urlTemplate, String keyParamName) {
RString r = new RString(urlTemplate);
r.replace("typename", typename);
return Response.redirect(this, r.toString(), keyParamName, src_key.toString());
}
private static String[] sa(String ...s) { return s; }
//Called from some other page, to redirect that other page to this page.
public static Response redirect(Request req, Key src_key) {
return Response.redirect(req, "/2/Inspector", "src_key", src_key.toString());
}
}