From 24562b6746851881b43cd474354701922220e76c Mon Sep 17 00:00:00 2001 From: j2blake Date: Fri, 21 Jun 2013 14:47:29 -0400 Subject: [PATCH] VIVO-140 Modify VClassGroupCache to provide a language-aware extract With very little change in the method calls, client code can get the VClasses and VClassGroups with labels that are appropriate for the preferred language in the current request. --- .../mannlib/vitro/webapp/beans/VClass.java | 23 +++++ .../vitro/webapp/beans/VClassGroup.java | 9 ++ .../webapp/dao/VClassGroupsForRequest.java | 93 +++++++++++++++++++ .../webapp/dao/jena/VClassGroupCache.java | 10 ++ 4 files changed, 135 insertions(+) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/dao/VClassGroupsForRequest.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/VClass.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/VClass.java index 41d4b8799..849cd7f5e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/VClass.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/VClass.java @@ -129,6 +129,29 @@ public class VClass extends BaseResourceBean implements Comparable localName = uri.getLocalName(); } + /** + * Constructs the VClass as a deep copy of an existing VClass. + */ + public VClass( VClass vc) { + this.URI = vc.URI; + this.namespace = vc.namespace; + this.localName = vc.localName; + this.myName = vc.myName; + this.myExample = vc.myExample; + this.myDescription = vc.myDescription; + this.myShortDefinition = vc.myShortDefinition; + this.myEntityCount = vc.myEntityCount; + this.displayLimit = vc.displayLimit; + this.displayRank = vc.displayRank; + this.quickEditJsp = vc.quickEditJsp; + this.groupURI = vc.groupURI; + this.group = (vc.group == null) ? null : new VClassGroup(vc.group); + this.customEntryForm = vc.customEntryForm; + this.customDisplayView = vc.customDisplayView; + this.customShortView = vc.customShortView; + this.customSearchView = vc.customSearchView; + } + /** * Sorts alphabetically by name */ diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/VClassGroup.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/VClassGroup.java index 734d02d42..8a975ff3f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/VClassGroup.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/beans/VClassGroup.java @@ -62,6 +62,15 @@ public class VClassGroup extends LinkedList implements Comparable groupMap = new LinkedHashMap<>(); + private final Map classMap = new HashMap<>(); + + public VClassGroupsForRequest(HttpServletRequest req, VClassGroupCache cache) { + this.req = req; + + for (VClassGroup vcGroup : cache.getGroups()) { + loadGroup(vcGroup); + } + + if (log.isDebugEnabled()) { + log.debug("groups: " + groupMap); + log.debug("classes: " + classMap); + } + } + + private void loadGroup(VClassGroup vcg) { + VClassGroup newVcg = new VClassGroup(vcg); + newVcg.setPublicName(getNameForGroup(vcg)); + groupMap.put(newVcg.getURI(), newVcg); + + for (VClass vClass : vcg) { + loadClass(vClass, newVcg); + } + } + + private String getNameForGroup(VClassGroup vcGroup) { + VClassGroup g = ModelAccess.on(req).getWebappDaoFactory() + .getVClassGroupDao().getGroupByURI(vcGroup.getURI()); + return (g == null) ? vcGroup.getPublicName() : g.getPublicName(); + } + + private void loadClass(VClass vc, VClassGroup newVcg) { + VClass newVc = new VClass(vc); + newVc.setName(getNameForVClass(vc)); + newVc.setGroup(newVcg); + newVcg.add(newVc); + classMap.put(newVc.getURI(), newVc); + } + + private String getNameForVClass(VClass vClass) { + VClass vc = ModelAccess.on(req).getWebappDaoFactory().getVClassDao() + .getVClassByURI(vClass.getURI()); + return (vc == null) ? vClass.getName() : vc.getName(); + } + + public VClassGroup getGroup(String vClassGroupURI) { + VClassGroup vcg = groupMap.get(vClassGroupURI); + log.debug("getGroup(" + vClassGroupURI + ") = " + vcg); + return vcg; + } + + public List getGroups() { + ArrayList groups = new ArrayList<>(groupMap.values()); + log.debug("getGroups() returned " + groups.size() + " groups."); + return groups; + } + + public VClass getCachedVClass(String classUri) { + VClass vc = classMap.get(classUri); + log.debug("getCachedVClass(" + classUri + ") = " + vc); + return vc; + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassGroupCache.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassGroupCache.java index 55c2c127c..4be2ed142 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassGroupCache.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VClassGroupCache.java @@ -10,6 +10,7 @@ import java.util.Map; import javax.servlet.ServletContext; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import javax.servlet.http.HttpServletRequest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -33,6 +34,7 @@ import edu.cornell.mannlib.vitro.webapp.beans.VClass; import edu.cornell.mannlib.vitro.webapp.beans.VClassGroup; import edu.cornell.mannlib.vitro.webapp.dao.ModelAccess; import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupDao; +import edu.cornell.mannlib.vitro.webapp.dao.VClassGroupsForRequest; import edu.cornell.mannlib.vitro.webapp.dao.VitroVocabulary; import edu.cornell.mannlib.vitro.webapp.dao.WebappDaoFactory; import edu.cornell.mannlib.vitro.webapp.dao.filtering.WebappDaoFactoryFiltering; @@ -227,6 +229,14 @@ public class VClassGroupCache implements IndexingEventListener { return (VClassGroupCache) sc.getAttribute(ATTRIBUTE_NAME); } + /** + * Use getVClassGroups(HttpServletRequest) to get a language-aware image of + * the cached groups and classes. + */ + public static VClassGroupsForRequest getVClassGroups(HttpServletRequest req) { + return new VClassGroupsForRequest(req, getVClassGroupCache(req.getSession().getServletContext())); + } + /** * Method that rebuilds the cache. This will use a WebappDaoFactory, * a SolrSever and maybe a ProhibitedFromSearch from the cache.context.