6b7f35391f25e91dd86135249f942a299d542115
[smo/teiv.git] /
1 /*
2  *  ============LICENSE_START=======================================================
3  *  Copyright (C) 2024 Ericsson
4  *  Modifications Copyright (C) 2024 OpenInfra Foundation Europe
5  *  ================================================================================
6  *  Licensed under the Apache License, Version 2.0 (the "License");
7  *  you may not use this file except in compliance with the License.
8  *  You may obtain a copy of the License at
9  *
10  *        http://www.apache.org/licenses/LICENSE-2.0
11  *
12  *  Unless required by applicable law or agreed to in writing, software
13  *  distributed under the License is distributed on an "AS IS" BASIS,
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15  *  See the License for the specific language governing permissions and
16  *  limitations under the License.
17  *
18  *  SPDX-License-Identifier: Apache-2.0
19  *  ============LICENSE_END=========================================================
20  */
21 package org.oran.smo.yangtools.parser.model.statements;
22
23 /**
24  * Convenience base class containing a utility method for constructing java class names for
25  * type-safe statement classes.
26  *
27  * @author Mark Hollmann
28  */
29 public abstract class AbstractStatementClassSupplier implements StatementClassSupplier {
30
31     /**
32      * Given a Java package name, a class name prefix and the name of a statement, returns the Java class
33      * representing the statement. The YANG statement name (possibly the name of an extension statement)
34      * will be translated to CamelCase.
35      */
36     @SuppressWarnings("unchecked")
37     protected static <T extends AbstractStatement> Class<T> getJavaClazzForStatement(final String javaPackage,
38             final String clazzPrefix, final String statementName) {
39
40         final StringBuilder sb = new StringBuilder(100);
41         sb.append(javaPackage);
42         sb.append(".");
43         sb.append(clazzPrefix);
44         appendStatementNameInCamelCase(sb, statementName);
45
46         try {
47             final Class<?> forName = Class.forName(sb.toString());
48             return (Class<T>) forName;
49         } catch (final Exception ex) {
50             /* no-op */ }
51
52         return null;
53     }
54
55     /**
56      * Takes a statement name (which, by YANG convention, is all lowercase and contains hyphens) and converts it to
57      * CamelCase:
58      *
59      * "choice" -> "Choice"
60      * "belongs-to" -> "BelongsTo"
61      */
62     private static void appendStatementNameInCamelCase(final StringBuilder sb, final String statementName) {
63
64         boolean upperCaseNextChar = true;
65         for (int i = 0; i < statementName.length(); ++i) {
66             final char c = statementName.charAt(i);
67             if (c == '-') {
68                 upperCaseNextChar = true;
69             } else if (upperCaseNextChar) {
70                 sb.append(Character.toUpperCase(c));
71                 upperCaseNextChar = false;
72             } else {
73                 sb.append(c);
74             }
75         }
76     }
77 }