package io.eguan.dtx;
/*
* #%L
* Project eguan
* %%
* Copyright (C) 2012 - 2017 Oodrive
* %%
* 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.
* #L%
*/
import java.util.UUID;
import javax.annotation.Nonnull;
/**
* Utility class for the implementation of {@link DtxTaskApi}.
*
* @author oodrive
* @author ebredzinski
* @author llambert
*
*/
public abstract class DtxTaskApiAbstract implements DtxTaskApi {
/**
* Parameters for the task Keeper.
*
*
*/
public static final class TaskKeeperParameters {
private final long absoluteDuration;
private final int absoluteSize;
private final long maxDuration;
private final int maxSize;
private final long period;
private final long delay;
public TaskKeeperParameters(final long absoluteDuration, final int absoluteSize, final long maxDuration,
final int maxSize, final long period, final long delay) {
super();
this.absoluteDuration = absoluteDuration;
this.absoluteSize = absoluteSize;
this.maxDuration = maxDuration;
this.maxSize = maxSize;
this.period = period;
this.delay = delay;
}
public final long getAbsoluteDuration() {
return absoluteDuration;
}
public final int getAbsoluteSize() {
return absoluteSize;
}
public final long getMaxDuration() {
return maxDuration;
}
public final int getMaxSize() {
return maxSize;
}
public final long getPeriod() {
return period;
}
public final long getDelay() {
return delay;
}
@Override
public final int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + (int) (absoluteDuration ^ (absoluteDuration >>> 32));
result = prime * result + absoluteSize;
result = prime * result + (int) (delay ^ (delay >>> 32));
result = prime * result + (int) (maxDuration ^ (maxDuration >>> 32));
result = prime * result + maxSize;
result = prime * result + (int) (period ^ (period >>> 32));
return result;
}
@Override
public final boolean equals(final Object obj) {
if (this == obj)
return true;
if (!(obj instanceof TaskKeeperParameters))
return false;
final TaskKeeperParameters other = (TaskKeeperParameters) obj;
if (absoluteDuration != other.absoluteDuration)
return false;
if (absoluteSize != other.absoluteSize)
return false;
if (delay != other.delay)
return false;
if (maxDuration != other.maxDuration)
return false;
if (maxSize != other.maxSize)
return false;
return period != other.period;
}
}
/**
* Utility class to get all the parameters if a given task.
*
*
*/
public static final class TaskLoader {
private final DtxTaskAdm dtxTaskAdm;
private final DtxTaskInfo info;
public TaskLoader(final DtxTaskAdm dtxTaskAdm, final DtxTaskInfo info) {
this.dtxTaskAdm = dtxTaskAdm;
this.info = info;
}
public final DtxTaskAdm getDtxTaskAdm() {
return dtxTaskAdm;
}
public final DtxTaskInfo getInfo() {
return info;
}
public static TaskLoader createUnknownTask(final UUID taskId) {
return new TaskLoader(new DtxTaskAdm(taskId, null, null, null, DtxTaskStatus.UNKNOWN), null);
}
}
private final TaskKeeper taskKeeper;
private final DtxTaskInternal taskInternal;
protected DtxTaskApiAbstract(final TaskKeeperParameters parameters) {
this.taskKeeper = new TaskKeeper(parameters);
this.taskInternal = new DtxTaskInternal() {
@Override
public final void startPurgeTaskKeeper() {
taskKeeper.startPurge();
}
@Override
public final void stopPurgeTaskKeeper() {
taskKeeper.stopPurge();
}
@Override
public final void loadTask(@Nonnull final UUID taskId, final long txId, @Nonnull final UUID resourceId,
@Nonnull final DtxTaskStatus status, final DtxTaskInfo info, final long timestamp) {
taskKeeper.loadTask(taskId, txId, resourceId, status, info, timestamp);
}
@Override
public final void setTaskReadableId(@Nonnull final UUID taskId, final String name, final String description) {
taskKeeper.setTaskReadableId(taskId, name, description);
}
@Override
public final void setTaskTransactionId(@Nonnull final UUID taskId, final long txId) {
taskKeeper.setTaskTransactionId(taskId, txId);
}
@Override
public final void setTaskStatus(@Nonnull final UUID taskId, final DtxTaskStatus status) {
taskKeeper.setTaskStatus(taskId, status);
}
@Override
public final void setTaskStatus(final long transactionId, final DtxTaskStatus status) {
taskKeeper.setTaskStatus(transactionId, status);
}
@Override
public final void setDtxTaskInfo(@Nonnull final UUID taskId, final DtxTaskInfo taskInfo) {
taskKeeper.setDtxTaskInfo(taskId, taskInfo);
}
@Override
public final boolean isDtxTaskInfoSet(final UUID taskId) {
return taskKeeper.isDtxTaskInfoSet(taskId);
}
@Override
public final long getTaskTimestamp(final UUID taskId) {
return taskKeeper.getTaskTimeStamp(taskId);
}
};
}
DtxTaskInternal getDtxTaskInternal() {
return taskInternal;
}
@Override
public final void setTask(@Nonnull final UUID taskId, final long txId, @Nonnull final UUID resourceId,
@Nonnull final DtxTaskStatus status, final DtxTaskInfo info) {
taskKeeper.setTask(taskId, txId, resourceId, status, info);
}
@Override
public final DtxTaskInfo getDtxTaskInfo(final UUID taskId) {
return taskKeeper.getDtxTaskInfo(taskId, this);
}
@Override
public final DtxTaskAdm getTask(final UUID taskId) {
return taskKeeper.getDtxTask(taskId, this);
}
@Override
public final DtxTaskAdm[] getTasks() {
return taskKeeper.getTasks();
}
@Override
public final DtxTaskAdm[] getResourceManagerTasks(final UUID resourceId) {
return taskKeeper.getResourceManagerTasks(resourceId);
}
/**
* Get the task data corresponding to a give task ID. Null is returned if the task is not found
*
* @param taskId
* the requested task's ID
* @return the non-<code>null</code> {@link TaskLoader}
*/
protected abstract TaskLoader readTask(UUID taskId);
}