View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2015 Mort Bay Consulting Pty. Ltd.
4   //  ------------------------------------------------------------------------
5   //  All rights reserved. This program and the accompanying materials
6   //  are made available under the terms of the Eclipse Public License v1.0
7   //  and Apache License v2.0 which accompanies this distribution.
8   //
9   //      The Eclipse Public License is available at
10  //      http://www.eclipse.org/legal/epl-v10.html
11  //
12  //      The Apache License v2.0 is available at
13  //      http://www.opensource.org/licenses/apache2.0.php
14  //
15  //  You may elect to redistribute this code under either of these licenses.
16  //  ========================================================================
17  //
18  
19  package org.eclipse.jetty.server;
20  
21  import java.util.Arrays;
22  import java.util.Collections;
23  import java.util.List;
24  
25  import org.eclipse.jetty.io.AbstractConnection;
26  import org.eclipse.jetty.io.Connection;
27  import org.eclipse.jetty.io.EndPoint;
28  import org.eclipse.jetty.util.ArrayUtil;
29  import org.eclipse.jetty.util.component.ContainerLifeCycle;
30  import org.eclipse.jetty.util.ssl.SslContextFactory;
31  
32  
33  /* ------------------------------------------------------------ */
34  /**
35   * Abstract ConnectionFactory
36   * <p>Provides the common handling for {@link ConnectionFactory} implementations including:<ul>
37   * <li>Protocol identification
38   * <li>Configuration of new Connections:<ul>
39   *     <li>Setting inputbuffer size
40   *     <li>Calling {@link Connection#addListener(Connection.Listener)} for all 
41   *     Connection.Listener instances found as beans on the {@link Connector} and this {@link ConnectionFactory}
42   * </ul>
43   * </ul>
44   */
45  public abstract class AbstractConnectionFactory extends ContainerLifeCycle implements ConnectionFactory
46  {
47      private final String _protocol;
48      private final List<String> _protocols;
49      private int _inputbufferSize = 8192;
50  
51      protected AbstractConnectionFactory(String protocol)
52      {
53          _protocol=protocol;
54          _protocols=Collections.unmodifiableList(Arrays.asList(new String[]{protocol}));
55      }
56      
57      protected AbstractConnectionFactory(String... protocols)
58      {
59          _protocol=protocols[0];
60          _protocols=Collections.unmodifiableList(Arrays.asList(protocols));
61      }
62  
63      @Override
64      public String getProtocol()
65      {
66          return _protocol;
67      }
68  
69      @Override
70      public List<String> getProtocols()
71      {
72          return _protocols;
73      }
74  
75      public int getInputBufferSize()
76      {
77          return _inputbufferSize;
78      }
79  
80      public void setInputBufferSize(int size)
81      {
82          _inputbufferSize=size;
83      }
84  
85      protected AbstractConnection configure(AbstractConnection connection, Connector connector, EndPoint endPoint)
86      {
87          connection.setInputBufferSize(getInputBufferSize());
88  
89          // Add Connection.Listeners from Connector
90          if (connector instanceof ContainerLifeCycle)
91          {
92              ContainerLifeCycle aggregate = (ContainerLifeCycle)connector;
93              for (Connection.Listener listener : aggregate.getBeans(Connection.Listener.class))
94                  connection.addListener(listener);
95          }
96          // Add Connection.Listeners from this factory
97          for (Connection.Listener listener : getBeans(Connection.Listener.class))
98              connection.addListener(listener);
99          
100         return connection;
101     }
102 
103     @Override
104     public String toString()
105     {
106         return String.format("%s@%x%s",this.getClass().getSimpleName(),hashCode(),getProtocols());
107     }
108 
109     public static ConnectionFactory[] getFactories(SslContextFactory sslContextFactory, ConnectionFactory... factories)
110     {
111         factories=ArrayUtil.removeNulls(factories);
112 
113         if (sslContextFactory==null)
114             return factories;
115 
116         for (ConnectionFactory factory : factories)
117         {
118             if (factory instanceof HttpConfiguration.ConnectionFactory)
119             {
120                 HttpConfiguration config = ((HttpConfiguration.ConnectionFactory)factory).getHttpConfiguration();
121                 if (config.getCustomizer(SecureRequestCustomizer.class)==null)
122                     config.addCustomizer(new SecureRequestCustomizer());
123             }
124         }
125         return ArrayUtil.prependToArray(new SslConnectionFactory(sslContextFactory,factories[0].getProtocol()),factories,ConnectionFactory.class);
126 
127     }
128 }