View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2016 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.annotation.ManagedAttribute;
30  import org.eclipse.jetty.util.annotation.ManagedObject;
31  import org.eclipse.jetty.util.component.ContainerLifeCycle;
32  import org.eclipse.jetty.util.ssl.SslContextFactory;
33  
34  /**
35   * <p>Provides the common handling for {@link ConnectionFactory} implementations including:</p>
36   * <ul>
37   * <li>Protocol identification</li>
38   * <li>Configuration of new Connections:
39   *     <ul>
40   *     <li>Setting inputbuffer size</li>
41   *     <li>Calling {@link Connection#addListener(Connection.Listener)} for all
42   *     Connection.Listener instances found as beans on the {@link Connector}
43   *     and this {@link ConnectionFactory}</li>
44   *     </ul>
45   * </ul>
46   */
47  @ManagedObject
48  public abstract class AbstractConnectionFactory extends ContainerLifeCycle implements ConnectionFactory
49  {
50      private final String _protocol;
51      private final List<String> _protocols;
52      private int _inputbufferSize = 8192;
53  
54      protected AbstractConnectionFactory(String protocol)
55      {
56          _protocol=protocol;
57          _protocols=Collections.unmodifiableList(Arrays.asList(new String[]{protocol}));
58      }
59  
60      protected AbstractConnectionFactory(String... protocols)
61      {
62          _protocol=protocols[0];
63          _protocols=Collections.unmodifiableList(Arrays.asList(protocols));
64      }
65  
66      @Override
67      @ManagedAttribute(value = "The protocol name", readonly = true)
68      public String getProtocol()
69      {
70          return _protocol;
71      }
72  
73      @Override
74      public List<String> getProtocols()
75      {
76          return _protocols;
77      }
78  
79      @ManagedAttribute("The buffer size used to read from the network")
80      public int getInputBufferSize()
81      {
82          return _inputbufferSize;
83      }
84  
85      public void setInputBufferSize(int size)
86      {
87          _inputbufferSize=size;
88      }
89  
90      protected AbstractConnection configure(AbstractConnection connection, Connector connector, EndPoint endPoint)
91      {
92          connection.setInputBufferSize(getInputBufferSize());
93  
94          // Add Connection.Listeners from Connector
95          if (connector instanceof ContainerLifeCycle)
96          {
97              ContainerLifeCycle aggregate = (ContainerLifeCycle)connector;
98              for (Connection.Listener listener : aggregate.getBeans(Connection.Listener.class))
99                  connection.addListener(listener);
100         }
101         // Add Connection.Listeners from this factory
102         for (Connection.Listener listener : getBeans(Connection.Listener.class))
103             connection.addListener(listener);
104 
105         return connection;
106     }
107 
108     @Override
109     public String toString()
110     {
111         return String.format("%s@%x%s",this.getClass().getSimpleName(),hashCode(),getProtocols());
112     }
113 
114     public static ConnectionFactory[] getFactories(SslContextFactory sslContextFactory, ConnectionFactory... factories)
115     {
116         factories=ArrayUtil.removeNulls(factories);
117 
118         if (sslContextFactory==null)
119             return factories;
120 
121         for (ConnectionFactory factory : factories)
122         {
123             if (factory instanceof HttpConfiguration.ConnectionFactory)
124             {
125                 HttpConfiguration config = ((HttpConfiguration.ConnectionFactory)factory).getHttpConfiguration();
126                 if (config.getCustomizer(SecureRequestCustomizer.class)==null)
127                     config.addCustomizer(new SecureRequestCustomizer());
128             }
129         }
130         return ArrayUtil.prependToArray(new SslConnectionFactory(sslContextFactory,factories[0].getProtocol()),factories,ConnectionFactory.class);
131 
132     }
133 }