/** * Licensed to the Austrian Association for Software Tool Integration (AASTI) * under one or more contributor license agreements. See the NOTICE file * distributed with this work for additional information regarding copyright * ownership. The AASTI licenses this file to you 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.openengsb.core.common; import java.io.File; import java.util.Collections; import java.util.Iterator; import java.util.Map; import java.util.Set; import com.google.common.collect.Maps; import com.google.common.collect.Sets; public class ReferenceCounter<T> { private Map<T, Set<File>> dataByValue = Maps.newHashMap(); private Map<File, Set<T>> dataByFile = Maps.newHashMap(); public synchronized void addReference(File artifact, T object) { Set<File> fileList = dataByValue.get(object); if (fileList == null) { fileList = Sets.newHashSet(); dataByValue.put(object, fileList); } fileList.add(artifact); Set<T> valueList = dataByFile.get(artifact); if (valueList == null) { valueList = Sets.newHashSet(); dataByFile.put(artifact, valueList); } valueList.add(object); } public synchronized void removeReference(File artifact, T object) { if (!dataByValue.containsKey(object)) { return; } if (!dataByFile.containsKey(artifact)) { return; } Set<T> collection = dataByFile.get(artifact); collection.remove(object); if (collection.isEmpty()) { dataByFile.remove(artifact); } Set<File> fileList = dataByValue.get(object); fileList.remove(artifact); if (fileList.isEmpty()) { dataByValue.remove(object); } } public synchronized Set<T> removeFile(File artifact) { Set<T> valueSet = dataByFile.get(artifact); if (valueSet == null) { return Collections.emptySet(); } Set<T> garbage = Sets.newHashSet(valueSet); for (Iterator<T> iterator = valueSet.iterator(); iterator.hasNext();) { T r = iterator.next(); Set<File> fileList = dataByValue.get(r); fileList.remove(artifact); if (fileList.isEmpty()) { iterator.remove(); } else { garbage.remove(r); } } return garbage; } }