src/core/net/sf/basedb/util/AnnotationUtil.java

Code
Comments
Other
Rev Date Author Line
4630 07 Nov 08 nicklas 1 /**
4630 07 Nov 08 nicklas 2   $Id$
4630 07 Nov 08 nicklas 3
4630 07 Nov 08 nicklas 4   Copyright (C) 2008 Nicklas Nordborg
4630 07 Nov 08 nicklas 5
4630 07 Nov 08 nicklas 6   This file is part of BASE - BioArray Software Environment.
4630 07 Nov 08 nicklas 7   Available at http://base.thep.lu.se/
4630 07 Nov 08 nicklas 8
4630 07 Nov 08 nicklas 9   BASE is free software; you can redistribute it and/or
4630 07 Nov 08 nicklas 10   modify it under the terms of the GNU General Public License
4630 07 Nov 08 nicklas 11   as published by the Free Software Foundation; either version 3
4630 07 Nov 08 nicklas 12   of the License, or (at your option) any later version.
4630 07 Nov 08 nicklas 13
4630 07 Nov 08 nicklas 14   BASE is distributed in the hope that it will be useful,
4630 07 Nov 08 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
4630 07 Nov 08 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
4630 07 Nov 08 nicklas 17   GNU General Public License for more details.
4630 07 Nov 08 nicklas 18
4630 07 Nov 08 nicklas 19   You should have received a copy of the GNU General Public License
4630 07 Nov 08 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
4630 07 Nov 08 nicklas 21 */
4630 07 Nov 08 nicklas 22 package net.sf.basedb.util;
4630 07 Nov 08 nicklas 23
6091 24 Aug 12 nicklas 24 import java.util.Collection;
4630 07 Nov 08 nicklas 25 import java.util.Collections;
6091 24 Aug 12 nicklas 26 import java.util.HashMap;
4630 07 Nov 08 nicklas 27 import java.util.HashSet;
6091 24 Aug 12 nicklas 28 import java.util.LinkedHashSet;
4630 07 Nov 08 nicklas 29 import java.util.LinkedList;
6091 24 Aug 12 nicklas 30 import java.util.Map;
4630 07 Nov 08 nicklas 31 import java.util.Queue;
4630 07 Nov 08 nicklas 32 import java.util.Set;
4630 07 Nov 08 nicklas 33
4630 07 Nov 08 nicklas 34 import net.sf.basedb.core.Annotatable;
4630 07 Nov 08 nicklas 35 import net.sf.basedb.core.BaseException;
4630 07 Nov 08 nicklas 36 import net.sf.basedb.core.DbControl;
5685 04 Aug 11 nicklas 37 import net.sf.basedb.core.DerivedBioAssay;
5749 19 Sep 11 nicklas 38 import net.sf.basedb.core.Extract;
7002 05 Nov 15 nicklas 39 import net.sf.basedb.core.PermissionDeniedException;
5642 26 May 11 nicklas 40 import net.sf.basedb.core.PhysicalBioAssay;
4630 07 Nov 08 nicklas 41 import net.sf.basedb.core.RawBioAssay;
4630 07 Nov 08 nicklas 42 import net.sf.basedb.util.filter.Filter;
6799 25 Mar 15 nicklas 43 import net.sf.basedb.util.listable.ExtractToChildExtractTransformer;
6799 25 Mar 15 nicklas 44 import net.sf.basedb.util.listable.SourceItemTransformer;
6799 25 Mar 15 nicklas 45 import net.sf.basedb.util.listable.TransformContext;
4630 07 Nov 08 nicklas 46
4630 07 Nov 08 nicklas 47 /**
4630 07 Nov 08 nicklas 48   Utility class for working with annotations.
4630 07 Nov 08 nicklas 49
4630 07 Nov 08 nicklas 50   @author Nicklas
4630 07 Nov 08 nicklas 51   @version 2.9
4630 07 Nov 08 nicklas 52   @base.modified $Date$
4630 07 Nov 08 nicklas 53 */
4630 07 Nov 08 nicklas 54 public class AnnotationUtil
4630 07 Nov 08 nicklas 55 {
6091 24 Aug 12 nicklas 56   /**
6091 24 Aug 12 nicklas 57     Create a new cache object that can be used with
6091 24 Aug 12 nicklas 58     {@link #getAllAnnotatableParentItems(DbControl, Annotatable, Filter, Cache)}
6091 24 Aug 12 nicklas 59     @since 3.2
6091 24 Aug 12 nicklas 60   */
6091 24 Aug 12 nicklas 61   public static Cache createCache()
6091 24 Aug 12 nicklas 62   {
6091 24 Aug 12 nicklas 63     return new Cache();
6091 24 Aug 12 nicklas 64   }
4630 07 Nov 08 nicklas 65   
4630 07 Nov 08 nicklas 66   /**
4630 07 Nov 08 nicklas 67     Get all annotatable parent items for a given item. A {@link Filter}
4630 07 Nov 08 nicklas 68     may be used to filter the returned collection. If a filter
4630 07 Nov 08 nicklas 69     is specified only parent items for which the {@link Filter#evaluate(Object)}
4630 07 Nov 08 nicklas 70     method returns true are included in the returned collection. Note
4630 07 Nov 08 nicklas 71     that all parent items are loaded before the filter is evaluated
4630 07 Nov 08 nicklas 72     and that the evaluation order is undefined.
4630 07 Nov 08 nicklas 73     
4630 07 Nov 08 nicklas 74     @param dc The DbControl to use for database access
4630 07 Nov 08 nicklas 75     @param item The item to find the parents for
4630 07 Nov 08 nicklas 76     @param filter An optional filter that can be used to filter 
4630 07 Nov 08 nicklas 77       which parents to include
4630 07 Nov 08 nicklas 78     @return A set containing the parent items
6091 24 Aug 12 nicklas 79     @see #getAllAnnotatableParentItems(DbControl, Annotatable, Filter, Cache)
4630 07 Nov 08 nicklas 80   */
4630 07 Nov 08 nicklas 81   public static Set<Annotatable> getAllAnnotatableParentItems(DbControl dc, 
4630 07 Nov 08 nicklas 82     Annotatable item, Filter<Annotatable> filter)
4630 07 Nov 08 nicklas 83   {
6091 24 Aug 12 nicklas 84     return getAllAnnotatableParentItems(dc, item, filter, null);
6091 24 Aug 12 nicklas 85   }
6091 24 Aug 12 nicklas 86
6091 24 Aug 12 nicklas 87   /**
6091 24 Aug 12 nicklas 88     Get all annotatable parent items for a given item. A {@link Filter}
6091 24 Aug 12 nicklas 89     may be used to filter the returned collection. If a filter
6091 24 Aug 12 nicklas 90     is specified only parent items for which the {@link Filter#evaluate(Object)}
6091 24 Aug 12 nicklas 91     method returns true are included in the returned collection. Note
6091 24 Aug 12 nicklas 92     that all parent items are loaded before the filter is evaluated
6091 24 Aug 12 nicklas 93     and that the evaluation order is undefined. A cache may be used
6091 24 Aug 12 nicklas 94     to improve performance if this method is called multiple times
6091 24 Aug 12 nicklas 95     with different items that have overlapping parent trees.
6091 24 Aug 12 nicklas 96     
6091 24 Aug 12 nicklas 97     @param dc The DbControl to use for database access
6091 24 Aug 12 nicklas 98     @param item The item to find the parents for
6091 24 Aug 12 nicklas 99     @param filter An optional filter that can be used to filter 
6091 24 Aug 12 nicklas 100       which parents to include
6091 24 Aug 12 nicklas 101     @param cache An optional cache object
6091 24 Aug 12 nicklas 102     @return A set containing the parent items
6091 24 Aug 12 nicklas 103     @see #createCache()
6091 24 Aug 12 nicklas 104     @since 3.2
6091 24 Aug 12 nicklas 105   */
6091 24 Aug 12 nicklas 106   public static Set<Annotatable> getAllAnnotatableParentItems(DbControl dc, 
6091 24 Aug 12 nicklas 107     Annotatable item, Filter<Annotatable> filter, Cache cache)
6091 24 Aug 12 nicklas 108   {
6091 24 Aug 12 nicklas 109     Set<AnnotatableWrapper> processed = new LinkedHashSet<AnnotatableWrapper>();
4630 07 Nov 08 nicklas 110     Queue<AnnotatableWrapper> unprocessed = new LinkedList<AnnotatableWrapper>();
6091 24 Aug 12 nicklas 111     unprocessed.add(new AnnotatableWrapper(item, cache));
6091 24 Aug 12 nicklas 112   
4630 07 Nov 08 nicklas 113     // As long as we have unprocessed entries...
4630 07 Nov 08 nicklas 114     while (!unprocessed.isEmpty())
4630 07 Nov 08 nicklas 115     {
4630 07 Nov 08 nicklas 116       AnnotatableWrapper toProcess = unprocessed.remove();
4630 07 Nov 08 nicklas 117       // ...mark it as processed...
4630 07 Nov 08 nicklas 118       if (processed.add(toProcess))
4630 07 Nov 08 nicklas 119       {
4630 07 Nov 08 nicklas 120         // ...and queue the parents items for processing...
6456 09 May 14 nicklas 121         unprocessed.addAll(toProcess.getAnnotatableParentWrappers(dc));
4630 07 Nov 08 nicklas 122       }
4630 07 Nov 08 nicklas 123     }
4630 07 Nov 08 nicklas 124     
4630 07 Nov 08 nicklas 125     // All parents are now loaded...
6091 24 Aug 12 nicklas 126     Set<Annotatable> allParents = new LinkedHashSet<Annotatable>(processed.size());
4630 07 Nov 08 nicklas 127     for (AnnotatableWrapper wrapper : processed)
4630 07 Nov 08 nicklas 128     {
4630 07 Nov 08 nicklas 129       // ...copy all parents that passes the filter
4630 07 Nov 08 nicklas 130       Annotatable parent = wrapper.getAnnotatable();
4630 07 Nov 08 nicklas 131       if (filter == null || filter.evaluate(parent)) allParents.add(parent);
4630 07 Nov 08 nicklas 132     }
4630 07 Nov 08 nicklas 133     // Do not include the root item in the result
4630 07 Nov 08 nicklas 134     allParents.remove(item);
4630 07 Nov 08 nicklas 135     return allParents;
4630 07 Nov 08 nicklas 136   }
4630 07 Nov 08 nicklas 137
4630 07 Nov 08 nicklas 138   
4630 07 Nov 08 nicklas 139   /**
4630 07 Nov 08 nicklas 140     This wrapper class is needed because we need to keep
6091 24 Aug 12 nicklas 141     track of extracts linked with raw bioassays and derived bioassays
5652 10 Jun 11 nicklas 142     until we have loaded the Extracts of a Physical Bioassay.
4630 07 Nov 08 nicklas 143     <p>
6091 24 Aug 12 nicklas 144     When we reach a {@link RawBioAssay} item or {@link DerivedBioAssay} item, we 
6091 24 Aug 12 nicklas 145     remember the extract on  that as we move up towards PhysicalBioAssay.
6091 24 Aug 12 nicklas 146     When the PhysicalBioAssay is reached we use the extracts to call
6091 24 Aug 12 nicklas 147     {@link PhysicalBioAssay#getAnnotatableParents(int, Collection)}.
4630 07 Nov 08 nicklas 148   */
4630 07 Nov 08 nicklas 149   static class AnnotatableWrapper
4630 07 Nov 08 nicklas 150   {
4630 07 Nov 08 nicklas 151     /**
5749 19 Sep 11 nicklas 152        Get the extract to use. This method returns:
4630 07 Nov 08 nicklas 153        
4630 07 Nov 08 nicklas 154        <ul>
5749 19 Sep 11 nicklas 155        <li>If the item is a raw bioassay, {@link RawBioAssay#getParentExtract()}
6091 24 Aug 12 nicklas 156        <li>If the item is a derived bioassay, {@link DerivedBioAssay#getExtract()}
5749 19 Sep 11 nicklas 157        <li>null in all other cases.
6091 24 Aug 12 nicklas 158        </ul>
4630 07 Nov 08 nicklas 159     */
6091 24 Aug 12 nicklas 160     private static Extract getExtract(Annotatable item)
4630 07 Nov 08 nicklas 161     {
5749 19 Sep 11 nicklas 162       Extract result = null;
7002 05 Nov 15 nicklas 163       try
4630 07 Nov 08 nicklas 164       {
7002 05 Nov 15 nicklas 165         if (item instanceof RawBioAssay)
7002 05 Nov 15 nicklas 166         {
7002 05 Nov 15 nicklas 167           result = ((RawBioAssay)item).getParentExtract();
7002 05 Nov 15 nicklas 168         }
7002 05 Nov 15 nicklas 169         else if (item instanceof DerivedBioAssay)
7002 05 Nov 15 nicklas 170         {
7002 05 Nov 15 nicklas 171           result = ((DerivedBioAssay)item).getExtract();
7002 05 Nov 15 nicklas 172         }
4630 07 Nov 08 nicklas 173       }
7002 05 Nov 15 nicklas 174       catch (PermissionDeniedException ex)
7002 05 Nov 15 nicklas 175       {}
5749 19 Sep 11 nicklas 176       return result;
4630 07 Nov 08 nicklas 177     }
4630 07 Nov 08 nicklas 178     
4630 07 Nov 08 nicklas 179     private final Annotatable item;
6799 25 Mar 15 nicklas 180     private final Set<Integer> extractsInChain;
6456 09 May 14 nicklas 181     private Set<Extract> allChildExtractsInChain;
6091 24 Aug 12 nicklas 182     private final AnnotatableWrapper chain;
6091 24 Aug 12 nicklas 183     private final Cache cache;
6124 13 Sep 12 nicklas 184     private final Extract extract;
4630 07 Nov 08 nicklas 185
6091 24 Aug 12 nicklas 186     AnnotatableWrapper(Annotatable item, Cache cache)
4630 07 Nov 08 nicklas 187     {
4630 07 Nov 08 nicklas 188       this.item = item;
6091 24 Aug 12 nicklas 189       this.chain = null;
6091 24 Aug 12 nicklas 190       this.cache = cache;
6124 13 Sep 12 nicklas 191       this.extract = getExtract(item);
6124 13 Sep 12 nicklas 192       this.extractsInChain = loadExtracts();
6456 09 May 14 nicklas 193       this.allChildExtractsInChain = null;
4630 07 Nov 08 nicklas 194     }
4630 07 Nov 08 nicklas 195     
6091 24 Aug 12 nicklas 196     AnnotatableWrapper(Annotatable item, AnnotatableWrapper chain)
6091 24 Aug 12 nicklas 197     {
6091 24 Aug 12 nicklas 198       this.item = item;
6091 24 Aug 12 nicklas 199       this.chain = chain;
6091 24 Aug 12 nicklas 200       this.cache = chain.cache;
6124 13 Sep 12 nicklas 201       this.extract = getExtract(item);
6124 13 Sep 12 nicklas 202       this.extractsInChain = loadExtracts();
6456 09 May 14 nicklas 203       this.allChildExtractsInChain = chain.allChildExtractsInChain;
6091 24 Aug 12 nicklas 204     }
6091 24 Aug 12 nicklas 205     
6091 24 Aug 12 nicklas 206     
4630 07 Nov 08 nicklas 207     /**
4630 07 Nov 08 nicklas 208       The annotatable that we are wrapping.
4630 07 Nov 08 nicklas 209     */
4630 07 Nov 08 nicklas 210     Annotatable getAnnotatable()
4630 07 Nov 08 nicklas 211     {
4630 07 Nov 08 nicklas 212       return item;
4630 07 Nov 08 nicklas 213     }
4630 07 Nov 08 nicklas 214     
6124 13 Sep 12 nicklas 215     /**
6124 13 Sep 12 nicklas 216       Load extracts in parent chain. We have to consider this for rawbioassay, 
6124 13 Sep 12 nicklas 217       derived bioassay and physical bioassay since the annotatable parents 
6124 13 Sep 12 nicklas 218       to a physical bioassay depends on the extracts we have seen while 
6124 13 Sep 12 nicklas 219       traversing the path from the raw bioassay and up. After reaching the physical
6124 13 Sep 12 nicklas 220       bioassay we can forget about the extracts.
6124 13 Sep 12 nicklas 221     */
6799 25 Mar 15 nicklas 222     private Set<Integer> loadExtracts()
6091 24 Aug 12 nicklas 223     {
7776 18 Feb 20 nicklas 224       Set<Integer> extractsInChain = Collections.emptySet();
6124 13 Sep 12 nicklas 225       switch (item.getType())
6091 24 Aug 12 nicklas 226       {
6124 13 Sep 12 nicklas 227         case PHYSICALBIOASSAY:
6124 13 Sep 12 nicklas 228         case DERIVEDBIOASSAY:
6124 13 Sep 12 nicklas 229         case RAWBIOASSAY:
6124 13 Sep 12 nicklas 230         {
7776 18 Feb 20 nicklas 231           extractsInChain = new HashSet<>();
6124 13 Sep 12 nicklas 232           if (chain != null) extractsInChain.addAll(chain.extractsInChain);
6799 25 Mar 15 nicklas 233           if (extract != null) extractsInChain.add(extract.getId());
6124 13 Sep 12 nicklas 234           break;
6124 13 Sep 12 nicklas 235         }
7776 18 Feb 20 nicklas 236         case EXTRACT:
6124 13 Sep 12 nicklas 237         {
7776 18 Feb 20 nicklas 238           if (chain != null && !chain.extractsInChain.contains(item.getId()))
7776 18 Feb 20 nicklas 239           {
7776 18 Feb 20 nicklas 240             extractsInChain = new HashSet<>(chain.extractsInChain);
7776 18 Feb 20 nicklas 241           }
7776 18 Feb 20 nicklas 242           break;
6124 13 Sep 12 nicklas 243         }
7776 18 Feb 20 nicklas 244         default:
7776 18 Feb 20 nicklas 245         {}
6091 24 Aug 12 nicklas 246       }
6091 24 Aug 12 nicklas 247       return extractsInChain;
6091 24 Aug 12 nicklas 248     }
6091 24 Aug 12 nicklas 249     
4630 07 Nov 08 nicklas 250     /**
4630 07 Nov 08 nicklas 251       Get all annotatable parents wrapped inside AnnotatableWrapper:s
4630 07 Nov 08 nicklas 252     */
6456 09 May 14 nicklas 253     Set<AnnotatableWrapper> getAnnotatableParentWrappers(DbControl dc) 
4630 07 Nov 08 nicklas 254       throws BaseException
4630 07 Nov 08 nicklas 255     {
4630 07 Nov 08 nicklas 256       Set<Annotatable> parents = null;
4630 07 Nov 08 nicklas 257       Set<AnnotatableWrapper> wrappedParents = Collections.emptySet();
6091 24 Aug 12 nicklas 258       
6124 13 Sep 12 nicklas 259       if (cache != null && cache.contains(this))
4630 07 Nov 08 nicklas 260       {
6124 13 Sep 12 nicklas 261         wrappedParents = cache.get(this);
4630 07 Nov 08 nicklas 262       }
4630 07 Nov 08 nicklas 263       else
4630 07 Nov 08 nicklas 264       {
6091 24 Aug 12 nicklas 265         if (item instanceof PhysicalBioAssay)
4630 07 Nov 08 nicklas 266         {
6456 09 May 14 nicklas 267           allChildExtractsInChain = new HashSet<Extract>();
6456 09 May 14 nicklas 268           if (extractsInChain.size() > 0)
6456 09 May 14 nicklas 269           {
6456 09 May 14 nicklas 270             // Only load parents that eventually lead up to one of the extracts in the chain
6799 25 Mar 15 nicklas 271             SourceItemTransformer transformer = new ExtractToChildExtractTransformer(true);
6799 25 Mar 15 nicklas 272             Set<Integer> childExtracts = transformer.transform(new TransformContext(dc), extractsInChain);
6799 25 Mar 15 nicklas 273             for (int id : childExtracts)
6799 25 Mar 15 nicklas 274             {
6799 25 Mar 15 nicklas 275               allChildExtractsInChain.add(Extract.getById(dc, id));
6799 25 Mar 15 nicklas 276             }
6456 09 May 14 nicklas 277           }
6456 09 May 14 nicklas 278           parents = ((PhysicalBioAssay)item).getAnnotatableParents(0, allChildExtractsInChain);
4630 07 Nov 08 nicklas 279         }
6456 09 May 14 nicklas 280         else if (item instanceof Extract)
6456 09 May 14 nicklas 281         {
6799 25 Mar 15 nicklas 282           if (extractsInChain.contains(item.getId()))
6456 09 May 14 nicklas 283           {
6456 09 May 14 nicklas 284             // When we have reached one of the items in the chain, we no longed need to restrict the loading of parent items
6456 09 May 14 nicklas 285             allChildExtractsInChain = null;
6456 09 May 14 nicklas 286           }
6456 09 May 14 nicklas 287           parents = ((Extract)item).getAnnotatableParents(allChildExtractsInChain);
6456 09 May 14 nicklas 288         }
6091 24 Aug 12 nicklas 289         else
6091 24 Aug 12 nicklas 290         {
6091 24 Aug 12 nicklas 291           parents = item.getAnnotatableParents();
6091 24 Aug 12 nicklas 292         }
6091 24 Aug 12 nicklas 293         if (parents != null)
6091 24 Aug 12 nicklas 294         {
6091 24 Aug 12 nicklas 295           wrappedParents = new HashSet<AnnotatableWrapper>(parents.size());
6091 24 Aug 12 nicklas 296           for (Annotatable parent : parents)
6091 24 Aug 12 nicklas 297           {
6091 24 Aug 12 nicklas 298             wrappedParents.add(new AnnotatableWrapper(parent, this));
6091 24 Aug 12 nicklas 299           }
6091 24 Aug 12 nicklas 300         }
6124 13 Sep 12 nicklas 301         if (cache != null) cache.put(this, wrappedParents);
4630 07 Nov 08 nicklas 302       }
4630 07 Nov 08 nicklas 303       return wrappedParents;
4630 07 Nov 08 nicklas 304     }
4630 07 Nov 08 nicklas 305     
4630 07 Nov 08 nicklas 306     /**
4630 07 Nov 08 nicklas 307       A wrapper is equal to another if they references the same item
6124 13 Sep 12 nicklas 308       and chain of extracts.
4630 07 Nov 08 nicklas 309     */
4630 07 Nov 08 nicklas 310     @Override
4630 07 Nov 08 nicklas 311     public boolean equals(Object o)
4630 07 Nov 08 nicklas 312     {
4630 07 Nov 08 nicklas 313       if (o == this) return true;
5384 13 Aug 10 nicklas 314       if (o == null || o.getClass() != this.getClass()) return false;
4630 07 Nov 08 nicklas 315       AnnotatableWrapper other = (AnnotatableWrapper)o;
6124 13 Sep 12 nicklas 316       return this.item.equals(other.item) && this.extractsInChain.equals(other.extractsInChain);
4630 07 Nov 08 nicklas 317     }
4630 07 Nov 08 nicklas 318
4630 07 Nov 08 nicklas 319     @Override
4630 07 Nov 08 nicklas 320     public int hashCode()
4630 07 Nov 08 nicklas 321     {
6124 13 Sep 12 nicklas 322       return item.hashCode() + extractsInChain.hashCode();
4630 07 Nov 08 nicklas 323     }
6124 13 Sep 12 nicklas 324     
6124 13 Sep 12 nicklas 325     @Override
6124 13 Sep 12 nicklas 326     public String toString()
6124 13 Sep 12 nicklas 327     {
6124 13 Sep 12 nicklas 328       return item.toString() + ":" + extractsInChain;
6124 13 Sep 12 nicklas 329     }
4630 07 Nov 08 nicklas 330   }
6091 24 Aug 12 nicklas 331   
6091 24 Aug 12 nicklas 332   public static class Cache
6091 24 Aug 12 nicklas 333   {
6124 13 Sep 12 nicklas 334     private final Map<AnnotatableWrapper, Set<AnnotatableWrapper>> cmap;
6091 24 Aug 12 nicklas 335     
6091 24 Aug 12 nicklas 336     Cache()
6091 24 Aug 12 nicklas 337     {
6124 13 Sep 12 nicklas 338       this.cmap = new HashMap<AnnotatableWrapper, Set<AnnotatableWrapper>>();
6091 24 Aug 12 nicklas 339     }
7767 06 Feb 20 nicklas 340   
7767 06 Feb 20 nicklas 341     /**
7767 06 Feb 20 nicklas 342       Clear all information from the cache.
7767 06 Feb 20 nicklas 343       @since 3.16
7767 06 Feb 20 nicklas 344     */
7767 06 Feb 20 nicklas 345     public void clear()
7767 06 Feb 20 nicklas 346     {
7767 06 Feb 20 nicklas 347       cmap.clear();
7767 06 Feb 20 nicklas 348     }
6091 24 Aug 12 nicklas 349     
6124 13 Sep 12 nicklas 350     boolean contains(AnnotatableWrapper wrapper)
6091 24 Aug 12 nicklas 351     {
6124 13 Sep 12 nicklas 352       return cmap.containsKey(wrapper);
6091 24 Aug 12 nicklas 353     }
6091 24 Aug 12 nicklas 354     
6124 13 Sep 12 nicklas 355     Set<AnnotatableWrapper> get(AnnotatableWrapper wrapper)
6091 24 Aug 12 nicklas 356     {
6124 13 Sep 12 nicklas 357       return cmap.get(wrapper);
6091 24 Aug 12 nicklas 358     }
6091 24 Aug 12 nicklas 359     
6124 13 Sep 12 nicklas 360     void put(AnnotatableWrapper wrapper, Set<AnnotatableWrapper> parents)
6091 24 Aug 12 nicklas 361     {
6124 13 Sep 12 nicklas 362       cmap.put(wrapper, parents);
6091 24 Aug 12 nicklas 363     }
7776 18 Feb 20 nicklas 364
7776 18 Feb 20 nicklas 365     @Override
7776 18 Feb 20 nicklas 366     public String toString()
7776 18 Feb 20 nicklas 367     {
7776 18 Feb 20 nicklas 368       return cmap.toString();
7776 18 Feb 20 nicklas 369     }
6091 24 Aug 12 nicklas 370     
7776 18 Feb 20 nicklas 371     
6091 24 Aug 12 nicklas 372   }
4630 07 Nov 08 nicklas 373 }