blob: 31a85e5414eca49ce8217709893ca8f12382df2e [file] [log] [blame]
package org.jetbrains.android.compiler.artifact;
import com.intellij.compiler.ant.Generator;
import com.intellij.facet.pointers.FacetPointer;
import com.intellij.facet.pointers.FacetPointersManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.artifacts.ArtifactType;
import com.intellij.packaging.elements.AntCopyInstructionCreator;
import com.intellij.packaging.elements.ArtifactAntGenerationContext;
import com.intellij.packaging.elements.PackagingElement;
import com.intellij.packaging.elements.PackagingElementResolvingContext;
import com.intellij.packaging.impl.elements.FacetBasedPackagingElement;
import com.intellij.packaging.impl.elements.ModuleOutputPackagingElement;
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.android.facet.AndroidFacet;
import org.jetbrains.android.facet.AndroidRootUtil;
import org.jetbrains.android.util.AndroidCommonUtils;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidFinalPackageElement extends PackagingElement<AndroidFinalPackageElement.AndroidFinalPackageElementState>
implements FacetBasedPackagingElement, ModuleOutputPackagingElement {
@NonNls static final String FACET_ATTRIBUTE = "facet";
private FacetPointer<AndroidFacet> myFacetPointer;
private final Project myProject;
public AndroidFinalPackageElement(@NotNull Project project, @Nullable AndroidFacet facet) {
super(AndroidFinalPackageElementType.getInstance());
myProject = project;
myFacetPointer = facet != null ? FacetPointersManager.getInstance(myProject).create(facet) : null;
}
@Override
public PackagingElementPresentation createPresentation(@NotNull ArtifactEditorContext context) {
return new DelegatedPackagingElementPresentation(new AndroidFinalPackagePresentation(myFacetPointer));
}
@Nullable
private String getApkPath() {
if (myFacetPointer == null) {
return null;
}
final AndroidFacet facet = myFacetPointer.getFacet();
if (facet == null) {
return null;
}
final String apkPath = AndroidRootUtil.getApkPath(facet);
final String path = apkPath != null
? AndroidCommonUtils.addSuffixToFileName(apkPath, AndroidCommonUtils.ANDROID_FINAL_PACKAGE_FOR_ARTIFACT_SUFFIX)
: null;
return path != null
? FileUtil.toSystemIndependentName(path) + "!/"
: null;
}
@Override
public List<? extends Generator> computeAntInstructions(@NotNull PackagingElementResolvingContext resolvingContext,
@NotNull AntCopyInstructionCreator creator,
@NotNull ArtifactAntGenerationContext generationContext,
@NotNull ArtifactType artifactType) {
final String apkPath = getApkPath();
if (apkPath != null) {
return Collections.singletonList(creator.createExtractedDirectoryInstruction(apkPath));
}
return Collections.emptyList();
}
@Nullable
public AndroidFacet getFacet() {
return myFacetPointer != null ? myFacetPointer.getFacet() : null;
}
@Override
public boolean isEqualTo(@NotNull PackagingElement<?> element) {
if (!(element instanceof AndroidFinalPackageElement)) {
return false;
}
final AndroidFinalPackageElement packageElement = (AndroidFinalPackageElement)element;
return myFacetPointer == null
? packageElement.myFacetPointer == null
: myFacetPointer.equals(packageElement.myFacetPointer);
}
@Override
public AndroidFinalPackageElementState getState() {
final AndroidFinalPackageElementState state = new AndroidFinalPackageElementState();
state.myFacetPointer = myFacetPointer != null ? myFacetPointer.getId() : null;
return state;
}
@Override
public AndroidFacet findFacet(@NotNull PackagingElementResolvingContext context) {
return myFacetPointer != null ? myFacetPointer.findFacet(context.getModulesProvider(), context.getFacetsProvider()) : null;
}
@Override
public void loadState(AndroidFinalPackageElementState state) {
myFacetPointer = state.myFacetPointer != null
? FacetPointersManager.getInstance(myProject).<AndroidFacet>create(state.myFacetPointer)
: null;
}
@Override
public String getModuleName() {
return myFacetPointer != null ? myFacetPointer.getModuleName() : null;
}
@Override
public Module findModule(PackagingElementResolvingContext context) {
final AndroidFacet facet = findFacet(context);
return facet != null ? facet.getModule() : null;
}
@NotNull
@Override
public Collection<VirtualFile> getSourceRoots(PackagingElementResolvingContext context) {
return Collections.emptyList();
}
public static class AndroidFinalPackageElementState {
@Attribute(FACET_ATTRIBUTE)
public String myFacetPointer;
}
}