/* * 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. */ @SuppressWarnings("unchecked") @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 Object[] arguments() { return args; } /** {@inheritDoc} */ @Override public final Object call() { return execute(); } }