Rehost BindingMapping in yang.binding.contract.Naming
[mdsal.git] / binding / mdsal-binding-dom-codec / src / main / java / org / opendaylight / mdsal / binding / dom / codec / impl / CodecPackage.java
1 /*
2  * Copyright (c) 2022 PANTHEON.tech, s.r.o. and others.  All rights reserved.
3  *
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
7  */
8 package org.opendaylight.mdsal.binding.dom.codec.impl;
9
10 import static com.google.common.base.Preconditions.checkArgument;
11 import static java.util.Objects.requireNonNull;
12
13 import org.eclipse.jdt.annotation.NonNull;
14 import org.opendaylight.mdsal.binding.loader.BindingClassLoader;
15 import org.opendaylight.mdsal.binding.loader.BindingClassLoader.ClassGenerator;
16 import org.opendaylight.yangtools.yang.binding.contract.Naming;
17
18 /**
19  * Centralized registry of Java package names used by classes generated by codec components.
20  */
21 enum CodecPackage {
22     /**
23      * Package holding {@link CodecDataObject}s, {@link CodecOpaqueObject}s and similar.
24      */
25     CODEC("org.opendaylight.yang.rt.v1.obj"),
26     /**
27      * Package holding {@link DataObjectStreamer}s.
28      */
29     STREAMER("org.opendaylight.yang.rt.v1.stream"),
30     /**
31      * Package holding @link EventInstantAware} specializations of {@code notification} objects.
32      */
33     EVENT_AWARE("org.opendaylight.yang.rt.v1.eia");
34
35     private static final int PACKAGE_PREFIX_LENGTH = Naming.PACKAGE_PREFIX.length();
36
37     private String packagePrefix;
38
39     CodecPackage(final String packagePrefix) {
40         this.packagePrefix = requireNonNull(packagePrefix);
41     }
42
43     <T> @NonNull Class<T> generateClass(final BindingClassLoader loader, final Class<?> bindingInterface,
44             final ClassGenerator<T> generator) {
45         return loader.generateClass(bindingInterface, createFQCN(bindingInterface), generator);
46     }
47
48     @NonNull Class<?> getGeneratedClass(final BindingClassLoader loader, final Class<?> bindingInterface) {
49         return loader.getGeneratedClass(bindingInterface, createFQCN(bindingInterface));
50     }
51
52     private @NonNull String createFQCN(final Class<?> bindingInterface) {
53         final var ifName = bindingInterface.getName();
54         checkArgument(ifName.startsWith(Naming.PACKAGE_PREFIX), "Unrecognized interface %s", bindingInterface);
55         return packagePrefix + ifName.substring(PACKAGE_PREFIX_LENGTH);
56     }
57 }