mirror of https://github.com/OpenIdentityPlatform/OpenDJ.git

Jean-Noël Rouvignac
03.32.2016 eaee3f6a42c1a129f07e2364a4c32c59b9e03e19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
 * or http://forgerock.org/license/CDDLv1.0.html.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at legal-notices/CDDLv1_0.txt.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information:
 *      Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 *
 *
 *      Copyright 2008-2010 Sun Microsystems, Inc.
 *      Portions Copyright 2014-2016 ForgeRock AS
 */
package org.opends.guitools.controlpanel.ui.nodes;
 
import javax.swing.Icon;
import javax.swing.tree.DefaultMutableTreeNode;
 
import org.opends.guitools.controlpanel.browser.BasicNodeError;
import org.opends.server.types.DN;
import org.opends.server.types.LDAPURL;
import org.opends.server.types.RDN;
 
/** The basic node used to render entries in the 'Manage Entries' tree. */
public class BasicNode extends DefaultMutableTreeNode {
 
  private static final long serialVersionUID = 5441658731908509872L;
  private String localDn;
  private String localRdn;
  private String localRdnWithAttributeName;
  private LDAPURL remoteUrl;
  private String remoteRdn;
  private String remoteRdnWithAttributeName;
 
  private boolean isLeaf;
  private boolean refreshNeededOnExpansion = true;
  private boolean obsolete;
  private BasicNodeError error;
 
  private String[] referral;
  private int numSubOrdinates;
 
  /**
   * This is required for the case where there is an undefined number of
   * subordinates (for instance in the case of the changelog).
   */
  private boolean hasSubOrdinates;
 
  private String displayName;
  private Icon icon;
  private int fontStyle;
 
  private boolean sizeLimitReached;
 
  private String[] objectClassValues;
 
  /**
   * Constructor.
   * @param dn the DN of the entry.
   */
  public BasicNode(String dn) {
    localDn = dn;
    localRdn = extractRDN(localDn);
    localRdnWithAttributeName = extractRDN(localDn, true);
    isLeaf = true;
    refreshNeededOnExpansion = true;
    numSubOrdinates = -1;
    hasSubOrdinates = false;
    displayName = "";
  }
 
 
  /**
   * Returns the DN of the local entry.
   * @return the DN of the local entry.
   */
  public String getDN() {
    return localDn;
  }
 
  /**
   * Returns the RDN value of the local entry.
   * @return the RDN value of the local entry.
   */
  public String getRDN() {
    return localRdn;
  }
 
  /**
   * Returns the RDN (with the attribute name) of the local entry.
   * @return the RDN (with the attribute name) of the local entry.
   */
  public String getRDNWithAttributeName() {
    return localRdnWithAttributeName;
  }
 
  /**
   * Returns the URL of the remote entry (if the node does not represent a
   * referral it will be <CODE>null</CODE>).
   * @return the URL of the remote entry (if the node does not represent a
   * referral it will be <CODE>null</CODE>).
   */
  public LDAPURL getRemoteUrl() {
    return remoteUrl;
  }
 
  /**
   * Sets the remote URL of the node.
   * @param url the remote URL of the node.
   */
  public void setRemoteUrl(LDAPURL url) {
    remoteUrl = url;
    if (remoteUrl != null)
    {
      remoteRdn = extractRDN(remoteUrl.getRawBaseDN());
      remoteRdnWithAttributeName = extractRDN(remoteUrl.getRawBaseDN(), true);
    }
    else
    {
      remoteRdn = null;
      remoteRdnWithAttributeName = null;
    }
  }
 
  /**
   * Sets the remote URL of the node.
   * @param url the remote URL of the node.
   */
  public void setRemoteUrl(String url) {
    try
    {
      if (url == null)
      {
        remoteUrl = null;
      }
      else
      {
        remoteUrl = LDAPURL.decode(url, false);
      }
      if (remoteUrl == null) {
        remoteRdn = null;
        remoteRdnWithAttributeName = null;
      }
      else {
        remoteRdn = extractRDN(remoteUrl.getRawBaseDN());
        remoteRdnWithAttributeName = extractRDN(remoteUrl.getRawBaseDN(), true);
      }
    }
    catch (Throwable t)
    {
      throw new IllegalArgumentException(
          "The provided url: "+url+" is not valid:"+t, t);
    }
  }
 
