Added Filtering of Measurement file 22/79722/3
authoremartin <ephraim.martin@est.tech>
Tue, 5 Mar 2019 16:29:36 +0000 (16:29 +0000)
committeremartin <ephraim.martin@est.tech>
Tue, 5 Mar 2019 16:29:36 +0000 (16:29 +0000)
Change-Id: I32cd7147c20cbee7273d7c7180a06d9f2fdf620b
Issue-ID: DCAEGEN2-1288
Signed-off-by: emartin <ephraim.martin@est.tech>
21 files changed:
pom.xml
src/main/java/org/onap/dcaegen2/services/pmmapper/filtering/MeasFilterHandler.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/pmmapper/model/Event.java
src/main/java/org/onap/dcaegen2/services/pmmapper/model/MapperConfig.java
src/main/java/org/onap/dcaegen2/services/pmmapper/model/MeasCollecFile.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/pmmapper/model/MeasFilterConfig.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/pmmapper/model/package-info.java [new file with mode: 0644]
src/main/java/org/onap/dcaegen2/services/pmmapper/utils/MeasConverter.java [new file with mode: 0644]
src/test/java/org/onap/dcaegen2/services/pmmapper/filtering/MeasFilterHandlerTest.java [new file with mode: 0644]
src/test/java/org/onap/dcaegen2/services/pmmapper/utils/MeasConverterTest.java [new file with mode: 0644]
src/test/resources/filter_test/meas_results.xml [new file with mode: 0644]
src/test/resources/filter_test/meas_results_filtered.xml [new file with mode: 0644]
src/test/resources/filter_test/meas_results_manyInfo.xml [new file with mode: 0644]
src/test/resources/filter_test/meas_results_manyInfo_filtered.xml [new file with mode: 0644]
src/test/resources/filter_test/meas_type_and_r.xml [new file with mode: 0644]
src/test/resources/filter_test/meas_type_and_r_filtered.xml [new file with mode: 0644]
src/test/resources/filter_test/meas_type_and_r_manyInfo.xml [new file with mode: 0644]
src/test/resources/filter_test/meas_type_and_r_manyInfo_filtered.xml [new file with mode: 0644]
src/test/resources/mapper_test/mapping_data/valid_data/meas_results.xml
src/test/resources/mapper_test/mapping_data/valid_data/meas_type_and_r.xml
src/test/resources/valid_mapper_config.json

diff --git a/pom.xml b/pom.xml
index faac2df..ca6c426 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,7 @@
         <mockserver.version>3.10.8</mockserver.version>
         <junit4.version>4.12</junit4.version>
         <jsonschema.version>1.3.0</jsonschema.version>
+        <xerces.version>2.11.0</xerces.version>
         <!-- Plugin Versions -->
         <shade.plugin.version>3.2.0</shade.plugin.version>
         <jacoco.version>0.8.2</jacoco.version>
             <version>${jsonschema.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>xerces</groupId>
+            <artifactId>xercesImpl</artifactId>
+            <version>${xerces.version}</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/src/main/java/org/onap/dcaegen2/services/pmmapper/filtering/MeasFilterHandler.java b/src/main/java/org/onap/dcaegen2/services/pmmapper/filtering/MeasFilterHandler.java
new file mode 100644 (file)
index 0000000..a6017b6
--- /dev/null
@@ -0,0 +1,141 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.pmmapper.filtering;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.onap.dcaegen2.services.pmmapper.model.Event;
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile;
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile.MeasData;
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile.MeasData.MeasInfo;
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile.MeasData.MeasInfo.MeasType;
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile.MeasData.MeasInfo.MeasValue;
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile.MeasData.MeasInfo.MeasValue.R;
+import org.onap.dcaegen2.services.pmmapper.model.MeasFilterConfig.Filter;
+import org.onap.dcaegen2.services.pmmapper.utils.MeasConverter;
+import org.onap.logging.ref.slf4j.ONAPLogAdapter;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Provides filtering of the contents of the 3GPP PM Measurement file.
+ **/
+public class MeasFilterHandler {
+    private static final ONAPLogAdapter logger = new ONAPLogAdapter(LoggerFactory.getLogger(MeasFilterHandler.class));
+    private Filter filter;
+    private MeasConverter converter;
+
+    public MeasFilterHandler(MeasConverter converter) {
+        this.converter = converter;
+    }
+
+    public void setFilter(Filter filter) {
+       this.filter = filter;
+    }
+
+    /**
+     * Filters each measInfo node for measTypes that match the given measTypes from filters.
+     **/
+    public boolean filterByMeasType(Event event) {
+      logger.unwrap().debug("Filtering the measurement file.");
+
+        MeasCollecFile measCollecFile = event.getMeasCollecFile();
+        if(filter.getMeasTypes().isEmpty() || measCollecFile.getMeasData().isEmpty()) {
+            return false;
+        }
+
+        MeasData measData = measCollecFile.getMeasData().get(0);
+        List<MeasInfo> measInfos = measData.getMeasInfo();
+        List<MeasInfo> filteredMeasInfos = new ArrayList<>();
+
+        for (int i = 0; i < measInfos.size(); i++) {
+            MeasInfo currentMeasInfo = measInfos.get(i);
+            List<String> measTypesNode = currentMeasInfo.getMeasTypes();
+            if(!measTypesNode.isEmpty()) {
+                setMeasInfosFromMeasTypes(currentMeasInfo,filteredMeasInfos);
+            }else {
+                setMeasInfoFromMeasType(currentMeasInfo,filteredMeasInfos);
+            }
+        }
+
+        if (filteredMeasInfos.isEmpty()) {
+            return false;
+        }
+
+        measData.setMeasInfo(filteredMeasInfos);
+        String filteredXMl = converter.convert(measCollecFile);
+        event.setBody(filteredXMl);
+        return true;
+    }
+
+    private void setMeasInfoFromMeasType(MeasInfo currentMeasInfo,  List<MeasInfo> filteredMeasInfos) {
+        MeasValue currentMeasValue = currentMeasInfo.getMeasValue()
+                .get(0);
+        List<R> measResultsRNodes = currentMeasValue.getR();
+        Map<BigInteger, R> mappedR = measResultsRNodes.stream()
+                .collect(Collectors.toMap(R::getP, Function.identity()));
+        List<R> filteredRs = new ArrayList<>();
+        List<MeasType> filteredMeasTypes = currentMeasInfo.getMeasType()
+                .stream().filter(mt -> {
+                    List<String> measTypeFilters = filter.getMeasTypes();
+                    if (measTypeFilters.contains(mt.getValue())) {
+                        filteredRs.add(mappedR.get(mt.getP()));
+                        return true;
+                    }
+                    return false;
+                })
+                .collect(Collectors.toList());
+        if (!filteredMeasTypes.isEmpty()) {
+            currentMeasInfo.replaceMeasType(filteredMeasTypes);
+            currentMeasValue.replaceR(filteredRs);
+            filteredMeasInfos.add(currentMeasInfo);
+        }
+
+    }
+
+    private void setMeasInfosFromMeasTypes(MeasInfo currentMeasInfo, List<MeasInfo> filteredMeasInfos) {
+        MeasValue currentMeasValue = currentMeasInfo.getMeasValue()
+                .get(0);
+        List<String> measTypesNode = currentMeasInfo.getMeasTypes();
+        List<String> measResultsNode = currentMeasValue.getMeasResults();
+        List<String> filteredMeasResults = new ArrayList<>();
+
+        List<String> filteredMeasTypes = new ArrayList<>();
+        for (int j = 0; j < measTypesNode.size(); j++) {
+            String currentMeasType = measTypesNode.get(j);
+            List<String> measTypeFilters = filter.getMeasTypes();
+            if (measTypeFilters.contains(currentMeasType)) {
+                filteredMeasTypes.add(currentMeasType);
+                filteredMeasResults.add(measResultsNode.get(j));
+            }
+        }
+
+        if (!filteredMeasTypes.isEmpty()) {
+            currentMeasInfo.replaceMeasTypes(filteredMeasTypes);
+            currentMeasValue.replaceMeasResults(filteredMeasResults);
+            filteredMeasInfos.add(currentMeasInfo);
+        }
+    }
+
+}
index 7a7cb1f..0e82119 100644 (file)
@@ -40,4 +40,6 @@ public class Event {
     private Map<String, String> mdc;
     @NonNull
     private String publishIdentity;
+
+    MeasCollecFile measCollecFile;
 }
index 0412ece..2f13080 100644 (file)
@@ -141,4 +141,7 @@ public class MapperConfig {
         @SerializedName("topic_url")\r
         private String topicUrl;\r
     }\r
+\r
+    @SerializedName("pm-mapper-filter")\r
+    MeasFilterConfig filterConfig;\r
 }
