package org.ovirt.engine.ui.uicommonweb.models.storage;
import java.util.ArrayList;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.NfsVersion;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StorageDomainType;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.StorageServerConnections;
import org.ovirt.engine.core.common.businessentities.storage.StorageType;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.HasEntity;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.validation.IValidation;
import org.ovirt.engine.ui.uicommonweb.validation.IntegerValidation;
import org.ovirt.engine.ui.uicommonweb.validation.LinuxMountPointValidation;
import org.ovirt.engine.ui.uicommonweb.validation.NoSpacesValidation;
import org.ovirt.engine.ui.uicommonweb.validation.NonUtfValidation;
import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.Event;
import org.ovirt.engine.ui.uicompat.EventArgs;
import org.ovirt.engine.ui.uicompat.EventDefinition;
import org.ovirt.engine.ui.uicompat.UIConstants;
public class NfsStorageModel extends FileStorageModel {
//retrans nfs option max value
private static final short RETRANS_MAX = 32767;
//timeo nfs option max value
private static final short TIMEOUT_MAX = 6000;
public static final EventDefinition pathChangedEventDefinition;
private Event<EventArgs> pathChangedEvent;
public Event<EventArgs> getPathChangedEvent() {
return pathChangedEvent;
}
private void setPathChangedEvent(Event<EventArgs> value) {
pathChangedEvent = value;
}
private UICommand updateCommand;
@Override
public UICommand getUpdateCommand() {
return updateCommand;
}
private void setUpdateCommand(UICommand value) {
updateCommand = value;
}
private StorageModel container;
@Override
public StorageModel getContainer() {
return container;
}
@Override
public void setContainer(StorageModel value) {
if (container != value) {
container = value;
containerChanged();
}
}
private StorageDomainType role = StorageDomainType.values()[0];
@Override
public StorageDomainType getRole() {
return role;
}
@Override
public void setRole(StorageDomainType value) {
role = value;
}
@Override protected void prepareConnectionForEditing(StorageServerConnections connection) {
getRetransmissions().setEntity(connection.getNfsRetrans());
getTimeout().setEntity(connection.getNfsTimeo());
getMountOptions().setEntity(connection.getMountOptions());
for (EntityModel<NfsVersion> item : getVersion().getItems()) {
EntityModel itemModel = item;
boolean noNfsVersion = itemModel.getEntity() == null && connection.getNfsVersion() == null;
boolean foundNfsVersion = itemModel.getEntity() != null &&
itemModel.getEntity().equals(connection.getNfsVersion());
if (noNfsVersion || foundNfsVersion) {
getVersion().setSelectedItem(item);
break;
}
}
}
private ListModel<EntityModel<NfsVersion>> version;
public ListModel<EntityModel<NfsVersion>> getVersion() {
return version;
}
private void setVersion(ListModel<EntityModel<NfsVersion>> value) {
version = value;
}
private EntityModel<Short> retransmissions;
public EntityModel<Short> getRetransmissions() {
return retransmissions;
}
private void setRetransmissions(EntityModel<Short> value) {
retransmissions = value;
}
private EntityModel<Short> timeout;
public EntityModel<Short> getTimeout() {
return timeout;
}
private void setTimeout(EntityModel<Short> value) {
timeout = value;
}
private EntityModel<String> mountOptions;
public EntityModel<String> getMountOptions() {
return mountOptions;
}
private void setMountOptions(EntityModel<String> value) {
mountOptions = value;
}
static {
pathChangedEventDefinition = new EventDefinition("PathChanged", NfsStorageModel.class); //$NON-NLS-1$
}
public NfsStorageModel() {
setPathChangedEvent(new Event<>(pathChangedEventDefinition));
setUpdateCommand(new UICommand("Update", this)); //$NON-NLS-1$
setPath(new EntityModel<String>());
getPath().getEntityChangedEvent().addListener(this);
UIConstants constants = ConstantsManager.getInstance().getConstants();
// Initialize version list.
setVersion(new ListModel<EntityModel<NfsVersion>>());
List<EntityModel<NfsVersion>> versionItems = new ArrayList<>();
// Items are shown in the UI in the order added; Auto negotiate is the default
versionItems.add(new EntityModel<>(constants.nfsVersionAutoNegotiate(), NfsVersion.AUTO));
versionItems.add(new EntityModel<>(constants.nfsVersion3(), NfsVersion.V3));
versionItems.add(new EntityModel<>(constants.nfsVersion4(), NfsVersion.V4));
versionItems.add(new EntityModel<>(constants.nfsVersion41(), NfsVersion.V4_1));
versionItems.add(new EntityModel<>(constants.nfsVersion42(), NfsVersion.V4_2));
getVersion().setItems(versionItems);
setRetransmissions(new EntityModel<Short>());
setTimeout(new EntityModel<Short>());
setMountOptions(new EntityModel<String>());
}
@Override
public void eventRaised(Event<? extends EventArgs> ev, Object sender, EventArgs args) {
super.eventRaised(ev, sender, args);
if (ev.matchesDefinition(HasEntity.entityChangedEventDefinition) && sender == getPath()) {
// Notify about path change.
getPathChangedEvent().raise(this, EventArgs.EMPTY);
}
}
@Override
public boolean validate() {
getPath().validateEntity(new IValidation[] {
new NotEmptyValidation(),
new LinuxMountPointValidation(),
new NonUtfValidation(),
new NoSpacesValidation()
});
getRetransmissions().validateEntity(new IValidation[] {
new IntegerValidation(0, RETRANS_MAX)
});
getTimeout().validateEntity(new IValidation[] {
new IntegerValidation(1, TIMEOUT_MAX)
});
getMountOptions().validateEntity(new IValidation[] {
new NonUtfValidation()
});
return getPath().getIsValid()
&& getRetransmissions().getIsValid()
&& getTimeout().getIsValid()
&& getMountOptions().getIsValid();
}
@Override
public StorageType getType() {
return StorageType.NFS;
}
private void containerChanged() {
// Subscribe to the data center change.
if (getContainer() == null) {
return;
}
ListModel<StoragePool> dataCenter = getContainer().getDataCenter();
dataCenter.getSelectedItemChangedEvent().addListener((ev, sender, args) -> containerDataCenterChanged());
// Call handler if there some data center is already selected.
if (dataCenter.getSelectedItem() != null) {
containerDataCenterChanged();
}
}
private void containerDataCenterChanged() {
StoragePool dataCenter = getContainer().getDataCenter().getSelectedItem();
boolean available = dataCenter != null;
getVersion().setIsAvailable(available);
getRetransmissions().setIsAvailable(available);
getTimeout().setIsAvailable(available);
getMountOptions().setIsAvailable(available);
}
@Override
public void prepareForEdit(StorageDomain storage) {
super.prepareForEdit(storage);
boolean isStorageEditable = isEditable(storage);
getVersion().setIsChangeable(isStorageEditable);
getRetransmissions().setIsChangeable(isStorageEditable);
getTimeout().setIsChangeable(isStorageEditable);
getMountOptions().setIsChangeable(isStorageEditable);
}
@Override
public void cleanup() {
cleanupEvents(getPathChangedEvent());
super.cleanup();
}
}