/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core.config.impl; import java.net.URI; import java.util.Collection; import org.fudgemsg.FudgeField; import org.fudgemsg.FudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import com.google.common.collect.Lists; import com.opengamma.DataNotFoundException; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.AbstractRemoteSource; import com.opengamma.core.change.BasicChangeManager; import com.opengamma.core.change.ChangeManager; import com.opengamma.core.config.ConfigSource; import com.opengamma.id.ObjectId; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.fudgemsg.OpenGammaFudgeContext; import com.opengamma.util.rest.UniformInterfaceException404NotFound; /** * Provides remote access to a {@link ConfigSource}. */ public class RemoteConfigSource extends AbstractRemoteSource<ConfigItem<?>> implements ConfigSource { /** * The change manager. */ private final ChangeManager _changeManager; /** * Creates an instance. * * @param baseUri the base target URI for all RESTful web services, not null */ public RemoteConfigSource(final URI baseUri) { super(baseUri); _changeManager = new BasicChangeManager(); } /** * Creates an instance. * * @param baseUri the base target URI for all RESTful web services, not null * @param changeManager the change manager to use, not null */ public RemoteConfigSource(final URI baseUri, final ChangeManager changeManager) { super(baseUri); ArgumentChecker.notNull(changeManager, "changeManager"); _changeManager = changeManager; } @SuppressWarnings("unchecked") private <R> Collection<ConfigItem<R>> configItemCollectionResult(final FudgeMsg msg) { final Collection<ConfigItem<R>> result = Lists.newArrayListWithCapacity(msg.getNumFields()); final FudgeDeserializer deserializer = new FudgeDeserializer(OpenGammaFudgeContext.getInstance()); for (final FudgeField field : msg) { result.add(deserializer.fieldValueToObject(ConfigItem.class, field)); } return result; } @Override public ChangeManager changeManager() { return _changeManager; } @Override public ConfigItem<?> get(final UniqueId uniqueId) { ArgumentChecker.notNull(uniqueId, "uniqueId"); final URI uri = DataConfigSourceResource.uriGet(getBaseUri(), uniqueId); return accessRemote(uri).get(ConfigItem.class); } @Override public ConfigItem<?> get(final ObjectId objectId, final VersionCorrection versionCorrection) { ArgumentChecker.notNull(objectId, "objectId"); ArgumentChecker.notNull(versionCorrection, "versionCorrection"); final URI uri = DataConfigSourceResource.uriGet(getBaseUri(), objectId, versionCorrection); return accessRemote(uri).get(ConfigItem.class); } //------------------------------------------------------------------------- @Override @SuppressWarnings("unchecked") public <R> R getConfig(final Class<R> clazz, final UniqueId uniqueId) { final Object value = get(uniqueId).getValue(); if (clazz.isAssignableFrom(value.getClass())) { return (R) value; } else { throw new IllegalArgumentException("The requested object is " + value.getClass() + ", not " + clazz); } } @Override @SuppressWarnings("unchecked") public <R> R getConfig(final Class<R> clazz, final ObjectId objectId, final VersionCorrection versionCorrection) { final Object value = get(objectId, versionCorrection).getValue(); if (clazz.isAssignableFrom(value.getClass())) { return (R) value; } else { throw new IllegalArgumentException("The requested object is " + value.getClass() + ", not " + clazz); } } //------------------------------------------------------------------------- @Override public <R> R getSingle(final Class<R> clazz, final String configName, final VersionCorrection versionCorrection) { ArgumentChecker.notNull(clazz, "clazz"); ArgumentChecker.notNull(configName, "configName"); ArgumentChecker.notNull(versionCorrection, "versionCorrection"); try { final URI uri = DataConfigSourceResource.uriSearchSingle(getBaseUri(), configName, versionCorrection, clazz); return accessRemote(uri).get(clazz); } catch (UniformInterfaceException404NotFound ex) { throw new OpenGammaRuntimeException("Unable to access remote source ", ex); } } @Override public <R> Collection<ConfigItem<R>> get(final Class<R> clazz, final String configName, final VersionCorrection versionCorrection) { ArgumentChecker.notNull(clazz, "clazz"); ArgumentChecker.notNull(configName, "configName"); ArgumentChecker.notNull(versionCorrection, "versionCorrection"); final URI uri = DataConfigSourceResource.uriGet(getBaseUri(), configName, versionCorrection, clazz); return configItemCollectionResult(accessRemote(uri).get(FudgeMsg.class)); } @Override public <R> R getLatestByName(final Class<R> clazz, final String name) { return getSingle(clazz, name, VersionCorrection.LATEST); } @Override public <R> Collection<ConfigItem<R>> getAll(final Class<R> clazz, final VersionCorrection versionCorrection) { ArgumentChecker.notNull(clazz, "clazz"); ArgumentChecker.notNull(versionCorrection, "versionCorrection"); final URI uri = DataConfigSourceResource.uriSearch(getBaseUri(), clazz, versionCorrection); return configItemCollectionResult(accessRemote(uri).get(FudgeMsg.class)); } }