View Javadoc

    1   /*
    2    *  Licensed to the Apache Software Foundation (ASF) under one
    3    *  or more contributor license agreements.  See the NOTICE file
    4    *  distributed with this work for additional information
    5    *  regarding copyright ownership.  The ASF licenses this file
    6    *  to you under the Apache License, Version 2.0 (the
    7    *  "License"); you may not use this file except in compliance
    8    *  with the License.  You may obtain a copy of the License at
    9    *
    10   *    http://www.apache.org/licenses/LICENSE-2.0
    11   *
    12   *  Unless required by applicable law or agreed to in writing,
    13   *  software distributed under the License is distributed on an
    14   *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    15   *  KIND, either express or implied.  See the License for the
    16   *  specific language governing permissions and limitations
    17   *  under the License.
    18   *
    19   */
    20  package org.apache.mina.integration.spring;
    21
    22  import java.util.List;
    23
    24  import org.apache.mina.common.DefaultIoFilterChainBuilder;
    25  import org.apache.mina.common.IoFilter;
    26  import org.springframework.beans.factory.config.AbstractFactoryBean;
    27  import org.springframework.util.Assert;
    28
    29  /**
    30   * Spring {@link org.springframework.beans.factory.FactoryBean}
    31   * which creates {@link DefaultIoFilterChainBuilder} instances. This
    32   * factory bean makes it possible to configure the filters to be added to all the
    33   * sessions created by an {@link org.apache.mina.common.IoAcceptor}
    34   * or {@link org.apache.mina.common.IoConnector} using Spring.
    35   * <p>
    36   * The filters may be set up in two ways. By creating
    37   * {@link IoFilterMapping} objects which associate a name with an {@link IoFilter}
    38   * instance and set them using {@link #setFilterMappings(IoFilterMapping[])} or
    39   * by using {@link #setFilters(IoFilter[])} directly which assigns automatically
    40   * generated names to each {@link IoFilter}. Use the
    41   * {@link #setFilterNamePrefix(String)} method to set the prefix used for
    42   * auto generated names.
    43   * </p>
    44   *
    45   * @author The Apache Directory Project (mina-dev@directory.apache.org)
    46   * @version $Rev: 555855 $, $Date: 2007-07-13 12:19:00 +0900 (Fri, 13 Jul 2007) $
    47   */
    48  public class DefaultIoFilterChainBuilderFactoryBean extends AbstractFactoryBean {
    49      private IoFilterMapping[] filterMappings = new IoFilterMapping[0];
    50
    51      private String prefix = "filter";
    52
    53      protected Object createInstance() throws Exception {
    54          DefaultIoFilterChainBuilder builder = new DefaultIoFilterChainBuilder();
    55          for (int i = 0; i < filterMappings.length; i++) {
    56              String name = filterMappings[i].getName();
    57              if (name == null) {
    58                  name = prefix + i;
    59              }
    60              builder.addLast(name, filterMappings[i].getFilter());
    61          }
    62
    63          return builder;
    64      }
    65
    66      public Class getObjectType() {
    67          return DefaultIoFilterChainBuilder.class;
    68      }
    69
    70      /**
    71       * Sets the prefix used to create the names for automatically named filters
    72       * added using {@link #setFilters(IoFilter[])}. The default prefix is
    73       * <tt>filter</tt>.
    74       *
    75       * @param prefix the prefix.
    76       * @throws IllegalArgumentException if the specified value is
    77       *         <code>null</code>.
    78       */
    79      public void setFilterNamePrefix(String prefix) {
    80          Assert.notNull(prefix, "Property 'filterNamePrefix' may not be null");
    81          this.prefix = prefix;
    82      }
    83
    84      /**
    85       * Sets a number of filters which will be added to the filter
    86       * chain created by this factory bean. The specified list must contain either
    87       * {@link IoFilter} or {@link IoFilterMapping} objects. Filters which
    88       * haven't been wrapped in {@link IoFilterMapping} objects will be assigned
    89       * automatically generated names (<code>&lt;filterNamePrefix&gt;0</code>,
    90       * <code>&lt;filterNamePrefix&gt;1</code>, etc).
    91       *
    92       * @param filters the list of {@link IoFilter} and/or
    93       *        {@link IoFilterMapping} objects.
    94       * @throws IllegalArgumentException if the specified value is
    95       *         <code>null</code> or contains objects of the wrong type.
    96       * @see #setFilterNamePrefix(String)
    97       */
    98      public void setFilters(List filters) {
    99          Assert.notNull(filters, "Property 'filters' may not be null");
    100         IoFilterMapping[] filterMappings = new IoFilterMapping[filters.size()];
    101
    102         for (int i = 0; i < filterMappings.length; i++) {
    103             Object o = filters.get(i);
    104             if (o instanceof IoFilterMapping) {
    105                 filterMappings[i] = (IoFilterMapping) o;
    106             } else if (o instanceof IoFilter) {
    107                 filterMappings[i] = new IoFilterMapping();
    108                 filterMappings[i].setFilter((IoFilter) o);
    109             } else {
    110                 throw new IllegalArgumentException(
    111                         "List may only contain "
    112                                 + "IoFilter or IoFilterMapping objects. Found object of "
    113                                 + "type " + o.getClass().getName()
    114                                 + " at position " + i + ".");
    115             }
    116         }
    117
    118         this.filterMappings = filterMappings;
    119     }
    120
    121 }