001    package org.broadinstitute.genee.matrix;
002    
003    import java.util.ArrayList;
004    import java.util.Collection;
005    import java.util.HashMap;
006    import java.util.List;
007    import java.util.Map;
008    
009    /**
010     * 
011     * Abstract dataset.
012     * 
013     */
014    public abstract class AbstractDataset implements Dataset {
015    
016        protected List<Matrix> matrices = new ArrayList<Matrix>();
017        protected String name;
018        protected Map<Object, Object> properties = new HashMap<Object, Object>();
019        protected List<Class<?>> seriesClasses = new ArrayList<Class<?>>();
020        protected List<String> seriesNames = new ArrayList<String>();
021    
022        public AbstractDataset() {
023        }
024    
025        public int addSeries(String name, Class<?> c) {
026            seriesNames.add(name);
027            seriesClasses.add(c);
028            matrices.add(createMatrix());
029            return seriesNames.size();
030        }
031    
032        @Override
033        public final String getName() {
034            return name;
035        }
036    
037        @Override
038        public Object getObjectValue(int rowIndex, int columnIndex, int seriesIndex) {
039            if (seriesIndex == 0) {
040                return getValue(rowIndex, columnIndex);
041            }
042            Matrix matrix = matrices.get(seriesIndex - 1);
043            return matrix.get(rowIndex, columnIndex);
044        }
045    
046        @Override
047        public Object getProperty(Object key) {
048            return properties.get(key);
049        }
050    
051        @Override
052        public Collection<Object> getPropertyKeys() {
053            return properties.keySet();
054        }
055    
056        @Override
057        public Class<?> getSeriesClass(int series) {
058            if (series == 0) {
059                return Float.class;
060            }
061            return seriesClasses.get(series - 1);
062        }
063    
064        @Override
065        public int getSeriesCount() {
066            return matrices.size() + 1;
067        }
068    
069        @Override
070        public String getSeriesName(int series) {
071            if (series == 0) {
072                return getName();
073            }
074            return seriesNames.get(series - 1);
075        }
076    
077        @Override
078        public float getValue(int rowIndex, int columnIndex, int seriesIndex) {
079            if (seriesIndex == 0) {
080                return getValue(rowIndex, columnIndex);
081            }
082            Matrix matrix = matrices.get(seriesIndex - 1);
083            Number number = (Number) matrix.get(rowIndex, columnIndex);
084            return number != null ? number.floatValue() : Float.NaN;
085        }
086    
087        public void removeSeries(int index) {
088            if (index > 0) {
089                seriesNames.remove(index - 1);
090                seriesClasses.remove(index - 1);
091                matrices.remove(index - 1);
092            }
093        }
094    
095        @Override
096        public void setName(String name) {
097            this.name = name;
098        }
099    
100        /**
101         * Sets the value at the given row and column.
102         * 
103         * @param rowIndex
104         *            the row index.
105         * @param columnIndex
106         *            the column index.
107         * @param seriesIndex
108         *            the series index.
109         * @throws IndexOutOfBoundsException
110         *             if <tt>rowIndex</tt> or <tt>columnIndex</tt> are out of
111         *             range.
112         */
113        public void setObjectValue(int rowIndex, int columnIndex, Object value, int seriesIndex) {
114            if (seriesIndex == 0) {
115                setValue(rowIndex, columnIndex, ((Number) value).floatValue());
116            } else {
117                Matrix m = matrices.get(seriesIndex - 1);
118                m.set(rowIndex, columnIndex, value);
119            }
120        }
121    
122        @Override
123        public void setProperty(Object key, Object value) {
124            if (value == null) {
125                properties.remove(key);
126            } else {
127                properties.put(key, value);
128            }
129        }
130    
131        protected abstract Matrix createMatrix();
132    
133        protected static interface Matrix {
134    
135            public Object get(int row, int column);
136    
137            public void set(int row, int column, Object value);
138        }
139    
140    }