diff --git a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/AbstractLicenseMojo.java b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/AbstractLicenseMojo.java
index 780fbf0f1..20c694429 100755
--- a/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/AbstractLicenseMojo.java
+++ b/license-maven-plugin/src/main/java/com/mycila/maven/plugin/license/AbstractLicenseMojo.java
@@ -198,6 +198,18 @@ public abstract class AbstractLicenseMojo extends AbstractMojo {
@Parameter(property = "license.concurrencyFactor", defaultValue = "1.5")
public float concurrencyFactor = 1.5f;
+
+ /**
+ * Maven license plugin uses concurrency to check license headers. With this
+ * option the number of threads used to check can be specified. If given
+ * it take precedence over concurrencyFactor
+ *
+ * The default is 0 which implies that the default for concurrencyFactor
+ * is used.
+ */
+ @Parameter(property = "license.numberThreads", defaultValue = "0")
+ public int numberThreads;
+
/**
* Whether to skip the plugin execution
*/
@@ -263,7 +275,7 @@ public abstract class AbstractLicenseMojo extends AbstractMojo {
*/
@Parameter(property = "license.skipExistingHeaders", defaultValue = "false")
public boolean skipExistingHeaders = false;
-
+
@Component
public MavenProject project;
@@ -277,22 +289,22 @@ public abstract class AbstractLicenseMojo extends AbstractMojo {
*/
@Component
private SettingsDecrypter settingsDecrypter;
-
+
private ResourceFinder finder;
-
+
protected abstract class AbstractCallback implements Callback {
/**
* Related to {@link #failIfUnknown}.
*/
private final Collection unknownFiles = new ConcurrentLinkedQueue();
-
+
@Override
public void onUnknownFile(Document document, Header header) {
warn("Unknown file extension: %s", document.getFilePath());
unknownFiles.add(document.getFile());
}
-
+
public void checkUnknown() throws MojoExecutionException {
if (!unknownFiles.isEmpty()) {
String msg = "Unable to find a comment style definition for some "
@@ -303,9 +315,9 @@ public void checkUnknown() throws MojoExecutionException {
getLog().warn(msg);
}
}
-
+
}
-
+
@SuppressWarnings({"unchecked"})
public final void execute(final Callback callback) throws MojoExecutionException, MojoFailureException {
if (!skip) {
@@ -317,7 +329,7 @@ public final void execute(final Callback callback) throws MojoExecutionException
warn("Property 'strictCheck' is not enabled. Please consider adding true in your pom.xml file.");
warn("See http://mycila.github.io/license-maven-plugin for more information.");
}
-
+
finder = new ResourceFinder(basedir);
try {
finder.setCompileClassPath(project.getCompileClasspathElements());
@@ -338,7 +350,7 @@ public final void execute(final Callback callback) throws MojoExecutionException
final HeaderSource validHeaderSource = HeaderSource.of(null, validHeader, this.encoding, this.finder);
validHeaders.add(new Header(validHeaderSource, headerSections));
}
-
+
final List propertiesProviders = new LinkedList();
for (PropertiesProvider provider : ServiceLoader.load(PropertiesProvider.class, Thread.currentThread().getContextClassLoader())) {
propertiesProviders.add(provider);
@@ -347,7 +359,7 @@ public final void execute(final Callback callback) throws MojoExecutionException
@Override
public Properties load(Document document) {
Properties props = new Properties();
-
+
for (Map.Entry entry : mergeProperties(document).entrySet()) {
if (entry.getValue() != null) {
props.setProperty(entry.getKey(), entry.getValue());
@@ -375,15 +387,15 @@ public Properties load(Document document) {
return props;
}
};
-
+
final DocumentFactory documentFactory = new DocumentFactory(basedir, buildMapping(), buildHeaderDefinitions(), encoding, keywords, propertiesLoader);
- int nThreads = (int) (Runtime.getRuntime().availableProcessors() * concurrencyFactor);
+ int nThreads = getNumberOfExecutorThreads();
ExecutorService executorService = Executors.newFixedThreadPool(nThreads);
CompletionService completionService = new ExecutorCompletionService(executorService);
int count = 0;
debug("Number of execution threads: %s", nThreads);
-
+
try {
for (final String file : listSelectedFiles()) {
completionService.submit(new Runnable() {
@@ -413,7 +425,7 @@ public void run() {
}, null);
count++;
}
-
+
while (count-- > 0) {
try {
completionService.take().get();
@@ -436,13 +448,25 @@ public void run() {
throw new RuntimeException(cause.getMessage(), cause);
}
}
-
+
} finally {
executorService.shutdownNow();
}
}
}
-
+
+ private int getNumberOfExecutorThreads() {
+ int nThreads = numberThreads;
+ if (nThreads != 0) {
+ return nThreads;
+ }
+ nThreads = (int) (Runtime.getRuntime().availableProcessors() * concurrencyFactor);
+ if (nThreads != 0) {
+ return nThreads;
+ }
+ return 1;
+ }
+
private Map mergeProperties(Document document) {
// first put systen environment
Map props = new LinkedHashMap(System.getenv());
@@ -466,7 +490,7 @@ private Map mergeProperties(Document document) {
}
return props;
}
-
+
private String[] listSelectedFiles() {
Selection selection = new Selection(basedir, includes, buildExcludes(), useDefaultExcludes);
debug("From: %s", basedir);
@@ -474,7 +498,7 @@ private String[] listSelectedFiles() {
debug("Excluding: %s", deepToString(selection.getExcluded()));
return selection.getSelectedFiles();
}
-
+
private String[] buildExcludes() {
List ex = new ArrayList();
ex.addAll(asList(this.excludes));
@@ -485,25 +509,25 @@ private String[] buildExcludes() {
}
return ex.toArray(new String[ex.size()]);
}
-
+
public final void info(String format, Object... params) {
if (!quiet) {
getLog().info(format(format, params));
}
}
-
+
public final void debug(String format, Object... params) {
if (!quiet) {
getLog().debug(format(format, params));
}
}
-
+
public final void warn(String format, Object... params) {
if (!quiet) {
getLog().warn(format(format, params));
}
}
-
+
private Map buildMapping() {
Map extensionMapping = new LinkedHashMap();
// force inclusion of unknow item to manage unknown files
@@ -520,7 +544,7 @@ private Map buildMapping() {
}
return extensionMapping;
}
-
+
private Map buildHeaderDefinitions() throws MojoFailureException {
// like mappings, first get default definitions
final Map headers = new HashMap(HeaderType.defaultDefinitions());
@@ -563,18 +587,18 @@ List getDecryptedServers() {
*/
public Credentials findCredentials(String serverID) {
List decryptedServers = getDecryptedServers();
-
+
for (Server ds : decryptedServers) {
if (ds.getId().equals(serverID)) {
getLog().debug("credentials have been found for server: " + serverID + ", login:" + ds.getUsername() + ", password:" + starEncrypt(ds.getPassword()));
return new Credentials(ds.getUsername(), ds.getPassword());
}
}
-
+
getLog().debug("no credentials found for server: " + serverID);
return null;
}
-
+
static String starEncrypt(String str) {
if (str == null) {
return null;