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

File UpgradePlanJob.java

 

Coverage histogram

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

Code metrics

26
89
11
1
284
193
34
0.38
8.09
11
3.09

Classes

Class Line # Actions
UpgradePlanJob 48 89 0% 34 15
0.8809523688.1%
 

Contributing tests

This file is covered by 5 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    package org.xwiki.extension.job.internal;
21   
22    import java.util.ArrayList;
23    import java.util.Collection;
24    import java.util.NavigableSet;
25    import java.util.TreeSet;
26   
27    import javax.inject.Named;
28   
29    import org.xwiki.component.annotation.Component;
30    import org.xwiki.extension.ExtensionId;
31    import org.xwiki.extension.InstallException;
32    import org.xwiki.extension.InstalledExtension;
33    import org.xwiki.extension.ResolveException;
34    import org.xwiki.extension.job.InstallRequest;
35    import org.xwiki.extension.job.plan.internal.DefaultExtensionPlanTree;
36    import org.xwiki.extension.repository.result.IterableResult;
37    import org.xwiki.extension.version.Version;
38    import org.xwiki.job.Request;
39   
40    /**
41    * Create an Extension upgrade plan.
42    *
43    * @version $Id: 0638211a245109e0059f2843073c33496e6b832d $
44    * @since 4.1M1
45    */
46    @Component
47    @Named(UpgradePlanJob.JOBTYPE)
 
