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.MANDATORY);
162      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "ssl-cert-nickname"));
163      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<String>(INSTANCE, "ssl-cert-nickname"));
164      PD_SSL_CERT_NICKNAME = builder.getInstance();
165      INSTANCE.registerPropertyDefinition(PD_SSL_CERT_NICKNAME);
166  }
167
168
169
170  // Build the "ssl-cipher-suite" property definition.
171  static {
172      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "ssl-cipher-suite");
173      builder.setOption(PropertyOption.MULTI_VALUED);
174      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "ssl-cipher-suite"));
175      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<String>(INSTANCE, "ssl-cipher-suite"));
176      PD_SSL_CIPHER_SUITE = builder.getInstance();
177      INSTANCE.registerPropertyDefinition(PD_SSL_CIPHER_SUITE);
178  }
179
180
181
182  // Build the "ssl-protocol" property definition.
183  static {
184      StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "ssl-protocol");
185      builder.setOption(PropertyOption.MULTI_VALUED);
186      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "ssl-protocol"));
187      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<String>(INSTANCE, "ssl-protocol"));
188      PD_SSL_PROTOCOL = builder.getInstance();
189      INSTANCE.registerPropertyDefinition(PD_SSL_PROTOCOL);
190  }
191
192
193
194  // Build the "trust-manager-provider" property definition.
195  static {
196      AggregationPropertyDefinition.Builder<TrustManagerProviderCfgClient, TrustManagerProviderCfg> builder = AggregationPropertyDefinition.createBuilder(INSTANCE, "trust-manager-provider");
197      builder.setOption(PropertyOption.MANDATORY);
198      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.SERVER_RESTART, INSTANCE, "trust-manager-provider"));
199      builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>());
200      builder.setParentPath("/");
201      builder.setRelationDefinition("trust-manager-provider");
202      builder.setTargetIsEnabledCondition(Conditions.contains("enabled", "true"));
203      PD_TRUST_MANAGER_PROVIDER = builder.getInstance();
204      INSTANCE.registerPropertyDefinition(PD_TRUST_MANAGER_PROVIDER);
205      INSTANCE.registerConstraint(PD_TRUST_MANAGER_PROVIDER.getSourceConstraint());
206  }
207
208
209
210  // Register the tags associated with this managed object definition.
211  static {
212    INSTANCE.registerTag(Tag.valueOf("core-server"));
213  }
214
215
216
217  /**
218   * Get the Administration Connector configuration definition
219   * singleton.
220   *
221   * @return Returns the Administration Connector configuration
222   *         definition singleton.
223   */
224  public static AdministrationConnectorCfgDefn getInstance() {
225    return INSTANCE;
226  }
227
228
229
230  /**
231   * Private constructor.
232   */
233  private AdministrationConnectorCfgDefn() {
234    super("administration-connector", TopCfgDefn.getInstance());
235  }
236
237
238
239  /**
240   * {@inheritDoc}
241   */
242  public AdministrationConnectorCfgClient createClientConfiguration(
243      ManagedObject<? extends AdministrationConnectorCfgClient> impl) {
244    return new AdministrationConnectorCfgClientImpl(impl);
245  }
246
247
248
249  /**
250   * {@inheritDoc}
251   */
252  public AdministrationConnectorCfg createServerConfiguration(
253      ServerManagedObject<? extends AdministrationConnectorCfg> impl) {
254    return new AdministrationConnectorCfgServerImpl(impl);
255  }
256
257
258
259  /**
260   * {@inheritDoc}
261   */
262  public Class<AdministrationConnectorCfg> getServerConfigurationClass() {
263    return AdministrationConnectorCfg.class;
264  }
265
266
267
268  /**
269   * Get the "key-manager-provider" property definition.
270   * <p>
271   * Specifies the name of the key manager that is used with the
272   * Administration Connector .
273   *
274   * @return Returns the "key-manager-provider" property definition.
275   */
276  public AggregationPropertyDefinition<KeyManagerProviderCfgClient, KeyManagerProviderCfg> getKeyManagerProviderPropertyDefinition() {
277    return PD_KEY_MANAGER_PROVIDER;
278  }
279
280
281
282  /**
283   * Get the "listen-address" property definition.
284   * <p>
285   * Specifies the address or set of addresses on which this
286   * Administration Connector should listen for connections from LDAP
287   * clients.
288   * <p>
289   * Multiple addresses may be provided as separate values for this
290   * attribute. If no values are provided, then the Administration
291   * Connector listens on all interfaces.
292   *
293   * @return Returns the "listen-address" property definition.
294   */
295  public IPAddressPropertyDefinition getListenAddressPropertyDefinition() {
296    return PD_LISTEN_ADDRESS;
297  }
298
299
300
301  /**
302   * Get the "listen-port" property definition.
303   * <p>
304   * Specifies the port number on which the Administration Connector
305   * will listen for connections from clients.
306   * <p>
307   * Only a single port number may be provided.
308   *
309   * @return Returns the "listen-port" property definition.
310   */
311  public IntegerPropertyDefinition getListenPortPropertyDefinition() {
312    return PD_LISTEN_PORT;
313  }
314
315
316
317  /**
318   * Get the "ssl-cert-nickname" property definition.
319   * <p>
320   * Specifies the nickname (also called the alias) of the certificate
321   * that the Administration Connector will use when performing SSL
322   * communication.
323   *
324   * @return Returns the "ssl-cert-nickname" property definition.
325   */
326  public StringPropertyDefinition getSSLCertNicknamePropertyDefinition() {
327    return PD_SSL_CERT_NICKNAME;
328  }
329
330
331
332  /**
333   * Get the "ssl-cipher-suite" property definition.
334   * <p>
335   * Specifies the names of the SSL cipher suites that are allowed for
336   * use in SSL communication.
337   *
338   * @return Returns the "ssl-cipher-suite" property definition.
339   */
340  public StringPropertyDefinition getSSLCipherSuitePropertyDefinition() {
341    return PD_SSL_CIPHER_SUITE;
342  }
343
344
345
346  /**
347   * Get the "ssl-protocol" property definition.
348   * <p>
349   * Specifies the names of the SSL protocols that are allowed for use
350   * in SSL or StartTLS communication.
351   *
352   * @return Returns the "ssl-protocol" property definition.
353   */
354  public StringPropertyDefinition getSSLProtocolPropertyDefinition() {
355    return PD_SSL_PROTOCOL;
356  }
357
358
359
360  /**
361   * Get the "trust-manager-provider" property definition.
362   * <p>
363   * Specifies the name of the trust manager that is used with the
364   * Administration Connector .
365   *
366   * @return Returns the "trust-manager-provider" property definition.
367   */
368  public AggregationPropertyDefinition<TrustManagerProviderCfgClient, TrustManagerProviderCfg> getTrustManagerProviderPropertyDefinition() {
369    return PD_TRUST_MANAGER_PROVIDER;
370  }
371
372
373
374  /**
375   * Managed object client implementation.
376   */
377  private static class AdministrationConnectorCfgClientImpl implements
378    AdministrationConnectorCfgClient {
379
380    // Private implementation.
381    private ManagedObject<? extends AdministrationConnectorCfgClient> impl;
382
383
384
385    // Private constructor.
386    private AdministrationConnectorCfgClientImpl(
387        ManagedObject<? extends AdministrationConnectorCfgClient> impl) {
388      this.impl = impl;
389    }
390
391
392
393    /**
394     * {@inheritDoc}
395     */
396    public String getKeyManagerProvider() {
397      return impl.getPropertyValue(INSTANCE.getKeyManagerProviderPropertyDefinition());
398    }
399
400
401
402    /**
403     * {@inheritDoc}
404     */
405    public void setKeyManagerProvider(String value) {
406      impl.setPropertyValue(INSTANCE.getKeyManagerProviderPropertyDefinition(), value);
407    }
408
409
410
411    /**
412     * {@inheritDoc}
413     */
414    public SortedSet<InetAddress> getListenAddress() {
415      return impl.getPropertyValues(INSTANCE.getListenAddressPropertyDefinition());
416    }
417
418
419
420    /**
421     * {@inheritDoc}
422     */
423    public void setListenAddress(Collection<InetAddress> values) {
424      impl.setPropertyValues(INSTANCE.getListenAddressPropertyDefinition(), values);
425    }
426
427
428
429    /**
430     * {@inheritDoc}
431     */
432    public Integer getListenPort() {
433      return impl.getPropertyValue(INSTANCE.getListenPortPropertyDefinition());
434    }
435
436
437
438    /**
439     * {@inheritDoc}
440     */
441    public void setListenPort(int value) {
442      impl.setPropertyValue(INSTANCE.getListenPortPropertyDefinition(), value);
443    }
444
445
446
447    /**
448     * {@inheritDoc}
449     */
450    public String getSSLCertNickname() {
451      return impl.getPropertyValue(INSTANCE.getSSLCertNicknamePropertyDefinition());
452    }
453
454
455
456    /**
457     * {@inheritDoc}
458     */
459    public void setSSLCertNickname(String value) {
460      impl.setPropertyValue(INSTANCE.getSSLCertNicknamePropertyDefinition(), value);
461    }
462
463
464
465    /**
466     * {@inheritDoc}
467     */
468    public SortedSet<String> getSSLCipherSuite() {
469      return impl.getPropertyValues(INSTANCE.getSSLCipherSuitePropertyDefinition());
470    }
471
472
473
474    /**
475     * {@inheritDoc}
476     */
477    public void setSSLCipherSuite(Collection<String> values) {
478      impl.setPropertyValues(INSTANCE.getSSLCipherSuitePropertyDefinition(), values);
479    }
480
481
482
483    /**
484     * {@inheritDoc}
485     */
486    public SortedSet<String> getSSLProtocol() {
487      return impl.getPropertyValues(INSTANCE.getSSLProtocolPropertyDefinition());
488    }
489
490
491
492    /**
493     * {@inheritDoc}
494     */
495    public void setSSLProtocol(Collection<String> values) {
496      impl.setPropertyValues(INSTANCE.getSSLProtocolPropertyDefinition(), values);
497    }
498
499
500
501    /**
502     * {@inheritDoc}
503     */
504    public String getTrustManagerProvider() {
505      return impl.getPropertyValue(INSTANCE.getTrustManagerProviderPropertyDefinition());
506    }
507
508
509
510    /**
511     * {@inheritDoc}
512     */
513    public void setTrustManagerProvider(String value) {
514      impl.setPropertyValue(INSTANCE.getTrustManagerProviderPropertyDefinition(), value);
515    }
516
517
518
519    /**
520     * {@inheritDoc}
521     */
522    public ManagedObjectDefinition<? extends AdministrationConnectorCfgClient, ? extends AdministrationConnectorCfg> definition() {
523      return INSTANCE;
524    }
525
526
527
528    /**
529     * {@inheritDoc}
530     */
531    public PropertyProvider properties() {
532      return impl;
533    }
534
535
536
537    /**
538     * {@inheritDoc}
539     */
540    public void commit() throws ManagedObjectAlreadyExistsException,
541        MissingMandatoryPropertiesException, ConcurrentModificationException,
542        OperationRejectedException, LdapException {
543      impl.commit();
544    }
545
546  }
547
548
549
550  /**
551   * Managed object server implementation.
552   */
553  private static class AdministrationConnectorCfgServerImpl implements
554    AdministrationConnectorCfg {
555
556    // Private implementation.
557    private ServerManagedObject<? extends AdministrationConnectorCfg> impl;
558
559    // The value of the "key-manager-provider" property.
560    private final String pKeyManagerProvider;
561
562    // The value of the "listen-address" property.
563    private final SortedSet<InetAddress> pListenAddress;
564
565    // The value of the "listen-port" property.
566    private final int pListenPort;
567
568    // The value of the "ssl-cert-nickname" property.
569    private final String pSSLCertNickname;
570
571    // The value of the "ssl-cipher-suite" property.
572    private final SortedSet<String> pSSLCipherSuite;
573
574    // The value of the "ssl-protocol" property.
575    private final SortedSet<String> pSSLProtocol;
576
577    // The value of the "trust-manager-provider" property.
578    private final String pTrustManagerProvider;
579
580
581
582    // Private constructor.
583    private AdministrationConnectorCfgServerImpl(ServerManagedObject<? extends AdministrationConnectorCfg> impl) {
584      this.impl = impl;
585      this.pKeyManagerProvider = impl.getPropertyValue(INSTANCE.getKeyManagerProviderPropertyDefinition());
586      this.pListenAddress = impl.getPropertyValues(INSTANCE.getListenAddressPropertyDefinition());
587      this.pListenPort = impl.getPropertyValue(INSTANCE.getListenPortPropertyDefinition());
588      this.pSSLCertNickname = impl.getPropertyValue(INSTANCE.getSSLCertNicknamePropertyDefinition());
589      this.pSSLCipherSuite = impl.getPropertyValues(INSTANCE.getSSLCipherSuitePropertyDefinition());
590      this.pSSLProtocol = impl.getPropertyValues(INSTANCE.getSSLProtocolPropertyDefinition());
591      this.pTrustManagerProvider = impl.getPropertyValue(INSTANCE.getTrustManagerProviderPropertyDefinition());
592    }
593
594
595
596    /**
597     * {@inheritDoc}
598     */
599    public void addChangeListener(
600        ConfigurationChangeListener<AdministrationConnectorCfg> listener) {
601      impl.registerChangeListener(listener);
602    }
603
604
605
606    /**
607     * {@inheritDoc}
608     */
609    public void removeChangeListener(
610        ConfigurationChangeListener<AdministrationConnectorCfg> listener) {
611      impl.deregisterChangeListener(listener);
612    }
613
614
615
616    /**
617     * {@inheritDoc}
618     */
619    public String getKeyManagerProvider() {
620      return pKeyManagerProvider;
621    }
622
623
624
625    /**
626     * {@inheritDoc}
627     */
628    public DN getKeyManagerProviderDN() {
629      String value = getKeyManagerProvider();
630      if (value == null) return null;
631      return INSTANCE.getKeyManagerProviderPropertyDefinition().getChildDN(value);
632    }
633
634
635
636    /**
637     * {@inheritDoc}
638     */
639    public SortedSet<InetAddress> getListenAddress() {
640      return pListenAddress;
641    }
642
643
644
645    /**
646     * {@inheritDoc}
647     */
648    public int getListenPort() {
649      return pListenPort;
650    }
651
652
653
654    /**
655     * {@inheritDoc}
656     */
657    public String getSSLCertNickname() {
658      return pSSLCertNickname;
659    }
660
661
662
663    /**
664     * {@inheritDoc}
665     */
666    public SortedSet<String> getSSLCipherSuite() {
667      return pSSLCipherSuite;
668    }
669
670
671
672    /**
673     * {@inheritDoc}
674     */
675    public SortedSet<String> getSSLProtocol() {
676      return pSSLProtocol;
677    }
678
679
680
681    /**
682     * {@inheritDoc}
683     */
684    public String getTrustManagerProvider() {
685      return pTrustManagerProvider;
686    }
687
688
689
690    /**
691     * {@inheritDoc}
692     */
693    public DN getTrustManagerProviderDN() {
694      String value = getTrustManagerProvider();
695      if (value == null) return null;
696      return INSTANCE.getTrustManagerProviderPropertyDefinition().getChildDN(value);
697    }
698
699
700
701    /**
702     * {@inheritDoc}
703     */
704    public Class<? extends AdministrationConnectorCfg> configurationClass() {
705      return AdministrationConnectorCfg.class;
706    }
707
708
709
710    /**
711     * {@inheritDoc}
712     */
713    public DN dn() {
714      return impl.getDN();
715    }
716
717  }
718}