src/core/net/sf/basedb/util/listable/TransformContext.java

Code
Comments
Other
Rev Date Author Line
6774 17 Mar 15 nicklas 1 /**
6774 17 Mar 15 nicklas 2   $Id$
6774 17 Mar 15 nicklas 3
6774 17 Mar 15 nicklas 4   Copyright (C) 2015 Nicklas Nordborg
6774 17 Mar 15 nicklas 5
6774 17 Mar 15 nicklas 6   This file is part of BASE - BioArray Software Environment.
6774 17 Mar 15 nicklas 7   Available at http://base.thep.lu.se/
6774 17 Mar 15 nicklas 8
6774 17 Mar 15 nicklas 9   BASE is free software; you can redistribute it and/or
6774 17 Mar 15 nicklas 10   modify it under the terms of the GNU General Public License
6774 17 Mar 15 nicklas 11   as published by the Free Software Foundation; either version 3
6774 17 Mar 15 nicklas 12   of the License, or (at your option) any later version.
6774 17 Mar 15 nicklas 13
6774 17 Mar 15 nicklas 14   BASE is distributed in the hope that it will be useful,
6774 17 Mar 15 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6774 17 Mar 15 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6774 17 Mar 15 nicklas 17   GNU General Public License for more details.
6774 17 Mar 15 nicklas 18
6774 17 Mar 15 nicklas 19   You should have received a copy of the GNU General Public License
6774 17 Mar 15 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6774 17 Mar 15 nicklas 21 */
6774 17 Mar 15 nicklas 22 package net.sf.basedb.util.listable;
6774 17 Mar 15 nicklas 23
6848 13 Apr 15 nicklas 24 import java.util.Collection;
8094 04 Nov 22 nicklas 25 import java.util.HashMap;
8094 04 Nov 22 nicklas 26 import java.util.HashSet;
8094 04 Nov 22 nicklas 27 import java.util.Map;
8094 04 Nov 22 nicklas 28 import java.util.Set;
6848 13 Apr 15 nicklas 29
6774 17 Mar 15 nicklas 30 import net.sf.basedb.core.DbControl;
6848 13 Apr 15 nicklas 31 import net.sf.basedb.core.Include;
8094 04 Nov 22 nicklas 32 import net.sf.basedb.core.Item;
6774 17 Mar 15 nicklas 33
6774 17 Mar 15 nicklas 34 /**
6774 17 Mar 15 nicklas 35   Transformation context that can be used to keep track of vital
6774 17 Mar 15 nicklas 36   information when doing multi-step transformations.
6774 17 Mar 15 nicklas 37
6774 17 Mar 15 nicklas 38   @author Nicklas
6774 17 Mar 15 nicklas 39   @since 3.5
6774 17 Mar 15 nicklas 40 */
6774 17 Mar 15 nicklas 41 public class TransformContext 
6774 17 Mar 15 nicklas 42 {
6774 17 Mar 15 nicklas 43
6774 17 Mar 15 nicklas 44   private final DbControl dc;
6848 13 Apr 15 nicklas 45   private Collection<Include> include;
6774 17 Mar 15 nicklas 46   
6774 17 Mar 15 nicklas 47   /**
6774 17 Mar 15 nicklas 48     Creates a new transformation context that will use the given DbControl
6774 17 Mar 15 nicklas 49     for database access.
6774 17 Mar 15 nicklas 50   */
6774 17 Mar 15 nicklas 51   public TransformContext(DbControl dc)
6774 17 Mar 15 nicklas 52   {
6774 17 Mar 15 nicklas 53     this.dc = dc;
6848 13 Apr 15 nicklas 54     this.include = Include.ALL;
6774 17 Mar 15 nicklas 55   }
6774 17 Mar 15 nicklas 56   
6774 17 Mar 15 nicklas 57   /**
6774 17 Mar 15 nicklas 58     Get the DbControl to use in this transformation context.
6774 17 Mar 15 nicklas 59   */
6774 17 Mar 15 nicklas 60   public DbControl getDbControl()
6774 17 Mar 15 nicklas 61   {
6774 17 Mar 15 nicklas 62     return dc;
6774 17 Mar 15 nicklas 63   }
6774 17 Mar 15 nicklas 64   
6848 13 Apr 15 nicklas 65   /**
6848 13 Apr 15 nicklas 66     Include options when executing queries to find
6848 13 Apr 15 nicklas 67     parent/child items. Default is Include.ALL.
6848 13 Apr 15 nicklas 68   */
6848 13 Apr 15 nicklas 69   public Collection<Include> getInclude()
6848 13 Apr 15 nicklas 70   {
6848 13 Apr 15 nicklas 71     return include;
6848 13 Apr 15 nicklas 72   }
6848 13 Apr 15 nicklas 73   
6848 13 Apr 15 nicklas 74   public void setInclude(Collection<Include> include)
6848 13 Apr 15 nicklas 75   {
6848 13 Apr 15 nicklas 76     this.include = include;
6848 13 Apr 15 nicklas 77   }
6848 13 Apr 15 nicklas 78   
7770 10 Feb 20 nicklas 79   /**
7770 10 Feb 20 nicklas 80     Get a cache that can be used for storing transformation
7770 10 Feb 20 nicklas 81     results for some time. The cache is stored in the current
7770 10 Feb 20 nicklas 82     session and is lost if the user logs out.
7770 10 Feb 20 nicklas 83     @since 3.16
7770 10 Feb 20 nicklas 84   */
7770 10 Feb 20 nicklas 85   public TransformCache getCache()
7770 10 Feb 20 nicklas 86   {
7770 10 Feb 20 nicklas 87     TransformCache cache = dc.getSessionControl().getSessionSetting(TransformCache.class.getName());
7770 10 Feb 20 nicklas 88     if (cache == null)
7770 10 Feb 20 nicklas 89     {
7770 10 Feb 20 nicklas 90       cache = new TransformCache(20);
7770 10 Feb 20 nicklas 91       dc.getSessionControl().setSessionSetting(TransformCache.class.getName(), cache);
7770 10 Feb 20 nicklas 92     }
7770 10 Feb 20 nicklas 93     return cache;
7770 10 Feb 20 nicklas 94   }
7770 10 Feb 20 nicklas 95
8094 04 Nov 22 nicklas 96   private boolean collecting;
8094 04 Nov 22 nicklas 97   private boolean avoiding;
8094 04 Nov 22 nicklas 98   private Map<Item, Set<Integer>> collectedByItemType;
8094 04 Nov 22 nicklas 99
8094 04 Nov 22 nicklas 100   
8094 04 Nov 22 nicklas 101   /**
8094 04 Nov 22 nicklas 102     Enable/disable collecting of all source items that the transformers in
8094 04 Nov 22 nicklas 103     this context are using.
8094 04 Nov 22 nicklas 104     @since 3.19.5
8094 04 Nov 22 nicklas 105   */
8094 04 Nov 22 nicklas 106   public void setCollecting(boolean collecting)
8094 04 Nov 22 nicklas 107   {
8094 04 Nov 22 nicklas 108     this.collecting = collecting;
8094 04 Nov 22 nicklas 109   }
8094 04 Nov 22 nicklas 110   
8094 04 Nov 22 nicklas 111   /**
8094 04 Nov 22 nicklas 112     Shortcut for enabling 'collecting' and disabling 'avoiding'.
8094 04 Nov 22 nicklas 113     @since 3.19.5
8094 04 Nov 22 nicklas 114   */
8094 04 Nov 22 nicklas 115   public void setCollecting()
8094 04 Nov 22 nicklas 116   {
8094 04 Nov 22 nicklas 117     this.collecting = true;
8094 04 Nov 22 nicklas 118     this.avoiding = false;
8094 04 Nov 22 nicklas 119   }
8094 04 Nov 22 nicklas 120   
8094 04 Nov 22 nicklas 121   public boolean isCollecting()
8094 04 Nov 22 nicklas 122   {
8094 04 Nov 22 nicklas 123     return collecting;
8094 04 Nov 22 nicklas 124   }
8094 04 Nov 22 nicklas 125   
8094 04 Nov 22 nicklas 126   /**
8094 04 Nov 22 nicklas 127     Enable/disable avoiding of returning any source items that has 
8094 04 Nov 22 nicklas 128     been previously collected.
8094 04 Nov 22 nicklas 129     @since 3.19.5
8094 04 Nov 22 nicklas 130   */
8094 04 Nov 22 nicklas 131   public void setAvoiding(boolean avoiding)
8094 04 Nov 22 nicklas 132   {
8094 04 Nov 22 nicklas 133     this.avoiding = avoiding;
8094 04 Nov 22 nicklas 134   }
8094 04 Nov 22 nicklas 135   /**
8094 04 Nov 22 nicklas 136     Shortcut for enabling 'avoiding' and disabling 'collecting'.
8094 04 Nov 22 nicklas 137     @since 3.19.5
8094 04 Nov 22 nicklas 138   */
8094 04 Nov 22 nicklas 139   public void setAvoiding()
8094 04 Nov 22 nicklas 140   {
8094 04 Nov 22 nicklas 141     this.collecting = false;
8094 04 Nov 22 nicklas 142     this.avoiding = true;
8094 04 Nov 22 nicklas 143   }
8094 04 Nov 22 nicklas 144
8094 04 Nov 22 nicklas 145   public boolean isAvoiding()
8094 04 Nov 22 nicklas 146   {
8094 04 Nov 22 nicklas 147     return avoiding;
8094 04 Nov 22 nicklas 148   }
8094 04 Nov 22 nicklas 149   
8094 04 Nov 22 nicklas 150   /**
8094 04 Nov 22 nicklas 151     Clear all collected items and disable both 'collecting' and
8094 04 Nov 22 nicklas 152     'avoiding'.
8094 04 Nov 22 nicklas 153     @since 3.19.5
8094 04 Nov 22 nicklas 154   */
8094 04 Nov 22 nicklas 155   public void resetCollected()
8094 04 Nov 22 nicklas 156   {
8094 04 Nov 22 nicklas 157     this.collecting = false;
8094 04 Nov 22 nicklas 158     this.avoiding = false;
8094 04 Nov 22 nicklas 159     if (collectedByItemType != null) collectedByItemType.clear();
8094 04 Nov 22 nicklas 160   }
8094 04 Nov 22 nicklas 161   
8094 04 Nov 22 nicklas 162   /**
8094 04 Nov 22 nicklas 163     Store collected items for later use if collecting has been enabled.
8094 04 Nov 22 nicklas 164     @return The source items
8094 04 Nov 22 nicklas 165   */
8094 04 Nov 22 nicklas 166   public Set<Integer> collect(Item itemType, Set<Integer> source)
8094 04 Nov 22 nicklas 167   {
8094 04 Nov 22 nicklas 168     if (collecting && source.size() > 0)
8094 04 Nov 22 nicklas 169     {
8094 04 Nov 22 nicklas 170       if (collectedByItemType == null) collectedByItemType = new HashMap<>();
8094 04 Nov 22 nicklas 171       Set<Integer> collected = collectedByItemType.get(itemType);
8094 04 Nov 22 nicklas 172       if (collected == null) 
8094 04 Nov 22 nicklas 173       {
8094 04 Nov 22 nicklas 174         collected = new HashSet<>();
8094 04 Nov 22 nicklas 175         collectedByItemType.put(itemType, collected);
8094 04 Nov 22 nicklas 176       }
8094 04 Nov 22 nicklas 177       collected.addAll(source);
8094 04 Nov 22 nicklas 178     }
8094 04 Nov 22 nicklas 179     return source;
8094 04 Nov 22 nicklas 180   }
8094 04 Nov 22 nicklas 181   
8094 04 Nov 22 nicklas 182   /**
8094 04 Nov 22 nicklas 183     Avoid collected items by removing them from the source set.
8094 04 Nov 22 nicklas 184     Note that this method modified the source set directly.
8094 04 Nov 22 nicklas 185     @return The source set
8094 04 Nov 22 nicklas 186   */
8094 04 Nov 22 nicklas 187   public Set<Integer> avoid(Item itemType, Set<Integer> source)
8094 04 Nov 22 nicklas 188   {
8094 04 Nov 22 nicklas 189     if (avoiding && source.size() > 0)
8094 04 Nov 22 nicklas 190     {
8094 04 Nov 22 nicklas 191       if (collectedByItemType != null && collectedByItemType.containsKey(itemType))
8094 04 Nov 22 nicklas 192       {
8094 04 Nov 22 nicklas 193         Set<Integer> collected = collectedByItemType.get(itemType);
8094 04 Nov 22 nicklas 194         source.removeAll(collected);
8094 04 Nov 22 nicklas 195       }
8094 04 Nov 22 nicklas 196     }
8094 04 Nov 22 nicklas 197     return source;
8094 04 Nov 22 nicklas 198   }
8094 04 Nov 22 nicklas 199
6774 17 Mar 15 nicklas 200 }