public KeyFamilyType build()

in SdmxStructureParser/src/main/java/org/sdmxsource/sdmx/structureparser/builder/xmlBeans/v2/DataStructureXmlBeanBuilder.java [63:241]


    public KeyFamilyType build(DataStructureBean buildFrom) throws SdmxException {
        KeyFamilyType builtObj = KeyFamilyType.Factory.newInstance();
        if (validString(buildFrom.getAgencyId())) {
            builtObj.setAgencyID(buildFrom.getAgencyId());
        }
        if (validString(buildFrom.getId())) {
            builtObj.setId(buildFrom.getId());
        }
        if (buildFrom.getUri() != null) {
            builtObj.setUri(buildFrom.getUri().toString());
        } else if (buildFrom.getStructureURL() != null) {
            builtObj.setUri(buildFrom.getStructureURL().toString());
        } else if (buildFrom.getServiceURL() != null) {
            builtObj.setUri(buildFrom.getStructureURL().toString());
        }
        if (validString(buildFrom.getUrn())) {
            builtObj.setUrn(buildFrom.getUrn());
        }
        if (validString(buildFrom.getVersion())) {
            builtObj.setVersion(buildFrom.getVersion());
        }
        if (buildFrom.getStartDate() != null) {
            builtObj.setValidFrom(buildFrom.getStartDate().getDate());
        }
        if (buildFrom.getEndDate() != null) {
            builtObj.setValidTo(buildFrom.getEndDate().getDate());
        }
        if (validCollection(buildFrom.getNames())) {
            builtObj.setNameArray(getTextType(buildFrom.getNames()));
        }
        if (validCollection(buildFrom.getDescriptions())) {
            builtObj.setDescriptionArray(getTextType(buildFrom.getDescriptions()));
        }
        if (hasAnnotations(buildFrom)) {
            builtObj.setAnnotations(getAnnotationsType(buildFrom));
        }
        if (buildFrom.isExternalReference().isSet()) {
            builtObj.setIsExternalReference(buildFrom.isExternalReference().isTrue());
        }
        if (buildFrom.isFinal().isSet()) {
            builtObj.setIsFinal(buildFrom.isFinal().isTrue());
        }

        ComponentsType componentsType = null;

        List<ComponentBean> crossSectionalAttachDataSet = new ArrayList<ComponentBean>();
        List<ComponentBean> crossSectionalAttachGroup = new ArrayList<ComponentBean>();
        List<ComponentBean> crossSectionalAttachSection = new ArrayList<ComponentBean>();
        List<ComponentBean> crossSectionalAttachObservation = new ArrayList<ComponentBean>();
        CrossSectionalDataStructureBean crossSectionalBean = null;
        if (buildFrom instanceof CrossSectionalDataStructureBean) {
            crossSectionalBean = (CrossSectionalDataStructureBean) buildFrom;

            crossSectionalAttachDataSet = crossSectionalBean.getCrossSectionalAttachDataSet(false);
            crossSectionalAttachGroup = crossSectionalBean.getCrossSectionalAttachGroup(false);
            crossSectionalAttachSection = crossSectionalBean.getCrossSectionalAttachSection(false);
            crossSectionalAttachObservation = crossSectionalBean.getCrossSectionalAttachObservation();


            if (componentsType == null) {
                componentsType = builtObj.addNewComponents();
            }

            for (CrossSectionalMeasureBean currentMeasure : crossSectionalBean.getCrossSectionalMeasures()) {
                componentsType.getCrossSectionalMeasureList().add(crossSectionalXmlBeanBuilder.build(currentMeasure));
            }
        }

        if (ObjectUtil.validCollection(buildFrom.getDimensions(SDMX_STRUCTURE_TYPE.DIMENSION, SDMX_STRUCTURE_TYPE.MEASURE_DIMENSION))) {
            if (componentsType == null) {
                componentsType = builtObj.addNewComponents();
            }

            for (DimensionBean currentDim : buildFrom.getDimensions(SDMX_STRUCTURE_TYPE.DIMENSION, SDMX_STRUCTURE_TYPE.MEASURE_DIMENSION)) {
                DimensionType newDimension = dimensionXmlBeanBuilder.build(currentDim);
                if (crossSectionalBean != null && currentDim.isMeasureDimension()) {
                    CrossReferenceBean xsRef = crossSectionalBean.getCodelistForMeasureDimension(currentDim.getId());
                    newDimension.setCodelist(xsRef.getMaintainableReference().getMaintainableId());
                    newDimension.setCodelistAgency(xsRef.getMaintainableReference().getAgencyId());
                    newDimension.setCodelistVersion(xsRef.getMaintainableReference().getVersion());
                }
                if (crossSectionalAttachDataSet.contains(currentDim)) {
                    newDimension.setCrossSectionalAttachDataSet(true);
                }
                if (crossSectionalAttachGroup.contains(currentDim)) {
                    newDimension.setCrossSectionalAttachGroup(true);
                }
                if (crossSectionalAttachSection.contains(currentDim)) {
                    newDimension.setCrossSectionalAttachSection(true);
                }
                if (crossSectionalAttachObservation.contains(currentDim)) {
                    newDimension.setCrossSectionalAttachObservation(true);
                }
                componentsType.getDimensionList().add(newDimension);
            }
        }

        if (buildFrom.getTimeDimension() != null) {
            if (componentsType == null) {
                componentsType = builtObj.addNewComponents();
            }
            TimeDimensionType newDimension = timeDimensionXmlBeanBuilder.build(buildFrom.getTimeDimension());
            if (crossSectionalAttachDataSet.contains(buildFrom.getTimeDimension())) {
                newDimension.setCrossSectionalAttachDataSet(true);
            }
            if (crossSectionalAttachGroup.contains(buildFrom.getTimeDimension())) {
                newDimension.setCrossSectionalAttachGroup(true);
            }
            if (crossSectionalAttachSection.contains(buildFrom.getTimeDimension())) {
                newDimension.setCrossSectionalAttachSection(true);
            }
            if (crossSectionalAttachObservation.contains(buildFrom.getTimeDimension())) {
                newDimension.setCrossSectionalAttachObservation(true);
            }
            componentsType.setTimeDimension(newDimension);
        }

        if (ObjectUtil.validCollection(buildFrom.getGroups())) {
            if (componentsType == null) {
                componentsType = builtObj.addNewComponents();
            }

            for (GroupBean currentGroup : buildFrom.getGroups()) {
                componentsType.getGroupList().add(groupXmlBeansBuilder.build(currentGroup));
            }
        }

        if (buildFrom.getPrimaryMeasure() != null) {
            if (componentsType == null) {
                componentsType = builtObj.addNewComponents();
            }

            componentsType.setPrimaryMeasure(primaryMeasureXmlBeanBuilder.build(buildFrom.getPrimaryMeasure()));
        }

        if (ObjectUtil.validCollection(buildFrom.getAttributes())) {
            if (componentsType == null) {
                componentsType = builtObj.addNewComponents();
            }

            for (AttributeBean currentAttr : buildFrom.getAttributes()) {
                AttributeType newAttribute = attributeXmlBeanBuilder.build(currentAttr);

                if (currentAttr.getAttachmentLevel() == ATTRIBUTE_ATTACHMENT_LEVEL.DIMENSION_GROUP) {
                    //If the group of dimensions is also a group, do not create the attribute;
                    List<String> dimensionReferences = currentAttr.getDimensionReferences();
                    for (GroupBean grp : buildFrom.getGroups()) {
                        if (grp.getDimensionRefs().containsAll(dimensionReferences) &&
                                dimensionReferences.containsAll(grp.getDimensionRefs())) {
                            newAttribute.setAttachmentLevel(AttachmentLevelType.GROUP);
                            newAttribute.addAttachmentGroup(grp.getId());
                            break;
                        }
                    }
                }

                if (crossSectionalAttachDataSet.contains(currentAttr)) {
                    newAttribute.setCrossSectionalAttachDataSet(true);
                }
                if (crossSectionalAttachGroup.contains(currentAttr)) {
                    newAttribute.setCrossSectionalAttachGroup(true);
                }
                if (crossSectionalAttachSection.contains(currentAttr)) {
                    newAttribute.setCrossSectionalAttachSection(true);
                }
                if (crossSectionalAttachObservation.contains(currentAttr)) {
                    newAttribute.setCrossSectionalAttachObservation(true);
                }
                if (crossSectionalBean != null) {
                    for (CrossSectionalMeasureBean crossSectionalMeasure : crossSectionalBean.getAttachmentMeasures(currentAttr)) {
                        IDType idType = newAttribute.addNewAttachmentMeasure();
                        idType.setStringValue(crossSectionalMeasure.getId());
                    }
                }
                componentsType.getAttributeList().add(newAttribute);
            }
        }
        return builtObj;
    }