/* * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.aries.subsystem.core.internal; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import org.osgi.resource.Resource; public class ResourceReferences { private final Map<Resource, Set<BasicSubsystem>> resourceToSubsystems = new HashMap<Resource, Set<BasicSubsystem>>(); private final Map<BasicSubsystem, Set<Resource>> subsystemToResources = new HashMap<BasicSubsystem, Set<Resource>>(); public synchronized void addReference(BasicSubsystem subsystem, Resource resource) { addSubsystemToResource(subsystem, resource); addResourceToSubsystem(subsystem, resource); } public synchronized Collection<Resource> getResources(BasicSubsystem subsystem) { Collection<Resource> result = subsystemToResources.get(subsystem); if (result == null) result = Collections.emptyList(); return Collections.unmodifiableCollection(new ArrayList<Resource>(result)); } public synchronized Collection<BasicSubsystem> getSubsystems(Resource resource) { Collection<BasicSubsystem> result = resourceToSubsystems.get(resource); if (result == null) result = Collections.emptyList(); return Collections.unmodifiableCollection(new ArrayList<BasicSubsystem>(result)); } public synchronized void removeReference(BasicSubsystem subsystem, Resource resource) { removeResourceToSubsystem(subsystem, resource); removeSubsystemToResource(subsystem, resource); } private void addResourceToSubsystem(BasicSubsystem subsystem, Resource resource) { Set<BasicSubsystem> subsystems = resourceToSubsystems.get(resource); if (subsystems == null) { subsystems = new HashSet<BasicSubsystem>(); resourceToSubsystems.put(resource, subsystems); } subsystems.add(subsystem); } private void addSubsystemToResource(BasicSubsystem subsystem, Resource resource) { Set<Resource> resources = subsystemToResources.get(subsystem); if (resources == null) { resources = new HashSet<Resource>(); subsystemToResources.put(subsystem, resources); } resources.add(resource); } private void removeResourceToSubsystem(BasicSubsystem subsystem, Resource resource) { Set<BasicSubsystem> subsystems = resourceToSubsystems.get(resource); if (subsystems == null) return; subsystems.remove(subsystem); if (subsystems.isEmpty()) resourceToSubsystems.remove(resource); } private void removeSubsystemToResource(BasicSubsystem subsystem, Resource resource) { Set<Resource> resources = subsystemToResources.get(subsystem); if (resources == null) return; resources.remove(resource); if (resources.isEmpty()) subsystemToResources.remove(subsystem); } }