package org.ovirt.engine.ui.uicommonweb.models; import org.ovirt.engine.ui.uicommonweb.Convertible; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.ValidationResult; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; import org.ovirt.engine.ui.uicompat.IProvidePropertyChangedEvent; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; import org.ovirt.engine.ui.uicompat.ProvidePropertyChangedEvent; import com.google.gwt.event.shared.HasHandlers; public class EntityModel<T> extends Model implements HasHandlers, HasEntity<T> { private Event<EventArgs> privateEntityChangedEvent; @Override public Event<EventArgs> getEntityChangedEvent() { return privateEntityChangedEvent; } private void setEntityChangedEvent(Event<EventArgs> value) { privateEntityChangedEvent = value; } private T entity; @Override public T getEntity() { return entity; } @Override public void setEntity(T value) { if (entity != value) { entityChanging(value, entity); entity = value; onEntityChanged(); // EntityChanged(this, EventArgs.Empty); getEntityChangedEvent().raise(this, EventArgs.EMPTY); onPropertyChanged(new PropertyChangedEventArgs("Entity")); //$NON-NLS-1$ } } @Override public EntityModel<T> setIsChangeable(boolean value) { return setIsChangeable(value, null); } @Override public EntityModel<T> setIsChangeable(boolean value, String reason) { super.setIsChangeable(value, reason); return this; } @Override public EntityModel<T> setTitle(String value) { super.setTitle(value); return this; } public void setEntity(T value, boolean fireEvents) { if (fireEvents) { setEntity(value); } else { entity = value; } } public EntityModel() { setEntityChangedEvent(new Event<>(entityChangedEventDefinition)); } public EntityModel(T entity) { this(); setEntity(entity); } public EntityModel(String title, T entity) { this(entity); setTitle(title); } protected void entityChanging(T newValue, T oldValue) { IProvidePropertyChangedEvent notifier = (IProvidePropertyChangedEvent) ((oldValue instanceof IProvidePropertyChangedEvent) ? oldValue : null); if (notifier != null) { notifier.getPropertyChangedEvent().removeListener(this); } notifier = (IProvidePropertyChangedEvent) ((newValue instanceof IProvidePropertyChangedEvent) ? newValue : null); if (notifier != null) { notifier.getPropertyChangedEvent().addListener(this); } } protected void onEntityChanged() { } /** * Invoked whenever some property of the entity was changed. */ protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) { } @Override public void eventRaised(Event<? extends EventArgs> ev, Object sender, EventArgs args) { super.eventRaised(ev, sender, args); if (ev.matchesDefinition(entityChangedEventDefinition)) { onEntityChanged(); } else if (ev.matchesDefinition(ProvidePropertyChangedEvent.definition)) { entityPropertyChanged(sender, (PropertyChangedEventArgs) args); } } public void validateEntity(IValidation[] validations) { setIsValid(true); if (!getIsAvailable() || !getIsChangable()) { return; } for (IValidation validation : validations) { ValidationResult result = validation.validate(getEntity()); if (!result.getSuccess()) { for (String reason : result.getReasons()) { getInvalidityReasons().add(reason); } setIsValid(false); break; } } } public Convertible asConvertible() { return new Convertible(this); } @Override public void cleanup() { cleanupEvents(getEntityChangedEvent()); super.cleanup(); } }