48    public class UpgradePlanJob extends AbstractInstallPlanJob<InstallRequest>
49    {
50    /**
51    * The id of the job.
52    */
53    public static final String JOBTYPE = "upgradeplan";
54   
 
55  40 toggle @Override
56    public String getType()
57    {
58  40 return JOBTYPE;
59    }
60   
 
61  8 toggle @Override
62    protected InstallRequest castRequest(Request request)
63    {
64  8 InstallRequest installRequest;
65  8 if (request instanceof InstallRequest) {
66  8 installRequest = (InstallRequest) request;
67    } else {
68  0 installRequest = new InstallRequest(request);
69    }
70   
71  8 return installRequest;
72    }
73   
74    /**
75    * @param extension the extension currently installed
76    * @param namespace the namespace where the extension is installed
77    */
 
78  102 toggle protected void upgradeExtension(InstalledExtension extension, String namespace, boolean filterDependencies)
79    {
80  102 if (!getRequest().getExcludedExtensions().contains(extension.getId())
81    && (!filterDependencies || !extension.isDependency(namespace))) {
82  82 NavigableSet<Version> versions = getVersions(extension, namespace);
83   
84    // Useless to continue if the extension does not have any available version
85  82 if (!versions.isEmpty()) {
86  14 upgradeExtension(extension, namespace, versions.descendingSet());
87    }
88    }
89    }
90   
 
91  82 toggle private NavigableSet<Version> getVersions(InstalledExtension extension, String namespace)
92    {
93  82 NavigableSet<Version> versionList = new TreeSet<>();
94   
95    // Search local versions
96  82 try {
97  82 IterableResult<Version> versions =
98    this.localExtensionRepository.resolveVersions(extension.getId().getId(), 0, -1);
99  82 for (Version version : versions) {
100  0 versionList.add(version);
101    }
102    } catch (ResolveException e) {
103  0 this.logger.debug("Failed to resolve local versions for extension id [{}]", extension.getId().getId(), e);
104    }
105   
106    // Search remote versions
107  82 try {
108  82 IterableResult<Version> versions = this.repositoryManager.resolveVersions(extension.getId().getId(), 0, -1);
109   
110  5 for (Version version : versions) {
111  10 versionList.add(version);
112    }
113    } catch (ResolveException e) {
114  77 this.logger.debug("Failed to resolve remote versions for extension id [{}]", extension.getId().getId(), e);
115    }
116   
117    // Make sure the current version is included if the extension is invalid (it's possible this version does
118    // not exist on any repository)
119  82 if (!extension.isValid(namespace)) {
120  9 versionList.add(extension.getId().getVersion());
121    }
122   
123  82 return versionList;
124    }
125   
 
126  14 toggle protected void upgradeExtension(InstalledExtension extension, String namespace, Collection<Version> versionList)
127    {
128  14 for (Version version : versionList) {
129    // Don't try to upgrade for lower versions but try to repair same version of the extension is invalid
130  14 int compare = extension.getId().getVersion().compareTo(version);
131  14 if (compare > 0 || (compare == 0 && extension.isValid(namespace))) {
132  0 break;
133    }
134   
135    // Only upgrade beta if the current is beta etc.
136  14 if (extension.getId().getVersion().getType().ordinal() <= version.getType().ordinal()) {
137  14 if (tryInstallExtension(new ExtensionId(extension.getId().getId(), version), namespace)) {
138  9 break;
139    }
140    }
141    }
142    }
143   
144    /**
145    * Try to install the provided extension and update the plan if it's working.
146    *
147    * @param extensionId the extension version to install
148    * @param namespace the namespace where to install the extension
149    * @return true if the installation would succeed, false otherwise
150    */
 
151  14 toggle protected boolean tryInstallExtension(ExtensionId extensionId, String namespace)
152    {
153  14 DefaultExtensionPlanTree currentTree = this.extensionTree.clone();
154   
155  14 try {
156  14 installExtension(extensionId, namespace, currentTree);
157   
158  9 setExtensionTree(currentTree);
159   
160  9 return true;
161    } catch (InstallException e) {
162  5 this.logger.debug("Can't install extension [{}] on namespace [{}].", extensionId, namespace, e);
163    }
164   
165  5 return false;
166    }
167   
 
168  2 toggle protected void upgrade(String namespace, Collection<InstalledExtension> installedExtensions,
169    boolean filterDependencies)
170    {
171  2 this.progressManager.pushLevelProgress(installedExtensions.size(), this);
172   
173  2 try {
174  2 for (InstalledExtension installedExtension : installedExtensions) {
175  29 this.progressManager.startStep(this);
176   
177  29 if (namespace == null || !installedExtension.isInstalled(null)) {
178  10 upgradeExtension(installedExtension, namespace, filterDependencies);
179    }
180    }
181    } finally {
182  2 this.progressManager.popLevelProgress(this);
183    }
184    }
185   
 
186  6 toggle protected void upgrade(Collection<InstalledExtension> installedExtensions, boolean filterDependencies)
187    {
188  6 this.progressManager.pushLevelProgress(installedExtensions.size(), this);
189   
190  6 try {
191  6 for (InstalledExtension installedExtension : installedExtensions) {
192  82 this.progressManager.startStep(this);
193   
194  82 if (installedExtension.getNamespaces() == null) {
195  52 upgradeExtension(installedExtension, null, filterDependencies);
196    } else {
197  30 this.progressManager.pushLevelProgress(installedExtension.getNamespaces().size(), this);
198   
199  30 try {
200  30 for (String namespace : installedExtension.getNamespaces()) {
201  40 this.progressManager.startStep(this);
202   
203  40 upgradeExtension(installedExtension, namespace, filterDependencies);
204    }
205    } finally {
206  30 this.progressManager.popLevelProgress(this);
207    }
208    }
209    }
210    } finally {
211  6 this.progressManager.popLevelProgress(this);
212    }
213    }
214   
 
215  2 toggle protected Collection<InstalledExtension> getInstalledExtensions(String namespace)
216    {
217  2 Collection<ExtensionId> requestExtensions = getRequest().getExtensions();
218   
219  2 Collection<InstalledExtension> installedExtensions;
220   
221  2 if (requestExtensions != null && !requestExtensions.isEmpty()) {
222  0 installedExtensions = new ArrayList<>(requestExtensions.size());
223   
224  0 for (ExtensionId requestExtension : requestExtensions) {
225  0 InstalledExtension installedExtension =
226    this.installedExtensionRepository.getInstalledExtension(requestExtension);
227  0 if (installedExtension.isInstalled(namespace)) {
228  0 installedExtensions.add(installedExtension);
229    }
230    }
231    } else {
232  2 installedExtensions = this.installedExtensionRepository.getInstalledExtensions(namespace);
233    }
234   
235  2 return installedExtensions;
236    }
237   
 
238  6 toggle protected Collection<InstalledExtension> getInstalledExtensions()
239    {
240  6 Collection<ExtensionId> requestExtensions = getRequest().getExtensions();
241   
242  6 Collection<InstalledExtension> installedExtensions;
243   
244  6 if (requestExtensions != null && !requestExtensions.isEmpty()) {
245  1 installedExtensions = new ArrayList<>(requestExtensions.size());
246   
247  1 for (ExtensionId requestExtension : requestExtensions) {
248  1 InstalledExtension installedExtension =
249    this.installedExtensionRepository.getInstalledExtension(requestExtension);
250  1 installedExtensions.add(installedExtension);
251    }
252    } else {
253  5 installedExtensions = this.installedExtensionRepository.getInstalledExtensions();
254    }
255   
256  6 return installedExtensions;
257    }
258   
 
259  8 toggle @Override
260    protected void runInternal() throws Exception
261    {
262  8 Collection<String> namespaces = getRequest().getNamespaces();
263  8 Collection<ExtensionId> requestExtensions = getRequest().getExtensions();
264  8 boolean filterDependencies = requestExtensions == null || requestExtensions.isEmpty();
265   
266  8 if (namespaces == null) {
267  6 Collection<InstalledExtension> installedExtensions = getInstalledExtensions();
268   
269  6 upgrade(installedExtensions, filterDependencies);
270    } else {
271  2 this.progressManager.pushLevelProgress(namespaces.size(), this);
272   
273  2 try {
274  2 for (String namespace : namespaces) {
275  2 this.progressManager.startStep(this);
276   
277  2 upgrade(namespace, getInstalledExtensions(namespace), filterDependencies);
278    }
279    } finally {
280  2 this.progressManager.popLevelProgress(this);
281    }
282    }
283    }
284    }