001/*
002 * SPDX-FileCopyrightText: none
003 * SPDX-License-Identifier: CC0-1.0
004 */
005
006package dev.metaschema.oscal.lib.profile.resolver.support;
007
008import java.util.EnumSet;
009import java.util.Set;
010
011import dev.metaschema.core.metapath.item.node.IAssemblyNodeItem;
012import dev.metaschema.core.metapath.item.node.IRootAssemblyNodeItem;
013import dev.metaschema.core.util.ObjectUtils;
014import edu.umd.cs.findbugs.annotations.NonNull;
015
016public abstract class AbstractIndexingVisitor<T, R>
017    extends AbstractCatalogEntityVisitor<T, R> {
018
019  public AbstractIndexingVisitor() {
020    this(ObjectUtils.notNull(EnumSet.allOf(IEntityItem.ItemType.class)));
021  }
022
023  public AbstractIndexingVisitor(@NonNull Set<IEntityItem.ItemType> itemTypesToIndex) {
024    super(itemTypesToIndex);
025  }
026
027  @NonNull
028  protected abstract IIndexer getIndexer(T state);
029
030  @Override
031  public R visitGroup(IAssemblyNodeItem item, R childResult, T state) {
032    getIndexer(state).addGroup(item);
033    return childResult;
034  }
035
036  @Override
037  public R visitControl(IAssemblyNodeItem item, R childResult, T state) {
038    getIndexer(state).addControl(item);
039    return childResult;
040  }
041
042  @Override
043  protected R visitParameter(@NonNull IAssemblyNodeItem parameterItem,
044      @NonNull IAssemblyNodeItem catalogOrGroupOrControl, T state) {
045    getIndexer(state).addParameter(parameterItem);
046    return newDefaultResult(state);
047  }
048
049  @Override
050  protected void visitPart(@NonNull IAssemblyNodeItem partItem,
051      @NonNull IAssemblyNodeItem catalogOrGroupOrControl, T state) {
052    getIndexer(state).addPart(partItem);
053  }
054
055  @Override
056  protected void visitRole(IAssemblyNodeItem roleItem, IAssemblyNodeItem metadataItem, T state) {
057    getIndexer(state).addRole(roleItem);
058  }
059
060  @Override
061  protected void visitLocation(IAssemblyNodeItem locationItem, IAssemblyNodeItem metadataItem,
062      T state) {
063    getIndexer(state).addLocation(locationItem);
064  }
065
066  @Override
067  protected void visitParty(IAssemblyNodeItem partyItem, IAssemblyNodeItem metadataItem, T state) {
068    getIndexer(state).addParty(partyItem);
069  }
070
071  @Override
072  protected void visitResource(IAssemblyNodeItem resourceItem, IRootAssemblyNodeItem rootItem, T state) {
073    getIndexer(state).addResource(resourceItem);
074  }
075}