/* * Copyright 2015-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.ovsdb.rfc.schema.type; import java.util.Set; import org.onosproject.ovsdb.rfc.exception.AbnormalJsonNodeException; import org.onosproject.ovsdb.rfc.schema.type.UuidBaseType.RefType; import org.onosproject.ovsdb.rfc.utils.ObjectMapperUtil; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.collect.Sets; /** * BaseType Factory class. */ public final class BaseTypeFactory { /** * Constructs a BaseTypeFactory object. This class should not be * instantiated. */ private BaseTypeFactory() { } /** * Create a BaseType from the JsonNode. * @param baseTypeJson the BaseType JsonNode * @param keyorval the key node or value node * @return BaseType */ public static BaseType getBaseTypeFromJson(JsonNode baseTypeJson, String keyorval) { if (baseTypeJson.isValueNode()) { String type = baseTypeJson.asText().trim(); return fromTypeStr(type); } else { if (!baseTypeJson.has(keyorval)) { String message = "Abnormal BaseType JsonNode, it should contain 'key' or 'value' node but was not found" + ObjectMapperUtil.convertToString(baseTypeJson); throw new AbnormalJsonNodeException(message); } return fromJsonNode(baseTypeJson.get(keyorval)); } } /** * Get BaseType by the type value of JsonNode. * @param type the type value of JsonNode * @return BaseType */ private static BaseType fromTypeStr(String type) { switch (type) { case "boolean": return new BooleanBaseType(); case "integer": return new IntegerBaseType(); case "real": return new RealBaseType(); case "string": return new StringBaseType(); case "uuid": return new UuidBaseType(); default: return null; } } /** * json like "string" or json like {"type" : "string", "enum": ["set", * ["access", "native-tagged"]]}" for key or value. * @param type JsonNode */ private static BaseType fromJsonNode(JsonNode type) { if (type.isTextual()) { return fromTypeStr(type.asText()); } else if (type.isObject() && type.has("type")) { String typeStr = type.get("type").asText(); switch (typeStr) { case "boolean": return new BooleanBaseType(); case "integer": return getIntegerBaseType(type); case "real": return getRealBaseType(type); case "string": return getStringBaseType(type); case "uuid": return getUuidBaseType(type); default: return null; } } return null; } /** * Get IntegerBaseType by the type value of JsonNode which contains the * constraints. * @param type the type value of JsonNode * @return IntegerBaseType */ private static IntegerBaseType getIntegerBaseType(JsonNode type) { int min = Integer.MIN_VALUE; int max = Integer.MAX_VALUE; Set<Integer> enums = Sets.newHashSet(); JsonNode node = type.get("minInteger"); if (node != null) { min = node.asInt(); } node = type.get("maxInteger"); if (node != null) { max = node.asInt(); } if (type.has("enum")) { JsonNode anEnum = type.get("enum").get(1); for (JsonNode n : anEnum) { enums.add(n.asInt()); } } return new IntegerBaseType(min, max, enums); } /** * Get RealBaseType by the type value of JsonNode which contains the * constraints. * @param type the type value of JsonNode * @return RealBaseType */ private static RealBaseType getRealBaseType(JsonNode type) { double min = Double.MIN_VALUE; double max = Double.MAX_VALUE; Set<Double> enums = Sets.newHashSet(); JsonNode node = type.get("minReal"); if (node != null) { min = node.asDouble(); } node = type.get("maxReal"); if (node != null) { max = node.asDouble(); } if (type.has("enum")) { JsonNode anEnum = type.get("enum").get(1); for (JsonNode n : anEnum) { enums.add(n.asDouble()); } } return new RealBaseType(min, max, enums); } /** * Get StringBaseType by the type value of JsonNode which contains the * constraints. * @param type the type value of JsonNode * @return StringBaseType */ private static StringBaseType getStringBaseType(JsonNode type) { int minLength = Integer.MIN_VALUE; int maxLength = Integer.MAX_VALUE; Set<String> enums = Sets.newHashSet(); JsonNode node = type.get("minLength"); if (node != null) { minLength = node.asInt(); } node = type.get("maxLength"); if (node != null) { maxLength = node.asInt(); } if (type.has("enum")) { JsonNode enumVal = type.get("enum"); if (enumVal.isArray()) { JsonNode anEnum = enumVal.get(1); for (JsonNode n : anEnum) { enums.add(n.asText()); } } else if (enumVal.isTextual()) { enums.add(enumVal.asText()); } } return new StringBaseType(minLength, maxLength, enums); } /** * Get UuidBaseType by the type value of JsonNode which contains the * constraints. * @param type the type value of JsonNode * @return UuidBaseType */ private static UuidBaseType getUuidBaseType(JsonNode type) { String refTable = null; String refType = RefType.STRONG.refType(); JsonNode node = type.get("refTable"); if (node != null) { refTable = node.asText(); } node = type.get("refType"); if (node != null) { refType = node.asText(); } return new UuidBaseType(refTable, refType); } }