/*
* Copyright (c) 2015 Red Hat, Inc. and/or its affiliates.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Cheng Fang - Initial API and implementation
*/
package org.jberet.rest.resource;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.batch.operations.JobExecutionAlreadyCompleteException;
import javax.batch.operations.JobExecutionIsRunningException;
import javax.batch.operations.JobExecutionNotMostRecentException;
import javax.batch.operations.JobExecutionNotRunningException;
import javax.batch.operations.JobOperator;
import javax.batch.operations.JobRestartException;
import javax.batch.operations.JobSecurityException;
import javax.batch.operations.JobStartException;
import javax.batch.operations.NoSuchJobException;
import javax.batch.operations.NoSuchJobExecutionException;
import javax.batch.operations.NoSuchJobInstanceException;
import javax.batch.runtime.BatchRuntime;
import javax.batch.runtime.JobExecution;
import javax.batch.runtime.JobInstance;
import javax.batch.runtime.StepExecution;
import org.jberet.rest.entity.JobEntity;
import org.jberet.rest.entity.JobExecutionEntity;
import org.jberet.rest.entity.JobInstanceEntity;
import org.jberet.rest.entity.StepExecutionEntity;
/**
* Facade class to {@code JobOperator} interface.
*
* @since 1.3.0
*/
final class JobService {
private static final JobService instance = new JobService();
private final JobOperator jobOperator;
private JobService() {
jobOperator = BatchRuntime.getJobOperator();
}
static JobService getInstance() {
return instance;
}
JobExecutionEntity start(final String jobXmlName, final Properties jobParameters)
throws JobStartException, JobSecurityException, NoSuchJobExecutionException {
long jobExecutionId = jobOperator.start(jobXmlName, jobParameters);
return new JobExecutionEntity(jobOperator.getJobExecution(jobExecutionId),
jobOperator.getJobInstance(jobExecutionId).getInstanceId());
}
JobEntity[] getJobs() throws JobSecurityException {
final Set<String> jobNames = jobOperator.getJobNames();
final JobEntity[] result = new JobEntity[jobNames.size()];
int i = 0;
for (final String jobName : jobNames) {
final int jobInstanceCount = jobOperator.getJobInstanceCount(jobName);
final List<Long> runningExecutions = jobOperator.getRunningExecutions(jobName);
final JobEntity je = new JobEntity(jobName, jobInstanceCount, runningExecutions.size());
result[i++] = je;
}
return result;
}
JobInstanceEntity[] getJobInstances(final String jobName, final int start, final int count)
throws NoSuchJobException, JobSecurityException {
final List<JobInstance> jobInstances = jobOperator.getJobInstances(jobName, start, count);
final int len = jobInstances.size();
final JobInstanceEntity[] jobInstanceData = new JobInstanceEntity[len];
for (int i = 0; i < len; i++) {
final JobInstance e = jobInstances.get(i);
jobInstanceData[i] = new JobInstanceEntity(e, jobOperator.getJobExecutions(e));
}
return jobInstanceData;
}
public JobInstanceEntity getJobInstance(final long executionId) throws NoSuchJobExecutionException, JobSecurityException {
final JobInstance jobInstance = jobOperator.getJobInstance(executionId);
return new JobInstanceEntity(jobInstance, jobOperator.getJobExecutions(jobInstance));
}
int getJobInstanceCount(final String jobName) throws NoSuchJobException, JobSecurityException {
return jobOperator.getJobInstanceCount(jobName);
}
JobExecutionEntity getJobExecution(final long jobExecutionId) throws NoSuchJobExecutionException, JobSecurityException {
final JobExecution jobExecution = jobOperator.getJobExecution(jobExecutionId);
return new JobExecutionEntity(jobExecution, jobOperator.getJobInstance(jobExecutionId).getInstanceId());
}
public JobExecutionEntity[] getJobExecutions(int count, final long jobInstanceId, final long jobExecutionId1)
throws NoSuchJobInstanceException, JobSecurityException {
//pass null JobInstance to get ALL job executions
JobInstance jobInstance = null;
if (jobExecutionId1 > 0) {
jobInstance = jobOperator.getJobInstance(jobExecutionId1);
}
final List<JobExecution> jobExecutions = jobOperator.getJobExecutions(jobInstance);
final int countAll = jobExecutions.size();
if (count <= 0) {
count = countAll;
}
final JobExecutionEntity[] jobExecutionEntities = new JobExecutionEntity[count];
for (int i = countAll - 1, j = 0; j < count && i >= 0; i--, j++) {
final JobExecution e = jobExecutions.get(i);
jobExecutionEntities[j] = new JobExecutionEntity(e,
jobOperator.getJobInstance(e.getExecutionId()).getInstanceId());
}
return jobExecutionEntities;
}
void abandon(final long jobExecutionId)
throws NoSuchJobExecutionException, JobExecutionIsRunningException, JobSecurityException {
jobOperator.abandon(jobExecutionId);
}
void stop(final long jobExecutionId)
throws NoSuchJobExecutionException, JobExecutionNotRunningException, JobSecurityException {
jobOperator.stop(jobExecutionId);
}
JobExecutionEntity restart(final long jobExecutionId, final Properties restartParameters)
throws JobExecutionAlreadyCompleteException, NoSuchJobExecutionException, JobExecutionNotMostRecentException,
JobRestartException, JobSecurityException {
final long restartExecutionId = jobOperator.restart(jobExecutionId, restartParameters);
return new JobExecutionEntity(jobOperator.getJobExecution(restartExecutionId),
jobOperator.getJobInstance(restartExecutionId).getInstanceId());
}
JobExecutionEntity[] getRunningExecutions(final String jobName) throws NoSuchJobException, JobSecurityException {
final List<Long> executionIds = jobOperator.getRunningExecutions(jobName);
final int len = executionIds.size();
JobExecutionEntity[] runningExecutions = new JobExecutionEntity[len];
for (int i = len - 1; i >= 0; i--) {
final long e = executionIds.get(i);
runningExecutions[len - 1 - i] = new JobExecutionEntity(jobOperator.getJobExecution(e),
jobOperator.getJobInstance(e).getInstanceId());
}
return runningExecutions;
}
StepExecutionEntity[] getStepExecutions(final long jobExecutionId) throws NoSuchJobExecutionException, JobSecurityException {
final List<StepExecution> stepExecutions = jobOperator.getStepExecutions(jobExecutionId);
final int len = stepExecutions.size();
final StepExecutionEntity[] stepExecutionData = new StepExecutionEntity[len];
for (int i = 0; i < len; i++) {
stepExecutionData[i] = new StepExecutionEntity(stepExecutions.get(i));
}
return stepExecutionData;
}
}