1. Project Clover database Tue Dec 20 2016 21:24:09 CET
  2. Package org.xwiki.extension.handler.internal

File DefaultExtensionInitializer.java

 

Coverage histogram

../../../../../img/srcFileCovDistChart9.png
38% of files have more coverage

Code metrics

24
40
6
1
200
118
22
0.55
6.67
6
3.67

Classes

Class Line # Actions
DefaultExtensionInitializer 50 40 0% 22 7
0.990%
 

Contributing tests

This file is covered by 23 tests. .

Source view

1    /*
2    * See the NOTICE file distributed with this work for additional
3    * information regarding copyright ownership.
4    *
5    * This is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU Lesser General Public License as
7    * published by the Free Software Foundation; either version 2.1 of
8    * the License, or (at your option) any later version.
9    *
10    * This software is distributed in the hope that it will be useful,
11    * but WITHOUT ANY WARRANTY; without even the implied warranty of
12    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13    * Lesser General Public License for more details.
14    *
15    * You should have received a copy of the GNU Lesser General Public
16    * License along with this software; if not, write to the Free
17    * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
18    * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
19    */
20   
21    package org.xwiki.extension.handler.internal;
22   
23    import java.util.Collection;
24    import java.util.HashMap;
25    import java.util.HashSet;
26    import java.util.Map;
27    import java.util.Set;
28   
29    import javax.inject.Inject;
30    import javax.inject.Singleton;
31   
32    import org.slf4j.Logger;
33    import org.xwiki.component.annotation.Component;
34    import org.xwiki.extension.ExtensionDependency;
35    import org.xwiki.extension.ExtensionException;
36    import org.xwiki.extension.InstalledExtension;
37    import org.xwiki.extension.handler.ExtensionHandlerManager;
38    import org.xwiki.extension.handler.ExtensionInitializer;
39    import org.xwiki.extension.repository.CoreExtensionRepository;
40    import org.xwiki.extension.repository.InstalledExtensionRepository;
41   
42    /**
43    * Default implementation of {@link org.xwiki.extension.handler.ExtensionInitializer}.
44    *
45    * @version $Id: 64a55ec4f486133898d5a89ea6375374b2cb7d61 $
46    * @since 4.0M1
47    */
48    @Component
49    @Singleton
 
