package org.ovirt.engine.ui.uicommonweb.models.gluster;
import java.util.Arrays;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.RaidType;
import org.ovirt.engine.core.common.businessentities.gluster.StorageDevice;
import org.ovirt.engine.core.common.utils.Pair;
import org.ovirt.engine.core.common.utils.SizeConverter;
import org.ovirt.engine.core.common.utils.SizeConverter.SizeUnit;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicommonweb.validation.AsciiNameValidation;
import org.ovirt.engine.ui.uicommonweb.validation.BrickMountPointValidation;
import org.ovirt.engine.ui.uicommonweb.validation.IValidation;
import org.ovirt.engine.ui.uicommonweb.validation.IntegerValidation;
import org.ovirt.engine.ui.uicommonweb.validation.LengthValidation;
import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
import com.google.gwt.i18n.client.NumberFormat;
public class CreateBrickModel extends Model {
EntityModel<String> lvName;
EntityModel<String> size;
EntityModel<String> mountPoint;
EntityModel<String> defaultMountFolder;
EntityModel<Integer> stripeSize;
EntityModel<Integer> noOfPhysicalDisksInRaidVolume;
ListModel<RaidType> raidTypeList;
private ListModel<StorageDevice> storageDevices;
public CreateBrickModel() {
setLvName(new EntityModel<String>());
setStorageDevices(new ListModel<StorageDevice>());
setSize(new EntityModel<String>());
setStripeSize(new EntityModel<Integer>());
setNoOfPhysicalDisksInRaidVolume(new EntityModel<Integer>());
setRaidTypeList(new ListModel<RaidType>());
setMountPoint(new EntityModel<String>());
setDefaultMountFolder(new EntityModel<String>());
List<RaidType> list = Arrays.asList(RaidType.values());
getRaidTypeList().setItems(list);
getNoOfPhysicalDisksInRaidVolume().setIsAvailable(false);
getStripeSize().setIsAvailable(false);
initSize();
getStorageDevices().getSelectedItemsChangedEvent().addListener((ev, sender, args) -> updateBrickSize());
getLvName().getEntityChangedEvent().addListener((ev, sender, args) -> {
String mountPoint = getDefaultMountFolder().getEntity() + "/" + getLvName().getEntity(); //$NON-NLS-1$
getMountPoint().setEntity(mountPoint);
});
getRaidTypeList().getSelectedItemChangedEvent().addListener((ev, sender, args) -> {
if (getRaidTypeList().getSelectedItem() == RaidType.RAID6) {
getNoOfPhysicalDisksInRaidVolume().setIsAvailable(true);
getStripeSize().setIsAvailable(true);
getStripeSize().setEntity(128);
} else if (getRaidTypeList().getSelectedItem() == RaidType.RAID10) {
getNoOfPhysicalDisksInRaidVolume().setIsAvailable(true);
getStripeSize().setIsAvailable(true);
getStripeSize().setEntity(256);
} else {
getNoOfPhysicalDisksInRaidVolume().setIsAvailable(false);
getStripeSize().setIsAvailable(false);
}
onPropertyChanged(new PropertyChangedEventArgs("raidTypeChanged")); //$NON-NLS-1$
});
}
private void updateBrickSize() {
long totalSize = 0;
// Calculate and show the total size of all selected device so that user can get an idea of what will be his
// brick
// capacity.
if (getStorageDevices().getSelectedItems() != null) {
for (StorageDevice storageDevice : getStorageDevices().getSelectedItems()) {
totalSize += storageDevice.getSize();
}
}
Pair<SizeUnit, Double> convertedSize = SizeConverter.autoConvert(totalSize, SizeUnit.MiB);
setBrickSize(convertedSize);
}
public EntityModel<String> getLvName() {
return lvName;
}
public EntityModel<String> getSize() {
return size;
}
private void initSize() {
setBrickSize(new Pair<>(SizeUnit.BYTES, 0D));
}
private void setBrickSize(Pair<SizeUnit, Double> size) {
String sizeString = getSizeString(size);
getSize().setEntity(sizeString);
}
private String getSizeString(Pair<SizeUnit, Double> size) {
return formatSize(size.getSecond()) + " " + size.getFirst().toString();//$NON-NLS-1$
}
public ListModel<StorageDevice> getStorageDevices() {
return storageDevices;
}
public void setLvName(EntityModel<String> lvName) {
this.lvName = lvName;
}
public void setSize(EntityModel<String> size) {
this.size = size;
}
protected void setSelectedDevices(List<StorageDevice> selectedDevices) {
getStorageDevices().setSelectedItems(selectedDevices);
}
public void setStorageDevices(ListModel<StorageDevice> storageDevices) {
this.storageDevices = storageDevices;
}
public boolean validate() {
getLvName().validateEntity(new IValidation[] { new NotEmptyValidation(), new LengthValidation(50),
new AsciiNameValidation() });
if (!getLvName().getIsValid()) {
return false;
}
getMountPoint().validateEntity(new IValidation[] { new NotEmptyValidation(), new BrickMountPointValidation() });
if (!getMountPoint().getIsValid()) {
return false;
}
IntegerValidation noOfPhysicalDiscsValidation = new IntegerValidation();
noOfPhysicalDiscsValidation.setMinimum(1);
getNoOfPhysicalDisksInRaidVolume().validateEntity(new IValidation[] { new NotEmptyValidation(),
noOfPhysicalDiscsValidation });
if (!getNoOfPhysicalDisksInRaidVolume().getIsValid()) {
return false;
}
IntegerValidation stripSizeValidation = new IntegerValidation();
stripSizeValidation.setMinimum(1);
getStripeSize().validateEntity(new IValidation[] { new NotEmptyValidation(),
stripSizeValidation });
if (!getStripeSize().getIsValid()) {
return false;
}
if (getStorageDevices().getSelectedItems() == null || getStorageDevices().getSelectedItems().isEmpty()) {
setMessage(ConstantsManager.getInstance().getConstants().selectStorageDevice());
return false;
}
return true;
}
public String formatSize(double size) {
return NumberFormat.getFormat("#.##").format(size);//$NON-NLS-1$
}
public EntityModel<Integer> getStripeSize() {
return stripeSize;
}
public EntityModel<Integer> getNoOfPhysicalDisksInRaidVolume() {
return noOfPhysicalDisksInRaidVolume;
}
public void setStripeSize(EntityModel<Integer> stripeSize) {
this.stripeSize = stripeSize;
}
public void setNoOfPhysicalDisksInRaidVolume(EntityModel<Integer> noOfPhysicalDisksInRaidVolume) {
this.noOfPhysicalDisksInRaidVolume = noOfPhysicalDisksInRaidVolume;
}
public ListModel<RaidType> getRaidTypeList() {
return raidTypeList;
}
public void setRaidTypeList(ListModel<RaidType> raidTypeList) {
this.raidTypeList = raidTypeList;
}
public EntityModel<String> getMountPoint() {
return mountPoint;
}
public void setMountPoint(EntityModel<String> mountPoint) {
this.mountPoint = mountPoint;
}
public EntityModel<String> getDefaultMountFolder() {
return defaultMountFolder;
}
public void setDefaultMountFolder(EntityModel<String> defaultMountFolder) {
this.defaultMountFolder = defaultMountFolder;
}
}