portletsupport.java
来自「RESIN 3.2 最新源码」· Java 代码 · 共 429 行
JAVA
429 行
/* * Copyright (c) 1998-2008 Caucho Technology -- all rights reserved * * This file is part of Resin(R) Open Source * * Each copy or derived work must preserve the copyright notice and this * notice unmodified. * * Resin Open Source is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Resin Open Source is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, or any warranty * of NON-INFRINGEMENT. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with Resin Open Source; if not, write to the * Free SoftwareFoundation, Inc. * 59 Temple Place, Suite 330 * Boston, MA 02111-1307 USA * * @author Sam */package com.caucho.portal;import com.caucho.util.L10N;import javax.portlet.*;import java.io.File;import java.io.IOException;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Collections;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.NoSuchElementException;import java.util.logging.Level;import java.util.logging.Logger;public class PortletSupport extends GenericPortlet { private static final L10N L = new L10N(PortletSupport.class); static protected final Logger log = Logger.getLogger(PortletSupport.class.getName()); private static final Class[] _actionMethodParams = new Class[] { ActionRequest.class, ActionResponse.class }; private static final Class[] _renderMethodParams = new Class[] { RenderRequest.class, RenderResponse.class }; private Map<PortletMode, ActionProxy> _actionProxyCache = Collections.synchronizedMap(new HashMap<PortletMode, ActionProxy>()); private Map<PortletMode, RenderProxy> _renderProxyCache = Collections.synchronizedMap(new HashMap<PortletMode, RenderProxy>()); private interface ActionProxy { public void processAction(ActionRequest request, ActionResponse response) throws PortletException, IOException; } private interface RenderProxy { public void render(RenderRequest request, RenderResponse response) throws PortletException, IOException; } public void init() throws PortletException { } protected <T> T useBean( PortletRequest request, String name, Class<T> c) { return useBean( request, name, c, true ); } protected <T> T useBean( PortletRequest request, String name, Class<T> c, boolean create ) { T bean = (T) request.getAttribute( name ); if (bean == null && create) { try { bean = c.newInstance(); } catch (Exception ex) { throw new RuntimeException(ex); } request.setAttribute( name, bean ); } return bean; } protected boolean isEmpty( String s ) { return s == null || s.length() == 0; } protected static <S extends PortletMediator> S createMediator( RenderRequest request, RenderResponse response, Class<S> mediatorClass ) throws PortletException { String namespace = response.getNamespace(); return createMediator( request, response, mediatorClass, namespace ); } protected static <S extends PortletMediator> S createMediator( RenderRequest request, RenderResponse response, Class<S> mediatorClass, String namespace ) throws PortletException { String attributeName = mediatorClass.getName(); if ( namespace != null ) attributeName = attributeName + namespace; S mediator = (S) request.getAttribute( attributeName ); if ( mediator == null ) { try { mediator = (S) mediatorClass.newInstance(); } catch ( Exception ex ) { throw new PortletException( ex ); } request.setAttribute( attributeName, mediator ); } mediator.setNamespace( namespace ); mediator.setRequest( request ); mediator.setResponse( response ); return mediator; } /** * Prepare is called once for each request, either before the action method * appropriate for the mode is invoked, or if there is no action then * before a render appropriate for the mode is invoked. */ protected void prepare( PortletRequest request, PortletResponse response ) throws PortletException { } protected void checkPrepare(PortletRequest request, PortletResponse response) throws PortletException { String attributeName = "__prepared__" + System.identityHashCode(this); if (request.getAttribute( attributeName ) == null) { request.setAttribute( attributeName, Boolean.TRUE); if (log.isLoggable(Level.FINEST)) log.finest(L.l("prepare for mode `{0}'", request.getPortletMode())); prepare(request, response); } } private ActionProxy findActionProxy( ActionRequest request, ActionResponse response ) { PortletMode mode = request.getPortletMode(); ActionProxy proxy = _actionProxyCache.get(mode); if (proxy != null) return proxy; // try to find a method named "action" + mode try { String methodName = new StringBuffer() .append("action") .append(Character.toUpperCase(mode.toString().charAt(0))) .append(mode.toString().substring(1)) .toString(); if (log.isLoggable(Level.FINER)) log.log(Level.FINER, "looking for method `" + methodName + "'"); final Method method = getClass().getMethod(methodName, _actionMethodParams); if (method != null) { proxy = new ActionProxy() { public void processAction( ActionRequest request, ActionResponse response ) throws PortletException, IOException { try { if (log.isLoggable(Level.FINEST)) log.log(Level.FINER, "invoking method " + method); method.invoke( PortletSupport.this, new Object[] { request, response }); } catch (IllegalAccessException ex) { throw new PortletException(ex); } catch (InvocationTargetException ex) { throw new PortletException(ex); } } }; } } catch (NoSuchMethodException ex) { if (log.isLoggable(Level.FINE)) log.log(Level.FINE, ex.toString(), ex); } if (proxy != null) _actionProxyCache.put(mode, proxy); return proxy; } public void processAction( ActionRequest request, ActionResponse response ) throws PortletException, IOException { PortletMode mode = request.getPortletMode(); if (log.isLoggable(Level.FINEST)) log.finest(L.l("processAction for mode `{0}'", mode)); ActionProxy proxy = findActionProxy( request, response ); if (proxy == null) throw new PortletModeException( L.l("No action for mode `{0}'", mode), mode ); checkPrepare( request, response ); proxy.processAction( request, response); } private RenderProxy findRenderProxy( RenderRequest request, RenderResponse response ) { PortletMode mode = request.getPortletMode(); RenderProxy proxy = _renderProxyCache.get(mode); if (proxy != null) return proxy; // try to find a .xtp/.jsp/.jspx file Iterator<String> candidates = getViewCandidates( request, response ); while (candidates.hasNext()) { String candidate = candidates.next(); if (log.isLoggable(Level.FINER)) log.finer(L.l("view candidate `{0}'", candidate)); if (new File(getPortletContext().getRealPath(candidate)).exists()) { final String target = candidate; proxy = new RenderProxy() { public void render(RenderRequest request, RenderResponse response) throws PortletException, IOException { dispatchView( request, response, target ); } }; break; } } if (proxy != null) { _renderProxyCache.put(mode, proxy); return proxy; } // try to find a method named "do" + mode String methodName = new StringBuffer() .append("do") .append(Character.toUpperCase(mode.toString().charAt(0))) .append(mode.toString().substring(1)) .toString(); if (log.isLoggable(Level.FINER)) log.log(Level.FINER, "looking for method `" + methodName + "'"); try { final Method method = getClass().getMethod(methodName, _renderMethodParams); if (method != null) { proxy = new RenderProxy() { public void render( RenderRequest request, RenderResponse response ) throws PortletException, IOException { try { if (log.isLoggable(Level.FINER)) log.log(Level.FINER, "invoking method " + method); if (log.isLoggable(Level.FINER)) log.log(Level.FINER, "with " + request + " " + response); method.invoke( PortletSupport.this, new Object[] { request, response }); } catch (IllegalAccessException ex) { throw new PortletException(ex); } catch (InvocationTargetException ex) { throw new PortletException(ex); } } }; } } catch (NoSuchMethodException ex) { if (log.isLoggable(Level.FINEST)) log.log(Level.FINEST, ex.toString(), ex); } if (proxy != null) _renderProxyCache.put(mode, proxy); return proxy; } protected Iterator<String> getViewCandidates( RenderRequest request, RenderResponse response ) { final String path = new StringBuffer() .append(getPortletName()) .append('/') .append(request.getPortletMode().toString()) .toString(); return new Iterator<String>() { int i = 0; public boolean hasNext() { return i < 3; } public String next() { switch (i++) { case 0: return path + ".xtp"; case 1: return path + ".jsp"; case 2: return path + ".jspx"; default: throw new NoSuchElementException(); } } public void remove() { throw new UnsupportedOperationException(); } }; } public void render( RenderRequest request, RenderResponse response ) throws PortletException, IOException { WindowState windowState = request.getWindowState(); if (windowState.equals(WindowState.MINIMIZED)) return; RenderProxy proxy = findRenderProxy( request, response ); PortletMode mode = request.getPortletMode(); if (log.isLoggable(Level.FINEST)) log.finest(L.l("render for mode `{0}'", mode)); if (proxy == null) throw new PortletModeException( L.l("No render for mode `{0}'", mode), mode ); checkPrepare( request, response ); if (response.getContentType() == null) response.setContentType("text/html"); proxy.render( request, response ); } protected void dispatchView( RenderRequest request, RenderResponse response, String path ) throws PortletException, IOException { if (log.isLoggable(Level.FINEST)) log.finest(L.l("dispatching view to `{0}'", path)); PortletRequestDispatcher dispatcher = getPortletContext().getRequestDispatcher(path); dispatcher.include(request, response); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?