/*
 * Copyright 2016-present Open Networking Laboratory
 *
 * 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.yangutils.datamodel;

import java.util.LinkedList;
import java.util.List;

/*-
 *  Reference RFC 6020.
 *
 *  The pattern Statement
 *
 *  The "pattern" statement, which is an optional sub-statement to the
 *  "type" statement, takes as an argument a regular expression string.
 *  It is used to restrict the built-in type "string", or types derived
 *  from "string", to values that match the pattern.
 *
 *  If the type has multiple "pattern" statements, the expressions are
 *  ANDed together, i.e., all such expressions have to match.
 *
 *  If a pattern restriction is applied to an already pattern-restricted
 *  type, values must match all patterns in the base type, in addition to
 *  the new patterns.
 *  The pattern's sub-statements
 *
 *   +---------------+---------+-------------+
 *   | substatement  | section | cardinality |
 *   +---------------+---------+-------------+
 *   | description   | 7.19.3  | 0..1        |
 *   | error-app-tag | 7.5.4.2 | 0..1        |
 *   | error-message | 7.5.4.1 | 0..1        |
 *   | reference     | 7.19.4  | 0..1        |
 *   +---------------+---------+-------------+
 */
/**
 * Represents pattern restriction information. The regular expression restriction on string
 * data type.
 */
public class YangPatternRestriction {

    /**
     * Pattern restriction defined for the current type.
     */
    private List<String> patternList;

    /**
     * Effective pattern restriction that needs inherited from base type.
     */
    private List<String> basePattern;

    /**
     * Creates a YANG pattern restriction object.
     */
    public YangPatternRestriction() {
        setPatternList(new LinkedList<String>());
    }

    /**
     * Returns the pattern restriction defined for the current type.
     *
     * @return pattern restriction defined for the current type.
     */
    public List<String> getPatternList() {
        return patternList;
    }

    /**
     * Sets the pattern restriction defined for the current type.
     *
     * @param pattern pattern restriction defined for the current type..
     */
    private void setPatternList(List<String> pattern) {
        patternList = pattern;
    }

    /**
     * Adds a new pattern to the list of pattern restriction.
     *
     * @param newPattern pattern restriction.
     */
    public void addPattern(String newPattern) {
        getPatternList().add(newPattern);
    }

    /**
     * Returns the pattern restriction defined in base type.
     *
     * @return pattern restriction defined in base type.
     */
    public List<String> getBasePattern() {
        return basePattern;
    }

    /**
     * Sets the pattern restriction defined in base type.
     *
     * @param basePattern pattern restriction defined in base type.
     */
    public void setBasePattern(List<String> basePattern) {
        this.basePattern = basePattern;
    }
}
