fix default feature tree for facts and name facts
[taxeditor.git] / eu.etaxonomy.taxeditor.store / src / main / java / eu / etaxonomy / taxeditor / store / TermManager.java
index 2005e46856acf7cef35b584f649739e090baf414..1ea29a343921b0bdebb1b564f5c6836733a34ca2 100644 (file)
@@ -11,27 +11,26 @@ package eu.etaxonomy.taxeditor.store;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.ui.IMemento;
-
-import eu.etaxonomy.cdm.model.common.DefinedTermBase;
-import eu.etaxonomy.cdm.model.common.TermBase;
-import eu.etaxonomy.cdm.model.common.TermType;
-import eu.etaxonomy.cdm.model.common.TermVocabulary;
-import eu.etaxonomy.taxeditor.model.ContextListenerAdapter;
+import eu.etaxonomy.cdm.model.term.DefinedTermBase;
+import eu.etaxonomy.cdm.model.term.TermBase;
+import eu.etaxonomy.cdm.model.term.TermType;
+import eu.etaxonomy.cdm.model.term.TermVocabulary;
+import eu.etaxonomy.taxeditor.model.DefaultTermComparator;
 import eu.etaxonomy.taxeditor.model.TaxonRelationshipTypeInverseContainer;
+import eu.etaxonomy.taxeditor.preference.PreferencesUtil;
 
 /**
  * @author n.hoffmann
  * @created Dec 7, 2010
  * @version 1.0
  */
