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.VvrManagerMXBean; import io.eguan.vold.model.VvrManagerTask; 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.TaskResource; import io.eguan.vold.rest.generated.resources.VvrsTasksResource; import io.eguan.vold.rest.util.InputValidation; import io.eguan.vold.rest.util.ResourcePath; import java.net.URI; import java.util.List; import java.util.Set; import java.util.UUID; import javax.management.JMX; import javax.management.ObjectName; import javax.ws.rs.core.UriBuilder; /** * {@link VvrsTasksResource} implementation for JMX backend. * * @author oodrive * @author ebredzinski * @author pwehrle * */ public final class VvrsTasksResourceJmxImpl extends AbstractTasksResource implements VvrsTasksResource { VvrsTasksResourceJmxImpl(final URI tasksResUri, final VvrsResourceJmxImpl rootResource, final URI parentUri) { super(tasksResUri, rootResource, parentUri); } @Override public final TaskList getAllTasks(final String ownerId) { final TaskList result = getObjectFactory().createTaskList(); final List<Task> taskList = result.getTasks(); final VvrManagerMXBean vvrManager = getRootResource().newVvrManagerProxy( InputValidation.getUuidFromString(ownerId)); for (final VvrManagerTask task : vvrManager.getVvrManagerTasks()) { taskList.add(getTaskPojoFromMbeanProxy(task.getTaskId(), constructStatus(task), constructResultReference(task))); } // get task for all the vvr final Set<ObjectName> vvrInstances = getRootResource().getAllVvrInstances(ownerId); for (final ObjectName currObjName : vvrInstances) { final VvrMXBean vvr = JMX.newMXBeanProxy(getRootResource().getConnection(), currObjName, VvrMXBean.class); for (final VvrTask task : vvr.getVvrTasks()) { final String resourcesPath = VvrTasksResourceJmxImpl.constructResourcesPath(task); // construct manually the result reference final String resultRef = UriBuilder.fromUri(getParentUri()).path(vvr.getUuid()).path(resourcesPath) .path(task.getInfo().getTargetId()).build().toString(); taskList.add(getTaskPojoFromMbeanProxy(task.getTaskId(), VvrTasksResourceJmxImpl.constructStatus(task), resultRef)); } } return result; } @Override public final TaskResource getTaskResource(final String ownerId, final String taskId) { final UUID taskUuid = InputValidation.getUuidFromString(taskId); final VvrManagerMXBean vvrManagerProxy = getRootResource().newVvrManagerProxy( InputValidation.getUuidFromString(ownerId)); final VvrManagerTask task = vvrManagerProxy.getVvrManagerTask(taskUuid.toString()); // Jersey will generate a 404 not found error if (task == null) { 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; } private String constructResultReference(final VvrManagerTask task) { if (task == null) { return ""; } final String id = task.getInfo().getTargetId(); // construct /storage/vvrs/<uuid vvr> if (id != null) return UriBuilder.fromUri(getParentUri()).path(id).build().toString(); else { return ""; } } private ExecState constructStatus(final VvrManagerTask 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; } } }