blob: 6228c8ce9db6c9778851c2764476cc3f039a78c9 [file] [log] [blame]
/*
* Copyright 2000-2013 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 org.jetbrains.plugins.javaFX.packaging.ant;
import com.intellij.compiler.ant.*;
import com.intellij.compiler.ant.artifacts.DirectoryAntCopyInstructionCreator;
import com.intellij.compiler.ant.taskdefs.Property;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.JavaSdkType;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.util.Couple;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.packaging.artifacts.Artifact;
import com.intellij.packaging.artifacts.ArtifactManager;
import com.intellij.packaging.artifacts.ArtifactType;
import com.intellij.packaging.elements.*;
import com.intellij.packaging.impl.elements.ArchivePackagingElement;
import com.intellij.util.ArrayUtil;
import com.intellij.util.Base64Converter;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.javaFX.packaging.JavaFxAntGenerator;
import org.jetbrains.plugins.javaFX.packaging.JavaFxApplicationArtifactType;
import org.jetbrains.plugins.javaFX.packaging.JavaFxArtifactProperties;
import org.jetbrains.plugins.javaFX.packaging.JavaFxArtifactPropertiesProvider;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* User: anna
* Date: 3/14/13
*/
public class JavaFxChunkBuildExtension extends ChunkBuildExtension {
@NonNls public static final String ARTIFACT_VENDOR_SIGN_PROPERTY = "artifact.sign.vendor";
@NonNls public static final String ARTIFACT_ALIAS_SIGN_PROPERTY = "artifact.sign.alias";
@NonNls public static final String ARTIFACT_KEYSTORE_SIGN_PROPERTY = "artifact.sign.keystore";
@NonNls public static final String ARTIFACT_STOREPASS_SIGN_PROPERTY = "artifact.sign.storepass";
@NonNls public static final String ARTIFACTKEYPASS_SIGN_PROPERTY = "artifact.sign.keypass";
@NotNull
@Override
public String[] getTargets(ModuleChunk chunk) {
return ArrayUtil.EMPTY_STRING_ARRAY;
}
@Override
public void process(Project project, ModuleChunk chunk, GenerationOptions genOptions, CompositeGenerator generator) {}
@Override
public void initArtifacts(Project project, GenerationOptions genOptions, CompositeGenerator generator) {
final Collection<? extends Artifact> artifacts =
ArtifactManager.getInstance(project).getArtifactsByType(JavaFxApplicationArtifactType.getInstance());
if (artifacts.isEmpty()) return;
final Sdk[] jdks = BuildProperties.getUsedJdks(project);
Sdk javaSdk = null;
for (Sdk jdk : jdks) {
if (jdk.getSdkType() instanceof JavaSdkType) {
javaSdk = jdk;
break;
}
}
if (javaSdk != null) {
final Tag taskdef = new Tag("taskdef",
Couple.of("resource", "com/sun/javafx/tools/ant/antlib.xml"),
Couple.of("uri", "javafx:com.sun.javafx.tools.ant"),
Couple.of("classpath",
BuildProperties
.propertyRef(BuildProperties.getJdkHomeProperty(javaSdk.getName())) +
"/lib/ant-javafx.jar"));
generator.add(taskdef);
}
}
protected List<? extends Generator> computeChildrenGenerators(PackagingElementResolvingContext resolvingContext,
final AntCopyInstructionCreator copyInstructionCreator,
final ArtifactAntGenerationContext generationContext,
ArtifactType artifactType,
List<PackagingElement<?>> children) {
final List<Generator> generators = new ArrayList<Generator>();
for (PackagingElement<?> child : children) {
generators.addAll(child.computeAntInstructions(resolvingContext, copyInstructionCreator, generationContext, artifactType));
}
return generators;
}
@Override
public void generateTasksForArtifact(Artifact artifact,
boolean preprocessing,
ArtifactAntGenerationContext context,
CompositeGenerator generator) {
if (preprocessing) return;
if (!(artifact.getArtifactType() instanceof JavaFxApplicationArtifactType)) return;
final CompositePackagingElement<?> rootElement = artifact.getRootElement();
final List<PackagingElement<?>> children = new ArrayList<PackagingElement<?>>();
String artifactFileName = rootElement.getName();
for (PackagingElement<?> child : rootElement.getChildren()) {
if (child instanceof ArchivePackagingElement) {
artifactFileName = ((ArchivePackagingElement)child).getArchiveFileName();
children.addAll(((ArchivePackagingElement)child).getChildren());
} else {
children.add(child);
}
}
final String artifactName = FileUtil.getNameWithoutExtension(artifactFileName);
final String tempDirPath = BuildProperties.propertyRef(
context.createNewTempFileProperty("artifact.temp.output." + artifactName, artifactFileName));
final PackagingElementResolvingContext resolvingContext = ArtifactManager.getInstance(context.getProject()).getResolvingContext();
for (Generator childGenerator : computeChildrenGenerators(resolvingContext,
new DirectoryAntCopyInstructionCreator(tempDirPath),
context, artifact.getArtifactType(), children)) {
generator.add(childGenerator);
}
final JavaFxArtifactProperties properties =
(JavaFxArtifactProperties)artifact.getProperties(JavaFxArtifactPropertiesProvider.getInstance());
final JavaFxArtifactProperties.JavaFxPackager javaFxPackager =
new JavaFxArtifactProperties.JavaFxPackager(artifact, properties, context.getProject()) {
@Override
protected void registerJavaFxPackagerError(String message) {}
};
final List<JavaFxAntGenerator.SimpleTag> tags =
JavaFxAntGenerator.createJarAndDeployTasks(javaFxPackager, artifactFileName, artifact.getName(), tempDirPath);
for (JavaFxAntGenerator.SimpleTag tag : tags) {
buildTags(generator, tag);
}
if (properties.isEnabledSigning()) {
final boolean selfSigning = properties.isSelfSigning();
String vendor = properties.getVendor();
if (vendor != null) {
vendor = vendor.replaceAll(",", "\\\\,") ;
}
generator.add(new Property(artifactBasedProperty(ARTIFACT_VENDOR_SIGN_PROPERTY, artifactName), "CN=" + vendor));
final String alias = selfSigning ? "jb" : properties.getAlias();
generator.add(new Property(artifactBasedProperty(ARTIFACT_ALIAS_SIGN_PROPERTY, artifactName), alias));
final String keystore = selfSigning ? tempDirPath + File.separator + "jb-key.jks" : properties.getKeystore();
generator.add(new Property(artifactBasedProperty(ARTIFACT_KEYSTORE_SIGN_PROPERTY, artifactName), keystore));
final String storepass = selfSigning ? "storepass" : Base64Converter.decode(properties.getStorepass());
generator.add(new Property(artifactBasedProperty(ARTIFACT_STOREPASS_SIGN_PROPERTY, artifactName), storepass));
final String keypass = selfSigning ? "keypass" : Base64Converter.decode(properties.getKeypass());
generator.add(new Property(artifactBasedProperty(ARTIFACTKEYPASS_SIGN_PROPERTY, artifactName), keypass));
final Pair[] keysDescriptions = createKeysDescriptions(artifactName);
if (selfSigning) {
generator.add(new Tag("genkey",
ArrayUtil.prepend(Couple.of("dname", BuildProperties
.propertyRef(artifactBasedProperty(ARTIFACT_VENDOR_SIGN_PROPERTY, artifactName))),
keysDescriptions)));
}
final Tag signjar = new Tag("signjar", keysDescriptions);
final Tag fileset = new Tag("fileset", Couple.of("dir", tempDirPath + "/deploy"));
fileset.add(new Tag("include", Couple.of("name", "*.jar")));
signjar.add(fileset);
generator.add(signjar);
}
final DirectoryAntCopyInstructionCreator creator = new DirectoryAntCopyInstructionCreator(BuildProperties.propertyRef(context.getConfiguredArtifactOutputProperty(artifact)));
generator.add(creator.createDirectoryContentCopyInstruction(tempDirPath + "/deploy"));
final Tag deleteTag = new Tag("delete", Couple.of("includeemptydirs", "true"));
deleteTag.add(new Tag("fileset", Couple.of("dir", tempDirPath)));
generator.add(deleteTag);
}
private static void buildTags(CompositeGenerator generator, final JavaFxAntGenerator.SimpleTag tag) {
final Tag newTag = new Tag(tag.getName(), tag.getPairs()){
@Override
public void generate(PrintWriter out) throws IOException {
final String value = tag.getValue();
if (value == null) {
super.generate(out);
} else {
out.print("<" + tag.getName() + ">" + value + "</" + tag.getName() + ">");
}
}
};
for (JavaFxAntGenerator.SimpleTag simpleTag : tag.getSubTags()) {
buildTags(newTag, simpleTag);
}
generator.add(newTag);
}
private static String artifactBasedProperty(final String property, String artifactName) {
return property + "." + artifactName;
}
private static Pair[] createKeysDescriptions(String artifactName) {
return new Pair[]{
Couple.of("alias", BuildProperties.propertyRef(artifactBasedProperty(ARTIFACT_ALIAS_SIGN_PROPERTY, artifactName))),
Couple.of("keystore", BuildProperties.propertyRef(artifactBasedProperty(ARTIFACT_KEYSTORE_SIGN_PROPERTY, artifactName))),
Couple.of("storepass", BuildProperties.propertyRef(artifactBasedProperty(ARTIFACT_STOREPASS_SIGN_PROPERTY, artifactName))),
Couple.of("keypass", BuildProperties.propertyRef(artifactBasedProperty(ARTIFACTKEYPASS_SIGN_PROPERTY, artifactName)))};
}
@Nullable
@Override
public Couple<String> getArtifactXmlNs(ArtifactType artifactType) {
if (artifactType instanceof JavaFxApplicationArtifactType) {
return Couple.of("xmlns:fx", "javafx:com.sun.javafx.tools.ant");
}
return null;
}
@Override
public boolean needAntArtifactInstructions(ArtifactType type) {
if (type instanceof JavaFxApplicationArtifactType) {
return false;
}
return true;
}
}