package org.apache.aries.subsystem.scope.impl;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.aries.subsystem.scope.SharePolicy;
public class SharePolicies {
private final Map<String, Map<String, List<SharePolicy>>> typeToSharePolicies = Collections.synchronizedMap(new HashMap<String, Map<String, List<SharePolicy>>>());
public SharePolicies() {
init();
}
public SharePolicies(SharePolicies sharePolicies) {
replaceAll(sharePolicies);
}
public synchronized void addSharePolicy(SharePolicy sharePolicy) {
String type = sharePolicy.getType();
Map<String, List<SharePolicy>> namespaceToSharePolicies = typeToSharePolicies.get(type);
if (namespaceToSharePolicies == null) {
namespaceToSharePolicies = Collections.synchronizedMap(new HashMap<String, List<SharePolicy>>());
typeToSharePolicies.put(type, namespaceToSharePolicies);
}
String namespace = sharePolicy.getNamespace();
List<SharePolicy> sharePolicies = namespaceToSharePolicies.get(namespace);
if (sharePolicies == null) {
sharePolicies = Collections.synchronizedList(new ArrayList<SharePolicy>());
namespaceToSharePolicies.put(namespace, sharePolicies);
}
sharePolicies.add(sharePolicy);
}
public synchronized Map<String, List<SharePolicy>> getSharePolicies(String type) {
if (!(SharePolicy.TYPE_EXPORT.equals(type) || SharePolicy.TYPE_IMPORT.equals(type))) {
throw new IllegalArgumentException(type);
}
return typeToSharePolicies.get(type);
}
public synchronized void removeSharePolicy(SharePolicy sharePolicy) {
String type = sharePolicy.getType();
Map<String, List<SharePolicy>> namespaceToSharePolicies = typeToSharePolicies.get(type);
if (namespaceToSharePolicies == null) {
return;
}
String namespace = sharePolicy.getNamespace();
List<SharePolicy> sharePolicies = namespaceToSharePolicies.get(namespace);
if (sharePolicies == null) {
return;
}
sharePolicies.remove(sharePolicy);
if (sharePolicies.isEmpty()) {
namespaceToSharePolicies.remove(namespace);
}
if (namespaceToSharePolicies.isEmpty()) {
typeToSharePolicies.remove(type);
}
}
public synchronized void replaceAll(SharePolicies sharePolicies) {
init();
synchronized (sharePolicies) {
synchronized (sharePolicies.typeToSharePolicies) {
for (String type : sharePolicies.typeToSharePolicies.keySet()) {
Map<String, List<SharePolicy>> namespaceToSharePolicies = sharePolicies.typeToSharePolicies.get(type);
synchronized (namespaceToSharePolicies) {
for (String namespace : namespaceToSharePolicies.keySet()) {
List<SharePolicy> policies = namespaceToSharePolicies.get(namespace);
synchronized (policies) {
for (SharePolicy policy : policies) {
addSharePolicy(policy);
}
}
}
}
}
}
}
}
private void init() {
typeToSharePolicies.put(SharePolicy.TYPE_EXPORT, Collections.synchronizedMap(new HashMap<String, List<SharePolicy>>()));
typeToSharePolicies.put(SharePolicy.TYPE_IMPORT, Collections.synchronizedMap(new HashMap<String, List<SharePolicy>>()));
}
}