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

Code
Comments
Other
Rev Date Author Line
6775 17 Mar 15 nicklas 1 /**
6775 17 Mar 15 nicklas 2   $Id$
6775 17 Mar 15 nicklas 3
6775 17 Mar 15 nicklas 4   Copyright (C) 2015 Nicklas Nordborg
6775 17 Mar 15 nicklas 5
6775 17 Mar 15 nicklas 6   This file is part of BASE - BioArray Software Environment.
6775 17 Mar 15 nicklas 7   Available at http://base.thep.lu.se/
6775 17 Mar 15 nicklas 8
6775 17 Mar 15 nicklas 9   BASE is free software; you can redistribute it and/or
6775 17 Mar 15 nicklas 10   modify it under the terms of the GNU General Public License
6775 17 Mar 15 nicklas 11   as published by the Free Software Foundation; either version 3
6775 17 Mar 15 nicklas 12   of the License, or (at your option) any later version.
6775 17 Mar 15 nicklas 13
6775 17 Mar 15 nicklas 14   BASE is distributed in the hope that it will be useful,
6775 17 Mar 15 nicklas 15   but WITHOUT ANY WARRANTY; without even the implied warranty of
6775 17 Mar 15 nicklas 16   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
6775 17 Mar 15 nicklas 17   GNU General Public License for more details.
6775 17 Mar 15 nicklas 18
6775 17 Mar 15 nicklas 19   You should have received a copy of the GNU General Public License
6775 17 Mar 15 nicklas 20   along with BASE. If not, see <http://www.gnu.org/licenses/>.
6775 17 Mar 15 nicklas 21 */
6775 17 Mar 15 nicklas 22 package net.sf.basedb.util.listable;
6775 17 Mar 15 nicklas 23
6775 17 Mar 15 nicklas 24 import java.util.ArrayList;
6775 17 Mar 15 nicklas 25 import java.util.List;
6775 17 Mar 15 nicklas 26
6775 17 Mar 15 nicklas 27 import net.sf.basedb.core.Item;
6775 17 Mar 15 nicklas 28 import net.sf.basedb.core.SyncFilter.SourceItemTransform;
6775 17 Mar 15 nicklas 29
6775 17 Mar 15 nicklas 30 /**
6775 17 Mar 15 nicklas 31   Transformer factory implementation for transforming to extracts. The current
6775 17 Mar 15 nicklas 32   implementation support transforming from:
6775 17 Mar 15 nicklas 33   
6775 17 Mar 15 nicklas 34   <ul>
6775 17 Mar 15 nicklas 35   <li>{@link SourceItemTransform#PARENT_TO_CHILD}: BIOSOURCE, SAMPLE, EXTRACT
6775 17 Mar 15 nicklas 36   <li>{@link SourceItemTransform#CHILD_TO_PARENT}: EXTRACT, PHYSICALBIOASSAY, DERIVEDBIOASSAY, RAWBIOASSAY
6775 17 Mar 15 nicklas 37   </ul>
6775 17 Mar 15 nicklas 38
6775 17 Mar 15 nicklas 39   @author Nicklas
6775 17 Mar 15 nicklas 40   @since 3.5
6775 17 Mar 15 nicklas 41 */
6775 17 Mar 15 nicklas 42 public class ToExtractSourceItemTransformerFactory 
6775 17 Mar 15 nicklas 43   extends AbstractSourceItemTransformerFactory
6775 17 Mar 15 nicklas 44 {
6775 17 Mar 15 nicklas 45
6775 17 Mar 15 nicklas 46   private static Item[] PARENT_TO_CHILD = 
6775 17 Mar 15 nicklas 47     { Item.BIOSOURCE, Item.SAMPLE, Item.EXTRACT };
6775 17 Mar 15 nicklas 48   
6775 17 Mar 15 nicklas 49   private static Item[] CHILD_TO_PARENT =
6775 17 Mar 15 nicklas 50     { Item.EXTRACT, Item.PHYSICALBIOASSAY, Item.DERIVEDBIOASSAY, Item.RAWBIOASSAY };
6775 17 Mar 15 nicklas 51   
8094 04 Nov 22 nicklas 52   private final boolean includeChildrenThatPushToParent;
6775 17 Mar 15 nicklas 53   
6775 17 Mar 15 nicklas 54   public ToExtractSourceItemTransformerFactory() 
6775 17 Mar 15 nicklas 55   {
8094 04 Nov 22 nicklas 56     this(false);
8094 04 Nov 22 nicklas 57   }
8094 04 Nov 22 nicklas 58   
8094 04 Nov 22 nicklas 59   public ToExtractSourceItemTransformerFactory(boolean includeChildrenThatPushToParent) 
8094 04 Nov 22 nicklas 60   {
6775 17 Mar 15 nicklas 61     super(Item.EXTRACT, PARENT_TO_CHILD, CHILD_TO_PARENT);
8094 04 Nov 22 nicklas 62     this.includeChildrenThatPushToParent = includeChildrenThatPushToParent;
6775 17 Mar 15 nicklas 63   }
6775 17 Mar 15 nicklas 64   
6775 17 Mar 15 nicklas 65   
6775 17 Mar 15 nicklas 66   @Override
6790 20 Mar 15 nicklas 67   public SourceItemTransformer create(final Item sourceItemType, final SourceItemTransform transform) 
6775 17 Mar 15 nicklas 68   {
6775 17 Mar 15 nicklas 69     List<SourceItemTransformer> chain = new ArrayList<SourceItemTransformer>();
6790 20 Mar 15 nicklas 70     Item stepBySource = null;
6775 17 Mar 15 nicklas 71     
6775 17 Mar 15 nicklas 72     if (transform == SourceItemTransform.PARENT_TO_CHILD)
6775 17 Mar 15 nicklas 73     {
6775 17 Mar 15 nicklas 74       // Transforming a list of parent items to child extracts
6790 20 Mar 15 nicklas 75       // We do step-wise loading from BIOSOURCE -> SAMPLE -> EXTRACT
6790 20 Mar 15 nicklas 76       if (sourceItemType == Item.BIOSOURCE)
6775 17 Mar 15 nicklas 77       {
6790 20 Mar 15 nicklas 78         // Load child samples of the biosources
6790 20 Mar 15 nicklas 79         chain.add(new BioSourceToSampleTransformer());
6790 20 Mar 15 nicklas 80         stepBySource = Item.SAMPLE;
6775 17 Mar 15 nicklas 81       }
6790 20 Mar 15 nicklas 82       if (sourceItemType == Item.SAMPLE || stepBySource == Item.SAMPLE)
6775 17 Mar 15 nicklas 83       {
7772 17 Feb 20 nicklas 84         // Expand source selection to parents if the children push annotations upwards
7772 17 Feb 20 nicklas 85         if (sourceItemType == Item.SAMPLE) chain.add(new PushToParentsTransformer(sourceItemType));
6775 17 Mar 15 nicklas 86         // Load child samples and include the source samples
6775 17 Mar 15 nicklas 87         chain.add(new SampleToChildSampleTransformer(true));
6775 17 Mar 15 nicklas 88         // Transform to child extracts
6775 17 Mar 15 nicklas 89         chain.add(new SampleToExtractTransformer());
6790 20 Mar 15 nicklas 90         stepBySource = Item.EXTRACT;
6775 17 Mar 15 nicklas 91       }
6790 20 Mar 15 nicklas 92       if (sourceItemType == Item.EXTRACT || stepBySource == Item.EXTRACT)
6775 17 Mar 15 nicklas 93       {
7772 17 Feb 20 nicklas 94         // Expand source selection to parents if the children push annotations upwards
7772 17 Feb 20 nicklas 95         if (sourceItemType == Item.EXTRACT) chain.add(new PushToParentsTransformer(sourceItemType));
6790 20 Mar 15 nicklas 96         // Load child extract and maybe include source extracts
6790 20 Mar 15 nicklas 97         chain.add(new ExtractToChildExtractTransformer(sourceItemType != Item.EXTRACT));
6775 17 Mar 15 nicklas 98       }
6775 17 Mar 15 nicklas 99     }
6775 17 Mar 15 nicklas 100     else if (transform == SourceItemTransform.CHILD_TO_PARENT)
6775 17 Mar 15 nicklas 101     {
8094 04 Nov 22 nicklas 102       childToParentChain(chain, sourceItemType, Item.EXTRACT, includeChildrenThatPushToParent);
6775 17 Mar 15 nicklas 103     }
6775 17 Mar 15 nicklas 104
6775 17 Mar 15 nicklas 105     return chain.size() == 0 ? null : new SourceItemTransformerChain(chain);
6775 17 Mar 15 nicklas 106   }
6775 17 Mar 15 nicklas 107
6791 23 Mar 15 nicklas 108   
6791 23 Mar 15 nicklas 109   /**
6791 23 Mar 15 nicklas 110     Utility method for creating the transformer chain from child items
6791 23 Mar 15 nicklas 111     up to extracts. Supported source item types are: RAWBIOASSAY, 
6791 23 Mar 15 nicklas 112     DERIVEDBIOASSAY, PHYSICALBIOASSAY and EXTRACT
6791 23 Mar 15 nicklas 113   */
8094 04 Nov 22 nicklas 114   static void childToParentChain(List<SourceItemTransformer> chain, Item sourceItemType, Item targetItemType, boolean includeChildrenThatPushToParent)
6791 23 Mar 15 nicklas 115   {
6791 23 Mar 15 nicklas 116     Item stepBySource = null;
6791 23 Mar 15 nicklas 117     // Transforming a list of child items to parent extracts
6791 23 Mar 15 nicklas 118     // We do step-wise loading from RAWBIOASSAY -> DERIVEDBIOASSAY -> PHYSICALBIOASSAY -> EXTRACT
6791 23 Mar 15 nicklas 119     CollectExtracts collectedExtracts = null;
6791 23 Mar 15 nicklas 120     if (sourceItemType == Item.RAWBIOASSAY)
6791 23 Mar 15 nicklas 121     {
6791 23 Mar 15 nicklas 122       // Collect extracts from the source raw bioassays
6791 23 Mar 15 nicklas 123       collectedExtracts = new CollectExtracts();
6791 23 Mar 15 nicklas 124       chain.add(collectedExtracts.collectFromRawBioAssays());
6791 23 Mar 15 nicklas 125       // Load parent derived bioassays
6791 23 Mar 15 nicklas 126       chain.add(new RawBioAssayToDerivedBioAssayTransformer());
6791 23 Mar 15 nicklas 127       stepBySource = Item.DERIVEDBIOASSAY;
6791 23 Mar 15 nicklas 128     }
6791 23 Mar 15 nicklas 129     if (sourceItemType == Item.DERIVEDBIOASSAY || stepBySource == Item.DERIVEDBIOASSAY)
6791 23 Mar 15 nicklas 130     {
6791 23 Mar 15 nicklas 131       // Collect extracts from all derived bioassays in the parent chain
6791 23 Mar 15 nicklas 132       if (collectedExtracts == null) collectedExtracts = new CollectExtracts();
6791 23 Mar 15 nicklas 133       chain.add(collectedExtracts.collectFromDerivedBioAssays(true));
6791 23 Mar 15 nicklas 134       
6791 23 Mar 15 nicklas 135       // Load physical bioassays
6792 23 Mar 15 nicklas 136       chain.add(new DerivedBioAssayToPhysicalBioAssayTransformer());
6791 23 Mar 15 nicklas 137       stepBySource = Item.PHYSICALBIOASSAY;
6791 23 Mar 15 nicklas 138     }
6791 23 Mar 15 nicklas 139     if (sourceItemType == Item.PHYSICALBIOASSAY || stepBySource == Item.PHYSICALBIOASSAY)
6791 23 Mar 15 nicklas 140     {
6791 23 Mar 15 nicklas 141       // Load all extracts used on the physical bioassays
6791 23 Mar 15 nicklas 142       chain.add(new PhysicalBioAssayToExtractTransformer());
6791 23 Mar 15 nicklas 143       stepBySource = Item.EXTRACT;
6791 23 Mar 15 nicklas 144     }
6791 23 Mar 15 nicklas 145     if (sourceItemType == Item.EXTRACT || stepBySource == Item.EXTRACT)
6791 23 Mar 15 nicklas 146     {
6801 25 Mar 15 nicklas 147       if (collectedExtracts != null)
6801 25 Mar 15 nicklas 148       {
6801 25 Mar 15 nicklas 149         // Collected parents and childre to downstreams extracts (linked from bioassays)
6801 25 Mar 15 nicklas 150         chain.add(collectedExtracts.collectChildrenOfCollected(true));
6801 25 Mar 15 nicklas 151         chain.add(collectedExtracts.collectParentsOfCollected(true));
6801 25 Mar 15 nicklas 152       }
6791 23 Mar 15 nicklas 153       // Load parent extracts, maybe including the source extracts
6791 23 Mar 15 nicklas 154       chain.add(new ExtractToParentExtractTransformer(sourceItemType != targetItemType, collectedExtracts));
8094 04 Nov 22 nicklas 155       // Also include child extracts that have push-to-parent flag set
8094 04 Nov 22 nicklas 156       if (includeChildrenThatPushToParent && targetItemType == Item.EXTRACT)
8094 04 Nov 22 nicklas 157       {
8094 04 Nov 22 nicklas 158         chain.add(new ExtractToChildExtractTransformer(true, true));
8094 04 Nov 22 nicklas 159       }
6791 23 Mar 15 nicklas 160     }
6791 23 Mar 15 nicklas 161     
6791 23 Mar 15 nicklas 162   }
6775 17 Mar 15 nicklas 163 }