/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.master.portfolio.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.portfolio.ManageablePortfolioNode;
import com.opengamma.master.portfolio.PortfolioDocument;
import com.opengamma.master.portfolio.PortfolioHistoryRequest;
import com.opengamma.master.portfolio.PortfolioHistoryResult;
import com.opengamma.master.portfolio.PortfolioMaster;
import com.opengamma.master.portfolio.PortfolioSearchRequest;
import com.opengamma.master.portfolio.PortfolioSearchResult;
/**
* A {@link PortfolioMaster} which delegates its calls to a list of underlying {@link PortfolioMaster}s.
*
* This class extends {@link ChangeProvidingCombinedMaster} to implement methods specific to the {@link PortfolioMaster}.
*/
public class CombinedPortfolioMaster extends ChangeProvidingCombinedMaster<PortfolioDocument, PortfolioMaster> implements PortfolioMaster {
public CombinedPortfolioMaster(final List<PortfolioMaster> masterList) {
super(masterList);
}
@Override
public PortfolioSearchResult search(PortfolioSearchRequest overallRequest) {
final PortfolioSearchResult overallResult = new PortfolioSearchResult();
pagedSearch(new PortfolioSearchStrategy() {
@Override
public AbstractDocumentsResult<PortfolioDocument> search(PortfolioMaster master, PortfolioSearchRequest searchRequest) {
PortfolioSearchResult masterResult = master.search(searchRequest);
overallResult.setVersionCorrection(masterResult.getVersionCorrection());
return masterResult;
}
}, overallResult, overallRequest);
return overallResult;
}
/**
* Callback interface for portfolio searches
*/
private interface PortfolioSearchStrategy extends SearchStrategy<PortfolioDocument, PortfolioMaster, PortfolioSearchRequest> { }
/**
* Callback interface for the search operation to sort, filter and process results.
*/
public interface SearchCallback extends CombinedMaster.SearchCallback<PortfolioDocument, PortfolioMaster> {
}
public void search(final PortfolioSearchRequest request, final SearchCallback callback) {
// TODO: parallel operation of any search requests
List<PortfolioSearchResult> results = Lists.newArrayList();
for (PortfolioMaster master : getMasterList()) {
results.add(master.search(request));
}
search(results, callback);
}
@Override
public PortfolioHistoryResult history(final PortfolioHistoryRequest request) {
final PortfolioMaster master = getMasterByScheme(request.getObjectId().getScheme());
if (master != null) {
return master.history(request);
}
return (new Try<PortfolioHistoryResult>() {
@Override
public PortfolioHistoryResult tryMaster(final PortfolioMaster master) {
return master.history(request);
}
}).each(request.getObjectId().getScheme());
}
@Override
public ManageablePortfolioNode getNode(final UniqueId nodeId) {
final PortfolioMaster master = getMasterByScheme(nodeId.getScheme());
if (master != null) {
return master.getNode(nodeId);
}
return (new Try<ManageablePortfolioNode>() {
@Override
public ManageablePortfolioNode tryMaster(final PortfolioMaster master) {
return master.getNode(nodeId);
}
}).each(nodeId.getScheme());
}
}