package io.eguan.vold.rest.resources;
/*
* #%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 io.eguan.dtx.DtxManagerMXBean;
import io.eguan.vold.model.VvrMXBean;
import io.eguan.vold.model.VvrTask;
import io.eguan.vold.rest.generated.model.ExecState;
import io.eguan.vold.rest.generated.model.Task;
import io.eguan.vold.rest.generated.model.TaskList;
import io.eguan.vold.rest.generated.resources.DevicesResource;
import io.eguan.vold.rest.generated.resources.SnapshotsResource;
import io.eguan.vold.rest.generated.resources.TaskResource;
import io.eguan.vold.rest.generated.resources.VvrTasksResource;
import io.eguan.vold.rest.generated.resources.VvrsResource;
import io.eguan.vold.rest.util.ResourcePath;
import io.eguan.vvr.persistence.repository.VvrTaskInfo;
import java.net.URI;
import java.util.List;
import javax.ws.rs.core.UriBuilder;
/**
* {@link VvrTasksResource} implementation for JMX backend.
*
* @author oodrive
* @author ebredzinski
* @author pwehrle
*
*/
public final class VvrTasksResourceJmxImpl extends AbstractTasksResource implements VvrTasksResource {
private final VvrMXBean vvrProxy;
VvrTasksResourceJmxImpl(final URI tasksResUri, final VvrsResourceJmxImpl rootResource, final URI resourceUri,
final VvrMXBean vvrProxy) {
super(tasksResUri, rootResource, resourceUri);
this.vvrProxy = vvrProxy;
}
@Override
public final TaskList getAllTasks(final String ownerId) {
final TaskList result = getObjectFactory().createTaskList();
final List<Task> taskList = result.getTasks();
for (final VvrTask task : vvrProxy.getVvrTasks()) {
taskList.add(getTaskPojoFromMbeanProxy(task.getTaskId(), constructStatus(task),
constructResultReference(task)));
}
return result;
}
@Override
public final TaskResource getTaskResource(final String ownerId, final String taskId) {
final VvrTask task = vvrProxy.getVvrTask(taskId);
if (task == null) // Jersey will generate a 404 not found error
return null;
final DtxManagerMXBean dtxManager = createDtxProxy(ownerId);
final TaskResourceJmxImpl result = new TaskResourceJmxImpl(task.getTaskId(), constructStatus(task),
constructResultReference(task), this, dtxManager);
ResourcePath.injectUriInfoContext(uriInfo, result);
return result;
}
/**
* Construct a resource path
*
* @param targetType
* the type of the target
* @return a string with the resources path
*/
static String constructResourcesPath(final VvrTask task) {
final VvrTaskInfo vvrTaskInfo = task.getInfo();
if (vvrTaskInfo == null) {
return "";
}
Class<?> resourceClass;
switch (vvrTaskInfo.getTargetType()) {
case DEVICE:
resourceClass = DevicesResource.class;
break;
case SNAPSHOT:
resourceClass = SnapshotsResource.class;
break;
case VVR:
default:
resourceClass = VvrsResource.class;
break;
}
return ResourcePath.extractPathForSubResourceLocator(VvrResourceJmxImpl.class, resourceClass);
}
private String constructResultReference(final VvrTask task) {
final VvrTaskInfo vvrTaskInfo = task.getInfo();
if (vvrTaskInfo == null) {
return "";
}
final String id = vvrTaskInfo.getTargetId();
final String resourcesPath = constructResourcesPath(task);
// construct /storage/vvrs/<uuid vvr>/<target_type>s/<uiid target>
return UriBuilder.fromUri(getParentUri()).path(resourcesPath).path(id).build().toString();
}
/**
* Construct a resource path
*
* @param targetType
* the type of the target
* @return a string with the resources path
*/
static ExecState constructStatus(final VvrTask task) {
switch (task.getStatus()) {
case PENDING:
return ExecState.PENDING;
case STARTED:
return ExecState.IN_PROGRESS;
case PREPARED:
return ExecState.IN_PROGRESS;
case COMMITTED:
return ExecState.DONE;
case ROLLED_BACK:
case UNKNOWN: // TODO: error 40x or 50x?
default:
return ExecState.FAILED;
}
}
}