\ No newline at end of file
diff --git a/src/main/java/org/onap/dcaegen2/services/pmmapper/model/MeasCollecFile.java b/src/main/java/org/onap/dcaegen2/services/pmmapper/model/MeasCollecFile.java
new file mode 100644 (file)
index 0000000..572b46b
--- /dev/null
@@ -0,0 +1,1844 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ *  Copyright (C) 2019 Nordix Foundation.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ * SPDX-License-Identifier: Apache-2.0\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+package org.onap.dcaegen2.services.pmmapper.model;\r
+\r
+import java.math.BigInteger;\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import javax.xml.bind.annotation.XmlAccessType;\r
+import javax.xml.bind.annotation.XmlAccessorType;\r
+import javax.xml.bind.annotation.XmlAttribute;\r
+import javax.xml.bind.annotation.XmlElement;\r
+import javax.xml.bind.annotation.XmlList;\r
+import javax.xml.bind.annotation.XmlRootElement;\r
+import javax.xml.bind.annotation.XmlSchemaType;\r
+import javax.xml.bind.annotation.XmlType;\r
+import javax.xml.bind.annotation.XmlValue;\r
+import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;\r
+import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;\r
+import javax.xml.datatype.Duration;\r
+import javax.xml.datatype.XMLGregorianCalendar;\r
+\r
+/**\r
+ * <p>\r
+ * Generated Java class using XJC to represent 3GPP PM Measurement file\r
+ *\r
+ * <p>\r
+ * The following schema fragment specifies the expected content contained within\r
+ * this class.\r
+ *\r
+ * <pre>\r
+ * &lt;complexType>\r
+ *   &lt;complexContent>\r
+ *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *       &lt;sequence>\r
+ *         &lt;element name="fileHeader">\r
+ *           &lt;complexType>\r
+ *             &lt;complexContent>\r
+ *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                 &lt;sequence>\r
+ *                   &lt;element name="fileSender">\r
+ *                     &lt;complexType>\r
+ *                       &lt;complexContent>\r
+ *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                           &lt;attribute name="localDn" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                           &lt;attribute name="elementType" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                         &lt;/restriction>\r
+ *                       &lt;/complexContent>\r
+ *                     &lt;/complexType>\r
+ *                   &lt;/element>\r
+ *                   &lt;element name="measCollec">\r
+ *                     &lt;complexType>\r
+ *                       &lt;complexContent>\r
+ *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                           &lt;attribute name="beginTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+ *                         &lt;/restriction>\r
+ *                       &lt;/complexContent>\r
+ *                     &lt;/complexType>\r
+ *                   &lt;/element>\r
+ *                 &lt;/sequence>\r
+ *                 &lt;attribute name="fileFormatVersion" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                 &lt;attribute name="vendorName" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                 &lt;attribute name="dnPrefix" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *               &lt;/restriction>\r
+ *             &lt;/complexContent>\r
+ *           &lt;/complexType>\r
+ *         &lt;/element>\r
+ *         &lt;element name="measData" maxOccurs="unbounded" minOccurs="0">\r
+ *           &lt;complexType>\r
+ *             &lt;complexContent>\r
+ *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                 &lt;sequence>\r
+ *                   &lt;element name="managedElement">\r
+ *                     &lt;complexType>\r
+ *                       &lt;complexContent>\r
+ *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                           &lt;attribute name="localDn" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                           &lt;attribute name="userLabel" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                           &lt;attribute name="swVersion" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                         &lt;/restriction>\r
+ *                       &lt;/complexContent>\r
+ *                     &lt;/complexType>\r
+ *                   &lt;/element>\r
+ *                   &lt;element name="measInfo" maxOccurs="unbounded" minOccurs="0">\r
+ *                     &lt;complexType>\r
+ *                       &lt;complexContent>\r
+ *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                           &lt;sequence>\r
+ *                             &lt;element name="job" minOccurs="0">\r
+ *                               &lt;complexType>\r
+ *                                 &lt;complexContent>\r
+ *                                   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                                     &lt;attribute name="jobId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                                   &lt;/restriction>\r
+ *                                 &lt;/complexContent>\r
+ *                               &lt;/complexType>\r
+ *                             &lt;/element>\r
+ *                             &lt;element name="granPeriod">\r
+ *                               &lt;complexType>\r
+ *                                 &lt;complexContent>\r
+ *                                   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                                     &lt;attribute name="duration" use="required" type="{http://www.w3.org/2001/XMLSchema}duration" />\r
+ *                                     &lt;attribute name="endTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+ *                                   &lt;/restriction>\r
+ *                                 &lt;/complexContent>\r
+ *                               &lt;/complexType>\r
+ *                             &lt;/element>\r
+ *                             &lt;element name="repPeriod" minOccurs="0">\r
+ *                               &lt;complexType>\r
+ *                                 &lt;complexContent>\r
+ *                                   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                                     &lt;attribute name="duration" use="required" type="{http://www.w3.org/2001/XMLSchema}duration" />\r
+ *                                   &lt;/restriction>\r
+ *                                 &lt;/complexContent>\r
+ *                               &lt;/complexType>\r
+ *                             &lt;/element>\r
+ *                             &lt;choice>\r
+ *                               &lt;element name="measTypes">\r
+ *                                 &lt;simpleType>\r
+ *                                   &lt;list itemType="{http://www.w3.org/2001/XMLSchema}Name" />\r
+ *                                 &lt;/simpleType>\r
+ *                               &lt;/element>\r
+ *                               &lt;element name="measType" maxOccurs="unbounded" minOccurs="0">\r
+ *                                 &lt;complexType>\r
+ *                                   &lt;simpleContent>\r
+ *                                     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>Name">\r
+ *                                       &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+ *                                     &lt;/extension>\r
+ *                                   &lt;/simpleContent>\r
+ *                                 &lt;/complexType>\r
+ *                               &lt;/element>\r
+ *                             &lt;/choice>\r
+ *                             &lt;element name="measValue" maxOccurs="unbounded" minOccurs="0">\r
+ *                               &lt;complexType>\r
+ *                                 &lt;complexContent>\r
+ *                                   &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                                     &lt;sequence>\r
+ *                                       &lt;choice>\r
+ *                                         &lt;element name="measResults">\r
+ *                                           &lt;simpleType>\r
+ *                                             &lt;list itemType="{http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec}measResultType" />\r
+ *                                           &lt;/simpleType>\r
+ *                                         &lt;/element>\r
+ *                                         &lt;element name="r" maxOccurs="unbounded" minOccurs="0">\r
+ *                                           &lt;complexType>\r
+ *                                             &lt;simpleContent>\r
+ *                                               &lt;extension base="&lt;http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec>measResultType">\r
+ *                                                 &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+ *                                               &lt;/extension>\r
+ *                                             &lt;/simpleContent>\r
+ *                                           &lt;/complexType>\r
+ *                                         &lt;/element>\r
+ *                                       &lt;/choice>\r
+ *                                       &lt;element name="suspect" type="{http://www.w3.org/2001/XMLSchema}boolean" minOccurs="0"/>\r
+ *                                     &lt;/sequence>\r
+ *                                     &lt;attribute name="measObjLdn" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                                   &lt;/restriction>\r
+ *                                 &lt;/complexContent>\r
+ *                               &lt;/complexType>\r
+ *                             &lt;/element>\r
+ *                           &lt;/sequence>\r
+ *                           &lt;attribute name="measInfoId" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+ *                         &lt;/restriction>\r
+ *                       &lt;/complexContent>\r
+ *                     &lt;/complexType>\r
+ *                   &lt;/element>\r
+ *                 &lt;/sequence>\r
+ *               &lt;/restriction>\r
+ *             &lt;/complexContent>\r
+ *           &lt;/complexType>\r
+ *         &lt;/element>\r
+ *         &lt;element name="fileFooter">\r
+ *           &lt;complexType>\r
+ *             &lt;complexContent>\r
+ *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                 &lt;sequence>\r
+ *                   &lt;element name="measCollec">\r
+ *                     &lt;complexType>\r
+ *                       &lt;complexContent>\r
+ *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+ *                           &lt;attribute name="endTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+ *                         &lt;/restriction>\r
+ *                       &lt;/complexContent>\r
+ *                     &lt;/complexType>\r
+ *                   &lt;/element>\r
+ *                 &lt;/sequence>\r
+ *               &lt;/restriction>\r
+ *             &lt;/complexContent>\r
+ *           &lt;/complexType>\r
+ *         &lt;/element>\r
+ *       &lt;/sequence>\r
+ *     &lt;/restriction>\r
+ *   &lt;/complexContent>\r
+ * &lt;/complexType>\r
+ * </pre>\r
+ *\r
+ *\r
+ */\r
+@XmlAccessorType(XmlAccessType.FIELD)\r
+@XmlType(name = "", propOrder = {\r
+    "fileHeader",\r
+    "measData",\r
+    "fileFooter"\r
+})\r
+@XmlRootElement(name = "measCollecFile")\r
+public class MeasCollecFile {\r
+\r
+    @XmlElement(required = true)\r
+    protected MeasCollecFile.FileHeader fileHeader;\r
+    protected List<MeasCollecFile.MeasData> measData;\r
+    @XmlElement(required = true)\r
+    protected MeasCollecFile.FileFooter fileFooter;\r
+\r
+    /**\r
+     * Gets the value of the fileHeader property.\r
+     *\r
+     * @return\r
+     *     possible object is\r
+     *     {@link MeasCollecFile.FileHeader }\r
+     *\r
+     */\r
+    public MeasCollecFile.FileHeader getFileHeader() {\r
+        return fileHeader;\r
+    }\r
+\r
+    /**\r
+     * Sets the value of the fileHeader property.\r
+     *\r
+     * @param value\r
+     *     allowed object is\r
+     *     {@link MeasCollecFile.FileHeader }\r
+     *\r
+     */\r
+    public void setFileHeader(MeasCollecFile.FileHeader value) {\r
+        this.fileHeader = value;\r
+    }\r
+\r
+    /**\r
+     * Gets the value of the measData property.\r
+     *\r
+     * <p>\r
+     * This accessor method returns a reference to the live list,\r
+     * not a snapshot. Therefore any modification you make to the\r
+     * returned list will be present inside the JAXB object.\r
+     * This is why there is not a <CODE>set</CODE> method for the measData property.\r
+     *\r
+     * <p>\r
+     * For example, to add a new item, do as follows:\r
+     * <pre>\r
+     *    getMeasData().add(newItem);\r
+     * </pre>\r
+     *\r
+     *\r
+     * <p>\r
+     * Objects of the following type(s) are allowed in the list\r
+     * {@link MeasCollecFile.MeasData }\r
+     *\r
+     *\r
+     */\r
+    public List<MeasCollecFile.MeasData> getMeasData() {\r
+        if (measData == null) {\r
+            measData = new ArrayList<MeasCollecFile.MeasData>();\r
+        }\r
+        return this.measData;\r
+    }\r
+\r
+    /**\r
+     * Gets the value of the fileFooter property.\r
+     *\r
+     * @return\r
+     *     possible object is\r
+     *     {@link MeasCollecFile.FileFooter }\r
+     *\r
+     */\r
+    public MeasCollecFile.FileFooter getFileFooter() {\r
+        return fileFooter;\r
+    }\r
+\r
+    /**\r
+     * Sets the value of the fileFooter property.\r
+     *\r
+     * @param value\r
+     *     allowed object is\r
+     *     {@link MeasCollecFile.FileFooter }\r
+     *\r
+     */\r
+    public void setFileFooter(MeasCollecFile.FileFooter value) {\r
+        this.fileFooter = value;\r
+    }\r
+\r
+\r
+    /**\r
+     * <p>Java class for anonymous complex type.\r
+     *\r
+     * <p>The following schema fragment specifies the expected content contained within this class.\r
+     *\r
+     * <pre>\r
+     * &lt;complexType>\r
+     *   &lt;complexContent>\r
+     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *       &lt;sequence>\r
+     *         &lt;element name="measCollec">\r
+     *           &lt;complexType>\r
+     *             &lt;complexContent>\r
+     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                 &lt;attribute name="endTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+     *               &lt;/restriction>\r
+     *             &lt;/complexContent>\r
+     *           &lt;/complexType>\r
+     *         &lt;/element>\r
+     *       &lt;/sequence>\r
+     *     &lt;/restriction>\r
+     *   &lt;/complexContent>\r
+     * &lt;/complexType>\r
+     * </pre>\r
+     *\r
+     *\r
+     */\r
+    @XmlAccessorType(XmlAccessType.FIELD)\r
+    @XmlType(name = "", propOrder = {\r
+        "measCollec"\r
+    })\r
+    public static class FileFooter {\r
+\r
+        @XmlElement(required = true)\r
+        protected MeasCollecFile.FileFooter.MeasCollec measCollec;\r
+\r
+        /**\r
+         * Gets the value of the measCollec property.\r
+         *\r
+         * @return\r
+         *     possible object is\r
+         *     {@link MeasCollecFile.FileFooter.MeasCollec }\r
+         *\r
+         */\r
+        public MeasCollecFile.FileFooter.MeasCollec getMeasCollec() {\r
+            return measCollec;\r
+        }\r
+\r
+        /**\r
+         * Sets the value of the measCollec property.\r
+         *\r
+         * @param value\r
+         *     allowed object is\r
+         *     {@link MeasCollecFile.FileFooter.MeasCollec }\r
+         *\r
+         */\r
+        public void setMeasCollec(MeasCollecFile.FileFooter.MeasCollec value) {\r
+            this.measCollec = value;\r
+        }\r
+\r
+\r
+        /**\r
+         * <p>Java class for anonymous complex type.\r
+         *\r
+         * <p>The following schema fragment specifies the expected content contained within this class.\r
+         *\r
+         * <pre>\r
+         * &lt;complexType>\r
+         *   &lt;complexContent>\r
+         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *       &lt;attribute name="endTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+         *     &lt;/restriction>\r
+         *   &lt;/complexContent>\r
+         * &lt;/complexType>\r
+         * </pre>\r
+         *\r
+         *\r
+         */\r
+        @XmlAccessorType(XmlAccessType.FIELD)\r
+        @XmlType(name = "")\r
+        public static class MeasCollec {\r
+\r
+            @XmlAttribute(name = "endTime", required = true)\r
+            @XmlSchemaType(name = "dateTime")\r
+            protected XMLGregorianCalendar endTime;\r
+\r
+            /**\r
+             * Gets the value of the endTime property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link XMLGregorianCalendar }\r
+             *\r
+             */\r
+            public XMLGregorianCalendar getEndTime() {\r
+                return endTime;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the endTime property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link XMLGregorianCalendar }\r
+             *\r
+             */\r
+            public void setEndTime(XMLGregorianCalendar value) {\r
+                this.endTime = value;\r
+            }\r
+\r
+        }\r
+\r
+    }\r
+\r
+\r
+    /**\r
+     * <p>Java class for anonymous complex type.\r
+     *\r
+     * <p>The following schema fragment specifies the expected content contained within this class.\r
+     *\r
+     * <pre>\r
+     * &lt;complexType>\r
+     *   &lt;complexContent>\r
+     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *       &lt;sequence>\r
+     *         &lt;element name="fileSender">\r
+     *           &lt;complexType>\r
+     *             &lt;complexContent>\r
+     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                 &lt;attribute name="localDn" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *                 &lt;attribute name="elementType" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *               &lt;/restriction>\r
+     *             &lt;/complexContent>\r
+     *           &lt;/complexType>\r
+     *         &lt;/element>\r
+     *         &lt;element name="measCollec">\r
+     *           &lt;complexType>\r
+     *             &lt;complexContent>\r
+     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                 &lt;attribute name="beginTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+     *               &lt;/restriction>\r
+     *             &lt;/complexContent>\r
+     *           &lt;/complexType>\r
+     *         &lt;/element>\r
+     *       &lt;/sequence>\r
+     *       &lt;attribute name="fileFormatVersion" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *       &lt;attribute name="vendorName" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *       &lt;attribute name="dnPrefix" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *     &lt;/restriction>\r
+     *   &lt;/complexContent>\r
+     * &lt;/complexType>\r
+     * </pre>\r
+     *\r
+     *\r
+     */\r
+    @XmlAccessorType(XmlAccessType.FIELD)\r
+    @XmlType(name = "", propOrder = {\r
+        "fileSender",\r
+        "measCollec"\r
+    })\r
+    public static class FileHeader {\r
+\r
+        @XmlElement(required = true)\r
+        protected MeasCollecFile.FileHeader.FileSender fileSender;\r
+        @XmlElement(required = true)\r
+        protected MeasCollecFile.FileHeader.MeasCollec measCollec;\r
+        @XmlAttribute(name = "fileFormatVersion", required = true)\r
+        protected String fileFormatVersion;\r
+        @XmlAttribute(name = "vendorName")\r
+        protected String vendorName;\r
+        @XmlAttribute(name = "dnPrefix")\r
+        protected String dnPrefix;\r
+\r
+        /**\r
+         * Gets the value of the fileSender property.\r
+         *\r
+         * @return\r
+         *     possible object is\r
+         *     {@link MeasCollecFile.FileHeader.FileSender }\r
+         *\r
+         */\r
+        public MeasCollecFile.FileHeader.FileSender getFileSender() {\r
+            return fileSender;\r
+        }\r
+\r
+        /**\r
+         * Sets the value of the fileSender property.\r
+         *\r
+         * @param value\r
+         *     allowed object is\r
+         *     {@link MeasCollecFile.FileHeader.FileSender }\r
+         *\r
+         */\r
+        public void setFileSender(MeasCollecFile.FileHeader.FileSender value) {\r
+            this.fileSender = value;\r
+        }\r
+\r
+        /**\r
+         * Gets the value of the measCollec property.\r
+         *\r
+         * @return\r
+         *     possible object is\r
+         *     {@link MeasCollecFile.FileHeader.MeasCollec }\r
+         *\r
+         */\r
+        public MeasCollecFile.FileHeader.MeasCollec getMeasCollec() {\r
+            return measCollec;\r
+        }\r
+\r
+        /**\r
+         * Sets the value of the measCollec property.\r
+         *\r
+         * @param value\r
+         *     allowed object is\r
+         *     {@link MeasCollecFile.FileHeader.MeasCollec }\r
+         *\r
+         */\r
+        public void setMeasCollec(MeasCollecFile.FileHeader.MeasCollec value) {\r
+            this.measCollec = value;\r
+        }\r
+\r
+        /**\r
+         * Gets the value of the fileFormatVersion property.\r
+         *\r
+         * @return\r
+         *     possible object is\r
+         *     {@link String }\r
+         *\r
+         */\r
+        public String getFileFormatVersion() {\r
+            return fileFormatVersion;\r
+        }\r
+\r
+        /**\r
+         * Sets the value of the fileFormatVersion property.\r
+         *\r
+         * @param value\r
+         *     allowed object is\r
+         *     {@link String }\r
+         *\r
+         */\r
+        public void setFileFormatVersion(String value) {\r
+            this.fileFormatVersion = value;\r
+        }\r
+\r
+        /**\r
+         * Gets the value of the vendorName property.\r
+         *\r
+         * @return\r
+         *     possible object is\r
+         *     {@link String }\r
+         *\r
+         */\r
+        public String getVendorName() {\r
+            return vendorName;\r
+        }\r
+\r
+        /**\r
+         * Sets the value of the vendorName property.\r
+         *\r
+         * @param value\r
+         *     allowed object is\r
+         *     {@link String }\r
+         *\r
+         */\r
+        public void setVendorName(String value) {\r
+            this.vendorName = value;\r
+        }\r
+\r
+        /**\r
+         * Gets the value of the dnPrefix property.\r
+         *\r
+         * @return\r
+         *     possible object is\r
+         *     {@link String }\r
+         *\r
+         */\r
+        public String getDnPrefix() {\r
+            return dnPrefix;\r
+        }\r
+\r
+        /**\r
+         * Sets the value of the dnPrefix property.\r
+         *\r
+         * @param value\r
+         *     allowed object is\r
+         *     {@link String }\r
+         *\r
+         */\r
+        public void setDnPrefix(String value) {\r
+            this.dnPrefix = value;\r
+        }\r
+\r
+\r
+        /**\r
+         * <p>Java class for anonymous complex type.\r
+         *\r
+         * <p>The following schema fragment specifies the expected content contained within this class.\r
+         *\r
+         * <pre>\r
+         * &lt;complexType>\r
+         *   &lt;complexContent>\r
+         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *       &lt;attribute name="localDn" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+         *       &lt;attribute name="elementType" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+         *     &lt;/restriction>\r
+         *   &lt;/complexContent>\r
+         * &lt;/complexType>\r
+         * </pre>\r
+         *\r
+         *\r
+         */\r
+        @XmlAccessorType(XmlAccessType.FIELD)\r
+        @XmlType(name = "")\r
+        public static class FileSender {\r
+\r
+            @XmlAttribute(name = "localDn")\r
+            protected String localDn;\r
+            @XmlAttribute(name = "elementType")\r
+            protected String elementType;\r
+\r
+            /**\r
+             * Gets the value of the localDn property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public String getLocalDn() {\r
+                return localDn;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the localDn property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public void setLocalDn(String value) {\r
+                this.localDn = value;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the elementType property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public String getElementType() {\r
+                return elementType;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the elementType property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public void setElementType(String value) {\r
+                this.elementType = value;\r
+            }\r
+\r
+        }\r
+\r
+\r
+        /**\r
+         * <p>Java class for anonymous complex type.\r
+         *\r
+         * <p>The following schema fragment specifies the expected content contained within this class.\r
+         *\r
+         * <pre>\r
+         * &lt;complexType>\r
+         *   &lt;complexContent>\r
+         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *       &lt;attribute name="beginTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+         *     &lt;/restriction>\r
+         *   &lt;/complexContent>\r
+         * &lt;/complexType>\r
+         * </pre>\r
+         *\r
+         *\r
+         */\r
+        @XmlAccessorType(XmlAccessType.FIELD)\r
+        @XmlType(name = "")\r
+        public static class MeasCollec {\r
+\r
+            @XmlAttribute(name = "beginTime", required = true)\r
+            @XmlSchemaType(name = "dateTime")\r
+            protected XMLGregorianCalendar beginTime;\r
+\r
+            /**\r
+             * Gets the value of the beginTime property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link XMLGregorianCalendar }\r
+             *\r
+             */\r
+            public XMLGregorianCalendar getBeginTime() {\r
+                return beginTime;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the beginTime property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link XMLGregorianCalendar }\r
+             *\r
+             */\r
+            public void setBeginTime(XMLGregorianCalendar value) {\r
+                this.beginTime = value;\r
+            }\r
+\r
+        }\r
+\r
+    }\r
+\r
+\r
+    /**\r
+     * <p>Java class for anonymous complex type.\r
+     *\r
+     * <p>The following schema fragment specifies the expected content contained within this class.\r
+     *\r
+     * <pre>\r
+     * &lt;complexType>\r
+     *   &lt;complexContent>\r
+     *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *       &lt;sequence>\r
+     *         &lt;element name="managedElement">\r
+     *           &lt;complexType>\r
+     *             &lt;complexContent>\r
+     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                 &lt;attribute name="localDn" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *                 &lt;attribute name="userLabel" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *                 &lt;attribute name="swVersion" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *               &lt;/restriction>\r
+     *             &lt;/complexContent>\r
+     *           &lt;/complexType>\r
+     *         &lt;/element>\r
+     *         &lt;element name="measInfo" maxOccurs="unbounded" minOccurs="0">\r
+     *           &lt;complexType>\r
+     *             &lt;complexContent>\r
+     *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                 &lt;sequence>\r
+     *                   &lt;element name="job" minOccurs="0">\r
+     *                     &lt;complexType>\r
+     *                       &lt;complexContent>\r
+     *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                           &lt;attribute name="jobId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *                         &lt;/restriction>\r
+     *                       &lt;/complexContent>\r
+     *                     &lt;/complexType>\r
+     *                   &lt;/element>\r
+     *                   &lt;element name="granPeriod">\r
+     *                     &lt;complexType>\r
+     *                       &lt;complexContent>\r
+     *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                           &lt;attribute name="duration" use="required" type="{http://www.w3.org/2001/XMLSchema}duration" />\r
+     *                           &lt;attribute name="endTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+     *                         &lt;/restriction>\r
+     *                       &lt;/complexContent>\r
+     *                     &lt;/complexType>\r
+     *                   &lt;/element>\r
+     *                   &lt;element name="repPeriod" minOccurs="0">\r
+     *                     &lt;complexType>\r
+     *                       &lt;complexContent>\r
+     *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                           &lt;attribute name="duration" use="required" type="{http://www.w3.org/2001/XMLSchema}duration" />\r
+     *                         &lt;/restriction>\r
+     *                       &lt;/complexContent>\r
+     *                     &lt;/complexType>\r
+     *                   &lt;/element>\r
+     *                   &lt;choice>\r
+     *                     &lt;element name="measTypes">\r
+     *                       &lt;simpleType>\r
+     *                         &lt;list itemType="{http://www.w3.org/2001/XMLSchema}Name" />\r
+     *                       &lt;/simpleType>\r
+     *                     &lt;/element>\r
+     *                     &lt;element name="measType" maxOccurs="unbounded" minOccurs="0">\r
+     *                       &lt;complexType>\r
+     *                         &lt;simpleContent>\r
+     *                           &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>Name">\r
+     *                             &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+     *                           &lt;/extension>\r
+     *                         &lt;/simpleContent>\r
+     *                       &lt;/complexType>\r
+     *                     &lt;/element>\r
+     *                   &lt;/choice>\r
+     *                   &lt;element name="measValue" maxOccurs="unbounded" minOccurs="0">\r
+     *                     &lt;complexType>\r
+     *                       &lt;complexContent>\r
+     *                         &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+     *                           &lt;sequence>\r
+     *                             &lt;choice>\r
+     *                               &lt;element name="measResults">\r
+     *                                 &lt;simpleType>\r
+     *                                   &lt;list itemType="{http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec}measResultType" />\r
+     *                                 &lt;/simpleType>\r
+     *                               &lt;/element>\r
+     *                               &lt;element name="r" maxOccurs="unbounded" minOccurs="0">\r
+     *                                 &lt;complexType>\r
+     *                                   &lt;simpleContent>\r
+     *                                     &lt;extension base="&lt;http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec>measResultType">\r
+     *                                       &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+     *                                     &lt;/extension>\r
+     *                                   &lt;/simpleContent>\r
+     *                                 &lt;/complexType>\r
+     *                               &lt;/element>\r
+     *                             &lt;/choice>\r
+     *                             &lt;element name="suspect" type="{http://www.w3.org/2001/XMLSchema}boolean" minOccurs="0"/>\r
+     *                           &lt;/sequence>\r
+     *                           &lt;attribute name="measObjLdn" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *                         &lt;/restriction>\r
+     *                       &lt;/complexContent>\r
+     *                     &lt;/complexType>\r
+     *                   &lt;/element>\r
+     *                 &lt;/sequence>\r
+     *                 &lt;attribute name="measInfoId" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+     *               &lt;/restriction>\r
+     *             &lt;/complexContent>\r
+     *           &lt;/complexType>\r
+     *         &lt;/element>\r
+     *       &lt;/sequence>\r
+     *     &lt;/restriction>\r
+     *   &lt;/complexContent>\r
+     * &lt;/complexType>\r
+     * </pre>\r
+     *\r
+     *\r
+     */\r
+    @XmlAccessorType(XmlAccessType.FIELD)\r
+    @XmlType(name = "", propOrder = {\r
+        "managedElement",\r
+        "measInfo"\r
+    })\r
+    public static class MeasData {\r
+\r
+        @XmlElement(required = true)\r
+        protected MeasCollecFile.MeasData.ManagedElement managedElement;\r
+        protected List<MeasCollecFile.MeasData.MeasInfo> measInfo;\r
+\r
+        /**\r
+         * Gets the value of the managedElement property.\r
+         *\r
+         * @return\r
+         *     possible object is\r
+         *     {@link MeasCollecFile.MeasData.ManagedElement }\r
+         *\r
+         */\r
+        public MeasCollecFile.MeasData.ManagedElement getManagedElement() {\r
+            return managedElement;\r
+        }\r
+\r
+        /**\r
+         * Sets the value of the managedElement property.\r
+         *\r
+         * @param value\r
+         *     allowed object is\r
+         *     {@link MeasCollecFile.MeasData.ManagedElement }\r
+         *\r
+         */\r
+        public void setManagedElement(MeasCollecFile.MeasData.ManagedElement value) {\r
+            this.managedElement = value;\r
+        }\r
+\r
+        /**\r
+         * Gets the value of the measInfo property.\r
+         *\r
+         * <p>\r
+         * This accessor method returns a reference to the live list,\r
+         * not a snapshot. Therefore any modification you make to the\r
+         * returned list will be present inside the JAXB object.\r
+         * This is why there is not a <CODE>set</CODE> method for the measInfo property.\r
+         *\r
+         * <p>\r
+         * For example, to add a new item, do as follows:\r
+         * <pre>\r
+         *    getMeasInfo().add(newItem);\r
+         * </pre>\r
+         *\r
+         *\r
+         * <p>\r
+         * Objects of the following type(s) are allowed in the list\r
+         * {@link MeasCollecFile.MeasData.MeasInfo }\r
+         *\r
+         *\r
+         */\r
+        public List<MeasCollecFile.MeasData.MeasInfo> getMeasInfo() {\r
+            if (measInfo == null) {\r
+                measInfo = new ArrayList<MeasCollecFile.MeasData.MeasInfo>();\r
+            }\r
+            return this.measInfo;\r
+        }\r
+\r
+\r
+        /**\r
+         * <p>Java class for anonymous complex type.\r
+         *\r
+         * <p>The following schema fragment specifies the expected content contained within this class.\r
+         *\r
+         * <pre>\r
+         * &lt;complexType>\r
+         *   &lt;complexContent>\r
+         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *       &lt;attribute name="localDn" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+         *       &lt;attribute name="userLabel" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+         *       &lt;attribute name="swVersion" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+         *     &lt;/restriction>\r
+         *   &lt;/complexContent>\r
+         * &lt;/complexType>\r
+         * </pre>\r
+         *\r
+         *\r
+         */\r
+        @XmlAccessorType(XmlAccessType.FIELD)\r
+        @XmlType(name = "")\r
+        public static class ManagedElement {\r
+\r
+            @XmlAttribute(name = "localDn")\r
+            protected String localDn;\r
+            @XmlAttribute(name = "userLabel")\r
+            protected String userLabel;\r
+            @XmlAttribute(name = "swVersion")\r
+            protected String swVersion;\r
+\r
+            /**\r
+             * Gets the value of the localDn property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public String getLocalDn() {\r
+                return localDn;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the localDn property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public void setLocalDn(String value) {\r
+                this.localDn = value;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the userLabel property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public String getUserLabel() {\r
+                return userLabel;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the userLabel property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public void setUserLabel(String value) {\r
+                this.userLabel = value;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the swVersion property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public String getSwVersion() {\r
+                return swVersion;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the swVersion property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public void setSwVersion(String value) {\r
+                this.swVersion = value;\r
+            }\r
+\r
+        }\r
+\r
+\r
+        /**\r
+         * <p>Java class for anonymous complex type.\r
+         *\r
+         * <p>The following schema fragment specifies the expected content contained within this class.\r
+         *\r
+         * <pre>\r
+         * &lt;complexType>\r
+         *   &lt;complexContent>\r
+         *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *       &lt;sequence>\r
+         *         &lt;element name="job" minOccurs="0">\r
+         *           &lt;complexType>\r
+         *             &lt;complexContent>\r
+         *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *                 &lt;attribute name="jobId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+         *               &lt;/restriction>\r
+         *             &lt;/complexContent>\r
+         *           &lt;/complexType>\r
+         *         &lt;/element>\r
+         *         &lt;element name="granPeriod">\r
+         *           &lt;complexType>\r
+         *             &lt;complexContent>\r
+         *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *                 &lt;attribute name="duration" use="required" type="{http://www.w3.org/2001/XMLSchema}duration" />\r
+         *                 &lt;attribute name="endTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+         *               &lt;/restriction>\r
+         *             &lt;/complexContent>\r
+         *           &lt;/complexType>\r
+         *         &lt;/element>\r
+         *         &lt;element name="repPeriod" minOccurs="0">\r
+         *           &lt;complexType>\r
+         *             &lt;complexContent>\r
+         *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *                 &lt;attribute name="duration" use="required" type="{http://www.w3.org/2001/XMLSchema}duration" />\r
+         *               &lt;/restriction>\r
+         *             &lt;/complexContent>\r
+         *           &lt;/complexType>\r
+         *         &lt;/element>\r
+         *         &lt;choice>\r
+         *           &lt;element name="measTypes">\r
+         *             &lt;simpleType>\r
+         *               &lt;list itemType="{http://www.w3.org/2001/XMLSchema}Name" />\r
+         *             &lt;/simpleType>\r
+         *           &lt;/element>\r
+         *           &lt;element name="measType" maxOccurs="unbounded" minOccurs="0">\r
+         *             &lt;complexType>\r
+         *               &lt;simpleContent>\r
+         *                 &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>Name">\r
+         *                   &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+         *                 &lt;/extension>\r
+         *               &lt;/simpleContent>\r
+         *             &lt;/complexType>\r
+         *           &lt;/element>\r
+         *         &lt;/choice>\r
+         *         &lt;element name="measValue" maxOccurs="unbounded" minOccurs="0">\r
+         *           &lt;complexType>\r
+         *             &lt;complexContent>\r
+         *               &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+         *                 &lt;sequence>\r
+         *                   &lt;choice>\r
+         *                     &lt;element name="measResults">\r
+         *                       &lt;simpleType>\r
+         *                         &lt;list itemType="{http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec}measResultType" />\r
+         *                       &lt;/simpleType>\r
+         *                     &lt;/element>\r
+         *                     &lt;element name="r" maxOccurs="unbounded" minOccurs="0">\r
+         *                       &lt;complexType>\r
+         *                         &lt;simpleContent>\r
+         *                           &lt;extension base="&lt;http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec>measResultType">\r
+         *                             &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+         *                           &lt;/extension>\r
+         *                         &lt;/simpleContent>\r
+         *                       &lt;/complexType>\r
+         *                     &lt;/element>\r
+         *                   &lt;/choice>\r
+         *                   &lt;element name="suspect" type="{http://www.w3.org/2001/XMLSchema}boolean" minOccurs="0"/>\r
+         *                 &lt;/sequence>\r
+         *                 &lt;attribute name="measObjLdn" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+         *               &lt;/restriction>\r
+         *             &lt;/complexContent>\r
+         *           &lt;/complexType>\r
+         *         &lt;/element>\r
+         *       &lt;/sequence>\r
+         *       &lt;attribute name="measInfoId" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+         *     &lt;/restriction>\r
+         *   &lt;/complexContent>\r
+         * &lt;/complexType>\r
+         * </pre>\r
+         *\r
+         *\r
+         */\r
+        @XmlAccessorType(XmlAccessType.FIELD)\r
+        @XmlType(name = "", propOrder = {\r
+            "job",\r
+            "granPeriod",\r
+            "repPeriod",\r
+            "measTypes",\r
+            "measType",\r
+            "measValue"\r
+        })\r
+        public static class MeasInfo {\r
+\r
+            protected MeasCollecFile.MeasData.MeasInfo.Job job;\r
+            @XmlElement(required = true)\r
+            protected MeasCollecFile.MeasData.MeasInfo.GranPeriod granPeriod;\r
+            protected MeasCollecFile.MeasData.MeasInfo.RepPeriod repPeriod;\r
+            @XmlList\r
+            protected List<String> measTypes;\r
+            protected List<MeasCollecFile.MeasData.MeasInfo.MeasType> measType;\r
+            protected List<MeasCollecFile.MeasData.MeasInfo.MeasValue> measValue;\r
+            @XmlAttribute(name = "measInfoId")\r
+            protected String measInfoId;\r
+\r
+            /**\r
+             * Gets the value of the job property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link MeasCollecFile.MeasData.MeasInfo.Job }\r
+             *\r
+             */\r
+            public MeasCollecFile.MeasData.MeasInfo.Job getJob() {\r
+                return job;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the job property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link MeasCollecFile.MeasData.MeasInfo.Job }\r
+             *\r
+             */\r
+            public void setJob(MeasCollecFile.MeasData.MeasInfo.Job value) {\r
+                this.job = value;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the granPeriod property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link MeasCollecFile.MeasData.MeasInfo.GranPeriod }\r
+             *\r
+             */\r
+            public MeasCollecFile.MeasData.MeasInfo.GranPeriod getGranPeriod() {\r
+                return granPeriod;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the granPeriod property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link MeasCollecFile.MeasData.MeasInfo.GranPeriod }\r
+             *\r
+             */\r
+            public void setGranPeriod(MeasCollecFile.MeasData.MeasInfo.GranPeriod value) {\r
+                this.granPeriod = value;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the repPeriod property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link MeasCollecFile.MeasData.MeasInfo.RepPeriod }\r
+             *\r
+             */\r
+            public MeasCollecFile.MeasData.MeasInfo.RepPeriod getRepPeriod() {\r
+                return repPeriod;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the repPeriod property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link MeasCollecFile.MeasData.MeasInfo.RepPeriod }\r
+             *\r
+             */\r
+            public void setRepPeriod(MeasCollecFile.MeasData.MeasInfo.RepPeriod value) {\r
+                this.repPeriod = value;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the measTypes property.\r
+             *\r
+             * <p>\r
+             * This accessor method returns a reference to the live list,\r
+             * not a snapshot. Therefore any modification you make to the\r
+             * returned list will be present inside the JAXB object.\r
+             * This is why there is not a <CODE>set</CODE> method for the measTypes property.\r
+             *\r
+             * <p>\r
+             * For example, to add a new item, do as follows:\r
+             * <pre>\r
+             *    getMeasTypes().add(newItem);\r
+             * </pre>\r
+             *\r
+             *\r
+             * <p>\r
+             * Objects of the following type(s) are allowed in the list\r
+             * {@link String }\r
+             *\r
+             *\r
+             */\r
+            public List<String> getMeasTypes() {\r
+                if (measTypes == null) {\r
+                    measTypes = new ArrayList<String>();\r
+                }\r
+                return this.measTypes;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the measType property.\r
+             *\r
+             * <p>\r
+             * This accessor method returns a reference to the live list,\r
+             * not a snapshot. Therefore any modification you make to the\r
+             * returned list will be present inside the JAXB object.\r
+             * This is why there is not a <CODE>set</CODE> method for the measType property.\r
+             *\r
+             * <p>\r
+             * For example, to add a new item, do as follows:\r
+             * <pre>\r
+             *    getMeasType().add(newItem);\r
+             * </pre>\r
+             *\r
+             *\r
+             * <p>\r
+             * Objects of the following type(s) are allowed in the list\r
+             * {@link MeasCollecFile.MeasData.MeasInfo.MeasType }\r
+             *\r
+             *\r
+             */\r
+            public List<MeasCollecFile.MeasData.MeasInfo.MeasType> getMeasType() {\r
+                if (measType == null) {\r
+                    measType = new ArrayList<MeasCollecFile.MeasData.MeasInfo.MeasType>();\r
+                }\r
+                return this.measType;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the measValue property.\r
+             *\r
+             * <p>\r
+             * This accessor method returns a reference to the live list,\r
+             * not a snapshot. Therefore any modification you make to the\r
+             * returned list will be present inside the JAXB object.\r
+             * This is why there is not a <CODE>set</CODE> method for the measValue property.\r
+             *\r
+             * <p>\r
+             * For example, to add a new item, do as follows:\r
+             * <pre>\r
+             *    getMeasValue().add(newItem);\r
+             * </pre>\r
+             *\r
+             *\r
+             * <p>\r
+             * Objects of the following type(s) are allowed in the list\r
+             * {@link MeasCollecFile.MeasData.MeasInfo.MeasValue }\r
+             *\r
+             *\r
+             */\r
+            public List<MeasCollecFile.MeasData.MeasInfo.MeasValue> getMeasValue() {\r
+                if (measValue == null) {\r
+                    measValue = new ArrayList<MeasCollecFile.MeasData.MeasInfo.MeasValue>();\r
+                }\r
+                return this.measValue;\r
+            }\r
+\r
+            /**\r
+             * Gets the value of the measInfoId property.\r
+             *\r
+             * @return\r
+             *     possible object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public String getMeasInfoId() {\r
+                return measInfoId;\r
+            }\r
+\r
+            /**\r
+             * Sets the value of the measInfoId property.\r
+             *\r
+             * @param value\r
+             *     allowed object is\r
+             *     {@link String }\r
+             *\r
+             */\r
+            public void setMeasInfoId(String value) {\r
+                this.measInfoId = value;\r
+            }\r
+\r
+\r
+            /**\r
+             * <p>Java class for anonymous complex type.\r
+             *\r
+             * <p>The following schema fragment specifies the expected content contained within this class.\r
+             *\r
+             * <pre>\r
+             * &lt;complexType>\r
+             *   &lt;complexContent>\r
+             *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+             *       &lt;attribute name="duration" use="required" type="{http://www.w3.org/2001/XMLSchema}duration" />\r
+             *       &lt;attribute name="endTime" use="required" type="{http://www.w3.org/2001/XMLSchema}dateTime" />\r
+             *     &lt;/restriction>\r
+             *   &lt;/complexContent>\r
+             * &lt;/complexType>\r
+             * </pre>\r
+             *\r
+             *\r
+             */\r
+            @XmlAccessorType(XmlAccessType.FIELD)\r
+            @XmlType(name = "")\r
+            public static class GranPeriod {\r
+\r
+                @XmlAttribute(name = "duration", required = true)\r
+                protected Duration duration;\r
+                @XmlAttribute(name = "endTime", required = true)\r
+                @XmlSchemaType(name = "dateTime")\r
+                protected XMLGregorianCalendar endTime;\r
+\r
+                /**\r
+                 * Gets the value of the duration property.\r
+                 *\r
+                 * @return\r
+                 *     possible object is\r
+                 *     {@link Duration }\r
+                 *\r
+                 */\r
+                public Duration getDuration() {\r
+                    return duration;\r
+                }\r
+\r
+                /**\r
+                 * Sets the value of the duration property.\r
+                 *\r
+                 * @param value\r
+                 *     allowed object is\r
+                 *     {@link Duration }\r
+                 *\r
+                 */\r
+                public void setDuration(Duration value) {\r
+                    this.duration = value;\r
+                }\r
+\r
+                /**\r
+                 * Gets the value of the endTime property.\r
+                 *\r
+                 * @return\r
+                 *     possible object is\r
+                 *     {@link XMLGregorianCalendar }\r
+                 *\r
+                 */\r
+                public XMLGregorianCalendar getEndTime() {\r
+                    return endTime;\r
+                }\r
+\r
+                /**\r
+                 * Sets the value of the endTime property.\r
+                 *\r
+                 * @param value\r
+                 *     allowed object is\r
+                 *     {@link XMLGregorianCalendar }\r
+                 *\r
+                 */\r
+                public void setEndTime(XMLGregorianCalendar value) {\r
+                    this.endTime = value;\r
+                }\r
+\r
+            }\r
+\r
+\r
+            /**\r
+             * <p>Java class for anonymous complex type.\r
+             *\r
+             * <p>The following schema fragment specifies the expected content contained within this class.\r
+             *\r
+             * <pre>\r
+             * &lt;complexType>\r
+             *   &lt;complexContent>\r
+             *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+             *       &lt;attribute name="jobId" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+             *     &lt;/restriction>\r
+             *   &lt;/complexContent>\r
+             * &lt;/complexType>\r
+             * </pre>\r
+             *\r
+             *\r
+             */\r
+            @XmlAccessorType(XmlAccessType.FIELD)\r
+            @XmlType(name = "")\r
+            public static class Job {\r
+\r
+                @XmlAttribute(name = "jobId", required = true)\r
+                protected String jobId;\r
+\r
+                /**\r
+                 * Gets the value of the jobId property.\r
+                 *\r
+                 * @return\r
+                 *     possible object is\r
+                 *     {@link String }\r
+                 *\r
+                 */\r
+                public String getJobId() {\r
+                    return jobId;\r
+                }\r
+\r
+                /**\r
+                 * Sets the value of the jobId property.\r
+                 *\r
+                 * @param value\r
+                 *     allowed object is\r
+                 *     {@link String }\r
+                 *\r
+                 */\r
+                public void setJobId(String value) {\r
+                    this.jobId = value;\r
+                }\r
+\r
+            }\r
+\r
+\r
+            /**\r
+             * <p>Java class for anonymous complex type.\r
+             *\r
+             * <p>The following schema fragment specifies the expected content contained within this class.\r
+             *\r
+             * <pre>\r
+             * &lt;complexType>\r
+             *   &lt;simpleContent>\r
+             *     &lt;extension base="&lt;http://www.w3.org/2001/XMLSchema>Name">\r
+             *       &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+             *     &lt;/extension>\r
+             *   &lt;/simpleContent>\r
+             * &lt;/complexType>\r
+             * </pre>\r
+             *\r
+             *\r
+             */\r
+            @XmlAccessorType(XmlAccessType.FIELD)\r
+            @XmlType(name = "", propOrder = {\r
+                "value"\r
+            })\r
+            public static class MeasType {\r
+\r
+                @XmlValue\r
+                @XmlJavaTypeAdapter(CollapsedStringAdapter.class)\r
+                @XmlSchemaType(name = "Name")\r
+                protected String value;\r
+                @XmlAttribute(name = "p", required = true)\r
+                @XmlSchemaType(name = "positiveInteger")\r
+                protected BigInteger p;\r
+\r
+                /**\r
+                 * Gets the value of the value property.\r
+                 *\r
+                 * @return\r
+                 *     possible object is\r
+                 *     {@link String }\r
+                 *\r
+                 */\r
+                public String getValue() {\r
+                    return value;\r
+                }\r
+\r
+                /**\r
+                 * Sets the value of the value property.\r
+                 *\r
+                 * @param value\r
+                 *     allowed object is\r
+                 *     {@link String }\r
+                 *\r
+                 */\r
+                public void setValue(String value) {\r
+                    this.value = value;\r
+                }\r
+\r
+                /**\r
+                 * Gets the value of the p property.\r
+                 *\r
+                 * @return\r
+                 *     possible object is\r
+                 *     {@link BigInteger }\r
+                 *\r
+                 */\r
+                public BigInteger getP() {\r
+                    return p;\r
+                }\r
+\r
+                /**\r
+                 * Sets the value of the p property.\r
+                 *\r
+                 * @param value\r
+                 *     allowed object is\r
+                 *     {@link BigInteger }\r
+                 *\r
+                 */\r
+                public void setP(BigInteger value) {\r
+                    this.p = value;\r
+                }\r
+\r
+            }\r
+\r
+\r
+            /**\r
+             * <p>Java class for anonymous complex type.\r
+             *\r
+             * <p>The following schema fragment specifies the expected content contained within this class.\r
+             *\r
+             * <pre>\r
+             * &lt;complexType>\r
+             *   &lt;complexContent>\r
+             *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+             *       &lt;sequence>\r
+             *         &lt;choice>\r
+             *           &lt;element name="measResults">\r
+             *             &lt;simpleType>\r
+             *               &lt;list itemType="{http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec}measResultType" />\r
+             *             &lt;/simpleType>\r
+             *           &lt;/element>\r
+             *           &lt;element name="r" maxOccurs="unbounded" minOccurs="0">\r
+             *             &lt;complexType>\r
+             *               &lt;simpleContent>\r
+             *                 &lt;extension base="&lt;http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec>measResultType">\r
+             *                   &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+             *                 &lt;/extension>\r
+             *               &lt;/simpleContent>\r
+             *             &lt;/complexType>\r
+             *           &lt;/element>\r
+             *         &lt;/choice>\r
+             *         &lt;element name="suspect" type="{http://www.w3.org/2001/XMLSchema}boolean" minOccurs="0"/>\r
+             *       &lt;/sequence>\r
+             *       &lt;attribute name="measObjLdn" use="required" type="{http://www.w3.org/2001/XMLSchema}string" />\r
+             *     &lt;/restriction>\r
+             *   &lt;/complexContent>\r
+             * &lt;/complexType>\r
+             * </pre>\r
+             *\r
+             *\r
+             */\r
+            @XmlAccessorType(XmlAccessType.FIELD)\r
+            @XmlType(name = "", propOrder = {\r
+                "measResults",\r
+                "r",\r
+                "suspect"\r
+            })\r
+            public static class MeasValue {\r
+\r
+                @XmlList\r
+                protected List<String> measResults;\r
+                protected List<MeasCollecFile.MeasData.MeasInfo.MeasValue.R> r;\r
+                protected Boolean suspect;\r
+                @XmlAttribute(name = "measObjLdn", required = true)\r
+                protected String measObjLdn;\r
+\r
+                /**\r
+                 * Gets the value of the measResults property.\r
+                 *\r
+                 * <p>\r
+                 * This accessor method returns a reference to the live list,\r
+                 * not a snapshot. Therefore any modification you make to the\r
+                 * returned list will be present inside the JAXB object.\r
+                 * This is why there is not a <CODE>set</CODE> method for the measResults property.\r
+                 *\r
+                 * <p>\r
+                 * For example, to add a new item, do as follows:\r
+                 * <pre>\r
+                 *    getMeasResults().add(newItem);\r
+                 * </pre>\r
+                 *\r
+                 *\r
+                 * <p>\r
+                 * Objects of the following type(s) are allowed in the list\r
+                 * {@link String }\r
+                 *\r
+                 *\r
+                 */\r
+                public List<String> getMeasResults() {\r
+                    if (measResults == null) {\r
+                        measResults = new ArrayList<String>();\r
+                    }\r
+                    return this.measResults;\r
+                }\r
+\r
+                /**\r
+                 * Gets the value of the r property.\r
+                 *\r
+                 * <p>\r
+                 * This accessor method returns a reference to the live list,\r
+                 * not a snapshot. Therefore any modification you make to the\r
+                 * returned list will be present inside the JAXB object.\r
+                 * This is why there is not a <CODE>set</CODE> method for the r property.\r
+                 *\r
+                 * <p>\r
+                 * For example, to add a new item, do as follows:\r
+                 * <pre>\r
+                 *    getR().add(newItem);\r
+                 * </pre>\r
+                 *\r
+                 *\r
+                 * <p>\r
+                 * Objects of the following type(s) are allowed in the list\r
+                 * {@link MeasCollecFile.MeasData.MeasInfo.MeasValue.R }\r
+                 *\r
+                 *\r
+                 */\r
+                public List<MeasCollecFile.MeasData.MeasInfo.MeasValue.R> getR() {\r
+                    if (r == null) {\r
+                        r = new ArrayList<MeasCollecFile.MeasData.MeasInfo.MeasValue.R>();\r
+                    }\r
+                    return this.r;\r
+                }\r
+\r
+                /**\r
+                 * Gets the value of the suspect property.\r
+                 *\r
+                 * @return\r
+                 *     possible object is\r
+                 *     {@link Boolean }\r
+                 *\r
+                 */\r
+                public Boolean isSuspect() {\r
+                    return suspect;\r
+                }\r
+\r
+                /**\r
+                 * Sets the value of the suspect property.\r
+                 *\r
+                 * @param value\r
+                 *     allowed object is\r
+                 *     {@link Boolean }\r
+                 *\r
+                 */\r
+                public void setSuspect(Boolean value) {\r
+                    this.suspect = value;\r
+                }\r
+\r
+                /**\r
+                 * Gets the value of the measObjLdn property.\r
+                 *\r
+                 * @return\r
+                 *     possible object is\r
+                 *     {@link String }\r
+                 *\r
+                 */\r
+                public String getMeasObjLdn() {\r
+                    return measObjLdn;\r
+                }\r
+\r
+                /**\r
+                 * Sets the value of the measObjLdn property.\r
+                 *\r
+                 * @param value\r
+                 *     allowed object is\r
+                 *     {@link String }\r
+                 *\r
+                 */\r
+                public void setMeasObjLdn(String value) {\r
+                    this.measObjLdn = value;\r
+                }\r
+\r
+\r
+                /**\r
+                 * <p>Java class for anonymous complex type.\r
+                 *\r
+                 * <p>The following schema fragment specifies the expected content contained within this class.\r
+                 *\r
+                 * <pre>\r
+                 * &lt;complexType>\r
+                 *   &lt;simpleContent>\r
+                 *     &lt;extension base="&lt;http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec>measResultType">\r
+                 *       &lt;attribute name="p" use="required" type="{http://www.w3.org/2001/XMLSchema}positiveInteger" />\r
+                 *     &lt;/extension>\r
+                 *   &lt;/simpleContent>\r
+                 * &lt;/complexType>\r
+                 * </pre>\r
+                 *\r
+                 *\r
+                 */\r
+                @XmlAccessorType(XmlAccessType.FIELD)\r
+                @XmlType(name = "", propOrder = {\r
+                    "value"\r
+                })\r
+                public static class R {\r
+\r
+                    @XmlValue\r
+                    protected String value;\r
+                    @XmlAttribute(name = "p", required = true)\r
+                    @XmlSchemaType(name = "positiveInteger")\r
+                    protected BigInteger p;\r
+\r
+                    /**\r
+                     * Gets the value of the value property.\r
+                     *\r
+                     * @return\r
+                     *     possible object is\r
+                     *     {@link String }\r
+                     *\r
+                     */\r
+                    public String getValue() {\r
+                        return value;\r
+                    }\r
+\r
+                    /**\r
+                     * Sets the value of the value property.\r
+                     *\r
+                     * @param value\r
+                     *     allowed object is\r
+                     *     {@link String }\r
+                     *\r
+                     */\r
+                    public void setValue(String value) {\r
+                        this.value = value;\r
+                    }\r
+\r
+                    /**\r
+                     * Gets the value of the p property.\r
+                     *\r
+                     * @return\r
+                     *     possible object is\r
+                     *     {@link BigInteger }\r
+                     *\r
+                     */\r
+                    public BigInteger getP() {\r
+                        return p;\r
+                    }\r
+\r
+                    /**\r
+                     * Sets the value of the p property.\r
+                     *\r
+                     * @param value\r
+                     *     allowed object is\r
+                     *     {@link BigInteger }\r
+                     *\r
+                     */\r
+                    public void setP(BigInteger value) {\r
+                        this.p = value;\r
+                    }\r
+\r
+                }\r
+\r
+\r
+                public void replaceR(List<R> filteredRs) {\r
+                    this.r = filteredRs;\r
+\r
+                }\r
+\r
+                public void replaceMeasResults(List<String> filteredMeasResults) {\r
+                   this.measResults = filteredMeasResults;\r
+\r
+                }\r
+\r
+            }\r
+\r
+\r
+            /**\r
+             * <p>Java class for anonymous complex type.\r
+             *\r
+             * <p>The following schema fragment specifies the expected content contained within this class.\r
+             *\r
+             * <pre>\r
+             * &lt;complexType>\r
+             *   &lt;complexContent>\r
+             *     &lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType">\r
+             *       &lt;attribute name="duration" use="required" type="{http://www.w3.org/2001/XMLSchema}duration" />\r
+             *     &lt;/restriction>\r
+             *   &lt;/complexContent>\r
+             * &lt;/complexType>\r
+             * </pre>\r
+             *\r
+             *\r
+             */\r
+            @XmlAccessorType(XmlAccessType.FIELD)\r
+            @XmlType(name = "")\r
+            public static class RepPeriod {\r
+\r
+                @XmlAttribute(name = "duration", required = true)\r
+                protected Duration duration;\r
+\r
+                /**\r
+                 * Gets the value of the duration property.\r
+                 *\r
+                 * @return\r
+                 *     possible object is\r
+                 *     {@link Duration }\r
+                 *\r
+                 */\r
+                public Duration getDuration() {\r
+                    return duration;\r
+                }\r
+\r
+                /**\r
+                 * Sets the value of the duration property.\r
+                 *\r
+                 * @param value\r
+                 *     allowed object is\r
+                 *     {@link Duration }\r
+                 *\r
+                 */\r
+                public void setDuration(Duration value) {\r
+                    this.duration = value;\r
+                }\r
+            }\r
+\r
+\r
+            public void replaceMeasTypes(List<String> newMeasTypes) {\r
+                this.measTypes = newMeasTypes;\r
+            }\r
+\r
+            public void replaceMeasType(List<MeasType> filteredMeasTypes) {\r
+                this.measType = filteredMeasTypes;\r
+            }\r
+\r
+        }\r
+\r
+\r
+        public void setMeasInfo(List<MeasInfo> filteredMeasInfos) {\r
+            this.measInfo  = filteredMeasInfos;\r
+        }\r
+\r
+    }\r
+\r
+}\r
diff --git a/src/main/java/org/onap/dcaegen2/services/pmmapper/model/MeasFilterConfig.java b/src/main/java/org/onap/dcaegen2/services/pmmapper/model/MeasFilterConfig.java
new file mode 100644 (file)
index 0000000..458a6cd
--- /dev/null
@@ -0,0 +1,53 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ *  Copyright (C) 2019 Nordix Foundation.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ * SPDX-License-Identifier: Apache-2.0\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+\r
+package org.onap.dcaegen2.services.pmmapper.model;\r
+\r
+import java.util.List;\r
+import com.google.gson.annotations.SerializedName;\r
+\r
+import lombok.Data;\r
+import lombok.EqualsAndHashCode;\r
+import lombok.NoArgsConstructor;\r
+\r
+@Data\r
+@EqualsAndHashCode\r
+@NoArgsConstructor\r
+public class MeasFilterConfig {\r
+\r
+  @SerializedName("filters")\r
+  public List<Filter> filters;\r
+\r
+      @Data\r
+      public class Filter {\r
+          @SerializedName("pmDefVsn")\r
+          private String dictionaryVersion;\r
+\r
+          @SerializedName("nfType")\r
+          private String nfType;\r
+\r
+          @SerializedName("vendor")\r
+          private String vendor;\r
+\r
+          @SerializedName("measTypes")\r
+          private List<String> measTypes;\r
+\r
+      }\r
+}\r
diff --git a/src/main/java/org/onap/dcaegen2/services/pmmapper/model/package-info.java b/src/main/java/org/onap/dcaegen2/services/pmmapper/model/package-info.java
new file mode 100644 (file)
index 0000000..92c83be
--- /dev/null
@@ -0,0 +1,24 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ *  Copyright (C) 2019 Nordix Foundation.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ * SPDX-License-Identifier: Apache-2.0\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+\r
+@XmlSchema(namespace = "http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec", elementFormDefault = XmlNsForm.QUALIFIED)\r
+package org.onap.dcaegen2.services.pmmapper.model;\r
+import javax.xml.bind.annotation.XmlSchema;\r
+import javax.xml.bind.annotation.XmlNsForm;
\ No newline at end of file
diff --git a/src/main/java/org/onap/dcaegen2/services/pmmapper/utils/MeasConverter.java b/src/main/java/org/onap/dcaegen2/services/pmmapper/utils/MeasConverter.java
new file mode 100644 (file)
index 0000000..b9c01e6
--- /dev/null
@@ -0,0 +1,76 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ *  Copyright (C) 2019 Nordix Foundation.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ * SPDX-License-Identifier: Apache-2.0\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+\r
+package org.onap.dcaegen2.services.pmmapper.utils;\r
+\r
+import java.io.StringReader;\r
+import java.io.StringWriter;\r
+\r
+import javax.xml.bind.JAXBContext;\r
+import javax.xml.bind.JAXBException;\r
+import javax.xml.bind.Marshaller;\r
+import javax.xml.bind.Unmarshaller;\r
+\r
+import org.onap.dcaegen2.services.pmmapper.exceptions.MappingException;\r
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile;\r
+import org.onap.logging.ref.slf4j.ONAPLogAdapter;\r
+import org.slf4j.LoggerFactory;\r
+\r
+/**\r
+ * Converts 3GPP PM Measurement xml string to MeasCollecFil and vice versa.\r
+ **/\r
+public class MeasConverter {\r
+    private static final ONAPLogAdapter logger = new ONAPLogAdapter(LoggerFactory.getLogger(MeasConverter.class));\r
+\r
+    /**\r
+     * Converts 3GPP Measurement xml string to MeasCollecFile.\r
+     **/\r
+    public MeasCollecFile convert(String eventBody) {\r
+        logger.unwrap().debug("Converting 3GPP xml string to MeasCollecFile");\r
+        MeasCollecFile measCollecFile = null;\r
+        try {\r
+            JAXBContext jaxbContext = null;\r
+            jaxbContext = JAXBContext.newInstance(MeasCollecFile.class);\r
+            Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();\r
+            measCollecFile = (MeasCollecFile) unmarshaller.unmarshal(new StringReader(eventBody));\r
+        } catch (JAXBException e) {\r
+            throw new MappingException("Unable to convert 3GPP xml to MeasCollecFile", e);\r
+        }\r
+        return measCollecFile;\r
+    }\r
+\r
+    /**\r
+     * Converts MeasCollecFile to 3GPP Measurement xml string.\r
+     **/\r
+    public String convert(MeasCollecFile measCollecFile) {\r
+        logger.unwrap().debug("Converting MeasCollecFile to 3GPP xml string");\r
+        StringWriter writer = new StringWriter();\r
+        try {\r
+            JAXBContext jaxbContext = JAXBContext.newInstance(MeasCollecFile.class);\r
+            Marshaller marshaller = jaxbContext.createMarshaller();\r
+            marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);\r
+            marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);\r
+            marshaller.marshal(measCollecFile, writer);\r
+        } catch (JAXBException e) {\r
+            throw new MappingException("Unable to convert MeasCollecFile to 3GPP xml", e);\r
+        }\r
+        return writer.toString();\r
+    }\r
+}\r
diff --git a/src/test/java/org/onap/dcaegen2/services/pmmapper/filtering/MeasFilterHandlerTest.java b/src/test/java/org/onap/dcaegen2/services/pmmapper/filtering/MeasFilterHandlerTest.java
new file mode 100644 (file)
index 0000000..8b1f8aa
--- /dev/null
@@ -0,0 +1,171 @@
+/*-
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2019 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.dcaegen2.services.pmmapper.filtering;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.onap.dcaegen2.services.pmmapper.model.Event;
+import org.onap.dcaegen2.services.pmmapper.model.EventMetadata;
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile;
+import org.onap.dcaegen2.services.pmmapper.model.MeasFilterConfig;
+import org.onap.dcaegen2.services.pmmapper.model.MeasFilterConfig.Filter;
+import org.onap.dcaegen2.services.pmmapper.utils.MeasConverter;
+
+import io.undertow.server.HttpServerExchange;
+import utils.EventUtils;
+
+@ExtendWith(MockitoExtension.class)
+class MeasFilterHandlerTest {
+
+    private static MeasFilterConfig filterConfig;
+    private static final String baseDir = "src/test/resources/filter_test/";
+    private static final Path dataDirectory = Paths.get("src/test/resources/mapper_test/mapping_data/");
+    private static List<String> counters = Arrays.asList("a", "b");
+    private static  MeasConverter converter = new MeasConverter();
+    private MeasFilterHandler objUnderTest;
+    @Mock
+    private HttpServerExchange exchange;
+    @Mock
+    private EventMetadata metaData;
+
+    @BeforeEach
+    void setup() {
+        filterConfig = new MeasFilterConfig();
+        Filter filter = filterConfig.new Filter();
+        filter.setDictionaryVersion("");
+        filter.setMeasTypes(counters);
+        filterConfig.setFilters(Arrays.asList(filter));
+        objUnderTest = new MeasFilterHandler(new MeasConverter());
+        objUnderTest.setFilter(filterConfig.getFilters()
+                .get(0));
+    }
+
+    @Test
+    void measTypes_byCommaSeparation() throws IOException {
+        String inputPath = baseDir + "meas_results";
+        String inputXml = EventUtils.fileContentsToString(Paths.get(inputPath + ".xml"));
+        String expected = EventUtils.fileContentsToString(Paths.get(inputPath + "_filtered.xml"));
+        Event event = new Event(exchange, inputXml, metaData, new HashMap<String, String>(), "");
+        event.setMeasCollecFile(converter.convert(inputXml));
+
+        objUnderTest.filterByMeasType(event);
+
+        String actual = converter.convert(event.getMeasCollecFile());
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    void measType_byID() throws IOException {
+        String inputPath = baseDir + "meas_type_and_r";
+        String inputXml = EventUtils.fileContentsToString(Paths.get(inputPath + ".xml"));
+        String filteredString = EventUtils.fileContentsToString(Paths.get(inputPath + "_filtered.xml"));
+        Event event = new Event(exchange, inputXml, metaData, new HashMap<String, String>(), "");
+        event.setMeasCollecFile(converter.convert(inputXml));
+        MeasCollecFile f = converter.convert(filteredString);
+        String expected = converter.convert(f);
+        objUnderTest.filterByMeasType(event);
+
+        String actual = converter.convert(event.getMeasCollecFile());
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    void no_Filters_match() {
+        String inputPath = baseDir + "meas_results";
+        String inputXml = EventUtils.fileContentsToString(Paths.get(inputPath + ".xml"));
+
+        Filter noMatchFilter = filterConfig.new Filter();
+        noMatchFilter.setMeasTypes(Arrays.asList("nomatch1", "nomatch2"));
+        objUnderTest.setFilter(noMatchFilter);
+
+        Event event = new Event(exchange, inputXml, metaData, new HashMap<String, String>(), "");
+        event.setMeasCollecFile(converter.convert(inputXml));
+        assertFalse(objUnderTest.filterByMeasType(event));
+    }
+
+    @Test
+    void multiple_measInfos_measResults() {
+        String inputPath = baseDir + "meas_results_manyInfo";
+        String inputXml = EventUtils.fileContentsToString(Paths.get(inputPath + ".xml"));
+        String filteredString = EventUtils.fileContentsToString(Paths.get(inputPath + "_filtered.xml"));
+        Event event = new Event(exchange, inputXml, metaData, new HashMap<String, String>(), "");
+        event.setMeasCollecFile(converter.convert(inputXml));
+        MeasCollecFile f = converter.convert(filteredString);
+        String expected = converter.convert(f);
+        objUnderTest.filterByMeasType(event);
+
+        String actual = converter.convert(event.getMeasCollecFile());
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    void multiple_measInfos_measTypeAndR() {
+        String inputPath = baseDir + "meas_type_and_r_manyInfo";
+        String inputXml = EventUtils.fileContentsToString(Paths.get(inputPath + ".xml"));
+        String filteredString = EventUtils.fileContentsToString(Paths.get(inputPath + "_filtered.xml"));
+        Event event = new Event(exchange, inputXml, metaData, new HashMap<String, String>(), "");
+        event.setMeasCollecFile(converter.convert(inputXml));
+        MeasCollecFile f = converter.convert(filteredString);
+        String expected = converter.convert(f);
+        objUnderTest.filterByMeasType(event);
+
+        String actual = converter.convert(event.getMeasCollecFile());
+        assertEquals(expected, actual);
+    }
+
+    @ParameterizedTest
+    @MethodSource("getValidMeas")
+    void applyFilterToValidMeasurements(Event testEvent) {
+        objUnderTest.filterByMeasType(testEvent);
+    }
+
+    static List<Event> getValidMeas() throws IOException {
+        final Path metadata = Paths.get("src/test/resources/valid_metadata.json");
+        List<Event> events = EventUtils
+                .eventsFromDirectory(Paths.get(dataDirectory.toString() + "/valid_data/"), metadata)
+                .stream()
+                .map(e -> {
+                    System.out.println(e.getBody());
+                    MeasCollecFile m = converter.convert(e.getBody());
+                    System.out.println(m.getMeasData());
+                    e.setMeasCollecFile(m);
+                    return e;
+                })
+                .collect(Collectors.toList());
+        return events;
+    }
+}
diff --git a/src/test/java/org/onap/dcaegen2/services/pmmapper/utils/MeasConverterTest.java b/src/test/java/org/onap/dcaegen2/services/pmmapper/utils/MeasConverterTest.java
new file mode 100644 (file)
index 0000000..f51ec5c
--- /dev/null
@@ -0,0 +1,83 @@
+/*-\r
+ * ============LICENSE_START=======================================================\r
+ *  Copyright (C) 2019 Nordix Foundation.\r
+ * ================================================================================\r
+ * Licensed under the Apache License, Version 2.0 (the "License");\r
+ * you may not use this file except in compliance with the License.\r
+ * You may obtain a copy of the License at\r
+ *\r
+ *      http://www.apache.org/licenses/LICENSE-2.0\r
+ *\r
+ * Unless required by applicable law or agreed to in writing, software\r
+ * distributed under the License is distributed on an "AS IS" BASIS,\r
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+ * See the License for the specific language governing permissions and\r
+ * limitations under the License.\r
+ *\r
+ * SPDX-License-Identifier: Apache-2.0\r
+ * ============LICENSE_END=========================================================\r
+ */\r
+package org.onap.dcaegen2.services.pmmapper.utils;\r
+import static org.junit.jupiter.api.Assertions.assertThrows;\r
+\r
+import java.io.StringReader;\r
+import java.io.StringWriter;\r
+\r
+import javax.xml.bind.JAXBContext;\r
+import javax.xml.bind.JAXBException;\r
+import javax.xml.bind.Marshaller;\r
+import javax.xml.bind.Unmarshaller;\r
+\r
+import org.junit.Before;\r
+import org.junit.Test;\r
+import org.junit.runner.RunWith;\r
+import org.mockito.Mockito;\r
+import org.onap.dcaegen2.services.pmmapper.exceptions.MappingException;\r
+import org.onap.dcaegen2.services.pmmapper.model.MeasCollecFile;\r
+import org.powermock.api.mockito.PowerMockito;\r
+import org.powermock.core.classloader.annotations.PrepareForTest;\r
+import org.powermock.modules.junit4.PowerMockRunner;\r
+\r
+@RunWith(PowerMockRunner.class)\r
+@PrepareForTest({JAXBContext.class})\r
+public class MeasConverterTest {\r
+\r
+    private MeasConverter objUnderTest;\r
+\r
+    @Before\r
+    public void setup() {\r
+        objUnderTest = new MeasConverter();\r
+    }\r
+    @Test\r
+    public void convertToString_throws_mappingException() throws Exception {\r
+        MeasCollecFile file = new MeasCollecFile();\r
+        PowerMockito.mockStatic(JAXBContext.class);\r
+        Marshaller marshallerMock = PowerMockito.mock(Marshaller.class);\r
+        JAXBContext jaxbContext = PowerMockito.mock(JAXBContext.class);\r
+        StringWriter w = Mockito.mock(StringWriter.class);\r
+        PowerMockito.whenNew(StringWriter.class).withNoArguments().thenReturn(w);\r
+        PowerMockito.when(JAXBContext.newInstance(MeasCollecFile.class)).thenReturn(jaxbContext);\r
+        PowerMockito.when(jaxbContext.createMarshaller()).thenReturn(marshallerMock);\r
+        PowerMockito.doThrow(new JAXBException("",""))\r
+       .when(marshallerMock).marshal( Mockito.any(MeasCollecFile.class)\r
+               ,Mockito.any(StringWriter.class));\r
+\r
+        assertThrows(MappingException.class, () -> {\r
+              objUnderTest.convert(file);\r
+        });\r
+    }\r
+\r
+    @Test\r
+    public void convertToMeasCollec_throws_mappingException() throws JAXBException {\r
+        PowerMockito.mockStatic(JAXBContext.class);\r
+        Unmarshaller unmarshallerMock = PowerMockito.mock(Unmarshaller.class);\r
+        JAXBContext jaxbContext = PowerMockito.mock(JAXBContext.class);\r
+        PowerMockito.when(JAXBContext.newInstance(MeasCollecFile.class)).thenReturn(jaxbContext);\r
+        PowerMockito.when(jaxbContext.createUnmarshaller()).thenReturn(unmarshallerMock);\r
+        PowerMockito.when(unmarshallerMock.unmarshal(Mockito.any(StringReader.class))).thenThrow(JAXBException.class);\r
+\r
+        assertThrows(MappingException.class, () -> {\r
+            objUnderTest.convert("xmlString");\r
+        });\r
+    }\r
+}\r
diff --git a/src/test/resources/filter_test/meas_results.xml b/src/test/resources/filter_test/meas_results.xml
new file mode 100644 (file)
index 0000000..5825e7b
--- /dev/null
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+    <fileHeader dnPrefix="some dnPrefix" vendorName="FooBar Ltd"
+                fileFormatVersion="32.435 V10.0">
+        <fileSender localDn="Dublin"/>
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>
+    </fileHeader>
+    <measData>
+        <managedElement swVersion="r0.1" localDn="Dublin"/>
+        <measInfo measInfoId="some measInfoId">
+            <job jobId="jobId"/>
+            <granPeriod endTime="2018-10-02T12:15:00Z" duration="PT900S"/>
+            <repPeriod duration="PT900S"/>
+            <measTypes>z a zz b</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>99 1 27 2</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>
+    </fileFooter>
+</measCollecFile>
diff --git a/src/test/resources/filter_test/meas_results_filtered.xml b/src/test/resources/filter_test/meas_results_filtered.xml
new file mode 100644 (file)
index 0000000..af45364
--- /dev/null
@@ -0,0 +1,22 @@
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+    <fileHeader fileFormatVersion="32.435 V10.0" vendorName="FooBar Ltd" dnPrefix="some dnPrefix">
+        <fileSender localDn="Dublin"/>
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>
+    </fileHeader>
+    <measData>
+        <managedElement localDn="Dublin" swVersion="r0.1"/>
+        <measInfo measInfoId="some measInfoId">
+            <job jobId="jobId"/>
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>
+            <repPeriod duration="PT900S"/>
+            <measTypes>a b</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>1 2</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>
+    </fileFooter>
+</measCollecFile>
\ No newline at end of file
diff --git a/src/test/resources/filter_test/meas_results_manyInfo.xml b/src/test/resources/filter_test/meas_results_manyInfo.xml
new file mode 100644 (file)
index 0000000..2b87912
--- /dev/null
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+    <fileHeader dnPrefix="some dnPrefix" vendorName="FooBar Ltd"
+                fileFormatVersion="32.435 V10.0">
+        <fileSender localDn="Dublin"/>
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>
+    </fileHeader>
+    <measData>
+        <managedElement swVersion="r0.1" localDn="Dublin"/>
+        <measInfo measInfoId="this will be filtered out">
+            <job jobId="jobId"/>
+            <granPeriod endTime="2018-10-02T12:15:00Z" duration="PT900S"/>
+            <repPeriod duration="PT900S"/>
+            <measTypes>z aa zz bb</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>99 1 27 2</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+        <measInfo measInfoId="some measInfoId">
+            <job jobId="jobId"/>
+            <granPeriod endTime="2018-10-02T12:15:00Z" duration="PT900S"/>
+            <repPeriod duration="PT900S"/>
+            <measTypes>z a zz b</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>99 1 27 2</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+        <measInfo measInfoId="some measInfoId2">
+            <job jobId="jobId"/>
+            <granPeriod endTime="2018-10-02T12:15:00Z" duration="PT900S"/>
+            <repPeriod duration="PT900S"/>
+            <measTypes>z a zz b</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>99 1 27 2</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>
+    </fileFooter>
+</measCollecFile>
diff --git a/src/test/resources/filter_test/meas_results_manyInfo_filtered.xml b/src/test/resources/filter_test/meas_results_manyInfo_filtered.xml
new file mode 100644 (file)
index 0000000..4a887d5
--- /dev/null
@@ -0,0 +1,32 @@
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">
+    <fileHeader fileFormatVersion="32.435 V10.0" vendorName="FooBar Ltd" dnPrefix="some dnPrefix">
+        <fileSender localDn="Dublin"/>
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>
+    </fileHeader>
+    <measData>
+        <managedElement localDn="Dublin" swVersion="r0.1"/>
+        <measInfo measInfoId="some measInfoId">
+            <job jobId="jobId"/>
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>
+            <repPeriod duration="PT900S"/>
+            <measTypes>a b</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>1 2</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+        <measInfo measInfoId="some measInfoId2">
+            <job jobId="jobId"/>
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>
+            <repPeriod duration="PT900S"/>
+            <measTypes>a b</measTypes>
+            <measValue measObjLdn="objLdn">
+                <measResults>1 2</measResults>
+                <suspect>false</suspect>
+            </measValue>
+        </measInfo>
+    </measData>
+    <fileFooter>
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>
+    </fileFooter>
+</measCollecFile>
\ No newline at end of file
diff --git a/src/test/resources/filter_test/meas_type_and_r.xml b/src/test/resources/filter_test/meas_type_and_r.xml
new file mode 100644 (file)
index 0000000..0d99e39
--- /dev/null
@@ -0,0 +1,26 @@
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">\r
+    <fileHeader fileFormatVersion="32.435 V10.0" vendorName="FooBar Ltd" dnPrefix="some dnPrefix">\r
+        <fileSender localDn="Dublin"/>\r
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>\r
+    </fileHeader>\r
+    <measData>\r
+        <managedElement localDn="Dublin" swVersion="r0.1"/>\r
+        <measInfo measInfoId="some measInfoId">\r
+            <job jobId="jobId"/>\r
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>\r
+            <repPeriod duration="PT900S"/>\r
+            <measType p="1">a</measType>\r
+            <measType p="2">z</measType>\r
+            <measType p="3">b</measType>\r
+            <measValue measObjLdn="some measObjLdn">\r
+                <r p="1">1</r>\r
+                <r p="2">99</r>\r
+                <r p="3">2</r>\r
+                <suspect>false</suspect>\r
+            </measValue>\r
+        </measInfo>\r
+    </measData>\r
+    <fileFooter>\r
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>\r
+    </fileFooter>\r
+</measCollecFile>
\ No newline at end of file
diff --git a/src/test/resources/filter_test/meas_type_and_r_filtered.xml b/src/test/resources/filter_test/meas_type_and_r_filtered.xml
new file mode 100644 (file)
index 0000000..1b5a362
--- /dev/null
@@ -0,0 +1,25 @@
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">\r
+    <fileHeader fileFormatVersion="32.435 V10.0" vendorName="FooBar Ltd" dnPrefix="some dnPrefix">\r
+        <fileSender localDn="Dublin"/>\r
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>\r
+    </fileHeader>\r
+    <measData>\r
+        <managedElement localDn="Dublin" swVersion="r0.1"/>\r
+        <measInfo measInfoId="some measInfoId">\r
+            <job jobId="jobId"/>\r
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>\r
+            <repPeriod duration="PT900S"/>\r
+            <measTypes></measTypes>\r
+            <measType p="1">a</measType>\r
+            <measType p="3">b</measType>\r
+            <measValue measObjLdn="some measObjLdn">\r
+                <r p="1">1</r>\r
+                <r p="3">2</r>\r
+                <suspect>false</suspect>\r
+            </measValue>\r
+        </measInfo>\r
+    </measData>\r
+    <fileFooter>\r
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>\r
+    </fileFooter>\r
+</measCollecFile>
\ No newline at end of file
diff --git a/src/test/resources/filter_test/meas_type_and_r_manyInfo.xml b/src/test/resources/filter_test/meas_type_and_r_manyInfo.xml
new file mode 100644 (file)
index 0000000..dd35dfc
--- /dev/null
@@ -0,0 +1,54 @@
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">\r
+    <fileHeader fileFormatVersion="32.435 V10.0" vendorName="FooBar Ltd" dnPrefix="some dnPrefix">\r
+        <fileSender localDn="Dublin"/>\r
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>\r
+    </fileHeader>\r
+    <measData>\r
+        <managedElement localDn="Dublin" swVersion="r0.1"/>\r
+        <measInfo measInfoId="some measInfoId">\r
+            <job jobId="jobId"/>\r
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>\r
+            <repPeriod duration="PT900S"/>\r
+            <measType p="1">a</measType>\r
+            <measType p="2">z</measType>\r
+            <measType p="3">b</measType>\r
+            <measValue measObjLdn="some measObjLdn">\r
+                <r p="1">1</r>\r
+                <r p="2">99</r>\r
+                <r p="3">2</r>\r
+                <suspect>false</suspect>\r
+            </measValue>\r
+        </measInfo>\r
+        <measInfo measInfoId="filter will disregard this measInfo">\r
+            <job jobId="jobId"/>\r
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>\r
+            <repPeriod duration="PT900S"/>\r
+            <measType p="1">aa</measType>\r
+            <measType p="2">z</measType>\r
+            <measType p="3">bb</measType>\r
+            <measValue measObjLdn="some measObjLdn">\r
+                <r p="1">1</r>\r
+                <r p="2">99</r>\r
+                <r p="3">2</r>\r
+                <suspect>false</suspect>\r
+            </measValue>\r
+        </measInfo>\r
+        <measInfo measInfoId="some measInfoId2">\r
+            <job jobId="jobId"/>\r
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>\r
+            <repPeriod duration="PT900S"/>\r
+            <measType p="1">a</measType>\r
+            <measType p="2">z</measType>\r
+            <measType p="3">b</measType>\r
+            <measValue measObjLdn="some measObjLdn">\r
+                <r p="1">1</r>\r
+                <r p="2">99</r>\r
+                <r p="3">2</r>\r
+                <suspect>false</suspect>\r
+            </measValue>\r
+        </measInfo>\r
+    </measData>\r
+    <fileFooter>\r
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>\r
+    </fileFooter>\r
+</measCollecFile>
\ No newline at end of file
diff --git a/src/test/resources/filter_test/meas_type_and_r_manyInfo_filtered.xml b/src/test/resources/filter_test/meas_type_and_r_manyInfo_filtered.xml
new file mode 100644 (file)
index 0000000..db50fca
--- /dev/null
@@ -0,0 +1,38 @@
+<measCollecFile xmlns="http://www.3gpp.org/ftp/specs/archive/32_series/32.435#measCollec">\r
+    <fileHeader fileFormatVersion="32.435 V10.0" vendorName="FooBar Ltd" dnPrefix="some dnPrefix">\r
+        <fileSender localDn="Dublin"/>\r
+        <measCollec beginTime="2018-10-02T12:00:00+01:00"/>\r
+    </fileHeader>\r
+    <measData>\r
+        <managedElement localDn="Dublin" swVersion="r0.1"/>\r
+        <measInfo measInfoId="some measInfoId">\r
+            <job jobId="jobId"/>\r
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>\r
+            <repPeriod duration="PT900S"/>\r
+            <measTypes></measTypes>\r
+            <measType p="1">a</measType>\r
+            <measType p="3">b</measType>\r
+            <measValue measObjLdn="some measObjLdn">\r
+                <r p="1">1</r>\r
+                <r p="3">2</r>\r
+                <suspect>false</suspect>\r
+            </measValue>\r
+        </measInfo>\r
+        <measInfo measInfoId="some measInfoId2">\r
+            <job jobId="jobId"/>\r
+            <granPeriod duration="PT900S" endTime="2018-10-02T12:15:00Z"/>\r
+            <repPeriod duration="PT900S"/>\r
+            <measTypes></measTypes>\r
+            <measType p="1">a</measType>\r
+            <measType p="3">b</measType>\r
+            <measValue measObjLdn="some measObjLdn">\r
+                <r p="1">1</r>\r
+                <r p="3">2</r>\r
+                <suspect>false</suspect>\r
+            </measValue>\r
+        </measInfo>\r
+    </measData>\r
+    <fileFooter>\r
+        <measCollec endTime="2018-10-02T12:15:00+01:00"/>\r
+    </fileFooter>\r
+</measCollecFile>
\ No newline at end of file
index 0b76547..269fdf1 100644 (file)
@@ -9,8 +9,8 @@
         <managedElement swVersion="r0.1" localDn="Dublin"/>
         <measInfo measInfoId="some measInfoId">
             <job jobId="jobId"/>
-            <granPeriod endTime="2018-10-02T12:15:00Z" duration="some duration"/>
-            <repPeriod duration="some duration"/>
+            <granPeriod endTime="2018-10-02T12:15:00Z" duration="PT900S"/>
+            <repPeriod duration="PT900S"/>
             <measTypes>a b c</measTypes>
             <measValue measObjLdn="objLdn">
                 <measResults>76 27 98</measResults>
index 5f4e3c9..8ff79df 100644 (file)
@@ -9,8 +9,8 @@
         <managedElement swVersion="r0.1" localDn="Dublin"/>
         <measInfo measInfoId="some measInfoId">
             <job jobId="some Job Id"/>
-            <granPeriod endTime="2018-10-02T12:15:00Z" duration="some duration"/>
-            <repPeriod duration="some duration"/>
+            <granPeriod endTime="2018-10-02T12:15:00Z" duration="PT900S"/>
+            <repPeriod duration="PT900S"/>
             <measType p="1">a</measType>
             <measType p="2">b</measType>
             <measType p="3">c</measType>
index c4423ff..6cd76bd 100644 (file)
@@ -1,5 +1,5 @@
 {\r
-    "pm-mapper-filter": "{ \"filters\":[]}",\r
+    "pm-mapper-filter": {"filters":[]},\r
     "streams_subscribes": {\r
         "dmaap_subscriber": {\r
             "type": "data_router",\r