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; } }