  /**
   * Returns the RDN value of the remote entry.  If the node does not
   * represent a referral it will return <CODE>null</CODE>.
   * @return the RDN value of the remote entry.
   */
  public String getRemoteRDN() {
    return remoteRdn;
  }
 
  /**
   * Returns the RDN value of the remote entry (with the name of the attribute).
   * If the node does not represent a referral it will return <CODE>null</CODE>.
   * @return the RDN value of the remote entry (with the name of the attribute).
   */
  public String getRemoteRDNWithAttributeName() {
    return remoteRdnWithAttributeName;
  }
 
 
  /**
   * Sets whether the node is a leaf or not.
   * @param isLeaf whether the node is a leaf or not.
   */
  public void setLeaf(boolean isLeaf) {
    this.isLeaf = isLeaf;
  }
 
  /**
   * Returns <CODE>true</CODE> if the node is a leaf and <CODE>false</CODE>
   * otherwise.
   * @return <CODE>true</CODE> if the node is a leaf and <CODE>false</CODE>
   * otherwise.
   */
  @Override
  public boolean isLeaf() {
    return isLeaf;
  }
 
  /**
   * Returns <CODE>true</CODE> if the node must be refreshed when it is expanded
   * and <CODE>false</CODE> otherwise.
   * @return <CODE>true</CODE> if the node must be refreshed when it is expanded
   * and <CODE>false</CODE> otherwise.
   */
  public boolean isRefreshNeededOnExpansion() {
    return refreshNeededOnExpansion;
  }
 
  /**
   * Sets whether the node must be refreshed when it is expanded or not.
   * @param refreshNeededOnExpansion  whether the node must be refreshed when it
   * is expanded or not.
   */
  public void setRefreshNeededOnExpansion(boolean refreshNeededOnExpansion) {
    this.refreshNeededOnExpansion = refreshNeededOnExpansion;
  }
 
  /**
   * Returns whether the node is obsolete (and must be refreshed) or not.
   * @return <CODE>true</CODE> if the node is obsolete and <CODE>false</CODE>
   * otherwise.
   */
  public boolean isObsolete() {
    return obsolete;
  }
 
  /**
   * Sets whether this is node is obsolete (and must be refreshed) or not.
   * @param obsolete whether this is node is obsolete (and must be refreshed) or
   * not.
   */
  public void setObsolete(boolean obsolete) {
    this.obsolete = obsolete;
  }
 
  /**
   * Returns the error that occurred when updating the node.  Returns
   * <CODE>null</CODE> if no error occurred.
   * @return the error that occurred when updating the node.  Returns
   * <CODE>null</CODE> if no error occurred.
   */
  public BasicNodeError getError() {
    return error;
  }
 
  /**
   * Sets the error that occurred when updating the node.
   * @param error the error.
   */
  public void setError(BasicNodeError error) {
    this.error = error;
  }
 
 
  /**
   * Cached LDAP attributes
   */
 
  /**
   * Returns the number of subordinates of the entry.
   * @return the number of subordinates of the entry.
   */
  public int getNumSubOrdinates() {
    return numSubOrdinates;
  }
 
  /**
   * Sets the number of subordinates of the entry.
   * @param number the number of subordinates of the entry.
   */
  public void setNumSubOrdinates(int number) {
    numSubOrdinates = number;
  }
 
  /**
   * Returns whether the entry has subordinates or not.
   * @return {@code true} if the entry has subordinates and {@code false}
   * otherwise.
   */
  public boolean hasSubOrdinates() {
    return hasSubOrdinates;
  }
 
