001/***************************************************************************** 002 * Copyright by The HDF Group. * 003 * Copyright by the Board of Trustees of the University of Illinois. * 004 * All rights reserved. * 005 * * 006 * This file is part of the HDF Java Products distribution. * 007 * The full copyright notice, including terms governing use, modification, * 008 * and redistribution, is contained in the files COPYING and Copyright.html. * 009 * COPYING can be found at the root of the source code distribution tree. * 010 * Or, see https://support.hdfgroup.org/products/licenses.html * 011 * If you do not have access to either file, you may request a copy from * 012 * help@hdfgroup.org. * 013 ****************************************************************************/ 014 015package hdf.view.DataView; 016 017import java.util.List; 018 019import hdf.view.Tools; 020import hdf.view.ViewProperties; 021import hdf.view.ViewProperties.DataViewType; 022import hdf.view.ImageView.DefaultImageViewFactory; 023import hdf.view.MetaDataView.DefaultMetaDataViewFactory; 024import hdf.view.PaletteView.DefaultPaletteViewFactory; 025import hdf.view.TableView.DefaultTableViewFactory; 026import hdf.view.TreeView.DefaultTreeViewFactory; 027 028/** 029 * Following the Abstract Factory Pattern, represents a class to produce 030 * different types of DataView factory classes depending on the given 031 * DataViewType enum value. 032 * 033 * @author jhenderson 034 * @version 1.0 4/17/2018 035 */ 036public class DataViewFactoryProducer { 037 038 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(DataViewFactoryProducer.class); 039 040 public static DataViewFactory getFactory(DataViewType viewType) throws Exception { 041 String factoryClassName = null; 042 DataViewFactory theFactory = null; 043 List<?> moduleList = null; 044 045 /* 046 * First determine if we are using the default module for the requested DataViewFactory 047 * class. If not, we will attempt to load the given DataViewFactory class. 048 */ 049 switch (viewType) { 050 case TABLE: 051 /* Retrieve the "currently selected" TableViewFactory class to use */ 052 moduleList = ViewProperties.getTableViewList(); 053 if ((moduleList == null) || (moduleList.size() <= 0)) { 054 return null; 055 } 056 057 factoryClassName = (String) moduleList.get(0); 058 059 if (factoryClassName.equals(ViewProperties.DEFAULT_MODULE_TEXT)) { 060 log.trace("getFactory(): returning default TableView factory instance"); 061 return new DefaultTableViewFactory(); 062 } 063 064 break; 065 066 case IMAGE: 067 /* Retrieve the "currently selected" ImageViewFactory class to use */ 068 moduleList = ViewProperties.getImageViewList(); 069 if ((moduleList == null) || (moduleList.size() <= 0)) { 070 return null; 071 } 072 073 factoryClassName = (String) moduleList.get(0); 074 075 if (factoryClassName.equals(ViewProperties.DEFAULT_MODULE_TEXT)) { 076 log.trace("getFactory(): returning default ImageView factory instance"); 077 return new DefaultImageViewFactory(); 078 } 079 080 break; 081 082 case PALETTE: 083 /* Retrieve the "currently selected" PaletteViewFactory class to use */ 084 moduleList = ViewProperties.getPaletteViewList(); 085 if ((moduleList == null) || (moduleList.size() <= 0)) { 086 return null; 087 } 088 089 factoryClassName = (String) moduleList.get(0); 090 091 if (factoryClassName.equals(ViewProperties.DEFAULT_MODULE_TEXT)) { 092 log.trace("getFactory(): returning default PaletteView factory instance"); 093 return new DefaultPaletteViewFactory(); 094 } 095 096 break; 097 098 case METADATA: 099 /* Retrieve the "currently selected" MetaDataViewFactory class to use */ 100 moduleList = ViewProperties.getMetaDataViewList(); 101 if ((moduleList == null) || (moduleList.size() <= 0)) { 102 return null; 103 } 104 105 factoryClassName = (String) moduleList.get(0); 106 107 if (factoryClassName.equals(ViewProperties.DEFAULT_MODULE_TEXT)) { 108 log.trace("getFactory(): returning default MetaDataView factory instance"); 109 return new DefaultMetaDataViewFactory(); 110 } 111 112 break; 113 114 case TREEVIEW: 115 /* Retrieve the "currently selected" TreeViewFactory class to use */ 116 moduleList = ViewProperties.getTreeViewList(); 117 if ((moduleList == null) || (moduleList.size() <= 0)) { 118 return null; 119 } 120 121 factoryClassName = (String) moduleList.get(0); 122 123 if (factoryClassName.equals(ViewProperties.DEFAULT_MODULE_TEXT)) { 124 log.trace("getFactory(): returning default TreeView factory instance"); 125 return new DefaultTreeViewFactory(); 126 } 127 128 break; 129 130 default: 131 throw new Exception("getFactory(): invalid DataViewType"); 132 } 133 134 Class<?> theClass = null; 135 try { 136 log.trace("getFactory(): ViewProperties.loadExtClass().loadClass({})", factoryClassName); 137 138 /* Attempt to load the class as an external module */ 139 theClass = ViewProperties.loadExtClass().loadClass(factoryClassName); 140 } 141 catch (Exception ex) { 142 log.debug("getFactory(): ViewProperties.loadExtClass().loadClass({}) failure:", factoryClassName, ex); 143 144 try { 145 log.trace("getFactory(): Class.forName({})", factoryClassName); 146 147 /* Attempt to load the class directly by the given name */ 148 theClass = Class.forName(factoryClassName); 149 } 150 catch (Exception ex2) { 151 log.debug("getFactory(): Class.forName({}) failure:", factoryClassName, ex); 152 153 /* At this point, we have no choice but to fall back to the default modules */ 154 switch (viewType) { 155 case TABLE: 156 log.trace("getFactory(): returning default TableView factory instance"); 157 return new DefaultTableViewFactory(); 158 case IMAGE: 159 log.trace("getFactory(): returning default ImageView factory instance"); 160 return new DefaultImageViewFactory(); 161 case PALETTE: 162 log.trace("getFactory(): returning default PaletteView factory instance"); 163 return new DefaultPaletteViewFactory(); 164 case METADATA: 165 log.trace("getFactory(): returning default MetaDataView factory instance"); 166 return new DefaultMetaDataViewFactory(); 167 case TREEVIEW: 168 log.trace("getFactory(): returning default TreeView factory instance"); 169 return new DefaultTreeViewFactory(); 170 default: 171 throw new Exception("getFactory(): invalid DataViewType"); 172 } 173 } 174 } 175 176 if (theClass == null) throw new ClassNotFoundException(); 177 178 try { 179 theFactory = (DataViewFactory) Tools.newInstance(theClass, null); 180 181 log.trace("getFactory(): returning DataViewFactory instance {}", theFactory); 182 } 183 catch (Exception ex) { 184 log.debug("getFactory(): Error instantiating class:", ex); 185 theFactory = null; 186 } 187 188 return theFactory; 189 } 190}