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

File ExtensionVersionsRESTResource.java

 

Coverage histogram

../../../../../img/srcFileCovDistChart0.png
83% of files have more coverage

Code metrics

18
28
3
1
131
88
15
0.54
9.33
3
5

Classes

Class Line # Actions
ExtensionVersionsRESTResource 59 28 0% 15 49
0.00%
 

Contributing tests

No tests hitting this source file were found.

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.repository.internal.resources;
22   
23    import java.util.ArrayList;
24    import java.util.Collections;
25    import java.util.Comparator;
26    import java.util.HashMap;
27    import java.util.Iterator;
28    import java.util.List;
29    import java.util.Map;
30   
31    import javax.inject.Named;
32    import javax.inject.Singleton;
33    import javax.ws.rs.DefaultValue;
34    import javax.ws.rs.GET;
35    import javax.ws.rs.Path;
36    import javax.ws.rs.PathParam;
37    import javax.ws.rs.QueryParam;
38   
39    import org.apache.commons.lang3.StringUtils;
40    import org.xwiki.component.annotation.Component;
41    import org.xwiki.extension.repository.xwiki.model.jaxb.ExtensionVersionSummary;
42    import org.xwiki.extension.repository.xwiki.model.jaxb.ExtensionVersions;
43    import org.xwiki.extension.version.InvalidVersionRangeException;
44    import org.xwiki.extension.version.Version;
45    import org.xwiki.extension.version.VersionConstraint;
46    import org.xwiki.extension.version.internal.DefaultVersion;
47    import org.xwiki.query.Query;
48    import org.xwiki.query.QueryException;
49    import org.xwiki.repository.Resources;
50   
51    /**
52    * @version $Id: 1775c38852ece1e8b35b4603aa7025fbdc0d1206 $
53    * @since 3.2M3
54    */
55    @Component
56    @Named("org.xwiki.repository.internal.resources.ExtensionVersionsRESTResource")
57    @Path(Resources.EXTENSION_VERSIONS)
58    @Singleton
 
59    public class ExtensionVersionsRESTResource extends AbstractExtensionRESTResource
60    {
 
61  0 toggle @GET
62    public ExtensionVersions getExtensionVersions(@PathParam("extensionId") String extensionId,
63    @QueryParam(Resources.QPARAM_LIST_START) @DefaultValue("0") int offset,
64    @QueryParam(Resources.QPARAM_LIST_NUMBER) @DefaultValue("-1") int number,
65    @QueryParam(Resources.QPARAM_VERSIONS_RANGES) String ranges) throws QueryException, InvalidVersionRangeException
66    {
67  0 Query query = createExtensionsSummariesQuery(null, "extension.id = :extensionId", 0, -1, true);
68   
69  0 query.bindValue("extensionId", extensionId);
70   
71  0 ExtensionVersions extensions = this.extensionObjectFactory.createExtensionVersions();
72   
73  0 getExtensionSummaries(extensions.getExtensionVersionSummaries(), query);
74   
75    // Filter by ranges
76  0 if (StringUtils.isNotBlank(ranges)) {
77  0 VersionConstraint constraint = this.extensionFactory.getVersionConstraint(ranges);
78   
79  0 if (constraint.getVersion() != null) {
80  0 throw new InvalidVersionRangeException("Invalid ranges syntax [" + ranges + "]");
81    }
82   
83  0 for (Iterator<ExtensionVersionSummary> it = extensions.getExtensionVersionSummaries().iterator(); it
84    .hasNext();) {
85  0 if (!constraint.containsVersion(new DefaultVersion(it.next().getVersion()))) {
86  0 it.remove();
87    }
88    }
89    }
90   
91    // Order by version
92  0 final Map<String, Version> versionCache = new HashMap<>();
93  0 Collections.sort(extensions.getExtensionVersionSummaries(), new Comparator<ExtensionVersionSummary>()
94    {
 
95  0 toggle @Override
96    public int compare(ExtensionVersionSummary o1, ExtensionVersionSummary o2)
97    {
98  0 return toVersion(o1.getVersion()).compareTo(toVersion(o2.getVersion()));
99    }
100   
 
101  0 toggle private Version toVersion(String versionString)
102    {
103  0 Version version = versionCache.get(versionString);
104   
105  0 if (version == null) {
106  0 version = extensionFactory.getVersion(versionString);
107  0 versionCache.put(versionString, version);
108    }
109   
110  0 return version;
111    }
112    });
113   
114  0 extensions.setTotalHits(extensions.getExtensionVersionSummaries().size());
115  0 extensions.setOffset(offset);
116   
117  0 if (offset > 0 || (number > -1 && offset + number < extensions.getExtensionVersionSummaries().size())) {
118  0 if (offset >= extensions.getExtensionVersionSummaries().size() || number == 0) {
119  0 extensions.getExtensionVersionSummaries().clear();
120    } else {
121  0 List<ExtensionVersionSummary> limited =
122    new ArrayList<ExtensionVersionSummary>(extensions.getExtensionVersionSummaries());
123  0 extensions.getExtensionVersionSummaries().clear();
124  0 extensions.withExtensionVersionSummaries(limited.subList(offset < 0 ? 0 : offset,
125  0 number < 0 ? extensions.getExtensionVersionSummaries().size() : offset + number));
126    }
127    }
128   
129  0 return extensions;
130    }
131    }