/* * Copyright © 1999, Oracle Corporation. All rights reserved. */ package oracle.jsp.sample.event; import java.lang.reflect.*; import oracle.jsp.event.*; public class PageEventDispatcher extends Object implements JspScopeListener { private Object page; private String methodName; private Method method; public PageEventDispatcher() { } public Object getPage() { return page; } public void setPage(Object page) { this.page = page; } public String getMethodName() { return methodName; } public void setMethodName(String m) throws NoSuchMethodException, ClassNotFoundException { method = verifyMethod(m); methodName = m; } public void outOfScope(JspScopeEvent ae) { int scope = ae.getScope(); if ((scope == javax.servlet.jsp.PageContext.REQUEST_SCOPE || scope == javax.servlet.jsp.PageContext.PAGE_SCOPE) && method != null) { try { Object args[] = {ae.getApplication(), ae.getContainer()}; method.invoke(page, args); } catch (Exception e) { // catch all and continue } } } private Method verifyMethod(String m) throws NoSuchMethodException, ClassNotFoundException { if (page == null) throw new NoSuchMethodException("A page hasn't been set yet."); // Don't know whether this is a request or page handler so try one then the other Class c = page.getClass(); Class pTypes[] = {Class.forName("javax.servlet.ServletContext"), Class.forName("javax.servlet.jsp.PageContext")}; try { return c.getDeclaredMethod(m, pTypes); } catch (NoSuchMethodException nsme) { // fall through and try the request signature } pTypes[1] = Class.forName("javax.servlet.http.HttpServletRequest"); return c.getDeclaredMethod(m, pTypes); } }