View Javadoc
1   package org.codehaus.plexus.component.manager;
2   
3   /*
4    * Copyright 2001-2006 Codehaus Foundation.
5    *
6    * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
7    * in compliance with the License. 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 distributed under the License
12   * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
13   * or implied. See the License for the specific language governing permissions and limitations under
14   * the License.
15   */
16  
17  import org.codehaus.plexus.MutablePlexusContainer;
18  import org.codehaus.plexus.component.factory.ComponentInstantiationException;
19  import org.codehaus.plexus.component.repository.ComponentDescriptor;
20  import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
21  import org.codehaus.plexus.lifecycle.LifecycleHandler;
22  
23  /**
24   * This ensures a component is only used as a singleton, and is only shutdown when the container
25   * shuts down.
26   *
27   * @author Jason van Zyl
28   */
29  public class SingletonComponentManager<T> extends AbstractComponentManager<T> {
30      private T singleton;
31  
32      public SingletonComponentManager(
33              MutablePlexusContainer container,
34              LifecycleHandler lifecycleHandler,
35              ComponentDescriptor<T> componentDescriptor,
36              String role,
37              String roleHint) {
38          super(container, lifecycleHandler, componentDescriptor, role, roleHint);
39      }
40  
41      public synchronized void release(Object component) throws ComponentLifecycleException {
42          if (singleton == component) {
43              dispose();
44          }
45      }
46  
47      public synchronized void dispose() throws ComponentLifecycleException {
48          if (singleton != null) {
49              endComponentLifecycle(singleton);
50              singleton = null;
51          }
52      }
53  
54      public synchronized T getComponent() throws ComponentInstantiationException, ComponentLifecycleException {
55          if (singleton == null) {
56              singleton = createComponentInstance();
57          }
58  
59          incrementConnectionCount();
60  
61          return singleton;
62      }
63  }