1   /*
2    * SPDX-FileCopyrightText: none
3    * SPDX-License-Identifier: CC0-1.0
4    */
5   
6   package dev.metaschema.oscal.lib.profile.resolver.support;
7   
8   import java.util.EnumSet;
9   import java.util.Set;
10  
11  import dev.metaschema.core.metapath.item.node.IAssemblyNodeItem;
12  import dev.metaschema.core.metapath.item.node.IRootAssemblyNodeItem;
13  import dev.metaschema.core.util.ObjectUtils;
14  import edu.umd.cs.findbugs.annotations.NonNull;
15  
16  public abstract class AbstractIndexingVisitor<T, R>
17      extends AbstractCatalogEntityVisitor<T, R> {
18  
19    public AbstractIndexingVisitor() {
20      this(ObjectUtils.notNull(EnumSet.allOf(IEntityItem.ItemType.class)));
21    }
22  
23    public AbstractIndexingVisitor(@NonNull Set<IEntityItem.ItemType> itemTypesToIndex) {
24      super(itemTypesToIndex);
25    }
26  
27    @NonNull
28    protected abstract IIndexer getIndexer(T state);
29  
30    @Override
31    public R visitGroup(IAssemblyNodeItem item, R childResult, T state) {
32      getIndexer(state).addGroup(item);
33      return childResult;
34    }
35  
36    @Override
37    public R visitControl(IAssemblyNodeItem item, R childResult, T state) {
38      getIndexer(state).addControl(item);
39      return childResult;
40    }
41  
42    @Override
43    protected R visitParameter(@NonNull IAssemblyNodeItem parameterItem,
44        @NonNull IAssemblyNodeItem catalogOrGroupOrControl, T state) {
45      getIndexer(state).addParameter(parameterItem);
46      return newDefaultResult(state);
47    }
48  
49    @Override
50    protected void visitPart(@NonNull IAssemblyNodeItem partItem,
51        @NonNull IAssemblyNodeItem catalogOrGroupOrControl, T state) {
52      getIndexer(state).addPart(partItem);
53    }
54  
55    @Override
56    protected void visitRole(IAssemblyNodeItem roleItem, IAssemblyNodeItem metadataItem, T state) {
57      getIndexer(state).addRole(roleItem);
58    }
59  
60    @Override
61    protected void visitLocation(IAssemblyNodeItem locationItem, IAssemblyNodeItem metadataItem,
62        T state) {
63      getIndexer(state).addLocation(locationItem);
64    }
65  
66    @Override
67    protected void visitParty(IAssemblyNodeItem partyItem, IAssemblyNodeItem metadataItem, T state) {
68      getIndexer(state).addParty(partyItem);
69    }
70  
71    @Override
72    protected void visitResource(IAssemblyNodeItem resourceItem, IRootAssemblyNodeItem rootItem, T state) {
73      getIndexer(state).addResource(resourceItem);
74    }
75  }