View Javadoc

1   //
2   //  ========================================================================
3   //  Copyright (c) 1995-2013 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              availableExtensions.put(ext.getName(),ext.getClass());
38          }
39      }
40  
41      public Map<String, Class<? extends Extension>> getAvailableExtensions()
42      {
43          return availableExtensions;
44      }
45  
46      public Class<? extends Extension> getExtension(String name)
47      {
48          return availableExtensions.get(name);
49      }
50  
51      public Set<String> getExtensionNames()
52      {
53          return availableExtensions.keySet();
54      }
55  
56      public boolean isAvailable(String name)
57      {
58          return availableExtensions.containsKey(name);
59      }
60  
61      @Override
62      public Iterator<Class<? extends Extension>> iterator()
63      {
64          return availableExtensions.values().iterator();
65      }
66  
67      public abstract Extension newInstance(ExtensionConfig config);
68  
69      public void register(String name, Class<? extends Extension> extension)
70      {
71          availableExtensions.put(name,extension);
72      }
73  
74      public void unregister(String name)
75      {
76          availableExtensions.remove(name);
77      }
78  }