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
010     * trunk/opends/resource/legal-notices/OpenDS.LICENSE
011     * or https://OpenDS.dev.java.net/OpenDS.LICENSE.
012     * See the License for the specific language governing permissions
013     * and limitations under the License.
014     *
015     * When distributing Covered Code, include this CDDL HEADER in each
016     * file and include the License file at
017     * trunk/opends/resource/legal-notices/OpenDS.LICENSE.  If applicable,
018     * add the following below this CDDL HEADER, with the fields enclosed
019     * by brackets "[]" replaced with your own identifying information:
020     *      Portions Copyright [yyyy] [name of copyright owner]
021     *
022     * CDDL HEADER END
023     *
024     *
025     *      Copyright 2008 Sun Microsystems, Inc.
026     */
027    package org.opends.server.admin.std.meta;
028    
029    
030    
031    import java.util.Collection;
032    import java.util.SortedSet;
033    import org.opends.server.admin.AdministratorAction;
034    import org.opends.server.admin.AliasDefaultBehaviorProvider;
035    import org.opends.server.admin.AttributeTypePropertyDefinition;
036    import org.opends.server.admin.BooleanPropertyDefinition;
037    import org.opends.server.admin.ClassPropertyDefinition;
038    import org.opends.server.admin.client.AuthorizationException;
039    import org.opends.server.admin.client.CommunicationException;
040    import org.opends.server.admin.client.ConcurrentModificationException;
041    import org.opends.server.admin.client.ManagedObject;
042    import org.opends.server.admin.client.MissingMandatoryPropertiesException;
043    import org.opends.server.admin.client.OperationRejectedException;
044    import org.opends.server.admin.DefaultBehaviorProvider;
045    import org.opends.server.admin.DefinedDefaultBehaviorProvider;
046    import org.opends.server.admin.DNPropertyDefinition;
047    import org.opends.server.admin.EnumPropertyDefinition;
048    import org.opends.server.admin.ManagedObjectAlreadyExistsException;
049    import org.opends.server.admin.ManagedObjectDefinition;
050    import org.opends.server.admin.PropertyOption;
051    import org.opends.server.admin.PropertyProvider;
052    import org.opends.server.admin.server.ConfigurationChangeListener;
053    import org.opends.server.admin.server.ServerManagedObject;
054    import org.opends.server.admin.std.client.UniqueAttributePluginCfgClient;
055    import org.opends.server.admin.std.meta.PluginCfgDefn.PluginType;
056    import org.opends.server.admin.std.server.PluginCfg;
057    import org.opends.server.admin.std.server.UniqueAttributePluginCfg;
058    import org.opends.server.admin.Tag;
059    import org.opends.server.admin.UndefinedDefaultBehaviorProvider;
060    import org.opends.server.types.AttributeType;
061    import org.opends.server.types.DN;
062    
063    
064    
065    /**
066     * An interface for querying the Unique Attribute Plugin managed
067     * object definition meta information.
068     * <p>
069     * The Unique Attribute Plugin enforces constraints on the value of an
070     * attribute within a portion of the directory.
071     */
072    public final class UniqueAttributePluginCfgDefn extends ManagedObjectDefinition<UniqueAttributePluginCfgClient, UniqueAttributePluginCfg> {
073    
074      // The singleton configuration definition instance.
075      private static final UniqueAttributePluginCfgDefn INSTANCE = new UniqueAttributePluginCfgDefn();
076    
077    
078    
079      // The "base-dn" property definition.
080      private static final DNPropertyDefinition PD_BASE_DN;
081    
082    
083    
084      // The "java-class" property definition.
085      private static final ClassPropertyDefinition PD_JAVA_CLASS;
086    
087    
088    
089      // The "plugin-type" property definition.
090      private static final EnumPropertyDefinition<PluginType> PD_PLUGIN_TYPE;
091    
092    
093    
094      // The "type" property definition.
095      private static final AttributeTypePropertyDefinition PD_TYPE;
096    
097    
098    
099      // Build the "base-dn" property definition.
100      static {
101          DNPropertyDefinition.Builder builder = DNPropertyDefinition.createBuilder(INSTANCE, "base-dn");
102          builder.setOption(PropertyOption.MULTI_VALUED);
103          builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "base-dn"));
104          builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<DN>(INSTANCE, "base-dn"));
105          PD_BASE_DN = builder.getInstance();
106          INSTANCE.registerPropertyDefinition(PD_BASE_DN);
107      }
108    
109    
110    
111      // Build the "java-class" property definition.
112      static {
113          ClassPropertyDefinition.Builder builder = ClassPropertyDefinition.createBuilder(INSTANCE, "java-class");
114          builder.setOption(PropertyOption.MANDATORY);
115          builder.setOption(PropertyOption.ADVANCED);
116          builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "java-class"));
117          DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("org.opends.server.plugins.UniqueAttributePlugin");
118          builder.setDefaultBehaviorProvider(provider);
119          builder.addInstanceOf("org.opends.server.api.plugin.DirectoryServerPlugin");
120          PD_JAVA_CLASS = builder.getInstance();
121          INSTANCE.registerPropertyDefinition(PD_JAVA_CLASS);
122      }
123    
124    
125    
126      // Build the "plugin-type" property definition.
127      static {
128          EnumPropertyDefinition.Builder<PluginType> builder = EnumPropertyDefinition.createBuilder(INSTANCE, "plugin-type");
129          builder.setOption(PropertyOption.MULTI_VALUED);
130          builder.setOption(PropertyOption.MANDATORY);
131          builder.setOption(PropertyOption.ADVANCED);
132          builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "plugin-type"));
133          DefaultBehaviorProvider<PluginType> provider = new DefinedDefaultBehaviorProvider<PluginType>("preoperationadd", "preoperationmodify", "preoperationmodifydn", "postsynchronizationadd", "postsynchronizationmodify", "postsynchronizationmodifydn");
134          builder.setDefaultBehaviorProvider(provider);
135          builder.setEnumClass(PluginType.class);
136          PD_PLUGIN_TYPE = builder.getInstance();
137          INSTANCE.registerPropertyDefinition(PD_PLUGIN_TYPE);
138      }
139    
140    
141    
142      // Build the "type" property definition.
143      static {
144          AttributeTypePropertyDefinition.Builder builder = AttributeTypePropertyDefinition.createBuilder(INSTANCE, "type");
145          builder.setOption(PropertyOption.MULTI_VALUED);
146          builder.setOption(PropertyOption.MANDATORY);
147          builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "type"));
148          builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<AttributeType>());
149          PD_TYPE = builder.getInstance();
150          INSTANCE.registerPropertyDefinition(PD_TYPE);
151      }
152    
153    
154    
155      // Register the tags associated with this managed object definition.
156      static {
157        INSTANCE.registerTag(Tag.valueOf("core-server"));
158      }
159    
160    
161    
162      /**
163       * Get the Unique Attribute Plugin configuration definition
164       * singleton.
165       *
166       * @return Returns the Unique Attribute Plugin configuration
167       *         definition singleton.
168       */
169      public static UniqueAttributePluginCfgDefn getInstance() {
170        return INSTANCE;
171      }
172    
173    
174    
175      /**
176       * Private constructor.
177       */
178      private UniqueAttributePluginCfgDefn() {
179        super("unique-attribute-plugin", PluginCfgDefn.getInstance());
180      }
181    
182    
183    
184      /**
185       * {@inheritDoc}
186       */
187      public UniqueAttributePluginCfgClient createClientConfiguration(
188          ManagedObject<? extends UniqueAttributePluginCfgClient> impl) {
189        return new UniqueAttributePluginCfgClientImpl(impl);
190      }
191    
192    
193    
194      /**
195       * {@inheritDoc}
196       */
197      public UniqueAttributePluginCfg createServerConfiguration(
198          ServerManagedObject<? extends UniqueAttributePluginCfg> impl) {
199        return new UniqueAttributePluginCfgServerImpl(impl);
200      }
201    
202    
203    
204      /**
205       * {@inheritDoc}
206       */
207      public Class<UniqueAttributePluginCfg> getServerConfigurationClass() {
208        return UniqueAttributePluginCfg.class;
209      }
210    
211    
212    
213      /**
214       * Get the "base-dn" property definition.
215       * <p>
216       * Specifies a base DN within which the attribute must be unique.
217       *
218       * @return Returns the "base-dn" property definition.
219       */
220      public DNPropertyDefinition getBaseDNPropertyDefinition() {
221        return PD_BASE_DN;
222      }
223    
224    
225    
226      /**
227       * Get the "enabled" property definition.
228       * <p>
229       * Indicates whether the plug-in is enabled for use.
230       *
231       * @return Returns the "enabled" property definition.
232       */
233      public BooleanPropertyDefinition getEnabledPropertyDefinition() {
234        return PluginCfgDefn.getInstance().getEnabledPropertyDefinition();
235      }
236    
237    
238    
239      /**
240       * Get the "invoke-for-internal-operations" property definition.
241       * <p>
242       * Indicates whether the plug-in should be invoked for internal
243       * operations.
244       * <p>
245       * Any plug-in that can be invoked for internal operations must
246       * ensure that it does not create any new internal operatons that can
247       * cause the same plug-in to be re-invoked.
248       *
249       * @return Returns the "invoke-for-internal-operations" property definition.
250       */
251      public BooleanPropertyDefinition getInvokeForInternalOperationsPropertyDefinition() {
252        return PluginCfgDefn.getInstance().getInvokeForInternalOperationsPropertyDefinition();
253      }
254    
255    
256    
257      /**
258       * Get the "java-class" property definition.
259       * <p>
260       * Specifies the fully-qualified name of the Java class that
261       * provides the plug-in implementation.
262       *
263       * @return Returns the "java-class" property definition.
264       */
265      public ClassPropertyDefinition getJavaClassPropertyDefinition() {
266        return PD_JAVA_CLASS;
267      }
268    
269    
270    
271      /**
272       * Get the "plugin-type" property definition.
273       * <p>
274       * Specifies the set of plug-in types for the plug-in, which
275       * specifies the times at which the plug-in is invoked.
276       *
277       * @return Returns the "plugin-type" property definition.
278       */
279      public EnumPropertyDefinition<PluginType> getPluginTypePropertyDefinition() {
280        return PD_PLUGIN_TYPE;
281      }
282    
283    
284    
285      /**
286       * Get the "type" property definition.
287       * <p>
288       * Specifies the type of attributes to check for value uniqueness.
289       *
290       * @return Returns the "type" property definition.
291       */
292      public AttributeTypePropertyDefinition getTypePropertyDefinition() {
293        return PD_TYPE;
294      }
295    
296    
297    
298      /**
299       * Managed object client implementation.
300       */
301      private static class UniqueAttributePluginCfgClientImpl implements
302        UniqueAttributePluginCfgClient {
303    
304        // Private implementation.
305        private ManagedObject<? extends UniqueAttributePluginCfgClient> impl;
306    
307    
308    
309        // Private constructor.
310        private UniqueAttributePluginCfgClientImpl(
311            ManagedObject<? extends UniqueAttributePluginCfgClient> impl) {
312          this.impl = impl;
313        }
314    
315    
316    
317        /**
318         * {@inheritDoc}
319         */
320        public SortedSet<DN> getBaseDN() {
321          return impl.getPropertyValues(INSTANCE.getBaseDNPropertyDefinition());
322        }
323    
324    
325    
326        /**
327         * {@inheritDoc}
328         */
329        public void setBaseDN(Collection<DN> values) {
330          impl.setPropertyValues(INSTANCE.getBaseDNPropertyDefinition(), values);
331        }
332    
333    
334    
335        /**
336         * {@inheritDoc}
337         */
338        public Boolean isEnabled() {
339          return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
340        }
341    
342    
343    
344        /**
345         * {@inheritDoc}
346         */
347        public void setEnabled(boolean value) {
348          impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value);
349        }
350    
351    
352    
353        /**
354         * {@inheritDoc}
355         */
356        public boolean isInvokeForInternalOperations() {
357          return impl.getPropertyValue(INSTANCE.getInvokeForInternalOperationsPropertyDefinition());
358        }
359    
360    
361    
362        /**
363         * {@inheritDoc}
364         */
365        public void setInvokeForInternalOperations(Boolean value) {
366          impl.setPropertyValue(INSTANCE.getInvokeForInternalOperationsPropertyDefinition(), value);
367        }
368    
369    
370    
371        /**
372         * {@inheritDoc}
373         */
374        public String getJavaClass() {
375          return impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
376        }
377    
378    
379    
380        /**
381         * {@inheritDoc}
382         */
383        public void setJavaClass(String value) {
384          impl.setPropertyValue(INSTANCE.getJavaClassPropertyDefinition(), value);
385        }
386    
387    
388    
389        /**
390         * {@inheritDoc}
391         */
392        public SortedSet<PluginType> getPluginType() {
393          return impl.getPropertyValues(INSTANCE.getPluginTypePropertyDefinition());
394        }
395    
396    
397    
398        /**
399         * {@inheritDoc}
400         */
401        public void setPluginType(Collection<PluginType> values) {
402          impl.setPropertyValues(INSTANCE.getPluginTypePropertyDefinition(), values);
403        }
404    
405    
406    
407        /**
408         * {@inheritDoc}
409         */
410        public SortedSet<AttributeType> getType() {
411          return impl.getPropertyValues(INSTANCE.getTypePropertyDefinition());
412        }
413    
414    
415    
416        /**
417         * {@inheritDoc}
418         */
419        public void setType(Collection<AttributeType> values) {
420          impl.setPropertyValues(INSTANCE.getTypePropertyDefinition(), values);
421        }
422    
423    
424    
425        /**
426         * {@inheritDoc}
427         */
428        public ManagedObjectDefinition<? extends UniqueAttributePluginCfgClient, ? extends UniqueAttributePluginCfg> definition() {
429          return INSTANCE;
430        }
431    
432    
433    
434        /**
435         * {@inheritDoc}
436         */
437        public PropertyProvider properties() {
438          return impl;
439        }
440    
441    
442    
443        /**
444         * {@inheritDoc}
445         */
446        public void commit() throws ManagedObjectAlreadyExistsException,
447            MissingMandatoryPropertiesException, ConcurrentModificationException,
448            OperationRejectedException, AuthorizationException,
449            CommunicationException {
450          impl.commit();
451        }
452    
453      }
454    
455    
456    
457      /**
458       * Managed object server implementation.
459       */
460      private static class UniqueAttributePluginCfgServerImpl implements
461        UniqueAttributePluginCfg {
462    
463        // Private implementation.
464        private ServerManagedObject<? extends UniqueAttributePluginCfg> impl;
465    
466        // The value of the "base-dn" property.
467        private final SortedSet<DN> pBaseDN;
468    
469        // The value of the "enabled" property.
470        private final boolean pEnabled;
471    
472        // The value of the "invoke-for-internal-operations" property.
473        private final boolean pInvokeForInternalOperations;
474    
475        // The value of the "java-class" property.
476        private final String pJavaClass;
477    
478        // The value of the "plugin-type" property.
479        private final SortedSet<PluginType> pPluginType;
480    
481        // The value of the "type" property.
482        private final SortedSet<AttributeType> pType;
483    
484    
485    
486        // Private constructor.
487        private UniqueAttributePluginCfgServerImpl(ServerManagedObject<? extends UniqueAttributePluginCfg> impl) {
488          this.impl = impl;
489          this.pBaseDN = impl.getPropertyValues(INSTANCE.getBaseDNPropertyDefinition());
490          this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
491          this.pInvokeForInternalOperations = impl.getPropertyValue(INSTANCE.getInvokeForInternalOperationsPropertyDefinition());
492          this.pJavaClass = impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
493          this.pPluginType = impl.getPropertyValues(INSTANCE.getPluginTypePropertyDefinition());
494          this.pType = impl.getPropertyValues(INSTANCE.getTypePropertyDefinition());
495        }
496    
497    
498    
499        /**
500         * {@inheritDoc}
501         */
502        public void addUniqueAttributeChangeListener(
503            ConfigurationChangeListener<UniqueAttributePluginCfg> listener) {
504          impl.registerChangeListener(listener);
505        }
506    
507    
508    
509        /**
510         * {@inheritDoc}
511         */
512        public void removeUniqueAttributeChangeListener(
513            ConfigurationChangeListener<UniqueAttributePluginCfg> listener) {
514          impl.deregisterChangeListener(listener);
515        }
516        /**
517         * {@inheritDoc}
518         */
519        public void addChangeListener(
520            ConfigurationChangeListener<PluginCfg> listener) {
521          impl.registerChangeListener(listener);
522        }
523    
524    
525    
526        /**
527         * {@inheritDoc}
528         */
529        public void removeChangeListener(
530            ConfigurationChangeListener<PluginCfg> listener) {
531          impl.deregisterChangeListener(listener);
532        }
533    
534    
535    
536        /**
537         * {@inheritDoc}
538         */
539        public SortedSet<DN> getBaseDN() {
540          return pBaseDN;
541        }
542    
543    
544    
545        /**
546         * {@inheritDoc}
547         */
548        public boolean isEnabled() {
549          return pEnabled;
550        }
551    
552    
553    
554        /**
555         * {@inheritDoc}
556         */
557        public boolean isInvokeForInternalOperations() {
558          return pInvokeForInternalOperations;
559        }
560    
561    
562    
563        /**
564         * {@inheritDoc}
565         */
566        public String getJavaClass() {
567          return pJavaClass;
568        }
569    
570    
571    
572        /**
573         * {@inheritDoc}
574         */
575        public SortedSet<PluginType> getPluginType() {
576          return pPluginType;
577        }
578    
579    
580    
581        /**
582         * {@inheritDoc}
583         */
584        public SortedSet<AttributeType> getType() {
585          return pType;
586        }
587    
588    
589    
590        /**
591         * {@inheritDoc}
592         */
593        public Class<? extends UniqueAttributePluginCfg> configurationClass() {
594          return UniqueAttributePluginCfg.class;
595        }
596    
597    
598    
599        /**
600         * {@inheritDoc}
601         */
602        public DN dn() {
603          return impl.getDN();
604        }
605    
606      }
607    }