summaryrefslogtreecommitdiffstats
path: root/java/jvpp/gen/jvppgen/enumsets_gen.py
blob: 029c4ec7862811d119c5286c9b6fea1765f035aa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/env python2
#
# Copyright (c) 2019 Cisco and/or its affiliates.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from string import Template

from jvpp_model import EnumSet


def generate_enumsets(work_dir, model, logger):
    logger.debug("Generating enumset for %s " % model.json_api_files)

    for t in model.types:
        if not isinstance(t, EnumSet):
            continue
        logger.debug("Generating DTO for enumset %s", t)
        type_class_name = t.java_name
        type_class = _ENUM_TEMPLATE.substitute(
            plugin_package=model.plugin_package,
            c_type_name=t.name,
            json_filename=model.json_api_files,
            json_definition=t.doc,
            java_name=type_class_name,
            java_enum_name=type_class_name + "Options",
            constants=_generate_constants(t.constants),
            value_type=t.value.type.java_name
        )
        with open("%s/%s.java" % (work_dir, type_class_name), "w") as f:
            f.write(type_class)


_ENUM_TEMPLATE = Template("""
package $plugin_package.types;

import java.util.EnumSet;

/**
 * <p>This class represents $c_type_name enumset definition.
 * <br>It was generated by enumsets_gen.py based on $json_filename:
 * <pre>
$json_definition
 * </pre>
 */
public final class $java_name {

    private final EnumSet<$java_enum_name> options = EnumSet.noneOf($java_enum_name.class);

    @Override
    public boolean equals(final Object obj) {
        if (!( obj instanceof $java_name)) {
            return false;
        }
        return options.equals((($java_name)obj).getOptions());
    }

    public EnumSet<$java_enum_name> getOptions() {
        return options;
    }

    public $value_type getOptionsValue() {
        $value_type optionsValue = 0;
        for ($java_enum_name opts : options) {
            optionsValue = optionsValue | opts.value;
        }
        return optionsValue;
    }

    public void setOptionsValue(int value) {
        options.clear();

        if (value == 0) {
            // if value is "0" set default value and exit
            options.add($java_enum_name.forValue(0));
            return;
        }

        for ($java_enum_name option : $java_enum_name.values()) {
            if ((option.value > 0) & ((option.value & value) == option.value)) {
                options.add(option);
            }
        }
    }

    public boolean add($java_enum_name option) {
        return options.add(option);
    }

    public boolean remove($java_enum_name option) {
        return options.remove(option);
    }

    public boolean removeAll(EnumSet<$java_enum_name> options) {
        return options.removeAll(options);
    }

    public void clear() {
        options.clear();
    }

    public boolean contains($java_enum_name option) {
        return options.contains(option);
    }

    public boolean containsAll(EnumSet<$java_enum_name> options) {
        return options.containsAll(options);
    }

    @Override
    public java.lang.String toString() {
        return "$java_name{" + "options=" + options + '}';
    }

    public enum $java_enum_name {
$constants;

        public final $value_type value;

        $java_enum_name(final $value_type value) {
            this.value = value;
        }

        public static $java_enum_name forValue(final $value_type value) {
            for ($java_enum_name enumeration : $java_enum_name.values()) {
                if (value == enumeration.value) {
                    return enumeration;
                }
            }
            return null;
        }
    }
}
""")


def _generate_constants(constants):
    return ",\n".join(_CONSTANT_TEMPLATE.substitute(name=c['name'], value=c['value']) for c in constants)


_CONSTANT_TEMPLATE = Template("""        $name($value)""")