///////////////////////////////////////////////////////////////////////////////////////////////
        //////////            PROCESS 2.1  MESSAGES                        ///////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////////////
        #region Public Methods and Operators

        /// <summary>
        /// Build beans from a v2.1 Registry Document
        /// </summary>
        /// <param name="rid">
        /// The rid.
        /// </param>
        /// <returns>
        /// The <see cref="ISdmxObjects"/>.
        /// </returns>
        public ISdmxObjects Build(RegistryInterface rid)
        {
            RegistryInterfaceType rit = rid.Content;
            if (rit.SubmitStructureRequest != null)
            {
                if (rit.SubmitStructureRequest.Structures != null)
                {
                    DatasetAction action = null;
                    if (!string.IsNullOrEmpty(rit.SubmitStructureRequest.action))
                    {
                        switch (rit.SubmitStructureRequest.action)
                        {
                            case ActionTypeConstants.Append:
                                action = DatasetAction.GetFromEnum(DatasetActionEnumType.Append);
                                break;
                            case ActionTypeConstants.Replace:
                                action = DatasetAction.GetFromEnum(DatasetActionEnumType.Replace);
                                break;
                            default:
                                action = DatasetAction.GetFromEnum(DatasetActionEnumType.Append);
                                break;

                        }
                    }
                    
                    return this.Build(rit.SubmitStructureRequest.Structures.Content, ProcessHeader(rit.Header), action);
                }
            }

            return new SdmxObjectsImpl();
        }
        /// <summary>
        /// The build registry interface document.
        /// </summary>
        /// <param name="buildFrom">
        /// The build from.
        /// </param>
        /// <param name="action">
        /// The action.
        /// </param>
        /// <returns>
        /// The <see cref="RegistryInterface"/>.
        /// </returns>
        public RegistryInterface BuildRegistryInterfaceDocument(ISdmxObjects buildFrom, DatasetAction action)
        {
            var rid = new RegistryInterface();
            RegistryInterfaceType rit = rid.Content;
            V21Helper.Header = rit;
            var structureRequestType = new SubmitStructureRequestType();
            rit.SubmitStructureRequest = structureRequestType;
            switch (action.EnumType)
            {
                case DatasetActionEnumType.Append:
                    structureRequestType.action = ActionTypeConstants.Append;
                    break;
                case DatasetActionEnumType.Replace:
                    structureRequestType.action = ActionTypeConstants.Replace;
                    break;
                case DatasetActionEnumType.Delete:
                    structureRequestType.action = ActionTypeConstants.Delete;
                    break;
                case DatasetActionEnumType.Information:
                    structureRequestType.action = ActionTypeConstants.Information;
                    break;
            }

            var structures = new Structures();
            structureRequestType.Structures = structures;
            this._structureXmlBuilder.PopulateStructureType(buildFrom, structures.Content);

            return rid;
        }
        /// <summary>
        /// Build the registry interface document.
        /// </summary>
        /// <param name="buildFrom">
        /// The build from.
        /// </param>
        /// <param name="action">
        /// The action.
        /// </param>
        /// <returns>
        /// The <see cref="RegistryInterface"/>.
        /// </returns>
        public RegistryInterface BuildRegistryInterfaceDocument(
            ICollection<IRegistrationObject> buildFrom, DatasetActionEnumType action)
        {
            var registryInterface = new RegistryInterface();
            RegistryInterfaceType interfaceType = registryInterface.Content;
            V21Helper.Header = interfaceType;
            var submitRegistrationRequest = new SubmitRegistrationsRequestType();
            interfaceType.SubmitRegistrationsRequest = submitRegistrationRequest;

            /* foreach */
            foreach (IRegistrationObject currentRegistration in buildFrom)
            {
                RegistrationType registrationType = this._registrationXmlBuilder.Build(currentRegistration);
                var registrationRequest = new RegistrationRequestType();
                submitRegistrationRequest.RegistrationRequest.Add(registrationRequest);
                registrationRequest.Registration = registrationType;
                switch (action)
                {
                    case DatasetActionEnumType.Append:
                        registrationRequest.action = ActionTypeConstants.Append;
                        break;
                    case DatasetActionEnumType.Replace:
                        registrationRequest.action = ActionTypeConstants.Replace;
                        break;
                    case DatasetActionEnumType.Delete:
                        registrationRequest.action = ActionTypeConstants.Delete;
                        break;
                    case DatasetActionEnumType.Information:
                        registrationRequest.action = ActionTypeConstants.Information;
                        break;
                }
            }

            return registryInterface;
        }
        /// <summary>
        /// The build registry interface document.
        /// </summary>
        /// <param name="buildFrom">
        /// The build from.
        /// </param>
        /// <param name="action">
        /// The action.
        /// </param>
        /// <returns>
        /// The <see cref="RegistryInterface"/>.
        /// </returns>
        public RegistryInterface BuildRegistryInterfaceDocument(
            ICollection<ISubscriptionObject> buildFrom, DatasetActionEnumType action)
        {
            var rid = new RegistryInterface();
            RegistryInterfaceType rit = rid.Content;
            V21Helper.Header = rit;
            var submitSubscriptionsRequest = new SubmitSubscriptionsRequestType();
            rit.SubmitSubscriptionsRequest = submitSubscriptionsRequest;

            /* foreach */
            foreach (ISubscriptionObject currentSubscription in buildFrom)
            {
                SubscriptionType subscriptionType = this._subscriptionXmlBuilder.Build(currentSubscription);
                var subscriptionRequest = new SubscriptionRequestType();
                submitSubscriptionsRequest.SubscriptionRequest.Add(subscriptionRequest);
                subscriptionRequest.Subscription = subscriptionType;
                switch (action)
                {
                    case DatasetActionEnumType.Append:
                        subscriptionRequest.action = ActionTypeConstants.Append;
                        break;
                    case DatasetActionEnumType.Replace:
                        subscriptionRequest.action = ActionTypeConstants.Replace;
                        break;
                    case DatasetActionEnumType.Delete:
                        subscriptionRequest.action = ActionTypeConstants.Delete;
                        break;
                    case DatasetActionEnumType.Information:
                        subscriptionRequest.action = ActionTypeConstants.Information;
                        break;
                }
            }

            return rid;
        }
 /// <summary>
 /// The build error response.
 /// </summary>
 /// <param name="th">
 /// The exception.
 /// </param>
 /// <returns>
 /// The <see cref="RegistryInterface"/>.
 /// </returns>
 public RegistryInterface BuildErrorResponse(Exception th)
 {
     var responseType = new RegistryInterface();
     RegistryInterfaceType regInterface = responseType.Content;
     var returnType = new SubmitRegistrationsResponseType();
     regInterface.SubmitRegistrationsResponse = returnType;
     V21Helper.Header = regInterface;
     var registrationStatusType = new RegistrationStatusType();
     returnType.RegistrationStatus.Add(registrationStatusType);
     this.AddStatus(registrationStatusType.StatusMessage = new StatusMessageType(), th);
     return responseType;
 }
        /// <summary>
        /// The build success response.
        /// </summary>
        /// <param name="beans">
        /// The beans.
        /// </param>
        /// <returns>
        /// The <see cref="RegistryInterface"/>.
        /// </returns>
        public RegistryInterface BuildSuccessResponse(ISdmxObjects beans)
        {
            var responseType = new RegistryInterface();
            RegistryInterfaceType regInterface = responseType.Content;
            regInterface.Header = this._headerXmlsBuilder.Build(beans.Header);
            var returnType = new SubmitStructureResponseType();
            regInterface.SubmitStructureResponse = returnType;


            this.ProcessMaintainables(returnType, beans.GetAllMaintainables());
            return responseType;
        }
        /// <summary>
        /// Build  the error response.
        /// </summary>
        /// <param name="exception">
        /// The exception.
        /// </param>
        /// <param name="errorBean">
        /// The error bean.
        /// </param>
        /// <returns>
        /// The <see cref="RegistryInterface"/>.
        /// </returns>
        /// <exception cref="BuilderException">
        /// Registry could not determine Maintainable Artefact in error
        /// </exception>
        public RegistryInterface BuildErrorResponse(Exception exception, IStructureReference errorBean)
        {
            if (errorBean == null)
            {
                throw new SdmxSemmanticException("Registry could not determine Maintainable Artefact in error", exception);
            }

            var responseType = new RegistryInterface();
            RegistryInterfaceType regInterface = responseType.Content;
            V21Helper.Header = regInterface;
            var returnType = new SubmitStructureResponseType();
            regInterface.SubmitStructureResponse = returnType;
            this.AddSubmissionResult(returnType, errorBean, exception);
            return responseType;
        }
        /// <summary>
        /// Builds the list of <see cref="ISubmitStructureResponse"/> from <paramref name="registryInterface"/>
        /// </summary>
        /// <param name="registryInterface">
        /// The registry Interface.
        /// </param>
        /// <returns>
        /// The list of <see cref="ISubmitStructureResponse"/> from <paramref name="registryInterface"/>
        /// </returns>
        public IList<ISubmitStructureResponse> Build(RegistryInterface registryInterface)
        {
            // TODO REFACTOR - THIS IS VERY SIMILAR TO SUBMIT SUBSCRIPTION RESPONSE
            IList<ISubmitStructureResponse> returnList = new List<ISubmitStructureResponse>();

            /* foreach */
            foreach (
                SubmissionResultType resultType in registryInterface.Content.SubmitStructureResponse.SubmissionResult)
            {
                IStructureReference structureReference =
                    RefUtil.CreateReference(resultType.SubmittedStructure.MaintainableObject);
                if (resultType.StatusMessage != null && resultType.StatusMessage.status != null)
                {
                    IList<string> messages = new List<string>();
                    if (resultType.StatusMessage.MessageText != null)
                    {
                        // TODO Message Codes and Multilingual
                        foreach (StatusMessageType statusMessageType in resultType.StatusMessage.MessageText)
                        {
                            if (statusMessageType.Text != null)
                            {
                                /* foreach */
                                foreach (TextType tt in statusMessageType.Text)
                                {
                                    messages.Add(tt.TypedValue);
                                }
                            }
                        }
                    }

                    IErrorList errors = null;
                    switch (resultType.StatusMessage.status)
                    {
                        case StatusTypeConstants.Failure:
                            errors = new ErrorListCore(messages, false);
                            break;
                        case StatusTypeConstants.Warning:
                            errors = new ErrorListCore(messages, true);
                            break;
                    }

                    returnList.Add(new SubmitStructureResponseImpl(structureReference, errors));
                }
            }

            return returnList;
        }
        /// <summary>
        /// Builds the error response.
        /// </summary>
        /// <param name="notification">
        /// The notification.
        /// </param>
        /// <param name="exception">
        /// The exception.
        /// </param>
        /// <returns>
        /// The <see cref="RegistryInterface"/>.
        /// </returns>
        public RegistryInterface BuildErrorResponse(ISubscriptionObject notification, Exception exception)
        {
            var responseType = new RegistryInterface();
            RegistryInterfaceType regInterface = responseType.Content;
            V21Helper.Header = regInterface;
            var returnType = new SubmitSubscriptionsResponseType();
            regInterface.SubmitSubscriptionsResponse = returnType;
            var subscriptionStatus = new SubscriptionStatusType();
            returnType.SubscriptionStatus.Add(subscriptionStatus);
            if (notification != null)
            {
                subscriptionStatus.SubscriptionURN = notification.Urn;
            }

            var statusMessageType = new StatusMessageType();
            subscriptionStatus.StatusMessage = statusMessageType;
            this.AddStatus(statusMessageType, exception);
            return responseType;
        }
        /// <summary>
        /// The build success response.
        /// </summary>
        /// <param name="notifications">
        /// The notifications.
        /// </param>
        /// <returns>
        /// The <see cref="RegistryInterface"/>.
        /// </returns>
        public RegistryInterface BuildSuccessResponse(ICollection<ISubscriptionObject> notifications)
        {
            var responseType = new RegistryInterface();
            RegistryInterfaceType regInterface = responseType.Content;
            V21Helper.Header = regInterface;

            /* foreach */
            foreach (ISubscriptionObject currentNotification in notifications)
            {
                var returnType = new SubmitSubscriptionsResponseType();
                regInterface.SubmitSubscriptionsResponse = returnType;
                var subscriptionStatus = new SubscriptionStatusType();
                returnType.SubscriptionStatus.Add(subscriptionStatus);
                var statusMessageType = new StatusMessageType();
                subscriptionStatus.StatusMessage = statusMessageType;

                this.AddStatus(statusMessageType, null);

                subscriptionStatus.SubscriptionURN = currentNotification.Urn;
            }

            return responseType;
        }
        /// <summary>
        /// The build response.
        /// </summary>
        /// <param name="response">
        /// The response.
        /// </param>
        /// <returns>
        /// The <see cref="RegistryInterface"/>.
        /// </returns>
        public RegistryInterface BuildResponse(IDictionary<IRegistrationObject, Exception> response)
        {
            var responseType = new RegistryInterface();
            RegistryInterfaceType regInterface = responseType.Content;
            var returnType = new SubmitRegistrationsResponseType();
            regInterface.SubmitRegistrationsResponse = returnType;
            V21Helper.Header = regInterface;

            foreach (KeyValuePair<IRegistrationObject, Exception> registration in response)
            {
                this.ProcessResponse(returnType, registration.Key, registration.Value);
            }

            return responseType;
        }