50    public class DefaultExtensionInitializer implements ExtensionInitializer
51    {
52    /**
53    * The local extension repository from which extension are initialized.
54    */
55    @Inject
56    private InstalledExtensionRepository installedExtensionRepository;
57   
58    /**
59    * The extension manager to launch extension initialization.
60    */
61    @Inject
62    private ExtensionHandlerManager extensionHandlerManager;
63   
64    /**
65    * The core extension repository to check extension dependency availability.
66    */
67    @Inject
68    private CoreExtensionRepository coreExtensionRepository;
69   
70    /**
71    * The logger to log.
72    */
73    @Inject
74    private Logger logger;
75   
 
76  192 toggle @Override
77    public void initialize()
78    {
79  192 initialize(null, null);
80    }
81   
 
82  0 toggle @Override
83    public void initialize(String namespaceToLoad)
84    {
85  0 initialize(namespaceToLoad, null);
86    }
87   
 
88  252 toggle @Override
89    public void initialize(String namespaceToInitialize, String type)
90    {
91  252 Map<String, Set<InstalledExtension>> initializedExtensions = new HashMap<String, Set<InstalledExtension>>();
92   
93    // Load extensions from local repository
94  252 Collection<InstalledExtension> installedExtensions;
95  252 if (namespaceToInitialize != null) {
96  42 installedExtensions = this.installedExtensionRepository.getInstalledExtensions(namespaceToInitialize);
97    } else {
98  210 installedExtensions = this.installedExtensionRepository.getInstalledExtensions();
99    }
100  252 for (InstalledExtension installedExtension : installedExtensions) {
101  1527 if (type == null || type.equals(installedExtension.getType())) {
102  1432 try {
103  1432 initializeExtension(installedExtension, namespaceToInitialize, initializedExtensions);
104    } catch (Throwable t) {
105  0 this.logger.error("Failed to initialize local extension [{}]", installedExtension.getId(), t);
106    }
107    }
108    }
109    }
110   
111    /**
112    * Initialize extension.
113    *
114    * @param installedExtension the extension to initialize
115    * @param namespaceToLoad the namespace to be initialized, null for all
116    * @param initializedExtensions the currently initialized extensions set
117    * @throws ExtensionException when an initialization error occurs
118    */
 
119  1432 toggle private void initializeExtension(InstalledExtension installedExtension, String namespaceToLoad,
120    Map<String, Set<InstalledExtension>> initializedExtensions) throws ExtensionException
121    {
122  1432 if (installedExtension.getNamespaces() != null) {
123  569 if (namespaceToLoad == null) {
124  554 for (String namespace : installedExtension.getNamespaces()) {
125  714 initializeExtensionInNamespace(installedExtension, namespace, initializedExtensions);
126    }
127  15 } else if (installedExtension.getNamespaces().contains(namespaceToLoad)) {
128  15 initializeExtensionInNamespace(installedExtension, namespaceToLoad, initializedExtensions);
129    }
130  863 } else if (namespaceToLoad == null) {
131  818 initializeExtensionInNamespace(installedExtension, null, initializedExtensions);
132    }
133    }
134   
135    /**
136    * Initialize an extension in the given namespace.
137    *
138    * @param installedExtension the extension to initialize
139    * @param namespace the namespace in which the extention is initialized, null for global
140    * @param initializedExtensions the currently initialized extensions set (to avoid initializing twice a dependency)
141    * @throws ExtensionException when an initialization error occurs
142    */
 
143  2347 toggle private void initializeExtensionInNamespace(InstalledExtension installedExtension, String namespace,
144    Map<String, Set<InstalledExtension>> initializedExtensions) throws ExtensionException
145    {
146    // Check if the extension can be available from this namespace
147  2347 if (!installedExtension.isValid(namespace)) {
148  223 return;
149    }
150   
151  2124 Set<InstalledExtension> initializedExtensionsInNamespace = initializedExtensions.get(namespace);
152   
153  2124 if (initializedExtensionsInNamespace == null) {
154  440 initializedExtensionsInNamespace = new HashSet<InstalledExtension>();
155  440 initializedExtensions.put(namespace, initializedExtensionsInNamespace);
156    }
157   
158  2124 if (!initializedExtensionsInNamespace.contains(installedExtension)) {
159  1484 initializeExtensionInNamespace(installedExtension, namespace, initializedExtensions,
160    initializedExtensionsInNamespace);
161    }
162    }
163   
 
164  1484 toggle private void initializeExtensionInNamespace(InstalledExtension installedExtension, String namespace,
165    Map<String, Set<InstalledExtension>> initializedExtensions,
166    Set<InstalledExtension> initializedExtensionsInNamespace) throws ExtensionException
167    {
168  1484 if (namespace != null && installedExtension.getNamespaces() == null) {
169    // This extension is supposed to be installed on root namespace only so redirecting to null namespace
170    // initialization
171  160 initializeExtensionInNamespace(installedExtension, null, initializedExtensions);
172    } else {
173    // Initialize dependencies
174  1324 for (ExtensionDependency dependency : installedExtension.getDependencies()) {
175  720 if (!this.coreExtensionRepository.exists(dependency.getId())) {
176  640 InstalledExtension dependencyExtension =
177    this.installedExtensionRepository.getInstalledExtension(dependency.getId(), namespace);
178   
179  640 if (dependencyExtension == installedExtension) {
180  0 throw new ExtensionException(String.format("Extension [] has itself as dependency ([])."
181    + " It usually mean an extension is installed along with one of it's features.",
182    installedExtension, dependency));
183    }
184   
185  640 try {
186  640 initializeExtensionInNamespace(dependencyExtension, namespace, initializedExtensions);
187    } catch (Exception e) {
188  0 throw new ExtensionException("Failed to initialize dependency [" + dependency + "]", e);
189    }
190    }
191    }
192   
193    // Initialize the extension
194  1324 this.extensionHandlerManager.initialize(installedExtension, namespace);
195   
196    // Cache the extension to not initialize several times
197  1324 initializedExtensionsInNamespace.add(installedExtension);
198    }
199    }
200    }