1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.databind.codegen.config;
7   
8   import java.util.LinkedHashMap;
9   import java.util.LinkedList;
10  import java.util.List;
11  import java.util.Map;
12  
13  import dev.metaschema.core.util.CollectionUtil;
14  import edu.umd.cs.findbugs.annotations.NonNull;
15  import edu.umd.cs.findbugs.annotations.Nullable;
16  
17  /**
18   * Default implementation of {@link IMutableDefinitionBindingConfiguration} that
19   * provides mutable binding configuration for a specific Metaschema definition.
20   */
21  public class DefaultDefinitionBindingConfiguration implements IMutableDefinitionBindingConfiguration {
22    @Nullable
23    private String className;
24    @Nullable
25    private String baseClassName;
26    @NonNull
27    private final List<String> interfacesToImplement = new LinkedList<>();
28    @NonNull
29    private final Map<String, IChoiceGroupBindingConfiguration> choiceGroupBindings = new LinkedHashMap<>();
30  
31    /**
32     * Create a new definition binding configuration.
33     */
34    public DefaultDefinitionBindingConfiguration() {
35      // empty configuration
36    }
37  
38    /**
39     * Create a new definition binding configuration based on a previous
40     * configuration.
41     *
42     * @param config
43     *          the previous configuration
44     */
45    public DefaultDefinitionBindingConfiguration(@NonNull IDefinitionBindingConfiguration config) {
46      this.className = config.getClassName();
47      this.baseClassName = config.getQualifiedBaseClassName();
48      this.interfacesToImplement.addAll(config.getInterfacesToImplement());
49      this.choiceGroupBindings.putAll(config.getChoiceGroupBindings());
50    }
51  
52    @Override
53    public String getClassName() {
54      return className;
55    }
56  
57    @Override
58    public void setClassName(String name) {
59      this.className = name;
60    }
61  
62    @Override
63    public String getQualifiedBaseClassName() {
64      return baseClassName;
65    }
66  
67    @Override
68    public void setQualifiedBaseClassName(String name) {
69      this.baseClassName = name;
70    }
71  
72    @Override
73    public List<String> getInterfacesToImplement() {
74      return interfacesToImplement;
75    }
76  
77    @Override
78    public void addInterfaceToImplement(String interfaceName) {
79      this.interfacesToImplement.add(interfaceName);
80    }
81  
82    @Override
83    public Map<String, IChoiceGroupBindingConfiguration> getChoiceGroupBindings() {
84      return CollectionUtil.unmodifiableMap(choiceGroupBindings);
85    }
86  
87    /**
88     * Add a choice group binding configuration.
89     *
90     * @param groupAsName
91     *          the group-as name from the Metaschema module
92     * @param config
93     *          the choice group binding configuration
94     */
95    public void addChoiceGroupBinding(@NonNull String groupAsName, @NonNull IChoiceGroupBindingConfiguration config) {
96      this.choiceGroupBindings.put(groupAsName, config);
97    }
98  }