blob: fc7f211d9a67ca5187c9e380f48bec0ef019ed0e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.batchee.tools.maven;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import javax.batch.operations.JobOperator;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* Start a job.
*/
@Mojo(name = "start", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME)
public class StartMojo extends JobActionMojoBase {
/**
* the job name of the job to start
*/
@Parameter(required = true, property = "batchee.job")
protected String jobName;
/**
* used to find project binaries if running the batch locally
*/
@Parameter(defaultValue = "${project.build.outputDirectory}", required = true, readonly = true )
protected File projectBinaries;
/**
* used to find project dependencies if running the batch locally
*/
@Parameter(defaultValue = "${project.artifacts}", readonly = true, required = true)
protected Set<Artifact> dependencies;
/**
* if the project (binaries + dependencies) should be added during the execution to the classpath
*/
@Parameter(property = "batchee.use-project", defaultValue = "true")
protected boolean useProjectClasspath;
/**
* manual entries added in the execution classpath
*/
@Parameter
protected List<String> additionalClasspathEntries;
@Override
public void execute() throws MojoExecutionException {
final JobOperator jobOperator = getOrCreateOperator();
final ClassLoader oldLoader = Thread.currentThread().getContextClassLoader();
final ClassLoader loader = createStartLoader(oldLoader);
Thread.currentThread().setContextClassLoader(loader);
final long id;
try {
id = jobOperator.start(jobName, toProperties(jobParameters));
} finally {
Thread.currentThread().setContextClassLoader(oldLoader);
}
getLog().info("Started job " + jobName + ", id is #" + id);
if (wait) {
waitEnd(jobOperator, id);
}
}
private ClassLoader createStartLoader(final ClassLoader parent) throws MojoExecutionException {
final Collection<URL> urls = new LinkedList<URL>();
if (useProjectClasspath) {
if (projectBinaries != null && projectBinaries.exists()) {
try {
urls.add(projectBinaries.toURI().toURL());
} catch (final MalformedURLException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
if (dependencies != null) {
for (final Artifact dependency : dependencies) {
try {
urls.add(dependency.getFile().toURI().toURL());
} catch (final MalformedURLException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
}
}
if (additionalClasspathEntries != null) {
for (final String entry : additionalClasspathEntries) {
try {
final File file = new File(entry);
if (file.exists()) {
urls.add(file.toURI().toURL());
}
} catch (final MalformedURLException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
}
return new URLClassLoader(urls.toArray(new URL[urls.size()]), parent);
}
}