001/*
002 * CDDL HEADER START
003 *
004 * The contents of this file are subject to the terms of the
005 * Common Development and Distribution License, Version 1.0 only
006 * (the "License").  You may not use this file except in compliance
007 * with the License.
008 *
009 * You can obtain a copy of the license at legal-notices/CDDLv1_0.txt
010 * or http://forgerock.org/license/CDDLv1.0.html.
011 * See the License for the specific language governing permissions
012 * and limitations under the License.
013 *
014 * When distributing Covered Code, include this CDDL HEADER in each
015 * file and include the License file at legal-notices/CDDLv1_0.txt.
016 * If applicable, add the following below this CDDL HEADER, with the
017 * fields enclosed by brackets "[]" replaced with your own identifying
018 * information:
019 *      Portions Copyright [yyyy] [name of copyright owner]
020 *
021 * CDDL HEADER END
022 *
023 *
024 *      Copyright 2008 Sun Microsystems, Inc.
025 */
026package org.forgerock.opendj.server.config.meta;
027
028
029
030import java.net.InetAddress;
031import java.util.Collection;
032import java.util.SortedSet;
033import org.forgerock.opendj.config.AdministratorAction;
034import org.forgerock.opendj.config.AggregationPropertyDefinition;
035import org.forgerock.opendj.config.AliasDefaultBehaviorProvider;
036import org.forgerock.opendj.config.client.ConcurrentModificationException;
037import org.forgerock.opendj.config.client.ManagedObject;
038import org.forgerock.opendj.config.client.MissingMandatoryPropertiesException;
039import org.forgerock.opendj.config.client.OperationRejectedException;
040import org.forgerock.opendj.config.conditions.Conditions;
041import org.forgerock.opendj.config.DefaultBehaviorProvider;
042import org.forgerock.opendj.config.DefinedDefaultBehaviorProvider;
043import org.forgerock.opendj.config.IntegerPropertyDefinition;
044import org.forgerock.opendj.config.IPAddressPropertyDefinition;
045import org.forgerock.opendj.config.ManagedObjectAlreadyExistsException;
046import org.forgerock.opendj.config.ManagedObjectDefinition;
047import org.forgerock.opendj.config.PropertyOption;
048import org.forgerock.opendj.config.PropertyProvider;
049import org.forgerock.opendj.config.server.ConfigurationChangeListener;
050import org.forgerock.opendj.config.server.ServerManagedObject;
051import org.forgerock.opendj.config.StringPropertyDefinition;
052import org.forgerock.opendj.config.Tag;
053import org.forgerock.opendj.config.TopCfgDefn;
054import org.forgerock.opendj.config.UndefinedDefaultBehaviorProvider;
055import org.forgerock.opendj.ldap.DN;
056import org.forgerock.opendj.ldap.LdapException;
057import org.forgerock.opendj.server.config.client.AdministrationConnectorCfgClient;
058import org.forgerock.opendj.server.config.client.KeyManagerProviderCfgClient;
059import org.forgerock.opendj.server.config.client.TrustManagerProviderCfgClient;
060import org.forgerock.opendj.server.config.server.AdministrationConnectorCfg;
061import org.forgerock.opendj.server.config.server.KeyManagerProviderCfg;
062import org.forgerock.opendj.server.config.server.TrustManagerProviderCfg;
063
064
065
066/**
067 * An interface for querying the Administration Connector managed
068 * object definition meta information.
069 * <p>
070 * The Administration Connector is used to interact with
071 * administration tools using LDAP.
072 */
073public final class AdministrationConnectorCfgDefn extends ManagedObjectDefinition<AdministrationConnectorCfgClient, AdministrationConnectorCfg> {
074
075  /** The singleton configuration definition instance. */
076  private static final AdministrationConnectorCfgDefn INSTANCE = new AdministrationConnectorCfgDefn();
077
078
079
080  /** The "key-manager-provider" property definition. */
081  private static final AggregationPropertyDefinition<KeyManagerProviderCfgClient, KeyManagerProviderCfg> PD_KEY_MANAGER_PROVIDER;
082
083
084
085  /** The "listen-address" property definition. */
086  private static final IPAddressPropertyDefinition PD_LISTEN_ADDRESS;
087
088
089
090  /** The "listen-port" property definition. */
091  private static final IntegerPropertyDefinition PD_LISTEN_PORT;
092
093
094
095  /** The "ssl-cert-nickname" property definition. */
096  private static final StringPropertyDefinition PD_SSL_CERT_NICKNAME;
097
098
099
100  /** The "ssl-cipher-suite" property definition. */
101  private static final StringPropertyDefinition PD_SSL_CIPHER_SUITE;
102
103
104
105  /** The "ssl-protocol" property definition. */
106  private static final StringPropertyDefinition PD_SSL_PROTOCOL;
107
108
109
110  /** The "trust-manager-provider" property definition. */
111  private static final AggregationPropertyDefinition<TrustManagerProviderCfgClient, TrustManagerProviderCfg> PD_TRUST_MANAGER_PROVIDER;
112
113
114
115  /** Build the "key-manager-provider" property definition. */
116  static {
117      AggregationPropertyDefinition.Builder<KeyManagerProviderCfgClient, KeyManagerProviderCfg> builder = AggregationPropertyDefinition.createBuilder(INSTANCE, "key-manager-provider");
118      builder.setOption(PropertyOption.MANDATORY);
119      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "key-manager-provider"));
120      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>());
121      builder.setParentPath("/");
122      builder.setRelationDefinition("key-manager-provider");
123      builder.setTargetIsEnabledCondition(Conditions.contains("enabled", "true"));
124      PD_KEY_MANAGER_PROVIDER = builder.getInstance();
125      INSTANCE.registerPropertyDefinition(PD_KEY_MANAGER_PROVIDER);
126      INSTANCE.registerConstraint(PD_KEY_MANAGER_PROVIDER.getSourceConstraint());
127  }
128
129
130
131  /** Build the "listen-address" property definition. */
132  static {
133      IPAddressPropertyDefinition.Builder builder = IPAddressPropertyDefinition.createBuilder(INSTANCE, "listen-address");
134      builder.setOption(PropertyOption.MULTI_VALUED);
135      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "listen-address"));
136      DefaultBehaviorProvider<InetAddress> provider = new DefinedDefaultBehaviorProvider<InetAddress>("0.0.0.0");
137      builder.setDefaultBehaviorProvider(provider);
138      PD_LISTEN_ADDRESS = builder.getInstance();
139      INSTANCE.registerPropertyDefinition(PD_LISTEN_ADDRESS);
140  }
141
142
143
144  /** Build the "listen-port" property definition. */
145  static {
146      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "listen-port");
147      builder.setOption(PropertyOption.MANDATORY);
148      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "listen-port"));
149      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<Integer>());
150      builder.setUpperLimit(65535);
151      builder.setLowerLimit(1);
152      PD_LISTEN_PORT = builder.getInstance();
153      INSTANCE.registerPropertyDefinition(PD_LISTEN_PORT);
154  }
155
156
157
158  /** Build the "ssl-cert-nickname" property definition. */
159  static {
160      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "ssl-cert-nickname");
161      builder.setOption(PropertyOption.MULTI_VALUED);
162      builder.setOption(PropertyOption.MANDATORY);
163      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "ssl-cert-nickname"));
164      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<String>(INSTANCE, "ssl-cert-nickname"));
165      PD_SSL_CERT_NICKNAME = builder.getInstance();
166      INSTANCE.registerPropertyDefinition(PD_SSL_CERT_NICKNAME);
167  }
168
169
170
171  /** Build the "ssl-cipher-suite" property definition. */
172  static {
173      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "ssl-cipher-suite");
174      builder.setOption(PropertyOption.MULTI_VALUED);
175      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "ssl-cipher-suite"));
176      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<String>(INSTANCE, "ssl-cipher-suite"));
177      PD_SSL_CIPHER_SUITE = builder.getInstance();
178      INSTANCE.registerPropertyDefinition(PD_SSL_CIPHER_SUITE);
179  }
180
181
182
183  /** Build the "ssl-protocol" property definition. */
184  static {
185      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "ssl-protocol");
186      builder.setOption(PropertyOption.MULTI_VALUED);
187      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "ssl-protocol"));
188      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<String>(INSTANCE, "ssl-protocol"));
189      PD_SSL_PROTOCOL = builder.getInstance();
190      INSTANCE.registerPropertyDefinition(PD_SSL_PROTOCOL);
191  }
192
193
194
195  /** Build the "trust-manager-provider" property definition. */
196  static {
197      AggregationPropertyDefinition.Builder<TrustManagerProviderCfgClient, TrustManagerProviderCfg> builder = AggregationPropertyDefinition.createBuilder(INSTANCE, "trust-manager-provider");
198      builder.setOption(PropertyOption.MANDATORY);
199      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "trust-manager-provider"));
200      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>());
201      builder.setParentPath("/");
202      builder.setRelationDefinition("trust-manager-provider");
203      builder.setTargetIsEnabledCondition(Conditions.contains("enabled", "true"));
204      PD_TRUST_MANAGER_PROVIDER = builder.getInstance();
205      INSTANCE.registerPropertyDefinition(PD_TRUST_MANAGER_PROVIDER);
206      INSTANCE.registerConstraint(PD_TRUST_MANAGER_PROVIDER.getSourceConstraint());
207  }
208
209
210
211  // Register the tags associated with this managed object definition.
212  static {
213    INSTANCE.registerTag(Tag.valueOf("core-server"));
214  }
215
216
217
218  /**
219   * Get the Administration Connector configuration definition
220   * singleton.
221   *
222   * @return Returns the Administration Connector configuration
223   *         definition singleton.
224   */
225  public static AdministrationConnectorCfgDefn getInstance() {
226    return INSTANCE;
227  }
228
229
230
231  /**
232   * Private constructor.
233   */
234  private AdministrationConnectorCfgDefn() {
235    super("administration-connector", TopCfgDefn.getInstance());
236  }
237
238
239
240  /** {@inheritDoc} */
241  public AdministrationConnectorCfgClient createClientConfiguration(
242      ManagedObject<? extends AdministrationConnectorCfgClient> impl) {
243    return new AdministrationConnectorCfgClientImpl(impl);
244  }
245
246
247
248  /** {@inheritDoc} */
249  public AdministrationConnectorCfg createServerConfiguration(
250      ServerManagedObject<? extends AdministrationConnectorCfg> impl) {
251    return new AdministrationConnectorCfgServerImpl(impl);
252  }
253
254
255
256  /** {@inheritDoc} */
257  public Class<AdministrationConnectorCfg> getServerConfigurationClass() {
258    return AdministrationConnectorCfg.class;
259  }
260
261
262
263  /**
264   * Get the "key-manager-provider" property definition.
265   * <p>
266   * Specifies the name of the key manager that is used with the
267   * Administration Connector .
268   *
269   * @return Returns the "key-manager-provider" property definition.
270   */
271  public AggregationPropertyDefinition<KeyManagerProviderCfgClient, KeyManagerProviderCfg> getKeyManagerProviderPropertyDefinition() {
272    return PD_KEY_MANAGER_PROVIDER;
273  }
274
275
276
277  /**
278   * Get the "listen-address" property definition.
279   * <p>
280   * Specifies the address or set of addresses on which this
281   * Administration Connector should listen for connections from LDAP
282   * clients.
283   * <p>
284   * Multiple addresses may be provided as separate values for this
285   * attribute. If no values are provided, then the Administration
286   * Connector listens on all interfaces.
287   *
288   * @return Returns the "listen-address" property definition.
289   */
290  public IPAddressPropertyDefinition getListenAddressPropertyDefinition() {
291    return PD_LISTEN_ADDRESS;
292  }
293
294
295
296  /**
297   * Get the "listen-port" property definition.
298   * <p>
299   * Specifies the port number on which the Administration Connector
300   * will listen for connections from clients.
301   * <p>
302   * Only a single port number may be provided.
303   *
304   * @return Returns the "listen-port" property definition.
305   */
306  public IntegerPropertyDefinition getListenPortPropertyDefinition() {
307    return PD_LISTEN_PORT;
308  }
309
310
311
312  /**
313   * Get the "ssl-cert-nickname" property definition.
314   * <p>
315   * Specifies the nicknames (also called the aliases) of the
316   * certificates that the Administration Connector should use when
317   * performing SSL communication. The property can be used multiple
318   * times (referencing different nicknames) when an RSA, a DSA, and an
319   * ECC based server certificate is used in parallel.
320   *
321   * @return Returns the "ssl-cert-nickname" property definition.
322   */
323  public StringPropertyDefinition getSSLCertNicknamePropertyDefinition() {
324    return PD_SSL_CERT_NICKNAME;
325  }
326
327
328
329  /**
330   * Get the "ssl-cipher-suite" property definition.
331   * <p>
332   * Specifies the names of the SSL cipher suites that are allowed for
333   * use in SSL communication.
334   *
335   * @return Returns the "ssl-cipher-suite" property definition.
336   */
337  public StringPropertyDefinition getSSLCipherSuitePropertyDefinition() {
338    return PD_SSL_CIPHER_SUITE;
339  }
340
341
342
343  /**
344   * Get the "ssl-protocol" property definition.
345   * <p>
346   * Specifies the names of the SSL protocols that are allowed for use
347   * in SSL or StartTLS communication.
348   *
349   * @return Returns the "ssl-protocol" property definition.
350   */
351  public StringPropertyDefinition getSSLProtocolPropertyDefinition() {
352    return PD_SSL_PROTOCOL;
353  }
354
355
356
357  /**
358   * Get the "trust-manager-provider" property definition.
359   * <p>
360   * Specifies the name of the trust manager that is used with the
361   * Administration Connector .
362   *
363   * @return Returns the "trust-manager-provider" property definition.
364   */
365  public AggregationPropertyDefinition<TrustManagerProviderCfgClient, TrustManagerProviderCfg> getTrustManagerProviderPropertyDefinition() {
366    return PD_TRUST_MANAGER_PROVIDER;
367  }
368
369
370
371  /**
372   * Managed object client implementation.
373   */
374  private static class AdministrationConnectorCfgClientImpl implements
375    AdministrationConnectorCfgClient {
376
377    /** Private implementation. */
378    private ManagedObject<? extends AdministrationConnectorCfgClient> impl;
379
380
381
382    /** Private constructor. */
383    private AdministrationConnectorCfgClientImpl(
384        ManagedObject<? extends AdministrationConnectorCfgClient> impl) {
385      this.impl = impl;
386    }
387
388
389
390    /** {@inheritDoc} */
391    public String getKeyManagerProvider() {
392      return impl.getPropertyValue(INSTANCE.getKeyManagerProviderPropertyDefinition());
393    }
394
395
396
397    /** {@inheritDoc} */
398    public void setKeyManagerProvider(String value) {
399      impl.setPropertyValue(INSTANCE.getKeyManagerProviderPropertyDefinition(), value);
400    }
401
402
403
404    /** {@inheritDoc} */
405    public SortedSet<InetAddress> getListenAddress() {
406      return impl.getPropertyValues(INSTANCE.getListenAddressPropertyDefinition());
407    }
408
409
410
411    /** {@inheritDoc} */
412    public void setListenAddress(Collection<InetAddress> values) {
413      impl.setPropertyValues(INSTANCE.getListenAddressPropertyDefinition(), values);
414    }
415
416
417
418    /** {@inheritDoc} */
419    public Integer getListenPort() {
420      return impl.getPropertyValue(INSTANCE.getListenPortPropertyDefinition());
421    }
422
423
424
425    /** {@inheritDoc} */
426    public void setListenPort(int value) {
427      impl.setPropertyValue(INSTANCE.getListenPortPropertyDefinition(), value);
428    }
429
430
431
432    /** {@inheritDoc} */
433    public SortedSet<String> getSSLCertNickname() {
434      return impl.getPropertyValues(INSTANCE.getSSLCertNicknamePropertyDefinition());
435    }
436
437
438
439    /** {@inheritDoc} */
440    public void setSSLCertNickname(Collection<String> values) {
441      impl.setPropertyValues(INSTANCE.getSSLCertNicknamePropertyDefinition(), values);
442    }
443
444
445
446    /** {@inheritDoc} */
447    public SortedSet<String> getSSLCipherSuite() {
448      return impl.getPropertyValues(INSTANCE.getSSLCipherSuitePropertyDefinition());
449    }
450
451
452
453    /** {@inheritDoc} */
454    public void setSSLCipherSuite(Collection<String> values) {
455      impl.setPropertyValues(INSTANCE.getSSLCipherSuitePropertyDefinition(), values);
456    }
457
458
459
460    /** {@inheritDoc} */
461    public SortedSet<String> getSSLProtocol() {
462      return impl.getPropertyValues(INSTANCE.getSSLProtocolPropertyDefinition());
463    }
464
465
466
467    /** {@inheritDoc} */
468    public void setSSLProtocol(Collection<String> values) {
469      impl.setPropertyValues(INSTANCE.getSSLProtocolPropertyDefinition(), values);
470    }
471
472
473
474    /** {@inheritDoc} */
475    public String getTrustManagerProvider() {
476      return impl.getPropertyValue(INSTANCE.getTrustManagerProviderPropertyDefinition());
477    }
478
479
480
481    /** {@inheritDoc} */
482    public void setTrustManagerProvider(String value) {
483      impl.setPropertyValue(INSTANCE.getTrustManagerProviderPropertyDefinition(), value);
484    }
485
486
487
488    /** {@inheritDoc} */
489    public ManagedObjectDefinition<? extends AdministrationConnectorCfgClient, ? extends AdministrationConnectorCfg> definition() {
490      return INSTANCE;
491    }
492
493
494
495    /** {@inheritDoc} */
496    public PropertyProvider properties() {
497      return impl;
498    }
499
500
501
502    /** {@inheritDoc} */
503    public void commit() throws ManagedObjectAlreadyExistsException,
504        MissingMandatoryPropertiesException, ConcurrentModificationException,
505        OperationRejectedException, LdapException {
506      impl.commit();
507    }
508
509
510
511    /** {@inheritDoc} */
512    public String toString() {
513      return impl.toString();
514    }
515  }
516
517
518
519  /**
520   * Managed object server implementation.
521   */
522  private static class AdministrationConnectorCfgServerImpl implements
523    AdministrationConnectorCfg {
524
525    /** Private implementation. */
526    private ServerManagedObject<? extends AdministrationConnectorCfg> impl;
527
528    /** The value of the "key-manager-provider" property. */
529    private final String pKeyManagerProvider;
530
531    /** The value of the "listen-address" property. */
532    private final SortedSet<InetAddress> pListenAddress;
533
534    /** The value of the "listen-port" property. */
535    private final int pListenPort;
536
537    /** The value of the "ssl-cert-nickname" property. */
538    private final SortedSet<String> pSSLCertNickname;
539
540    /** The value of the "ssl-cipher-suite" property. */
541    private final SortedSet<String> pSSLCipherSuite;
542
543    /** The value of the "ssl-protocol" property. */
544    private final SortedSet<String> pSSLProtocol;
545
546    /** The value of the "trust-manager-provider" property. */
547    private final String pTrustManagerProvider;
548
549
550
551    /** Private constructor. */
552    private AdministrationConnectorCfgServerImpl(ServerManagedObject<? extends AdministrationConnectorCfg> impl) {
553      this.impl = impl;
554      this.pKeyManagerProvider = impl.getPropertyValue(INSTANCE.getKeyManagerProviderPropertyDefinition());
555      this.pListenAddress = impl.getPropertyValues(INSTANCE.getListenAddressPropertyDefinition());
556      this.pListenPort = impl.getPropertyValue(INSTANCE.getListenPortPropertyDefinition());
557      this.pSSLCertNickname = impl.getPropertyValues(INSTANCE.getSSLCertNicknamePropertyDefinition());
558      this.pSSLCipherSuite = impl.getPropertyValues(INSTANCE.getSSLCipherSuitePropertyDefinition());
559      this.pSSLProtocol = impl.getPropertyValues(INSTANCE.getSSLProtocolPropertyDefinition());
560      this.pTrustManagerProvider = impl.getPropertyValue(INSTANCE.getTrustManagerProviderPropertyDefinition());
561    }
562
563
564
565    /** {@inheritDoc} */
566    public void addChangeListener(
567        ConfigurationChangeListener<AdministrationConnectorCfg> listener) {
568      impl.registerChangeListener(listener);
569    }
570
571
572
573    /** {@inheritDoc} */
574    public void removeChangeListener(
575        ConfigurationChangeListener<AdministrationConnectorCfg> listener) {
576      impl.deregisterChangeListener(listener);
577    }
578
579
580
581    /** {@inheritDoc} */
582    public String getKeyManagerProvider() {
583      return pKeyManagerProvider;
584    }
585
586
587
588    /**
589     * {@inheritDoc}
590     */
591    public DN getKeyManagerProviderDN() {
592      String value = getKeyManagerProvider();
593      if (value == null) return null;
594      return INSTANCE.getKeyManagerProviderPropertyDefinition().getChildDN(value);
595    }
596
597
598
599    /** {@inheritDoc} */
600    public SortedSet<InetAddress> getListenAddress() {
601      return pListenAddress;
602    }
603
604
605
606    /** {@inheritDoc} */
607    public int getListenPort() {
608      return pListenPort;
609    }
610
611
612
613    /** {@inheritDoc} */
614    public SortedSet<String> getSSLCertNickname() {
615      return pSSLCertNickname;
616    }
617
618
619
620    /** {@inheritDoc} */
621    public SortedSet<String> getSSLCipherSuite() {
622      return pSSLCipherSuite;
623    }
624
625
626
627    /** {@inheritDoc} */
628    public SortedSet<String> getSSLProtocol() {
629      return pSSLProtocol;
630    }
631
632
633
634    /** {@inheritDoc} */
635    public String getTrustManagerProvider() {
636      return pTrustManagerProvider;
637    }
638
639
640
641    /**
642     * {@inheritDoc}
643     */
644    public DN getTrustManagerProviderDN() {
645      String value = getTrustManagerProvider();
646      if (value == null) return null;
647      return INSTANCE.getTrustManagerProviderPropertyDefinition().getChildDN(value);
648    }
649
650
651
652    /** {@inheritDoc} */
653    public Class<? extends AdministrationConnectorCfg> configurationClass() {
654      return AdministrationConnectorCfg.class;
655    }
656
657
658
659    /** {@inheritDoc} */
660    public DN dn() {
661      return impl.getDN();
662    }
663
664
665
666    /** {@inheritDoc} */
667    public String toString() {
668      return impl.toString();
669    }
670  }
671}