/* * #%L * gitools-core * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ package org.gitools.matrix.model; import org.gitools.api.matrix.*; import org.gitools.resource.Resource; import java.util.HashMap; import java.util.Map; public abstract class AbstractMatrix<ML extends IMatrixLayers<? extends IMatrixLayer>, MD extends IMatrixDimension> extends Resource implements IMatrix { private MatrixDimensionKey[] dimensions; private Map<MatrixDimensionKey, MD> identifiers; private ML layers; private transient Map<IKey, Object> cache; @Override public IMatrixPosition newPosition() { return new MatrixPosition(this); } @Override public IMatrix subset(IMatrixDimension... dimensionSubsets) { throw new UnsupportedOperationException(getClass().getSimpleName() + " don't support subsetting"); } public AbstractMatrix(ML layers, MD... identifiers) { this.layers = layers; this.dimensions = new MatrixDimensionKey[identifiers.length]; this.identifiers = new HashMap<>(identifiers.length); for (int i = 0; i < identifiers.length; i++) { MD identifier = identifiers[i]; this.dimensions[i] = identifier.getId(); this.identifiers.put(identifier.getId(), identifier); } } @Override public ML getLayers() { return layers; } public void setLayers(ML layers) { this.layers = layers; } @Override public MD getDimension(MatrixDimensionKey dimension) { return identifiers.get(dimension); } @Override public MatrixDimensionKey[] getDimensionKeys() { return dimensions; } @Override public <T> T get(IMatrixLayer<T> layer, IMatrixPosition position) { return get(layer, position.toVector()); } @Override public <T> void set(IMatrixLayer<T> layer, T value, IMatrixPosition position) { set(layer, value, position.toVector()); } @Override public MD getRows() { return getDimension(dimensions[0]); } @Override public MD getColumns() { return getDimension(dimensions[1]); } @Override public void detach(IMatrixLayer topLayer) { this.cache = null; for (IMatrixLayer layer : layers) { if (topLayer == layer) { continue; } layer.detach(); } } public <T> void setMetadata(IKey<T> key, T value) { this.getCacheMap().put(key, value); } public <T> T getMetadata(IKey<T> key) { return (T) this.getCacheMap().get(key); } private Map<IKey, Object> getCacheMap() { if (cache == null) { cache = new HashMap<>(); } return cache; } }