  /**
   * Sets the whether the entry has subordinates or not.
   * @param hasSubOrdinates whether the entry has subordinates or not.
   */
  public void setHasSubOrdinates(boolean hasSubOrdinates) {
    this.hasSubOrdinates = hasSubOrdinates;
  }
 
  /**
   * Returns the referrals of the entry. Returns <CODE>null</CODE> if this node
   * is not a referral.
   * @return the referrals of the entry. Returns <CODE>null</CODE> if this node
   * is not a referral.
   */
  public String[] getReferral() {
    return referral;
  }
 
  /**
   * Sets the referrals of the entry.
   * @param referral the referrals of the entry.
   */
  public void setReferral(String[] referral) {
    this.referral = referral;
  }
 
 
  //
  // Rendering
  //
 
  @Override
  public String toString() {
    return getDisplayName();
  }
 
  /**
   * Returns the label that will be used to display the entry.
   * @return the label that will be used to display the entry.
   */
  public String getDisplayName() {
    return displayName;
  }
 
  /**
   * Sets the label that will be used to display the entry.
   * @param name the label that will be used to display the entry.
   */
  public void setDisplayName(String name) {
    displayName = name;
  }
 
  /**
   * Returns the icon associated with this node.
   * @return the icon associated with this node.
   */
  public Icon getIcon() {
    return icon;
  }
 
 
  /**
   * Sets the icon associated with this node.
   * @param icon the icon associated with this node.
   */
  public void setIcon(Icon icon) {
    this.icon = icon;
  }
 
  /**
   * Returns the font style to be used to render this node.
   * @return the font style to be used to render this node.
   */
  public int getFontStyle() {
    return fontStyle;
  }
 
  /**
   * Sets the font style to be used to render this node.
   * @param style the font style to be used to render this node.
   */
  public void setFontStyle(int style) {
    fontStyle = style;
  }
 
 
  /**
   * Returns the object class values associated with the entry.
   * @return the object class values associated with the entry.
   */
  public String[] getObjectClassValues() {
    return objectClassValues;
  }
 
  /**
   * Sets the object class values associated with the entry.
   * @param objectClassValues the object class values associated with the entry.
   */
  public void setObjectClassValues(String[] objectClassValues) {
    this.objectClassValues = objectClassValues;
  }
 
  /**
   * Extracts the RDN value from a DN.
   * @param dn the DN.
   * @param showAttributeName whether the result must include the attribute name
   * or not.
   * @return the RDN value from the DN.
   */
  public static String extractRDN(String dn, boolean showAttributeName) {
    String result;
    if (dn == null)
    {
      result = null;
    }
    else
    {
      try
      {
        DN dnObj = DN.valueOf(dn);
        if (dnObj.size() >= 1) {
          RDN rdn = dnObj.rdn();
          if (showAttributeName)
          {
            result = rdn.toString();
          }
          else
          {
            result = rdn.getFirstAVA().getAttributeValue().toString();
          }
        }
        else {
          result = "";
        }
      }
      catch (Throwable t)
      {
        throw new IllegalArgumentException(
            "The provided argument is not a valid dn: "+t, t);
      }
    }
    return result;
  }
 
  /**
   * Extracts the RDN value from the DN.  The value does not include the name
   * of the attribute.
   * @param dn the DN.
   * @return the RDN value from the DN.
   */
  public static String extractRDN(String dn) {
    return extractRDN(dn, false);
  }
 
 
  /**
   * Returns <CODE>true</CODE> if the size limit was reached updating this node
   * (and searching its children) and <CODE>false</CODE> otherwise.
   * @return <CODE>true</CODE> if the size limit was reached updating this node
   * (and searching its children) and <CODE>false</CODE> otherwise.
   */
  public boolean isSizeLimitReached()
  {
    return sizeLimitReached;
  }
 
 
  /**
   * Sets whether the size limit was reached updating this node
   * (and searching its children).
   * @param sizeLimitReached whether the size limit was reached updating this
   * node (and searching its children).
   */
  public void setSizeLimitReached(boolean sizeLimitReached)
  {
    this.sizeLimitReached = sizeLimitReached;
  }
}