2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
8 package org.opendaylight.yangtools.yang.data.codec.gson.helpers;
11 import com.google.common.annotations.Beta;
13 import java.util.ArrayList;
14 import java.util.List;
15 import java.util.regex.Matcher;
16 import java.util.regex.Pattern;
18 import javax.xml.stream.events.StartElement;
20 import org.opendaylight.yangtools.yang.data.codec.gson.helpers.IdentityValuesDTO.IdentityValue;
21 import org.opendaylight.yangtools.yang.data.codec.gson.helpers.IdentityValuesDTO.Predicate;
22 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
25 * This class is implementation-internal and subject to change. Please do not use it.
28 public final class RestUtil {
30 // FIXME: BUG-1275: this is code duplicates data.impl.codec
32 public static final String SQUOTE = "'";
33 public static final String DQUOTE = "\"";
34 private static final Pattern PREDICATE_PATTERN = Pattern.compile("\\[(.*?)\\]");
36 public final static TypeDefinition<?> resolveBaseTypeFrom(final TypeDefinition<?> type) {
37 TypeDefinition<?> superType = type;
38 while (superType.getBaseType() != null) {
39 superType = superType.getBaseType();
44 public static IdentityValuesDTO asInstanceIdentifier(final String value, final PrefixesMaping prefixMap) {
45 String valueTrimmed = value.trim();
46 if (!valueTrimmed.startsWith("/")) {
49 String[] xPathParts = valueTrimmed.split("/");
50 if (xPathParts.length < 2) { // must be at least "/pr:node"
53 IdentityValuesDTO identityValuesDTO = new IdentityValuesDTO(value);
54 for (int i = 1; i < xPathParts.length; i++) {
55 String xPathPartTrimmed = xPathParts[i].trim();
57 String xPathPartStr = getIdAndPrefixAsStr(xPathPartTrimmed);
58 IdentityValue identityValue = toIdentity(xPathPartStr, prefixMap);
59 if (identityValue == null) {
63 List<Predicate> predicates = toPredicates(xPathPartTrimmed, prefixMap);
64 if (predicates == null) {
67 identityValue.setPredicates(predicates);
69 identityValuesDTO.add(identityValue);
71 return identityValuesDTO.getValuesWithNamespaces().isEmpty() ? null : identityValuesDTO;
74 private static String getIdAndPrefixAsStr(final String pathPart) {
75 int predicateStartIndex = pathPart.indexOf("[");
76 return predicateStartIndex == -1 ? pathPart : pathPart.substring(0, predicateStartIndex);
79 private static IdentityValue toIdentity(final String xPathPart, final PrefixesMaping prefixMap) {
80 String xPathPartTrimmed = xPathPart.trim();
81 if (xPathPartTrimmed.isEmpty()) {
84 String[] prefixAndIdentifier = xPathPartTrimmed.split(":");
85 // it is not "prefix:value"
86 if (prefixAndIdentifier.length != 2) {
89 String prefix = prefixAndIdentifier[0].trim();
90 String identifier = prefixAndIdentifier[1].trim();
91 if (prefix.isEmpty() || identifier.isEmpty()) {
94 String namespace = prefixMap.getNamespace(prefix);
95 return new IdentityValue(namespace, identifier, namespace.equals(prefix) ? null : prefix);
98 private static List<Predicate> toPredicates(final String predicatesStr, final PrefixesMaping prefixMap) {
99 List<Predicate> result = new ArrayList<>();
100 List<String> predicates = new ArrayList<>();
101 Matcher matcher = PREDICATE_PATTERN.matcher(predicatesStr);
102 while (matcher.find()) {
103 predicates.add(matcher.group(1).trim());
105 for (String predicate : predicates) {
106 int indexOfEqualityMark = predicate.indexOf("=");
107 if (indexOfEqualityMark != -1) {
108 String predicateValue = toPredicateValue(predicate.substring(indexOfEqualityMark + 1));
109 if (predicate.startsWith(".")) { // it is leaf-list
110 if (predicateValue == null) {
113 result.add(new Predicate(null, predicateValue));
115 IdentityValue identityValue = toIdentity(predicate.substring(0, indexOfEqualityMark), prefixMap);
116 if (identityValue == null || predicateValue == null) {
119 result.add(new Predicate(identityValue, predicateValue));
126 private static String toPredicateValue(final String predicatedValue) {
127 String predicatedValueTrimmed = predicatedValue.trim();
128 if ((predicatedValueTrimmed.startsWith(DQUOTE) || predicatedValueTrimmed.startsWith(SQUOTE))
129 && (predicatedValueTrimmed.endsWith(DQUOTE) || predicatedValueTrimmed.endsWith(SQUOTE))) {
130 return predicatedValueTrimmed.substring(1, predicatedValueTrimmed.length() - 1);
135 public interface PrefixesMaping {
136 public String getNamespace(String prefix);
139 public static class PrefixMapingFromXml implements PrefixesMaping {
140 StartElement startElement = null;
142 public PrefixMapingFromXml(final StartElement startElement) {
143 this.startElement = startElement;
147 public String getNamespace(final String prefix) {
148 return startElement.getNamespaceContext().getNamespaceURI(prefix);
152 public static class PrefixMapingFromJson implements PrefixesMaping {
155 public String getNamespace(final String prefix) {