extensions/net.sf.basedb.reggie/trunk/src/net/sf/basedb/reggie/plugins/release/CohortWriter.java

Code
Comments
Other
Rev Date Author Line
3935 13 May 16 nicklas 1 package net.sf.basedb.reggie.plugins.release;
3935 13 May 16 nicklas 2
4437 31 Mar 17 nicklas 3 import java.time.LocalDateTime;
4437 31 Mar 17 nicklas 4 import java.time.temporal.ChronoField;
3936 16 May 16 nicklas 5 import java.util.Collection;
4469 26 Apr 17 nicklas 6 import java.util.Collections;
4469 26 Apr 17 nicklas 7 import java.util.List;
3936 16 May 16 nicklas 8
5091 14 Nov 18 nicklas 9 import org.json.simple.JSONArray;
4371 02 Mar 17 nicklas 10
3935 13 May 16 nicklas 11 import net.sf.basedb.core.DbControl;
3935 13 May 16 nicklas 12 import net.sf.basedb.core.Nameable;
3936 16 May 16 nicklas 13 import net.sf.basedb.reggie.dao.ReggieItem;
3936 16 May 16 nicklas 14 import net.sf.basedb.util.Values;
3936 16 May 16 nicklas 15 import net.sf.basedb.util.formatter.Formatter;
3935 13 May 16 nicklas 16
3935 13 May 16 nicklas 17 /**
3935 13 May 16 nicklas 18   Abstract base class for writing cohort data tables.
3935 13 May 16 nicklas 19   Subclasses must implement the {@link #writeCohortData(CohortItem)}
3935 13 May 16 nicklas 20   method and make sure the header line is written first.
7022 06 Feb 23 nicklas 21   
7022 06 Feb 23 nicklas 22   Implementing classes need to be thread-safe since they are
7022 06 Feb 23 nicklas 23   used with multiple exporter threads at the same time.
7022 06 Feb 23 nicklas 24   See {@link ReleaseExporter#exportCohortData()}.
3935 13 May 16 nicklas 25
3935 13 May 16 nicklas 26   @author nicklas
3935 13 May 16 nicklas 27   @since 4.5
3935 13 May 16 nicklas 28 */
3935 13 May 16 nicklas 29 public abstract class CohortWriter 
3935 13 May 16 nicklas 30 {
3935 13 May 16 nicklas 31   
3936 16 May 16 nicklas 32   /**
3936 16 May 16 nicklas 33      Formatter for displaying the name of ReggieItem:s
3936 16 May 16 nicklas 34   */
3936 16 May 16 nicklas 35   public static final Formatter<ReggieItem<?>> ITEM_TO_NAME = new Formatter<ReggieItem<?>>()
3936 16 May 16 nicklas 36   {
3936 16 May 16 nicklas 37     @Override
3936 16 May 16 nicklas 38     public String format(ReggieItem<?> item) 
3936 16 May 16 nicklas 39     {
3936 16 May 16 nicklas 40       return item == null ? null : item.getName();
3936 16 May 16 nicklas 41     }
3936 16 May 16 nicklas 42     @Override
3936 16 May 16 nicklas 43     public ReggieItem<?> parseString(String s) 
3936 16 May 16 nicklas 44     {
3936 16 May 16 nicklas 45       return null;
3936 16 May 16 nicklas 46     }
3936 16 May 16 nicklas 47   };
3936 16 May 16 nicklas 48   
4437 31 Mar 17 nicklas 49   /**
4437 31 Mar 17 nicklas 50     Checks if a (non-null) date+time is at midnight or not.
4437 31 Mar 17 nicklas 51     @since 4.10
4437 31 Mar 17 nicklas 52   */
4437 31 Mar 17 nicklas 53   public static boolean atMidnight(LocalDateTime dateTime)
4437 31 Mar 17 nicklas 54   {
4437 31 Mar 17 nicklas 55     return dateTime.get(ChronoField.MINUTE_OF_DAY) == 0;
4437 31 Mar 17 nicklas 56   }
4437 31 Mar 17 nicklas 57
4437 31 Mar 17 nicklas 58   
5090 14 Nov 18 nicklas 59   private final DbControl dc;
5090 14 Nov 18 nicklas 60   private final ReleaseWriterOptions options;
5090 14 Nov 18 nicklas 61
5090 14 Nov 18 nicklas 62   protected CohortWriter(DbControl dc, ReleaseWriterOptions options)
3935 13 May 16 nicklas 63   {
5090 14 Nov 18 nicklas 64     this.dc = dc;
5090 14 Nov 18 nicklas 65     this.options = options;
3935 13 May 16 nicklas 66   }
3935 13 May 16 nicklas 67   
3935 13 May 16 nicklas 68   /**
5090 14 Nov 18 nicklas 69     Get the DbControl used in the writing transaction. It should not be used
5090 14 Nov 18 nicklas 70     for reading cohort item data since that may consume too much memory as the
5090 14 Nov 18 nicklas 71     cache in Hibernate is filled.
3943 17 May 16 nicklas 72   */
5090 14 Nov 18 nicklas 73   public DbControl getDbControl()
5090 14 Nov 18 nicklas 74   {
5090 14 Nov 18 nicklas 75     return dc;
5090 14 Nov 18 nicklas 76   }
3943 17 May 16 nicklas 77   
3943 17 May 16 nicklas 78   /**
5090 14 Nov 18 nicklas 79     Get the options for this release writer.
3935 13 May 16 nicklas 80   */
5090 14 Nov 18 nicklas 81   public ReleaseWriterOptions getOptions()
5090 14 Nov 18 nicklas 82   {
5090 14 Nov 18 nicklas 83     return options;
5090 14 Nov 18 nicklas 84   }
5090 14 Nov 18 nicklas 85
3935 13 May 16 nicklas 86   
3935 13 May 16 nicklas 87   /**
5091 14 Nov 18 nicklas 88     Get item data as a JSON object. Subclasses that
4371 02 Mar 17 nicklas 89     wants to return JSON data should override this 
5091 14 Nov 18 nicklas 90     method and may return any number of objects.
4371 02 Mar 17 nicklas 91     
4371 02 Mar 17 nicklas 92     @param item The cohort item
4371 02 Mar 17 nicklas 93     @return A JSON object, or null if no JSON should
4371 02 Mar 17 nicklas 94       be exported
5091 14 Nov 18 nicklas 95     @since 4.21
4371 02 Mar 17 nicklas 96   */
5091 14 Nov 18 nicklas 97   public abstract JSONArray toJSONObjects(CohortItem item);
4371 02 Mar 17 nicklas 98   
4371 02 Mar 17 nicklas 99   /**
4408 20 Mar 17 nicklas 100     Get type definitions that are output as part of
4378 03 Mar 17 nicklas 101     JSON data in {@link #toJSONObject(CohortItem)}. 
4378 03 Mar 17 nicklas 102     The information from all writers are collected into
4408 20 Mar 17 nicklas 103     "typedefs.json" file which is stored together with
4378 03 Mar 17 nicklas 104     the exported files and used for automatic creation of
4408 20 Mar 17 nicklas 105     types on the import side.
4378 03 Mar 17 nicklas 106     
4469 26 Apr 17 nicklas 107     The default implementation return an empty list. 
4469 26 Apr 17 nicklas 108     Subclasses that need to define types should override 
4469 26 Apr 17 nicklas 109     this method.
4378 03 Mar 17 nicklas 110     @since 4.10
4378 03 Mar 17 nicklas 111   */
4469 26 Apr 17 nicklas 112   public List<CohortTypeDef> getTypeDefsInJSON()
4378 03 Mar 17 nicklas 113   {
4469 26 Apr 17 nicklas 114     return Collections.emptyList();
4378 03 Mar 17 nicklas 115   }
4378 03 Mar 17 nicklas 116   
4379 06 Mar 17 nicklas 117   
4378 03 Mar 17 nicklas 118   /**
3935 13 May 16 nicklas 119     Helper method for getting the name of an item.
3935 13 May 16 nicklas 120     Return null if the item is null.
3935 13 May 16 nicklas 121   */
3935 13 May 16 nicklas 122   public String getName(Nameable item)
3935 13 May 16 nicklas 123   {
3935 13 May 16 nicklas 124     return item == null ? null : item.getName();
3935 13 May 16 nicklas 125   }
3935 13 May 16 nicklas 126
3936 16 May 16 nicklas 127   /**
7010 25 Jan 23 nicklas 128     Helper method for getting the name of an item.
7010 25 Jan 23 nicklas 129     Return null if the item is null.
7010 25 Jan 23 nicklas 130     @since 4.44
7010 25 Jan 23 nicklas 131   */
7010 25 Jan 23 nicklas 132   public String getName(ReggieItem<?> item)
7010 25 Jan 23 nicklas 133   {
7010 25 Jan 23 nicklas 134     return item == null ? null : item.getName();
7010 25 Jan 23 nicklas 135   }
7010 25 Jan 23 nicklas 136   
7010 25 Jan 23 nicklas 137   /**
3936 16 May 16 nicklas 138     Helper method for getting the name of
3936 16 May 16 nicklas 139     multiple items as a comma-separated list.
3936 16 May 16 nicklas 140   */
3936 16 May 16 nicklas 141   public String getNames(Collection<? extends ReggieItem<?>> items)
3936 16 May 16 nicklas 142   {
3936 16 May 16 nicklas 143     return Values.getString(items, ",", true, ITEM_TO_NAME);
3936 16 May 16 nicklas 144   }
3936 16 May 16 nicklas 145
3935 13 May 16 nicklas 146 }