e85414cdc90b043bcaed69c00d4d467cbe378602
[cps.git] / cps-ri / src / main / java / org / onap / cps / spi / query / CpsPathQuery.java
1 /*
2  * ============LICENSE_START=======================================================
3  *  Copyright (C) 2021 Nordix Foundation
4  *  Modifications Copyright (C) 2021 Bell Canada. All rights reserved.
5  *  ================================================================================
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *        http://www.apache.org/licenses/LICENSE-2.0
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  *
17  *  SPDX-License-Identifier: Apache-2.0
18  *  ============LICENSE_END=========================================================
19  */
20
21 package org.onap.cps.spi.query;
22
23 import java.util.regex.Matcher;
24 import java.util.regex.Pattern;
25 import lombok.AccessLevel;
26 import lombok.Getter;
27 import lombok.Setter;
28 import org.onap.cps.spi.exceptions.CpsPathException;
29
30 @Getter
31 @Setter(AccessLevel.PRIVATE)
32 public class CpsPathQuery {
33
34     private CpsPathQueryType cpsPathQueryType;
35     private String xpathPrefix;
36     private String leafName;
37     private Object leafValue;
38     private String endsWith;
39
40     public static final Pattern QUERY_CPS_PATH_WITH_SINGLE_LEAF_PATTERN =
41         Pattern.compile("((?:\\/[^\\/]+)+?)\\[\\s*@(\\S+?)\\s*=\\s*(.*?)\\s*\\]");
42
43     public static final Pattern QUERY_CPS_PATH_ENDS_WITH_PATTERN = Pattern.compile("\\/\\/(.+)");
44
45     public static final Pattern LEAF_INTEGER_VALUE_PATTERN = Pattern.compile("[-+]?\\d+");
46
47     public static final Pattern LEAF_STRING_VALUE_PATTERN = Pattern.compile("['\"](.*)['\"]");
48
49     /**
50      * Returns a cps path query.
51      *
52      * @param cpsPath cps path
53      * @return a CpsPath object.
54      */
55     public static CpsPathQuery createFrom(final String cpsPath) {
56         Matcher matcher = QUERY_CPS_PATH_WITH_SINGLE_LEAF_PATTERN.matcher(cpsPath);
57         final CpsPathQuery cpsPathQuery = new CpsPathQuery();
58         if (matcher.matches()) {
59             cpsPathQuery.setCpsPathQueryType(CpsPathQueryType.XPATH_LEAF_VALUE);
60             cpsPathQuery.setXpathPrefix(matcher.group(1));
61             cpsPathQuery.setLeafName(matcher.group(2));
62             cpsPathQuery.setLeafValue(convertLeafValueToCorrectType(matcher.group(3)));
63             return cpsPathQuery;
64         }
65         matcher = QUERY_CPS_PATH_ENDS_WITH_PATTERN.matcher(cpsPath);
66         if (matcher.matches()) {
67             cpsPathQuery.setCpsPathQueryType(CpsPathQueryType.XPATH_ENDS_WITH);
68             cpsPathQuery.setEndsWith(matcher.group(1));
69             return cpsPathQuery;
70         }
71         throw new CpsPathException("Invalid cps path.",
72             String.format("Cannot interpret or parse cps path %s.", cpsPath));
73     }
74
75     private static Object convertLeafValueToCorrectType(final String leafValueString) {
76         final Matcher stringValueWithQuotesMatcher = LEAF_STRING_VALUE_PATTERN.matcher(leafValueString);
77         if (stringValueWithQuotesMatcher.matches()) {
78             return stringValueWithQuotesMatcher.group(1);
79         }
80         final Matcher integerValueMatcher = LEAF_INTEGER_VALUE_PATTERN.matcher(leafValueString);
81         if (integerValueMatcher.matches()) {
82             return Integer.valueOf(leafValueString);
83         }
84         throw new CpsPathException("Unsupported leaf value.",
85             String.format("Unsupported leaf value %s in cps path.", leafValueString));
86     }
87 }