View Javadoc

    1   //========================================================================
    2   //$Id: AbstractHandler.java,v 1.4 2005/11/11 22:55:39 gregwilkins Exp $
    3   //Copyright 2004-2005 Mort Bay Consulting Pty. Ltd.
    4   //------------------------------------------------------------------------
    5   //Licensed under the Apache License, Version 2.0 (the "License");
    6   //you may not use this file except in compliance with the License.
    7   //You may obtain a copy of the License at
    8   //http://www.apache.org/licenses/LICENSE-2.0
    9   //Unless required by applicable law or agreed to in writing, software
    10  //distributed under the License is distributed on an "AS IS" BASIS,
    11  //WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  //See the License for the specific language governing permissions and
    13  //limitations under the License.
    14  //========================================================================
    15
    16  package org.mortbay.jetty.handler;
    17
    18
    19  import org.mortbay.jetty.Handler;
    20  import org.mortbay.jetty.HandlerContainer;
    21  import org.mortbay.util.LazyList;
    22
    23
    24  /* ------------------------------------------------------------ */
    25  /** Abstract Handler Container.
    26   * This is the base class for handlers that may contain other handlers.
    27   *
    28   * @author gregw
    29   *
    30   */
    31  public abstract class AbstractHandlerContainer extends AbstractHandler implements HandlerContainer
    32  {
    33      /* ------------------------------------------------------------ */
    34      /**
    35       *
    36       */
    37      public AbstractHandlerContainer()
    38      {
    39      }
    40
    41      /* ------------------------------------------------------------ */
    42      public Handler[] getChildHandlers()
    43      {
    44          Object list = expandChildren(null,null);
    45          return (Handler[])LazyList.toArray(list, Handler.class);
    46      }
    47
    48      /* ------------------------------------------------------------ */
    49      public Handler[] getChildHandlersByClass(Class byclass)
    50      {
    51          Object list = expandChildren(null,byclass);
    52          return (Handler[])LazyList.toArray(list, Handler.class);
    53      }
    54
    55      /* ------------------------------------------------------------ */
    56      public Handler getChildHandlerByClass(Class byclass)
    57      {
    58          // TODO this can be more efficient?
    59          Object list = expandChildren(null,byclass);
    60          if (list==null)
    61              return null;
    62          return (Handler)LazyList.get(list, 0);
    63      }
    64
    65      /* ------------------------------------------------------------ */
    66      protected Object expandChildren(Object list, Class byClass)
    67      {
    68          return list;
    69      }
    70
    71      /* ------------------------------------------------------------ */
    72      protected Object expandHandler(Handler handler, Object list, Class byClass)
    73      {
    74          if (handler==null)
    75              return list;
    76
    77          if (handler!=null && (byClass==null || byClass.isAssignableFrom(handler.getClass())))
    78              list=LazyList.add(list, handler);
    79
    80          if (handler instanceof AbstractHandlerContainer)
    81              list=((AbstractHandlerContainer)handler).expandChildren(list, byClass);
    82          else if (handler instanceof HandlerContainer)
    83          {
    84              HandlerContainer container = (HandlerContainer)handler;
    85              Handler[] handlers=byClass==null?container.getChildHandlers():container.getChildHandlersByClass(byClass);
    86              list=LazyList.addArray(list, handlers);
    87          }
    88
    89          return list;
    90      }
    91
    92
    93  }