1e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompackage org.bouncycastle.cms;
2e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
3e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.ArrayList;
4e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Collection;
5e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.HashMap;
6e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Iterator;
7e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.List;
8e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstromimport java.util.Map;
9e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
10028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giroimport org.bouncycastle.util.Iterable;
11028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro
12e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrompublic class SignerInformationStore
13028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    implements Iterable<SignerInformation>
14e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom{
15a198e1ecc615e26a167d0f2dca9fa7e5fc62de10Brian Carlstrom    private List all = new ArrayList();
16e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    private Map table = new HashMap();
17e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
18028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    /**
19028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     * Create a store containing a single SignerInformation object.
20028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     *
21028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     * @param signerInfo the signer information to contain.
22028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     */
23028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    public SignerInformationStore(
24028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        SignerInformation  signerInfo)
25028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    {
26028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        this.all = new ArrayList(1);
27028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        this.all.add(signerInfo);
28028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro
29028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        SignerId sid = signerInfo.getSID();
30028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro
31028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        table.put(sid, all);
32028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    }
33028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro
34028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    /**
35028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     * Create a store containing a collection of SignerInformation objects.
36028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     *
37028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     * @param signerInfos a collection signer information objects to contain.
38028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     */
39e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignerInformationStore(
40028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        Collection<SignerInformation>  signerInfos)
41e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
42e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Iterator    it = signerInfos.iterator();
43e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
44e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        while (it.hasNext())
45e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
46e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            SignerInformation   signer = (SignerInformation)it.next();
47e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            SignerId            sid = signer.getSID();
48e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
49e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            List list = (ArrayList)table.get(sid);
50e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (list == null)
51e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
52e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                list = new ArrayList(1);
53e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                table.put(sid, list);
54e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
55e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
56e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            list.add(signer);
57e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
58e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
59e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        this.all = new ArrayList(signerInfos);
60e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
61e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
62e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
63e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return the first SignerInformation object that matches the
64e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * passed in selector. Null if there are no matches.
65e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
66e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param selector to identify a signer
67e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return a single SignerInformation object. Null if none matches.
68e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
69e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public SignerInformation get(
70e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        SignerId        selector)
71e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
72e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        Collection list = getSigners(selector);
73e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
74e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return list.size() == 0 ? null : (SignerInformation) list.iterator().next();
75e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
76e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
77e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
78e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return the number of signers in the collection.
79e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
80e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return number of signers identified.
81e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
82e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    public int size()
83e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
84e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return all.size();
85e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
86e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
87e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
88e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return all signers in the collection
89e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
90e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return a collection of signers.
91e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
92028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    public Collection<SignerInformation> getSigners()
93e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
94e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        return new ArrayList(all);
95e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
96e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
97e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    /**
98e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * Return possible empty collection with signers matching the passed in SignerId
99e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     *
100e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @param selector a signer id to select against.
101e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     * @return a collection of SignerInformation objects.
102e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom     */
103028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    public Collection<SignerInformation> getSigners(
104e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        SignerId selector)
105e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    {
106e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        if (selector.getIssuer() != null && selector.getSubjectKeyIdentifier() != null)
107e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
108e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            List results = new ArrayList();
109e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
110e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Collection match1 = getSigners(new SignerId(selector.getIssuer(), selector.getSerialNumber()));
111e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
112e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (match1 != null)
113e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
114e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                results.addAll(match1);
115e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
116e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
117e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            Collection match2 = getSigners(new SignerId(selector.getSubjectKeyIdentifier()));
118e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
119e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            if (match2 != null)
120e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            {
121e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom                results.addAll(match2);
122e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            }
123e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
124e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return results;
125e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
126e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        else
127e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        {
128e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            List list = (ArrayList)table.get(selector);
129e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom
130e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom            return list == null ? new ArrayList() : new ArrayList(list);
131e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom        }
132e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom    }
133028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro
134028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    /**
135028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     * Support method for Iterable where available.
136028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro     */
137028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    public Iterator<SignerInformation> iterator()
138028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    {
139028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro        return getSigners().iterator();
140028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    }
141e6bf3e8dfa2804891a82075cb469b736321b4827Brian Carlstrom}
142