ISIS-1499: enhances BookmarkServiceDefault to also support lookup of domain services.
nb: requires that the bookmark's objectType is the fully qualified class name of the service. Project: http://git-wip-us.apache.org/repos/asf/isis/repo Commit: http://git-wip-us.apache.org/repos/asf/isis/commit/c8f56552 Tree: http://git-wip-us.apache.org/repos/asf/isis/tree/c8f56552 Diff: http://git-wip-us.apache.org/repos/asf/isis/diff/c8f56552 Branch: refs/heads/master Commit: c8f565523dd926edf9d690618face73a99524cf4 Parents: c5a7b5e Author: Dan Haywood <[email protected]> Authored: Tue Sep 27 18:04:18 2016 +0100 Committer: Dan Haywood <[email protected]> Committed: Tue Sep 27 18:04:18 2016 +0100 ---------------------------------------------------------------------- .../BookmarkServiceInternalDefault.java | 56 ++++++++++++++++++-- 1 file changed, 52 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/isis/blob/c8f56552/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java ---------------------------------------------------------------------- diff --git a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java index 7eb86f5..d4f9406 100644 --- a/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java +++ b/core/metamodel/src/main/java/org/apache/isis/core/metamodel/services/bookmarks/BookmarkServiceInternalDefault.java @@ -18,12 +18,20 @@ */ package org.apache.isis.core.metamodel.services.bookmarks; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; + +import com.google.common.collect.Maps; + import org.apache.isis.applib.annotation.DomainService; import org.apache.isis.applib.annotation.NatureOfService; import org.apache.isis.applib.annotation.Programmatic; import org.apache.isis.applib.services.bookmark.Bookmark; import org.apache.isis.applib.services.bookmark.BookmarkHolder; import org.apache.isis.applib.services.bookmark.BookmarkService2; +import org.apache.isis.applib.services.registry.ServiceRegistry2; import org.apache.isis.applib.services.wrapper.WrapperFactory; import org.apache.isis.core.metamodel.services.persistsession.PersistenceSessionServiceInternal; import org.apache.isis.core.runtime.persistence.ObjectNotFoundException; @@ -43,7 +51,6 @@ public class BookmarkServiceInternalDefault implements BookmarkService2 { @Programmatic - @Override public Object lookup( final BookmarkHolder bookmarkHolder, final FieldResetPolicy fieldResetPolicy) { @@ -58,9 +65,7 @@ public class BookmarkServiceInternalDefault implements BookmarkService2 { } - @Programmatic - @Override - public Object lookup( + private Object lookupInternal( final Bookmark bookmark, final FieldResetPolicy fieldResetPolicy) { if(bookmark == null) { @@ -73,6 +78,25 @@ public class BookmarkServiceInternalDefault implements BookmarkService2 { } } + + @Programmatic + @Override + public Object lookup( + final Bookmark bookmark, + final FieldResetPolicy fieldResetPolicy) { + if(bookmark == null) { + return null; + } + final String objectType = bookmark.getObjectType(); + final Object service = lookupService(objectType); + if(service != null) { + return service; + } + return lookupInternal(bookmark, fieldResetPolicy); + } + + + @Programmatic @Override public Object lookup(final Bookmark bookmark) { @@ -120,10 +144,34 @@ public class BookmarkServiceInternalDefault implements BookmarkService2 { + + + private Map<String,Object> servicesByClassName; + private Object lookupService(final String className) { + cacheServicesByClassNameIfNecessary(); + return servicesByClassName.get(className); + } + + private void cacheServicesByClassNameIfNecessary() { + if (servicesByClassName == null) { + final Map<String,Object> servicesByClassName = Maps.newHashMap(); + final List<Object> registeredServices = serviceRegistry2.getRegisteredServices(); + for (Object registeredService : registeredServices) { + final String serviceClassName = registeredService.getClass().getName(); + servicesByClassName.put(serviceClassName, registeredService); + } + this.servicesByClassName = servicesByClassName; + } + } + + @javax.inject.Inject PersistenceSessionServiceInternal persistenceSessionServiceInternal; @javax.inject.Inject private WrapperFactory wrapperFactory; + @Inject + ServiceRegistry2 serviceRegistry2; + }
