/* * A Gradle plugin for the creation of Minecraft mods and MinecraftForge plugins. * Copyright (C) 2013 Minecraft Forge * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 * USA */ package net.minecraftforge.gradle.tasks; import groovy.lang.Closure; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.Set; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import net.minecraftforge.gradle.util.caching.Cached; import net.minecraftforge.gradle.util.caching.CachedTask; import org.gradle.api.file.FileTreeElement; import org.gradle.api.file.FileVisitDetails; import org.gradle.api.file.FileVisitor; import org.gradle.api.specs.Spec; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputFile; import org.gradle.api.tasks.OutputFile; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.util.PatternFilterable; import org.gradle.api.tasks.util.PatternSet; import com.google.common.base.Throwables; public class SplitJarTask extends CachedTask implements PatternFilterable { @InputFile private Object inJar; @Input private PatternSet pattern = new PatternSet(); @Cached @OutputFile private Object outFirst; @Cached @OutputFile private Object outSecond; @TaskAction public void doTask() throws IOException { // get the spec final Spec<FileTreeElement> spec = pattern.getAsSpec(); File input = getInJar(); File out1 = getOutFirst(); File out2 = getOutSecond(); out1.getParentFile().mkdirs(); out2.getParentFile().mkdirs(); // begin reading jar final JarOutputStream zout1 = new JarOutputStream(new FileOutputStream(out1)); final JarOutputStream zout2 = new JarOutputStream(new FileOutputStream(out2)); getProject().zipTree(input).visit(new FileVisitor() { @Override public void visitDir(FileVisitDetails details) { // ignore directories } @Override public void visitFile(FileVisitDetails details) { JarEntry entry = new JarEntry(details.getPath()); entry.setSize(details.getSize()); entry.setTime(details.getLastModified()); try { if (spec.isSatisfiedBy(details)) { zout1.putNextEntry(entry); details.copyTo(zout1); zout1.closeEntry(); } else { zout2.putNextEntry(entry); details.copyTo(zout2); zout2.closeEntry(); } } catch (IOException e) { Throwables.propagate(e); } } }); zout1.close(); zout2.close(); } public File getInJar() { return getProject().file(inJar); } public void setInJar(Object inJar) { this.inJar = inJar; } public File getOutFirst() { return getProject().file(outFirst); } public void setOutFirst(Object outFirst) { this.outFirst = outFirst; } public File getOutSecond() { return getProject().file(outSecond); } public void setOutSecond(Object outSecond) { this.outSecond = outSecond; } @Override public PatternFilterable exclude(String... arg0) { return pattern.exclude(arg0); } @Override public PatternFilterable exclude(Iterable<String> arg0) { return pattern.exclude(arg0); } @Override public PatternFilterable exclude(Spec<FileTreeElement> arg0) { return pattern.exclude(arg0); } @Override @SuppressWarnings("rawtypes") public PatternFilterable exclude(Closure arg0) { return pattern.exclude(arg0); } @Override public Set<String> getExcludes() { return pattern.getExcludes(); } @Override public Set<String> getIncludes() { return pattern.getIncludes(); } @Override public PatternFilterable include(String... arg0) { return pattern.include(arg0); } @Override public PatternFilterable include(Iterable<String> arg0) { return pattern.include(arg0); } @Override public PatternFilterable include(Spec<FileTreeElement> arg0) { return pattern.include(arg0); } @Override @SuppressWarnings("rawtypes") public PatternFilterable include(Closure arg0) { return pattern.include(arg0); } @Override public PatternFilterable setExcludes(Iterable<String> arg0) { return pattern.setExcludes(arg0); } @Override public PatternFilterable setIncludes(Iterable<String> arg0) { return pattern.setIncludes(arg0); } }