package io.eguan.vold.model; /* * #%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.vvr.repository.core.api.FutureDevice; import io.eguan.vvr.repository.core.api.FutureVoid; import io.eguan.vvr.repository.core.api.Snapshot; import java.util.Collection; import java.util.Iterator; import java.util.UUID; import java.util.concurrent.ExecutionException; /** * The class {@link Snapshot} encapsulates a {@link VvrSnapshot} and is exported as a {@link SnapshotMXBean}. * * @author oodrive * @author llambert * @author ebredzinski * @author pwehrle */ final class VvrSnapshot implements SnapshotMXBean { private final Snapshot snapshotInstance; VvrSnapshot(final Snapshot snapshotInstance) { super(); this.snapshotInstance = snapshotInstance; } @Override public final String getName() { return snapshotInstance.getName(); } @Override public final void setName(final String name) { final FutureVoid futureTask = snapshotInstance.setName(name); if (futureTask == null) { return; } try { futureTask.get(); } catch (InterruptedException | ExecutionException e) { // propagate failure throw new IllegalStateException(e); } } @Override public final String getDescription() { return snapshotInstance.getDescription(); } @Override public final void setDescription(final String description) { final FutureVoid futureTask = snapshotInstance.setDescription(description); if (futureTask == null) { return; } try { futureTask.get(); } catch (InterruptedException | ExecutionException e) { // propagate failure throw new IllegalStateException(e); } } /* * Should be getUuidString(), but, in this case, the JMX attribute would be 'uuidString' * * @see io.eguan.vold.model.SnapshotMXBean#getUuid() */ @Override public final String getUuid() { return getUuidUuid().toString(); } final UUID getUuidUuid() { return snapshotInstance.getUuid(); } @Override public final long getSize() { return snapshotInstance.getSize(); } @Override public String getParent() { return snapshotInstance.getParent().toString(); } @Override public final String[] getChildrenSnapshots() { final Collection<UUID> children = snapshotInstance.getChildrenSnapshotsUuid(); final String[] result = new String[children.size()]; int i = 0; for (final Iterator<UUID> iterator = children.iterator(); iterator.hasNext();) { result[i++] = iterator.next().toString(); } return result; } @Override public final String[] getChildrenDevices() { final Collection<UUID> children = snapshotInstance.getSnapshotDevicesUuid(); final String[] result = new String[children.size()]; int i = 0; for (final Iterator<UUID> iterator = children.iterator(); iterator.hasNext();) { result[i++] = iterator.next().toString(); } return result; } @Override public final String createDevice(final String name) { final FutureDevice futureDevice = snapshotInstance.createDevice(name); return devicePostTask(futureDevice); } @Override public final String createDevice(final String name, final String description) { final FutureDevice futureDevice = snapshotInstance.createDevice(name, description); return devicePostTask(futureDevice); } @Override public final String createDevice(final String name, final long size) { final int blockSize = snapshotInstance.getBlockSize(); final long roundedSize = size - (size % blockSize); final FutureDevice futureDevice = snapshotInstance.createDevice(name, roundedSize); return devicePostTask(futureDevice); } @Override public final String createDevice(final String name, final String description, final long size) { final int blockSize = snapshotInstance.getBlockSize(); final long roundedSize = size - (size % blockSize); final FutureDevice futureDevice = snapshotInstance.createDevice(name, description, roundedSize); return devicePostTask(futureDevice); } @Override public final String createDeviceUuid(final String name, final String uuid) { final UUID uuidObj = UUID.fromString(uuid); final FutureDevice futureDevice = snapshotInstance.createDevice(name, uuidObj); return devicePostTask(futureDevice); } @Override public final String createDeviceUuid(final String name, final String description, final String uuid) { final UUID uuidObj = UUID.fromString(uuid); final FutureDevice futureDevice = snapshotInstance.createDevice(name, description, uuidObj); return devicePostTask(futureDevice); } @Override public final String createDeviceUuid(final String name, final String uuid, final long size) { final UUID uuidObj = UUID.fromString(uuid); final int blockSize = snapshotInstance.getBlockSize(); final long roundedSize = size - (size % blockSize); final FutureDevice futureDevice = snapshotInstance.createDevice(name, uuidObj, roundedSize); return devicePostTask(futureDevice); } @Override public final String createDeviceUuid(final String name, final String description, final String uuid, final long size) { final UUID uuidObj = UUID.fromString(uuid); final int blockSize = snapshotInstance.getBlockSize(); final long roundedSize = size - (size % blockSize); final FutureDevice futureDevice = snapshotInstance.createDevice(name, description, uuidObj, roundedSize); return devicePostTask(futureDevice); } /** * Operations done on the FutureDevice * * @param futureDevice * @return the UUID of the task that created the device */ private final String devicePostTask(final FutureDevice futureDevice) { try { VvrDevice.createVvrDevice(futureDevice.get()); } catch (final Exception e) { throw new IllegalStateException("Failed to create device", e); } return futureDevice.getTaskId().toString(); } @Override public final String delete() { final FutureVoid future = snapshotInstance.delete(); return future.getTaskId().toString(); } }