package core.aws.resource; import core.aws.env.Goal; import core.aws.util.Asserts; import core.aws.util.ToStringHelper; import core.aws.workflow.Tasks; /** * @author neo */ public class Resource { public final String id; public ResourceStatus status; public Resource(String id) { this.id = id; } public void foundInLocal() { Asserts.isNull(status, "local status is always checked first"); status = ResourceStatus.LOCAL_ONLY; } public void foundInRemote() { if (status == null) status = ResourceStatus.REMOTE_ONLY; if (status == ResourceStatus.LOCAL_ONLY) status = ResourceStatus.LOCAL_REMOTE; } public final void tasks(Goal goal, Tasks tasks) { switch (goal) { case SYNC: buildSyncTasks(tasks); break; case DEL: buildDeleteTasks(tasks); break; case DESC: describeTasks(tasks); break; default: throw new IllegalStateException("unsupported goal, goal=" + goal); } } private void buildDeleteTasks(Tasks tasks) { if (status == ResourceStatus.LOCAL_REMOTE || status == ResourceStatus.REMOTE_ONLY) { deleteTasks(tasks); } } private void buildSyncTasks(Tasks tasks) { if (status == ResourceStatus.LOCAL_ONLY) { createTasks(tasks); } else if (status == ResourceStatus.LOCAL_REMOTE) { updateTasks(tasks); } else if (status == ResourceStatus.REMOTE_ONLY) { deleteTasks(tasks); } } protected void describeTasks(Tasks tasks) { } protected void createTasks(Tasks tasks) { } protected void updateTasks(Tasks tasks) { } protected void deleteTasks(Tasks tasks) { } public void validate(Resources resources) { } @Override public String toString() { return new ToStringHelper(this) .add(id) .add(status) .toString(); } }