You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@isis.apache.org by da...@apache.org on 2017/05/16 13:00:50 UTC
[19/37] isis git commit: ISIS-1613: concurrency handling now seems to
be working, more or less. More testing required.
ISIS-1613: concurrency handling now seems to be working, more or less. More testing required.
- backs out the DisableConcurrencyCheckingOnRenderListener from IsisWicketApplication
- instead use EntityPage on{Before/After}Render hooks
- use EntityModel#resetPropertyModels to reset version
- no longer clear propertyScalarModels on detach, so can iterate over
- do this in FormExecutorAbstract, rather than PromptFormAbstract
- EntityModelWithLayoutHints introduced as wrapper around EntityModel, to avoid aliasing issues with resetting version on the "main" EntityModel
- use model.getParentEntityModel for action models in a couple of further places (ActionPromptHeaderPanel, ActionParametersPanel)
- similarly, reuse EntityModel in EntityLinkSimplePanel rather than create its own EntityModel
also:
- change PageAbstract#getUiHintContainerIfAny(), return a UiHintContainer once more (rather than EntityModel) since no need to return the more specific class
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/3ff8f7a8
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/3ff8f7a8
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/3ff8f7a8
Branch: refs/heads/master
Commit: 3ff8f7a82a579024b72f1bcaead6708424ae4e33
Parents: cfb2067
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Mon May 15 16:07:22 2017 +0100
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Mon May 15 16:07:22 2017 +0100
----------------------------------------------------------------------
.../wicket/viewer/IsisWicketApplication.java | 66 +++---
.../viewer/wicket/model/models/ActionModel.java | 5 +
.../wicket/model/models/BookmarkableModel.java | 2 +-
.../viewer/wicket/model/models/EntityModel.java | 15 +-
.../models/EntityModelWithLayoutHints.java | 215 +++++++++++++++++++
.../model/models/FormExecutorContext.java | 2 +-
.../model/models/ParentEntityModelProvider.java | 26 +++
.../ActionResultResponseType.java | 6 +-
.../actionprompt/ActionPromptHeaderPanel.java | 4 +-
.../actions/ActionParametersPanel.java | 3 +-
.../entitysimplelink/EntityLinkSimplePanel.java | 7 +-
.../viewer/wicket/ui/pages/PageAbstract.java | 9 +-
.../ui/pages/actionprompt/ActionPromptPage.java | 4 -
.../wicket/ui/pages/entity/EntityPage.java | 47 ++--
.../wicket/ui/panels/FormExecutorAbstract.java | 32 ++-
.../wicket/ui/panels/PromptFormAbstract.java | 50 +----
16 files changed, 369 insertions(+), 124 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
index 80207f8..db5a5d4 100644
--- a/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
+++ b/core/viewer-wicket-impl/src/main/java/org/apache/isis/viewer/wicket/viewer/IsisWicketApplication.java
@@ -35,14 +35,11 @@ import com.google.inject.Injector;
import com.google.inject.Module;
import org.apache.wicket.Application;
-import org.apache.wicket.Component;
import org.apache.wicket.ConverterLocator;
import org.apache.wicket.IConverterLocator;
import org.apache.wicket.Page;
import org.apache.wicket.RuntimeConfigurationType;
import org.apache.wicket.SharedResources;
-import org.apache.wicket.application.IComponentOnAfterRenderListener;
-import org.apache.wicket.application.IComponentOnBeforeRenderListener;
import org.apache.wicket.authentication.IAuthenticationStrategy;
import org.apache.wicket.authentication.strategy.DefaultAuthenticationStrategy;
import org.apache.wicket.authroles.authentication.AuthenticatedWebApplication;
@@ -69,7 +66,6 @@ import org.apache.isis.core.commons.config.IsisConfiguration;
import org.apache.isis.core.commons.config.IsisConfigurationDefault;
import org.apache.isis.core.commons.configbuilder.IsisConfigurationBuilder;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.specloader.validator.MetaModelInvalidException;
import org.apache.isis.core.runtime.logging.IsisLoggingConfigurer;
@@ -317,9 +313,11 @@ public class IsisWicketApplication
@SuppressWarnings("unused")
SharedResources sharedResources = getSharedResources();
- final DisableConcurrencyCheckingOnRenderListener listenr = new DisableConcurrencyCheckingOnRenderListener();
- getComponentPreOnBeforeRenderListeners().add(listenr);
- getComponentOnAfterRenderListeners().add(listenr);
+ // hmm, this design doesn't work as expected, called before every component is rendered
+ // instead just override onBeforeRender/onAfterRender in EntityPage
+// final DisableConcurrencyCheckingOnRenderListener listenr = new DisableConcurrencyCheckingOnRenderListener();
+// getComponentPreOnBeforeRenderListeners().add(listenr);
+// getComponentOnAfterRenderListeners().add(listenr);
final MetaModelInvalidException mmie = IsisContext.getMetaModelInvalidExceptionIfAny();
if(mmie != null) {
@@ -878,29 +876,33 @@ public class IsisWicketApplication
return settings;
}
- private static class DisableConcurrencyCheckingOnRenderListener
- implements IComponentOnBeforeRenderListener, IComponentOnAfterRenderListener {
-
- private static ThreadLocal<AdapterManager.ConcurrencyChecking> concurrencyChecking =
- new ThreadLocal<AdapterManager.ConcurrencyChecking>() {
- protected AdapterManager.ConcurrencyChecking initialValue() {
- return null;
- }
- };
-
- @Override
- public void onBeforeRender(final Component component) {
- final AdapterManager.ConcurrencyChecking prior = AdapterManager.ConcurrencyChecking.disable();
- concurrencyChecking.set(prior);
- }
-
- @Override
- public void onAfterRender(final Component component) {
- final AdapterManager.ConcurrencyChecking prior = DisableConcurrencyCheckingOnRenderListener.concurrencyChecking.get();
- if(prior != null) {
- AdapterManager.ConcurrencyChecking.reset(prior);
- }
- DisableConcurrencyCheckingOnRenderListener.concurrencyChecking.remove();
- }
- }
+// private static class DisableConcurrencyCheckingOnRenderListener
+// implements IComponentOnBeforeRenderListener, IComponentOnAfterRenderListener {
+//
+// private static ThreadLocal<AdapterManager.ConcurrencyChecking> concurrencyChecking =
+// new ThreadLocal<AdapterManager.ConcurrencyChecking>() {
+// protected AdapterManager.ConcurrencyChecking initialValue() {
+// return null;
+// }
+// };
+//
+// @Override
+// public void onBeforeRender(final Component component) {
+// if(component instanceof Page) {
+// final AdapterManager.ConcurrencyChecking prior = AdapterManager.ConcurrencyChecking.disable();
+// concurrencyChecking.set(prior);
+// }
+// }
+//
+// @Override
+// public void onAfterRender(final Component component) {
+// if(component instanceof Page) {
+// final AdapterManager.ConcurrencyChecking prior = DisableConcurrencyCheckingOnRenderListener.concurrencyChecking.get();
+// if(prior != null) {
+// AdapterManager.ConcurrencyChecking.reset(prior);
+// }
+// DisableConcurrencyCheckingOnRenderListener.concurrencyChecking.remove();
+// }
+// }
+// }
}
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
index f9a8240..494c81a 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ActionModel.java
@@ -329,6 +329,11 @@ public class ActionModel extends BookmarkableModel<ObjectAdapter> implements For
this.actionMode = actionMode;
}
+ @Override
+ public EntityModel getParentEntityModel() {
+ return entityModel;
+ }
+
/**
* Copy constructor, as called by {@link #copy()}.
*/
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java
index 1dfa2ec..d47e108 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/BookmarkableModel.java
@@ -38,7 +38,7 @@ public abstract class BookmarkableModel<T> extends ModelAbstract<T> {
* So can be bookmarked / added to <tt>BookmarkedPagesModel</tt>.
*/
public abstract PageParameters getPageParameters();
-
+
public abstract boolean hasAsRootPolicy();
public abstract String getTitle();
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
index 65b6a7d..27b3fbd 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModel.java
@@ -154,7 +154,10 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
// //////////////////////////////////////////////////////////
public EntityModel() {
- this((ObjectAdapterMemento)null);
+ this.adapterMemento = null;
+ this.pendingModel = new PendingModel(this);
+ this.propertyScalarModels = Maps.newHashMap();
+ this.hintPageParameterSerializer = new HintPageParameterSerializer(this);
}
public EntityModel(final PageParameters pageParameters) {
@@ -493,7 +496,8 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
final ScalarModel scalarModel = propertyScalarModels.get(propertyMemento);
scalarModel.detach();
}
- propertyScalarModels.clear();
+ // we no longer clear these, because we want to call resetPropertyModels(...) after an object has been updated.
+ //propertyScalarModels.clear();
}
// //////////////////////////////////////////////////////////
@@ -605,18 +609,15 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
// tab and column metadata (if any)
// //////////////////////////////////////////////////////////
- private Object layoutMetadata;
-
public Object getLayoutMetadata() {
- return layoutMetadata;
+ return null;
}
/**
* Returns a new copy that SHARES the property scalar models (for edit form).
*/
public EntityModel cloneWithLayoutMetadata(final Object layoutMetadata) {
- final EntityModel entityModel = new EntityModel(this.propertyScalarModels, this.adapterMemento);
- entityModel.layoutMetadata = layoutMetadata;
+ final EntityModel entityModel = new EntityModelWithLayoutHints(this, layoutMetadata);
return entityModel;
}
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelWithLayoutHints.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelWithLayoutHints.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelWithLayoutHints.java
new file mode 100644
index 0000000..c142492
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/EntityModelWithLayoutHints.java
@@ -0,0 +1,215 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.wicket.model.models;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.request.mapper.parameter.PageParameters;
+
+import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
+import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
+import org.apache.isis.core.metamodel.spec.ObjectSpecification;
+import org.apache.isis.core.metamodel.specloader.SpecificationLoader;
+import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
+import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
+import org.apache.isis.viewer.wicket.model.mementos.PropertyMemento;
+
+/**
+ * This is a wrapper around {@link EntityModel} that adds in layout hints only but otherwise has the same identity
+ * as the underlying EntityModel.
+ *
+ * <p>
+ * This is to avoid concurrency check exceptions ... we only need to update the single EntityModel, and it is
+ * shared everywhere.
+ * </p>
+ */
+public class EntityModelWithLayoutHints extends EntityModel {
+
+ private static final long serialVersionUID = 1L;
+
+ private final EntityModel underlying;
+
+ private final Object layoutMetadata;
+
+ public EntityModelWithLayoutHints(final EntityModel underlying, final Object layoutMetadata) {
+ this.underlying = underlying;
+ this.layoutMetadata = layoutMetadata;
+ }
+
+ @Override
+ public Object getLayoutMetadata() {
+ return layoutMetadata;
+ }
+
+ @Override public void resetVersion() {
+ underlying.resetVersion();
+ }
+
+ @Override public PageParameters getPageParameters() {
+ return underlying.getPageParameters();
+ }
+
+ @Override public PageParameters getPageParametersWithoutUiHints() {
+ return underlying.getPageParametersWithoutUiHints();
+ }
+
+ @Override public String getHint(final Component component, final String keyName) {
+ return underlying.getHint(component, keyName);
+ }
+
+ @Override public void setHint(final Component component, final String keyName, final String hintValue) {
+ underlying.setHint(component, keyName, hintValue);
+ }
+
+ @Override public void clearHint(final Component component, final String attributeName) {
+ underlying.clearHint(component, attributeName);
+ }
+
+ @Override public String getTitle() {
+ return underlying.getTitle();
+ }
+
+ @Override public boolean hasAsRootPolicy() {
+ return underlying.hasAsRootPolicy();
+ }
+
+ @Override public boolean hasAsChildPolicy() {
+ return underlying.hasAsChildPolicy();
+ }
+
+ @Override public ObjectAdapterMemento getObjectAdapterMemento() {
+ return underlying.getObjectAdapterMemento();
+ }
+
+ @Override public ObjectSpecification getTypeOfSpecification() {
+ return underlying.getTypeOfSpecification();
+ }
+
+ @Override public ObjectAdapter load(final AdapterManager.ConcurrencyChecking concurrencyChecking) {
+ return underlying.load(concurrencyChecking);
+ }
+
+ @Override public ObjectAdapter load() {
+ return underlying.load();
+ }
+
+ @Override public void setObject(final ObjectAdapter adapter) {
+ underlying.setObject(adapter);
+ }
+
+ @Override public void setObjectMemento(
+ final ObjectAdapterMemento memento,
+ final PersistenceSession persistenceSession,
+ final SpecificationLoader specificationLoader) {
+ underlying.setObjectMemento(memento, persistenceSession, specificationLoader);
+ }
+
+ @Override public ScalarModel getPropertyModel(final PropertyMemento pm) {
+ return underlying.getPropertyModel(pm);
+ }
+
+ @Override public void resetPropertyModels() {
+ underlying.resetPropertyModels();
+ }
+
+ @Override public RenderingHint getRenderingHint() {
+ return underlying.getRenderingHint();
+ }
+
+ @Override public void setRenderingHint(final RenderingHint renderingHint) {
+ underlying.setRenderingHint(renderingHint);
+ }
+
+ @Override public ObjectAdapterMemento getContextAdapterIfAny() {
+ return underlying.getContextAdapterIfAny();
+ }
+
+ @Override public void setContextAdapterIfAny(final ObjectAdapterMemento contextAdapterIfAny) {
+ underlying.setContextAdapterIfAny(contextAdapterIfAny);
+ }
+
+ @Override public Mode getMode() {
+ return underlying.getMode();
+ }
+
+ @Override protected void setMode(final Mode mode) {
+ underlying.setMode(mode);
+ }
+
+ @Override public boolean isViewMode() {
+ return underlying.isViewMode();
+ }
+
+ @Override public boolean isEditMode() {
+ return underlying.isEditMode();
+ }
+
+ @Override public EntityModel toEditMode() {
+ return underlying.toEditMode();
+ }
+
+ @Override public EntityModel toViewMode() {
+ return underlying.toViewMode();
+ }
+
+ @Override protected void onDetach() {
+ underlying.onDetach();
+ }
+
+ @Override public void setException(final ConcurrencyException ex) {
+ underlying.setException(ex);
+ }
+
+ @Override public String getAndClearConcurrencyExceptionIfAny() {
+ return underlying.getAndClearConcurrencyExceptionIfAny();
+ }
+
+ @Override public ObjectAdapter getPendingElseCurrentAdapter() {
+ return underlying.getPendingElseCurrentAdapter();
+ }
+
+ @Override public ObjectAdapter getPendingAdapter() {
+ return underlying.getPendingAdapter();
+ }
+
+ @Override public ObjectAdapterMemento getPending() {
+ return underlying.getPending();
+ }
+
+ @Override public void setPending(final ObjectAdapterMemento selectedAdapterMemento) {
+ underlying.setPending(selectedAdapterMemento);
+ }
+
+ @Override public void clearPending() {
+ underlying.clearPending();
+ }
+
+ @Override public EntityModel cloneWithLayoutMetadata(final Object layoutMetadata) {
+ return underlying.cloneWithLayoutMetadata(layoutMetadata);
+ }
+
+ @Override public int hashCode() {
+ return underlying.hashCode();
+ }
+
+ @Override public boolean equals(final Object obj) {
+ return underlying.equals(obj);
+ }
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
index 542e866..e64e6c1 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/FormExecutorContext.java
@@ -21,7 +21,7 @@ package org.apache.isis.viewer.wicket.model.models;
import org.apache.isis.applib.annotation.PromptStyle;
-public interface FormExecutorContext {
+public interface FormExecutorContext extends ParentEntityModelProvider {
FormExecutor getFormExecutor();
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ParentEntityModelProvider.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ParentEntityModelProvider.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ParentEntityModelProvider.java
new file mode 100644
index 0000000..61f4b6f
--- /dev/null
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ParentEntityModelProvider.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.isis.viewer.wicket.model.models;
+
+public interface ParentEntityModelProvider {
+
+ EntityModel getParentEntityModel();
+
+}
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
index 80b962f..8c79da6 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/actionresponse/ActionResultResponseType.java
@@ -34,6 +34,7 @@ import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.viewer.wicket.model.models.ActionModel;
import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.model.models.ValueModel;
import org.apache.isis.viewer.wicket.model.models.VoidModel;
import org.apache.isis.viewer.wicket.ui.pages.entity.EntityPage;
@@ -50,8 +51,9 @@ public enum ActionResultResponseType {
}
@Override
- public ActionResultResponse interpretResult(final ActionModel model, ObjectAdapter targetAdapter, ConcurrencyException ex) {
- return toEntityPage(model, targetAdapter, ex);
+ public ActionResultResponse interpretResult(final ActionModel model, final ObjectAdapter targetAdapter, final ConcurrencyException ex) {
+ final ActionResultResponse actionResultResponse = toEntityPage(model, targetAdapter, ex);
+ return actionResultResponse;
}
},
COLLECTION {
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java
index 4d2e98e..59a26dc 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actionprompt/ActionPromptHeaderPanel.java
@@ -20,11 +20,11 @@ package org.apache.isis.viewer.wicket.ui.components.actionprompt;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.AbstractReadOnlyModel;
+
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.facets.all.named.NamedFacet;
import org.apache.isis.core.metamodel.spec.feature.ObjectAction;
import org.apache.isis.viewer.wicket.model.models.ActionModel;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.ui.ComponentType;
import org.apache.isis.viewer.wicket.ui.panels.PanelAbstract;
@@ -40,7 +40,7 @@ public class ActionPromptHeaderPanel extends PanelAbstract<ActionModel> {
ObjectAdapter targetAdapter = model.getTargetAdapter();
- getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.ENTITY_ICON_AND_TITLE, new EntityModel(targetAdapter));
+ getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.ENTITY_ICON_AND_TITLE, model.getParentEntityModel());
final Label label = new Label(ID_ACTION_NAME, new AbstractReadOnlyModel<String>() {
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java
index 821f3ff..af32122 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/actions/ActionParametersPanel.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.viewer.wicket.model.models.ActionModel;
import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
-import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.ui.ComponentType;
import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponse;
import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseType;
@@ -108,7 +107,7 @@ public class ActionParametersPanel extends PanelAbstract<ActionModel> {
targetAdapter = actionModel.getTargetAdapter();
getComponentFactoryRegistry().addOrReplaceComponent(this, ComponentType.PARAMETERS, getActionModel());
- getComponentFactoryRegistry().addOrReplaceComponent(header, ComponentType.ENTITY_ICON_AND_TITLE, new EntityModel(targetAdapter));
+ getComponentFactoryRegistry().addOrReplaceComponent(header, ComponentType.ENTITY_ICON_AND_TITLE, actionModel.getParentEntityModel());
final String actionName = getActionModel().getActionMemento().getAction(actionModel.getSpecificationLoader()).getName();
header.add(new Label(ID_ACTION_NAME, Model.of(actionName)));
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
index de016cb..6e723e5 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/widgets/entitysimplelink/EntityLinkSimplePanel.java
@@ -28,7 +28,6 @@ import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.ui.ComponentFactory;
import org.apache.isis.viewer.wicket.ui.ComponentType;
-import org.apache.isis.viewer.wicket.ui.components.unknown.UnknownModelPanelFactory;
import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.CancelHintRequired;
import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormComponentPanelAbstract;
@@ -75,10 +74,8 @@ public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdap
final ObjectAdapter adapter = getEntityModel().getObject(); // getPendingElseCurrentAdapter();
if (adapter != null) {
- final EntityModel entityModelForLink = new EntityModel(adapter);
- entityModelForLink.setContextAdapterIfAny(getEntityModel().getContextAdapterIfAny());
- entityModelForLink.setRenderingHint(getEntityModel().getRenderingHint());
-
+ final EntityModel entityModelForLink = getEntityModel();
+
final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
final Component component = componentFactory.createComponent(ID_ENTITY_ICON_AND_TITLE, entityModelForLink);
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
index 23ea2b3..b46a67f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/PageAbstract.java
@@ -66,6 +66,7 @@ import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.viewer.wicket.model.common.PageParametersUtils;
import org.apache.isis.viewer.wicket.model.hints.IsisEnvelopeEvent;
import org.apache.isis.viewer.wicket.model.hints.IsisEventLetterAbstract;
+import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
@@ -284,9 +285,9 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
}
String markupId = null;
- EntityModel entityModel = getUiHintContainerIfAny();
- if(entityModel != null) {
- String path = entityModel.getHint(getPage(), PageAbstract.UIHINT_FOCUS);
+ UiHintContainer hintContainer = getUiHintContainerIfAny();
+ if(hintContainer != null) {
+ String path = hintContainer.getHint(getPage(), PageAbstract.UIHINT_FOCUS);
if(path != null) {
Component childComponent = get(path);
if(childComponent != null) {
@@ -303,7 +304,7 @@ public abstract class PageAbstract extends WebPage implements ActionPromptProvid
}
- protected EntityModel getUiHintContainerIfAny() {
+ protected UiHintContainer getUiHintContainerIfAny() {
return null;
}
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
index 156e36e..d3d0814 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/actionprompt/ActionPromptPage.java
@@ -19,7 +19,6 @@
package org.apache.isis.viewer.wicket.ui.pages.actionprompt;
-import org.apache.wicket.Component;
import org.apache.wicket.authroles.authorization.strategies.role.annotations.AuthorizeInstantiation;
import org.apache.wicket.request.mapper.parameter.PageParameters;
@@ -38,9 +37,6 @@ public class ActionPromptPage extends PageAbstract {
private static final long serialVersionUID = 1L;
- /**
- * For use with {@link Component#setResponsePage(org.apache.wicket.Page)}
- */
public ActionPromptPage(final ActionModel model) {
super(new PageParameters(), model.getActionMemento().getAction(model.getSpecificationLoader()).getName(), ComponentType.ACTION_PROMPT);
addChildComponents(themeDiv, model);
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
index f19c7c7..8b0ae6d 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/pages/entity/EntityPage.java
@@ -29,7 +29,7 @@ import org.apache.wicket.util.string.Strings;
import org.apache.isis.applib.layout.component.Grid;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager.ConcurrencyChecking;
+import org.apache.isis.core.metamodel.adapter.mgr.AdapterManager;
import org.apache.isis.core.metamodel.adapter.version.ConcurrencyException;
import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
@@ -38,6 +38,7 @@ import org.apache.isis.core.metamodel.facets.object.grid.GridFacet;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.feature.ObjectMember;
import org.apache.isis.viewer.wicket.model.common.PageParametersUtils;
+import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.ui.ComponentType;
import org.apache.isis.viewer.wicket.ui.components.widgets.breadcrumbs.BreadcrumbModel;
@@ -128,30 +129,34 @@ public class EntityPage extends PageAbstract {
}
@Override
- public EntityModel getUiHintContainerIfAny() {
+ public UiHintContainer getUiHintContainerIfAny() {
return model;
}
- /**
- * A rather crude way of intercepting the redirect-and-post strategy.
- *
- * <p>
- * Performs eager loading of corresponding {@link EntityModel}, with
- * {@link ConcurrencyChecking#NO_CHECK no} concurrency checking.
- */
+// private static ThreadLocal<AdapterManager.ConcurrencyChecking> concurrencyChecking =
+// new ThreadLocal<AdapterManager.ConcurrencyChecking>() {
+// protected AdapterManager.ConcurrencyChecking initialValue() {
+// return null;
+// }
+// };
+
+ @Override
+ public void onBeforeRender() {
+ final AdapterManager.ConcurrencyChecking prior = AdapterManager.ConcurrencyChecking.disable();
+ //concurrencyChecking.set(prior);
+ super.onBeforeRender();
+ }
+
@Override
- protected void onBeforeRender() {
-
-
- ConcurrencyChecking.executeWithConcurrencyCheckingDisabled(
- new Runnable() {
- @Override
- public void run() {
- EntityPage.this.model.load(ConcurrencyChecking.NO_CHECK);
- EntityPage.super.onBeforeRender();
- }
- }
- );
+ public void onAfterRender() {
+ super.onAfterRender();
+
+// final AdapterManager.ConcurrencyChecking prior = concurrencyChecking.get();
+// if(prior != null) {
+// AdapterManager.ConcurrencyChecking.reset(prior);
+ AdapterManager.ConcurrencyChecking.reset(AdapterManager.ConcurrencyChecking.CHECK);
+// }
+// concurrencyChecking.remove();
}
private void buildPage() {
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
index 97611da..a11c44a 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/FormExecutorAbstract.java
@@ -31,11 +31,13 @@ import org.apache.isis.core.runtime.system.persistence.PersistenceSession;
import org.apache.isis.core.runtime.system.session.IsisSessionFactory;
import org.apache.isis.core.runtime.system.transaction.IsisTransactionManager;
import org.apache.isis.viewer.wicket.model.models.BookmarkableModel;
+import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.model.models.FormExecutor;
+import org.apache.isis.viewer.wicket.model.models.ParentEntityModelProvider;
import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import org.apache.isis.viewer.wicket.ui.actionresponse.ActionResultResponseHandlingStrategy;
-public abstract class FormExecutorAbstract<M extends BookmarkableModel<ObjectAdapter>> implements FormExecutor {
+public abstract class FormExecutorAbstract<M extends BookmarkableModel<ObjectAdapter> & ParentEntityModelProvider> implements FormExecutor {
protected final M model;
@@ -107,7 +109,33 @@ public abstract class FormExecutorAbstract<M extends BookmarkableModel<ObjectAda
// flush any queued changes, so concurrency or violation exceptions (if any)
// will be thrown here
getTransactionManager().flushTransaction();
+ getPersistenceSession().getPersistenceManager().flush();
+
+ // update target, since version updated (concurrency checks)
+ final EntityModel parentEntityModel = model.getParentEntityModel();
+ parentEntityModel.resetVersion();
+ parentEntityModel.resetPropertyModels();
+
+ // // don't need to do this, can instead use resetPropertyModels() on EntityModel, see above...
+ // final Page page = target.getPage();
+ // if (page instanceof EntityPage) {
+ //
+ // page.visitChildren(new IVisitor<Component, Object>() {
+ // @Override
+ // public void component(
+ // final Component component,
+ // final IVisit<Object> visit) {
+ //
+ // final IModel<?> componentModel = component.getDefaultModel();
+ // if (componentModel instanceof ScalarModel) {
+ // final ScalarModel scalarModel = (ScalarModel) componentModel;
+ // scalarModel.reset();
+ // }
+ // }
+ // });
+ // }
+ onExecuteAndProcessResults(target);
if(promptStyle == PromptStyle.INLINE) {
@@ -119,8 +147,6 @@ public abstract class FormExecutorAbstract<M extends BookmarkableModel<ObjectAda
}
- onExecuteAndProcessResults(target);
-
return true;
} catch (RuntimeException ex) {
http://git-wip-us.apache.org/repos/asf/isis/blob/3ff8f7a8/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
index a328b89..23d249d 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/panels/PromptFormAbstract.java
@@ -21,19 +21,15 @@ import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.util.string.AppendingStringBuffer;
-import org.apache.wicket.util.visit.IVisit;
-import org.apache.wicket.util.visit.IVisitor;
import org.apache.isis.applib.annotation.PromptStyle;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
-import org.apache.isis.core.runtime.system.context.IsisContext;
+import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
import org.apache.isis.viewer.wicket.model.isis.WicketViewerSettings;
-import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
import org.apache.isis.viewer.wicket.model.models.ActionPrompt;
import org.apache.isis.viewer.wicket.model.models.ActionPromptProvider;
import org.apache.isis.viewer.wicket.model.models.EntityModel;
import org.apache.isis.viewer.wicket.model.models.FormExecutorContext;
-import org.apache.isis.viewer.wicket.model.models.ScalarModel;
import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarModelSubscriber2;
import org.apache.isis.viewer.wicket.ui.components.scalars.ScalarPanelAbstract2;
import org.apache.isis.viewer.wicket.ui.components.widgets.formcomponent.FormFeedbackPanel;
@@ -94,7 +90,7 @@ public abstract class PromptFormAbstract<T extends IModel<ObjectAdapter> & FormE
protected AjaxButton addOkButton() {
- final IModel<ObjectAdapter> model = getModel();
+// final IModel<ObjectAdapter> model = getModel();
AjaxButton okButton = settings.isUseIndicatorForFormSubmit()
? new IndicatingAjaxButton(ID_OK_BUTTON, new ResourceModel("okLabel")) {
@@ -108,34 +104,9 @@ public abstract class PromptFormAbstract<T extends IModel<ObjectAdapter> & FormE
actionPromptIfAny.closePrompt(target);
}
- final ObjectAdapter targetAdapter = model.getObject();
-
onSubmitOf(target, form, this);
- IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().flush();
- IsisContext.getSessionFactory().getCurrentSession().getPersistenceSession().getPersistenceManager()
- .flush();
- // update target, since version updated (concurrency checks)
- final Page page = target.getPage();
- if (page instanceof EntityPage) {
- final EntityPage entityPage = (EntityPage) page;
- final EntityModel pageModel = entityPage.getUiHintContainerIfAny();
- pageModel.setObject(targetAdapter);
-
- page.visitChildren(new IVisitor<Component, Object>() {
- @Override
- public void component(
- final Component component,
- final IVisit<Object> visit) {
-
- final IModel<?> componentModel = component.getDefaultModel();
- if (componentModel instanceof ScalarModel) {
- final ScalarModel scalarModel = (ScalarModel) componentModel;
- scalarModel.reset();
- }
- }
- });
- }
+
}
@Override
@@ -237,7 +208,7 @@ public abstract class PromptFormAbstract<T extends IModel<ObjectAdapter> & FormE
}
}
- private EntityModel getPageUiHintContainerIfAny() {
+ private UiHintContainer getPageUiHintContainerIfAny() {
Page page = getPage();
if (page instanceof EntityPage) {
EntityPage entityPage = (EntityPage) page;
@@ -292,16 +263,15 @@ public abstract class PromptFormAbstract<T extends IModel<ObjectAdapter> & FormE
// System.out.println("onSubmitOf, lastFocusedElementId = " + lastFocusedElementId);
// System.out.println("onSubmitOf, ajaxButton.getPath() = " + ajaxButton.getPath());
- final EntityModel entityModel = getPageUiHintContainerIfAny();
+ final UiHintContainer entityModel = getPageUiHintContainerIfAny();
if (entityModel == null) {
return;
}
- ObjectAdapterMemento oam = entityModel.getObjectAdapterMemento();
- if (oam == null) {
- return;
- }
- Component parentPanel = this.parentPanel;
- MarkupContainer parent = parentPanel.getParent();
+// ObjectAdapterMemento oam = entityModel.getObjectAdapterMemento();
+// if (oam == null) {
+// return;
+// }
+ MarkupContainer parent = this.parentPanel.getParent();
if (parent != null) {
entityModel.setHint(getPage(), PageAbstract.UIHINT_FOCUS, parent.getPageRelativePath());
}