| /******************************************************************************* |
| * Copyright (C) 2021 the Eclipse BaSyx Authors |
| * |
| * This program and the accompanying materials are made |
| * available under the terms of the Eclipse Public License 2.0 |
| * which is available at https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| ******************************************************************************/ |
| package org.eclipse.basyx.extensions.aas.directory.tagged.map; |
| |
| import java.util.HashSet; |
| import java.util.Iterator; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.stream.Collectors; |
| |
| import org.eclipse.basyx.aas.metamodel.map.descriptor.AASDescriptor; |
| import org.eclipse.basyx.aas.registration.memory.AASRegistry; |
| import org.eclipse.basyx.aas.registration.memory.MapRegistryHandler; |
| import org.eclipse.basyx.extensions.aas.directory.tagged.api.IAASTaggedDirectory; |
| import org.eclipse.basyx.extensions.aas.directory.tagged.api.TaggedAASDescriptor; |
| import org.eclipse.basyx.submodel.metamodel.api.identifier.IIdentifier; |
| |
| /** |
| * Map implementation of a tagged directory. It extends {@link MapRegistry} by |
| * additionally managing a map of tags |
| * |
| * @author schnicke |
| * |
| */ |
| public class MapTaggedDirectory extends AASRegistry implements IAASTaggedDirectory { |
| private Map<String, Set<TaggedAASDescriptor>> tagMap; |
| |
| /** |
| * Constructor that takes a reference to a map as a base for the registry |
| * entries |
| * |
| * @param rootMap |
| * @param tagMap |
| */ |
| public MapTaggedDirectory(Map<String, AASDescriptor> rootMap, Map<String, Set<TaggedAASDescriptor>> tagMap) { |
| super(new MapRegistryHandler(rootMap)); |
| this.tagMap = tagMap; |
| } |
| |
| @Override |
| public void register(TaggedAASDescriptor descriptor) { |
| // Let MapRegistry take care of the registry part and only manage the tags |
| super.register(descriptor); |
| addTags(descriptor.getTags(), descriptor); |
| } |
| |
| @Override |
| public Set<TaggedAASDescriptor> lookupTag(String tag) { |
| if (tagMap.containsKey(tag)) { |
| return tagMap.get(tag); |
| } else { |
| return new HashSet<>(); |
| } |
| } |
| |
| @Override |
| public Set<TaggedAASDescriptor> lookupTags(Set<String> tags) { |
| Set<TaggedAASDescriptor> result = new HashSet<>(); |
| Set<Set<TaggedAASDescriptor>> descriptors = tags.stream().map(t -> lookupTag(t)).collect(Collectors.toSet()); |
| |
| if (descriptors.size() > 0) { |
| // Iterate through set of sets and use retainAll() to find intersection |
| Iterator<Set<TaggedAASDescriptor>> it = descriptors.iterator(); |
| result = it.next(); |
| |
| while (it.hasNext()) { |
| result.retainAll(it.next()); |
| } |
| } |
| |
| return result; |
| } |
| |
| @Override |
| public void delete(IIdentifier aasIdentifier) { |
| // Let MapRegistry take care of the registry part and only manage the tags |
| AASDescriptor desc = super.lookupAAS(aasIdentifier); |
| super.delete(aasIdentifier); |
| |
| if (desc instanceof TaggedAASDescriptor) { |
| ((TaggedAASDescriptor) desc).getTags().stream().forEach(t -> tagMap.get(t).remove(desc)); |
| } |
| } |
| |
| private void addTags(Set<String> tags, TaggedAASDescriptor descriptor) { |
| tags.stream().forEach(t -> addTag(t, descriptor)); |
| } |
| |
| private synchronized void addTag(String tag, TaggedAASDescriptor descriptor) { |
| if (!tagMap.containsKey(tag)) { |
| tagMap.put(tag, new HashSet<>()); |
| } |
| |
| tagMap.get(tag).add(descriptor); |
| } |
| |
| } |