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.ManagedObjectAlreadyExistsException;
047import org.opends.server.admin.ManagedObjectDefinition;
048import org.opends.server.admin.PropertyOption;
049import org.opends.server.admin.PropertyProvider;
050import org.opends.server.admin.server.ConfigurationChangeListener;
051import org.opends.server.admin.server.ServerManagedObject;
052import org.opends.server.admin.std.client.RegularExpressionIdentityMapperCfgClient;
053import org.opends.server.admin.std.server.IdentityMapperCfg;
054import org.opends.server.admin.std.server.RegularExpressionIdentityMapperCfg;
055import org.opends.server.admin.StringPropertyDefinition;
056import org.opends.server.admin.Tag;
057import org.opends.server.admin.UndefinedDefaultBehaviorProvider;
058import org.opends.server.types.AttributeType;
059import org.opends.server.types.DN;
060
061
062
063/**
064 * An interface for querying the Regular Expression Identity Mapper
065 * managed object definition meta information.
066 * <p>
067 * The Regular Expression Identity Mapper provides a way to use a
068 * regular expression to translate the provided identifier when
069 * searching for the appropriate user entry.
070 */
071public final class RegularExpressionIdentityMapperCfgDefn extends ManagedObjectDefinition<RegularExpressionIdentityMapperCfgClient, RegularExpressionIdentityMapperCfg> {
072
073  // The singleton configuration definition instance.
074  private static final RegularExpressionIdentityMapperCfgDefn INSTANCE = new RegularExpressionIdentityMapperCfgDefn();
075
076
077
078  // The "java-class" property definition.
079  private static final ClassPropertyDefinition PD_JAVA_CLASS;
080
081
082
083  // The "match-attribute" property definition.
084  private static final AttributeTypePropertyDefinition PD_MATCH_ATTRIBUTE;
085
086
087
088  // The "match-base-dn" property definition.
089  private static final DNPropertyDefinition PD_MATCH_BASE_DN;
090
091
092
093  // The "match-pattern" property definition.
094  private static final StringPropertyDefinition PD_MATCH_PATTERN;
095
096
097
098  // The "replace-pattern" property definition.
099  private static final StringPropertyDefinition PD_REPLACE_PATTERN;
100
101
102
103  // Build the "java-class" property definition.
104  static {
105      ClassPropertyDefinition.Builder builder = ClassPropertyDefinition.createBuilder(INSTANCE, "java-class");
106      builder.setOption(PropertyOption.MANDATORY);
107      builder.setOption(PropertyOption.ADVANCED);
108      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "java-class"));
109      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("org.opends.server.extensions.RegularExpressionIdentityMapper");
110      builder.setDefaultBehaviorProvider(provider);
111      builder.addInstanceOf("org.opends.server.api.IdentityMapper");
112      PD_JAVA_CLASS = builder.getInstance();
113      INSTANCE.registerPropertyDefinition(PD_JAVA_CLASS);
114  }
115
116
117
118  // Build the "match-attribute" property definition.
119  static {
120      AttributeTypePropertyDefinition.Builder builder = AttributeTypePropertyDefinition.createBuilder(INSTANCE, "match-attribute");
121      builder.setOption(PropertyOption.MULTI_VALUED);
122      builder.setOption(PropertyOption.MANDATORY);
123      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "match-attribute"));
124      DefaultBehaviorProvider<AttributeType> provider = new DefinedDefaultBehaviorProvider<AttributeType>("uid");
125      builder.setDefaultBehaviorProvider(provider);
126      PD_MATCH_ATTRIBUTE = builder.getInstance();
127      INSTANCE.registerPropertyDefinition(PD_MATCH_ATTRIBUTE);
128  }
129
130
131
132  // Build the "match-base-dn" property definition.
133  static {
134      DNPropertyDefinition.Builder builder = DNPropertyDefinition.createBuilder(INSTANCE, "match-base-dn");
135      builder.setOption(PropertyOption.MULTI_VALUED);
136      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "match-base-dn"));
137      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<DN>(INSTANCE, "match-base-dn"));
138      PD_MATCH_BASE_DN = builder.getInstance();
139      INSTANCE.registerPropertyDefinition(PD_MATCH_BASE_DN);
140  }
141
142
143
144  // Build the "match-pattern" property definition.
145  static {
146      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "match-pattern");
147      builder.setOption(PropertyOption.MANDATORY);
148      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "match-pattern"));
149      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>());
150      builder.setPattern(".*", "REGEXP");
151      PD_MATCH_PATTERN = builder.getInstance();
152      INSTANCE.registerPropertyDefinition(PD_MATCH_PATTERN);
153  }
154
155
156
157  // Build the "replace-pattern" property definition.
158  static {
159      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "replace-pattern");
160      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "replace-pattern"));
161      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<String>(INSTANCE, "replace-pattern"));
162      builder.setPattern(".*", "REGEXP");
163      PD_REPLACE_PATTERN = builder.getInstance();
164      INSTANCE.registerPropertyDefinition(PD_REPLACE_PATTERN);
165  }
166
167
168
169  // Register the tags associated with this managed object definition.
170  static {
171    INSTANCE.registerTag(Tag.valueOf("security"));
172    INSTANCE.registerTag(Tag.valueOf("user-management"));
173  }
174
175
176
177  /**
178   * Get the Regular Expression Identity Mapper configuration
179   * definition singleton.
180   *
181   * @return Returns the Regular Expression Identity Mapper
182   *         configuration definition singleton.
183   */
184  public static RegularExpressionIdentityMapperCfgDefn getInstance() {
185    return INSTANCE;
186  }
187
188
189
190  /**
191   * Private constructor.
192   */
193  private RegularExpressionIdentityMapperCfgDefn() {
194    super("regular-expression-identity-mapper", IdentityMapperCfgDefn.getInstance());
195  }
196
197
198
199  /**
200   * {@inheritDoc}
201   */
202  public RegularExpressionIdentityMapperCfgClient createClientConfiguration(
203      ManagedObject<? extends RegularExpressionIdentityMapperCfgClient> impl) {
204    return new RegularExpressionIdentityMapperCfgClientImpl(impl);
205  }
206
207
208
209  /**
210   * {@inheritDoc}
211   */
212  public RegularExpressionIdentityMapperCfg createServerConfiguration(
213      ServerManagedObject<? extends RegularExpressionIdentityMapperCfg> impl) {
214    return new RegularExpressionIdentityMapperCfgServerImpl(impl);
215  }
216
217
218
219  /**
220   * {@inheritDoc}
221   */
222  public Class<RegularExpressionIdentityMapperCfg> getServerConfigurationClass() {
223    return RegularExpressionIdentityMapperCfg.class;
224  }
225
226
227
228  /**
229   * Get the "enabled" property definition.
230   * <p>
231   * Indicates whether the Regular Expression Identity Mapper is
232   * enabled for use.
233   *
234   * @return Returns the "enabled" property definition.
235   */
236  public BooleanPropertyDefinition getEnabledPropertyDefinition() {
237    return IdentityMapperCfgDefn.getInstance().getEnabledPropertyDefinition();
238  }
239
240
241
242  /**
243   * Get the "java-class" property definition.
244   * <p>
245   * Specifies the fully-qualified name of the Java class that
246   * provides the Regular Expression Identity Mapper implementation.
247   *
248   * @return Returns the "java-class" property definition.
249   */
250  public ClassPropertyDefinition getJavaClassPropertyDefinition() {
251    return PD_JAVA_CLASS;
252  }
253
254
255
256  /**
257   * Get the "match-attribute" property definition.
258   * <p>
259   * Specifies the name or OID of the attribute whose value should
260   * match the provided identifier string after it has been processed
261   * by the associated regular expression.
262   * <p>
263   * All values must refer to the name or OID of an attribute type
264   * defined in the directory server schema. If multiple attributes or
265   * OIDs are provided, at least one of those attributes must contain
266   * the provided ID string value in exactly one entry.
267   *
268   * @return Returns the "match-attribute" property definition.
269   */
270  public AttributeTypePropertyDefinition getMatchAttributePropertyDefinition() {
271    return PD_MATCH_ATTRIBUTE;
272  }
273
274
275
276  /**
277   * Get the "match-base-dn" property definition.
278   * <p>
279   * Specifies the base DN(s) that should be used when performing
280   * searches to map the provided ID string to a user entry. If
281   * multiple values are given, searches are performed below all the
282   * specified base DNs.
283   *
284   * @return Returns the "match-base-dn" property definition.
285   */
286  public DNPropertyDefinition getMatchBaseDNPropertyDefinition() {
287    return PD_MATCH_BASE_DN;
288  }
289
290
291
292  /**
293   * Get the "match-pattern" property definition.
294   * <p>
295   * Specifies the regular expression pattern that is used to identify
296   * portions of the ID string that will be replaced.
297   * <p>
298   * Any portion of the ID string that matches this pattern is
299   * replaced in accordance with the provided replace pattern (or is
300   * removed if no replace pattern is specified). If multiple
301   * substrings within the given ID string match this pattern, all
302   * occurrences are replaced. If no part of the given ID string
303   * matches this pattern, the ID string is not altered. Exactly one
304   * match pattern value must be provided, and it must be a valid
305   * regular expression as described in the API documentation for the
306   * java.util.regex.Pattern class, including support for capturing
307   * groups.
308   *
309   * @return Returns the "match-pattern" property definition.
310   */
311  public StringPropertyDefinition getMatchPatternPropertyDefinition() {
312    return PD_MATCH_PATTERN;
313  }
314
315
316
317  /**
318   * Get the "replace-pattern" property definition.
319   * <p>
320   * Specifies the replacement pattern that should be used for
321   * substrings in the ID string that match the provided regular
322   * expression pattern.
323   * <p>
324   * If no replacement pattern is provided, then any matching portions
325   * of the ID string will be removed (i.e., replaced with an empty
326   * string). The replacement pattern may include a string from a
327   * capturing group by using a dollar sign ($) followed by an integer
328   * value that indicates which capturing group should be used.
329   *
330   * @return Returns the "replace-pattern" property definition.
331   */
332  public StringPropertyDefinition getReplacePatternPropertyDefinition() {
333    return PD_REPLACE_PATTERN;
334  }
335
336
337
338  /**
339   * Managed object client implementation.
340   */
341  private static class RegularExpressionIdentityMapperCfgClientImpl implements
342    RegularExpressionIdentityMapperCfgClient {
343
344    // Private implementation.
345    private ManagedObject<? extends RegularExpressionIdentityMapperCfgClient> impl;
346
347
348
349    // Private constructor.
350    private RegularExpressionIdentityMapperCfgClientImpl(
351        ManagedObject<? extends RegularExpressionIdentityMapperCfgClient> impl) {
352      this.impl = impl;
353    }
354
355
356
357    /**
358     * {@inheritDoc}
359     */
360    public Boolean isEnabled() {
361      return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
362    }
363
364
365
366    /**
367     * {@inheritDoc}
368     */
369    public void setEnabled(boolean value) {
370      impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value);
371    }
372
373
374
375    /**
376     * {@inheritDoc}
377     */
378    public String getJavaClass() {
379      return impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
380    }
381
382
383
384    /**
385     * {@inheritDoc}
386     */
387    public void setJavaClass(String value) {
388      impl.setPropertyValue(INSTANCE.getJavaClassPropertyDefinition(), value);
389    }
390
391
392
393    /**
394     * {@inheritDoc}
395     */
396    public SortedSet<AttributeType> getMatchAttribute() {
397      return impl.getPropertyValues(INSTANCE.getMatchAttributePropertyDefinition());
398    }
399
400
401
402    /**
403     * {@inheritDoc}
404     */
405    public void setMatchAttribute(Collection<AttributeType> values) {
406      impl.setPropertyValues(INSTANCE.getMatchAttributePropertyDefinition(), values);
407    }
408
409
410
411    /**
412     * {@inheritDoc}
413     */
414    public SortedSet<DN> getMatchBaseDN() {
415      return impl.getPropertyValues(INSTANCE.getMatchBaseDNPropertyDefinition());
416    }
417
418
419
420    /**
421     * {@inheritDoc}
422     */
423    public void setMatchBaseDN(Collection<DN> values) {
424      impl.setPropertyValues(INSTANCE.getMatchBaseDNPropertyDefinition(), values);
425    }
426
427
428
429    /**
430     * {@inheritDoc}
431     */
432    public String getMatchPattern() {
433      return impl.getPropertyValue(INSTANCE.getMatchPatternPropertyDefinition());
434    }
435
436
437
438    /**
439     * {@inheritDoc}
440     */
441    public void setMatchPattern(String value) {
442      impl.setPropertyValue(INSTANCE.getMatchPatternPropertyDefinition(), value);
443    }
444
445
446
447    /**
448     * {@inheritDoc}
449     */
450    public String getReplacePattern() {
451      return impl.getPropertyValue(INSTANCE.getReplacePatternPropertyDefinition());
452    }
453
454
455
456    /**
457     * {@inheritDoc}
458     */
459    public void setReplacePattern(String value) {
460      impl.setPropertyValue(INSTANCE.getReplacePatternPropertyDefinition(), value);
461    }
462
463
464
465    /**
466     * {@inheritDoc}
467     */
468    public ManagedObjectDefinition<? extends RegularExpressionIdentityMapperCfgClient, ? extends RegularExpressionIdentityMapperCfg> definition() {
469      return INSTANCE;
470    }
471
472
473
474    /**
475     * {@inheritDoc}
476     */
477    public PropertyProvider properties() {
478      return impl;
479    }
480
481
482
483    /**
484     * {@inheritDoc}
485     */
486    public void commit() throws ManagedObjectAlreadyExistsException,
487        MissingMandatoryPropertiesException, ConcurrentModificationException,
488        OperationRejectedException, AuthorizationException,
489        CommunicationException {
490      impl.commit();
491    }
492
493
494
495    /** {@inheritDoc} */
496    public String toString() {
497      return impl.toString();
498    }
499  }
500
501
502
503  /**
504   * Managed object server implementation.
505   */
506  private static class RegularExpressionIdentityMapperCfgServerImpl implements
507    RegularExpressionIdentityMapperCfg {
508
509    // Private implementation.
510    private ServerManagedObject<? extends RegularExpressionIdentityMapperCfg> impl;
511
512    // The value of the "enabled" property.
513    private final boolean pEnabled;
514
515    // The value of the "java-class" property.
516    private final String pJavaClass;
517
518    // The value of the "match-attribute" property.
519    private final SortedSet<AttributeType> pMatchAttribute;
520
521    // The value of the "match-base-dn" property.
522    private final SortedSet<DN> pMatchBaseDN;
523
524    // The value of the "match-pattern" property.
525    private final String pMatchPattern;
526
527    // The value of the "replace-pattern" property.
528    private final String pReplacePattern;
529
530
531
532    // Private constructor.
533    private RegularExpressionIdentityMapperCfgServerImpl(ServerManagedObject<? extends RegularExpressionIdentityMapperCfg> impl) {
534      this.impl = impl;
535      this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
536      this.pJavaClass = impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
537      this.pMatchAttribute = impl.getPropertyValues(INSTANCE.getMatchAttributePropertyDefinition());
538      this.pMatchBaseDN = impl.getPropertyValues(INSTANCE.getMatchBaseDNPropertyDefinition());
539      this.pMatchPattern = impl.getPropertyValue(INSTANCE.getMatchPatternPropertyDefinition());
540      this.pReplacePattern = impl.getPropertyValue(INSTANCE.getReplacePatternPropertyDefinition());
541    }
542
543
544
545    /**
546     * {@inheritDoc}
547     */
548    public void addRegularExpressionChangeListener(
549        ConfigurationChangeListener<RegularExpressionIdentityMapperCfg> listener) {
550      impl.registerChangeListener(listener);
551    }
552
553
554
555    /**
556     * {@inheritDoc}
557     */
558    public void removeRegularExpressionChangeListener(
559        ConfigurationChangeListener<RegularExpressionIdentityMapperCfg> listener) {
560      impl.deregisterChangeListener(listener);
561    }
562    /**
563     * {@inheritDoc}
564     */
565    public void addChangeListener(
566        ConfigurationChangeListener<IdentityMapperCfg> listener) {
567      impl.registerChangeListener(listener);
568    }
569
570
571
572    /**
573     * {@inheritDoc}
574     */
575    public void removeChangeListener(
576        ConfigurationChangeListener<IdentityMapperCfg> listener) {
577      impl.deregisterChangeListener(listener);
578    }
579
580
581
582    /**
583     * {@inheritDoc}
584     */
585    public boolean isEnabled() {
586      return pEnabled;
587    }
588
589
590
591    /**
592     * {@inheritDoc}
593     */
594    public String getJavaClass() {
595      return pJavaClass;
596    }
597
598
599
600    /**
601     * {@inheritDoc}
602     */
603    public SortedSet<AttributeType> getMatchAttribute() {
604      return pMatchAttribute;
605    }
606
607
608
609    /**
610     * {@inheritDoc}
611     */
612    public SortedSet<DN> getMatchBaseDN() {
613      return pMatchBaseDN;
614    }
615
616
617
618    /**
619     * {@inheritDoc}
620     */
621    public String getMatchPattern() {
622      return pMatchPattern;
623    }
624
625
626
627    /**
628     * {@inheritDoc}
629     */
630    public String getReplacePattern() {
631      return pReplacePattern;
632    }
633
634
635
636    /**
637     * {@inheritDoc}
638     */
639    public Class<? extends RegularExpressionIdentityMapperCfg> configurationClass() {
640      return RegularExpressionIdentityMapperCfg.class;
641    }
642
643
644
645    /**
646     * {@inheritDoc}
647     */
648    public DN dn() {
649      return impl.getDN();
650    }
651
652
653
654    /** {@inheritDoc} */
655    public String toString() {
656      return impl.toString();
657    }
658  }
659}