Binding v2 runtime context
[mdsal.git] / binding2 / mdsal-binding2-util / src / main / java / org / opendaylight / mdsal / binding / javav2 / util / BindingMapping.java
1 /*
2  * Copyright (c) 2017 Cisco Systems, Inc. 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
9 package org.opendaylight.mdsal.binding.javav2.util;
10
11 import static com.google.common.base.Preconditions.checkArgument;
12 import com.google.common.annotations.Beta;
13 import com.google.common.collect.ImmutableSet;
14 import java.text.SimpleDateFormat;
15 import java.util.Set;
16 import java.util.regex.Matcher;
17 import java.util.regex.Pattern;
18 import org.opendaylight.yangtools.yang.model.api.Module;
19
20 /**
21  * Standard Util class that provides generated Java related functionality
22  */
23 @Beta
24 public final class BindingMapping {
25
26     public static final Set<String> JAVA_RESERVED_WORDS = ImmutableSet.of("abstract", "assert", "boolean", "break",
27             "byte", "case", "catch", "char", "class", "const", "continue", "default", "double", "do", "else", "enum",
28             "extends", "false", "final", "finally", "float", "for", "goto", "if", "implements", "import", "instanceof",
29             "int", "interface", "long", "native", "new", "null", "package", "private", "protected", "public", "return",
30             "short", "static", "strictfp", "super", "switch", "synchronized", "this", "throw", "throws", "transient",
31             "true", "try", "void", "volatile", "while");
32
33     public static final Set<String> WINDOWS_RESERVED_WORDS = ImmutableSet.of("CON", "PRN", "AUX", "CLOCK$", "NUL",
34             "COM0", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6", "COM7", "COM8", "COM9", "LPT0", "LPT1", "LPT2",
35             "LPT3", "LPT4", "LPT5", "LPT6", "LPT7", "LPT8", "LPT9");
36
37     public static final String QNAME_STATIC_FIELD_NAME = "QNAME";
38
39     /**
40      * Package prefix for Binding v2 generated Java code structures
41      */
42     public static final String PACKAGE_PREFIX = "org.opendaylight.mdsal.gen.javav2";
43
44     private static final Pattern COLON_SLASH_SLASH = Pattern.compile("://", Pattern.LITERAL);
45     private static final String QUOTED_DOT = Matcher.quoteReplacement(".");
46     public static final String MODULE_INFO_CLASS_NAME = "$YangModuleInfoImpl";
47     public static final String MODEL_BINDING_PROVIDER_CLASS_NAME = "$YangModelBindingProvider";
48     public static final String PATTERN_CONSTANT_NAME = "PATTERN_CONSTANTS";
49     public static final String MEMBER_PATTERN_LIST = "patterns";
50     public static final String RPC_INPUT_SUFFIX = "Input";
51     public static final String RPC_OUTPUT_SUFFIX = "Output";
52
53     private static final ThreadLocal<SimpleDateFormat> PACKAGE_DATE_FORMAT = new ThreadLocal<SimpleDateFormat>() {
54
55         @Override
56         protected SimpleDateFormat initialValue() {
57             return new SimpleDateFormat("yyMMdd");
58         }
59
60         @Override
61         public void set(final SimpleDateFormat value) {
62             throw new UnsupportedOperationException();
63         }
64     };
65
66     private BindingMapping() {
67         throw new UnsupportedOperationException("Utility class");
68     }
69
70     public static String getRootPackageName(final Module module) {
71         checkArgument(module != null, "Module must not be null");
72         checkArgument(module.getRevision() != null, "Revision must not be null");
73         checkArgument(module.getNamespace() != null, "Namespace must not be null");
74
75         final StringBuilder packageNameBuilder = new StringBuilder();
76         packageNameBuilder.append(PACKAGE_PREFIX);
77         packageNameBuilder.append('.');
78
79         String namespace = module.getNamespace().toString();
80         namespace = COLON_SLASH_SLASH.matcher(namespace).replaceAll(QUOTED_DOT);
81
82         final char[] chars = namespace.toCharArray();
83         for (int i = 0; i < chars.length; ++i) {
84             switch (chars[i]) {
85                 case '/':
86                 case ':':
87                 case '-':
88                 case '@':
89                 case '$':
90                 case '#':
91                 case '\'':
92                 case '*':
93                 case '+':
94                 case ',':
95                 case ';':
96                 case '=':
97                     chars[i] = '.';
98                     break;
99                 default:
100                     // no-op, any other character is kept as it is
101             }
102         }
103
104         packageNameBuilder.append(chars);
105         if (chars[chars.length - 1] != '.') {
106             packageNameBuilder.append('.');
107         }
108
109         //TODO: per yangtools dev, semantic version not used yet
110 //        final SemVer semVer = module.getSemanticVersion();
111 //        if (semVer != null) {
112 //            packageNameBuilder.append(semVer.toString());
113 //        } else {
114 //            packageNameBuilder.append("rev");
115 //            packageNameBuilder.append(PACKAGE_DATE_FORMAT.get().format(module.getRevision()));
116 //        }
117
118         packageNameBuilder.append("rev");
119         packageNameBuilder.append(PACKAGE_DATE_FORMAT.get().format(module.getRevision()));
120         return packageNameBuilder.toString();
121     }
122
123     //TODO: further implementation of static util methods...
124
125 }