package fr.openwide.core.wicket.more.model; import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.wicket.model.IModel; public class WorkingCopyModel<T> implements IModel<T> { private static final long serialVersionUID = -4049247716740595168L; private final IModel<T> reference; private final IModel<T> workingCopy; public static <T> WorkingCopyModel<T> of(IModel<T> reference, IModel<T> workingCopy) { return new WorkingCopyModel<T>(reference, workingCopy); } public WorkingCopyModel(IModel<T> reference, IModel<T> workingCopy) { this.reference = reference; this.workingCopy = workingCopy; read(); } @Override public boolean equals(Object obj) { return new EqualsBuilder().appendSuper(super.equals(obj)).isEquals(); } @Override public int hashCode() { return new HashCodeBuilder().appendSuper(super.hashCode()).hashCode(); } @Override public void detach() { this.reference.detach(); this.workingCopy.detach(); } @Override public T getObject() { return workingCopy.getObject(); } @Override public void setObject(T object) { workingCopy.setObject(object); } public void read() { try { workingCopy.setObject(reference.getObject()); } catch (RuntimeException e) { throw new IllegalStateException("Exception while reading from " + tryToString(reference) + " to " + tryToString(workingCopy), e); } } public void write() { try { reference.setObject(workingCopy.getObject()); } catch (RuntimeException e) { throw new IllegalStateException("Exception while writing from " + tryToString(workingCopy) + " to " + tryToString(reference), e); } } private String tryToString(IModel<?> model) { try { return String.valueOf(model); } catch (RuntimeException e) { return "<Unexpected exception while calling String.valueOf(model)>"; } } public IModel<T> getReferenceModel() { return reference; } }