public SdmxBeans getMaintainables()

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;
    }