/*
* MicroJIAC - A Lightweight Agent Framework
* This file is part of MicroJIAC MIDlet-Maven-Plugin.
*
* Copyright (c) 2007-2012 DAI-Labor, Technische Universität Berlin
*
* This library includes software developed at DAI-Labor, Technische
* Universität Berlin (http://www.dai-labor.de)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>
*/
/*
* $Id$
*/
package de.jiac.micro.mojo;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;
import org.apache.maven.plugin.MojoExecutionException;
import org.codehaus.plexus.util.FileUtils;
import proguard.Configuration;
import proguard.ConfigurationParser;
import proguard.ProGuard;
import de.jiac.micro.config.generator.AbstractConfiguration;
import de.jiac.micro.config.generator.NodeConfiguration;
import de.jiac.micro.util.FileNameUtil;
/**
* Reduces the size of class files. <a href="http://proguard.sourceforge.net/">ProGuard</a> is
* needed so that this mojo can do its task.
*
* @goal proguard
* @requiresDependencyResolution compile
* @description Reduces the size of class files and removes unused classes.
*
* @author Marcel Patzlaff
* @version $Revision$
*/
public class ProGuardMojo extends AbstractPackagingMojo {
/**
* This parameter indicates whether obfuscation should be started or not.
*
* @parameter default-value="true"
*/
private boolean obfuscate;
/**
* Indicates whether all versions of the jars should be kept for
* comparison purposes.
*
* @parameter default-value="false"
*/
private boolean keepJars;
/**
* Further configuration to be used by ProGuard
*
* @parameter
* @optional
*/
private File additionalObfuscationSettings= null;
/**
* The path to the native preverifier command.
*
* @parameter
* @optional
*/
private File preverifyPath= null;
public void execute() throws MojoExecutionException {
AbstractConfiguration[] configurations= (AbstractConfiguration[]) getPluginContext().get(ConfiguratorMojo.GENERATED_CONFIGURATIONS_KEY);
for(AbstractConfiguration configuration : configurations) {
if(!(configuration instanceof NodeConfiguration)) {
continue;
}
String classifier= configuration.className.substring(configuration.className.lastIndexOf('.') + 1);
File jar = checkJarFile(classifier);
File copyJar = getJarFile(classifier + "-before_obfuscation");
try {
FileUtils.copyFile(jar, copyJar);
} catch (IOException ioe) {
throw new MojoExecutionException("could not copy jar '" + jar.getAbsolutePath() + "'", ioe);
}
jar.delete();
String libraryPath = getClassPath(getProject());
String inJars = FileNameUtil.getAbsolutPath(copyJar);
String outJars = FileNameUtil.getAbsolutPath(jar);
File mappingFile = new File(jar.getParent(), classifier + "-mappings.txt");
// first merge all options
List<String> mergeList= new LinkedList<String>();
mergeList.add("-keep public class " + configuration.className);
for(String agentConfigurationName : ((NodeConfiguration) configuration).fullQualifiedAgentConfigurationNames) {
mergeList.add("-keep public class " + agentConfigurationName);
}
if(!obfuscate) {
getLog().info("obfuscation and optimisation is skipped");
mergeList.add("-dontshrink");
mergeList.add("-dontoptimize");
mergeList.add("-dontobfuscate");
}
if(preverifyPath == null) {
getLog().info("use ProGuard preverifier");
mergeList.add("-microedition");
}
if(additionalObfuscationSettings != null) {
mergeList.add("@" + FileNameUtil.getAbsolutPath(additionalObfuscationSettings));
}
mergeList.add("-injars");
mergeList.add(inJars);
mergeList.add("-outjars");
mergeList.add(outJars);
if(libraryPath.length() > 0) {
mergeList.add("-libraryjars");
mergeList.add(libraryPath);
}
mergeList.add("-printmapping");
mergeList.add(FileNameUtil.getAbsolutPath(mappingFile));
Configuration proguardConfiguration;
try {
getLog().info("load and merge obfuscation settings");
proguardConfiguration= loadAndMergeConfigurations(mergeList.toArray(new String[mergeList.size()]));
} catch (Exception e) {
throw new MojoExecutionException("could not merge obfuscation settings", e);
}
try {
getLog().info("start ProGuard");
new ProGuard(proguardConfiguration).execute();
getLog().info("ProGuard finished");
} catch (IOException ioe) {
throw new MojoExecutionException("could not execute obfuscator", ioe);
}
if (!keepJars) {
copyJar.delete();
}
}
}
private Configuration loadAndMergeConfigurations(String[] options) throws Exception {
// load default settings
URL url= getClass().getClassLoader().getResource("proguard/default-4.3.pro");
ConfigurationParser parser= new ConfigurationParser(url);
Configuration configuration= new Configuration();
parser.parse(configuration);
// load additional settings
parser= new ConfigurationParser(options);
parser.parse(configuration);
return configuration;
}
}