/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master.position.impl; import java.util.List; import com.google.common.collect.Lists; import com.opengamma.id.UniqueId; import com.opengamma.master.AbstractDocumentsResult; import com.opengamma.master.ChangeProvidingCombinedMaster; import com.opengamma.master.CombinedMaster; import com.opengamma.master.position.ManageableTrade; import com.opengamma.master.position.PositionDocument; import com.opengamma.master.position.PositionHistoryRequest; import com.opengamma.master.position.PositionHistoryResult; import com.opengamma.master.position.PositionMaster; import com.opengamma.master.position.PositionSearchRequest; import com.opengamma.master.position.PositionSearchResult; /** * A {@link PositionMaster} which delegates its calls to a list of underlying {@link PositionMaster}s. * * This class extends {@link ChangeProvidingCombinedMaster} to implement methods specific to the {@link PositionMaster}. */ public class CombinedPositionMaster extends ChangeProvidingCombinedMaster<PositionDocument, PositionMaster> implements PositionMaster { public CombinedPositionMaster(List<PositionMaster> masters) { super(masters); } @Override public PositionSearchResult search(final PositionSearchRequest overallRequest) { final PositionSearchResult overallResult = new PositionSearchResult(); pagedSearch(new PositionSearchStrategy() { @Override public AbstractDocumentsResult<PositionDocument> search(PositionMaster master, PositionSearchRequest searchRequest) { PositionSearchResult masterResult = master.search(searchRequest); overallResult.setVersionCorrection(masterResult.getVersionCorrection()); return masterResult; } }, overallResult, overallRequest); return overallResult; } /** * Callback interface for position searches */ private interface PositionSearchStrategy extends SearchStrategy<PositionDocument, PositionMaster, PositionSearchRequest> { } /** * Callback interface for the search operation to sort, filter and process results. */ public interface SearchCallback extends CombinedMaster.SearchCallback<PositionDocument, PositionMaster> { } public void search(final PositionSearchRequest request, final SearchCallback callback) { // TODO: parallel operation of any search requests List<PositionSearchResult> results = Lists.newArrayList(); for (PositionMaster master : getMasterList()) { results.add(master.search(request)); } search(results, callback); } @Override public PositionHistoryResult history(final PositionHistoryRequest request) { final PositionMaster master = getMasterByScheme(request.getObjectId().getScheme()); if (master != null) { return master.history(request); } return (new Try<PositionHistoryResult>() { @Override public PositionHistoryResult tryMaster(final PositionMaster master) { return master.history(request); } }).each(request.getObjectId().getScheme()); } @Override public ManageableTrade getTrade(UniqueId tradeId) { return null; } }