-public class TermManager extends ContextListenerAdapter{
+public class TermManager {
 
        private static final String TERMS = "terms";
        private static final String TERM = "term";
@@ -40,10 +39,10 @@ public class TermManager extends ContextListenerAdapter{
        private static final String CLASS = "class";
        private static final String UUID_STRING = "uuid";
 
-       private final Map<String, Collection<UUID>> hiddenTermsMap = new HashMap<String, Collection<UUID>>();
+
+    private Map<Object, List> cachedTermMap = new HashMap<>();
 
        public TermManager(){
-               CdmStore.getContextManager().addContextListener(this);
        }
 
        /**
@@ -52,7 +51,12 @@ public class TermManager extends ContextListenerAdapter{
         * @return
         */
        public <T extends DefinedTermBase> List<T> getPreferredTerms(TermType termType){
-           return getFilteredTerms(TermStore.<T>getTerms(termType, null));
+           List terms = cachedTermMap.get(termType);
+           if(terms==null){
+               terms = getFilteredTerms(TermStore.<T>getTerms(termType, null));
+               cachedTermMap.put(termType, terms);
+           }
+        return terms;
        }
 
        /**
@@ -61,67 +65,45 @@ public class TermManager extends ContextListenerAdapter{
         * @return
         */
        public <T extends DefinedTermBase> List<T> getPreferredTerms(TermVocabulary<T> termVocabulary){
-           return getFilteredTerms(new ArrayList<T>(TermStore.getTerms(termVocabulary, null)));
+           List terms = cachedTermMap.get(termVocabulary);
+           if(terms==null){
+               terms = getFilteredTerms(new ArrayList<T>(TermStore.getTerms(termVocabulary,null)));
+               cachedTermMap.put(termVocabulary, terms);
+           }
+           return terms;
        }
 
+
+       /**
+    *
+    * @param clazz
+    * @return
+    */
+   public <T extends DefinedTermBase> List<T> getPreferredTerms(TermVocabulary<T> termVocabulary, Comparator comp){
+       if (comp == null){
+           comp = new DefaultTermComparator<T>();
+       }
+       List terms = cachedTermMap.get(termVocabulary);
+       if(terms==null){
+           terms = getFilteredTerms(new ArrayList<T>(TermStore.getTerms(termVocabulary,comp)));
+           cachedTermMap.put(termVocabulary, terms);
+       }
+       terms.sort(comp);
+       return terms;
+   }
        /**
         *
         * @param clazz
         * @return
         */
        public <T extends DefinedTermBase> List<T> getPreferredTerms(Class<T> clazz){
-               return getFilteredTerms(TermStore.getTerms(clazz));
-       }
-
-       @Override
-       public void contextStart(IMemento memento, IProgressMonitor monitor) {
-               // read preferred terms from memento into an in memory representation
-               if(memento == null){
-                       return;
-               }
-
-               IMemento terms = memento.getChild(TERMS);
-
-               if(terms == null){
-                       return;
-               }
-
-               for(IMemento term : terms.getChildren(TERM)){
-                       String typeName = term.getString(CLASS);
-                       Collection<UUID> hiddenTermUuids = new ArrayList<UUID>();
-                       for(IMemento hide : term.getChildren(HIDE)){
-                               String uuidString = hide.getString(UUID_STRING);
-                               UUID uuid = UUID.fromString(uuidString);
-                               hiddenTermUuids.add(uuid);
-                       }
-                       hiddenTermsMap.put(typeName, hiddenTermUuids);
-               }
-       }
-
-       @Override
-       public void contextStop(IMemento memento, IProgressMonitor monitor) {
-               saveTerms(memento, monitor);
-       }
-
-       @Override
-       public void workbenchShutdown(IMemento memento, IProgressMonitor monitor) {
-               saveTerms(memento, monitor);
-       }
-
-       private void saveTerms(IMemento memento, IProgressMonitor monitor){
-               if(memento == null) {
-            return;
-        }
+           List terms = cachedTermMap.get(clazz);
+           if(terms==null){
+               terms = getFilteredTerms(TermStore.getTerms(clazz));
+               cachedTermMap.put(clazz, terms);
 
-               IMemento terms = memento.createChild(TERMS);
-               for (String preferredTerm : hiddenTermsMap.keySet()){
-                       IMemento term = terms.createChild(TERM);
-                       term.putString(CLASS, preferredTerm);
-                       for(UUID uuid : hiddenTermsMap.get(preferredTerm)){
-                               IMemento hide = term.createChild(HIDE);
-                               hide.putString(UUID_STRING, uuid.toString());
-                       }
-               }
+           }
+           return terms;
        }
 
        /**
@@ -134,23 +116,17 @@ public class TermManager extends ContextListenerAdapter{
 
                List<T> filteredTerms = new ArrayList<T>();
 
-               String typeName = getTermClass(initialTerms);
-               Collection<UUID> hiddenTermUuids = hiddenTermsMap.get(typeName);
-
-
-               if(hiddenTermUuids == null){
-                       return initialTerms;
-               }
-
                for (T term : initialTerms){
+
                        if (term instanceof TaxonRelationshipTypeInverseContainer){
-                               if(! hiddenTermUuids.contains(((TaxonRelationshipTypeInverseContainer) term).getType().getUuid())){
+                               if(!PreferencesUtil.getBooleanValue(getPrefName(term))){
                                        T type = (T)((TaxonRelationshipTypeInverseContainer) term).getType();
                                        filteredTerms.add(type);
 
                                }
                        }
-                       if(! hiddenTermUuids.contains(term.getUuid())){
+
+                       if(!PreferencesUtil.getBooleanValue(getPrefName(term))){
                                filteredTerms.add(term);
                        }
                }
@@ -158,6 +134,11 @@ public class TermManager extends ContextListenerAdapter{
                return filteredTerms;
        }
 
+    private <T extends TermBase> String getPrefName(T term) {
+        return term.getTermType()!=null?term.getTermType().toString()+term.getUuid().toString():""+term.getUuid().toString();
+    }
+
+
        private <T extends DefinedTermBase> String getTermClass(Collection<T> initialTerms){
 
                String result = null;
@@ -175,202 +156,6 @@ public class TermManager extends ContextListenerAdapter{
            return null;
        }
 
-//     /**
-//      * <p>getPreferredSpecimenTypeDesignationStatus</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<SpecimenTypeDesignationStatus> getPreferredSpecimenTypeDesignationStatus() { return getFilteredTerms(TermStore.getSpecimenTypeDesignationStatus());}
-//
-//     /**
-//      * <p>getPreferredNameTypeDesignationStatus</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<NameTypeDesignationStatus> getPreferredNameTypeDesignationStatus() { return getFilteredTerms(TermStore.getNameTypeDesignationStatus()); }
-//
-//     /**
-//      * <p>getPreferredTaxonRelationshipTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<TaxonRelationshipType> getPreferredTaxonRelationshipTypes() { return getFilteredTerms(TermStore.getTaxonRelationshipTypes());}
-//
-//     private static List<TaxonRelationshipType> excludeTaxonRelationshipTypes = Arrays.asList(new TaxonRelationshipType[]{
-//                     TaxonRelationshipType.TAXONOMICALLY_INCLUDED_IN(),
-//                     TaxonRelationshipType.MISAPPLIED_NAME_FOR(),
-//                     TaxonRelationshipType.ALL_RELATIONSHIPS()
-//     });
-//
-//     /**
-//      * Please note that the {@link TaxonRelationshipType}s TAXONOMICALLY_INCLUDED_IN, MISAPPLIED_NAME_FOR and ALL_RELATIONSHIPS
-//      * are filtered out as they are most likely not needed. If you do need them please refactor this method to your needs.
-//      *
-//      * @return a list of {@link TaxonRelationshipTypeInverseContainer} elements
-//      */
-//     public List<TaxonRelationshipTypeInverseContainer> getPreferredRelationshipTypesWithInverses(){
-//             List<TaxonRelationshipTypeInverseContainer> relationshipTypeInverseContainers = new ArrayList<TaxonRelationshipTypeInverseContainer>();
-//
-//             List<TaxonRelationshipType> relationshipTypes = getPreferredTaxonRelationshipTypes();
-//
-//             relationshipTypes.removeAll(excludeTaxonRelationshipTypes);
-//
-//             for (TaxonRelationshipType relationshipType : relationshipTypes){
-//                     if(!relationshipType.isSymmetric()){
-//                             TaxonRelationshipTypeInverseContainer inverseContainer = new TaxonRelationshipTypeInverseContainer(relationshipType, true);
-//                             relationshipTypeInverseContainers.add(inverseContainer);
-//                     }
-//                     TaxonRelationshipTypeInverseContainer container = new TaxonRelationshipTypeInverseContainer(relationshipType, false);
-//                     relationshipTypeInverseContainers.add(container);
-//             }
-//
-//             return relationshipTypeInverseContainers;
-//     }
-
-
-
-
-//
-//     /**
-//      * <p>getPreferredFeatures</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<Feature> getPreferredFeatures() { return getFilteredTerms(TermStore.getFeatures());}
-//
-//     /**
-//      * <p>getPreferredRanks</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<Rank> getPreferredRanks() { return getFilteredTerms(TermStore.getRanks());}
-//
-//     /**
-//      * <p>getPreferredPresenceAbsenceTerms</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<PresenceAbsenceTermBase> getPreferredPresenceAbsenceTerms(){ return getFilteredTerms(TermStore.getPresenceAbsenceTerms());}
-//
-//     /**
-//      * <p>getPreferredNomenclaturalStatusTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<NomenclaturalStatusType> getPreferredNomenclaturalStatusTypes(){    return getFilteredTerms(TermStore.getNomenclaturalStatusTypes());}
-//
-//     /**
-//      * <p>getPreferredNameRelationshipTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<NameRelationshipType> getPreferredNameRelationshipTypes(){ return getFilteredTerms(TermStore.getNameRelationshipTypes());}
-//
-//     /**
-//      * <p>getPreferredLanguages</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<Language> getPreferredLanguages() { return getFilteredTerms(TermStore.getLanguages()); }
-//
-//     /**
-//      * <p>getPreferredMarkerTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<MarkerType> getPreferredMarkerTypes() { return getFilteredTerms(TermStore.getNonTechnicalMarkerTypes()); }
-//
-//     /**
-//      * <p>getPreferredExtensionTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<ExtensionType> getPreferredExtensionTypes() { return getFilteredTerms(TermStore.getExtensionTypes()); }
-//
-//     /**
-//      * <p>getPreferredRightsTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<RightsType> getPreferredRightsTypes() {     return getFilteredTerms(TermStore.getRightsTypes());}
-//
-//     /**
-//      * <p>getPreferredNamedAreaTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<NamedAreaType> getPreferredNamedAreaTypes() { return getFilteredTerms(TermStore.getNamedAreaTypes()); }
-//
-//     /**
-//      * <p>getPreferredNamedAreaTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<NamedAreaLevel> getPreferredNamedAreaLevels() { return getFilteredTerms(TermStore.getNamedAreaLevels()); }
-//
-//     /**
-//      * <p>getPreferredAnnotationTypes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<AnnotationType> getPreferredAnnotationTypes() { return getFilteredTerms(TermStore.getAnnotationTypes()); }
-//
-//     /**
-//      * <p>getPreferredStages</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<Stage> getPreferredStages() { return getFilteredTerms(TermStore.getStages()); }
-//
-//     /**
-//      * <p>getPreferredPreservationMethods</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<PreservationMethod> getPreferredPreservationMethods() { return getFilteredTerms(TermStore.getPreservationMethods()); }
-//
-//     /**
-//      * <p>getPreferredMeasurementUnits</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<MeasurementUnit> getPreferredMeasurementUnits() { return getFilteredTerms(TermStore.getMeasurementUnits()); }
-//
-//     /**
-//      * <p>getPreferredStates</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<State> getPreferredStates() { return getFilteredTerms(TermStore.getStates()); }
-//
-//     /**
-//      * <p>getPreferredModifiers</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<Modifier> getPreferredModifiers() { return getFilteredTerms(TermStore.getModifiers()); }
-//
-//     /**
-//      * <p>getPreferredStatisticalMeasures</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<StatisticalMeasure> getPreferredStatisticalMeasures() { return getFilteredTerms(TermStore.getStatisticalMeasures()); }
-//
-//     /**
-//      * <p>getPreferredScopes</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<Scope> getPreferredScopes() { return getFilteredTerms(TermStore.getScopes()); }
-//
-//     /**
-//      * <p>getPreferredDeterminationModifiers</p>
-//      *
-//      * @return a {@link java.util.List} object.
-//      */
-//     public List<DeterminationModifier> getPreferredDeterminationModifiers() { return getFilteredTerms(TermStore.getDeterminationModifiers()); }
-//
        /**
         * Generic method to set term preferences
         *
@@ -379,16 +164,48 @@ public class TermManager extends ContextListenerAdapter{
         * @param <T> a T object.
         */
        public <T extends DefinedTermBase> void setPreferredTerms(Collection<T> preferredTerms, Collection<T> initialTerms){
-               String typeName = getTermClass(initialTerms);
+       String typeName = getTermClass(initialTerms);
 
                Collection<UUID> undesiredTermUuids = new ArrayList<UUID>();
 
                for(TermBase term : initialTerms){
                        if(! preferredTerms.contains(term)){
                                undesiredTermUuids.add(term.getUuid());
+                               PreferencesUtil.setBooleanValue(getPrefName(term), true);
+                       }else{
+                           PreferencesUtil.setBooleanValue(getPrefName(term), false);
                        }
+
+
                }
 
-               hiddenTermsMap.put(typeName, undesiredTermUuids);
+
+       }
+
+
+       public void clearTermMapForTermType(TermType termType){
+           cachedTermMap.remove(termType);
        }
+
+       /**
+     * Generic method to get term preferences for a term vocabulary
+     *
+     * @param initialTerms a {@link java.util.List} object.
+     * @return a {@link java.util.List} object.
+     */
+    public <T extends DefinedTermBase> List<T> getTerms(List<UUID> uuidList, Class clazz){
+
+        List<T> filteredTerms = new ArrayList<T>();
+        List<T> terms = TermStore.getTerms(clazz);
+        if (uuidList.isEmpty()){
+            return terms;
+        }
+        for (T term : terms){
+            if(uuidList.contains(term.getUuid())){
+                filteredTerms.add(term);
+            }
+        }
+
+        return filteredTerms;
+    }
 }