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/01/19 11:09:30 UTC
[24/24] isis git commit: ISIS-785: reworks ObjectAdapterMemento so
can store a list of OAMs (equivalent to a transient list of persistent
entities) as well as a single OAM (equivalent to a single persistent entity).
ISIS-785: reworks ObjectAdapterMemento so can store a list of OAMs (equivalent to a transient list of persistent entities) as well as a single OAM (equivalent to a single persistent entity).
As of this commit (in testing with kitchensink's ReferenceObject#moveChildren) can select multiple objects in the UI, but cannot yet invoke the action.
Project: http://git-wip-us.apache.org/repos/asf/isis/repo
Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/fadb7ec7
Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/fadb7ec7
Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/fadb7ec7
Branch: refs/heads/maint-1.13.3
Commit: fadb7ec780de2a714b96b444429464e3f8b59c07
Parents: e114e6c
Author: Dan Haywood <da...@haywood-associates.co.uk>
Authored: Thu Jan 19 11:08:37 2017 +0000
Committer: Dan Haywood <da...@haywood-associates.co.uk>
Committed: Thu Jan 19 11:08:37 2017 +0000
----------------------------------------------------------------------
.../model/mementos/ObjectAdapterMemento.java | 208 +++++++++++++++++--
.../viewer/wicket/model/models/EntityModel.java | 10 +
.../viewer/wicket/model/models/ScalarModel.java | 30 +--
.../models/ScalarModelWithMultiPending.java | 26 +--
.../scalars/reference/ReferencePanel.java | 2 +-
.../entitysimplelink/EntityLinkSimplePanel.java | 22 +-
6 files changed, 244 insertions(+), 54 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
index a6ad7c5..d6d820e 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/mementos/ObjectAdapterMemento.java
@@ -20,11 +20,15 @@
package org.apache.isis.viewer.wicket.model.mementos;
import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import javax.annotation.Nullable;
import com.google.common.base.Function;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Lists;
import org.apache.isis.applib.services.bookmark.Bookmark;
import org.apache.isis.core.metamodel.adapter.ObjectAdapter;
@@ -51,7 +55,6 @@ public class ObjectAdapterMemento implements Serializable {
private static final long serialVersionUID = 1L;
public static final OidMarshaller OID_MARSHALLER = OidMarshaller.INSTANCE;
-
/**
* Factory method
*/
@@ -69,8 +72,109 @@ public class ObjectAdapterMemento implements Serializable {
return new ObjectAdapterMemento(rootOid);
}
- public Bookmark asBookmark() {
- return bookmark;
+ public static ObjectAdapterMemento createForList(final ArrayList<ObjectAdapterMemento> list) {
+ return new ObjectAdapterMemento(list);
+ }
+
+ public static ObjectAdapterMemento createForList(final Collection<ObjectAdapterMemento> list) {
+ return list != null ? createForList(Lists.newArrayList(list)) : null;
+ }
+
+ enum Sort {
+ /**
+ * represents a single object
+ */
+ SCALAR {
+
+ @Override
+ public ObjectAdapter asAdapter(
+ final ObjectAdapterMemento oam,
+ final PersistenceSession persistenceSession,
+ final SpecificationLoader specificationLoader) {
+ return oam.getObjectAdapter(ConcurrencyChecking.CHECK, persistenceSession, specificationLoader);
+ }
+
+ @Override
+ public int hashCode(final ObjectAdapterMemento oam) {
+ return oam.type.hashCode(oam);
+ }
+
+ @Override
+ public boolean equals(final ObjectAdapterMemento oam, final Object other) {
+ if (!(other instanceof ObjectAdapterMemento)) {
+ return false;
+ }
+ final ObjectAdapterMemento otherOam = (ObjectAdapterMemento) other;
+ if(otherOam.sort != SCALAR) {
+ return false;
+ }
+ return oam.type.equals(oam, (ObjectAdapterMemento) other);
+ }
+
+ @Override
+ public String asString(final ObjectAdapterMemento oam) {
+ return oam.type.toString(oam);
+ }
+ },
+ /**
+ * represents a list of objects
+ */
+ VECTOR {
+
+ @Override
+ public ObjectAdapter asAdapter(
+ final ObjectAdapterMemento oam,
+ final PersistenceSession persistenceSession,
+ final SpecificationLoader specificationLoader) {
+ final List<Object> listOfPojos =
+ Lists.newArrayList(
+ FluentIterable.from(oam.list)
+ .transform(Functions.toPojo(persistenceSession, specificationLoader))
+ .toList()
+ );
+ return ObjectAdapter.Functions.adapterForUsing(persistenceSession).apply(listOfPojos);
+ }
+
+ @Override
+ public int hashCode(final ObjectAdapterMemento oam) {
+ return oam.list.hashCode();
+ }
+
+ @Override
+ public boolean equals(final ObjectAdapterMemento oam, final Object other) {
+ if (!(other instanceof ObjectAdapterMemento)) {
+ return false;
+ }
+ final ObjectAdapterMemento otherOam = (ObjectAdapterMemento) other;
+ if(otherOam.sort != VECTOR) {
+ return false;
+ }
+ return oam.list.equals(otherOam.list);
+ }
+
+ @Override
+ public String asString(final ObjectAdapterMemento oam) {
+ return oam.list.toString();
+ }
+ };
+
+ void ensure(final Sort sort) {
+ if(this == sort) {
+ return;
+ }
+ throw new IllegalStateException("Memento is not for " + sort);
+ }
+
+ public abstract ObjectAdapter asAdapter(
+ final ObjectAdapterMemento oam,
+ final PersistenceSession persistenceSession,
+ final SpecificationLoader specificationLoader);
+
+ public abstract int hashCode(final ObjectAdapterMemento oam);
+
+ public abstract boolean equals(final ObjectAdapterMemento oam, final Object other);
+
+ public abstract String asString(final ObjectAdapterMemento oam);
}
enum Type {
@@ -227,47 +331,72 @@ public class ObjectAdapterMemento implements Serializable {
final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader);
}
+
+
+ private final Sort sort;
+
+ /**
+ * Populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
+ */
private Type type;
- private final ObjectSpecId objectSpecId;
+ /**
+ * Populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
+ */
+ private ObjectSpecId objectSpecId;
+ /**
+ * Populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
+ */
private String titleHint;
/**
- * The current value, if {@link Type#ENCODEABLE}.
- *
+ * The current value, if {@link Type#ENCODEABLE}; will be <tt>null</tt> otherwise.
+ *
* <p>
- * Will be <tt>null</tt> otherwise.
+ * Also, populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
*/
private String encodableValue;
/**
- * The current value, if {@link Type#PERSISTENT}.
- *
+ * The current value, if {@link Type#PERSISTENT}, will be <tt>null</tt> otherwise.
+ *
* <p>
- * Will be <tt>null</tt> otherwise.
+ * Also, populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
*/
private String persistentOidStr;
/**
- * The current value, if {@link Type#PERSISTENT}.
+ * The current value, if {@link Type#PERSISTENT}, will be <tt>null</tt> otherwise.
*
* <p>
- * Will be <tt>null</tt> otherwise.
+ * Also, populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
*/
private Bookmark bookmark;
/**
- * The current value, if {@link Type#TRANSIENT}.
- *
+ * The current value, if {@link Type#TRANSIENT}, will be <tt>null</tt> otherwise.
+ *
* <p>
- * Will be <tt>null</tt> otherwise.
+ * Also, populated only if {@link #getSort() sort} is {@link Sort#SCALAR scalar}
*/
private Memento transientMemento;
+ /**
+ * opulated only if {@link #getSort() sort} is {@link Sort#VECTOR vector}
+ */
+ private ArrayList<ObjectAdapterMemento> list;
+
+ public ObjectAdapterMemento(final ArrayList<ObjectAdapterMemento> list) {
+ this.sort = Sort.VECTOR;
+ this.list = list;
+ }
+
private ObjectAdapterMemento(final RootOid rootOid) {
assert !rootOid.isTransient();
+ this.sort = Sort.SCALAR;
+
this.persistentOidStr = rootOid.enString();
this.bookmark = rootOid.asBookmark();
this.objectSpecId = rootOid.getObjectSpecId();
@@ -278,6 +407,7 @@ public class ObjectAdapterMemento implements Serializable {
if (adapter == null) {
throw new IllegalArgumentException("adapter cannot be null");
}
+ this.sort = Sort.SCALAR;
final ObjectSpecification specification = adapter.getSpecification();
objectSpecId = specification.getSpecId();
init(adapter);
@@ -307,11 +437,34 @@ public class ObjectAdapterMemento implements Serializable {
type = Type.PERSISTENT;
}
+ public Sort getSort() {
+ return sort;
+ }
+
+ public ArrayList<ObjectAdapterMemento> getList() {
+ ensureVector();
+ return list;
+ }
+
+ public ObjectAdapter asAdapter(
+ final PersistenceSession persistenceSession,
+ final SpecificationLoader specificationLoader) {
+ return sort.asAdapter(this, persistenceSession, specificationLoader);
+ }
+
+
public void resetVersion(
- final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
+ final PersistenceSession persistenceSession,
+ final SpecificationLoader specificationLoader) {
+ ensureScalar();
type.resetVersion(this, persistenceSession, specificationLoader);
}
-
+
+
+ public Bookmark asBookmark() {
+ ensureScalar();
+ return bookmark;
+ }
/**
* Lazily looks up {@link ObjectAdapter} if required.
@@ -327,6 +480,7 @@ public class ObjectAdapterMemento implements Serializable {
final ConcurrencyChecking concurrencyChecking,
final PersistenceSession persistenceSession,
final SpecificationLoader specificationLoader) {
+ ensureScalar();
return type.getAdapter(this, concurrencyChecking, persistenceSession, specificationLoader);
}
@@ -339,10 +493,12 @@ public class ObjectAdapterMemento implements Serializable {
* @param adapter
*/
public void setAdapter(final ObjectAdapter adapter) {
+ ensureScalar();
init(adapter);
}
public ObjectSpecId getObjectSpecId() {
+ ensureScalar();
return objectSpecId;
}
@@ -354,6 +510,9 @@ public class ObjectAdapterMemento implements Serializable {
List<ObjectAdapterMemento> list,
final PersistenceSession persistenceSession,
final SpecificationLoader specificationLoader) {
+
+ ensureScalar();
+
// REVIEW: heavy handed, ought to be possible to just compare the OIDs
// ignoring the concurrency checking
final ObjectAdapter currAdapter = getObjectAdapter(ConcurrencyChecking.NO_CHECK, persistenceSession,
@@ -373,12 +532,12 @@ public class ObjectAdapterMemento implements Serializable {
@Override
public int hashCode() {
- return type.hashCode(this);
+ return sort.hashCode(this);
}
@Override
public boolean equals(Object obj) {
- return (obj instanceof ObjectAdapterMemento) && type.equals(this, (ObjectAdapterMemento)obj);
+ return sort.equals(this, obj);
}
@@ -388,7 +547,7 @@ public class ObjectAdapterMemento implements Serializable {
}
public String asString() {
- return type.toString(this);
+ return sort.asString(this);
}
@@ -517,5 +676,14 @@ public class ObjectAdapterMemento implements Serializable {
}
}
+ private void ensureScalar() {
+ getSort().ensure(Sort.SCALAR);
+ }
+
+ private void ensureVector() {
+ getSort().ensure(Sort.VECTOR);
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/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 8cb4726..74c1c3a 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
@@ -43,6 +43,8 @@ import org.apache.isis.core.metamodel.consent.InteractionInitiatedBy;
import org.apache.isis.core.metamodel.facets.object.bookmarkpolicy.BookmarkPolicyFacet;
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
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.common.PageParametersUtils;
import org.apache.isis.viewer.wicket.model.hints.UiHintContainer;
import org.apache.isis.viewer.wicket.model.mementos.ObjectAdapterMemento;
@@ -355,6 +357,14 @@ public class EntityModel extends BookmarkableModel<ObjectAdapter> implements UiH
adapterMemento = ObjectAdapterMemento.createOrNull(adapter);
}
+ public void setObjectMemento(
+ final ObjectAdapterMemento memento,
+ final PersistenceSession persistenceSession,
+ final SpecificationLoader specificationLoader) {
+ super.setObject(memento.asAdapter(persistenceSession, specificationLoader));
+ adapterMemento = memento;
+ }
+
// //////////////////////////////////////////////////////////
// PropertyModels
http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
index 6d9cba9..d0a6c07 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModel.java
@@ -39,8 +39,6 @@ import org.apache.isis.core.metamodel.deployment.DeploymentCategory;
import org.apache.isis.core.metamodel.facetapi.Facet;
import org.apache.isis.core.metamodel.facetapi.FacetHolder;
import org.apache.isis.core.metamodel.facetapi.FeatureType;
-import org.apache.isis.core.metamodel.facets.actcoll.typeof.TypeOfFacet;
-import org.apache.isis.core.metamodel.facets.collparam.semantics.CollectionSemantics;
import org.apache.isis.core.metamodel.facets.object.parseable.ParseableFacet;
import org.apache.isis.core.metamodel.facets.object.viewmodel.ViewModelFacet;
import org.apache.isis.core.metamodel.facets.objectvalue.fileaccept.FileAcceptFacet;
@@ -51,7 +49,6 @@ import org.apache.isis.core.metamodel.facets.value.string.StringValueSemanticsPr
import org.apache.isis.core.metamodel.spec.ObjectSpecId;
import org.apache.isis.core.metamodel.spec.ObjectSpecification;
import org.apache.isis.core.metamodel.spec.feature.ObjectActionParameter;
-import org.apache.isis.core.metamodel.spec.feature.OneToManyActionParameter;
import org.apache.isis.core.metamodel.spec.feature.OneToOneAssociation;
import org.apache.isis.viewer.wicket.model.links.LinkAndLabel;
import org.apache.isis.viewer.wicket.model.links.LinksProvider;
@@ -511,14 +508,20 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
return objectAdapter;
}
- // return an empty collection
- // TODO: this should probably move down into OneToManyActionParameter impl
- final OneToManyActionParameter otmap = (OneToManyActionParameter) actionParameter;
- final CollectionSemantics collectionSemantics = otmap.getCollectionSemantics();
- final TypeOfFacet typeOfFacet = actionParameter.getFacet(TypeOfFacet.class);
- final Class<?> elementType = typeOfFacet.value();
- final Object emptyCollection = collectionSemantics.emptyCollectionOf(elementType);
- return scalarModel.getCurrentSession().getPersistenceSession().adapterFor(emptyCollection);
+
+ // hmmm... I think we should simply return null, as an indicator that there is no "pending" (see ScalarModelWithMultiPending)
+
+// // return an empty collection
+// // TODO: this should probably move down into OneToManyActionParameter impl
+// final OneToManyActionParameter otmap = (OneToManyActionParameter) actionParameter;
+// final CollectionSemantics collectionSemantics = otmap.getCollectionSemantics();
+// final TypeOfFacet typeOfFacet = actionParameter.getFacet(TypeOfFacet.class);
+// final Class<?> elementType = typeOfFacet.value();
+// final Object emptyCollection = collectionSemantics.emptyCollectionOf(elementType);
+// return scalarModel.getCurrentSession().getPersistenceSession().adapterFor(emptyCollection);
+
+ return objectAdapter;
+
}
@Override
@@ -873,13 +876,12 @@ public class ScalarModel extends EntityModel implements LinksProvider,HasExecuti
@Override
public ArrayList<ObjectAdapterMemento> getPending() {
final ObjectAdapterMemento pending = ScalarModel.this.getPending();
- return Util.asMementoList(pending, getPersistenceSession(), getSpecificationLoader());
+ return pending != null ? pending.getList() : null;
}
@Override
public void setPending(final ArrayList<ObjectAdapterMemento> pending) {
- final ObjectAdapter list = Util.toAdapter(pending, getPersistenceSession(), getSpecificationLoader());
- final ObjectAdapterMemento adapterMemento = ObjectAdapterMemento.createOrNull(list);
+ final ObjectAdapterMemento adapterMemento = ObjectAdapterMemento.createForList(pending);
ScalarModel.this.setPending(adapterMemento);
}
http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
index e57494b..1a824cc 100644
--- a/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
+++ b/core/viewer-wicket-model/src/main/java/org/apache/isis/viewer/wicket/model/models/ScalarModelWithMultiPending.java
@@ -58,11 +58,12 @@ public interface ScalarModelWithMultiPending extends Serializable {
@Override
public ArrayList<ObjectAdapterMemento> getObject() {
- if (owner.getPending() != null) {
+ final ArrayList<ObjectAdapterMemento> pending = owner.getPending();
+ if (pending != null) {
if (LOG.isDebugEnabled()) {
- LOG.debug("pending not null: " + owner.getPending().toString());
+ LOG.debug("pending not null: " + pending.toString());
}
- return owner.getPending();
+ return pending;
}
if (LOG.isDebugEnabled()) {
LOG.debug("pending is null");
@@ -70,11 +71,7 @@ public interface ScalarModelWithMultiPending extends Serializable {
final ScalarModel scalarModel = owner.getScalarModel();
final ObjectAdapterMemento objectAdapterMemento = scalarModel.getObjectAdapterMemento();
- ArrayList<ObjectAdapterMemento> mementos = asMementoList(objectAdapterMemento,
- scalarModel.getPersistenceSession(), scalarModel.getSpecificationLoader());
-
- owner.setPending(mementos);
- return mementos;
+ return objectAdapterMemento != null? objectAdapterMemento.getList(): null;
}
@Override
@@ -96,9 +93,8 @@ public interface ScalarModelWithMultiPending extends Serializable {
if (LOG.isDebugEnabled()) {
LOG.debug(String.format("setting to pending: %s", ownerPending.toString()));
}
- final ObjectAdapter objectAdapterOfListOfPojos =
- toAdapter(ownerPending, persistenceSession, specificationLoader);
- ownerScalarModel.setObject(objectAdapterOfListOfPojos);
+ ownerScalarModel.setObjectMemento(
+ ObjectAdapterMemento.createForList(adapterMemento), persistenceSession, specificationLoader);
}
}
}
@@ -142,10 +138,10 @@ public interface ScalarModelWithMultiPending extends Serializable {
public static ObjectAdapterMemento toAdapterMemento(
final Collection<ObjectAdapterMemento> modelObject,
- final PersistenceSession persistenceSession, final SpecificationLoader specificationLoader) {
- final ObjectAdapter objectAdapter = ScalarModelWithMultiPending.Util
- .toAdapter(Lists.newArrayList(modelObject), persistenceSession, specificationLoader);
- return ObjectAdapterMemento.createOrNull(objectAdapter);
+ final PersistenceSession persistenceSession,
+ final SpecificationLoader specificationLoader) {
+
+ return ObjectAdapterMemento.createForList(modelObject);
}
}
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
----------------------------------------------------------------------
diff --git a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
index 1d4c814..d23e63f 100644
--- a/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
+++ b/core/viewer-wicket-ui/src/main/java/org/apache/isis/viewer/wicket/ui/components/scalars/reference/ReferencePanel.java
@@ -240,7 +240,7 @@ public class ReferencePanel extends ScalarPanelAbstract {
final ComponentFactory componentFactory =
getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
- final Component component = componentFactory.createComponent(entityModelForLink);
+ final Component component = componentFactory.createComponent(ComponentType.ENTITY_ICON_AND_TITLE.getWicketId(), entityModelForLink);
componentForRegular.addOrReplace(component);
http://git-wip-us.apache.org/repos/asf/isis/blob/fadb7ec7/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 ed810b1..619a9f9 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,6 +28,7 @@ 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;
@@ -79,10 +80,23 @@ public class EntityLinkSimplePanel extends FormComponentPanelAbstract<ObjectAdap
entityModelForLink.setRenderingHint(getEntityModel().getRenderingHint());
final ComponentFactory componentFactory = getComponentFactoryRegistry().findComponentFactory(ComponentType.ENTITY_ICON_AND_TITLE, entityModelForLink);
- final Component component = componentFactory.createComponent(entityModelForLink);
- addOrReplace(component);
-
- permanentlyHide(ID_ENTITY_TITLE_NULL);
+
+ if(componentFactory instanceof UnknownModelPanelFactory) {
+
+// // TODO: this is a workaround, because the UnknownModelPanelFactory isn't resolving correctly...
+// addOrReplace(new Label(ID_ENTITY_TITLE_NULL, "(unknown)"));
+// permanentlyHide(ID_ENTITY_ICON_AND_TITLE);
+
+ final Component component = componentFactory.createComponent(ID_ENTITY_ICON_AND_TITLE, entityModelForLink);
+ addOrReplace(component);
+ permanentlyHide(ID_ENTITY_TITLE_NULL);
+ } else {
+ final Component component = componentFactory.createComponent(ID_ENTITY_ICON_AND_TITLE, entityModelForLink);
+ addOrReplace(component);
+ permanentlyHide(ID_ENTITY_TITLE_NULL);
+
+ }
+
} else {
// represent no object by a simple label displaying '(none)'
addOrReplace(new Label(ID_ENTITY_TITLE_NULL, "(none)"));