X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=binding%2Fmdsal-binding-spec-util%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fmdsal%2Fbinding%2Fspec%2Fnaming%2FBindingMapping.java;h=c5d775471e7309faa0874235b8f82a484528d1f2;hb=6e6ebc43866204667658f8bbf7cfb6233caffdc7;hp=de0037a3a8ca1b972f19676fb491ecd2f3a27cc8;hpb=dcacf7468c8d742f4207b7bc5175413e2ab9eb45;p=mdsal.git diff --git a/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/naming/BindingMapping.java b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/naming/BindingMapping.java index de0037a3a8..c5d775471e 100644 --- a/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/naming/BindingMapping.java +++ b/binding/mdsal-binding-spec-util/src/main/java/org/opendaylight/mdsal/binding/spec/naming/BindingMapping.java @@ -20,9 +20,9 @@ import com.google.common.collect.Interners; import java.util.Collection; import java.util.Locale; import java.util.Optional; -import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.binding.Augmentable; import org.opendaylight.yangtools.yang.binding.DataContainer; import org.opendaylight.yangtools.yang.binding.Identifiable; @@ -33,9 +33,9 @@ import org.opendaylight.yangtools.yang.common.Revision; @Beta public final class BindingMapping { - public static final String VERSION = "0.6"; + public static final @NonNull String VERSION = "0.6"; - public static final Set JAVA_RESERVED_WORDS = ImmutableSet.of( + public static final ImmutableSet JAVA_RESERVED_WORDS = ImmutableSet.of( // https://docs.oracle.com/javase/specs/jls/se9/html/jls-3.html#jls-3.9 "abstract", "assert", "boolean", "break", "byte", "case", "catch", "char", "class", "const", "continue", "default", "do", "double", "else", "enum", "extends", "final", "finally", "float", "for", "goto", "if", @@ -47,12 +47,12 @@ public final class BindingMapping { // https://docs.oracle.com/javase/specs/jls/se9/html/jls-3.html#jls-3.10.7 "null"); - public static final String DATA_ROOT_SUFFIX = "Data"; - public static final String RPC_SERVICE_SUFFIX = "Service"; - public static final String NOTIFICATION_LISTENER_SUFFIX = "Listener"; - public static final String QNAME_STATIC_FIELD_NAME = "QNAME"; - public static final String PACKAGE_PREFIX = "org.opendaylight.yang.gen.v1"; - public static final String AUGMENTATION_FIELD = "augmentation"; + public static final @NonNull String DATA_ROOT_SUFFIX = "Data"; + public static final @NonNull String RPC_SERVICE_SUFFIX = "Service"; + public static final @NonNull String NOTIFICATION_LISTENER_SUFFIX = "Listener"; + public static final @NonNull String QNAME_STATIC_FIELD_NAME = "QNAME"; + public static final @NonNull String PACKAGE_PREFIX = "org.opendaylight.yang.gen.v1"; + public static final @NonNull String AUGMENTATION_FIELD = "augmentation"; private static final Splitter CAMEL_SPLITTER = Splitter.on(CharMatcher.anyOf(" _.-/").precomputed()) .omitEmptyStrings().trimResults(); @@ -60,48 +60,42 @@ public final class BindingMapping { private static final String QUOTED_DOT = Matcher.quoteReplacement("."); private static final Splitter DOT_SPLITTER = Splitter.on('.'); - public static final String MODULE_INFO_CLASS_NAME = "$YangModuleInfoImpl"; - public static final String MODULE_INFO_QNAMEOF_METHOD_NAME = "qnameOf"; - public static final String MODEL_BINDING_PROVIDER_CLASS_NAME = "$YangModelBindingProvider"; + public static final @NonNull String MODULE_INFO_CLASS_NAME = "$YangModuleInfoImpl"; + public static final @NonNull String MODULE_INFO_QNAMEOF_METHOD_NAME = "qnameOf"; + public static final @NonNull String MODEL_BINDING_PROVIDER_CLASS_NAME = "$YangModelBindingProvider"; /** * Name of {@link Augmentable#augmentation(Class)}. */ - public static final String AUGMENTABLE_AUGMENTATION_NAME = "augmentation"; + public static final @NonNull String AUGMENTABLE_AUGMENTATION_NAME = "augmentation"; /** * Name of {@link Identifiable#key()}. */ - public static final String IDENTIFIABLE_KEY_NAME = "key"; - - /** - * Name of {@link DataContainer#getImplementedInterface()}. - */ - // FIXME: 4.0.0: remove this constant - public static final String DATA_CONTAINER_GET_IMPLEMENTED_INTERFACE_NAME = "getImplementedInterface"; + public static final @NonNull String IDENTIFIABLE_KEY_NAME = "key"; /** * Name of {@link DataContainer#implementedInterface()}. */ - public static final String DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME = "implementedInterface"; + public static final @NonNull String DATA_CONTAINER_IMPLEMENTED_INTERFACE_NAME = "implementedInterface"; /** * Prefix for getter methods working on top of boolean. */ - public static final String BOOLEAN_GETTER_PREFIX = "is"; + public static final @NonNull String BOOLEAN_GETTER_PREFIX = "is"; /** * Prefix for normal getter methods. */ - public static final String GETTER_PREFIX = "get"; + public static final @NonNull String GETTER_PREFIX = "get"; /** * Prefix for non-null default wrapper methods. These methods always wrap a corresponding normal getter. */ - public static final String NONNULL_PREFIX = "nonnull"; + public static final @NonNull String NONNULL_PREFIX = "nonnull"; - public static final String RPC_INPUT_SUFFIX = "Input"; - public static final String RPC_OUTPUT_SUFFIX = "Output"; + public static final @NonNull String RPC_INPUT_SUFFIX = "Input"; + public static final @NonNull String RPC_OUTPUT_SUFFIX = "Output"; private static final Interner PACKAGE_INTERNER = Interners.newWeakInterner(); @@ -109,18 +103,12 @@ public final class BindingMapping { throw new UnsupportedOperationException("Utility class should not be instantiated"); } - public static String getRootPackageName(final QName module) { + public static @NonNull String getRootPackageName(final QName module) { return getRootPackageName(module.getModule()); } - public static String getRootPackageName(final QNameModule module) { - checkArgument(module != null, "Module must not be null"); - checkArgument(module.getRevision() != null, "Revision must not be null"); - checkArgument(module.getNamespace() != null, "Namespace must not be null"); - final StringBuilder packageNameBuilder = new StringBuilder(); - - packageNameBuilder.append(BindingMapping.PACKAGE_PREFIX); - packageNameBuilder.append('.'); + public static @NonNull String getRootPackageName(final QNameModule module) { + final StringBuilder packageNameBuilder = new StringBuilder().append(BindingMapping.PACKAGE_PREFIX).append('.'); String namespace = module.getNamespace().toString(); namespace = COLON_SLASH_SLASH.matcher(namespace).replaceAll(QUOTED_DOT); @@ -167,11 +155,7 @@ public final class BindingMapping { return normalizePackageName(packageNameBuilder.toString()); } - public static String normalizePackageName(final String packageName) { - if (packageName == null) { - return null; - } - + public static @NonNull String normalizePackageName(final String packageName) { final StringBuilder builder = new StringBuilder(); boolean first = true; @@ -192,35 +176,31 @@ public final class BindingMapping { return PACKAGE_INTERNER.intern(builder.toString()); } - public static String getClassName(final String localName) { - checkArgument(localName != null, "Name should not be null."); + public static @NonNull String getClassName(final String localName) { return toFirstUpper(toCamelCase(localName)); } - public static String getClassName(final QName name) { - checkArgument(name != null, "Name should not be null."); + public static @NonNull String getClassName(final QName name) { return toFirstUpper(toCamelCase(name.getLocalName())); } - public static String getMethodName(final String yangIdentifier) { - checkArgument(yangIdentifier != null,"Identifier should not be null"); + public static @NonNull String getMethodName(final String yangIdentifier) { return toFirstLower(toCamelCase(yangIdentifier)); } - public static String getMethodName(final QName name) { - checkArgument(name != null, "Name should not be null."); + public static @NonNull String getMethodName(final QName name) { return getMethodName(name.getLocalName()); } - public static String getGetterPrefix(final boolean isBoolean) { + public static @NonNull String getGetterPrefix(final boolean isBoolean) { return isBoolean ? BOOLEAN_GETTER_PREFIX : GETTER_PREFIX; } - public static String getGetterMethodName(final String localName, final boolean isBoolean) { + public static @NonNull String getGetterMethodName(final String localName, final boolean isBoolean) { return getGetterPrefix(isBoolean) + toFirstUpper(getPropertyName(localName)); } - public static String getGetterMethodName(final QName name, final boolean isBoolean) { + public static @NonNull String getGetterMethodName(final QName name, final boolean isBoolean) { return getGetterPrefix(isBoolean) + getGetterSuffix(name); } @@ -228,12 +208,12 @@ public final class BindingMapping { return methodName.startsWith(GETTER_PREFIX) || methodName.startsWith(BOOLEAN_GETTER_PREFIX); } - public static String getGetterMethodForNonnull(final String methodName) { + public static @NonNull String getGetterMethodForNonnull(final String methodName) { checkArgument(isNonnullMethodName(methodName)); return GETTER_PREFIX + methodName.substring(NONNULL_PREFIX.length()); } - public static String getNonnullMethodName(final String localName) { + public static @NonNull String getNonnullMethodName(final String localName) { return NONNULL_PREFIX + toFirstUpper(getPropertyName(localName)); } @@ -241,13 +221,12 @@ public final class BindingMapping { return methodName.startsWith(NONNULL_PREFIX); } - public static String getGetterSuffix(final QName name) { - checkArgument(name != null, "Name should not be null."); + public static @NonNull String getGetterSuffix(final QName name) { final String candidate = toFirstUpper(toCamelCase(name.getLocalName())); return "Class".equals(candidate) ? "XmlClass" : candidate; } - public static String getPropertyName(final String yangIdentifier) { + public static @NonNull String getPropertyName(final String yangIdentifier) { final String potential = toFirstLower(toCamelCase(yangIdentifier)); if ("class".equals(potential)) { return "xmlClass"; @@ -255,18 +234,16 @@ public final class BindingMapping { return potential; } - private static String toCamelCase(final String rawString) { - checkArgument(rawString != null, "String should not be null"); - Iterable components = CAMEL_SPLITTER.split(rawString); + private static @NonNull String toCamelCase(final String rawString) { StringBuilder builder = new StringBuilder(); - for (String comp : components) { + for (String comp : CAMEL_SPLITTER.split(rawString)) { builder.append(toFirstUpper(comp)); } return checkNumericPrefix(builder.toString()); } - private static String checkNumericPrefix(final String rawString) { - if (rawString == null || rawString.isEmpty()) { + private static @NonNull String checkNumericPrefix(final String rawString) { + if (rawString.isEmpty()) { return rawString; } final char firstChar = rawString.charAt(0); @@ -274,15 +251,13 @@ public final class BindingMapping { } /** - * Returns the {@link String} {@code s} with an {@link Character#isUpperCase(char) upper case} first character. This - * function is null-safe. + * Returns the {@link String} {@code s} with an {@link Character#isUpperCase(char) upper case} first character. * - * @param str the string that should get an upper case first character. May be null. - * @return the {@link String} {@code str} with an upper case first character or null if the input - * {@link String} {@code str} was null. + * @param str the string that should get an upper case first character. + * @return the {@link String} {@code str} with an upper case first character. */ - public static String toFirstUpper(final String str) { - if (str == null || str.length() == 0) { + private static @NonNull String toFirstUpper(final @NonNull String str) { + if (str.isEmpty()) { return str; } if (Character.isUpperCase(str.charAt(0))) { @@ -300,10 +275,10 @@ public final class BindingMapping { * * @param str the string that should get an lower case first character. May be null. * @return the {@link String} {@code str} with an lower case first character or null if the input - * {@link String} {@code str} was null. + * {@link String} {@code str} was empty. */ - private static String toFirstLower(final String str) { - if (str == null || str.length() == 0) { + private static @NonNull String toFirstLower(final @NonNull String str) { + if (str.isEmpty()) { return str; } if (Character.isLowerCase(str.charAt(0))) { @@ -315,6 +290,18 @@ public final class BindingMapping { return str.substring(0, 1).toLowerCase(Locale.ENGLISH) + str.substring(1); } + /** + * Returns the {@link String} {@code s} with a '$' character as suffix. + * + * @param qname RPC QName + * @return The RPC method name as determined by considering the localname against the JLS. + * @throws NullPointerException if {@code qname} is null + */ + public static @NonNull String getRpcMethodName(final @NonNull QName qname) { + final String methodName = getMethodName(qname); + return JAVA_RESERVED_WORDS.contains(methodName) ? methodName + "$" : methodName; + } + /** * Returns Java identifiers, conforming to JLS9 Section 3.8 to use for specified YANG assigned names * (RFC7950 Section 9.6.4). This method considers two distinct encodings: one the pre-Fluorine mapping, which is