package org.apache.isis.viewer.wicket.ui.components.property; import java.util.concurrent.Callable; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.request.cycle.RequestCycle; import org.apache.isis.core.metamodel.adapter.ObjectAdapter; import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager; import org.apache.isis.viewer.wicket.model.models.ScalarModel; import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage; import org.apache.isis.viewer.wicket.ui.panels.FormExecutorAbstract; public class PropertyEditFormExecutor extends FormExecutorAbstract<ScalarModel> { public PropertyEditFormExecutor(final ScalarModel scalarModel) { super(scalarModel); } protected ObjectAdapter obtainTargetAdapter() { return model.getParentEntityModel().load(); } protected String getReasonInvalidIfAny() { return this.model.getReasonInvalidIfAny(); } protected void onExecuteAndProcessResults(final AjaxRequestTarget target) { // no-op } protected ObjectAdapter obtainResultAdapter() { ObjectAdapter targetAdapter = obtainTargetAdapter(); final ObjectAdapter resultAdapter = this.model.applyValue(targetAdapter); if (resultAdapter != targetAdapter) { this.model.getParentEntityModel().setObject(targetAdapter); } return resultAdapter; } protected void redirectTo( final ObjectAdapter resultAdapter, final AjaxRequestTarget target) { // disabling concurrency checking after the layout XML (grid) feature // was throwing an exception when rebuild grid after invoking edit prompt. // not certain why that would be the case, but (following similar code for action prompt) // think it should be safe to simply disable while recreating the page to re-render back to user. final EntityPage entityPage = AdapterManager.ConcurrencyChecking.executeWithConcurrencyCheckingDisabled( new Callable<EntityPage>() { @Override public EntityPage call() throws Exception { return new EntityPage(resultAdapter, null); } } ); final RequestCycle requestCycle = RequestCycle.get(); requestCycle.setResponsePage(entityPage); } }