View | Details | Raw Unified | Return to bug 52952
Collapse All | Expand All

(-)java/org/apache/catalina/util/Extension.java (+21 lines)
Lines 19-24 Link Here
19
package org.apache.catalina.util;
19
package org.apache.catalina.util;
20
20
21
21
22
import java.util.Objects;
22
import java.util.StringTokenizer;
23
import java.util.StringTokenizer;
23
24
24
25
Lines 248-254 Link Here
248
249
249
    }
250
    }
250
251
252
    @Override
253
    public boolean equals(Object o) {
254
        if (this == o) return true;
255
        if (!(o instanceof Extension)) return false;
256
        Extension extension = (Extension) o;
257
        return Objects.equals(extensionName, extension.extensionName) &&
258
                Objects.equals(implementationURL, extension.implementationURL) &&
259
                Objects.equals(implementationVendor, extension.implementationVendor) &&
260
                Objects.equals(implementationVendorId, extension.implementationVendorId) &&
261
                Objects.equals(implementationVersion, extension.implementationVersion) &&
262
                Objects.equals(specificationVendor, extension.specificationVendor) &&
263
                Objects.equals(specificationVersion, extension.specificationVersion);
264
    }
251
265
266
    @Override
267
    public int hashCode() {
268
        return Objects.hash(extensionName, implementationURL, implementationVendor, implementationVendorId,
269
                implementationVersion, specificationVendor, specificationVersion);
270
    }
271
272
252
    // -------------------------------------------------------- Private Methods
273
    // -------------------------------------------------------- Private Methods
253
274
254
275
(-)java/org/apache/catalina/util/ExtensionValidator.java (-12 / +14 lines)
Lines 21-28 Link Here
21
import java.io.IOException;
21
import java.io.IOException;
22
import java.io.InputStream;
22
import java.io.InputStream;
23
import java.util.ArrayList;
23
import java.util.ArrayList;
24
import java.util.HashSet;
24
import java.util.Iterator;
25
import java.util.Iterator;
25
import java.util.Locale;
26
import java.util.Locale;
27
import java.util.Set;
26
import java.util.StringTokenizer;
28
import java.util.StringTokenizer;
27
import java.util.jar.JarInputStream;
29
import java.util.jar.JarInputStream;
28
import java.util.jar.Manifest;
30
import java.util.jar.Manifest;
Lines 56-65 Link Here
56
    private static final StringManager sm =
58
    private static final StringManager sm =
57
            StringManager.getManager("org.apache.catalina.util");
59
            StringManager.getManager("org.apache.catalina.util");
58
60
59
    private static volatile ArrayList<Extension> containerAvailableExtensions =
61
    private static volatile Set<Extension> containerAvailableExtensions =
60
            null;
62
            null;
61
    private static final ArrayList<ManifestResource> containerManifestResources =
63
    private static final Set<ManifestResource> containerManifestResources =
62
            new ArrayList<>();
64
            new HashSet<>();
63
65
64
66
65
    // ----------------------------------------------------- Static Initializer
67
    // ----------------------------------------------------- Static Initializer
