View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2014 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.websocket.jsr356;
20  
21  import java.util.ArrayList;
22  import java.util.List;
23  import java.util.Map;
24  import java.util.concurrent.ConcurrentHashMap;
25  import javax.websocket.MessageHandler;
26  
27  import org.eclipse.jetty.util.log.Log;
28  import org.eclipse.jetty.util.log.Logger;
29  import org.eclipse.jetty.websocket.common.util.ReflectUtils;
30  import org.eclipse.jetty.websocket.jsr356.metadata.MessageHandlerMetadata;
31  
32  /**
33   * Factory for {@link MessageHandlerMetadata}
34   */
35  public class MessageHandlerFactory
36  {
37      private static final Logger LOG = Log.getLogger(MessageHandlerFactory.class);
38      /** Registered MessageHandlers at this level */
39      private Map<Class<? extends MessageHandler>, List<MessageHandlerMetadata>> registered;
40  
41      public MessageHandlerFactory()
42      {
43          registered = new ConcurrentHashMap<>();
44      }
45  
46      public List<MessageHandlerMetadata> getMetadata(Class<? extends MessageHandler> handler) throws IllegalStateException
47      {
48          if (LOG.isDebugEnabled())
49          {
50              LOG.debug("getMetadata({})",handler);
51          }
52          List<MessageHandlerMetadata> ret = registered.get(handler);
53          if (ret != null)
54          {
55              return ret;
56          }
57  
58          return register(handler);
59      }
60  
61      public List<MessageHandlerMetadata> register(Class<? extends MessageHandler> handler)
62      {
63          List<MessageHandlerMetadata> metadatas = new ArrayList<>();
64  
65          boolean partial = false;
66  
67          if (MessageHandler.Partial.class.isAssignableFrom(handler))
68          {
69              if (LOG.isDebugEnabled())
70              {
71                  LOG.debug("supports Partial: {}",handler);
72              }
73              partial = true;
74              Class<?> onMessageClass = ReflectUtils.findGenericClassFor(handler,MessageHandler.Partial.class);
75              if (LOG.isDebugEnabled())
76              {
77                  LOG.debug("Partial message class: {}",onMessageClass);
78              }
79              metadatas.add(new MessageHandlerMetadata(handler,onMessageClass,partial));
80          }
81  
82          if (MessageHandler.Whole.class.isAssignableFrom(handler))
83          {
84              if (LOG.isDebugEnabled())
85              {
86                  LOG.debug("supports Whole: {}",handler.getName());
87              }
88              partial = false;
89              Class<?> onMessageClass = ReflectUtils.findGenericClassFor(handler,MessageHandler.Whole.class);
90              if (LOG.isDebugEnabled())
91              {
92                  LOG.debug("Whole message class: {}",onMessageClass);
93              }
94              metadatas.add(new MessageHandlerMetadata(handler,onMessageClass,partial));
95          }
96  
97          registered.put(handler,metadatas);
98          return metadatas;
99      }
100 }