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