1 package jsdsi;
2
3 import java.util.ArrayList;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import jsdsi.sexp.Sexp;
8 import jsdsi.sexp.SexpList;
9 import jsdsi.sexp.SexpParseException;
10 import jsdsi.sexp.SexpUtil;
11
12 /***
13 * A SDSI name: a principal and a sequence of strings. If the sequence
14 * contains just one string, this is a local name; otherwise this is an
15 * extended name.
16 *
17 * @author Sameer Ajmani
18 * @author Sean Radford
19 * @version $Revision: 1.3.2.1 $ $Date: 2005/11/08 03:12:52 $
20 */
21 public class Name extends Obj implements Subject {
22
23 private static final long serialVersionUID = 3430696653946782484L;
24
25 /***
26 * Principal of this Name.
27 */
28 private transient final Principal issuer;
29
30 /***
31 * The name string(s) for this name (more than one string for an extended
32 * name).
33 */
34 private transient final String[] names;
35
36 /***
37 * Creates a new <code>Name</code> for a given principal and an array
38 * of name-strings.
39 *
40 * @param i principal to create the <code>Name</code> for.
41 * @param n array of string-names for this <code>Name</code> (if the
42 * length of <code>n</code> is greater than 1, an extended name
43 * will be created).
44 */
45 public Name(Principal i, String[] n) {
46 assert(i != null) : "null issuer";
47 assert(n != null) : "null names";
48 assert(n.length > 0) : "empty names";
49 issuer = i;
50 names = n;
51 }
52
53 /***
54 * Creates a new local name from a given principal and name-string.
55 *
56 * @param i principal to create the <code>Name</code> for.
57 * @param n name-string to create the <code>Name</code> for.
58 */
59 public Name(Principal i, String n) {
60 this(i, new String[] { n }); // XXX assert n != null
61 }
62
63 /***
64 * Returns the principal of the <code>Name</code>.
65 *
66 * @return the principal of this <code>Name</code>.
67 */
68 public Principal getIssuer() {
69 return issuer;
70 }
71
72 /***
73 * Returns an array of name-strings of this <code>Name</code> (the
74 * array has a length of one in the case of a local name, and
75 * greater then 1 for extended names).
76 *
77 * @return an array of strings containing the name-string(s) of this
78 * name (more than one string for an extended string).
79 */
80 public String[] getNames() {
81 return names;
82 }
83
84 /***
85 * Checks if a given <code>Name</code> has the same issuer
86 * (principal) as this <code>Name</code> and if the name-strings are
87 * equal to this name's name-strings (a smaller number of
88 * name-strings are okay).
89 *
90 * @param n <code>Name</code> to compare with this <code>Name</code>.
91 * @return <code>false</code> if <code>n</code> has another issuer,
92 * a greater number of name-strings or if one name-string is not
93 * equal if a name-string from this <code>Name</code>, returns
94 * <code>true</code> otherwise.
95 */
96 public boolean prefixOf(Name n) {
97 if (!issuer.equals(n.issuer)) {
98 return false;
99 }
100 if (names.length > n.names.length) {
101 return false;
102 }
103 for (int i = 0; i < names.length; i++) {
104 if (!names[i].equals(n.names[i])) {
105 return false;
106 }
107 }
108 return true;
109 }
110
111 /***
112 * Creates a new <code>Name</code> from this <code>Name</code> using only
113 * the first <code>i</code> name-strings.
114 *
115 * @param i number of name-strings of this <code>Name</code> to use for
116 * creating a new <code>Name</code>.
117 * @return the new <code>Name</code> for the same principal as this
118 * <code>Name</code> using only the first <code>i</code>
119 * name-strings.
120 */
121 public Name prefix(int i) {
122 assert(i <= names.length) : "prefix too long";
123 String[] ns = new String[i];
124 System.arraycopy(names, 0, ns, 0, i);
125 return new Name(issuer, ns);
126 }
127
128 /***
129 * Returns the local name of this name, that is a <code>Name</code>
130 * for this <code>Name</code>s issuer with the first name-string of
131 * the list of names.
132 *
133 * @return the new local name for this <code>Name</code>.
134 */
135 public Name prefix() {
136 return prefix(1);
137 }
138
139 /***
140 * @see java.lang.Object#equals(Object)
141 */
142 public boolean equals(Object o) {
143 if (o instanceof Name) {
144 Name n = (Name) o;
145 return issuer.equals(n.issuer) && Util.equals(names, n.names);
146 }
147 return false;
148 }
149
150 /***
151 * @see java.lang.Object#hashCode()
152 */
153 public int hashCode() {
154 return issuer.hashCode() ^ Util.hashCode(names);
155 }
156
157 public SexpList toSexp() {
158 // TODO: implement this method
159 return toSexp((Principal) null);
160 }
161
162 /***
163 * Returns an <code>SexpList</code>-representation of the given
164 * <code>Principal</code>.
165 *
166 * @param iss the <code>Principal</code> to create an
167 * <code>SexpList</code> from.
168 * @return an <code>SexpList</code>-representation of <code>iss</code>.
169 */
170 public SexpList toSexp(Principal iss) {
171 List l = new ArrayList();
172 if (!getIssuer().samePrincipalAs(iss)) {
173 // make fully-qualified name
174 l.add(getIssuer().toSexp());
175 }
176 for (int i = 0; i < names.length; i++) {
177 l.add(SexpUtil.toSexp(names[i]));
178 }
179 return SexpUtil.toSexp("name", l);
180 }
181
182 /***
183 * Parses an <code>SexpList</code> to create a <code>Name</code>
184 * from it.
185 *
186 * @param l the <code>SexpList</code> that holds a <code>Name</code>.
187 * @return a <code>Name</code> created from the values in <code>l</code>
188 * @throws SexpParseException
189 */
190 static Name parseName(SexpList l) throws SexpParseException {
191 return parseName(l, null);
192 }
193
194 /***
195 * Parses a name from a given <code>SexpList</code> and
196 * <code>Principal</code>.
197 *
198 * @param l the <code>SexpList</code> to parse.
199 * @param issuerParam the <code>Principal</code> that is the issuer
200 * of the <code>Name</code>.
201 * @return the <code>Name</code> created from <code>l</code> and
202 * <code>issuerParm</code>.
203 * @throws SexpParseException
204 */
205 static Name parseName(SexpList l, Principal issuerParam)
206 throws SexpParseException {
207 Iterator nbody = SexpUtil.getBody(l);
208 Sexp s = SexpUtil.getNext(nbody, "first name component");
209 Principal issuer = null;
210 String[] names = null;
211 if (s instanceof SexpList) {
212 // name is fully-qualified
213 issuer = Principal.parsePrincipal(SexpUtil.getList(s));
214 names = new String[l.size() - 2];
215 for (int i = 0; i < names.length; i++) {
216 names[i] = SexpUtil.getNextString(nbody, "name string #" + i);
217 }
218 } else if (issuerParam != null) {
219 // name is relative; issuer provided as a parameter
220 issuer = issuerParam;
221 names = new String[l.size() - 1];
222 names[0] = SexpUtil.getString(s);
223 for (int i = 1; i < names.length; i++) {
224 names[i] = SexpUtil.getNextString(nbody, "name string #" + i);
225 }
226 } else {
227 throw new SexpParseException("relative name used without issuer");
228 }
229 SexpUtil.checkDone(nbody, "name"); // sanity check
230 return new Name(issuer, names);
231 }
232
233 // TODO: boolean sameNameAs(Name n)
234 // TODO: boolean sameNameAs(Principal i, String n)
235 }
This page was automatically generated by Maven