befa558c8d6962676ab5bcdbbff4c81b7fa9e6e8
[idea/community.git] / java / idea-ui / src / com / intellij / openapi / roots / ui / configuration / artifacts / ArtifactProjectStructureElement.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.intellij.openapi.roots.ui.configuration.artifacts;
17
18 import com.intellij.facet.Facet;
19 import com.intellij.openapi.module.Module;
20 import com.intellij.openapi.roots.ProjectModelExternalSource;
21 import com.intellij.openapi.roots.libraries.Library;
22 import com.intellij.openapi.roots.ui.configuration.ModificationOfImportedModelWarningComponent;
23 import com.intellij.openapi.roots.ui.configuration.projectRoot.StructureConfigurableContext;
24 import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.*;
25 import com.intellij.packaging.artifacts.Artifact;
26 import com.intellij.packaging.artifacts.ModifiableArtifactModel;
27 import com.intellij.packaging.elements.CompositePackagingElement;
28 import com.intellij.packaging.elements.PackagingElement;
29 import com.intellij.packaging.impl.artifacts.ArtifactUtil;
30 import com.intellij.packaging.impl.artifacts.PackagingElementPath;
31 import com.intellij.packaging.impl.artifacts.PackagingElementProcessor;
32 import com.intellij.packaging.impl.elements.ArtifactPackagingElement;
33 import com.intellij.packaging.impl.elements.FacetBasedPackagingElement;
34 import com.intellij.packaging.impl.elements.LibraryPackagingElement;
35 import com.intellij.packaging.impl.elements.ModulePackagingElement;
36 import org.jetbrains.annotations.NotNull;
37 import org.jetbrains.annotations.Nullable;
38
39 import java.util.ArrayList;
40 import java.util.List;
41
42 public class ArtifactProjectStructureElement extends ProjectStructureElement {
43   private final ArtifactsStructureConfigurableContext myArtifactsStructureContext;
44   private final Artifact myOriginalArtifact;
45
46   ArtifactProjectStructureElement(StructureConfigurableContext context,
47                                   ArtifactsStructureConfigurableContext artifactsStructureContext, Artifact artifact) {
48     super(context);
49     myArtifactsStructureContext = artifactsStructureContext;
50     myOriginalArtifact = artifactsStructureContext.getOriginalArtifact(artifact);
51   }
52
53   @Override
54   public void check(final ProjectStructureProblemsHolder problemsHolder) {
55     final Artifact artifact = myArtifactsStructureContext.getArtifactModel().getArtifactByOriginal(myOriginalArtifact);
56     final ArtifactProblemsHolderImpl artifactProblemsHolder = new ArtifactProblemsHolderImpl(myArtifactsStructureContext, myOriginalArtifact, problemsHolder);
57     if (myArtifactsStructureContext instanceof ArtifactsStructureConfigurableContextImpl) {
58       ArtifactEditorImpl artifactEditor = ((ArtifactsStructureConfigurableContextImpl)myArtifactsStructureContext).getArtifactEditor(artifact);
59       if (artifactEditor != null && (artifactEditor.isModified() || isArtifactModified(artifact))) {
60         ProjectModelExternalSource externalSource = artifact.getExternalSource();
61         if (externalSource != null) {
62           String message = ModificationOfImportedModelWarningComponent.getWarningText("Artifact '" + artifact.getName() + "'", externalSource);
63           artifactProblemsHolder.registerWarning(message, "modification-of-imported-element", null);
64         }
65       }
66     }
67     artifact.getArtifactType().checkRootElement(myArtifactsStructureContext.getRootElement(myOriginalArtifact), artifact, artifactProblemsHolder);
68   }
69
70   private boolean isArtifactModified(Artifact artifact) {
71     ModifiableArtifactModel modifiableModel = ((ArtifactsStructureConfigurableContextImpl)myArtifactsStructureContext).getActualModifiableModel();
72     return modifiableModel != null && artifact != modifiableModel.getOriginalArtifact(artifact);
73   }
74
75   public Artifact getOriginalArtifact() {
76     return myOriginalArtifact;
77   }
78
79   @Override
80   public List<ProjectStructureElementUsage> getUsagesInElement() {
81     final Artifact artifact = myArtifactsStructureContext.getArtifactModel().getArtifactByOriginal(myOriginalArtifact);
82     final List<ProjectStructureElementUsage> usages = new ArrayList<>();
83     final CompositePackagingElement<?> rootElement = myArtifactsStructureContext.getRootElement(artifact);
84     ArtifactUtil.processPackagingElements(rootElement, null, new PackagingElementProcessor<PackagingElement<?>>() {
85       @Override
86       public boolean process(@NotNull PackagingElement<?> packagingElement, @NotNull PackagingElementPath path) {
87         ProjectStructureElement element = getProjectStructureElementFor(packagingElement, ArtifactProjectStructureElement.this.myContext,
88                                                                         ArtifactProjectStructureElement.this.myArtifactsStructureContext);
89         if (element != null) {
90           usages.add(createUsage(packagingElement, element, path.getPathStringFrom("/", rootElement)));
91         }
92         return true;
93       }
94     }, myArtifactsStructureContext, false, artifact.getArtifactType());
95     return usages;
96   }
97
98   @Nullable
99   public static ProjectStructureElement getProjectStructureElementFor(PackagingElement<?> packagingElement,
100                                                                        final StructureConfigurableContext context,
101                                                                        final ArtifactsStructureConfigurableContext artifactsStructureContext) {
102     if (packagingElement instanceof ModulePackagingElement) {
103       final Module module = ((ModulePackagingElement)packagingElement).findModule(artifactsStructureContext);
104       if (module != null) {
105         return new ModuleProjectStructureElement(context, module);
106       }
107     }
108     else if (packagingElement instanceof LibraryPackagingElement) {
109       final Library library = ((LibraryPackagingElement)packagingElement).findLibrary(artifactsStructureContext);
110       if (library != null) {
111         return new LibraryProjectStructureElement(context, library);
112       }
113     }
114     else if (packagingElement instanceof ArtifactPackagingElement) {
115       final Artifact usedArtifact = ((ArtifactPackagingElement)packagingElement).findArtifact(artifactsStructureContext);
116       if (usedArtifact != null) {
117         return artifactsStructureContext.getOrCreateArtifactElement(usedArtifact);
118       }
119     }
120     else if (packagingElement instanceof FacetBasedPackagingElement) {
121       Facet facet = ((FacetBasedPackagingElement)packagingElement).findFacet(artifactsStructureContext);
122       if (facet != null) {
123         return new FacetProjectStructureElement(context, facet);
124       }
125     }
126     return null;
127   }
128
129   private UsageInArtifact createUsage(PackagingElement<?> packagingElement, final ProjectStructureElement element, final String parentPath) {
130     return new UsageInArtifact(myOriginalArtifact, myArtifactsStructureContext, element, this, parentPath, packagingElement);
131   }
132
133   @Override
134   public boolean equals(Object o) {
135     if (this == o) return true;
136     if (!(o instanceof ArtifactProjectStructureElement)) return false;
137
138     return myOriginalArtifact.equals(((ArtifactProjectStructureElement)o).myOriginalArtifact);
139
140   }
141
142   @Override
143   public int hashCode() {
144     return myOriginalArtifact.hashCode();
145   }
146
147   @Override
148   public String getPresentableName() {
149     return getActualArtifactName();
150   }
151
152   @Override
153   public String getTypeName() {
154     return "Artifact";
155   }
156
157   @Override
158   public String getId() {
159     return "artifact:" + getActualArtifactName();
160   }
161
162   private String getActualArtifactName() {
163     return myArtifactsStructureContext.getArtifactModel().getArtifactByOriginal(myOriginalArtifact).getName();
164   }
165 }