/*
 * Copyright 2016-present Open Networking 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.
 */
package org.onosproject.drivers.microsemi.yang;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern;

import org.onosproject.netconf.DatastoreId;
import org.onosproject.netconf.NetconfDeviceInfo;
import org.onosproject.netconf.NetconfDeviceOutputEventListener;
import org.onosproject.netconf.NetconfException;
import org.onosproject.netconf.NetconfSessionAdapter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MockNetconfSessionEa1000 extends NetconfSessionAdapter {
    private static final Logger log = LoggerFactory
            .getLogger(MockNetconfSessionEa1000.class);

    private static final String MESSAGE_ID_STRING = "message-id";
    private static final String EQUAL = "=";
    private static final String RPC_OPEN = "<rpc ";
    private static final String RPC_CLOSE = "</rpc>";
    private static final String GET_OPEN = "<get>";
    private static final String GET_CLOSE = "</get>";
    private static final String NEW_LINE = "\n";
    private static final String SUBTREE_FILTER_OPEN = "<filter type=\"subtree\">";
    private static final String SUBTREE_FILTER_CLOSE = "</filter>";
    private static final String WITH_DEFAULT_OPEN = "<with-defaults ";
    private static final String WITH_DEFAULT_CLOSE = "</with-defaults>";
    private static final String EDIT_CONFIG_OPEN = "<edit-config>";
    private static final String EDIT_CONFIG_CLOSE = "</edit-config>";
    private static final String TARGET_OPEN = "<target>";
    private static final String TARGET_CLOSE = "</target>";
    private static final String DEFAULT_OPERATION_OPEN = "<default-operation>";
    private static final String DEFAULT_OPERATION_CLOSE = "</default-operation>";
    private static final String CONFIG_OPEN = "<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">";
    private static final String CONFIG_CLOSE = "</config>";

    private static final String ENDPATTERN = "]]>]]>";
    private static final String XML_HEADER =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
    private static final String NETCONF_BASE_NAMESPACE =
            "xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\"";
    private static final String NETCONF_WITH_DEFAULTS_NAMESPACE =
            "xmlns=\"urn:ietf:params:xml:ns:yang:ietf-netconf-with-defaults\"";


    private Pattern sampleXmlRegex1 =
            Pattern.compile("(<\\?xml).*(<rpc).*(<get>).*(<filter).*"
                    + "(<system).*(<clock/>).*(</system>).*(</filter>)*.(</get>).*(</rpc).*(]]>){2}",
                    Pattern.DOTALL);

    private Pattern sampleXmlRegex2 =
            Pattern.compile("(<\\?xml).*(<rpc).*(<get>).*(<filter).*(<system-state).*(</system-state>).*"
                    + "(<system).*(</system>).*(</filter>).*(</get>).*(</rpc).*(]]>){2}",
                    Pattern.DOTALL);

    private Pattern sampleXmlRegexSaFiltering =
            Pattern.compile("(<\\?xml).*"
                    + "(<rpc).*(<get>)\\R?"
                    + "(<filter type=\"subtree\">)\\R?"
                    + "(<source-ipaddress-filtering).*(</source-ipaddress-filtering>)\\R?"
                    + "(</filter>)\\R?(</get>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexSaFilteringErrorScenario =
            Pattern.compile("(<\\?xml).*"
                    + "(<rpc).*(<get>)\\R?"
                    + "(<filter type=\"subtree\">)\\R?"
                    + "(<source-ipaddress-filtering).*"
                    + "(<interface-eth0>)\\R?"
                    + "(<source-address-range>)\\R?"
                    + "(<range-id>)10(</range-id>)\\R?"
                    + "(</source-address-range>)\\R?"
                    + "(</interface-eth0>)\\R?"
                    + "(</source-ipaddress-filtering>)\\R?"
                    + "(</filter>)\\R?(</get>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexEditConfigSaFilt =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
                    + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
                    + "(<source-ipaddress-filtering).*(<interface-eth0>).*"
                    + "(<source-address-range>).*(<range-id>).*(</range-id>).*"
                    + "(<name>).*(</name>).*(<ipv4-address-prefix>).*(</ipv4-address-prefix>).*"
                    + "(</source-address-range>).*(</interface-eth0>)*(</source-ipaddress-filtering>).*"
                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexEditDeleteSaFilt =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
                    + "(<target><running/></target>)\\R?"
                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                    + "(<source-ipaddress-filtering "
                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering\">)\\R?"
                    + "(<interface-eth0>)\\R?"
                    + "((<source-address-range nc:operation=\"delete\">)\\R?"
                    + "(<range-id>)[0-9]*(</range-id>)\\R?"
                    + "((<name>)[a-zA-Z0-9]*(</name>))?\\R?"
                    + "((<ipv4-address-prefix>)[0-9\\\\./]*(</ipv4-address-prefix>))?\\R?"
                    + "(</source-address-range>))++\\R?"
                    + "(</interface-eth0>)\\R?"
                    + "(</source-ipaddress-filtering>)\\R?"
                    + "(</config>)\\R?"
                    + "(</edit-config>)\\R?(</rpc>).*(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexUniEvc =
            Pattern.compile("(<\\?xml).*(<rpc).*(<get-config>)\\R?"
                    + "(<source>)\\R?(<running/>)\\R?(</source>)\\R?"
                    + "(<filter type=\"subtree\">)\\R?"
                    + "(<mef-services "
                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\"/>)\\R?"
                    + "(</filter>)\\R?(</get-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexUniEvcUni =
            Pattern.compile("(<\\?xml).*(<rpc).*(<get-config>)\\R?"
                    + "(<source>)\\R?(<running/>)\\R?(</source>)\\R?"
                    + "(<filter type=\"subtree\">)\\R?"
                    + "(<mef-services "
                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">)\\R?"
                    + "(<uni/>)\\R?"
                    + "(</mef-services>)\\R?"
                    + "(</filter>)\\R?(</get-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexEditConfigUni1Evc =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
                    + "(<target><running/></target>)\\R?"
                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                    + "(<mef-services).*(<uni>)\\R?(<name>).*(</name>)\\R?"
                    + "(<evc>)\\R?(<evc-index>).*(</evc-index>)\\R?(<name>).*(</name>)\\R?"
                    + "(<evc-per-uni>)\\R?"
                    + "(<evc-per-uni-c>)\\R?"
                    + "(<ce-vlan-map>)[0-9]*(</ce-vlan-map>)\\R?"
                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
                    + "(<tag-push>)\\R?(<push-tag-type>)pushStag(</push-tag-type>)\\R?"
                    + "(<outer-tag-vlan>)[0-9]*(</outer-tag-vlan>)\\R?(</tag-push>)\\R?"
                    + "((<flow-mapping>)\\R?"
                    + "(<ce-vlan-id>)[0-9]*(</ce-vlan-id>)\\R?"
                    + "(<flow-id>)[0-9]*(</flow-id>)\\R?"
                    + "(</flow-mapping>)\\R?)*"
                    + "(</evc-per-uni-c>)\\R?"
                    + "(<evc-per-uni-n>)\\R?"
                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
                    + "(<tag-pop).*"
                    + "((<flow-mapping>)\\R?"
                    + "(<ce-vlan-id>)[0-9]*(</ce-vlan-id>)\\R?"
                    + "(<flow-id>)[0-9]*(</flow-id>)\\R?"
                    + "(</flow-mapping>)\\R?)*"
                    + "(</evc-per-uni-n>)\\R?"
                    + "(</evc-per-uni>)\\R?"
                    + "(</evc>)\\R?"
                    + "(</uni>)\\R?"
                    + "(</mef-services>)\\R?"
                    + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexEditConfigUni2Evc =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
                    + "(<target><running/></target>)\\R?"
                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                    + "(<mef-services).*(<uni>)\\R?(<name>)[0-9a-zA-Z\\-\\:]*(</name>)\\R?"
                    + "(<evc>)\\R?(<evc-index>)[0-9]*(</evc-index>)\\R?(<name>)[0-9a-zA-Z\\-\\:]*(</name>)\\R?"
                    + "(<evc-per-uni>)\\R?"
                    + "(<evc-per-uni-c>)\\R?"
                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
                    + "(</evc-per-uni-c>)\\R?"
                    + "(<evc-per-uni-n>)\\R?"
                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
                    + "(<evc-per-uni-service-type>).*(</evc-per-uni-service-type>)\\R?"
                    + "(<tag-push>)\\R?(<push-tag-type>)pushStag(</push-tag-type>)\\R?(<outer-tag-vlan>).*"
                    + "(</outer-tag-vlan>)\\R?(</tag-push>)\\R?"
                    + "(</evc-per-uni-n>)\\R?"
                    + "(</evc-per-uni>)\\R?"
                    + "(</evc>)\\R?"
                    + "(<evc>)\\R?(<evc-index>)[0-9]*(</evc-index>)\\R?(<name>)[0-9a-zA-Z\\-\\:]*(</name>)\\R?"
                    + "(<evc-per-uni>)\\R?"
                    + "(<evc-per-uni-c>)\\R?"
                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
                    + "(</evc-per-uni-c>)\\R?"
                    + "(<evc-per-uni-n>)\\R?"
                    + "(<ce-vlan-map>)[0-9\\:\\,]*(</ce-vlan-map>)\\R?"
                    + "(<ingress-bwp-group-index>)[0-9]*(</ingress-bwp-group-index>)\\R?"
                    + "(</evc-per-uni-n>)\\R?"
                    + "(</evc-per-uni>)\\R?"
                    + "(</evc>)\\R?(</uni>).*"
                    + "(</mef-services>)\\R?"
                    + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexEditConfigUniProfiles =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
                    + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
                    + "(<mef-services).*(<profiles>).*"
                    + "(<bwp-group>).*(<group-index>).*(</group-index>).*(</bwp-group>).*"
                    + "(<bwp-group>).*(<group-index>).*(</group-index>).*"
                    + "(<bwp>).*(<cos-index>).*(</cos-index>).*(<color-mode>).*(</color-mode>).*(</bwp>).*"
                    + "(<bwp>).*(<cos-index>).*(</cos-index>).*(<color-mode>).*(</color-mode>).*(</bwp>).*"
                    + "(</bwp-group>).*"
                    + "(</profiles>).*(</mef-services>).*"
                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexEditConfigEvcDelete =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
                    + "(<target><running/></target>).*(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
                    + "(<mef-services).*"
                    + "(<uni>).*"
                    + "(<evc nc:operation=\"delete\">).*(<evc-index>).*(</evc-index>).*(</evc>).*"
                    + "(</uni>).*"
                    + "(</mef-services>).*"
                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexGetConfigCeVlanMapsEvc =
            Pattern.compile("(<\\?xml).*(<rpc).*(<get-config>)\\R?"
                    + "(<source>)\\R?(<running/>)\\R?(</source>)\\R?"
                    + "(<filter type=\"subtree\">)\\R?"
                    + "(<mef-services).*"
                    + "(<uni>)\\R?"
                    + "(<evc>)\\R?"
                    + "(<evc-index/>)\\R?"
                    + "(<evc-per-uni>)\\R?"
                    + "(<evc-per-uni-c><ce-vlan-map/><flow-mapping/><ingress-bwp-group-index/></evc-per-uni-c>)\\R?"
                    + "(<evc-per-uni-n><ce-vlan-map/><flow-mapping/><ingress-bwp-group-index/></evc-per-uni-n>)\\R?"
                    + "(</evc-per-uni>)\\R?"
                    + "(</evc>)\\R?"
                    + "(</uni>)\\R?"
                    + "(</mef-services>)\\R?"
                    + "(</filter>)\\R?"
                    + "(</get-config>)\\R?"
                    + "(</rpc>)\\R?"
                    + "(]]>){2}", Pattern.DOTALL);

    //For test testRemoveEvcUniFlowEntries()
    private Pattern sampleXmlRegexEditConfigCeVlanMapReplace =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>).*"
                    + "(<target><running/></target>).*"
                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">).*"
                    + "(<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">).*"
                    + "(<uni>).*"
                    + "(<evc nc:operation=\"delete\">).*(<evc-index>.*</evc-index>).*(</evc>).*"
                    + "(<evc nc:operation=\"delete\">).*(<evc-index>.*</evc-index>).*(</evc>).*"
                    + "(<evc>).*(<evc-index>).*(</evc-index>).*(<evc-per-uni>).*"
                    + "(<evc-per-uni-c>).*"
                    + "(<ce-vlan-map nc:operation=\"replace\">).*(</ce-vlan-map>).*"
                    + "(<flow-mapping nc:operation=\"delete\">).*(<ce-vlan-id>).*(</ce-vlan-id>).*(</flow-mapping>).*"
                    + "(</evc-per-uni-c>).*"
                    + "(<evc-per-uni-n>).*"
                    + "(<ce-vlan-map nc:operation=\"replace\">).*(</ce-vlan-map>).*"
                    + "(<flow-mapping nc:operation=\"delete\">).*(<ce-vlan-id>).*(</ce-vlan-id>).*(</flow-mapping>).*"
                    + "(</evc-per-uni-n>).*"
                    + "(</evc-per-uni>).*(</evc>).*"
                    + "(<evc>).*(<evc-index>).*(</evc-index>).*(<evc-per-uni>).*"
                    + "(<evc-per-uni-c>).*"
                    + "(<ce-vlan-map nc:operation=\"replace\">).*(</ce-vlan-map>).*"
                    + "(<flow-mapping nc:operation=\"delete\">).*(<ce-vlan-id>).*(</ce-vlan-id>).*(</flow-mapping>).*"
                    + "(</evc-per-uni-c>).*"
                    + "(<evc-per-uni-n>).*"
                    + "(<ce-vlan-map nc:operation=\"replace\">).*(</ce-vlan-map>).*"
                    + "(<flow-mapping nc:operation=\"delete\">).*(<ce-vlan-id>).*(</ce-vlan-id>).*(</flow-mapping>).*"
                    + "(</evc-per-uni-n>).*"
                    + "(</evc-per-uni>).*(</evc>).*"
                    + "(</uni>).*(</mef-services>).*"
                    + "(</config>).*(</edit-config>).*(</rpc>).*(]]>){2}", Pattern.DOTALL);


    //For testPerformMeterOperationDeviceIdMeterAdd()
    private Pattern sampleXmlRegexEditConfigBwpGroup1 =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
                    + "(<target>\\R?<running/>\\R?</target>)\\R?"
                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                    + "(<mef-services "
                    + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">)\\R?"
                    + "(<profiles>)\\R?"
                    + "(<bwp-group>)\\R?"
                    + "(<group-index>)[0-9]*(</group-index>)\\R?"
                    + "(<bwp>)\\R?"
                    + "(<cos-index>)[0-9]*(</cos-index>)\\R?"
                    + "(<name>).*(</name>)\\R?"
                    + "(<committed-information-rate>)[0-9]*(</committed-information-rate>)\\R?"
                    + "(<committed-burst-size>)[0-9]*(</committed-burst-size>)\\R?"
                    + "(<excess-information-rate>)[0-9]*(</excess-information-rate>)\\R?"
                    + "(<excess-burst-size>)[0-9]*(</excess-burst-size>)\\R?"
                    + "(</bwp>)\\R?"
                    + "(</bwp-group>)\\R?"
                    + "(<cos>)\\R?"
                    + "(<cos-index>)[0-9](</cos-index>)\\R?"
                    + "(<name>).*(</name>)\\R?"
                    + "(<outgoing-cos-value>)[0-9]*(</outgoing-cos-value>)\\R?"
                    + "(<color-aware>true</color-aware>)\\R?"
                    + "(<color-forward>true</color-forward>)\\R?"
                    + "(<evc-cos-type-all-8-prio-to-1-evc-color>)\\R?"
                    + "(<evc-all-8-color-to>green</evc-all-8-color-to>)\\R?"
                    + "(</evc-cos-type-all-8-prio-to-1-evc-color>)\\R?"
                    + "(</cos>)\\R?"
                    + "(</profiles>)\\R?"
                    + "(</mef-services>)\\R?"
                    + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    //For testPerformMeterOperationDeviceIdMeterRemove()
    private Pattern sampleXmlRegexEditConfigBwpGroup1Delete =
    Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
            + "(<target>\\R?<running/>\\R?</target>)\\R?"
            + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
            + "(<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">)\\R?"
            + "(<profiles>)\\R?"
            + "((<bwp-group nc:operation=\"delete\">)\\R?"
            + "(<group-index>)[0-9]*(</group-index>)\\R?"
            + "(<bwp>.*</bwp>)?"
            + "(</bwp-group>))++\\R?"
            + "(</profiles>)\\R?"
            + "(</mef-services>)\\R?"
            + "(</config>)\\R?(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexSetCurrentDatetime =
    Pattern.compile("(<\\?xml).*(<rpc).*"
            + "(<set-current-datetime xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">)\\R?"
            + "(<current-datetime>)"
            + "[0-9]{4}-[0-9]{2}-[0-9]{2}(T)[0-9]{2}:[0-9]{2}:[0-9]{2}[+-][0-9]{2}:[0-9]{2}"
            + "(</current-datetime>)\\R?"
            + "(</set-current-datetime>)\\R?"
            + "(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);

    //For testGetConfigMseaCfmEssentials
    private Pattern sampleXmlRegexGetMseaCfmEssentials =
            Pattern.compile("(<\\?xml).*(<rpc).*(<get>)\\R?"
                    + "(<filter type=\"subtree\">)\\R?"
                    + "(<mef-cfm).*"
                    + "(<maintenance-domain>)\\R?"
                    + "(<id/>)\\R?"
                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
                    + "(<md-level/>)?\\R?"
                    + "(<maintenance-association>)\\R?"
                    + "(<id/>)\\R?"
                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
                    + "(<ccm-interval>)[0-9]{1,3}(ms</ccm-interval>)\\R?"
                    + "(<remote-meps/>)\\R?"
                    + "(<component-list/>)\\R?"
                    + "(<maintenance-association-end-point>)\\R?"
                    + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
                    + "(<mac-address/>)?\\R?"
                    + "((<remote-mep-database>)\\R?"
                    + "(<remote-mep>)\\R?"
                    + "(<remote-mep-id/>)\\R?"
                    + "(</remote-mep>)\\R?"
                    + "(</remote-mep-database>))?\\R?"
                    + "((<msea-soam-pm:delay-measurements>)\\R?"
                    + "(<msea-soam-pm:delay-measurement>)\\R?"
                    + "((<msea-soam-pm:dm-id/>)|(<msea-soam-pm:dm-id>[0-9]*</msea-soam-pm:dm-id>))\\R?"
                    + "(</msea-soam-pm:delay-measurement>)\\R?"
                    + "(</msea-soam-pm:delay-measurements>))?\\R?"
                    + "((<msea-soam-pm:loss-measurements>)\\R?"
                    + "(<msea-soam-pm:loss-measurement>)\\R?"
                    + "((<msea-soam-pm:lm-id/>)|(<msea-soam-pm:lm-id>[0-9]*</msea-soam-pm:lm-id>))\\R?"
                    + "(</msea-soam-pm:loss-measurement>)\\R?"
                    + "(</msea-soam-pm:loss-measurements>))?\\R?"
                    + "(</maintenance-association-end-point>)\\R?"
                    + "(</maintenance-association>)\\R?"
                    + "(</maintenance-domain>)\\R?"
                    + "(</mef-cfm>)\\R?"
                    + "(</filter>)\\R?"
                    + "(</get>)\\R?"
                    + "(</rpc>)\\R?"
                    + "(]]>){2}", Pattern.DOTALL);

    //For testGetConfigMseaCfmEssentials
    private Pattern sampleXmlRegexGetMseaCfmFull =
            Pattern.compile("(<\\?xml).*(<rpc).*(<get>)\\R?"
                    + "(<filter type=\"subtree\">)\\R?"
                    + "(<mef-cfm).*"
                    + "(<maintenance-domain>)\\R?"
                    + "(<id/>)\\R?"
                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
                    + "(<md-level/>)?\\R?"
                    + "(<maintenance-association>)\\R?"
                    + "(<id/>)\\R?"
                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
                    + "(<maintenance-association-end-point>)\\R?"
                    + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
                    + "(<interface/>)?\\R?"
                    + "(<primary-vid/>)?\\R?"
                    + "(<administrative-state/>)?\\R?"
                    + "(<mac-address/>)?\\R?"
                    + "(<ccm-ltm-priority/>)?\\R?"
                    + "(<continuity-check/>)?\\R?"
                    + "(<loopback/>)?\\R?"
                    + "(<linktrace/>)?\\R?"
                    + "(<remote-mep-database/>)\\R?"
                    + "(<msea-soam-fm:operational-state/>)\\R?"
                    + "(<msea-soam-fm:connectivity-status/>)\\R?"
                    + "(<msea-soam-fm:port-status/>)\\R?"
                    + "(<msea-soam-fm:interface-status/>)\\R?"
                    + "(<msea-soam-fm:last-defect-sent/>)\\R?"
                    + "(<msea-soam-fm:rdi-transmit-status/>)\\R?"
                    + "(</maintenance-association-end-point>)\\R?"
                    + "(</maintenance-association>)\\R?"
                    + "(</maintenance-domain>)\\R?"
                    + "(</mef-cfm>)\\R?"
                    + "(</filter>)\\R?"
                    + "(</get>)\\R?"
                    + "(</rpc>)\\R?"
                    + "(]]>){2}", Pattern.DOTALL);

    //For testGetConfigMseaCfmEssentials
    private Pattern sampleXmlRegexGetMseaDelay =
            Pattern.compile("(<\\?xml).*(<rpc).*(<get>)\\R?"
                    + "(<filter type=\"subtree\">)\\R?"
                    + "(<mef-cfm).*"
                    + "(<maintenance-domain>)\\R?"
                    + "(<id/>)\\R?"
                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
                    + "(<maintenance-association>)\\R?"
                    + "(<id/>)\\R?"
                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
                    + "(<maintenance-association-end-point>)\\R?"
                    + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
                    + "((<msea-soam-pm:delay-measurements>)\\R?"
                    + "(<msea-soam-pm:delay-measurement>)\\R?"
                    + "((<msea-soam-pm:dm-id/>)|(<msea-soam-pm:dm-id>[0-9]*</msea-soam-pm:dm-id>))\\R?"
                    + "(<msea-soam-pm:mep-id/>)\\R?"
                    + "(<msea-soam-pm:mac-address/>)\\R?"
                    + "(<msea-soam-pm:administrative-state/>)\\R?"
                    + "(<msea-soam-pm:measurement-enable/>)\\R?"
                    + "(<msea-soam-pm:message-period/>)\\R?"
                    + "(<msea-soam-pm:priority/>)\\R?"
                    + "(<msea-soam-pm:frame-size/>)\\R?"
                    + "(<msea-soam-pm:measurement-interval/>)\\R?"
                    + "(<msea-soam-pm:number-intervals-stored/>)\\R?"
                    + "(<msea-soam-pm:session-status/>)\\R?"
                    + "(<msea-soam-pm:frame-delay-two-way/>)\\R?"
                    + "(<msea-soam-pm:inter-frame-delay-variation-two-way/>)\\R?"
                    + "(<msea-soam-pm:current-stats/>)?\\R?"
                    + "(<msea-soam-pm:history-stats/>)?\\R?"
                    + "(</msea-soam-pm:delay-measurement>)\\R?"
                    + "(</msea-soam-pm:delay-measurements>))?\\R?"
                    + "(</maintenance-association-end-point>)\\R?"
                    + "(</maintenance-association>)\\R?"
                    + "(</maintenance-domain>)\\R?"
                    + "(</mef-cfm>)\\R?"
                    + "(</filter>)\\R?"
                    + "(</get>)\\R?"
                    + "(</rpc>)\\R?"
                    + "(]]>){2}", Pattern.DOTALL);

    //For testGetConfigMseaCfmEssentials
    private Pattern sampleXmlRegexDeleteMseaCfmMep =
            Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
                    + "(<target>\\R?<running/>\\R?</target>)\\R?"
                    + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
                    + "(<mef-cfm).*"
                    + "(<maintenance-domain>)\\R?"
                    + "(<id/>)?\\R?"
                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
                    + "(<maintenance-association>)\\R?"
                    + "(<id/>)?\\R?"
                    + "(<name>)([a-zA-Z0-9\\-:\\.]){1,48}(</name>)\\R?"
                    + "(<maintenance-association-end-point nc:operation=\"delete\">)\\R?"
                    + "(<mep-identifier>)[0-9]{1,4}(</mep-identifier>)\\R?"
                    + "(</maintenance-association-end-point>)\\R?"
                    + "(</maintenance-association>)\\R?"
                    + "(</maintenance-domain>)\\R?"
                    + "(</mef-cfm>)\\R?"
                    + "(</config>)\\R?"
                    + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);


    private Pattern sampleXmlRegexTransmitLoopback =
            Pattern.compile("(<\\?xml).*(<rpc).*\\R?"
                    + "(<transmit-loopback xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\">)\\R?"
                    + "((<number-of-messages>)[0-9]*(</number-of-messages>))?\\R?"
                    + "((<data-tlv>)[a-zA-Z0-9+=/]*(</data-tlv>))?\\R?"
                    + "((<vlan-priority>)[0-9]{1}(</vlan-priority>))?\\R?"
                    + "((<vlan-drop-eligible>)((true)|(false))(</vlan-drop-eligible>))?\\R?"
                    + "(<maintenance-association-end-point>)[0-9]{1,4}(</maintenance-association-end-point>)\\R?"
                    + "(<maintenance-association>)[0-9]{1,5}(</maintenance-association>)\\R?"
                    + "(<maintenance-domain>)[0-9]{1,5}(</maintenance-domain>)\\R?"
                    + "(<target-address>)\\R?"
                    + "((<mep-id>)[0-9]{1,4}(</mep-id>))?\\R?"
                    + "((<mac-address>)[a-fA-F0-9:-]{17}(</mac-address>))?\\R?"
                    + "(</target-address>)\\R?"
                    + "(</transmit-loopback>)\\R?"
                    + "(</rpc>)\\R?"
                    + "(]]>){2}", Pattern.DOTALL);

    private Pattern sampleXmlRegexAbortLoopback =
            Pattern.compile("(<\\?xml).*(<rpc).*\\R?"
                    + "(<abort-loopback xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\">)\\R?"
                    + "(<maintenance-association-end-point>)[0-9]{1,4}(</maintenance-association-end-point>)\\R?"
                    + "(<maintenance-association>)[0-9]{1,5}(</maintenance-association>)\\R?"
                    + "(<maintenance-domain>)[0-9]{1,5}(</maintenance-domain>)\\R?"
                    + "(</abort-loopback>)\\R?"
                    + "(</rpc>)\\R?"
                    + "(]]>){2}", Pattern.DOTALL);

    //For testCreateDm()
    private Pattern sampleXmlRegexEditConfigDmCreate =
        Pattern.compile("(<\\?xml).*(<rpc).*(<edit-config>)\\R?"
            + "(<target>\\R?<running/>\\R?</target>)\\R?"
            + "(<config xmlns:nc=\"urn:ietf:params:xml:ns:netconf:base:1.0\">)\\R?"
            + "(<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\">)\\R?"
            + "(<maintenance-domain>)\\R?"
            + "(<id>)[0-9]*(</id>)\\R?"
            + "(<maintenance-association>)\\R?"
            + "(<id>)[0-9]*(</id>)\\R?"
            + "(<maintenance-association-end-point>)\\R?"
            + "(<mep-identifier>)[0-9]*(</mep-identifier>)\\R?"
            + "(<delay-measurements xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">)\\R?"
            + "(<delay-measurement>)\\R?"
            + "(<dm-id>)[0-9]*(</dm-id>)\\R?"
            + "((<administrative-state>)(true|false)(</administrative-state>))?\\R?"
            + "((<message-period>)(1000ms|100ms|10ms|3ms)(</message-period>))?\\R?"
            + "(<priority>)[0-9]*(</priority>)\\R?"
            + "((<frame-size>)[0-9]*(</frame-size>))?\\R?"
            + "(<mep-id>)[0-9]*(</mep-id>)\\R?"
            + "(</delay-measurement>)\\R?"
            + "(</delay-measurements>)\\R?"
            + "(</maintenance-association-end-point>)\\R?"
            + "(</maintenance-association>)\\R?"
            + "(</maintenance-domain>)\\R?"
            + "(</mef-cfm>)\\R?"
            + "(</config>)\\R?"
            + "(</edit-config>)\\R?(</rpc>)\\R?(]]>){2}", Pattern.DOTALL);


    private static final String SAMPLE_SYSTEM_REPLY = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
            + "<system xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">\n"
            + "<clock><timezone-name>Etc/UTC</timezone-name></clock>\n"
            + "</system>\n"
            + "</data>\n"
            + "</rpc-reply>";

    private static final String SAMPLE_SYSTEM_REPLY_INIT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">"
            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
            + "<system xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\">\n"
            + "<longitude xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">-8.4683990</longitude>\n"
            + "<latitude xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">51.9036140</latitude>\n"
            + "</system>\n"
            + "<system-state xmlns=\"urn:ietf:params:xml:ns:yang:ietf-system\""
            + " xmlns:sysms=\"http://www.microsemi.com/microsemi-edge-assure/msea-system\">\n"
            + "<platform>\n"
            + "<os-release>4.4.0-53-generic</os-release>\n"
            + "<sysms:device-identification>\n"
            + "<sysms:serial-number>Eagle Simulator.</sysms:serial-number>\n"
            + "</sysms:device-identification>\n"
            + "</platform>\n"
            + "</system-state>\n"
            + "</data>"
            + "</rpc-reply>";

    private static final String SAMPLE_MSEASAFILTERING_FE_REPLY = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
            + "<source-ipaddress-filtering "
            + "xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-sa-filtering\">\n"
            + "<interface-eth0>\n"
            + "<filter-admin-state>inactive</filter-admin-state>\n"
            + "<source-address-range>\n"
            + "<range-id>1</range-id>\n"
            + "<ipv4-address-prefix>10.10.10.10/16</ipv4-address-prefix>\n"
            + "<name>Filter1</name>\n"
            + "</source-address-range>\n"
            + "<source-address-range>\n"
            + "<range-id>2</range-id>\n"
            + "<ipv4-address-prefix>20.30.40.50/18</ipv4-address-prefix>\n"
            + "<name>Flow:5e0000abaa2772</name>\n"
            + "</source-address-range>\n"
            + "</interface-eth0>\n"
            + "</source-ipaddress-filtering>\n"
            + "</data>\n"
            + "</rpc-reply>";

    private static final String SAMPLE_ERROR_REPLY = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
            + "<rpc-error>"
            + "<error-type>application</error-type>"
            + "<error-tag>data-missing</error-tag>"
            + "<error-severity>error</error-severity>"
            + "<error-message>Request could not be completed because " +
                "the relevant data model content does not exist.</error-message>"
            + "</rpc-error>"
            + "</rpc-reply>";

    private static final String SAMPLE_MSEAEVCUNI_REPLY_INIT = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
            + "<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\"/>"
            + "</data>\n"
            + "</rpc-reply>";

    private static final String SAMPLE_MSEAEVCUNI_FE_REPLY = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
            + "<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">\n"
            + "<uni>\n"
            + "<name>Flow:7557655abfecd57865</name>\n"
            + "<evc>\n"
            + "<evc-index>7</evc-index\n>"
            + "<name>evc-7</name>\n"
            + "<evc-per-uni>\n"
            + "<evc-per-uni-c>\n"
            + "<ce-vlan-map>10</ce-vlan-map>\n"
            + "<ingress-bwp-group-index>1</ingress-bwp-group-index>\n"
            + "<tag-push>\n"
            + "<push-tag-type>pushStag</push-tag-type>\n"
            + "<outer-tag-vlan>3</outer-tag-vlan>\n"
            + "</tag-push>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>10</ce-vlan-id>\n"
            + "<flow-id>27021600672053710</flow-id>\n"
            + "</flow-mapping>\n"
            + "<evc-per-uni-service-type>epl</evc-per-uni-service-type>\n"
            + "</evc-per-uni-c>\n"
            + "<evc-per-uni-n>\n"
            + "<ce-vlan-map>11</ce-vlan-map>\n"
            + "<ingress-bwp-group-index>0</ingress-bwp-group-index>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>11</ce-vlan-id>\n"
            + "<flow-id>27021600672053711</flow-id>\n"
            + "</flow-mapping>\n"
            + "</evc-per-uni-n>\n"
            + "</evc-per-uni>\n"
            + "<uni-evc-id>EA1000-Uni-from-ONOS_5</uni-evc-id>\n"
            + "<evc-status>\n"
            + "<operational-state>unknown</operational-state>\n"
            + "<max-mtu-size>9600</max-mtu-size>\n"
            + "<max-num-uni>2</max-num-uni>\n"
            + "</evc-status>\n"
            + "</evc>\n"
            + "<evc>\n"
            + "<evc-index>8</evc-index>\n"
            + "<name>evc-8</name>\n"
            + "<evc-per-uni>\n"
            + "<evc-per-uni-c>\n"
            + "<ce-vlan-map>12:14,20:22,25</ce-vlan-map>\n"
            + "<ingress-bwp-group-index>0</ingress-bwp-group-index>\n"
            + "<tag-pop />\n"
            + "<evc-per-uni-service-type>epl</evc-per-uni-service-type>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>12</ce-vlan-id>\n"
            + "<flow-id>27021600672053712</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>13</ce-vlan-id>\n"
            + "<flow-id>27021600672053713</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>14</ce-vlan-id>\n"
            + "<flow-id>27021600672053714</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>20</ce-vlan-id>\n"
            + "<flow-id>27021600672053720</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>21</ce-vlan-id>\n"
            + "<flow-id>27021600672053721</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>22</ce-vlan-id>\n"
            + "<flow-id>27021600672053722</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>25</ce-vlan-id>\n"
            + "<flow-id>27021600672053725</flow-id>\n"
            + "</flow-mapping>\n"
            + "</evc-per-uni-c>\n"
            + "<evc-per-uni-n>\n"
            + "<ce-vlan-map>13</ce-vlan-map>\n"
            + "<ingress-bwp-group-index>0</ingress-bwp-group-index>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>13</ce-vlan-id>\n"
            + "<flow-id>27021600672053713</flow-id>\n"
            + "</flow-mapping>\n"
            + "</evc-per-uni-n>\n"
            + "</evc-per-uni>\n"
            + "<uni-evc-id>EA1000-Uni-from-ONOS_5</uni-evc-id>\n"
            + "<evc-status>\n"
            + "<operational-state>unknown</operational-state>\n"
            + "<max-mtu-size>9600</max-mtu-size>\n"
            + "<max-num-uni>2</max-num-uni>\n"
            + "</evc-status>\n"
            + "</evc>\n"
            + "</uni>\n"
            + "<profiles>\n"
            + "<bwp-group>\n"
            + "<group-index>0</group-index>\n"
            + "</bwp-group>\n"
            + "</profiles>\n"
            + "</mef-services>\n"
            + "</data>\n"
            + "</rpc-reply>";

    private static final String SAMPLE_MSEAEVCUNI_CEVLANMAP_EVC_REPLY = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"1\">\n"
            + "<data xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n"
            + "<mef-services xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-uni-evc-service\">\n"
            + "<uni>\n"

            + "<evc><evc-index>1</evc-index>\n"
            + "<evc-per-uni>\n"
            + "<evc-per-uni-c>\n"
            + "<ce-vlan-map>101</ce-vlan-map>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>101</ce-vlan-id>\n"
            + "<flow-id>27021598629213101</flow-id>\n"
            + "</flow-mapping>\n"
            + "</evc-per-uni-c>\n"
            + "<evc-per-uni-n>\n"
            + "<ce-vlan-map>102</ce-vlan-map>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>102</ce-vlan-id>\n"
            + "<flow-id>27021598629213102</flow-id>\n"
            + "</flow-mapping>\n"
            + "</evc-per-uni-n>\n"
            + "</evc-per-uni>\n"
            + "</evc>\n"

            + "<evc><evc-index>7</evc-index>\n"
            + "<evc-per-uni>\n"
            + "<evc-per-uni-c>\n"
            + "<ce-vlan-map>700,710,720</ce-vlan-map>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>700</ce-vlan-id>\n"
            + "<flow-id>27021598629213700</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>710</ce-vlan-id>\n"
            + "<flow-id>27021598629213710</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>720</ce-vlan-id>\n"
            + "<flow-id>27021598629213720</flow-id>\n"
            + "</flow-mapping>\n"
            + "</evc-per-uni-c>\n"
            + "<evc-per-uni-n>\n"
            + "<ce-vlan-map>701:703</ce-vlan-map>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>701</ce-vlan-id>\n"
            + "<flow-id>27021598629213701</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>702</ce-vlan-id>\n"
            + "<flow-id>27021598629213702</flow-id>\n"
            + "</flow-mapping>\n"
            + "<flow-mapping>\n"
            + "<ce-vlan-id>703</ce-vlan-id>\n"
            + "<flow-id>27021598629213703</flow-id>\n"
            + "</flow-mapping>\n"
            + "</evc-per-uni-n>\n"
            + "</evc-per-uni>\n"
            + "</evc>\n"

            + "<evc><evc-index>8</evc-index>\n"
            + "<evc-per-uni>\n"
            + "<evc-per-uni-c>\n<ce-vlan-map>800,810,820</ce-vlan-map>\n</evc-per-uni-c>\n"
            + "<evc-per-uni-n>\n<ce-vlan-map>801:803</ce-vlan-map>\n</evc-per-uni-n>\n"
            + "</evc-per-uni>\n"
            + "</evc>\n"

            + "</uni>\n"
            + "</mef-services>\n"
            + "</data>\n"
            + "</rpc-reply>";

    private static final String SAMPLE_MSEACFM_MD_MA_MEP_ESSENTIALS_REPLY =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"47\">"
            + "<data>"
            + "<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" "
            + "xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" "
            + "xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">"
            + "<maintenance-domain>"
            + "<id>1</id>"
            + "<name>md-1</name>"
            + "<maintenance-association>"
            + "<id>1</id>"
            + "<name>ma-1-1</name>"
            + "<maintenance-association-end-point>"
            + "<mep-identifier>1</mep-identifier>"
            + "<mac-address>00:b0:ae:03:ff:31</mac-address>"
            + "<remote-mep-database>"
            + "<remote-mep>"
            + "<remote-mep-id>1</remote-mep-id>"
            + "</remote-mep>"
            + "<remote-mep>"
            + "<remote-mep-id>2</remote-mep-id>"
            + "</remote-mep>"
            + "</remote-mep-database>"
            + "<msea-soam-pm:delay-measurements>"
            + "<msea-soam-pm:delay-measurement>"
            + "<msea-soam-pm:dm-id>1</msea-soam-pm:dm-id>"
            + "</msea-soam-pm:delay-measurement>"
            + "</msea-soam-pm:delay-measurements>"
            + "<msea-soam-pm:loss-measurements>"
            + "<msea-soam-pm:loss-measurement>"
            + "<msea-soam-pm:lm-id>1</msea-soam-pm:lm-id>"
            + "</msea-soam-pm:loss-measurement>"
            + "<msea-soam-pm:loss-measurement>"
            + "<msea-soam-pm:lm-id>2</msea-soam-pm:lm-id>"
            + "</msea-soam-pm:loss-measurement>"
            + "</msea-soam-pm:loss-measurements>"
            + "</maintenance-association-end-point>"
            + "</maintenance-association>"
            + "</maintenance-domain>"
            + "</mef-cfm>"
            + "</data>"
            + "</rpc-reply>";

    private static final String SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"47\">"
            + "<data>"
            + "<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" "
            + "xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" "
            + "xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">"
            + "<maintenance-domain>"
            + "<id>1</id>"
            + "<name>md-1</name>"
            + "<maintenance-association>"
            + "<id>1</id>"
            + "<name>ma-1-1</name>"
            + "<ccm-interval>3.3ms</ccm-interval>"
            + "<maintenance-association-end-point>"
            + "<mep-identifier>1</mep-identifier>"
            + "<interface>eth0</interface>"
            + "<primary-vid>20</primary-vid>"
            + "<administrative-state>true</administrative-state>"
            + "<mac-address>00:b0:ae:03:ff:31</mac-address>"
            + "<ccm-ltm-priority>5</ccm-ltm-priority>"
            + "<continuity-check>"
            + "<cci-enabled>true</cci-enabled>"
            + "<fng-state>defect-reported</fng-state>"
            + "<highest-priority-defect-found>remote-invalid-ccm</highest-priority-defect-found>"
            + "<active-defects>remote-rdi remote-invalid-ccm</active-defects>"
            + "<ccm-sequence-error-count>0</ccm-sequence-error-count>"
            + "<sent-ccms>197</sent-ccms>"
            + "</continuity-check>"
            + "<loopback>"
            + "</loopback>"
            + "<linktrace>"
            + "</linktrace>"
            + "<remote-mep-database>"
                + "<remote-mep>"
                    + "<remote-mep-id>1</remote-mep-id>"
                    + "<remote-mep-state>failed</remote-mep-state>"
                    + "<failed-ok-time>54654654</failed-ok-time>"
                    + "<mac-address>aa:bb:cc:dd:ee:ff</mac-address>"
                    + "<rdi>false</rdi>"
                    + "<port-status-tlv>no-status-tlv</port-status-tlv>"
                    + "<interface-status-tlv>dormant</interface-status-tlv>"
                + "</remote-mep>"
                + "<remote-mep>"
                    + "<remote-mep-id>2</remote-mep-id>"
                    + "<remote-mep-state>failed</remote-mep-state>"
                    + "<failed-ok-time>54654654</failed-ok-time>"
                    + "<mac-address>aa:bb:cc:dd:ee:ff</mac-address>"
                    + "<rdi>false</rdi>"
                    + "<port-status-tlv>no-status-tlv</port-status-tlv>"
                    + "<interface-status-tlv>dormant</interface-status-tlv>"
                + "</remote-mep>"
            + "</remote-mep-database>"
            + "<msea-soam-fm:operational-state>enabled</msea-soam-fm:operational-state>"
            + "<msea-soam-fm:connectivity-status>partially-active</msea-soam-fm:connectivity-status>"
            + "<msea-soam-fm:port-status>up</msea-soam-fm:port-status>"
            + "<msea-soam-fm:interface-status>up</msea-soam-fm:interface-status>"
            + "<msea-soam-fm:last-defect-sent>remote-rdi remote-mac-error</msea-soam-fm:last-defect-sent>"
            + "<msea-soam-fm:rdi-transmit-status>true</msea-soam-fm:rdi-transmit-status>"
            + "</maintenance-association-end-point>"
            + "</maintenance-association>"
            + "</maintenance-domain>"
            + "</mef-cfm>"
            + "</data>"
            + "</rpc-reply>";

    private static final String SAMPLE_MSEACFM_DELAY_MEASUREMENT_FULL_REPLY =
            "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"47\">"
            + "<data>"
            + "<mef-cfm xmlns=\"http://www.microsemi.com/microsemi-edge-assure/msea-cfm\" "
            + "xmlns:msea-soam-fm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-fm\" "
            + "xmlns:msea-soam-pm=\"http://www.microsemi.com/microsemi-edge-assure/msea-soam-pm\">"
            + "<maintenance-domain>"
            + "<id>1</id>"
            + "<name>md-1</name>"
            + "<maintenance-association>"
            + "<id>1</id>"
            + "<name>ma-1-1</name>"
            + "<maintenance-association-end-point>"
            + "<mep-identifier>1</mep-identifier>"
            + "<msea-soam-pm:delay-measurements>"
            + "<msea-soam-pm:delay-measurement>"
            + "<msea-soam-pm:dm-id>1</msea-soam-pm:dm-id>"
            + "<msea-soam-pm:mep-id>10</msea-soam-pm:mep-id>"
            + "<msea-soam-pm:administrative-state>true</msea-soam-pm:administrative-state>"
            + "<msea-soam-pm:measurement-enable>frame-delay-two-way-bins "
            + "frame-delay-two-way-max</msea-soam-pm:measurement-enable>"
            + "<msea-soam-pm:message-period>3ms</msea-soam-pm:message-period>"
            + "<msea-soam-pm:priority>6</msea-soam-pm:priority>"
            + "<msea-soam-pm:frame-size>1000</msea-soam-pm:frame-size>"
            + "<msea-soam-pm:measurement-interval>15</msea-soam-pm:measurement-interval>"
            + "<msea-soam-pm:number-intervals-stored>32</msea-soam-pm:number-intervals-stored>"
            + "<msea-soam-pm:session-status>active</msea-soam-pm:session-status>"
            + "<msea-soam-pm:frame-delay-two-way>100</msea-soam-pm:frame-delay-two-way>"
            + "<msea-soam-pm:inter-frame-delay-variation-two-way>101</msea-soam-pm:inter-frame-delay-variation-two-way>"
