/*
* Copyright (c) 2011 ICM Uniwersytet Warszawski All rights reserved.
* See LICENCE file for licensing information.
*/
package eu.emi.security.authn.x509.helpers.ns;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import eu.emi.security.authn.x509.helpers.ObserversHandler;
/**
* Provides an in-memory store of {@link NamespacePolicy} objects.
* The objects are matched by the subject name. This implementation is useful for Globus-like
* EACL policies.
* This class it thread safe.
*
* @author K. Benedyczak
*/
public class GlobusNamespacesStore extends AbstractGlobusNamespacesStore
{
/**
* This structure holds the complete namespaces information. The primary map key is the hash
* name of the file from which some of the policies were loaded. At the same time it is a hash of the subject
* name of the CA for which the namespaces were directly defined.
* The internal map is indexed with issuer names, i.e. the names of the CA subjects for which we have policies.
* The value is a list with all the policies for the CA, in order of appearance in the policy file.
*/
protected Map<String, Map<String, List<NamespacePolicy>>> policiesByName;
public GlobusNamespacesStore(ObserversHandler observers, boolean openssl1Mode)
{
super(observers, openssl1Mode);
policiesByName = new HashMap<String, Map<String, List<NamespacePolicy>>>(1);
}
@Override
public void setPolicies(Collection<String> locations)
{
List<NamespacePolicy> policies = new ArrayList<NamespacePolicy>();
for (String location: locations)
tryLoadNsLocation(location, policies);
setPolicies(policies);
}
protected synchronized void setPolicies(List<NamespacePolicy> policies)
{
policiesByName = new HashMap<String, Map<String, List<NamespacePolicy>>>(policies.size());
for (NamespacePolicy policy: policies)
addPolicy(policy, policiesByName);
}
@Override
protected List<NamespacePolicy> getPoliciesFor(String definedForHash, String issuerDn)
{
Map<String, List<NamespacePolicy>> policiesMap = policiesByName.get(definedForHash);
if (policiesMap == null)
return null;
return policiesMap.get(issuerDn);
}
}