6b3860e8c6225256729feb67d31d0218c2a31914
[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
51     private static final ThreadLocal<SimpleDateFormat> PACKAGE_DATE_FORMAT = new ThreadLocal<SimpleDateFormat>() {
52
53         @Override
54         protected SimpleDateFormat initialValue() {
55             return new SimpleDateFormat("yyMMdd");
56         }
57
58         @Override
59         public void set(final SimpleDateFormat value) {
60             throw new UnsupportedOperationException();
61         }
62     };
63
64     private BindingMapping() {
65         throw new UnsupportedOperationException("Utility class");
66     }
67
68     public static String getRootPackageName(final Module module) {
69         checkArgument(module != null, "Module must not be null");
70         checkArgument(module.getRevision() != null, "Revision must not be null");
71         checkArgument(module.getNamespace() != null, "Namespace must not be null");
72
73         final StringBuilder packageNameBuilder = new StringBuilder();
74         packageNameBuilder.append(PACKAGE_PREFIX);
75         packageNameBuilder.append('.');
76
77         String namespace = module.getNamespace().toString();
78         namespace = COLON_SLASH_SLASH.matcher(namespace).replaceAll(QUOTED_DOT);
79
80         final char[] chars = namespace.toCharArray();
81         for (int i = 0; i < chars.length; ++i) {
82             switch (chars[i]) {
83                 case '/':
84                 case ':':
85                 case '-':
86                 case '@':
87                 case '$':
88                 case '#':
89                 case '\'':
90                 case '*':
91                 case '+':
92                 case ',':
93                 case ';':
94                 case '=':
95                     chars[i] = '.';
96                     break;
97                 default:
98                     // no-op, any other character is kept as it is
99             }
100         }
101
102         packageNameBuilder.append(chars);
103         if (chars[chars.length - 1] != '.') {
104             packageNameBuilder.append('.');
105         }
106
107         //TODO: per yangtools dev, semantic version not used yet
108 //        final SemVer semVer = module.getSemanticVersion();
109 //        if (semVer != null) {
110 //            packageNameBuilder.append(semVer.toString());
111 //        } else {
112 //            packageNameBuilder.append("rev");
113 //            packageNameBuilder.append(PACKAGE_DATE_FORMAT.get().format(module.getRevision()));
114 //        }
115
116         packageNameBuilder.append("rev");
117         packageNameBuilder.append(PACKAGE_DATE_FORMAT.get().format(module.getRevision()));
118         return packageNameBuilder.toString();
119     }
120
121     //TODO: further implementation of static util methods...
122
123 }