    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.TableView;
    016
    017import java.lang.reflect.Constructor;
    018import java.util.BitSet;
    019import java.util.HashMap;
    020
    021import hdf.object.Attribute;
    022import hdf.object.CompoundDS;
    023import hdf.object.DataFormat;
    024import hdf.object.FileFormat;
    025import hdf.object.HObject;
    026import hdf.object.ScalarDS;
    027import hdf.view.Tools;
    028import hdf.view.ViewProperties;
    029import hdf.view.DataView.DataViewManager;
    030
    031/**
    032 * A simple Factory class which returns concrete instances of the default
    033 * TableView, based on whether the data object to be viewed is a scalar or
    034 * compound dataset or is an attribute.
    035 *
    036 * @author jhenderson
    037 * @version 1.0 4/18/2018
    038 */
    039public class DefaultTableViewFactory extends TableViewFactory {
    040
    041    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(DefaultTableViewFactory.class);
    042
    043    @SuppressWarnings({ "rawtypes", "unchecked" })
    044    @Override
    045    public TableView getTableView(DataViewManager viewer, HashMap dataPropertiesMap) throws ClassNotFoundException {
    046        String dataViewName = null;
    047        Object[] initargs = { viewer, dataPropertiesMap };
    048        TableView theView = null;
    049        HObject dataObject = null;
    050
    051        /* Retrieve the data object to be displayed */
    052        if (dataPropertiesMap != null)
    053            dataObject = (HObject) dataPropertiesMap.get(ViewProperties.DATA_VIEW_KEY.OBJECT);
    054
    055        if (dataObject == null)
    056            dataObject = viewer.getTreeView().getCurrentObject();
    057
    058        if (dataObject == null) {
    059            log.debug("getTableView(): data object is null");
    060            return null;
    061        }
    062
    063        /*
    064         * If the name of a specific TableView class to use has been passed in via the
    065         * data options map, retrieve its name now, otherwise use the default TableView
    066         * class.
    067         */
    068        dataViewName = (String) dataPropertiesMap.get(ViewProperties.DATA_VIEW_KEY.VIEW_NAME);
    069        if (dataViewName == null || dataViewName.equals(ViewProperties.DEFAULT_MODULE_TEXT)) {
    070            if (dataObject instanceof ScalarDS)
    071                dataViewName = ViewProperties.DEFAULT_SCALAR_DATASET_TABLEVIEW_NAME;
    072            else if (dataObject instanceof CompoundDS)
    073                dataViewName = ViewProperties.DEFAULT_COMPOUND_DATASET_TABLEVIEW_NAME;
    074            else if (dataObject instanceof Attribute) {
    075                if (((Attribute) dataObject).getDatatype().isCompound())
    076                    dataViewName = ViewProperties.DEFAULT_COMPOUND_DATASET_TABLEVIEW_NAME;
    077                else
    078                    dataViewName = ViewProperties.DEFAULT_SCALAR_ATTRIBUTE_TABLEVIEW_NAME;
    079            }
    080            else
    081                dataViewName = null;
    082        }
    083
    084        Class<?> theClass = null;
    085        try {
    086            log.trace("getTableView(): Class.forName({})", dataViewName);
    087
    088            /* Attempt to load the class by the given name */
    089            theClass = Class.forName(dataViewName);
    090        }
    091        catch (Exception ex) {
    092            log.debug("getTableView(): unable to load default TableView class by name({})", dataViewName);
    093            theClass = null;
    094        }
    095
    096        if (theClass == null) throw new ClassNotFoundException();
    097
    098        /* Check to see if there is a bitmask to be applied to the data */
    099        BitSet bitmask = (BitSet) dataPropertiesMap.get(ViewProperties.DATA_VIEW_KEY.BITMASK);
    100        if (bitmask != null) {
    101            /*
    102             * Create a copy of the data object in order to apply the bitmask
    103             * non-destructively
    104             */
    105            HObject dCopy = null;
    106            Constructor<? extends HObject> constructor = null;
    107            Object[] paramObj = null;
    108
    109            try {
    110                Class<?>[] paramClass = { FileFormat.class, String.class, String.class, long[].class };
    111                constructor = dataObject.getClass().getConstructor(paramClass);
    112
    113                paramObj = new Object[] { dataObject.getFileFormat(), dataObject.getName(), dataObject.getPath(),
    114                        dataObject.getOID() };
    115            }
    116            catch (Exception ex) {
    117                constructor = null;
    118            }
    119
    120            if (constructor != null) {
    121                try {
    122                    dCopy = constructor.newInstance(paramObj);
    123                }
    124                catch (Exception ex) {
    125                    dCopy = null;
    126                }
    127            }
    128
    129            if (dCopy != null) {
    130                try {
    131                    ((DataFormat) dCopy).init();
    132
    133                    int rank = ((DataFormat) dataObject).getRank();
    134                    System.arraycopy(((DataFormat) dataObject).getDims(), 0, ((DataFormat) dCopy).getDims(), 0, rank);
    135                    System.arraycopy(((DataFormat) dataObject).getStartDims(), 0, ((DataFormat) dCopy).getStartDims(),0, rank);
    136                    System.arraycopy(((DataFormat) dataObject).getSelectedDims(), 0, ((DataFormat) dCopy).getSelectedDims(), 0, rank);
    137                    System.arraycopy(((DataFormat) dataObject).getStride(), 0, ((DataFormat) dCopy).getStride(), 0, rank);
    138                    System.arraycopy(((DataFormat) dataObject).getSelectedIndex(), 0, ((DataFormat) dCopy).getSelectedIndex(), 0, 3);
    139                }
    140                catch (Exception ex) {
    141                    ex.printStackTrace();
    142                }
    143
    144                dataPropertiesMap.put(ViewProperties.DATA_VIEW_KEY.OBJECT, dCopy);
    145            }
    146        }
    147
    148        try {
    149            theView = (TableView) Tools.newInstance(theClass, initargs);
    150
    151            log.trace("getTableView(): returning TableView instance {}", theView);
    152        }
    153        catch (Exception ex) {
    154            log.debug("getTableView(): Error instantiating class:", ex);
    155            theView = null;
    156        }
    157
    158        return theView;
    159    }
    160
    161}