src/core/net/sf/basedb/util/listable/ToSampleSourceItemTransformerFactory.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
6774 17 Mar 15 nicklas 24 import java.util.ArrayList;
6774 17 Mar 15 nicklas 25 import java.util.List;
6774 17 Mar 15 nicklas 26
6774 17 Mar 15 nicklas 27 import net.sf.basedb.core.Item;
6774 17 Mar 15 nicklas 28 import net.sf.basedb.core.SyncFilter.SourceItemTransform;
6774 17 Mar 15 nicklas 29
6774 17 Mar 15 nicklas 30 /**
6774 17 Mar 15 nicklas 31   Transformer factory implementation for transforming to samples. The current
6774 17 Mar 15 nicklas 32   implementation support transforming from:
6774 17 Mar 15 nicklas 33   
6774 17 Mar 15 nicklas 34   <ul>
6774 17 Mar 15 nicklas 35   <li>{@link SourceItemTransform#PARENT_TO_CHILD}: BIOSOURCE, SAMPLE
6774 17 Mar 15 nicklas 36   <li>{@link SourceItemTransform#CHILD_TO_PARENT}: SAMPLE, EXTRACT, PHYSICALBIOASSAY, DERIVEDBIOASSAY, RAWBIOASSAY
6774 17 Mar 15 nicklas 37   </ul>
6774 17 Mar 15 nicklas 38
6774 17 Mar 15 nicklas 39   @author Nicklas
6774 17 Mar 15 nicklas 40   @since 3.5
6774 17 Mar 15 nicklas 41 */
6774 17 Mar 15 nicklas 42 public class ToSampleSourceItemTransformerFactory 
6774 17 Mar 15 nicklas 43   extends AbstractSourceItemTransformerFactory
6774 17 Mar 15 nicklas 44 {
6774 17 Mar 15 nicklas 45
6774 17 Mar 15 nicklas 46   private static Item[] PARENT_TO_CHILD = 
6774 17 Mar 15 nicklas 47     { Item.BIOSOURCE, Item.SAMPLE };
6774 17 Mar 15 nicklas 48   
6774 17 Mar 15 nicklas 49   private static Item[] CHILD_TO_PARENT =
6774 17 Mar 15 nicklas 50     { Item.SAMPLE, Item.EXTRACT, Item.PHYSICALBIOASSAY, Item.DERIVEDBIOASSAY, Item.RAWBIOASSAY };
6774 17 Mar 15 nicklas 51   
6774 17 Mar 15 nicklas 52   
8094 04 Nov 22 nicklas 53   private final boolean includeChildrenThatPushToParent;
8094 04 Nov 22 nicklas 54   
6774 17 Mar 15 nicklas 55   public ToSampleSourceItemTransformerFactory() 
6774 17 Mar 15 nicklas 56   {
8094 04 Nov 22 nicklas 57     this(false);
8094 04 Nov 22 nicklas 58   }
8094 04 Nov 22 nicklas 59   
8094 04 Nov 22 nicklas 60   public ToSampleSourceItemTransformerFactory(boolean includeChildrenThatPushToParent) 
8094 04 Nov 22 nicklas 61   {
6774 17 Mar 15 nicklas 62     super(Item.SAMPLE, PARENT_TO_CHILD, CHILD_TO_PARENT);
8094 04 Nov 22 nicklas 63     this.includeChildrenThatPushToParent = includeChildrenThatPushToParent;
6774 17 Mar 15 nicklas 64   }
8094 04 Nov 22 nicklas 65
6774 17 Mar 15 nicklas 66   @Override
6790 20 Mar 15 nicklas 67   public SourceItemTransformer create(final Item sourceItemType, final SourceItemTransform transform) 
6774 17 Mar 15 nicklas 68   {
6774 17 Mar 15 nicklas 69     List<SourceItemTransformer> chain = new ArrayList<SourceItemTransformer>();
6790 20 Mar 15 nicklas 70     Item stepBySource = null;
6774 17 Mar 15 nicklas 71     
6774 17 Mar 15 nicklas 72     if (transform == SourceItemTransform.PARENT_TO_CHILD)
6774 17 Mar 15 nicklas 73     {
6774 17 Mar 15 nicklas 74       // Transforming a list of parent items to child samples
6790 20 Mar 15 nicklas 75       // We do step-wise loading from BIOSOURCE -> SAMPLE
6790 20 Mar 15 nicklas 76       if (sourceItemType == Item.BIOSOURCE)
6774 17 Mar 15 nicklas 77       {
6774 17 Mar 15 nicklas 78         // Load child samples of the biosources
6774 17 Mar 15 nicklas 79         chain.add(new BioSourceToSampleTransformer());
6790 20 Mar 15 nicklas 80         stepBySource = Item.SAMPLE;
6774 17 Mar 15 nicklas 81       }
6790 20 Mar 15 nicklas 82       if (sourceItemType == Item.SAMPLE || stepBySource == Item.SAMPLE)
6790 20 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));
6790 20 Mar 15 nicklas 86         // Load child samples and maybe include source samples
6790 20 Mar 15 nicklas 87         chain.add(new SampleToChildSampleTransformer(sourceItemType != Item.SAMPLE));
6790 20 Mar 15 nicklas 88       }
6774 17 Mar 15 nicklas 89     }
6774 17 Mar 15 nicklas 90     else if (transform == SourceItemTransform.CHILD_TO_PARENT)
6774 17 Mar 15 nicklas 91     {
6774 17 Mar 15 nicklas 92       // Transforming a list of child items to parent samples
6791 23 Mar 15 nicklas 93       // We do step-wise loading from RAWBIOASSAY -> DERIVEDBIOASSAY -> PHYSICALBIOASSAY -> EXTRACT -> SAMPLE
6791 23 Mar 15 nicklas 94       
6791 23 Mar 15 nicklas 95       // Use utility function to add transformation up to the extract level
8094 04 Nov 22 nicklas 96       ToExtractSourceItemTransformerFactory.childToParentChain(chain, sourceItemType, Item.SAMPLE, false);
6791 23 Mar 15 nicklas 97       if (chain.size() > 0) 
6775 17 Mar 15 nicklas 98       {
6791 23 Mar 15 nicklas 99         // We got some extracts, load parent samples
6775 17 Mar 15 nicklas 100         chain.add(new ExtractToSampleTransformer());
6790 20 Mar 15 nicklas 101         stepBySource = Item.SAMPLE;
6775 17 Mar 15 nicklas 102       }
6791 23 Mar 15 nicklas 103       
6790 20 Mar 15 nicklas 104       if (sourceItemType == Item.SAMPLE || stepBySource == Item.SAMPLE)
6790 20 Mar 15 nicklas 105       {
6790 20 Mar 15 nicklas 106         // Load parent samples and maybe include source samples
6790 20 Mar 15 nicklas 107         chain.add(new SampleToParentSampleTransformer(sourceItemType != Item.SAMPLE));
8094 04 Nov 22 nicklas 108         // Also include child samples that have push-to-parent flag set
8094 04 Nov 22 nicklas 109         if (includeChildrenThatPushToParent)
8094 04 Nov 22 nicklas 110         {
8094 04 Nov 22 nicklas 111           chain.add(new SampleToChildSampleTransformer(true, true));
8094 04 Nov 22 nicklas 112         }
6790 20 Mar 15 nicklas 113       }
6774 17 Mar 15 nicklas 114     }
6774 17 Mar 15 nicklas 115
6774 17 Mar 15 nicklas 116     return chain.size() == 0 ? null : new SourceItemTransformerChain(chain);
6774 17 Mar 15 nicklas 117   }
6774 17 Mar 15 nicklas 118
6774 17 Mar 15 nicklas 119 }