public final boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException, IllegalAccessException, InvocationTargetException { if(!req.tokens.hasMore() || !req.tokens.peek().equals(name)) return false; if(req.tokens.countRemainingTokens()<=argCount) return false; req.tokens.next(); boolean b = doDispatch(req, rsp, node); if (!b) req.tokens.prev(); // cancel the next effect return b; }
TokenList(String url) { StringTokenizer tknzr = new StringTokenizer(url, "/\\"); tokens = new String[tknzr.countTokens()]; rawTokens = new String[tknzr.countTokens()]; for (int i = 0; tknzr.hasMoreTokens(); i++) { rawTokens[i] = tknzr.nextToken(); tokens[i] = decode(rawTokens[i]); // Do not allow directory traversal if (tokens[i].equals("..")) { throw new IllegalArgumentException(url); } } }
public String getOriginalRestOfPath() { return tokens.assembleOriginalRestOfPath(); }
public boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException { // check Jelly view String next = req.tokens.peek(); if(next==null) return false; // only match the end of the URL if (req.tokens.countRemainingTokens()>1) return false; // and avoid serving both "foo" and "foo/" as relative URL semantics are drastically different if (req.getRequestURI().endsWith("/")) return false; URL res = findResource(owner.klass,next); if(res==null) return false; // no Jelly script found req.tokens.next(); Dispatcher.anonymizedTraceEval(req, rsp, node, "%s: Static view: %s", next); if (traceable()) { // Null not expected here trace(req,rsp,"-> %s on <%s>", next, node); } rsp.serveFile(req, res); return true; }
public boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException { if(!req.tokens.hasMore()) return false; try { String key = req.tokens.peek(); if(traceable()) traceEval(req,rsp,"((Map)",").get(\""+key+"\")"); Object item = ((Map)node).get(key); if(item!=null) { req.tokens.next(); req.getStapler().invoke(req,rsp,item); return true; } else { // otherwise just fall through if(traceable()) trace(req,rsp,"Map.get(\""+key+"\")==null. Back tracking."); return false; } } catch (NumberFormatException e) { return false; // try next } } public String toString() {
public boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IllegalAccessException, InvocationTargetException, IOException, ServletException { if(!req.tokens.hasMore()) return false; String token = req.tokens.next(); if(traceable()) traceEval(req,rsp,node,"getDynamic(\""+token+"\",...)"); Object target = f.bindAndInvoke(node, req,rsp, token); if(target!=null) { req.getStapler().invoke(req,rsp, target); return true; } else { if(traceable()) // indent: "-> evaluate( trace(req,rsp," %s.getDynamic(\"%s\",...)==null. Back tracking.",node,token); req.tokens.prev(); // cancel the next effect return false; } } public String toString() {
@Override public boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException { String next = req.tokens.peek(); if(next==null) return false; // only match the end of the URL if (req.tokens.countRemainingTokens()>1) return false; // and avoid serving both "foo" and "foo/" as relative URL semantics are drastically different if (req.getRequestURI().endsWith("/")) return false; if (!isBasename(next)) { // potentially an attempt to make a folder traversal return false; } Script script = tearOff.findScript(next); if (script == null) { // no script found return false; } return invokeScript(req, rsp, node, next, script); } });
public int nextAsInt() throws NumberFormatException { String p = peek(); if(p==null) throw new NumberFormatException(); // no more token int i = Integer.valueOf(p); idx++; return i; }
protected boolean invokeScript(RequestImpl req, ResponseImpl rsp, Object node, String next, Script script) throws IOException, ServletException { try { if(script==null) return false; req.tokens.next(); if(traceable()) trace(req,rsp,"Invoking "+next+" on "+node+" for "+req.tokens); WebApp.getCurrent().getFacet(JellyFacet.class).scriptInvoker.invokeScript(req, rsp, script, node); return true; } catch (RuntimeException e) { throw e; } catch (IOException e) { throw e; } catch (Exception e) { throw new ServletException(e); } }
public String peek() { if(hasMore()) return tokens[idx]; else return null; }
public boolean doDispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException, IllegalAccessException, InvocationTargetException { if(isAccepted){ String token = req.tokens.next(); Dispatcher.anonymizedTraceEval(req, rsp, node, "%s#%s(String)", ff.getName()); if(traceable()) traceEval(req,rsp,node,ff.getName()+"(\""+token+"\")"); req.getStapler().invoke(req,rsp, ff.invoke(req, rsp, node,token)); return true; }else{ String token = req.tokens.next(); try{ return webApp.getFilteredGetterTriggerListener().onGetterTrigger(f, req, rsp, node, ff.getName()+"(\""+token+"\")"); } finally{ req.tokens.prev(); } } } public String toString() {
public boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException { if(!req.tokens.hasMore()) return false; try { int index = req.tokens.nextAsInt(); if(traceable()) traceEval(req,rsp,node,"((Object[])",")["+index+"]"); req.getStapler().invoke(req,rsp, ((Object[]) node)[index]); return true; } catch (NumberFormatException e) { return false; // try next } } public String toString() {
public String getRestOfPath() { return tokens.assembleRestOfPath(); }
/** * Performs stapler processing on the given root object and request URL. */ public void invoke(HttpServletRequest req, HttpServletResponse rsp, Object root, String url) throws IOException, ServletException { RequestImpl sreq = new RequestImpl(this, req, new ArrayList<AncestorImpl>(), new TokenList(url)); RequestImpl oreq = CURRENT_REQUEST.get(); CURRENT_REQUEST.set(sreq); ResponseImpl srsp = new ResponseImpl(this, rsp); ResponseImpl orsp = CURRENT_RESPONSE.get(); CURRENT_RESPONSE.set(srsp); try { invoke(sreq,srsp,root); } finally { CURRENT_REQUEST.set(oreq); CURRENT_RESPONSE.set(orsp); } }
public boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException { // check Jelly view String next = req.tokens.peek(); if(next==null) return false; // only match the end of the URL if (req.tokens.countRemainingTokens()>1) return false; // and avoid serving both "foo" and "foo/" as relative URL semantics are drastically different if (req.getRequestURI().endsWith("/")) return false; URL res = findResource(owner.klass,next); if(res==null) return false; // no Jelly script found req.tokens.next(); Dispatcher.anonymizedTraceEval(req, rsp, node, "%s: Static view: %s", next); if (traceable()) { // Null not expected here trace(req,rsp,"-> %s on <%s>", next, node); } rsp.serveFile(req, res); return true; }
public boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException { if(!req.tokens.hasMore()) return false; try { String key = req.tokens.peek(); Dispatcher.anonymizedTraceEval(req, rsp, node, "%s: Map access"); if(traceable()) traceEval(req,rsp,"",".get(\""+key+"\")"); Object item = klass.getMapElement(node,key); if(item!=null) { req.tokens.next(); req.getStapler().invoke(req,rsp,item); return true; } else { // otherwise just fall through if(traceable()) trace(req,rsp,"Map.get(\""+key+"\")==null. Back tracking."); return false; } } catch (NumberFormatException e) { return false; // try next } } public String toString() {
public boolean dispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IllegalAccessException, InvocationTargetException, IOException, ServletException { if(!req.tokens.hasMore()) return false; String token = req.tokens.next(); Dispatcher.anonymizedTraceEval(req, rsp, node, "%s#getDynamic(...)"); if(traceable()) traceEval(req,rsp,node,"getDynamic(\""+token+"\",...)"); Object target = ff.bindAndInvoke(node, req,rsp, token); if(target!=null) { req.getStapler().invoke(req,rsp, target); return true; } else { if(traceable()) // indent: "-> evaluate( trace(req,rsp," %s.getDynamic(\"%s\",...)==null. Back tracking.",node,token); req.tokens.prev(); // cancel the next effect return false; } } public String toString() {
public long nextAsLong() throws NumberFormatException { String p = peek(); if(p == null) { throw new NumberFormatException(); // no more token } long asLongValue = Long.valueOf(p); idx++; return asLongValue; }
public boolean doDispatch(RequestImpl req, ResponseImpl rsp, Object node) throws IOException, ServletException, IllegalAccessException, InvocationTargetException { String token = req.tokens.next(); if(traceable()) traceEval(req,rsp,node,f.getName()+"(\""+token+"\")"); req.getStapler().invoke(req,rsp, f.invoke(req,node,token)); return true; } public String toString() {
public String peek() { if(hasMore()) return tokens[idx]; else return null; }