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