in SdmxStructureRetrieval/src/main/java/org/sdmxsource/sdmx/structureretrieval/manager/BaseSdmxBeanRetrievalManager.java [284:414]
public SdmxBeans getMaintainables(RESTStructureQuery complexQuery) {
LOG.info("Query for maintainables: " + complexQuery);
boolean isAllStubs = complexQuery.getStructureQueryMetadata().getStructureQueryDetail() == STRUCTURE_QUERY_DETAIL.ALL_STUBS;
boolean isRefStubs = isAllStubs || complexQuery.getStructureQueryMetadata().getStructureQueryDetail() == STRUCTURE_QUERY_DETAIL.REFERENCED_STUBS;
boolean isLatest = complexQuery.getStructureQueryMetadata().isReturnLatest();
SDMX_STRUCTURE_TYPE type = complexQuery.getStructureReference().getMaintainableStructureType();
// Emergency fix - if the type is NULL we'll ask for ANY SdmxStructureType
if (type == null) {
type = SDMX_STRUCTURE_TYPE.ANY;
}
;
MaintainableRefBean ref = complexQuery.getStructureReference().getMaintainableReference();
Set<MaintainableBean> queryResultMaintainables;
if (type == SDMX_STRUCTURE_TYPE.ANY) {
queryResultMaintainables = getAllMaintainables(ref, isLatest, isAllStubs);
} else if (type == SDMX_STRUCTURE_TYPE.ORGANISATION_SCHEME) {
SdmxBeans beans = new SdmxBeansImpl();
beans.addIdentifiables(getMaintainableBeans(AgencySchemeBean.class, ref, isLatest, isAllStubs));
beans.addIdentifiables(getMaintainableBeans(DataProviderSchemeBean.class, ref, isLatest, isAllStubs));
beans.addIdentifiables(getMaintainableBeans(OrganisationUnitSchemeBean.class, ref, isLatest, isAllStubs));
beans.addIdentifiables(getMaintainableBeans(DataConsumerSchemeBean.class, ref, isLatest, isAllStubs));
queryResultMaintainables = beans.getAllMaintainables();
} else {
//This creates a new hash set because the use of generics precludes doing it any other way
queryResultMaintainables = new HashSet<MaintainableBean>(getMaintainableBeans(type.getMaintainableInterface(), ref, isLatest, isAllStubs));
}
Set<MaintainableBean> resolvedStubs = new HashSet<MaintainableBean>();
if (externalReferenceRetrievalManager != null && !isAllStubs) {
for (MaintainableBean currentMaint : queryResultMaintainables) {
if (currentMaint.isExternalReference().isTrue()) {
currentMaint = externalReferenceRetrievalManager.resolveFullStructure(currentMaint);
resolvedStubs.add(currentMaint);
}
}
}
resolvedStubs.addAll(queryResultMaintainables);
queryResultMaintainables = resolvedStubs;
//Is this query for a identifiable child of the maintainable? i.e if it is not referencing a maintainable, then it must be a child identifiable
boolean isPartial;
if (complexQuery.getStructureReference().getTargetReference() == null) {
isPartial = false;
} else {
isPartial = !complexQuery.getStructureReference().getTargetReference().isMaintainable() && complexQuery.getStructureReference().getTargetReference().isIdentifiable();
}
//Create partial lists of the query result maintainables
Set<MaintainableBean> partialBeans = new HashSet<MaintainableBean>();
if (isPartial) {
String identifiableId = complexQuery.getStructureReference().getFullId();
Set<String> identSet = new HashSet<String>();
identSet.add(identifiableId);
for (MaintainableBean maint : queryResultMaintainables) {
ItemSchemeBean isBean = ((ItemSchemeBean) maint).filterItems(identSet, true);
if (isBean.getItems().size() > 0) {
partialBeans.add(isBean);
}
}
queryResultMaintainables = partialBeans;
}
LOG.info("Returned " + queryResultMaintainables.size() + " results");
HeaderBean header = null;
if (headerRetrievalManager != null) {
header = headerRetrievalManager.getHeader();
}
SdmxBeans referencedBeans = new SdmxBeansImpl(header);
SdmxBeans referenceMerge = new SdmxBeansImpl();
switch (complexQuery.getStructureQueryMetadata().getStructureReferenceDetail()) {
case NONE:
LOG.info("Reference detail NONE");
break;
case PARENTS:
LOG.info("Reference detail PARENTS");
resolveParents(queryResultMaintainables, referencedBeans, isRefStubs);
break;
case PARENTS_SIBLINGS:
LOG.info("Reference detail PARENTS_SIBLINGS");
resolveParents(queryResultMaintainables, referencedBeans, isRefStubs);
resolveChildren(referencedBeans.getAllMaintainables(), referenceMerge, isRefStubs);
referencedBeans.merge(referenceMerge);
break;
case CHILDREN:
LOG.info("Reference detail CHILDREN");
resolveChildren(queryResultMaintainables, referencedBeans, isRefStubs);
break;
case DESCENDANTS:
LOG.info("Reference detail DESCENDANTS");
resolveDescendants(queryResultMaintainables, referencedBeans, isRefStubs);
break;
case ALL:
LOG.info("Reference detail ALL");
resolveParents(queryResultMaintainables, referencedBeans, isRefStubs);
resolveDescendants(queryResultMaintainables, referenceMerge, isRefStubs);
referencedBeans.merge(referenceMerge);
break;
case SPECIFIC:
LOG.info("Reference detail Children");
resolveSpecific(queryResultMaintainables, referencedBeans, complexQuery.getStructureQueryMetadata().getSpecificStructureReference(), isRefStubs);
break;
}
referencedBeans.addIdentifiables(queryResultMaintainables);
// Determine if we are returning stubs or not
if (isAllStubs && (referencedBeans != null)) {
// It is not necessary to specify a serviceRetrievalManager so it may be null at this stage
if (serviceRetrievalManager == null) {
throw new SdmxNotImplementedException("Cannot return stubs since no ServiceRetrievalManager has been supplied!");
}
Set<MaintainableBean> stubSet = new HashSet<MaintainableBean>();
for (MaintainableBean currentMaint : referencedBeans.getAllMaintainables(null)) {
stubSet.add(serviceRetrievalManager.createStub(currentMaint));
}
referencedBeans = new SdmxBeansImpl(header);
referencedBeans.addIdentifiables(stubSet);
}
LOG.info("Result Size : " + referencedBeans.getAllMaintainables().size());
return referencedBeans;
}