blob: 0ecb1e9e97d75c998e90d145c75fbb0f0c3a4a55 [file] [log] [blame]
/*
* Licensed to jclouds, Inc. (jclouds) under one or more
* contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. jclouds 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.jclouds.cloudstack.domain;
import static com.google.common.base.Preconditions.checkNotNull;
import java.beans.ConstructorProperties;
import java.util.Date;
import javax.inject.Named;
import org.jclouds.javax.annotation.Nullable;
import com.google.common.base.Objects;
import com.google.common.base.Objects.ToStringHelper;
/**
* Class AsyncJob
*
* @author Adrian Cole
*/
public class AsyncJob<S> {
/**
* Valid job result codes
*/
public static enum ResultCode {
SUCCESS (0),
FAIL (530),
UNKNOWN (-1);
private final int code;
private ResultCode(int code) {
this.code = code;
}
public int code() { return this.code; }
public static ResultCode fromValue(String value) {
try {
int resultCode = Integer.parseInt(value);
switch (resultCode) {
case 0:
return SUCCESS;
case 530:
return FAIL;
default:
return UNKNOWN;
}
} catch(NumberFormatException e) {
return UNKNOWN;
}
}
}
/**
* Valid async job statuses
*/
public static enum Status {
IN_PROGRESS (0),
SUCCEEDED (1),
FAILED (2),
UNKNOWN (-1);
private final int code;
private Status(int code) {
this.code = code;
}
public int code() { return this.code; }
public static Status fromValue(String value) {
try {
int statusCode = Integer.parseInt(value);
switch (statusCode) {
case 0:
return IN_PROGRESS;
case 1:
return SUCCEEDED;
case 2:
return FAILED;
default:
return UNKNOWN;
}
} catch (NumberFormatException e) {
return UNKNOWN;
}
}
}
public static <T> Builder<?,T> builder() {
return new ConcreteBuilder<T>();
}
public Builder toBuilder() {
return new ConcreteBuilder<S>().fromAsyncJob(this);
}
public static abstract class Builder<T extends Builder<T,S>, S> {
protected abstract T self();
protected String accountId;
protected String cmd;
protected Date created;
protected String id;
protected String instanceId;
protected String instanceType;
protected int progress;
protected S result;
protected AsyncJob.ResultCode resultCode;
protected String resultType;
protected AsyncJob.Status status;
protected String userId;
protected AsyncJobError error;
/**
* @see AsyncJob#getAccountId()
*/
public T accountId(String accountId) {
this.accountId = accountId;
return self();
}
/**
* @see AsyncJob#getCmd()
*/
public T cmd(String cmd) {
this.cmd = cmd;
return self();
}
/**
* @see AsyncJob#getCreated()
*/
public T created(Date created) {
this.created = created;
return self();
}
/**
* @see AsyncJob#getId()
*/
public T id(String id) {
this.id = id;
return self();
}
/**
* @see AsyncJob#getInstanceId()
*/
public T instanceId(String instanceId) {
this.instanceId = instanceId;
return self();
}
/**
* @see AsyncJob#getInstanceType()
*/
public T instanceType(String instanceType) {
this.instanceType = instanceType;
return self();
}
/**
* @see AsyncJob#getProgress()
*/
public T progress(int progress) {
this.progress = progress;
return self();
}
/**
* @see AsyncJob#getResult()
*/
public T result(S result) {
this.result = result;
return self();
}
/**
* @see AsyncJob#getResultCode()
*/
public T resultCode(AsyncJob.ResultCode resultCode) {
this.resultCode = resultCode;
return self();
}
/**
* @see AsyncJob#getResultType()
*/
public T resultType(String resultType) {
this.resultType = resultType;
return self();
}
/**
* @see AsyncJob#getStatus()
*/
public T status(AsyncJob.Status status) {
this.status = status;
return self();
}
/**
* @see AsyncJob#getUserId()
*/
public T userId(String userId) {
this.userId = userId;
return self();
}
/**
* @see AsyncJob#getError()
*/
public T error(AsyncJobError error) {
this.error = error;
return self();
}
public AsyncJob build() {
return new AsyncJob<S>(accountId, cmd, created, id, instanceId, instanceType, progress, result, resultCode,
resultType, status, userId, error);
}
public T fromAsyncJob(AsyncJob<S> in) {
return this
.accountId(in.getAccountId())
.cmd(in.getCmd())
.created(in.getCreated())
.id(in.getId())
.instanceId(in.getInstanceId())
.instanceType(in.getInstanceType())
.progress(in.getProgress())
.result(in.getResult())
.resultCode(in.getResultCode())
.resultType(in.getResultType())
.status(in.getStatus())
.userId(in.getUserId())
.error(in.getError());
}
public static Builder<?, Object> fromAsyncJobUntyped(AsyncJob in) {
return new ConcreteBuilder().fromAsyncJob(in);
}
}
private static class ConcreteBuilder<T> extends Builder<ConcreteBuilder<T>,T> {
@Override
protected ConcreteBuilder<T> self() {
return this;
}
}
@Named("accountid")
private final String accountId;
private final String cmd;
private final Date created;
@Named("jobid")
private final String id;
@Named("jobinstanceid")
private final String instanceId;
@Named("jobinstancetype")
private final String instanceType;
@Named("jobprocstatus")
private final int progress;
@Named("jobresult")
private final S result;
@Named("jobresultcode")
private final AsyncJob.ResultCode resultCode;
@Named("jobresulttype")
private final String resultType;
@Named("jobstatus")
private final AsyncJob.Status status;
@Named("userid")
private final String userId;
private final AsyncJobError error;
@ConstructorProperties({
"accountid", "cmd", "created", "jobid", "jobinstanceid", "jobinstancetype", "jobprocstatus", "jobresult",
"jobresultcode", "jobresulttype", "jobstatus", "userid", "error"
})
protected AsyncJob(@Nullable String accountId, @Nullable String cmd, @Nullable Date created, String id,
@Nullable String instanceId, @Nullable String instanceType, int progress, @Nullable S result,
@Nullable AsyncJob.ResultCode resultCode, @Nullable String resultType, @Nullable AsyncJob.Status status,
@Nullable String userId, @Nullable AsyncJobError error) {
this.accountId = accountId;
this.cmd = cmd;
this.created = created;
this.id = checkNotNull(id, "id");
this.instanceId = instanceId;
this.instanceType = instanceType;
this.progress = progress;
this.result = result;
this.resultCode = resultCode;
this.resultType = resultType;
this.status = status;
this.userId = userId;
this.error = error;
}
/**
* @return the account that executed the async command
*/
@Nullable
public String getAccountId() {
return this.accountId;
}
/**
* @return the async command executed
*/
@Nullable
public String getCmd() {
return this.cmd;
}
/**
* @return the created date of the job
*/
@Nullable
public Date getCreated() {
return this.created;
}
/**
* @return async job ID
*/
public String getId() {
return this.id;
}
/**
* @return the unique ID of the instance/entity object related to the job
*/
@Nullable
public String getInstanceId() {
return this.instanceId;
}
/**
* @return the instance/entity object related to the job
*/
@Nullable
public String getInstanceType() {
return this.instanceType;
}
/**
* @return the progress information of the PENDING job
*/
public int getProgress() {
return this.progress;
}
/**
* @return the result reason
*/
@Nullable
public S getResult() {
return this.result;
}
/**
* @return the result code for the job
*/
@Nullable
public AsyncJob.ResultCode getResultCode() {
return this.resultCode;
}
/**
* @return the result type
*/
@Nullable
public String getResultType() {
return this.resultType;
}
/**
* @return the current job status-should be 0 for PENDING
*/
@Nullable
public AsyncJob.Status getStatus() {
return this.status;
}
/**
* @return the user that executed the async command
*/
@Nullable
public String getUserId() {
return this.userId;
}
/**
* @return the error related to this command, or null if no error or error
not yet encountered.
*/
@Nullable
public AsyncJobError getError() {
return this.error;
}
public boolean hasFailed() {
return getError() != null || getResultCode() == ResultCode.FAIL || getStatus() == Status.FAILED;
}
public boolean hasSucceed() {
return getError() == null && getResultCode() == ResultCode.SUCCESS && getStatus() == Status.SUCCEEDED;
}
@Override
public int hashCode() {
return Objects.hashCode(accountId, cmd, created, id, instanceId, instanceType, progress, result, resultCode, resultType, status, userId, error);
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
AsyncJob that = AsyncJob.class.cast(obj);
return Objects.equal(this.accountId, that.accountId)
&& Objects.equal(this.cmd, that.cmd)
&& Objects.equal(this.created, that.created)
&& Objects.equal(this.id, that.id)
&& Objects.equal(this.instanceId, that.instanceId)
&& Objects.equal(this.instanceType, that.instanceType)
&& Objects.equal(this.progress, that.progress)
&& Objects.equal(this.result, that.result)
&& Objects.equal(this.resultCode, that.resultCode)
&& Objects.equal(this.resultType, that.resultType)
&& Objects.equal(this.status, that.status)
&& Objects.equal(this.userId, that.userId)
&& Objects.equal(this.error, that.error);
}
protected ToStringHelper string() {
return Objects.toStringHelper(this)
.add("accountId", accountId).add("cmd", cmd).add("created", created).add("id", id).add("instanceId", instanceId)
.add("instanceType", instanceType).add("progress", progress).add("result", result).add("resultCode", resultCode)
.add("resultType", resultType).add("status", status).add("userId", userId).add("error", error);
}
@Override
public String toString() {
return string().toString();
}
}