/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.components.parametricstudy.gui.view; import java.io.Serializable; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import de.rcenvironment.components.parametricstudy.common.Dimension; import de.rcenvironment.components.parametricstudy.common.Measure; import de.rcenvironment.components.parametricstudy.common.ParametricStudyService; import de.rcenvironment.components.parametricstudy.common.Study; import de.rcenvironment.components.parametricstudy.common.StudyDataset; import de.rcenvironment.components.parametricstudy.common.StudyPublisher; import de.rcenvironment.components.parametricstudy.common.StudyReceiver; import de.rcenvironment.components.parametricstudy.common.StudyStructure; import de.rcenvironment.core.communication.common.ResolvableNodeId; /** * Study holding values generated by the {@link ParametricStudyComponent}. * @author Christian Weiss */ public final class StudyDatastore extends Study { private static final long serialVersionUID = 990775937058384209L; // needed to hold reference otherwise it is can not be called back private static DatasetNotificationSubscriber notificationSubscriber; private final List<StudyDataset> datasets = Collections.synchronizedList(new LinkedList<StudyDataset>()); private final List<StudyDatasetAddListener> listeners = new LinkedList<StudyDatasetAddListener>(); private final Map<String, Double> minValues = new HashMap<String, Double>(); private final Map<String, Double> maxValues = new HashMap<String, Double>(); public StudyDatastore(final String identifier, final String title, final StudyStructure structure) { super(identifier, title, structure); } /** * @param dataset new values. */ public void addDataset(final StudyDataset dataset) { datasets.add(dataset); fireDatasetAdd(dataset); for (final Dimension dimension : getStructure().getDimensions()) { adjustMinMaxRange(dataset, dimension.getName()); } for (final Measure measure : getStructure().getMeasures()) { adjustMinMaxRange(dataset, measure.getName()); } } private void adjustMinMaxRange(final StudyDataset dataset, final String key) { final Serializable value = dataset.getValue(key); if (value instanceof Number) { final Double doubleValue = ((Number) value).doubleValue(); if (minValues.get(key) == null || minValues.get(key) > doubleValue) { minValues.put(key, doubleValue); } if (maxValues.get(key) == null || maxValues.get(key) < doubleValue) { maxValues.put(key, doubleValue); } } } public Collection<StudyDataset> getDatasets() { return Collections.unmodifiableCollection(datasets); } public int getDatasetCount() { return datasets.size(); } /** * @param key of the relevant value chain. * @return the minimum value of the chain. */ public Double getMinValue(final String key) { return minValues.get(key); } /** * @param key of the relevant value chain. * @return the maximum value of the chain. */ public Double getMaxValue(final String key) { return maxValues.get(key); } /** * Connects a {@link StudyReceiver} to the {@link StudyPublisher}. * @param identifier the unique identifier * @param platform the platform to receive updates from * @param parametricStudyService instance of {@link ParametricStudyService} * @return created {@link StudyDatastore}. */ public static StudyDatastore connect(final String identifier, final ResolvableNodeId platform, ParametricStudyService parametricStudyService) { final StudyReceiver receiver = parametricStudyService.createReceiver(identifier, platform); final StudyDatastore datastore = new StudyDatastore(identifier, receiver.getStudy().getTitle(), receiver.getStudy().getStructure()); notificationSubscriber = new DatasetNotificationSubscriber(datastore); receiver.setNotificationSubscriber(notificationSubscriber); receiver.initialize(); return datastore; } /** * @param listener for {@link StudyDataset}to add. */ public void addDatasetAddListener(final StudyDatasetAddListener listener) { listeners.add(listener); } /** * @param listener for {@link StudyDataset} to remove. */ public void removeDatasetAddListener(final StudyDatasetAddListener listener) { listeners.remove(listener); } private void fireDatasetAdd(final StudyDataset dataset) { final StudyDatasetAddListener[] listenersArray = listeners.toArray(new StudyDatasetAddListener[0]); for (final StudyDatasetAddListener listener : listenersArray) { try { listener.handleStudyDatasetAdd(dataset); } catch (RuntimeException e) { e = null; // ignore } } } /** * Needs to be implemented by classes which are interested in {@link StudyDataset}. * @author Doreen Seider */ public interface StudyDatasetAddListener { /** * @param dataset the new {@link StudyDataset}. */ void handleStudyDatasetAdd(final StudyDataset dataset); } }