blob: 3eb811f2ef4c58738ec0096a93bb440eac30ea90 [file] [log] [blame]
package com.intellij.compiler.artifacts;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactManager;
import com.intellij.packaging.artifacts.ArtifactType;
import com.intellij.packaging.artifacts.ModifiableArtifactModel;
import com.intellij.packaging.elements.CompositePackagingElement;
import com.intellij.packaging.elements.PackagingElement;
import com.intellij.packaging.elements.PackagingElementFactory;
import com.intellij.packaging.elements.PackagingElementResolvingContext;
import com.intellij.packaging.impl.elements.ArchivePackagingElement;
import com.intellij.packaging.impl.elements.DirectoryPackagingElement;
import com.intellij.packaging.impl.elements.ManifestFileUtil;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertNotNull;
/**
* @author nik
*/
public class ArtifactsTestUtil {
public static String printToString(PackagingElement element, int level) {
StringBuilder builder = new StringBuilder(StringUtil.repeatSymbol(' ', level));
if (element instanceof ArchivePackagingElement) {
builder.append(((ArchivePackagingElement)element).getArchiveFileName());
}
else if (element instanceof DirectoryPackagingElement) {
builder.append(((DirectoryPackagingElement)element).getDirectoryName()).append("/");
}
else {
builder.append(element.toString());
}
builder.append("\n");
if (element instanceof CompositePackagingElement) {
for (PackagingElement<?> child : ((CompositePackagingElement<?>)element).getChildren()) {
builder.append(printToString(child, level + 1));
}
}
return builder.toString();
}
public static void assertLayout(PackagingElement element, String expected) {
assertEquals(adjustMultiLine(expected), printToString(element, 0));
}
private static String adjustMultiLine(String expected) {
final List<String> strings = StringUtil.split(StringUtil.trimStart(expected, "\n"), "\n");
int min = Integer.MAX_VALUE;
for (String s : strings) {
int k = 0;
while (k < s.length() && s.charAt(k) == ' ') {
k++;
}
min = Math.min(min, k);
}
List<String> lines = new ArrayList<String>();
for (String s : strings) {
lines.add(s.substring(min));
}
return StringUtil.join(lines, "\n") + "\n";
}
public static void assertLayout(Project project, String artifactName, String expected) {
assertLayout(findArtifact(project, artifactName).getRootElement(), expected);
}
public static void assertOutputPath(Project project, String artifactName, String expected) {
assertEquals(expected, findArtifact(project, artifactName).getOutputPath());
}
public static void assertOutputFileName(Project project, String artifactName, String expected) {
assertEquals(expected, findArtifact(project, artifactName).getRootElement().getName());
}
public static void setOutput(final Project project, final String artifactName, final String outputPath) {
new WriteAction() {
@Override
protected void run(final Result result) {
final ModifiableArtifactModel model = ArtifactManager.getInstance(project).createModifiableModel();
model.getOrCreateModifiableArtifact(findArtifact(project, artifactName)).setOutputPath(outputPath);
model.commit();
}
}.execute();
}
public static void addArtifactToLayout(final Project project, final Artifact parent, final Artifact toAdd) {
new WriteAction() {
@Override
protected void run(final Result result) {
final ModifiableArtifactModel model = ArtifactManager.getInstance(project).createModifiableModel();
final PackagingElement<?> artifactElement = PackagingElementFactory.getInstance().createArtifactElement(toAdd, project);
model.getOrCreateModifiableArtifact(parent).getRootElement().addOrFindChild(artifactElement);
model.commit();
}
}.execute();
}
public static Artifact findArtifact(Project project, String artifactName) {
final ArtifactManager manager = ArtifactManager.getInstance(project);
final Artifact artifact = manager.findArtifact(artifactName);
assertNotNull("'" + artifactName + "' artifact not found", artifact);
return artifact;
}
public static void assertManifest(Artifact artifact, PackagingElementResolvingContext context, @Nullable String mainClass, @Nullable String classpath) {
final CompositePackagingElement<?> rootElement = artifact.getRootElement();
final ArtifactType type = artifact.getArtifactType();
assertManifest(rootElement, context, type, mainClass, classpath);
}
public static void assertManifest(CompositePackagingElement<?> rootElement,
PackagingElementResolvingContext context,
ArtifactType type,
@Nullable String mainClass, @Nullable String classpath) {
final VirtualFile file = ManifestFileUtil.findManifestFile(rootElement, context, type);
assertNotNull(file);
final Manifest manifest = ManifestFileUtil.readManifest(file);
assertEquals(mainClass, manifest.getMainAttributes().getValue(Attributes.Name.MAIN_CLASS));
assertEquals(classpath, manifest.getMainAttributes().getValue(Attributes.Name.CLASS_PATH));
}
}