Lines 129-135 Link Here
129
                    throws IOException {
131
                    throws IOException {
130
132
131
        String appName = context.getName();
133
        String appName = context.getName();
132
        ArrayList<ManifestResource> appManifestResources = new ArrayList<>();
134
        Set<ManifestResource> appManifestResources = new HashSet<>();
133
135
134
        // Web application manifest
136
        // Web application manifest
135
        WebResource resource = resources.getResource("/META-INF/MANIFEST.MF");
137
        WebResource resource = resources.getResource("/META-INF/MANIFEST.MF");
Lines 206-220 Link Here
206
     * @return true if manifest resource file requirements are met
208
     * @return true if manifest resource file requirements are met
207
     */
209
     */
208
    private static boolean validateManifestResources(String appName,
210
    private static boolean validateManifestResources(String appName,
209
            ArrayList<ManifestResource> resources) {
211
            Set<ManifestResource> resources) {
210
        boolean passes = true;
212
        boolean passes = true;
211
        int failureCount = 0;
213
        int failureCount = 0;
212
        ArrayList<Extension> availableExtensions = null;
214
        Set<Extension> availableExtensions = null;
213
215
214
        Iterator<ManifestResource> it = resources.iterator();
216
        Iterator<ManifestResource> it = resources.iterator();
215
        while (it.hasNext()) {
217
        while (it.hasNext()) {
216
            ManifestResource mre = it.next();
218
            ManifestResource mre = it.next();
217
            ArrayList<Extension> requiredList = mre.getRequiredExtensions();
219
            Set<Extension> requiredList = mre.getRequiredExtensions();
218
            if (requiredList == null) {
220
            if (requiredList == null) {
219
                continue;
221
                continue;
220
            }
222
            }
Lines 299-319 Link Here
299
    *
301
    *
300
    * @return HashMap Map of available extensions
302
    * @return HashMap Map of available extensions
301
    */
303
    */
302
    private static ArrayList<Extension> buildAvailableExtensionsList(
304
    private static Set<Extension> buildAvailableExtensionsList(
303
            ArrayList<ManifestResource> resources) {
305
            Set<ManifestResource> resources) {
304
306
305
        ArrayList<Extension> availableList = null;
307
        Set<Extension> availableList = null;
306
308
307
        Iterator<ManifestResource> it = resources.iterator();
309
        Iterator<ManifestResource> it = resources.iterator();
308
        while (it.hasNext()) {
310
        while (it.hasNext()) {
309
            ManifestResource mre = it.next();
311
            ManifestResource mre = it.next();
310
            ArrayList<Extension> list = mre.getAvailableExtensions();
312
            Set<Extension> list = mre.getAvailableExtensions();
311
            if (list != null) {
313
            if (list != null) {
312
                Iterator<Extension> values = list.iterator();
314
                Iterator<Extension> values = list.iterator();
313
                while (values.hasNext()) {
315
                while (values.hasNext()) {
314
                    Extension ext = values.next();
316
                    Extension ext = values.next();
315
                    if (availableList == null) {
317
                    if (availableList == null) {
316
                        availableList = new ArrayList<>();
318
                        availableList = new HashSet<>();
317
                        availableList.add(ext);
319
                        availableList.add(ext);
318
                    } else {
320
                    } else {
319
                        availableList.add(ext);
321
                        availableList.add(ext);
(-)java/org/apache/catalina/util/ManifestResource.java (-8 / +27 lines)
Lines 17-23 Link Here
17
package org.apache.catalina.util;
17
package org.apache.catalina.util;
18
18
19
import java.util.ArrayList;
19
import java.util.ArrayList;
20
import java.util.HashSet;
20
import java.util.Iterator;
21
import java.util.Iterator;
22
import java.util.Objects;
23
import java.util.Set;
21
import java.util.jar.Attributes;
24
import java.util.jar.Attributes;
22
import java.util.jar.Manifest;
25
import java.util.jar.Manifest;
23
26
Lines 37-44 Link Here
37
    public static final int WAR = 2;
40
    public static final int WAR = 2;
38
    public static final int APPLICATION = 3;
41
    public static final int APPLICATION = 3;
39
42
40
    private ArrayList<Extension> availableExtensions = null;
43
    private Set<Extension> availableExtensions = null;
41
    private ArrayList<Extension> requiredExtensions = null;
44
    private Set<Extension> requiredExtensions = null;
42
45
43
    private final String resourceName;
46
    private final String resourceName;
44
    private final int resourceType;
47
    private final int resourceType;
Lines 64-70 Link Here
64
     *
67
     *
65
     * @return List of available extensions
68
     * @return List of available extensions
66
     */
69
     */
67
    public ArrayList<Extension> getAvailableExtensions() {
70
    public Set<Extension> getAvailableExtensions() {
68
        return availableExtensions;
71
        return availableExtensions;
69
    }
72
    }
70
73
Lines 73-79 Link Here
73
     *
76
     *
74
     * @return List of required extensions
77
     * @return List of required extensions
75
     */
78
     */
76
    public ArrayList<Extension> getRequiredExtensions() {
79
    public Set<Extension> getRequiredExtensions() {
77
        return requiredExtensions;
80
        return requiredExtensions;
78
    }
81
    }
79
82
Lines 136-142 Link Here
136
        return (sb.toString());
139
        return (sb.toString());
137
    }
140
    }
138
141
142
    @Override
143
    public boolean equals(Object o) {
144
        if (this == o) return true;
145
        if (!(o instanceof ManifestResource)) return false;
146
        ManifestResource that = (ManifestResource) o;
147
        return Objects.equals(availableExtensions, that.availableExtensions) &&
148
                Objects.equals(requiredExtensions, that.requiredExtensions) &&
149
                Objects.equals(resourceName, that.resourceName) &&
150
                resourceType == that.resourceType;
151
    }
139
152
153
    @Override
154
    public int hashCode() {
155
        return Objects.hash(availableExtensions, requiredExtensions, resourceName, resourceType);
156
    }
157
158
140
    // -------------------------------------------------------- Private Methods
159
    // -------------------------------------------------------- Private Methods
141
160
142
    private void processManifest(Manifest manifest) {
161
    private void processManifest(Manifest manifest) {
Lines 154-160 Link Here
154
     * @return List of required extensions, or null if the application
173
     * @return List of required extensions, or null if the application
155
     * does not require any extensions
174
     * does not require any extensions
156
     */
175
     */
157
    private ArrayList<Extension> getRequiredExtensions(Manifest manifest) {
176
    private Set<Extension> getRequiredExtensions(Manifest manifest) {
158
177
159
        Attributes attributes = manifest.getMainAttributes();
178
        Attributes attributes = manifest.getMainAttributes();
160
        String names = attributes.getValue("Extension-List");
179
        String names = attributes.getValue("Extension-List");
Lines 161-167 Link Here
161
        if (names == null)
180
        if (names == null)
162
            return null;
181
            return null;
163
182
164
        ArrayList<Extension> extensionList = new ArrayList<>();
183
        Set<Extension> extensionList = new HashSet<>();
165
        names += " ";
184
        names += " ";
166
185
167
        while (true) {
186
        while (true) {
Lines 201-207 Link Here
201
     * @return List of available extensions, or null if the web application
220
     * @return List of available extensions, or null if the web application
202
     * does not bundle any extensions
221
     * does not bundle any extensions
203
     */
222
     */
204
    private ArrayList<Extension> getAvailableExtensions(Manifest manifest) {
223
    private Set<Extension> getAvailableExtensions(Manifest manifest) {
205
224
206
        Attributes attributes = manifest.getMainAttributes();
225
        Attributes attributes = manifest.getMainAttributes();
207
        String name = attributes.getValue("Extension-Name");
226
        String name = attributes.getValue("Extension-Name");
Lines 208-214 Link Here
208
        if (name == null)
227
        if (name == null)
209
            return null;
228
            return null;
210
229
211
        ArrayList<Extension> extensionList = new ArrayList<>();
230
        Set<Extension> extensionList = new HashSet<>();
212
231
213
        Extension extension = new Extension();
232
        Extension extension = new Extension();
214
        extension.setExtensionName(name);
233
        extension.setExtensionName(name);

Return to bug 52952