public void destroy() { for (Iterator it = _aues.values().iterator(); it.hasNext(); ) { final AuExtension aue = (AuExtension) it.next(); try { aue.destroy(); } catch (Throwable ex) { log.warningBriefly("Unable to stop " + aue, ex); } } }
/** * Adds an AU extension and associates it with the specified prefix. * * <p>If there was an AU extension associated with the same name, the the old AU extension will be * replaced. * * <p>If you want to add an Au extension, even before DHtmlUpdateServlet is started, use {@link * #addAuExtension(WebApp, String, AuExtension)} instead. * * @param prefix the prefix. It must start with "/", but it cannot be "/" nor "/web" (which are * reserved). * @param extension the AU extension (never null). * @return the previous AU extension associated with the specified prefix, or null if the prefix * was not associated before. * @see #addAuExtension(WebApp,String,AuExtension) * @since 5.0.0 */ public AuExtension addAuExtension(String prefix, AuExtension extension) throws ServletException { checkAuExtension(prefix, extension); if (_aues.get(prefix) == extension) // speed up to avoid sync return extension; // nothing changed extension.init(this); // To avoid using sync in doGet(), we make a copy here final AuExtension old; synchronized (this) { final Map ps = new HashMap(_aues); old = (AuExtension) ps.put(prefix, extension); _aues = ps; } if (old != null) try { old.destroy(); } catch (Throwable ex) { log.warningBriefly("Unable to stop " + old, ex); } return old; }
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { final String pi = Https.getThisPathInfo(request); // if (log.finerable()) log.finer("Path info: "+pi); final ServletContext ctx = getServletContext(); final boolean withpi = pi != null && pi.length() != 0; if (withpi && pi.startsWith(ClassWebResource.PATH_PREFIX)) { // use HttpSession to avoid loading SerializableSession in GAE // and don't retrieve session if possible final ClassWebResource cwr = getClassWebResource(); final HttpSession hsess = shallSession(cwr, pi) ? request.getSession(false) : null; Object oldsess = null; if (hsess == null) { oldsess = SessionsCtrl.getRawCurrent(); SessionsCtrl.setCurrent(new SessionResolverImpl(ctx, request)); // it might be created later } WebApp wapp; Session sess; final Object old = hsess != null ? (wapp = WebManager.getWebAppIfAny(ctx)) != null && (sess = SessionsCtrl.getSession(wapp, hsess)) != null ? I18Ns.setup(sess, request, response, "UTF-8") : I18Ns.setup(hsess, request, response, "UTF-8") : Charsets.setup(null, request, response, "UTF-8"); try { cwr.service(request, response, pi.substring(ClassWebResource.PATH_PREFIX.length())); } finally { if (hsess != null) I18Ns.cleanup(request, old); else { Charsets.cleanup(request, old); SessionsCtrl.setRawCurrent(oldsess); } } return; // done } final Session sess = WebManager.getSession(ctx, request, false); if (withpi) { final AuExtension aue = getAuExtensionByPath(pi); if (aue == null) { response.sendError(response.SC_NOT_FOUND); log.debug("Unknown path info: " + pi); return; } Object oldsess = null; if (sess == null) { oldsess = SessionsCtrl.getRawCurrent(); SessionsCtrl.setCurrent(new SessionResolverImpl(ctx, request)); // it might be created later } final Object old = sess != null ? I18Ns.setup(sess, request, response, "UTF-8") : Charsets.setup(null, request, response, "UTF-8"); try { aue.service(request, response, pi); } finally { if (sess != null) I18Ns.cleanup(request, old); else { Charsets.cleanup(request, old); SessionsCtrl.setRawCurrent(oldsess); } } return; // done } // AU if (sess == null) { response.setIntHeader("ZK-Error", response.SC_GONE); // denote timeout // Bug 1849088: rmDesktop might be sent after invalidate // Bug 1859776: need send response to client for redirect or others final WebApp wapp = WebManager.getWebAppIfAny(ctx); final String dtid = getAuDecoder(wapp).getDesktopId(request); if (dtid != null) sessionTimeout(request, response, wapp, dtid); return; } // Feature 3285074 add no-cache for security risk. response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Cache-Control", "no-store"); response.setHeader("Expires", "-1"); final Object old = I18Ns.setup(sess, request, response, "UTF-8"); try { process(sess, request, response); } finally { I18Ns.cleanup(request, old); } }