package org.jetbrains.jps.android; import com.android.tools.idea.jps.AndroidTargetBuilder; import com.intellij.util.ArrayUtil; import com.intellij.util.containers.HashSet; import org.jetbrains.android.util.AndroidBuildTestingManager; import org.jetbrains.android.util.AndroidCommonUtils; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.ProjectPaths; import org.jetbrains.jps.android.builder.AndroidLibraryPackagingTarget; import org.jetbrains.jps.android.model.JpsAndroidModuleExtension; import org.jetbrains.jps.builders.BuildOutputConsumer; import org.jetbrains.jps.builders.BuildRootDescriptor; import org.jetbrains.jps.builders.DirtyFilesHolder; import org.jetbrains.jps.incremental.CompileContext; import org.jetbrains.jps.incremental.ProjectBuildException; import org.jetbrains.jps.incremental.StopBuildException; import org.jetbrains.jps.incremental.TargetBuilder; import org.jetbrains.jps.incremental.messages.ProgressMessage; import org.jetbrains.jps.model.module.JpsModule; import java.io.File; import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Set; /** * @author Eugene.Kudelevsky */ public class AndroidLibraryPackagingBuilder extends AndroidTargetBuilder<BuildRootDescriptor, AndroidLibraryPackagingTarget> { @NonNls private static final String BUILDER_NAME = "Android Library Packaging"; protected AndroidLibraryPackagingBuilder() { super(Collections.singletonList(AndroidLibraryPackagingTarget.MyTargetType.INSTANCE)); } @Override protected void buildTarget(@NotNull AndroidLibraryPackagingTarget target, @NotNull DirtyFilesHolder<BuildRootDescriptor, AndroidLibraryPackagingTarget> holder, @NotNull BuildOutputConsumer outputConsumer, @NotNull CompileContext context) throws ProjectBuildException, IOException { if (!holder.hasDirtyFiles() && !holder.hasRemovedFiles()) { return; } assert !AndroidJpsUtil.isLightBuild(context); if (!doBuild(context, target.getModule(), outputConsumer)) { throw new StopBuildException(); } } private static boolean doBuild(CompileContext context, JpsModule module, BuildOutputConsumer outputConsumer) throws IOException { final JpsAndroidModuleExtension extension = AndroidJpsUtil.getExtension(module); if (extension == null || !extension.isLibrary()) { return true; } File outputDir = AndroidJpsUtil.getDirectoryForIntermediateArtifacts(context, module); outputDir = AndroidJpsUtil.createDirIfNotExist(outputDir, context, BUILDER_NAME); if (outputDir == null) { return false; } final File classesDir = ProjectPaths.getModuleOutputDir(module, false); if (classesDir == null || !classesDir.isDirectory()) { return true; } final Set<String> subdirs = new HashSet<String>(); AndroidJpsUtil.addSubdirectories(classesDir, subdirs); if (subdirs.size() > 0) { context.processMessage(new ProgressMessage(AndroidJpsBundle.message("android.jps.progress.library.packaging", module.getName()))); final File outputJarFile = new File(outputDir, AndroidCommonUtils.CLASSES_JAR_FILE_NAME); final List<String> srcFiles; try { srcFiles = AndroidCommonUtils.packClassFilesIntoJar(ArrayUtil.EMPTY_STRING_ARRAY, ArrayUtil.toStringArray(subdirs), outputJarFile); } catch (IOException e) { AndroidJpsUtil.reportExceptionError(context, null, e, BUILDER_NAME); return false; } final AndroidBuildTestingManager testingManager = AndroidBuildTestingManager.getTestingManager(); if (testingManager != null && outputJarFile.isFile()) { testingManager.getCommandExecutor().checkJarContent("library_package_jar", outputJarFile.getPath()); } if (srcFiles.size() > 0) { outputConsumer.registerOutputFile(outputJarFile, srcFiles); } } return true; } @NotNull @Override public String getPresentableName() { return BUILDER_NAME; } }