/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.integration.swing; import java.util.ArrayList; import java.util.Collections; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import javax.swing.AbstractListModel; import javax.swing.ComboBoxModel; import javax.swing.SwingWorker; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.engine.marketdata.spec.LiveMarketDataSpecification; import com.opengamma.engine.marketdata.spec.MarketDataSpecification; import com.opengamma.provider.livedata.LiveDataMetaDataProvider; import com.opengamma.provider.livedata.LiveDataMetaDataProviderRequest; import com.opengamma.provider.livedata.LiveDataMetaDataProviderResult; /** * List/ComboBox model for live market data specifications */ public class LiveMarketDataSpecificationListModel extends AbstractListModel<String> implements ComboBoxModel<String> { private static final long serialVersionUID = 1L; private Map<String, MarketDataSpecification> _specsByName = Collections.emptyMap(); private Map<MarketDataSpecification, String> _namesBySpec = Collections.emptyMap(); private List<String> _names = Collections.emptyList(); private Object _selected; public LiveMarketDataSpecificationListModel(final List<LiveDataMetaDataProvider> liveDataMetaDataProviders) { SwingWorker<Map<String, MarketDataSpecification>, Object> worker = new SwingWorker<Map<String, MarketDataSpecification>, Object>() { @Override protected Map<String, MarketDataSpecification> doInBackground() throws Exception { Map<String, MarketDataSpecification> specsByName = new LinkedHashMap<>(); for (LiveDataMetaDataProvider liveDataMetaDataProvider : liveDataMetaDataProviders) { LiveDataMetaDataProviderRequest liveDataMetaDataProviderRequest = new LiveDataMetaDataProviderRequest(); LiveDataMetaDataProviderResult metaData = liveDataMetaDataProvider.metaData(liveDataMetaDataProviderRequest); MarketDataSpecification marketDataSpec = LiveMarketDataSpecification.of(metaData.getMetaData().getDescription()); specsByName.put(metaData.getMetaData().getDescription(), marketDataSpec); } return specsByName; } @Override protected void done() { try { _specsByName = get(); _names = new ArrayList<String>(_specsByName.keySet()); _namesBySpec = new LinkedHashMap<MarketDataSpecification, String>(); for (String name : _names) { _namesBySpec.put(_specsByName.get(name), name); } fireIntervalAdded(LiveMarketDataSpecificationListModel.this, 0, _specsByName.size() - 1); } catch (InterruptedException ex) { throw new OpenGammaRuntimeException("InterruptedException retreiving available market data specifications", ex); } catch (ExecutionException ex) { throw new OpenGammaRuntimeException("ExecutionException retreiving available market data specifications", ex); } } }; worker.execute(); } public MarketDataSpecification getMarketDataSpec(String selected) { return _specsByName.get(selected); } @Override public int getSize() { return _specsByName.size(); } @Override public String getElementAt(int index) { return _names.get(index); } @Override public void setSelectedItem(Object anItem) { _selected = anItem; } @Override public Object getSelectedItem() { return _selected; } }