// // ======================================================================== // Copyright (c) 1995-2017 Mort Bay Consulting Pty. Ltd. // ------------------------------------------------------------------------ // All rights reserved. This program and the accompanying materials // are made available under the terms of the Eclipse Public License v1.0 // and Apache License v2.0 which accompanies this distribution. // // The Eclipse Public License is available at // http://www.eclipse.org/legal/epl-v10.html // // The Apache License v2.0 is available at // http://www.opensource.org/licenses/apache2.0.php // // You may elect to redistribute this code under either of these licenses. // ======================================================================== // package org.eclipse.jetty.websocket.jsr356; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import javax.websocket.MessageHandler; import org.eclipse.jetty.util.log.Log; import org.eclipse.jetty.util.log.Logger; import org.eclipse.jetty.websocket.common.util.ReflectUtils; import org.eclipse.jetty.websocket.jsr356.metadata.MessageHandlerMetadata; /** * Factory for {@link MessageHandlerMetadata} */ public class MessageHandlerFactory { private static final Logger LOG = Log.getLogger(MessageHandlerFactory.class); /** Registered MessageHandlers at this level */ private Map<Class<? extends MessageHandler>, List<MessageHandlerMetadata>> registered; public MessageHandlerFactory() { registered = new ConcurrentHashMap<>(); } public List<MessageHandlerMetadata> getMetadata(Class<? extends MessageHandler> handler) throws IllegalStateException { if (LOG.isDebugEnabled()) { LOG.debug("getMetadata({})",handler); } List<MessageHandlerMetadata> ret = registered.get(handler); if (ret != null) { return ret; } return register(handler); } public List<MessageHandlerMetadata> register(Class<? extends MessageHandler> handler) { List<MessageHandlerMetadata> metadatas = new ArrayList<>(); boolean partial = false; if (MessageHandler.Partial.class.isAssignableFrom(handler)) { if (LOG.isDebugEnabled()) { LOG.debug("supports Partial: {}",handler); } partial = true; Class<?> onMessageClass = ReflectUtils.findGenericClassFor(handler,MessageHandler.Partial.class); if (LOG.isDebugEnabled()) { LOG.debug("Partial message class: {}",onMessageClass); } metadatas.add(new MessageHandlerMetadata(handler,onMessageClass,partial)); } if (MessageHandler.Whole.class.isAssignableFrom(handler)) { if (LOG.isDebugEnabled()) { LOG.debug("supports Whole: {}",handler.getName()); } partial = false; Class<?> onMessageClass = ReflectUtils.findGenericClassFor(handler,MessageHandler.Whole.class); if (LOG.isDebugEnabled()) { LOG.debug("Whole message class: {}",onMessageClass); } metadatas.add(new MessageHandlerMetadata(handler,onMessageClass,partial)); } registered.put(handler,metadatas); return metadatas; } }