blob: 33ddc53ddc3724f69e5c5567ca75edd14b7e0ff2 [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.ignite.compute;
import java.util.concurrent.Callable;
import org.apache.ignite.internal.util.typedef.internal.A;
import org.jetbrains.annotations.Nullable;
/**
* Convenience adapter for {@link ComputeJob} implementations. It provides the
* following functionality:
* <ul>
* <li>
* Default implementation of {@link ComputeJob#cancel()} method and ability
* to check whether cancellation occurred with {@link #isCancelled()} method.
* </li>
* <li>
* Ability to set and get job arguments via {@link #setArguments(Object...)}
* and {@link #argument(int)} methods.
* </li>
* </ul>
*/
public abstract class ComputeJobAdapter implements ComputeJob, Callable<Object> {
/** */
private static final long serialVersionUID = 0L;
/** Job argument. */
private Object[] args;
/** Cancellation flag. */
private transient volatile boolean cancelled;
/**
* No-arg constructor.
*/
protected ComputeJobAdapter() {
/* No-op. */
}
/**
* Creates job with one arguments. This constructor exists for better
* backward compatibility with internal Ignite 2.x code.
*
* @param arg Job argument.
*/
protected ComputeJobAdapter(@Nullable Object arg) {
args = new Object[]{arg};
}
/**
* Creates job with specified arguments.
*
* @param args Optional job arguments.
*/
protected ComputeJobAdapter(@Nullable Object... args) {
this.args = args;
}
/**
* Sets given arguments.
*
* @param args Optional job arguments to set.
*/
public void setArguments(@Nullable Object... args) {
this.args = args;
}
/** {@inheritDoc} */
@Override public void cancel() {
cancelled = true;
}
/**
* This method tests whether or not this job was cancelled. This method
* is thread-safe and can be called without extra synchronization.
* <p>
* This method can be periodically called in {@link ComputeJob#execute()} method
* implementation to check whether or not this job cancelled. Note that system
* calls {@link #cancel()} method only as a hint and this is a responsibility of
* the implementation of the job to properly cancel its execution.
*
* @return {@code true} if this job was cancelled, {@code false} otherwise.
*/
protected final boolean isCancelled() {
return cancelled;
}
/**
* Gets job argument.
*
* @param idx Index of the argument.
* @param <T> Type of the argument to return.
* @return Job argument.
* @throws NullPointerException Thrown in case when there no arguments set.
* @throws IllegalArgumentException Thrown if index is invalid.
*/
@Nullable public <T> T argument(int idx) {
A.notNull(args, "args");
A.ensure(idx >= 0 && idx < args.length, "idx >= 0 && idx < args.length");
return (T)args[idx];
}
/**
* Gets array of job arguments. Note that changes to this array may
* affect job execution.
*
* @return Array of job arguments.
*/
@Nullable protected Object[] arguments() {
return args;
}
/** {@inheritDoc} */
@Override public final Object call() {
return execute();
}
}