/*
* Copyright 2015 Red Hat, Inc.
*
* Licensed 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.wildfly.extension.batch.jberet.job.repository;
import java.util.List;
import java.util.Properties;
import java.util.Set;
import javax.batch.runtime.JobExecution;
import javax.batch.runtime.JobInstance;
import javax.batch.runtime.StepExecution;
import org.jberet.job.model.Job;
import org.jberet.repository.ApplicationAndJobName;
import org.jberet.repository.JobExecutionSelector;
import org.jberet.repository.JobRepository;
import org.jberet.runtime.AbstractStepExecution;
import org.jberet.runtime.JobExecutionImpl;
import org.jberet.runtime.JobInstanceImpl;
import org.jberet.runtime.PartitionExecutionImpl;
import org.jberet.runtime.StepExecutionImpl;
import org.jboss.msc.service.Service;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;
import org.wildfly.extension.batch.jberet._private.BatchLogger;
/**
* An abstract service which delegates to a {@link JobRepository} throwing an {@link IllegalStateException} if the
* service has been stopped.
*
* @author <a href="mailto:jperkins@redhat.com">James R. Perkins</a>
*/
abstract class JobRepositoryService implements JobRepository, Service<JobRepository> {
private volatile boolean started;
@Override
public final void start(final StartContext context) throws StartException {
startJobRepository(context);
started = true;
}
@Override
public final void stop(final StopContext context) {
stopJobRepository(context);
started = false;
}
@Override
public final JobRepository getValue() throws IllegalStateException, IllegalArgumentException {
return this;
}
@Override
public void addJob(final ApplicationAndJobName applicationAndJobName, final Job job) {
getAndCheckDelegate().addJob(applicationAndJobName, job);
}
@Override
public void removeJob(final String jobId) {
getAndCheckDelegate().removeJob(jobId);
}
@Override
public Job getJob(final ApplicationAndJobName applicationAndJobName) {
return getAndCheckDelegate().getJob(applicationAndJobName);
}
@Override
public Set<String> getJobNames() {
return getAndCheckDelegate().getJobNames();
}
@Override
public boolean jobExists(final String jobName) {
return getAndCheckDelegate().jobExists(jobName);
}
@Override
public JobInstanceImpl createJobInstance(final Job job, final String applicationName, final ClassLoader classLoader) {
return getAndCheckDelegate().createJobInstance(job, applicationName, classLoader);
}
@Override
public void removeJobInstance(final long jobInstanceId) {
getAndCheckDelegate().removeJobInstance(jobInstanceId);
}
@Override
public JobInstance getJobInstance(final long jobInstanceId) {
return getAndCheckDelegate().getJobInstance(jobInstanceId);
}
@Override
public List<JobInstance> getJobInstances(final String jobName) {
return getAndCheckDelegate().getJobInstances(jobName);
}
@Override
public int getJobInstanceCount(final String jobName) {
return getAndCheckDelegate().getJobInstanceCount(jobName);
}
@Override
public JobExecutionImpl createJobExecution(final JobInstanceImpl jobInstance, final Properties jobParameters) {
return getAndCheckDelegate().createJobExecution(jobInstance, jobParameters);
}
@Override
public JobExecution getJobExecution(final long jobExecutionId) {
return getAndCheckDelegate().getJobExecution(jobExecutionId);
}
@Override
public List<JobExecution> getJobExecutions(final JobInstance jobInstance) {
return getAndCheckDelegate().getJobExecutions(jobInstance);
}
@Override
public void updateJobExecution(final JobExecutionImpl jobExecution, final boolean fullUpdate, final boolean saveJobParameters) {
getAndCheckDelegate().updateJobExecution(jobExecution, fullUpdate, saveJobParameters);
}
@Override
public List<Long> getRunningExecutions(final String jobName) {
return getAndCheckDelegate().getRunningExecutions(jobName);
}
@Override
public void removeJobExecutions(final JobExecutionSelector jobExecutionSelector) {
getAndCheckDelegate().removeJobExecutions(jobExecutionSelector);
}
@Override
public List<StepExecution> getStepExecutions(final long jobExecutionId, final ClassLoader classLoader) {
return getAndCheckDelegate().getStepExecutions(jobExecutionId, classLoader);
}
@Override
public StepExecutionImpl createStepExecution(final String stepName) {
return getAndCheckDelegate().createStepExecution(stepName);
}
@Override
public void addStepExecution(final JobExecutionImpl jobExecution, final StepExecutionImpl stepExecution) {
getAndCheckDelegate().addStepExecution(jobExecution, stepExecution);
}
@Override
public void updateStepExecution(final StepExecution stepExecution) {
getAndCheckDelegate().updateStepExecution(stepExecution);
}
@Override
public StepExecutionImpl findOriginalStepExecutionForRestart(final String stepName, final JobExecutionImpl jobExecutionToRestart, final ClassLoader classLoader) {
return getAndCheckDelegate().findOriginalStepExecutionForRestart(stepName, jobExecutionToRestart, classLoader);
}
@Override
public int countStepStartTimes(final String stepName, final long jobInstanceId) {
return getAndCheckDelegate().countStepStartTimes(stepName, jobInstanceId);
}
@Override
public void addPartitionExecution(final StepExecutionImpl enclosingStepExecution, final PartitionExecutionImpl partitionExecution) {
getAndCheckDelegate().addPartitionExecution(enclosingStepExecution, partitionExecution);
}
@Override
public List<PartitionExecutionImpl> getPartitionExecutions(final long stepExecutionId, final StepExecutionImpl stepExecution, final boolean notCompletedOnly, final ClassLoader classLoader) {
return getAndCheckDelegate().getPartitionExecutions(stepExecutionId, stepExecution, notCompletedOnly, classLoader);
}
@Override
public void savePersistentData(final JobExecution jobExecution, final AbstractStepExecution stepOrPartitionExecution) {
getAndCheckDelegate().savePersistentData(jobExecution, stepOrPartitionExecution);
}
protected abstract void startJobRepository(StartContext context) throws StartException;
protected abstract void stopJobRepository(StopContext context);
protected abstract JobRepository getDelegate();
private JobRepository getAndCheckDelegate() {
final JobRepository delegate = getDelegate();
if (started && delegate != null) {
return delegate;
}
throw BatchLogger.LOGGER.jobOperatorServiceStopped();
}
}