cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / jps / jps-builders / src / org / jetbrains / jps / incremental / artifacts / impl / JpsArtifactUtil.java
1 // Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
2 package org.jetbrains.jps.incremental.artifacts.impl;
3
4 import com.intellij.openapi.util.text.StringUtil;
5 import com.intellij.util.Processor;
6 import com.intellij.util.containers.ContainerUtil;
7 import gnu.trove.THashSet;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.jps.model.artifact.JpsArtifact;
10 import org.jetbrains.jps.model.artifact.elements.JpsComplexPackagingElement;
11 import org.jetbrains.jps.model.artifact.elements.JpsCompositePackagingElement;
12 import org.jetbrains.jps.model.artifact.elements.JpsModuleOutputPackagingElement;
13 import org.jetbrains.jps.model.artifact.elements.JpsPackagingElement;
14 import org.jetbrains.jps.model.module.JpsModule;
15
16 import java.util.Collection;
17 import java.util.HashSet;
18 import java.util.Set;
19
20 public final class JpsArtifactUtil {
21   public static boolean processPackagingElements(@NotNull JpsPackagingElement element,
22                                                  @NotNull Processor<? super JpsPackagingElement> processor) {
23     return processPackagingElements(element, processor, new HashSet<>());
24   }
25
26   private static boolean processPackagingElements(@NotNull JpsPackagingElement element,
27                                                  @NotNull Processor<? super JpsPackagingElement> processor,
28                                                  final Set<? super JpsPackagingElement> processed) {
29     if (!processed.add(element)) {
30       return false;
31     }
32     if (!processor.process(element)) {
33       return false;
34     }
35
36     if (element instanceof JpsCompositePackagingElement) {
37       for (JpsPackagingElement child : ((JpsCompositePackagingElement)element).getChildren()) {
38         processPackagingElements(child, processor, processed);
39       }
40     }
41     else if (element instanceof JpsComplexPackagingElement) {
42       for (JpsPackagingElement child : ((JpsComplexPackagingElement)element).getSubstitution()) {
43         processPackagingElements(child, processor, processed);
44       }
45     }
46     return true;
47   }
48
49   public static boolean isArchiveName(String name) {
50     return name.length() >= 4 && name.charAt(name.length() - 4) == '.' && StringUtil.endsWithIgnoreCase(name, "ar");
51   }
52
53   public static Set<JpsModule> getModulesIncludedInArtifacts(final @NotNull Collection<? extends JpsArtifact> artifacts) {
54     final Set<JpsModule> modules = new THashSet<>();
55     for (JpsArtifact artifact : artifacts) {
56       processPackagingElements(artifact.getRootElement(), element -> {
57         if (element instanceof JpsModuleOutputPackagingElement) {
58           ContainerUtil.addIfNotNull(modules, ((JpsModuleOutputPackagingElement)element).getModuleReference().resolve());
59         }
60         return true;
61       });
62     }
63     return modules;
64   }
65 }