/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.target.lazy;
import java.util.Collection;
import java.util.Map;
import com.opengamma.core.change.ChangeManager;
import com.opengamma.core.position.Portfolio;
import com.opengamma.core.position.PortfolioNode;
import com.opengamma.core.position.Position;
import com.opengamma.core.position.Trade;
import com.opengamma.engine.target.logger.LoggedResolutionPortfolio;
import com.opengamma.engine.target.logger.LoggedResolutionPortfolioNode;
import com.opengamma.engine.target.logger.LoggedResolutionPosition;
import com.opengamma.engine.target.logger.LoggedResolutionTrade;
import com.opengamma.engine.target.logger.ResolutionLogger;
import com.opengamma.engine.target.resolver.DeepResolver;
import com.opengamma.engine.target.resolver.ObjectResolver;
import com.opengamma.engine.target.resolver.Resolver;
import com.opengamma.id.ExternalIdBundle;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.id.UniqueIdentifiable;
import com.opengamma.id.VersionCorrection;
/**
* Marker interface for a target resolver that supports lazy operations.
*/
public interface LazyResolver {
LazyResolveContext getLazyResolveContext();
void setLazyResolveContext(LazyResolveContext context);
/**
* Base class of {@link ObjectResolver} instances that are owned by a parent {@link LazyResolver}.
*/
public abstract static class ObjectResolverImpl<T extends UniqueIdentifiable> implements ObjectResolver<T>, DeepResolver {
private final LazyResolver _parent;
private final ObjectResolver<T> _underlying;
public ObjectResolverImpl(final LazyResolver parent, final ObjectResolver<T> underlying) {
_parent = parent;
_underlying = underlying;
}
protected ObjectResolver<T> getUnderlying() {
return _underlying;
}
protected abstract T lazy(T object, LazyResolveContext.AtVersionCorrection context);
@Override
public T resolveObject(final UniqueId uniqueId, final VersionCorrection versionCorrection) {
final T underlying = _underlying.resolveObject(uniqueId, versionCorrection);
if (underlying == null) {
return null;
}
return lazy(underlying, _parent.getLazyResolveContext().atVersionCorrection(versionCorrection));
}
@Override
public ChangeManager changeManager() {
return getUnderlying().changeManager();
}
@Override
public DeepResolver deepResolver() {
return this;
}
}
/**
* Base class of {@link Resolver} instances that are owned by a parent {@link LazyResolver}.
*/
public abstract static class ResolverImpl<T extends UniqueIdentifiable> extends ObjectResolverImpl<T> implements Resolver<T> {
public ResolverImpl(final LazyResolver parent, final Resolver<T> underlying) {
super(parent, underlying);
}
@Override
protected Resolver<T> getUnderlying() {
return (Resolver<T>) super.getUnderlying();
}
@Override
public UniqueId resolveExternalId(final ExternalIdBundle identifiers, final VersionCorrection versionCorrection) {
return getUnderlying().resolveExternalId(identifiers, versionCorrection);
}
@Override
public Map<ExternalIdBundle, UniqueId> resolveExternalIds(final Collection<ExternalIdBundle> identifiers, final VersionCorrection versionCorrection) {
return getUnderlying().resolveExternalIds(identifiers, versionCorrection);
}
@Override
public UniqueId resolveObjectId(final ObjectId identifier, final VersionCorrection versionCorrection) {
return getUnderlying().resolveObjectId(identifier, versionCorrection);
}
@Override
public Map<ObjectId, UniqueId> resolveObjectIds(final Collection<ObjectId> identifiers, final VersionCorrection versionCorrection) {
return getUnderlying().resolveObjectIds(identifiers, versionCorrection);
}
}
/**
* Lazy resolution of portfolios.
*/
public static class LazyPortfolioResolver extends ResolverImpl<Portfolio> {
public LazyPortfolioResolver(final LazyResolver parent, final Resolver<Portfolio> underlying) {
super(parent, underlying);
}
// ObjectResolverImpl
@Override
public Portfolio lazy(final Portfolio object, final LazyResolveContext.AtVersionCorrection context) {
return new LazyResolvedPortfolio(context, object);
}
// DeepResolver
@Override
public UniqueIdentifiable withLogger(final UniqueIdentifiable underlying, final ResolutionLogger logger) {
if (underlying instanceof Portfolio) {
return new LoggedResolutionPortfolio((Portfolio) underlying, logger);
} else {
return null;
}
}
}
/**
* Lazy resolution of portfolio nodes.
*/
public static class LazyPortfolioNodeResolver extends ResolverImpl<PortfolioNode> {
public LazyPortfolioNodeResolver(final LazyResolver parent, final Resolver<PortfolioNode> underlying) {
super(parent, underlying);
}
// ObjectResolverImpl
@Override
public PortfolioNode lazy(final PortfolioNode object, final LazyResolveContext.AtVersionCorrection context) {
return new LazyResolvedPortfolioNode(context, object);
}
// DeepResolver
@Override
public UniqueIdentifiable withLogger(final UniqueIdentifiable underlying, final ResolutionLogger logger) {
if (underlying instanceof PortfolioNode) {
return new LoggedResolutionPortfolioNode((PortfolioNode) underlying, logger);
} else {
return null;
}
}
}
/**
* Lazy resolution of positions.
*/
public static class LazyPositionResolver extends ResolverImpl<Position> {
public LazyPositionResolver(final LazyResolver parent, final Resolver<Position> underlying) {
super(parent, underlying);
}
// ResolverImpl
@Override
public Position lazy(final Position object, final LazyResolveContext.AtVersionCorrection context) {
return new LazyResolvedPosition(context, object);
}
// DeepResolver
@Override
public UniqueIdentifiable withLogger(final UniqueIdentifiable underlying, final ResolutionLogger logger) {
if (underlying instanceof Position) {
return new LoggedResolutionPosition((Position) underlying, logger);
} else {
return null;
}
}
}
/**
* Lazy resolution of trades.
*/
public static class LazyTradeResolver extends ResolverImpl<Trade> {
public LazyTradeResolver(final LazyResolver parent, final Resolver<Trade> underlying) {
super(parent, underlying);
}
// ObjectResolverImpl
@Override
public Trade lazy(final Trade object, final LazyResolveContext.AtVersionCorrection context) {
return new LazyResolvedTrade(context, object);
}
// DeepResolver
@Override
public UniqueIdentifiable withLogger(final UniqueIdentifiable underlying, final ResolutionLogger logger) {
if (underlying instanceof Trade) {
return new LoggedResolutionTrade((Trade) underlying, logger);
} else {
return null;
}
}
}
}