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.api.extensions;
20  
21  import java.util.HashMap;
22  import java.util.Iterator;
23  import java.util.Map;
24  import java.util.ServiceLoader;
25  import java.util.Set;
26  
27  public abstract class ExtensionFactory implements Iterable<Class<? extends Extension>>
28  {
29      private ServiceLoader<Extension> extensionLoader = ServiceLoader.load(Extension.class);
30      private Map<String, Class<? extends Extension>> availableExtensions;
31  
32      public ExtensionFactory()
33      {
34          availableExtensions = new HashMap<>();
35          for (Extension ext : extensionLoader)
36          {
37              if (ext != null)
38              {
39                  availableExtensions.put(ext.getName(),ext.getClass());
40              }
41          }
42      }
43  
44      public Map<String, Class<? extends Extension>> getAvailableExtensions()
45      {
46          return availableExtensions;
47      }
48  
49      public Class<? extends Extension> getExtension(String name)
50      {
51          return availableExtensions.get(name);
52      }
53  
54      public Set<String> getExtensionNames()
55      {
56          return availableExtensions.keySet();
57      }
58  
59      public boolean isAvailable(String name)
60      {
61          return availableExtensions.containsKey(name);
62      }
63  
64      @Override
65      public Iterator<Class<? extends Extension>> iterator()
66      {
67          return availableExtensions.values().iterator();
68      }
69  
70      public abstract Extension newInstance(ExtensionConfig config);
71  
72      public void register(String name, Class<? extends Extension> extension)
73      {
74          availableExtensions.put(name,extension);
75      }
76  
77      public void unregister(String name)
78      {
79          availableExtensions.remove(name);
80      }
81  }