View Javadoc
1   /**
2    * This file Copyright (c) 2011-2018 Magnolia International
3    * Ltd.  (http://www.magnolia-cms.com). All rights reserved.
4    *
5    *
6    * This file is dual-licensed under both the Magnolia
7    * Network Agreement and the GNU General Public License.
8    * You may elect to use one or the other of these licenses.
9    *
10   * This file is distributed in the hope that it will be
11   * useful, but AS-IS and WITHOUT ANY WARRANTY; without even the
12   * implied warranty of MERCHANTABILITY or FITNESS FOR A
13   * PARTICULAR PURPOSE, TITLE, or NONINFRINGEMENT.
14   * Redistribution, except as permitted by whichever of the GPL
15   * or MNA you select, is prohibited.
16   *
17   * 1. For the GPL license (GPL), you can redistribute and/or
18   * modify this file under the terms of the GNU General
19   * Public License, Version 3, as published by the Free Software
20   * Foundation.  You should have received a copy of the GNU
21   * General Public License, Version 3 along with this program;
22   * if not, write to the Free Software Foundation, Inc., 51
23   * Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
24   *
25   * 2. For the Magnolia Network Agreement (MNA), this file
26   * and the accompanying materials are made available under the
27   * terms of the MNA which accompanies this distribution, and
28   * is available at http://www.magnolia-cms.com/mna.html
29   *
30   * Any modifications to this file must keep this entire header
31   * intact.
32   *
33   */
34  package info.magnolia.objectfactory.configuration;
35  
36  import static java.util.stream.Collectors.toMap;
37  
38  import java.util.ArrayList;
39  import java.util.HashMap;
40  import java.util.List;
41  import java.util.Map;
42  
43  import com.google.inject.Key;
44  import com.google.inject.Provider;
45  
46  
47  /**
48   * Configuration used to create component providers.
49   */
50  public class ComponentProviderConfiguration implements Cloneable {
51  
52      private Map<Key, Class> typeMapping = new HashMap<>();
53      private Map<Key, ComponentConfiguration> components = new HashMap<>();
54      private List<ComponentConfigurer> configurers = new ArrayList<>();
55  
56      public void addComponent(ComponentConfiguration componentConfiguration) {
57          this.components.put(componentConfiguration.getKey(), componentConfiguration);
58      }
59  
60      public void addTypeMapping(Key<?> from, Class<?> to) {
61          this.typeMapping.put(from, to);
62      }
63  
64      public void addTypeMapping(Class<?> from, Class<?> to) {
65          this.typeMapping.put(Key.get(from), to);
66      }
67  
68      public Map<Key, Class> getAnnotatedTypeMappings() {
69          return this.typeMapping;
70      }
71  
72      /**
73       * @deprecated since 5.5.5 - use {@link #getAnnotatedTypeMappings()} instead.
74       */
75      @Deprecated
76      @SuppressWarnings("unchecked")
77      public Map<Class<?>, Class<?>> getTypeMapping() {
78          return typeMapping
79                  .entrySet()
80                  .stream()
81                  .collect(toMap(entry -> entry.getKey().getTypeLiteral().getRawType(), Map.Entry::getValue));
82      }
83  
84      public Map<Key, ComponentConfiguration> getAnnotatedComponents() {
85          return components;
86      }
87  
88      /**
89       * @deprecated since 5.5.5 - use {@link #getAnnotatedComponents()} instead.
90       */
91      @Deprecated
92      @SuppressWarnings("unchecked")
93      public Map<Class, ComponentConfiguration> getComponents() {
94          return components
95                  .entrySet()
96                  .stream()
97                  .collect(toMap(entry -> entry.getKey().getTypeLiteral().getRawType(), Map.Entry::getValue));
98      }
99  
100     public List<ComponentConfigurer> getConfigurers() {
101         return configurers;
102     }
103 
104     public boolean addConfigurer(ComponentConfigurer configurer) {
105         return configurers.add(configurer);
106     }
107 
108     public <T> void registerImplementation(Class<T> type, Class<? extends T> implementation) {
109         addComponent(ImplementationConfiguration.valueOf(type, implementation));
110     }
111 
112     public <T> void registerImplementation(Class<T> type) {
113         registerImplementation(type, type);
114     }
115 
116     public <T> void registerInstance(Class<T> type, Object instance) {
117         addComponent(InstanceConfiguration.valueOf(type, instance));
118     }
119 
120     public <T> void registerProvider(Class<T> type, Class<? extends Provider<T>> providerClass) {
121         addComponent(ProviderConfiguration.of(type, providerClass));
122     }
123 
124     public void combine(ComponentProviderConfiguration components) {
125         this.typeMapping.putAll(components.typeMapping);
126         this.components.putAll(components.clone().components);
127         this.configurers.addAll(components.configurers);
128     }
129 
130     @Override
131     public ComponentProviderConfiguration clone() {
132         try {
133             ComponentProviderConfigurationia/objectfactory/configuration/ComponentProviderConfiguration.html#ComponentProviderConfiguration">ComponentProviderConfiguration clone = (ComponentProviderConfiguration) super.clone();
134             clone.components = new HashMap<>();
135             for (Map.Entry<Key, ComponentConfiguration> entry : components.entrySet()) {
136                 clone.components.put(entry.getKey(), entry.getValue().clone());
137             }
138             clone.typeMapping = new HashMap<>(typeMapping);
139             clone.configurers = new ArrayList<>(configurers);
140             return clone;
141         } catch (CloneNotSupportedException e) {
142             // should never happen
143             throw new RuntimeException(e);
144         }
145     }
146 }