/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.config.impl;
import static com.google.common.collect.Maps.newHashMap;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import com.opengamma.core.AbstractSource;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.core.config.ConfigSource;
import com.opengamma.core.config.impl.ConfigItem;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.VersionCorrection;
import com.opengamma.master.config.ConfigDocument;
import com.opengamma.master.config.ConfigMaster;
import com.opengamma.master.config.ConfigSearchRequest;
import com.opengamma.master.config.ConfigSearchResult;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.PublicSPI;
/**
* A {@code ConfigSource} implemented using an underlying {@code ConfigMaster}.
* <p>
* The {@link ConfigSource} interface provides securities to the engine via a narrow API. This class provides the source on top of a standard {@link ConfigMaster}.
*/
@PublicSPI
public class MasterConfigSource extends AbstractSource<ConfigItem<?>> implements ConfigSource {
/**
* The config master.
*/
private final ConfigMaster _configMaster;
/**
* Creates an instance with an underlying config master.
*
* @param configMaster the config master, not null
*/
public MasterConfigSource(final ConfigMaster configMaster) {
ArgumentChecker.notNull(configMaster, "configMaster");
_configMaster = configMaster;
}
//-------------------------------------------------------------------------
/**
* Gets the underlying config master.
*
* @return the config master, not null
*/
public ConfigMaster getMaster() {
return _configMaster;
}
/**
* Gets the change manager.
*
* @return the change manager, not null
*/
@Override
public ChangeManager changeManager() {
return getMaster().changeManager();
}
//-------------------------------------------------------------------------
/**
* Search for configuration elements using a request object.
*
* @param <R> the type of configuration element
* @param request the request object with value for search fields, not null
* @return all configuration elements matching the request, not null
*/
public <R> List<ConfigItem<R>> search(final ConfigSearchRequest<R> request) {
ArgumentChecker.notNull(request, "request");
ArgumentChecker.notNull(request.getType(), "request.type");
final ConfigSearchResult<R> searchResult = getMaster().search(request);
return searchResult.getValues();
}
//-------------------------------------------------------------------------
@Override
@SuppressWarnings("unchecked")
public <R> R getConfig(final Class<R> clazz, final UniqueId uniqueId) {
final ConfigItem<?> item = getMaster().get(uniqueId).getConfig();
if (clazz.isAssignableFrom(item.getType())) {
return (R) item.getValue();
} else {
return null;
}
}
@Override
public ConfigItem<?> get(final ObjectId objectId, final VersionCorrection versionCorrection) {
return getMaster().get(objectId, versionCorrection).getConfig();
}
@Override
public ConfigItem<?> get(final UniqueId uniqueId) {
return getMaster().get(uniqueId).getConfig();
}
@Override
public <R> R getSingle(final Class<R> clazz, final String configName, final VersionCorrection versionCorrection) {
final Collection<ConfigItem<R>> result = get(clazz, configName, versionCorrection);
if (!result.isEmpty()) {
return result.iterator().next().getValue();
}
return null;
}
@SuppressWarnings("unchecked")
@Override
public <R> R getConfig(final Class<R> clazz, final ObjectId objectId, final VersionCorrection versionCorrection) {
final ConfigItem<?> item = getMaster().get(objectId, versionCorrection).getConfig();
if (clazz.isAssignableFrom(item.getType())) {
return (R) item.getValue();
} else {
return null;
}
}
@Override
public <R> Collection<ConfigItem<R>> get(final Class<R> clazz, final String configName, final VersionCorrection versionCorrection) {
final ConfigSearchRequest<R> searchRequest = new ConfigSearchRequest<R>(clazz);
searchRequest.setName(configName);
searchRequest.setVersionCorrection(versionCorrection);
return getMaster().search(searchRequest).getValues();
}
@Override
public <R> Collection<ConfigItem<R>> getAll(final Class<R> clazz, final VersionCorrection versionCorrection) {
final ConfigSearchRequest<R> searchRequest = new ConfigSearchRequest<R>(clazz);
searchRequest.setType(clazz);
searchRequest.setVersionCorrection(versionCorrection);
return getMaster().search(searchRequest).getValues();
}
@Override
public <R> R getLatestByName(final Class<R> clazz, final String name) {
return getSingle(clazz, name, VersionCorrection.LATEST);
}
@Override
public Map<UniqueId, ConfigItem<?>> get(final Collection<UniqueId> uniqueIds) {
final Map<UniqueId, ConfigDocument> result = getMaster().get(uniqueIds);
final Map<UniqueId, ConfigItem<?>> map = newHashMap();
for (final UniqueId uid : result.keySet()) {
map.put(uid, result.get(uid).getConfig());
}
return map;
}
//-------------------------------------------------------------------------
@Override
public String toString() {
return "MasterConfigSource[" + getMaster() + "]";
}
}