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