/*
* 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.user;
import java.io.File;
import java.util.List;
import org.gradle.api.Action;
import org.gradle.api.NamedDomainObjectFactory;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.file.FileCollection;
import org.gradle.api.tasks.bundling.Jar;
import com.google.common.base.Preconditions;
import com.google.common.collect.Lists;
import groovy.lang.Closure;
import net.minecraftforge.gradle.common.Constants;
import net.minecraftforge.gradle.util.GradleConfigurationException;
public class ReobfTaskFactory implements NamedDomainObjectFactory<IReobfuscator>
{
private final UserBasePlugin<?> plugin;
public ReobfTaskFactory(UserBasePlugin<?> plugin)
{
this.plugin = plugin;
}
@SuppressWarnings("serial")
@Override
public IReobfuscator create(final String jarName)
{
String name = "reobf" + Character.toUpperCase(jarName.charAt(0)) + jarName.substring(1);
final TaskSingleReobf task = plugin.maybeMakeTask(name, TaskSingleReobf.class);
task.dependsOn(Constants.TASK_GENERATE_SRGS, jarName);
task.mustRunAfter("test");
task.setJar(new Closure<File>(null) {
public File call()
{
return ((Jar) plugin.project.getTasks().getByName(jarName)).getArchivePath();
}
});
plugin.project.getTasks().getByName("assemble").dependsOn(task);
ReobfTaskWrapper wrapper = new ReobfTaskWrapper(jarName, task);
plugin.setupReobf(wrapper);
// do after-Evaluate resolution, for the same of good error reporting
plugin.project.afterEvaluate(new Action<Project>() {
@Override
public void execute(Project arg0)
{
Task jar = plugin.project.getTasks().getByName(jarName);
if (!(jar instanceof Jar))
{
throw new GradleConfigurationException(jarName + " is not a jar task. Can only reobf jars!");
}
}
});
return wrapper;
}
public class ReobfTaskWrapper implements IReobfuscator
{
private final String name;
private final TaskSingleReobf reobf;
private ReobfMappingType mappingType;
public ReobfTaskWrapper(String name, TaskSingleReobf reobf)
{
this.name = name;
this.reobf = reobf;
}
public String getName()
{
return name;
}
/**
* Returns the instance of {@link TaskSingleReobf} that this object
* wraps.
*
* @return The task
*/
public TaskSingleReobf getTask()
{
return reobf;
}
@Override
public boolean equals(Object obj)
{
if (obj instanceof ReobfTaskWrapper)
{
return name.equals(((ReobfTaskWrapper) obj).name);
}
return false;
}
@Override
public File getMappings()
{
return reobf.getPrimarySrg();
}
@Override
public void setMappings(Object srg)
{
mappingType = ReobfMappingType.CUSTOM;
reobf.setPrimarySrg(srg);
}
@Override
public void setMappingType(ReobfMappingType type)
{
Preconditions.checkNotNull(type, "Mapping type cannot be null. Use setMappings() to use custom mappings.");
Preconditions.checkArgument(type != ReobfMappingType.CUSTOM,
"Cannot set a Custom mapping type. Use setMappings() instead.");
mappingType = type;
reobf.setPrimarySrg(plugin.delayedFile(type.getPath()));
}
@Override
public ReobfMappingType getMappingType()
{
return this.mappingType;
}
@Override
public void setClasspath(FileCollection classpath)
{
reobf.setClasspath(classpath);
}
@Override
public FileCollection getClasspath()
{
return reobf.getClasspath();
}
@Override
public void setExtraLines(List<Object> extra)
{
reobf.getExtraSrgLines().clear();
extraLines(extra);
}
@Override
public List<Object> getExtraLines()
{
List<Object> list = Lists.newArrayList();
list.addAll(reobf.getExtraSrgLines());
return list;
}
@Override
public void extraLines(Iterable<Object> o)
{
for (Object obj : o)
{
reobf.addExtraSrgLine(Constants.resolveString(obj));
}
}
@Override
public void extraLines(Object... o)
{
for (Object obj : o)
{
reobf.addExtraSrgLine(Constants.resolveString(obj));
}
}
@Override
public List<Object> getExtraFiles()
{
List<Object> list = Lists.newArrayList();
list.addAll(reobf.getSecondarySrgFiles().getFiles());
return list;
}
@Override
public void extraFiles(Iterable<Object> o)
{
for (Object obj : o)
{
reobf.addSecondarySrgFile(obj);
}
}
@Override
public void extraFiles(Object... o)
{
for (Object obj : o)
{
reobf.addSecondarySrgFile(obj);
}
}
@Deprecated
@Override
public void useSrgSrg()
{
setMappingType(ReobfMappingType.SEARGE);
warnDeprecation("useSrgSrg()", "mappingType");
}
@Deprecated
@Override
public void useNotchSrg()
{
setMappingType(ReobfMappingType.NOTCH);
warnDeprecation("useNotchSrg()", "mappingType");
}
private void warnDeprecation(String old, String new_)
{
plugin.project.getLogger().warn("Warning, {} is deprecated! You should use {} instead.", old, new_);
}
}
}