blob: 87deabf6840ab084264c419fa3decb92781226e0 [file] [log] [blame]
/*
* Copyright 2000-2009 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.packaging.impl.elements;
import com.intellij.compiler.ant.BuildProperties;
import com.intellij.compiler.ant.Generator;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactPointer;
import com.intellij.packaging.artifacts.ArtifactPointerManager;
import com.intellij.packaging.artifacts.ArtifactType;
import com.intellij.packaging.elements.*;
import com.intellij.packaging.impl.ui.ArtifactElementPresentation;
import com.intellij.packaging.impl.ui.DelegatedPackagingElementPresentation;
import com.intellij.packaging.ui.ArtifactEditorContext;
import com.intellij.packaging.ui.PackagingElementPresentation;
import com.intellij.util.xmlb.annotations.Attribute;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* @author nik
*/
public class ArtifactPackagingElement extends ComplexPackagingElement<ArtifactPackagingElement.ArtifactPackagingElementState> {
private static final Logger LOG = Logger.getInstance("#com.intellij.packaging.impl.elements.ArtifactPackagingElement");
private final Project myProject;
private ArtifactPointer myArtifactPointer;
@NonNls public static final String ARTIFACT_NAME_ATTRIBUTE = "artifact-name";
public ArtifactPackagingElement(@NotNull Project project) {
super(ArtifactElementType.ARTIFACT_ELEMENT_TYPE);
myProject = project;
}
public ArtifactPackagingElement(@NotNull Project project, @NotNull ArtifactPointer artifactPointer) {
this(project);
myArtifactPointer = artifactPointer;
}
public List<? extends PackagingElement<?>> getSubstitution(@NotNull PackagingElementResolvingContext context, @NotNull ArtifactType artifactType) {
final Artifact artifact = findArtifact(context);
if (artifact != null) {
final ArtifactType type = artifact.getArtifactType();
List<? extends PackagingElement<?>> substitution = type.getSubstitution(artifact, context, artifactType);
if (substitution != null) {
return substitution;
}
final List<PackagingElement<?>> elements = new ArrayList<PackagingElement<?>>();
final CompositePackagingElement<?> rootElement = artifact.getRootElement();
if (rootElement instanceof ArtifactRootElement<?>) {
elements.addAll(rootElement.getChildren());
}
else {
elements.add(rootElement);
}
return elements;
}
return null;
}
@Override
public List<? extends Generator> computeAntInstructions(@NotNull PackagingElementResolvingContext resolvingContext, @NotNull AntCopyInstructionCreator creator,
@NotNull ArtifactAntGenerationContext generationContext,
@NotNull ArtifactType artifactType) {
final Artifact artifact = findArtifact(resolvingContext);
if (artifact != null) {
if (artifact.getArtifactType().getSubstitution(artifact, resolvingContext, artifactType) != null) {
return super.computeAntInstructions(resolvingContext, creator, generationContext, artifactType);
}
final String outputPath = BuildProperties.propertyRef(generationContext.getArtifactOutputProperty(artifact));
return Collections.singletonList(creator.createDirectoryContentCopyInstruction(outputPath));
}
return Collections.emptyList();
}
public PackagingElementPresentation createPresentation(@NotNull ArtifactEditorContext context) {
return new DelegatedPackagingElementPresentation(new ArtifactElementPresentation(myArtifactPointer, context));
}
public ArtifactPackagingElementState getState() {
final ArtifactPackagingElementState state = new ArtifactPackagingElementState();
if (myArtifactPointer != null) {
state.setArtifactName(myArtifactPointer.getArtifactName());
}
return state;
}
public void loadState(ArtifactPackagingElementState state) {
final String name = state.getArtifactName();
myArtifactPointer = name != null ? ArtifactPointerManager.getInstance(myProject).createPointer(name) : null;
}
@Override
public String toString() {
return "artifact:" + getArtifactName();
}
@Override
public boolean isEqualTo(@NotNull PackagingElement<?> element) {
return element instanceof ArtifactPackagingElement && myArtifactPointer != null
&& myArtifactPointer.equals(((ArtifactPackagingElement)element).myArtifactPointer);
}
@Nullable
public Artifact findArtifact(@NotNull PackagingElementResolvingContext context) {
return myArtifactPointer != null ? myArtifactPointer.findArtifact(context.getArtifactModel()) : null;
}
@Nullable
public String getArtifactName() {
return myArtifactPointer != null ? myArtifactPointer.getArtifactName() : null;
}
public static class ArtifactPackagingElementState {
private String myArtifactName;
@Attribute(ARTIFACT_NAME_ATTRIBUTE)
public String getArtifactName() {
return myArtifactName;
}
public void setArtifactName(String artifactName) {
myArtifactName = artifactName;
}
}
}