3737import java .net .MalformedURLException ;
3838import java .util .ArrayList ;
3939import java .util .Arrays ;
40+ import java .util .Collection ;
4041import java .util .Collections ;
42+ import java .util .EnumMap ;
4143import java .util .HashSet ;
4244import java .util .LinkedHashSet ;
4345import java .util .List ;
@@ -77,13 +79,26 @@ public final class DataModel {
7779 private static final String TEST_DIR = "src/test/resources/" ;
7880
7981 /** lazy DataModel singleton */
80- private static DataModel INSTANCE = null ;
82+ private static final EnumMap <OIFitsStandard , DataModel > INSTANCES = new EnumMap (OIFitsStandard .class );
83+
84+ public static synchronized DataModel getInstance () {
85+ return getInstance (OIFitsStandard .VERSION_2 );
86+ }
8187
8288 public static synchronized DataModel getInstance (final OIFitsStandard version ) {
83- if (INSTANCE == null ) {
84- INSTANCE = new DataModel (version );
89+ DataModel dm = INSTANCES .get (version );
90+ if (dm == null ) {
91+ dm = new DataModel (version );
92+ INSTANCES .put (version , dm );
93+ }
94+ return dm ;
95+ }
96+
97+ public static DataModel getInstance (final Collection <OIData > oiDatas ) {
98+ if (oiDatas == null || oiDatas .isEmpty ()) {
99+ return getInstance ();
85100 }
86- return INSTANCE ;
101+ return new DataModel ( oiDatas , false ) ;
87102 }
88103
89104 /**
@@ -552,85 +567,107 @@ private static void dump(final boolean all) {
552567 }
553568 }
554569
570+ private static OIFitsFile createOIFitsFile (final OIFitsStandard version ) {
571+ switch (version ) {
572+ case VERSION_1 :
573+ return createOIFitsFileV1 ();
574+ default :
575+ case VERSION_2 :
576+ return createOIFitsFileV2 ();
577+ }
578+ }
579+
555580 // members:
556- private final OIFitsFile oiFitsFile ;
581+ private final boolean shared ;
582+ private final Collection <OIData > oiDatas ;
557583 /* cached values */
558- private Set <String > columnNames = null ;
559- private Set <String > columnNames1D = null ;
560- private Set <String > columnNames2D = null ;
584+ private Set <String > allColumnNames = null ;
585+ private Set <String > allColumnNames1D = null ;
586+ private Set <String > allColumnNames2D = null ;
561587
562588 private DataModel (final OIFitsStandard version ) {
563- this . oiFitsFile = ( version == OIFitsStandard . VERSION_2 ) ? createOIFitsFileV2 () : createOIFitsFileV1 ( );
589+ this ( createOIFitsFile ( version ). getOiDataList (), true );
564590 }
565591
566- // public API:
567- public OIFitsFile getOiFitsFile () {
568- return oiFitsFile ;
592+ private DataModel (final Collection <OIData > oiDatas , final boolean shared ) {
593+ logger .log (Level .INFO , "new DataModel for {0}" , oiDatas );
594+ this .oiDatas = oiDatas ;
595+ this .shared = shared ;
596+ }
597+
598+ private void reset () {
599+ allColumnNames = null ;
600+ allColumnNames1D = null ;
601+ allColumnNames2D = null ;
602+ }
603+
604+ public void refresh () {
605+ if (!shared ) {
606+ reset ();
607+ }
608+ }
609+
610+ // public API ?
611+ private Collection <OIData > getOiDatas () {
612+ return oiDatas ;
569613 }
570614
571615 public Set <String > getNumericalColumnNames () {
572- if (columnNames == null ) {
573- columnNames = getAllNumericalColumnNames ();
616+ if (allColumnNames == null ) {
617+ allColumnNames = getAllNumericalColumnNames (getOiDatas (), true , false );
574618 }
575- return columnNames ;
619+ return allColumnNames ;
576620 }
577621
578622 public Set <String > getNumericalColumnNames1D () {
579- if (columnNames1D == null ) {
580- columnNames1D = getAllNumericalColumnNames (false );
623+ if (allColumnNames1D == null ) {
624+ allColumnNames1D = getAllNumericalColumnNames (getOiDatas (), false , false );
581625 }
582- return columnNames1D ;
626+ return allColumnNames1D ;
583627 }
584628
585629 public Set <String > getNumericalColumnNames2D () {
586- if (columnNames2D == null ) {
587- columnNames2D = getAllNumericalColumnNames (true );
630+ if (allColumnNames2D == null ) {
631+ allColumnNames2D = getAllNumericalColumnNames (getOiDatas (), false , true );
588632 }
589- return columnNames2D ;
633+ return allColumnNames2D ;
590634 }
591635
592- private Set <String > getAllNumericalColumnNames (final boolean is2D ) {
636+ private static Set <String > getAllNumericalColumnNames (final Collection <OIData > oiDatas ,
637+ final boolean all , final boolean is2D ) {
638+
593639 final Set <String > columnNames = new LinkedHashSet <String >();
594640
595- for (OIData oiData : oiFitsFile .getOiDataList ()) {
596- final List <ColumnMeta > columnsDescCollection = oiData .getNumericalColumnsDescs ();
641+ getAllNumericalColumnNames (oiDatas , OIFitsConstants .TABLE_OI_VIS2 , all , is2D , columnNames );
642+ getAllNumericalColumnNames (oiDatas , OIFitsConstants .TABLE_OI_VIS , all , is2D , columnNames );
643+ getAllNumericalColumnNames (oiDatas , OIFitsConstants .TABLE_OI_T3 , all , is2D , columnNames );
644+ getAllNumericalColumnNames (oiDatas , OIFitsConstants .TABLE_OI_FLUX , all , is2D , columnNames );
597645
598- for (ColumnMeta colMeta : columnsDescCollection ) {
599- if (colMeta != null ) {
600- if (colMeta instanceof WaveColumnMeta ) {
601- if (is2D ) {
602- columnNames .add (colMeta .getName ());
603- }
604- } else if (colMeta .is3D ()) {
605- // not possible in OIData:
606- } else if (!is2D ) {
607- columnNames .add (colMeta .getName ());
608- }
609- }
610- }
611- }
612646 return columnNames ;
613647 }
614648
615- private Set <String > getAllNumericalColumnNames () {
616- final Set <String > columnNames = new LinkedHashSet <String >();
617-
618- for (OIData oiData : oiFitsFile .getOiDataList ()) {
619- final List <ColumnMeta > columnsDescCollection = oiData .getNumericalColumnsDescs ();
620-
621- for (ColumnMeta colMeta : columnsDescCollection ) {
622- if (colMeta != null ) {
623- if (colMeta instanceof WaveColumnMeta ) {
624- columnNames .add (colMeta .getName ());
625- } else if (colMeta .is3D ()) {
626- // not possible in OIData:
627- } else {
628- columnNames .add (colMeta .getName ());
649+ private static void getAllNumericalColumnNames (final Collection <OIData > oiDatas , final String extName ,
650+ final boolean all , final boolean is2D ,
651+ final Set <String > columnNames ) {
652+ for (final OIData oiData : oiDatas ) {
653+ if (extName .equals (oiData .getExtName ())) {
654+ final List <ColumnMeta > columnsDescCollection = oiData .getNumericalColumnsDescs ();
655+
656+ for (final ColumnMeta colMeta : columnsDescCollection ) {
657+ if (colMeta != null ) {
658+ if (colMeta instanceof WaveColumnMeta ) {
659+ if (all || is2D ) {
660+ columnNames .add (colMeta .getName ());
661+ }
662+ } else if (colMeta .is3D ()) {
663+ // not possible in OIData:
664+ } else if (all || !is2D ) {
665+ columnNames .add (colMeta .getName ());
666+ }
629667 }
630668 }
631669 }
632670 }
633- return columnNames ;
634671 }
635672
636673 /**
@@ -641,7 +678,7 @@ public static void main(String[] unused) {
641678 dump (false );
642679 dump (true );
643680
644- final DataModel dm = getInstance (OIFitsStandard . VERSION_2 );
681+ final DataModel dm = getInstance ();
645682
646683 logger .log (Level .WARNING , "columnNames: {0}" , dm .getNumericalColumnNames ());
647684
0 commit comments