/* * Copyright 2000-2010 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.openapi.util.Comparing; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import consulo.vfs.util.ArchiveVfsUtil; import com.intellij.packaging.artifacts.ArtifactType; import com.intellij.packaging.elements.ArtifactIncrementalCompilerContext; import com.intellij.packaging.elements.IncrementalCompilerInstructionCreator; import com.intellij.packaging.elements.PackagingElement; import com.intellij.packaging.elements.PackagingElementResolvingContext; import com.intellij.packaging.impl.ui.ExtractedDirectoryPresentation; import com.intellij.packaging.ui.ArtifactEditorContext; import com.intellij.packaging.ui.PackagingElementPresentation; import com.intellij.util.xmlb.annotations.Attribute; import org.jetbrains.annotations.NotNull; /** * @author nik */ public class ExtractedDirectoryPackagingElement extends FileOrDirectoryCopyPackagingElement<ExtractedDirectoryPackagingElement> { private String myPathInJar; public ExtractedDirectoryPackagingElement() { super(ExtractedDirectoryElementType.getInstance()); } public ExtractedDirectoryPackagingElement(String jarPath, String pathInJar) { super(ExtractedDirectoryElementType.getInstance(), jarPath); myPathInJar = pathInJar; if (!StringUtil.startsWithChar(myPathInJar, '/')) { myPathInJar = "/" + myPathInJar; } if (!StringUtil.endsWithChar(myPathInJar, '/')) { myPathInJar += "/"; } } @Override public PackagingElementPresentation createPresentation(@NotNull ArtifactEditorContext context) { return new ExtractedDirectoryPresentation(this); } @Override public String toString() { return "extracted:" + myFilePath + "!" + myPathInJar; } @Override public VirtualFile findFile() { final VirtualFile jarFile = super.findFile(); if (jarFile == null) return null; final VirtualFile archiveRoot = ArchiveVfsUtil.getArchiveRootForLocalFile(jarFile); if ("/".equals(myPathInJar)) return archiveRoot; return archiveRoot != null ? archiveRoot.findFileByRelativePath(myPathInJar) : null; } @Override public void computeIncrementalCompilerInstructions(@NotNull IncrementalCompilerInstructionCreator creator, @NotNull PackagingElementResolvingContext resolvingContext, @NotNull ArtifactIncrementalCompilerContext compilerContext, @NotNull ArtifactType artifactType) { final VirtualFile file = findFile(); if (file != null && file.isValid() && file.isDirectory()) { creator.addDirectoryCopyInstructions(file); } } @Override public boolean isEqualTo(@NotNull PackagingElement<?> element) { return element instanceof ExtractedDirectoryPackagingElement && super.isEqualTo(element) && Comparing.equal(myPathInJar, ((ExtractedDirectoryPackagingElement)element).getPathInJar()); } @Override public ExtractedDirectoryPackagingElement getState() { return this; } @Override public void loadState(ExtractedDirectoryPackagingElement state) { myFilePath = state.getFilePath(); myPathInJar = state.getPathInJar(); } @Attribute("path-in-jar") public String getPathInJar() { return myPathInJar; } public void setPathInJar(String pathInJar) { myPathInJar = pathInJar; } }