1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.databind.model.impl;
7   
8   import dev.metaschema.core.model.IGroupable;
9   import dev.metaschema.core.model.JsonGroupAsBehavior;
10  import dev.metaschema.core.model.XmlGroupAsBehavior;
11  import dev.metaschema.core.qname.IEnhancedQName;
12  import dev.metaschema.databind.model.IGroupAs;
13  import edu.umd.cs.findbugs.annotations.NonNull;
14  
15  /**
16   * A feature interface for model instances that support group-as configuration.
17   * <p>
18   * This interface provides access to the group-as settings that control how
19   * collections of model instances are serialized in XML and JSON.
20   */
21  public interface IFeatureInstanceModelGroupAs extends IGroupable {
22    /**
23     * Get the underlying group-as provider.
24     *
25     * @return the group-as provider
26     */
27    @NonNull
28    IGroupAs getGroupAs();
29  
30    @Override
31    default String getGroupAsName() {
32      IEnhancedQName qname = getGroupAs().getGroupAsQName();
33      return qname == null ? null : qname.getLocalName();
34    }
35  
36    @Override
37    default IEnhancedQName getEffectiveXmlGroupAsQName() {
38      IEnhancedQName retval = null;
39      if (XmlGroupAsBehavior.GROUPED.equals(getXmlGroupAsBehavior())) {
40        IEnhancedQName qname = getGroupAs().getGroupAsQName();
41        if (qname == null) {
42          throw new IllegalStateException("Instance is grouped, but no group-as QName was provided.");
43        }
44        retval = qname;
45      }
46      return retval;
47    }
48  
49    @Override
50    default JsonGroupAsBehavior getJsonGroupAsBehavior() {
51      return getGroupAs().getJsonGroupAsBehavior();
52    }
53  
54    @Override
55    default XmlGroupAsBehavior getXmlGroupAsBehavior() {
56      return getGroupAs().getXmlGroupAsBehavior();
57    }
58  }