JingleTransportMethodManager.java

  1. /**
  2.  *
  3.  * Copyright 2017 Paul Schaub
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smackx.jingle;

  18. import java.util.HashMap;
  19. import java.util.Iterator;
  20. import java.util.Set;
  21. import java.util.WeakHashMap;

  22. import org.jivesoftware.smack.Manager;
  23. import org.jivesoftware.smack.XMPPConnection;

  24. import org.jivesoftware.smackx.jingle.element.Jingle;
  25. import org.jivesoftware.smackx.jingle.element.JingleContent;
  26. import org.jivesoftware.smackx.jingle.element.JingleContentTransport;
  27. import org.jivesoftware.smackx.jingle.transports.JingleTransportManager;
  28. import org.jivesoftware.smackx.jingle.transports.jingle_ibb.element.JingleIBBTransport;
  29. import org.jivesoftware.smackx.jingle.transports.jingle_s5b.elements.JingleS5BTransport;

  30. /**
  31.  * Manager where TransportMethods are registered.
  32.  */
  33. public final class JingleTransportMethodManager extends Manager {

  34.     private static final WeakHashMap<XMPPConnection, JingleTransportMethodManager> INSTANCES = new WeakHashMap<>();

  35.     private final HashMap<String, JingleTransportManager<?>> transportManagers = new HashMap<>();

  36.     private static final String[] transportPreference = new String[] {
  37.             JingleS5BTransport.NAMESPACE_V1,
  38.             JingleIBBTransport.NAMESPACE_V1
  39.     };

  40.     private JingleTransportMethodManager(XMPPConnection connection) {
  41.         super(connection);
  42.     }

  43.     public static synchronized JingleTransportMethodManager getInstanceFor(XMPPConnection connection) {
  44.         JingleTransportMethodManager manager = INSTANCES.get(connection);
  45.         if (manager == null) {
  46.             manager = new JingleTransportMethodManager(connection);
  47.             INSTANCES.put(connection, manager);
  48.         }
  49.         return manager;
  50.     }

  51.     public void registerTransportManager(JingleTransportManager<?> manager) {
  52.         transportManagers.put(manager.getNamespace(), manager);
  53.     }

  54.     public static JingleTransportManager<?> getTransportManager(XMPPConnection connection, String namespace) {
  55.         return getInstanceFor(connection).getTransportManager(namespace);
  56.     }

  57.     public JingleTransportManager<?> getTransportManager(String namespace) {
  58.         return transportManagers.get(namespace);
  59.     }

  60.     public static JingleTransportManager<?> getTransportManager(XMPPConnection connection, Jingle request) {
  61.         return getInstanceFor(connection).getTransportManager(request);
  62.     }
  63.     public JingleTransportManager<?> getTransportManager(Jingle request) {

  64.         JingleContent content = request.getContents().get(0);
  65.         if (content == null) {
  66.             return null;
  67.         }

  68.         JingleContentTransport transport = content.getTransport();
  69.         if (transport == null) {
  70.             return null;
  71.         }

  72.         return getTransportManager(transport.getNamespace());
  73.     }

  74.     public static JingleTransportManager<?> getBestAvailableTransportManager(XMPPConnection connection) {
  75.         return getInstanceFor(connection).getBestAvailableTransportManager();
  76.     }

  77.     public JingleTransportManager<?> getBestAvailableTransportManager() {
  78.         JingleTransportManager<?> tm;
  79.         for (String ns : transportPreference) {
  80.             tm = getTransportManager(ns);
  81.             if (tm != null) {
  82.                 return tm;
  83.             }
  84.         }

  85.         Iterator<String> it = transportManagers.keySet().iterator();
  86.         if (it.hasNext()) {
  87.             return getTransportManager(it.next());
  88.         }

  89.         return null;
  90.     }

  91.     public JingleTransportManager<?> getBestAvailableTransportManager(Set<String> except) {
  92.         JingleTransportManager<?> tm;
  93.         for (String ns : transportPreference) {
  94.             tm = getTransportManager(ns);
  95.             if (tm != null) {
  96.                 if (except.contains(tm.getNamespace())) {
  97.                     continue;
  98.                 }
  99.                 return tm;
  100.             }
  101.         }

  102.         for (String ns : transportManagers.keySet()) {
  103.             if (except.contains(ns)) {
  104.                 continue;
  105.             }
  106.             return getTransportManager(ns);
  107.         }

  108.         return null;
  109.     }
  110. }