diff --git a/DESCRIPTION b/DESCRIPTION index c6d5720..20cbfec 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -18,13 +18,13 @@ BugReports: https://github.com/opensdmx/rsdmx/issues LazyLoad: yes Collate: Class-SDMXSchema.R Class-SDMXType.R Class-SDMXStructureType.R Class-SDMXHeader.R - Class-SDMX.R Class-SDMXGenericData.R Class-SDMXCompactData.R Class-SDMXMessageGroup.R - Class-SDMXConcept.R Class-SDMXConceptScheme.R Class-SDMXConcepts.R Class-SDMXCode.R - Class-SDMXCodelist.R Class-SDMXCodelists.R Class-SDMXDimension.R Class-SDMXTimeDimension.R - Class-SDMXPrimaryMeasure.R Class-SDMXAttribute.R Class-SDMXComponents.R + Class-SDMX.R Class-SDMXGenericData.R Class-SDMXCompactData.R Class-SDMXUtilityData.R + Class-SDMXMessageGroup.R Class-SDMXConcept.R Class-SDMXConceptScheme.R Class-SDMXConcepts.R + Class-SDMXCode.R Class-SDMXCodelist.R Class-SDMXCodelists.R Class-SDMXDimension.R + Class-SDMXTimeDimension.R Class-SDMXPrimaryMeasure.R Class-SDMXAttribute.R Class-SDMXComponents.R Class-SDMXDataStructure.R Class-SDMXDataStructures.R Class-SDMXDataStructureDefinition.R - SDMXSchema-methods.R SDMXType-methods.R SDMXStructureType-methods.R SDMXHeader-methods.R - SDMX-methods.R SDMXGenericData-methods.R SDMXCompactData-methods.R SDMXMessageGroup-methods.R + SDMXSchema-methods.R SDMXType-methods.R SDMXStructureType-methods.R SDMXHeader-methods.R SDMX-methods.R + SDMXGenericData-methods.R SDMXCompactData-methods.R SDMXUtilityData-methods.R SDMXMessageGroup-methods.R SDMXConcept-methods.R SDMXConceptScheme-methods.R SDMXConcepts-methods.R SDMXCode-methods.R SDMXCodelist-methods.R SDMXCodelists-methods.R SDMXDimension-methods.R SDMXTimeDimension-methods.R SDMXPrimaryMeasure-methods.R SDMXAttribute-methods.R SDMXComponents-methods.R diff --git a/NAMESPACE b/NAMESPACE index 39dc463..f7cba19 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -11,6 +11,7 @@ exportClasses( SDMXStructureType, SDMXGenericData, SDMXCompactData, + SDMXUtilityData, SDMXMessageGroup, SDMXConcept, SDMXConceptScheme, @@ -36,6 +37,7 @@ export( SDMXStructureType, SDMXGenericData, SDMXCompactData, + SDMXUtilityData, SDMXMessageGroup, SDMXConcept, SDMXConceptScheme, @@ -82,6 +84,7 @@ exportMethods( S3method(as.data.frame, SDMXGenericData) S3method(as.data.frame, SDMXCompactData) +S3method(as.data.frame, SDMXUtilityData) S3method(as.data.frame, SDMXMessageGroup) S3method(as.data.frame, SDMXConcepts) S3method(as.data.frame, SDMXCodelists) \ No newline at end of file diff --git a/R/Class-SDMXHeader.R b/R/Class-SDMXHeader.R index 7cabc2e..94fde8c 100644 --- a/R/Class-SDMXHeader.R +++ b/R/Class-SDMXHeader.R @@ -32,19 +32,37 @@ setClass("SDMXHeader", validity = function(object){ # ID validation - if(is.null(object@ID)) return(FALSE) - if(attr(regexpr("[a-zA-Z0-9@-_@\\$]", object@ID),"match.length") == -1) return(FALSE) - + if(is.null(object@ID)){ + message("Missing 'ID' in header") + return(FALSE) + } + if(attr(regexpr("[a-zA-Z0-9@-_@\\$]", object@ID),"match.length") == -1){ + message("Invalid 'ID' in header") + return(FALSE) + } + #Test/Truncated - if(!is.logical(object@Test)) return(FALSE) - if(!is.logical(object@Truncated)) return(FALSE) - + if(!is.logical(object@Test)){ + message("Invalid 'Test' value in header") + return(FALSE) + } + if(!is.logical(object@Truncated)){ + message("Invalid 'Truncated' value in header") + return(FALSE) + } + #Dates/Time validation - if(is.na(object@Prepared)) return(FALSE) + if(is.na(object@Prepared)){ + message("Invalid 'Prepared' value in header") + return(FALSE) + } #Sender/Receiver validation - if(is.na(object@Sender$id) || nchar(object@Sender$id) == 0) return(FALSE) - if(nchar(object@Receiver$id) == 0) return(FALSE) + if(is.na(object@Sender$id) || nchar(object@Sender$id) == 0){ + message("Missing 'Sender' id in header") + return(FALSE) + } + if(nchar(object@Receiver$id) == 0) return(FALSE) #TODO KeyFamilyRef validation #TODO KeyFamilyAgency validation diff --git a/R/Class-SDMXType.R b/R/Class-SDMXType.R index 3ca183f..c542277 100644 --- a/R/Class-SDMXType.R +++ b/R/Class-SDMXType.R @@ -10,11 +10,12 @@ setClass("SDMXType", validity = function(object){ type <- getType(object); valid <- switch(type, - "StructureType" = TRUE, - "GenericDataType" = TRUE, - "CompactDataType" = TRUE, - "MessageGroupType" = TRUE, - FALSE + "StructureType" = TRUE, + "GenericDataType" = TRUE, + "CompactDataType" = TRUE, + "UtilityDataType" = TRUE, + "MessageGroupType" = TRUE, + FALSE ); if(valid == FALSE) warning(paste("Unknown SDMXType ", type, sep="")); diff --git a/R/Class-SDMXUtilityData.R b/R/Class-SDMXUtilityData.R new file mode 100644 index 0000000..79cd37e --- /dev/null +++ b/R/Class-SDMXUtilityData.R @@ -0,0 +1,13 @@ +# E.Blondel - 2015/01/13 +#======================= + +#SDMX UtilityData class +setClass("SDMXUtilityData", + contains = "SDMX", + representation(), + prototype = list(), + validity = function(object){ + #eventual validation rules + return(TRUE); + } +) diff --git a/R/SDMXUtilityData-methods.R b/R/SDMXUtilityData-methods.R new file mode 100644 index 0000000..68faa66 --- /dev/null +++ b/R/SDMXUtilityData-methods.R @@ -0,0 +1,18 @@ +# E.Blondel - 2015/01/13 +#======================= + +SDMXUtilityData <- function(xmlObj){ + new("SDMXUtilityData", + SDMX(xmlObj) + ) +} + +#methods +#======= + +as.data.frame.SDMXUtilityData <- function(x, ...){ + return(as.data.frame.SDMXCompactData(x)) +} + +setAs("SDMXUtilityData", "data.frame", + function(from) as.data.frame.SDMXUtilityData(from)); diff --git a/R/readSDMX.R b/R/readSDMX.R index 4489bd5..2471c27 100644 --- a/R/readSDMX.R +++ b/R/readSDMX.R @@ -6,7 +6,7 @@ readSDMX <- function(file, isURL = TRUE){ #load data - status <- 0 + status <- 0 if(isURL == FALSE){ if(!file.exists(file)) stop("File ", file, "not found\n") @@ -46,24 +46,25 @@ readSDMX <- function(file, isURL = TRUE){ #encapsulate in S4 object obj <- NULL - if(status){ - type <- SDMXType(xmlObj)@type - obj <- switch(type, - "StructureType" = getSDMXStructureObject(xmlObj), - "GenericDataType" = SDMXGenericData(xmlObj), - "CompactDataType" = SDMXCompactData(xmlObj), - "MessageGroupType" = SDMXMessageGroup(xmlObj), - NULL - ) - - if(is.null(obj)){ - if(type == "StructureType"){ - strTypeObj <- SDMXStructureType(xmlObj) - type <- getStructureType(strTypeObj) - } - stop(paste("Unsupported SDMX Type '",type,"'",sep="")) - } - } + if(status){ + type <- SDMXType(xmlObj)@type + obj <- switch(type, + "StructureType" = getSDMXStructureObject(xmlObj), + "GenericDataType" = SDMXGenericData(xmlObj), + "CompactDataType" = SDMXCompactData(xmlObj), + "UtilityDataType" = SDMXUtilityData(xmlObj), + "MessageGroupType" = SDMXMessageGroup(xmlObj), + NULL + ) + + if(is.null(obj)){ + if(type == "StructureType"){ + strTypeObj <- SDMXStructureType(xmlObj) + type <- getStructureType(strTypeObj) + } + stop(paste("Unsupported SDMX Type '",type,"'",sep="")) + } + } return(obj); } diff --git a/man/SDMXType-class.Rd b/man/SDMXType-class.Rd index 6bde63e..881909c 100644 --- a/man/SDMXType-class.Rd +++ b/man/SDMXType-class.Rd @@ -29,7 +29,9 @@ SDMXType(xmlObj) \author{ Emmanuel Blondel, \email{emmanuel.blondel1@gmail.com}} \note{ -At now, the following types have been implemented and tested: \code{GenericDataType}, \code{CompactDataType}, and {MessageGroupType}. At now the \code{MessageGroupType} was only modeled to allow reading OECD generic data which is provided. Other message types handled in \code{MessageGroup} document type are not yet supported. +At now, the following types have been implemented and tested: \code{GenericDataType}, \code{CompactDataType}, \code{UtilityDataType} and {MessageGroupType}. + +The \code{MessageGroupType} was only modeled to allow reading OECD generic data which is provided. Other message types handled in \code{MessageGroup} document type are not yet supported. } \section{Warning }{this class is not useful in itself, but all SDMX non-abstract classes will encapsulate itas slot, when parsing an SDMX-ML document} diff --git a/man/SDMXUtilityData-class.Rd b/man/SDMXUtilityData-class.Rd new file mode 100644 index 0000000..501529a --- /dev/null +++ b/man/SDMXUtilityData-class.Rd @@ -0,0 +1,23 @@ +\name{SDMXUtilityData-class} +\docType{class} +\alias{SDMXUtilityData-class} +\alias{SDMXUtilityData} +\alias{SDMXUtilityData-method} + + +\title{Class "SDMXUtilityData"} +\description{ A basic class to handle a SDMX-ML utility data set} +\section{Objects from the Class}{are never to be generated; will be used by the \link{readSDMX} main parser function} + + +\usage{ +SDMXUtilityData(xmlObj) +} + +\arguments{ +\item{xmlObj}{an object of class "XMLInternalDocument"} +} + +\author{ Emmanuel Blondel, \email{emmanuel.blondel1@gmail.com}} + +\keyword{classes} \ No newline at end of file