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)"));