001/*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License").  You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
010 * or http://forgerock.org/license/CDDLv1.0.html.
011 * See the License for the specific language governing permissions
012 * and limitations under the License.
013 *
014 * When distributing Covered Code, include this CDDL HEADER in each
015 * file and include the License file at legal-notices/CDDLv1_0.txt.
016 * If applicable, add the following below this CDDL HEADER, with the
017 * fields enclosed by brackets "[]" replaced with your own identifying
018 * information:
019 *      Portions Copyright [yyyy] [name of copyright owner]
020 *
021 * CDDL HEADER END
022 *
023 *
024 *      Copyright 2008 Sun Microsystems, Inc.
025 */
026package org.forgerock.opendj.server.config.meta;
027
028
029
030import java.util.Collection;
031import java.util.SortedSet;
032import org.forgerock.opendj.config.AdministratorAction;
033import org.forgerock.opendj.config.AliasDefaultBehaviorProvider;
034import org.forgerock.opendj.config.AttributeTypePropertyDefinition;
035import org.forgerock.opendj.config.BooleanPropertyDefinition;
036import org.forgerock.opendj.config.ClassPropertyDefinition;
037import org.forgerock.opendj.config.client.ConcurrentModificationException;
038import org.forgerock.opendj.config.client.ManagedObject;
039import org.forgerock.opendj.config.client.MissingMandatoryPropertiesException;
040import org.forgerock.opendj.config.client.OperationRejectedException;
041import org.forgerock.opendj.config.DefaultBehaviorProvider;
042import org.forgerock.opendj.config.DefinedDefaultBehaviorProvider;
043import org.forgerock.opendj.config.DNPropertyDefinition;
044import org.forgerock.opendj.config.EnumPropertyDefinition;
045import org.forgerock.opendj.config.ManagedObjectAlreadyExistsException;
046import org.forgerock.opendj.config.ManagedObjectDefinition;
047import org.forgerock.opendj.config.PropertyOption;
048import org.forgerock.opendj.config.PropertyProvider;
049import org.forgerock.opendj.config.server.ConfigurationChangeListener;
050import org.forgerock.opendj.config.server.ServerManagedObject;
051import org.forgerock.opendj.config.StringPropertyDefinition;
052import org.forgerock.opendj.config.Tag;
053import org.forgerock.opendj.config.TopCfgDefn;
054import org.forgerock.opendj.config.UndefinedDefaultBehaviorProvider;
055import org.forgerock.opendj.ldap.DN;
056import org.forgerock.opendj.ldap.LdapException;
057import org.forgerock.opendj.ldap.schema.AttributeType;
058import org.forgerock.opendj.server.config.client.VirtualAttributeCfgClient;
059import org.forgerock.opendj.server.config.server.VirtualAttributeCfg;
060
061
062
063/**
064 * An interface for querying the Virtual Attribute managed object
065 * definition meta information.
066 * <p>
067 * Virtual Attributes are responsible for dynamically generating
068 * attribute values that appear in entries but are not persistently
069 * stored in the backend.
070 */
071public final class VirtualAttributeCfgDefn extends ManagedObjectDefinition<VirtualAttributeCfgClient, VirtualAttributeCfg> {
072
073  /** The singleton configuration definition instance. */
074  private static final VirtualAttributeCfgDefn INSTANCE = new VirtualAttributeCfgDefn();
075
076
077
078  /**
079   * Defines the set of permissable values for the "conflict-behavior" property.
080   * <p>
081   * Specifies the behavior that the server is to exhibit for entries
082   * that already contain one or more real values for the associated
083   * attribute.
084   */
085  public static enum ConflictBehavior {
086
087    /**
088     * Indicates that the virtual attribute provider is to preserve
089     * any real values contained in the entry and merge them with the
090     * set of generated virtual values so that both the real and
091     * virtual values are used.
092     */
093    MERGE_REAL_AND_VIRTUAL("merge-real-and-virtual"),
094
095
096
097    /**
098     * Indicates that any real values contained in the entry are
099     * preserved and used, and virtual values are not generated.
100     */
101    REAL_OVERRIDES_VIRTUAL("real-overrides-virtual"),
102
103
104
105    /**
106     * Indicates that the virtual attribute provider suppresses any
107     * real values contained in the entry and generates virtual values
108     * and uses them.
109     */
110    VIRTUAL_OVERRIDES_REAL("virtual-overrides-real");
111
112
113
114    /** String representation of the value. */
115    private final String name;
116
117
118
119    /** Private constructor. */
120    private ConflictBehavior(String name) { this.name = name; }
121
122
123
124    /** {@inheritDoc} */
125    public String toString() { return name; }
126
127  }
128
129
130
131  /**
132   * Defines the set of permissable values for the "scope" property.
133   * <p>
134   * Specifies the LDAP scope associated with base DNs for entries
135   * that are eligible to use this virtual attribute.
136   */
137  public static enum Scope {
138
139    /**
140     * Search the base object only.
141     */
142    BASE_OBJECT("base-object"),
143
144
145
146    /**
147     * Search the immediate children of the base object but do not
148     * include any of their descendants or the base object itself.
149     */
150    SINGLE_LEVEL("single-level"),
151
152
153
154    /**
155     * Search the entire subtree below the base object but do not
156     * include the base object itself.
157     */
158    SUBORDINATE_SUBTREE("subordinate-subtree"),
159
160
161
162    /**
163     * Search the base object and the entire subtree below the base
164     * object.
165     */
166    WHOLE_SUBTREE("whole-subtree");
167
168
169
170    /** String representation of the value. */
171    private final String name;
172
173
174
175    /** Private constructor. */
176    private Scope(String name) { this.name = name; }
177
178
179
180    /** {@inheritDoc} */
181    public String toString() { return name; }
182
183  }
184
185
186
187  /** The "attribute-type" property definition. */
188  private static final AttributeTypePropertyDefinition PD_ATTRIBUTE_TYPE;
189
190
191
192  /** The "base-dn" property definition. */
193  private static final DNPropertyDefinition PD_BASE_DN;
194
195
196
197  /** The "conflict-behavior" property definition. */
198  private static final EnumPropertyDefinition<ConflictBehavior> PD_CONFLICT_BEHAVIOR;
199
200
201
202  /** The "enabled" property definition. */
203  private static final BooleanPropertyDefinition PD_ENABLED;
204
205
206
207  /** The "filter" property definition. */
208  private static final StringPropertyDefinition PD_FILTER;
209
210
211
212  /** The "group-dn" property definition. */
213  private static final DNPropertyDefinition PD_GROUP_DN;
214
215
216
217  /** The "java-class" property definition. */
218  private static final ClassPropertyDefinition PD_JAVA_CLASS;
219
220
221
222  /** The "scope" property definition. */
223  private static final EnumPropertyDefinition<Scope> PD_SCOPE;
224
225
226
227  /** Build the "attribute-type" property definition. */
228  static {
229      AttributeTypePropertyDefinition.Builder builder = AttributeTypePropertyDefinition.createBuilder(INSTANCE, "attribute-type");
230      builder.setOption(PropertyOption.MANDATORY);
231      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "attribute-type"));
232      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<AttributeType>());
233      PD_ATTRIBUTE_TYPE = builder.getInstance();
234      INSTANCE.registerPropertyDefinition(PD_ATTRIBUTE_TYPE);
235  }
236
237
238
239  /** Build the "base-dn" property definition. */
240  static {
241      DNPropertyDefinition.Builder builder = DNPropertyDefinition.createBuilder(INSTANCE, "base-dn");
242      builder.setOption(PropertyOption.MULTI_VALUED);
243      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "base-dn"));
244      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<DN>(INSTANCE, "base-dn"));
245      PD_BASE_DN = builder.getInstance();
246      INSTANCE.registerPropertyDefinition(PD_BASE_DN);
247  }
248
249
250
251  /** Build the "conflict-behavior" property definition. */
252  static {
253      EnumPropertyDefinition.Builder<ConflictBehavior> builder = EnumPropertyDefinition.createBuilder(INSTANCE, "conflict-behavior");
254      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "conflict-behavior"));
255      DefaultBehaviorProvider<ConflictBehavior> provider = new DefinedDefaultBehaviorProvider<ConflictBehavior>("real-overrides-virtual");
256      builder.setDefaultBehaviorProvider(provider);
257      builder.setEnumClass(ConflictBehavior.class);
258      PD_CONFLICT_BEHAVIOR = builder.getInstance();
259      INSTANCE.registerPropertyDefinition(PD_CONFLICT_BEHAVIOR);
260  }
261
262
263
264  /** Build the "enabled" property definition. */
265  static {
266      BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "enabled");
267      builder.setOption(PropertyOption.MANDATORY);
268      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "enabled"));
269      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<Boolean>());
270      PD_ENABLED = builder.getInstance();
271      INSTANCE.registerPropertyDefinition(PD_ENABLED);
272  }
273
274
275
276  /** Build the "filter" property definition. */
277  static {
278      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "filter");
279      builder.setOption(PropertyOption.MULTI_VALUED);
280      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "filter"));
281      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("(objectClass=*)");
282      builder.setDefaultBehaviorProvider(provider);
283      builder.setPattern(".*", "STRING");
284      PD_FILTER = builder.getInstance();
285      INSTANCE.registerPropertyDefinition(PD_FILTER);
286  }
287
288
289
290  /** Build the "group-dn" property definition. */
291  static {
292      DNPropertyDefinition.Builder builder = DNPropertyDefinition.createBuilder(INSTANCE, "group-dn");
293      builder.setOption(PropertyOption.MULTI_VALUED);
294      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "group-dn"));
295      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<DN>(INSTANCE, "group-dn"));
296      PD_GROUP_DN = builder.getInstance();
297      INSTANCE.registerPropertyDefinition(PD_GROUP_DN);
298  }
299
300
301
302  /** Build the "java-class" property definition. */
303  static {
304      ClassPropertyDefinition.Builder builder = ClassPropertyDefinition.createBuilder(INSTANCE, "java-class");
305      builder.setOption(PropertyOption.MANDATORY);
306      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "java-class"));
307      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>());
308      builder.addInstanceOf("org.opends.server.api.VirtualAttributeProvider");
309      PD_JAVA_CLASS = builder.getInstance();
310      INSTANCE.registerPropertyDefinition(PD_JAVA_CLASS);
311  }
312
313
314
315  /** Build the "scope" property definition. */
316  static {
317      EnumPropertyDefinition.Builder<Scope> builder = EnumPropertyDefinition.createBuilder(INSTANCE, "scope");
318      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "scope"));
319      DefaultBehaviorProvider<Scope> provider = new DefinedDefaultBehaviorProvider<Scope>("whole-subtree");
320      builder.setDefaultBehaviorProvider(provider);
321      builder.setEnumClass(Scope.class);
322      PD_SCOPE = builder.getInstance();
323      INSTANCE.registerPropertyDefinition(PD_SCOPE);
324  }
325
326
327
328  // Register the tags associated with this managed object definition.
329  static {
330    INSTANCE.registerTag(Tag.valueOf("core-server"));
331  }
332
333
334
335  /**
336   * Get the Virtual Attribute configuration definition singleton.
337   *
338   * @return Returns the Virtual Attribute configuration definition
339   *         singleton.
340   */
341  public static VirtualAttributeCfgDefn getInstance() {
342    return INSTANCE;
343  }
344
345
346
347  /**
348   * Private constructor.
349   */
350  private VirtualAttributeCfgDefn() {
351    super("virtual-attribute", TopCfgDefn.getInstance());
352  }
353
354
355
356  /** {@inheritDoc} */
357  public VirtualAttributeCfgClient createClientConfiguration(
358      ManagedObject<? extends VirtualAttributeCfgClient> impl) {
359    return new VirtualAttributeCfgClientImpl(impl);
360  }
361
362
363
364  /** {@inheritDoc} */
365  public VirtualAttributeCfg createServerConfiguration(
366      ServerManagedObject<? extends VirtualAttributeCfg> impl) {
367    return new VirtualAttributeCfgServerImpl(impl);
368  }
369
370
371
372  /** {@inheritDoc} */
373  public Class<VirtualAttributeCfg> getServerConfigurationClass() {
374    return VirtualAttributeCfg.class;
375  }
376
377
378
379  /**
380   * Get the "attribute-type" property definition.
381   * <p>
382   * Specifies the attribute type for the attribute whose values are
383   * to be dynamically assigned by the virtual attribute.
384   *
385   * @return Returns the "attribute-type" property definition.
386   */
387  public AttributeTypePropertyDefinition getAttributeTypePropertyDefinition() {
388    return PD_ATTRIBUTE_TYPE;
389  }
390
391
392
393  /**
394   * Get the "base-dn" property definition.
395   * <p>
396   * Specifies the base DNs for the branches containing entries that
397   * are eligible to use this virtual attribute.
398   * <p>
399   * If no values are given, then the server generates virtual
400   * attributes anywhere in the server.
401   *
402   * @return Returns the "base-dn" property definition.
403   */
404  public DNPropertyDefinition getBaseDNPropertyDefinition() {
405    return PD_BASE_DN;
406  }
407
408
409
410  /**
411   * Get the "conflict-behavior" property definition.
412   * <p>
413   * Specifies the behavior that the server is to exhibit for entries
414   * that already contain one or more real values for the associated
415   * attribute.
416   *
417   * @return Returns the "conflict-behavior" property definition.
418   */
419  public EnumPropertyDefinition<ConflictBehavior> getConflictBehaviorPropertyDefinition() {
420    return PD_CONFLICT_BEHAVIOR;
421  }
422
423
424
425  /**
426   * Get the "enabled" property definition.
427   * <p>
428   * Indicates whether the Virtual Attribute is enabled for use.
429   *
430   * @return Returns the "enabled" property definition.
431   */
432  public BooleanPropertyDefinition getEnabledPropertyDefinition() {
433    return PD_ENABLED;
434  }
435
436
437
438  /**
439   * Get the "filter" property definition.
440   * <p>
441   * Specifies the search filters to be applied against entries to
442   * determine if the virtual attribute is to be generated for those
443   * entries.
444   * <p>
445   * If no values are given, then any entry is eligible to have the
446   * value generated. If one or more filters are specified, then only
447   * entries that match at least one of those filters are allowed to
448   * have the virtual attribute.
449   *
450   * @return Returns the "filter" property definition.
451   */
452  public StringPropertyDefinition getFilterPropertyDefinition() {
453    return PD_FILTER;
454  }
455
456
457
458  /**
459   * Get the "group-dn" property definition.
460   * <p>
461   * Specifies the DNs of the groups whose members can be eligible to
462   * use this virtual attribute.
463   * <p>
464   * If no values are given, then group membership is not taken into
465   * account when generating the virtual attribute. If one or more
466   * group DNs are specified, then only members of those groups are
467   * allowed to have the virtual attribute.
468   *
469   * @return Returns the "group-dn" property definition.
470   */
471  public DNPropertyDefinition getGroupDNPropertyDefinition() {
472    return PD_GROUP_DN;
473  }
474
475
476
477  /**
478   * Get the "java-class" property definition.
479   * <p>
480   * Specifies the fully-qualified name of the virtual attribute
481   * provider class that generates the attribute values.
482   *
483   * @return Returns the "java-class" property definition.
484   */
485  public ClassPropertyDefinition getJavaClassPropertyDefinition() {
486    return PD_JAVA_CLASS;
487  }
488
489
490
491  /**
492   * Get the "scope" property definition.
493   * <p>
494   * Specifies the LDAP scope associated with base DNs for entries
495   * that are eligible to use this virtual attribute.
496   *
497   * @return Returns the "scope" property definition.
498   */
499  public EnumPropertyDefinition<Scope> getScopePropertyDefinition() {
500    return PD_SCOPE;
501  }
502
503
504
505  /**
506   * Managed object client implementation.
507   */
508  private static class VirtualAttributeCfgClientImpl implements
509    VirtualAttributeCfgClient {
510
511    /** Private implementation. */
512    private ManagedObject<? extends VirtualAttributeCfgClient> impl;
513
514
515
516    /** Private constructor. */
517    private VirtualAttributeCfgClientImpl(
518        ManagedObject<? extends VirtualAttributeCfgClient> impl) {
519      this.impl = impl;
520    }
521
522
523
524    /** {@inheritDoc} */
525    public AttributeType getAttributeType() {
526      return impl.getPropertyValue(INSTANCE.getAttributeTypePropertyDefinition());
527    }
528
529
530
531    /** {@inheritDoc} */
532    public void setAttributeType(AttributeType value) {
533      impl.setPropertyValue(INSTANCE.getAttributeTypePropertyDefinition(), value);
534    }
535
536
537
538    /** {@inheritDoc} */
539    public SortedSet<DN> getBaseDN() {
540      return impl.getPropertyValues(INSTANCE.getBaseDNPropertyDefinition());
541    }
542
543
544
545    /** {@inheritDoc} */
546    public void setBaseDN(Collection<DN> values) {
547      impl.setPropertyValues(INSTANCE.getBaseDNPropertyDefinition(), values);
548    }
549
550
551
552    /** {@inheritDoc} */
553    public ConflictBehavior getConflictBehavior() {
554      return impl.getPropertyValue(INSTANCE.getConflictBehaviorPropertyDefinition());
555    }
556
557
558
559    /** {@inheritDoc} */
560    public void setConflictBehavior(ConflictBehavior value) {
561      impl.setPropertyValue(INSTANCE.getConflictBehaviorPropertyDefinition(), value);
562    }
563
564
565
566    /** {@inheritDoc} */
567    public Boolean isEnabled() {
568      return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
569    }
570
571
572
573    /** {@inheritDoc} */
574    public void setEnabled(boolean value) {
575      impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value);
576    }
577
578
579
580    /** {@inheritDoc} */
581    public SortedSet<String> getFilter() {
582      return impl.getPropertyValues(INSTANCE.getFilterPropertyDefinition());
583    }
584
585
586
587    /** {@inheritDoc} */
588    public void setFilter(Collection<String> values) {
589      impl.setPropertyValues(INSTANCE.getFilterPropertyDefinition(), values);
590    }
591
592
593
594    /** {@inheritDoc} */
595    public SortedSet<DN> getGroupDN() {
596      return impl.getPropertyValues(INSTANCE.getGroupDNPropertyDefinition());
597    }
598
599
600
601    /** {@inheritDoc} */
602    public void setGroupDN(Collection<DN> values) {
603      impl.setPropertyValues(INSTANCE.getGroupDNPropertyDefinition(), values);
604    }
605
606
607
608    /** {@inheritDoc} */
609    public String getJavaClass() {
610      return impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
611    }
612
613
614
615    /** {@inheritDoc} */
616    public void setJavaClass(String value) {
617      impl.setPropertyValue(INSTANCE.getJavaClassPropertyDefinition(), value);
618    }
619
620
621
622    /** {@inheritDoc} */
623    public Scope getScope() {
624      return impl.getPropertyValue(INSTANCE.getScopePropertyDefinition());
625    }
626
627
628
629    /** {@inheritDoc} */
630    public void setScope(Scope value) {
631      impl.setPropertyValue(INSTANCE.getScopePropertyDefinition(), value);
632    }
633
634
635
636    /** {@inheritDoc} */
637    public ManagedObjectDefinition<? extends VirtualAttributeCfgClient, ? extends VirtualAttributeCfg> definition() {
638      return INSTANCE;
639    }
640
641
642
643    /** {@inheritDoc} */
644    public PropertyProvider properties() {
645      return impl;
646    }
647
648
649
650    /** {@inheritDoc} */
651    public void commit() throws ManagedObjectAlreadyExistsException,
652        MissingMandatoryPropertiesException, ConcurrentModificationException,
653        OperationRejectedException, LdapException {
654      impl.commit();
655    }
656
657
658
659    /** {@inheritDoc} */
660    public String toString() {
661      return impl.toString();
662    }
663  }
664
665
666
667  /**
668   * Managed object server implementation.
669   */
670  private static class VirtualAttributeCfgServerImpl implements
671    VirtualAttributeCfg {
672
673    /** Private implementation. */
674    private ServerManagedObject<? extends VirtualAttributeCfg> impl;
675
676    /** The value of the "attribute-type" property. */
677    private final AttributeType pAttributeType;
678
679    /** The value of the "base-dn" property. */
680    private final SortedSet<DN> pBaseDN;
681
682    /** The value of the "conflict-behavior" property. */
683    private final ConflictBehavior pConflictBehavior;
684
685    /** The value of the "enabled" property. */
686    private final boolean pEnabled;
687
688    /** The value of the "filter" property. */
689    private final SortedSet<String> pFilter;
690
691    /** The value of the "group-dn" property. */
692    private final SortedSet<DN> pGroupDN;
693
694    /** The value of the "java-class" property. */
695    private final String pJavaClass;
696
697    /** The value of the "scope" property. */
698    private final Scope pScope;
699
700
701
702    /** Private constructor. */
703    private VirtualAttributeCfgServerImpl(ServerManagedObject<? extends VirtualAttributeCfg> impl) {
704      this.impl = impl;
705      this.pAttributeType = impl.getPropertyValue(INSTANCE.getAttributeTypePropertyDefinition());
706      this.pBaseDN = impl.getPropertyValues(INSTANCE.getBaseDNPropertyDefinition());
707      this.pConflictBehavior = impl.getPropertyValue(INSTANCE.getConflictBehaviorPropertyDefinition());
708      this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
709      this.pFilter = impl.getPropertyValues(INSTANCE.getFilterPropertyDefinition());
710      this.pGroupDN = impl.getPropertyValues(INSTANCE.getGroupDNPropertyDefinition());
711      this.pJavaClass = impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
712      this.pScope = impl.getPropertyValue(INSTANCE.getScopePropertyDefinition());
713    }
714
715
716
717    /** {@inheritDoc} */
718    public void addChangeListener(
719        ConfigurationChangeListener<VirtualAttributeCfg> listener) {
720      impl.registerChangeListener(listener);
721    }
722
723
724
725    /** {@inheritDoc} */
726    public void removeChangeListener(
727        ConfigurationChangeListener<VirtualAttributeCfg> listener) {
728      impl.deregisterChangeListener(listener);
729    }
730
731
732
733    /** {@inheritDoc} */
734    public AttributeType getAttributeType() {
735      return pAttributeType;
736    }
737
738
739
740    /** {@inheritDoc} */
741    public SortedSet<DN> getBaseDN() {
742      return pBaseDN;
743    }
744
745
746
747    /** {@inheritDoc} */
748    public ConflictBehavior getConflictBehavior() {
749      return pConflictBehavior;
750    }
751
752
753
754    /** {@inheritDoc} */
755    public boolean isEnabled() {
756      return pEnabled;
757    }
758
759
760
761    /** {@inheritDoc} */
762    public SortedSet<String> getFilter() {
763      return pFilter;
764    }
765
766
767
768    /** {@inheritDoc} */
769    public SortedSet<DN> getGroupDN() {
770      return pGroupDN;
771    }
772
773
774
775    /** {@inheritDoc} */
776    public String getJavaClass() {
777      return pJavaClass;
778    }
779
780
781
782    /** {@inheritDoc} */
783    public Scope getScope() {
784      return pScope;
785    }
786
787
788
789    /** {@inheritDoc} */
790    public Class<? extends VirtualAttributeCfg> configurationClass() {
791      return VirtualAttributeCfg.class;
792    }
793
794
795
796    /** {@inheritDoc} */
797    public DN dn() {
798      return impl.getDN();
799    }
800
801
802
803    /** {@inheritDoc} */
804    public String toString() {
805      return impl.toString();
806    }
807  }
808}