001 package com.poemspace.dm4; 002 003 import java.util.ArrayList; 004 import java.util.Collection; 005 import java.util.HashMap; 006 import java.util.List; 007 import java.util.Map; 008 import java.util.logging.Logger; 009 010 import de.deepamehta.core.AssociationDefinition; 011 import de.deepamehta.core.RelatedTopic; 012 import de.deepamehta.core.Topic; 013 import de.deepamehta.core.TopicType; 014 import de.deepamehta.core.service.DeepaMehtaService; 015 016 public class CriteriaCache { 017 018 private static Logger log = Logger.getLogger(CriteriaCache.class.getName()); 019 020 private List<Topic> types = null; 021 private List<String> typeUris = null; 022 023 private final DeepaMehtaService dms; 024 025 public CriteriaCache(DeepaMehtaService dms) { 026 this.dms = dms; 027 } 028 029 /** 030 * Returns all criteria types. 031 * 032 * @return list of all criteria associated type topics 033 */ 034 public List<Topic> getTypes() { 035 if (types == null) { 036 types = new ArrayList<Topic>(); 037 038 log.info("reveal criteria types"); 039 Map<String, Topic> typesByUri = new HashMap<String, Topic>(); 040 TopicType criteriaType = dms.getTopicType("dm4.poemspace.criteria.type"); 041 for (RelatedTopic type : criteriaType.getRelatedTopics("dm4.core.association", null, 042 null, null, false, false, 0)) { 043 typesByUri.put(type.getUri(), type); 044 } 045 046 // use order of person aggregates 047 TopicType personType = dms.getTopicType("dm4.contacts.person"); 048 Collection<AssociationDefinition> assocDefs = personType.getAssocDefs(); 049 050 for (AssociationDefinition assocDef : assocDefs) { 051 if (assocDef.getTypeUri().equals("dm4.core.aggregation_def")) { 052 if (typesByUri.containsKey(assocDef.getChildTypeUri())) { 053 log.info("use criteria uri " + assocDef.getChildTypeUri()); 054 types.add(typesByUri.get(assocDef.getChildTypeUri())); 055 } 056 } 057 } 058 } 059 return types; 060 } 061 062 /** 063 * Returns all criteria type URIs. 064 * 065 * @return list of all criteria associated type topic URIs 066 */ 067 public List<String> getTypeUris() { 068 if (typeUris == null) { 069 log.info("reveal criteria type URIs"); 070 typeUris = new ArrayList<String>(); 071 for (Topic type : getTypes()) { 072 typeUris.add(type.getUri()); 073 } 074 } 075 return typeUris; 076 } 077 078 }