import com.google.common.collect.Interners;
import java.util.Collection;
import java.util.Locale;
-import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.checkerframework.checker.regex.qual.Regex;
import org.opendaylight.yangtools.yang.binding.Action;
import org.opendaylight.yangtools.yang.binding.Augmentable;
import org.opendaylight.yangtools.yang.binding.BindingContract;
-import org.opendaylight.yangtools.yang.binding.Identifiable;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyAware;
import org.opendaylight.yangtools.yang.binding.Rpc;
import org.opendaylight.yangtools.yang.binding.RpcInput;
import org.opendaylight.yangtools.yang.binding.ScalarTypeObject;
import org.opendaylight.yangtools.yang.common.QName;
import org.opendaylight.yangtools.yang.common.QNameModule;
-import org.opendaylight.yangtools.yang.common.Revision;
+import org.opendaylight.yangtools.yang.common.YangDataName;
@Beta
public final class Naming {
"record");
public static final @NonNull String DATA_ROOT_SUFFIX = "Data";
- @Deprecated(since = "11.0.0", forRemoval = true)
- public static final @NonNull String RPC_SERVICE_SUFFIX = "Service";
- @Deprecated(since = "10.0.3", forRemoval = true)
- public static final @NonNull String NOTIFICATION_LISTENER_SUFFIX = "Listener";
public static final @NonNull String BUILDER_SUFFIX = "Builder";
public static final @NonNull String KEY_SUFFIX = "Key";
// ietf-restconf:yang-data, i.e. YangDataName
// concrete extensible contracts, for example 'feature', 'identity' and similar
public static final @NonNull String VALUE_STATIC_FIELD_NAME = "VALUE";
public static final @NonNull String PACKAGE_PREFIX = "org.opendaylight.yang.gen.v1";
+ public static final @NonNull String SVC_PACKAGE_PREFIX = "org.opendaylight.yang.svc.v1";
public static final @NonNull String AUGMENTATION_FIELD = "augmentation";
private static final Splitter CAMEL_SPLITTER = Splitter.on(CharMatcher.anyOf(" _.-/").precomputed())
private static final String QUOTED_DOT = Matcher.quoteReplacement(".");
private static final Splitter DOT_SPLITTER = Splitter.on('.');
- public static final @NonNull String MODULE_INFO_CLASS_NAME = "$YangModuleInfoImpl";
+ 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 MODULE_INFO_YANGDATANAMEOF_METHOD_NAME = "yangDataNameOf";
- public static final @NonNull String MODEL_BINDING_PROVIDER_CLASS_NAME = "$YangModelBindingProvider";
+ public static final @NonNull String MODEL_BINDING_PROVIDER_CLASS_NAME = "YangModelBindingProviderImpl";
/**
* Name of {@link Augmentable#augmentation(Class)}.
public static final @NonNull String AUGMENTABLE_AUGMENTATION_NAME = "augmentation";
/**
- * Name of {@link Identifiable#key()}.
+ * Name of {@link KeyAware#key()}.
*/
- public static final @NonNull String IDENTIFIABLE_KEY_NAME = "key";
+ public static final @NonNull String KEY_AWARE_KEY_NAME = "key";
/**
* Name of {@link BindingContract#implementedInterface()}.
private static final Interner<String> PACKAGE_INTERNER = Interners.newWeakInterner();
@Regex
private static final String ROOT_PACKAGE_PATTERN_STRING =
- "(org.opendaylight.yang.gen.v1.[a-z0-9_\\.]*?\\.(?:rev[0-9][0-9][0-1][0-9][0-3][0-9]|norev))";
+ "(org.opendaylight.yang.(gen|svc).v1.[a-z0-9_\\.]*?\\.(?:rev[0-9][0-9][0-1][0-9][0-3][0-9]|norev))";
private static final Pattern ROOT_PACKAGE_PATTERN = Pattern.compile(ROOT_PACKAGE_PATTERN_STRING);
private Naming() {
// Hidden on purpose
}
+ /**
+ * Return the package name for placing generated ServiceLoader entities, like {@link #MODULE_INFO_CLASS_NAME} and
+ * {@link #MODEL_BINDING_PROVIDER_CLASS_NAME}.
+ *
+ * @param module module namespace
+ * @return the package name for placing generated ServiceLoader entities
+ */
+ public static @NonNull String getServicePackageName(final QNameModule module) {
+ final StringBuilder packageNameBuilder = new StringBuilder().append(SVC_PACKAGE_PREFIX).append('.');
+ return getRootPackageName(packageNameBuilder, module);
+ }
+
public static @NonNull String getRootPackageName(final QName module) {
return getRootPackageName(module.getModule());
}
public static @NonNull String getRootPackageName(final QNameModule module) {
final StringBuilder packageNameBuilder = new StringBuilder().append(PACKAGE_PREFIX).append('.');
+ return getRootPackageName(packageNameBuilder, module);
+ }
- String namespace = module.getNamespace().toString();
+ private static @NonNull String getRootPackageName(final StringBuilder builder, final QNameModule module) {
+ String namespace = module.namespace().toString();
namespace = COLON_SLASH_SLASH.matcher(namespace).replaceAll(QUOTED_DOT);
final char[] chars = namespace.toCharArray();
}
}
- packageNameBuilder.append(chars);
+ builder.append(chars);
if (chars[chars.length - 1] != '.') {
- packageNameBuilder.append('.');
+ builder.append('.');
}
- final Optional<Revision> optRev = module.getRevision();
- if (optRev.isPresent()) {
+ final var revision = module.revision();
+ if (revision != null) {
// Revision is in format 2017-10-26, we want the output to be 171026, which is a matter of picking the
// right characters.
- final String rev = optRev.get().toString();
+ final String rev = revision.toString();
checkArgument(rev.length() == 10, "Unsupported revision %s", rev);
- packageNameBuilder.append("rev").append(rev, 2, 4).append(rev, 5, 7).append(rev.substring(8));
+ builder.append("rev").append(rev, 2, 4).append(rev, 5, 7).append(rev.substring(8));
} else {
// No-revision packages are special
- packageNameBuilder.append("norev");
+ builder.append("norev");
}
- return normalizePackageName(packageNameBuilder.toString());
+ return normalizePackageName(builder.toString());
+ }
+
+ /**
+ * Convert the result of {@link #getRootPackageName(QNameModule)} to the corresponding result of
+ * {@link #getServicePackageName(QNameModule)}.
+ *
+ * @param rootPackageName root package name
+ * @return Service root package name
+ */
+ public static @NonNull String rootToServicePackageName(final String rootPackageName) {
+ final var match = ROOT_PACKAGE_PATTERN.matcher(rootPackageName);
+ checkArgument(match.find(), "Package name '%s' does not match required pattern '%s'", rootPackageName,
+ ROOT_PACKAGE_PATTERN_STRING);
+ return getModelRootPackageName(rootPackageName.replace(Naming.PACKAGE_PREFIX, Naming.SVC_PACKAGE_PREFIX));
}
public static @NonNull String normalizePackageName(final String packageName) {
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 root package name for supplied package name.
*
* not match package name formatting rules
*/
public static @NonNull String getModelRootPackageName(final String packageName) {
- checkArgument(packageName.startsWith(PACKAGE_PREFIX), "Package name not starting with %s, is: %s",
- PACKAGE_PREFIX, packageName);
+ checkArgument(packageName.startsWith(PACKAGE_PREFIX) || packageName.startsWith(SVC_PACKAGE_PREFIX),
+ "Package name not starting with %s, is: %s", PACKAGE_PREFIX, packageName);
final var match = ROOT_PACKAGE_PATTERN.matcher(packageName);
checkArgument(match.find(), "Package name '%s' does not match required pattern '%s'", packageName,
ROOT_PACKAGE_PATTERN_STRING);
* @throws IllegalArgumentException if (@code templateName} is empty
*/
// TODO: take YangDataName once we have it readily available
- public static String mapYangDataName(final String templateName) {
- return mapEnumAssignedName(templateName);
+ public static String mapYangDataName(final YangDataName templateName) {
+ return mapEnumAssignedName(templateName.name());
}
// See https://docs.oracle.com/javase/specs/jls/se16/html/jls-3.html#jls-3.8