//            + "<msea-soam-pm:current-stats>"
//            + "</msea-soam-pm:current-stats>"
//            + "<msea-soam-pm:history-stats>"
//            + "</msea-soam-pm:history-stats>"
            + "</msea-soam-pm:delay-measurement>"
            + "</msea-soam-pm:delay-measurements>"
            + "</maintenance-association-end-point>"
            + "</maintenance-association>"
            + "</maintenance-domain>"
            + "</mef-cfm>"
            + "</data>"
            + "</rpc-reply>";

    private static final String SAMPLE_REPLY_OK = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
            + "<rpc-reply xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\" message-id=\"2\">"
            + "<ok/>"
            + "</rpc-reply>";

    private NetconfDeviceInfo deviceInfo;

    private final AtomicInteger messageIdInteger = new AtomicInteger(0);

    public MockNetconfSessionEa1000(NetconfDeviceInfo deviceInfo) throws NetconfException {
        this.deviceInfo = deviceInfo;
    }

    @Override
    public CompletableFuture<String> request(String request) throws NetconfException {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String get(String request) throws NetconfException {

        return sendRequest(request);
    }

    @Override
    public String get(String filterSchema, String withDefaultsMode) throws NetconfException {
        StringBuilder rpc = new StringBuilder(XML_HEADER);
        rpc.append(RPC_OPEN);
        rpc.append(MESSAGE_ID_STRING);
        rpc.append(EQUAL);
        rpc.append("\"");
        rpc.append(messageIdInteger.get());
        rpc.append("\"  ");
        rpc.append(NETCONF_BASE_NAMESPACE).append(">\n");
        rpc.append(GET_OPEN).append(NEW_LINE);
        if (filterSchema != null) {
            rpc.append(SUBTREE_FILTER_OPEN).append(NEW_LINE);
            rpc.append(filterSchema).append(NEW_LINE);
            rpc.append(SUBTREE_FILTER_CLOSE).append(NEW_LINE);
        }
        if (withDefaultsMode != null) {
            rpc.append(WITH_DEFAULT_OPEN).append(NETCONF_WITH_DEFAULTS_NAMESPACE).append(">");
            rpc.append(withDefaultsMode).append(WITH_DEFAULT_CLOSE).append(NEW_LINE);
        }
        rpc.append(GET_CLOSE).append(NEW_LINE);
        rpc.append(RPC_CLOSE).append(NEW_LINE);
        rpc.append(ENDPATTERN);
        String reply = sendRequest(rpc.toString());
        checkReply(reply);
        return reply;
    }

    @Override
    public String doWrappedRpc(String request) throws NetconfException {
        StringBuilder rpc = new StringBuilder(XML_HEADER);
        rpc.append(RPC_OPEN);
        rpc.append(MESSAGE_ID_STRING);
        rpc.append(EQUAL);
        rpc.append("\"");
        rpc.append(messageIdInteger.get());
        rpc.append("\"  ");
        rpc.append(NETCONF_BASE_NAMESPACE).append(">\n");
        rpc.append(request);
        rpc.append(RPC_CLOSE).append(NEW_LINE);
        rpc.append(ENDPATTERN);
        String reply = sendRequest(rpc.toString());
        checkReply(reply);
        return reply;
    }

    @Override
    public String requestSync(String request) throws NetconfException {
        if (!request.contains(ENDPATTERN)) {
            request = request + NEW_LINE + ENDPATTERN;
        }
        String reply = sendRequest(request);
        checkReply(reply);
        return reply;
    }

    @Override
    public String getConfig(DatastoreId targetConfiguration, String configurationSchema) throws NetconfException {
        StringBuilder rpc = new StringBuilder(XML_HEADER);
        rpc.append("<rpc ");
        rpc.append(MESSAGE_ID_STRING);
        rpc.append(EQUAL);
        rpc.append("\"");
        rpc.append(messageIdInteger.get());
        rpc.append("\"  ");
        rpc.append("xmlns=\"urn:ietf:params:xml:ns:netconf:base:1.0\">\n");
        rpc.append("<get-config>\n");
        rpc.append("<source>\n");
        rpc.append("<").append(targetConfiguration).append("/>");
        rpc.append("</source>");
        if (configurationSchema != null) {
            rpc.append("<filter type=\"subtree\">\n");
            rpc.append(configurationSchema).append("\n");
            rpc.append("</filter>\n");
        }
        rpc.append("</get-config>\n");
        rpc.append("</rpc>\n");
        rpc.append(ENDPATTERN);
        String reply = sendRequest(rpc.toString());
        return checkReply(reply) ? reply : "ERROR " + reply;
    }

    @Override
    public boolean editConfig(String newConfiguration) throws NetconfException {
        return editConfig(DatastoreId.RUNNING, null, newConfiguration);
    }

    @Override
    public boolean editConfig(DatastoreId targetConfiguration, String mode, String newConfiguration)
            throws NetconfException {
        newConfiguration = newConfiguration.trim();
        StringBuilder rpc = new StringBuilder(XML_HEADER);
        rpc.append(RPC_OPEN);
        rpc.append(MESSAGE_ID_STRING);
        rpc.append(EQUAL);
        rpc.append("\"");
        rpc.append(messageIdInteger.get());
        rpc.append("\"  ");
        rpc.append(NETCONF_BASE_NAMESPACE).append(">\n");
        rpc.append(EDIT_CONFIG_OPEN).append("\n");
        rpc.append(TARGET_OPEN);
        rpc.append("<").append(targetConfiguration).append("/>");
        rpc.append(TARGET_CLOSE).append("\n");
        if (mode != null) {
            rpc.append(DEFAULT_OPERATION_OPEN);
            rpc.append(mode);
            rpc.append(DEFAULT_OPERATION_CLOSE).append("\n");
        }
        rpc.append(CONFIG_OPEN).append("\n");
        rpc.append(newConfiguration);
        rpc.append(CONFIG_CLOSE).append("\n");
        rpc.append(EDIT_CONFIG_CLOSE).append("\n");
        rpc.append(RPC_CLOSE);
        rpc.append(ENDPATTERN);
        log.debug(rpc.toString());
        String reply = sendRequest(rpc.toString());
        return checkReply(reply);
    }

    @Override
    public boolean copyConfig(String targetConfiguration, String newConfiguration) throws NetconfException {
        return copyConfig(DatastoreId.datastore(targetConfiguration), newConfiguration);
    }

    @Override
    public void startSubscription() throws NetconfException {
        // TODO Auto-generated method stub

    }

    @Override
    public void startSubscription(String filterSchema) throws NetconfException {
        // TODO Auto-generated method stub

    }

    @Override
    public void endSubscription() throws NetconfException {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean lock() throws NetconfException {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean unlock() throws NetconfException {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean close() throws NetconfException {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public String getSessionId() {
        return "mockSessionId";
    }

    @Override
    public void addDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
        // TODO Auto-generated method stub

    }

    @Override
    public void removeDeviceOutputListener(NetconfDeviceOutputEventListener listener) {
        // TODO Auto-generated method stub

    }

    private boolean checkReply(String reply) throws NetconfException {
        if (reply != null) {
            if (!reply.contains("<rpc-error>")) {
                log.debug("Device {} sent reply {}", deviceInfo, reply);
                return true;
            } else if (reply.contains("<ok/>")
                    || (reply.contains("<rpc-error>")
                    && reply.contains("warning"))) {
                log.debug("Device {} sent reply {}", deviceInfo, reply);
                return true;
            }
        }
        log.warn("Device {} has error in reply {}", deviceInfo, reply);
        return false;
    }

    private String sendRequest(String request) throws NetconfException {
        log.info("Mocking NETCONF Session send request: \n" + request);

        if (sampleXmlRegex1.matcher(request).matches()) {
            return SAMPLE_SYSTEM_REPLY;

        } else if (sampleXmlRegex2.matcher(request).matches()) {
            return SAMPLE_SYSTEM_REPLY_INIT;

        } else if (sampleXmlRegexSaFilteringErrorScenario.matcher(request).matches()) {
            return SAMPLE_ERROR_REPLY;

        } else if (sampleXmlRegexSaFiltering.matcher(request).matches()) {
            return SAMPLE_MSEASAFILTERING_FE_REPLY;

        } else if (sampleXmlRegexEditConfigSaFilt.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexEditDeleteSaFilt.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexUniEvc.matcher(request).matches()) {
            return SAMPLE_MSEAEVCUNI_REPLY_INIT;

        } else if (sampleXmlRegexUniEvcUni.matcher(request).matches()) {
            return SAMPLE_MSEAEVCUNI_FE_REPLY;

        } else if (sampleXmlRegexEditConfigUni1Evc.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexEditConfigUni2Evc.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexEditConfigUniProfiles.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexEditConfigEvcDelete.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexGetConfigCeVlanMapsEvc.matcher(request).matches()) {
            return SAMPLE_MSEAEVCUNI_CEVLANMAP_EVC_REPLY;

        } else if (sampleXmlRegexEditConfigCeVlanMapReplace.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexEditConfigBwpGroup1.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexEditConfigBwpGroup1Delete.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexSetCurrentDatetime.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexGetMseaCfmEssentials.matcher(request).matches()) {
            return SAMPLE_MSEACFM_MD_MA_MEP_ESSENTIALS_REPLY;

        } else if (sampleXmlRegexGetMseaCfmFull.matcher(request).matches()) {
            return SAMPLE_MSEACFM_MD_MA_MEP_FULL_REPLY;

        } else if (sampleXmlRegexDeleteMseaCfmMep.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexGetMseaDelay.matcher(request).matches()) {
            return SAMPLE_MSEACFM_DELAY_MEASUREMENT_FULL_REPLY;

        } else if (sampleXmlRegexEditConfigDmCreate.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexTransmitLoopback.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else if (sampleXmlRegexAbortLoopback.matcher(request).matches()) {
            return SAMPLE_REPLY_OK;

        } else {
            throw new NetconfException("MocknetconfSession. No sendRequest() case for query: " +
                    request);
        }
    }
}
