blob: 9ff3dffbf55ea35c271eaaa2291bda8aeb56e013 [file] [log] [blame]
package org.jetbrains.jps.android;
import com.intellij.util.Base64Converter;
import org.jetbrains.android.compiler.artifact.AndroidArtifactSigningMode;
import org.jetbrains.android.util.AndroidCommonUtils;
import org.jetbrains.android.util.AndroidCompilerMessageKind;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.android.model.AndroidApplicationArtifactType;
import org.jetbrains.jps.android.model.JpsAndroidApplicationArtifactProperties;
import org.jetbrains.jps.android.model.JpsAndroidModuleExtension;
import org.jetbrains.jps.builders.artifacts.ArtifactBuildTaskProvider;
import org.jetbrains.jps.incremental.BuildTask;
import org.jetbrains.jps.incremental.CompileContext;
import org.jetbrains.jps.incremental.ProjectBuildException;
import org.jetbrains.jps.model.JpsElement;
import org.jetbrains.jps.model.artifact.JpsArtifact;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.util.JpsPathUtil;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* @author Eugene.Kudelevsky
*/
public class AndroidArtifactBuildTaskProvider extends ArtifactBuildTaskProvider {
@NonNls private static final String BUILDER_NAME = "Android Artifact Processor";
@NotNull
@Override
public List<? extends BuildTask> createArtifactBuildTasks(@NotNull JpsArtifact artifact,
@NotNull ArtifactBuildPhase buildPhase) {
if (buildPhase != ArtifactBuildPhase.FINISHING_BUILD) {
return Collections.emptyList();
}
if (!(artifact.getArtifactType() instanceof AndroidApplicationArtifactType)) {
return Collections.emptyList();
}
final JpsElement props = artifact.getProperties();
if (!(props instanceof JpsAndroidApplicationArtifactProperties)) {
return Collections.emptyList();
}
final JpsAndroidApplicationArtifactProperties androidProps = (JpsAndroidApplicationArtifactProperties)props;
if (!(artifact.getArtifactType() instanceof AndroidApplicationArtifactType)) {
return Collections.emptyList();
}
final AndroidArtifactSigningMode signingMode = androidProps.getSigningMode();
if (signingMode != AndroidArtifactSigningMode.RELEASE_SIGNED &&
signingMode != AndroidArtifactSigningMode.DEBUG_WITH_CUSTOM_CERTIFICATE) {
return Collections.emptyList();
}
final JpsAndroidModuleExtension extension = AndroidJpsUtil.getPackagedFacet(artifact);
return extension != null
? Collections.singletonList(new MyTask(artifact, extension, androidProps))
: Collections.<BuildTask>emptyList();
}
private static class MyTask extends BuildTask {
private final JpsArtifact myArtifact;
private final JpsAndroidModuleExtension myExtension;
private final JpsAndroidApplicationArtifactProperties myProps;
private MyTask(JpsArtifact artifact,
JpsAndroidModuleExtension extension,
JpsAndroidApplicationArtifactProperties props) {
myArtifact = artifact;
myExtension = extension;
myProps = props;
}
@Override
public void build(CompileContext context) throws ProjectBuildException {
final String artifactName = myArtifact.getName();
final String entryName = "Artifact '" + artifactName + "'";
final String messagePrefix = "[" + entryName + "] ";
final JpsModule module = myExtension.getModule();
final AndroidPlatform platform = AndroidJpsUtil.getAndroidPlatform(module, context, BUILDER_NAME);
if (platform == null) {
return;
}
final String sdkLocation = platform.getSdk().getHomePath();
final String artifactFilePath = myArtifact.getOutputFilePath();
final String keyStorePath = myProps.getKeyStoreUrl() != null
? JpsPathUtil.urlToPath(myProps.getKeyStoreUrl())
: "";
final String keyStorePassword = myProps.getKeyStorePassword();
final String plainKeyStorePassword = keyStorePassword != null && keyStorePassword.length() > 0
? Base64Converter.decode(keyStorePassword) : null;
final String keyPassword = myProps.getKeyPassword();
final String plainKeyPassword = keyPassword != null && keyPassword.length() > 0
? Base64Converter.decode(keyPassword) : null;
try {
final Map<AndroidCompilerMessageKind,List<String>> messages =
AndroidCommonUtils.buildArtifact(artifactName, messagePrefix, sdkLocation, platform.getTarget(), artifactFilePath,
keyStorePath, myProps.getKeyAlias(), plainKeyStorePassword, plainKeyPassword);
AndroidJpsUtil.addMessages(context, messages, BUILDER_NAME, entryName);
}
catch (GeneralSecurityException e) {
AndroidJpsUtil.reportExceptionError(context, null, e, BUILDER_NAME);
}
catch (IOException e) {
AndroidJpsUtil.reportExceptionError(context, null, e, BUILDER_NAME);
}
}
}
}