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.opends.server.admin.std.meta;
017
018
019
020import java.util.Collection;
021import org.forgerock.opendj.config.server.ConfigException;
022import org.forgerock.opendj.ldap.DN;
023import org.opends.server.admin.AdministratorAction;
024import org.opends.server.admin.AliasDefaultBehaviorProvider;
025import org.opends.server.admin.BooleanPropertyDefinition;
026import org.opends.server.admin.ClassPropertyDefinition;
027import org.opends.server.admin.client.AuthorizationException;
028import org.opends.server.admin.client.CommunicationException;
029import org.opends.server.admin.client.ConcurrentModificationException;
030import org.opends.server.admin.client.IllegalManagedObjectNameException;
031import org.opends.server.admin.client.ManagedObject;
032import org.opends.server.admin.client.ManagedObjectDecodingException;
033import org.opends.server.admin.client.MissingMandatoryPropertiesException;
034import org.opends.server.admin.client.OperationRejectedException;
035import org.opends.server.admin.DefaultBehaviorProvider;
036import org.opends.server.admin.DefinedDefaultBehaviorProvider;
037import org.opends.server.admin.DefinitionDecodingException;
038import org.opends.server.admin.DurationPropertyDefinition;
039import org.opends.server.admin.InstantiableRelationDefinition;
040import org.opends.server.admin.IntegerPropertyDefinition;
041import org.opends.server.admin.ManagedObjectAlreadyExistsException;
042import org.opends.server.admin.ManagedObjectDefinition;
043import org.opends.server.admin.ManagedObjectNotFoundException;
044import org.opends.server.admin.OptionalRelationDefinition;
045import org.opends.server.admin.PropertyException;
046import org.opends.server.admin.PropertyOption;
047import org.opends.server.admin.PropertyProvider;
048import org.opends.server.admin.server.ConfigurationAddListener;
049import org.opends.server.admin.server.ConfigurationChangeListener;
050import org.opends.server.admin.server.ConfigurationDeleteListener;
051import org.opends.server.admin.server.ServerManagedObject;
052import org.opends.server.admin.std.client.ReplicationDomainCfgClient;
053import org.opends.server.admin.std.client.ReplicationServerCfgClient;
054import org.opends.server.admin.std.client.ReplicationSynchronizationProviderCfgClient;
055import org.opends.server.admin.std.server.ReplicationDomainCfg;
056import org.opends.server.admin.std.server.ReplicationServerCfg;
057import org.opends.server.admin.std.server.ReplicationSynchronizationProviderCfg;
058import org.opends.server.admin.std.server.SynchronizationProviderCfg;
059import org.opends.server.admin.Tag;
060
061
062
063/**
064 * An interface for querying the Replication Synchronization Provider
065 * managed object definition meta information.
066 * <p>
067 * The Replication Synchronization Provider provides multi-master
068 * replication of data across multiple directory server instances.
069 */
070public final class ReplicationSynchronizationProviderCfgDefn extends ManagedObjectDefinition<ReplicationSynchronizationProviderCfgClient, ReplicationSynchronizationProviderCfg> {
071
072  // The singleton configuration definition instance.
073  private static final ReplicationSynchronizationProviderCfgDefn INSTANCE = new ReplicationSynchronizationProviderCfgDefn();
074
075
076
077  // The "connection-timeout" property definition.
078  private static final DurationPropertyDefinition PD_CONNECTION_TIMEOUT;
079
080
081
082  // The "java-class" property definition.
083  private static final ClassPropertyDefinition PD_JAVA_CLASS;
084
085
086
087  // The "num-update-replay-threads" property definition.
088  private static final IntegerPropertyDefinition PD_NUM_UPDATE_REPLAY_THREADS;
089
090
091
092  // The "replication-domains" relation definition.
093  private static final InstantiableRelationDefinition<ReplicationDomainCfgClient, ReplicationDomainCfg> RD_REPLICATION_DOMAINS;
094
095
096
097  // The "replication-server" relation definition.
098  private static final OptionalRelationDefinition<ReplicationServerCfgClient, ReplicationServerCfg> RD_REPLICATION_SERVER;
099
100
101
102  // Build the "connection-timeout" property definition.
103  static {
104      DurationPropertyDefinition.Builder builder = DurationPropertyDefinition.createBuilder(INSTANCE, "connection-timeout");
105      builder.setOption(PropertyOption.ADVANCED);
106      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "connection-timeout"));
107      DefaultBehaviorProvider<Long> provider = new DefinedDefaultBehaviorProvider<Long>("5 seconds");
108      builder.setDefaultBehaviorProvider(provider);
109      builder.setBaseUnit("ms");
110      builder.setLowerLimit("0");
111      PD_CONNECTION_TIMEOUT = builder.getInstance();
112      INSTANCE.registerPropertyDefinition(PD_CONNECTION_TIMEOUT);
113  }
114
115
116
117  // Build the "java-class" property definition.
118  static {
119      ClassPropertyDefinition.Builder builder = ClassPropertyDefinition.createBuilder(INSTANCE, "java-class");
120      builder.setOption(PropertyOption.MANDATORY);
121      builder.setOption(PropertyOption.ADVANCED);
122      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "java-class"));
123      DefaultBehaviorProvider<String> provider = new DefinedDefaultBehaviorProvider<String>("org.opends.server.replication.plugin.MultimasterReplication");
124      builder.setDefaultBehaviorProvider(provider);
125      builder.addInstanceOf("org.opends.server.api.SynchronizationProvider");
126      PD_JAVA_CLASS = builder.getInstance();
127      INSTANCE.registerPropertyDefinition(PD_JAVA_CLASS);
128  }
129
130
131
132  // Build the "num-update-replay-threads" property definition.
133  static {
134      IntegerPropertyDefinition.Builder builder = IntegerPropertyDefinition.createBuilder(INSTANCE, "num-update-replay-threads");
135      builder.setOption(PropertyOption.ADVANCED);
136      builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "num-update-replay-threads"));
137      builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<Integer>(INSTANCE, "num-update-replay-threads"));
138      builder.setUpperLimit(65535);
139      builder.setLowerLimit(1);
140      PD_NUM_UPDATE_REPLAY_THREADS = builder.getInstance();
141      INSTANCE.registerPropertyDefinition(PD_NUM_UPDATE_REPLAY_THREADS);
142  }
143
144
145
146  // Build the "replication-domains" relation definition.
147  static {
148    InstantiableRelationDefinition.Builder<ReplicationDomainCfgClient, ReplicationDomainCfg> builder =
149      new InstantiableRelationDefinition.Builder<ReplicationDomainCfgClient, ReplicationDomainCfg>(INSTANCE, "replication-domain", "replication-domains", ReplicationDomainCfgDefn.getInstance());
150    RD_REPLICATION_DOMAINS = builder.getInstance();
151    INSTANCE.registerRelationDefinition(RD_REPLICATION_DOMAINS);
152  }
153
154
155
156  // Build the "replication-server" relation definition.
157  static {
158    OptionalRelationDefinition.Builder<ReplicationServerCfgClient, ReplicationServerCfg> builder =
159      new OptionalRelationDefinition.Builder<ReplicationServerCfgClient, ReplicationServerCfg>(INSTANCE, "replication-server", ReplicationServerCfgDefn.getInstance());
160    RD_REPLICATION_SERVER = builder.getInstance();
161    INSTANCE.registerRelationDefinition(RD_REPLICATION_SERVER);
162  }
163
164
165
166  // Register the tags associated with this managed object definition.
167  static {
168    INSTANCE.registerTag(Tag.valueOf("replication"));
169  }
170
171
172
173  /**
174   * Get the Replication Synchronization Provider configuration
175   * definition singleton.
176   *
177   * @return Returns the Replication Synchronization Provider
178   *         configuration definition singleton.
179   */
180  public static ReplicationSynchronizationProviderCfgDefn getInstance() {
181    return INSTANCE;
182  }
183
184
185
186  /**
187   * Private constructor.
188   */
189  private ReplicationSynchronizationProviderCfgDefn() {
190    super("replication-synchronization-provider", SynchronizationProviderCfgDefn.getInstance());
191  }
192
193
194
195  /**
196   * {@inheritDoc}
197   */
198  public ReplicationSynchronizationProviderCfgClient createClientConfiguration(
199      ManagedObject<? extends ReplicationSynchronizationProviderCfgClient> impl) {
200    return new ReplicationSynchronizationProviderCfgClientImpl(impl);
201  }
202
203
204
205  /**
206   * {@inheritDoc}
207   */
208  public ReplicationSynchronizationProviderCfg createServerConfiguration(
209      ServerManagedObject<? extends ReplicationSynchronizationProviderCfg> impl) {
210    return new ReplicationSynchronizationProviderCfgServerImpl(impl);
211  }
212
213
214
215  /**
216   * {@inheritDoc}
217   */
218  public Class<ReplicationSynchronizationProviderCfg> getServerConfigurationClass() {
219    return ReplicationSynchronizationProviderCfg.class;
220  }
221
222
223
224  /**
225   * Get the "connection-timeout" property definition.
226   * <p>
227   * Specifies the timeout used when connecting to peers and when
228   * performing SSL negotiation.
229   *
230   * @return Returns the "connection-timeout" property definition.
231   */
232  public DurationPropertyDefinition getConnectionTimeoutPropertyDefinition() {
233    return PD_CONNECTION_TIMEOUT;
234  }
235
236
237
238  /**
239   * Get the "enabled" property definition.
240   * <p>
241   * Indicates whether the Replication Synchronization Provider is
242   * enabled for use.
243   *
244   * @return Returns the "enabled" property definition.
245   */
246  public BooleanPropertyDefinition getEnabledPropertyDefinition() {
247    return SynchronizationProviderCfgDefn.getInstance().getEnabledPropertyDefinition();
248  }
249
250
251
252  /**
253   * Get the "java-class" property definition.
254   * <p>
255   * Specifies the fully-qualified name of the Java class that
256   * provides the Replication Synchronization Provider implementation.
257   *
258   * @return Returns the "java-class" property definition.
259   */
260  public ClassPropertyDefinition getJavaClassPropertyDefinition() {
261    return PD_JAVA_CLASS;
262  }
263
264
265
266  /**
267   * Get the "num-update-replay-threads" property definition.
268   * <p>
269   * Specifies the number of update replay threads.
270   * <p>
271   * This value is the number of threads created for replaying every
272   * updates received for all the replication domains.
273   *
274   * @return Returns the "num-update-replay-threads" property definition.
275   */
276  public IntegerPropertyDefinition getNumUpdateReplayThreadsPropertyDefinition() {
277    return PD_NUM_UPDATE_REPLAY_THREADS;
278  }
279
280
281
282  /**
283   * Get the "replication-domains" relation definition.
284   *
285   * @return Returns the "replication-domains" relation definition.
286   */
287  public InstantiableRelationDefinition<ReplicationDomainCfgClient,ReplicationDomainCfg> getReplicationDomainsRelationDefinition() {
288    return RD_REPLICATION_DOMAINS;
289  }
290
291
292
293  /**
294   * Get the "replication-server" relation definition.
295   *
296   * @return Returns the "replication-server" relation definition.
297   */
298  public OptionalRelationDefinition<ReplicationServerCfgClient,ReplicationServerCfg> getReplicationServerRelationDefinition() {
299    return RD_REPLICATION_SERVER;
300  }
301
302
303
304  /**
305   * Managed object client implementation.
306   */
307  private static class ReplicationSynchronizationProviderCfgClientImpl implements
308    ReplicationSynchronizationProviderCfgClient {
309
310    // Private implementation.
311    private ManagedObject<? extends ReplicationSynchronizationProviderCfgClient> impl;
312
313
314
315    // Private constructor.
316    private ReplicationSynchronizationProviderCfgClientImpl(
317        ManagedObject<? extends ReplicationSynchronizationProviderCfgClient> impl) {
318      this.impl = impl;
319    }
320
321
322
323    /**
324     * {@inheritDoc}
325     */
326    public long getConnectionTimeout() {
327      return impl.getPropertyValue(INSTANCE.getConnectionTimeoutPropertyDefinition());
328    }
329
330
331
332    /**
333     * {@inheritDoc}
334     */
335    public void setConnectionTimeout(Long value) {
336      impl.setPropertyValue(INSTANCE.getConnectionTimeoutPropertyDefinition(), value);
337    }
338
339
340
341    /**
342     * {@inheritDoc}
343     */
344    public Boolean isEnabled() {
345      return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
346    }
347
348
349
350    /**
351     * {@inheritDoc}
352     */
353    public void setEnabled(boolean value) {
354      impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value);
355    }
356
357
358
359    /**
360     * {@inheritDoc}
361     */
362    public String getJavaClass() {
363      return impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
364    }
365
366
367
368    /**
369     * {@inheritDoc}
370     */
371    public void setJavaClass(String value) {
372      impl.setPropertyValue(INSTANCE.getJavaClassPropertyDefinition(), value);
373    }
374
375
376
377    /**
378     * {@inheritDoc}
379     */
380    public Integer getNumUpdateReplayThreads() {
381      return impl.getPropertyValue(INSTANCE.getNumUpdateReplayThreadsPropertyDefinition());
382    }
383
384
385
386    /**
387     * {@inheritDoc}
388     */
389    public void setNumUpdateReplayThreads(Integer value) {
390      impl.setPropertyValue(INSTANCE.getNumUpdateReplayThreadsPropertyDefinition(), value);
391    }
392
393
394
395    /**
396     * {@inheritDoc}
397     */
398    public String[] listReplicationDomains() throws ConcurrentModificationException,
399        AuthorizationException, CommunicationException {
400      return impl.listChildren(INSTANCE.getReplicationDomainsRelationDefinition());
401    }
402
403
404
405    /**
406     * {@inheritDoc}
407     */
408    public ReplicationDomainCfgClient getReplicationDomain(String name)
409        throws DefinitionDecodingException, ManagedObjectDecodingException,
410        ManagedObjectNotFoundException, ConcurrentModificationException,
411        AuthorizationException, CommunicationException {
412      return impl.getChild(INSTANCE.getReplicationDomainsRelationDefinition(), name).getConfiguration();
413    }
414
415
416
417    /**
418     * {@inheritDoc}
419     */
420    public <M extends ReplicationDomainCfgClient> M createReplicationDomain(
421        ManagedObjectDefinition<M, ? extends ReplicationDomainCfg> d, String name, Collection<PropertyException> exceptions) throws IllegalManagedObjectNameException {
422      return impl.createChild(INSTANCE.getReplicationDomainsRelationDefinition(), d, name, exceptions).getConfiguration();
423    }
424
425
426
427    /**
428     * {@inheritDoc}
429     */
430    public void removeReplicationDomain(String name)
431        throws ManagedObjectNotFoundException, ConcurrentModificationException,
432        OperationRejectedException, AuthorizationException, CommunicationException {
433      impl.removeChild(INSTANCE.getReplicationDomainsRelationDefinition(), name);
434    }
435
436
437
438    /**
439     * {@inheritDoc}
440     */
441    public boolean hasReplicationServer() throws ConcurrentModificationException,
442        AuthorizationException, CommunicationException {
443      return impl.hasChild(INSTANCE.getReplicationServerRelationDefinition());
444    }
445
446
447
448    /**
449     * {@inheritDoc}
450     */
451    public ReplicationServerCfgClient getReplicationServer()
452        throws DefinitionDecodingException, ManagedObjectDecodingException,
453        ManagedObjectNotFoundException, ConcurrentModificationException,
454        AuthorizationException, CommunicationException {
455      return impl.getChild(INSTANCE.getReplicationServerRelationDefinition()).getConfiguration();
456    }
457
458
459
460    /**
461     * {@inheritDoc}
462     */
463    public <M extends ReplicationServerCfgClient> M createReplicationServer(
464        ManagedObjectDefinition<M, ? extends ReplicationServerCfg> d, Collection<PropertyException> exceptions) {
465      return impl.createChild(INSTANCE.getReplicationServerRelationDefinition(), d, exceptions).getConfiguration();
466    }
467
468
469
470    /**
471     * {@inheritDoc}
472     */
473    public void removeReplicationServer()
474        throws ManagedObjectNotFoundException, ConcurrentModificationException,
475        OperationRejectedException, AuthorizationException, CommunicationException {
476      impl.removeChild(INSTANCE.getReplicationServerRelationDefinition());
477    }
478
479
480
481    /**
482     * {@inheritDoc}
483     */
484    public ManagedObjectDefinition<? extends ReplicationSynchronizationProviderCfgClient, ? extends ReplicationSynchronizationProviderCfg> definition() {
485      return INSTANCE;
486    }
487
488
489
490    /**
491     * {@inheritDoc}
492     */
493    public PropertyProvider properties() {
494      return impl;
495    }
496
497
498
499    /**
500     * {@inheritDoc}
501     */
502    public void commit() throws ManagedObjectAlreadyExistsException,
503        MissingMandatoryPropertiesException, ConcurrentModificationException,
504        OperationRejectedException, AuthorizationException,
505        CommunicationException {
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 ReplicationSynchronizationProviderCfgServerImpl implements
523    ReplicationSynchronizationProviderCfg {
524
525    // Private implementation.
526    private ServerManagedObject<? extends ReplicationSynchronizationProviderCfg> impl;
527
528    // The value of the "connection-timeout" property.
529    private final long pConnectionTimeout;
530
531    // The value of the "enabled" property.
532    private final boolean pEnabled;
533
534    // The value of the "java-class" property.
535    private final String pJavaClass;
536
537    // The value of the "num-update-replay-threads" property.
538    private final Integer pNumUpdateReplayThreads;
539
540
541
542    // Private constructor.
543    private ReplicationSynchronizationProviderCfgServerImpl(ServerManagedObject<? extends ReplicationSynchronizationProviderCfg> impl) {
544      this.impl = impl;
545      this.pConnectionTimeout = impl.getPropertyValue(INSTANCE.getConnectionTimeoutPropertyDefinition());
546      this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition());
547      this.pJavaClass = impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition());
548      this.pNumUpdateReplayThreads = impl.getPropertyValue(INSTANCE.getNumUpdateReplayThreadsPropertyDefinition());
549    }
550
551
552
553    /**
554     * {@inheritDoc}
555     */
556    public void addReplicationChangeListener(
557        ConfigurationChangeListener<ReplicationSynchronizationProviderCfg> listener) {
558      impl.registerChangeListener(listener);
559    }
560
561
562
563    /**
564     * {@inheritDoc}
565     */
566    public void removeReplicationChangeListener(
567        ConfigurationChangeListener<ReplicationSynchronizationProviderCfg> listener) {
568      impl.deregisterChangeListener(listener);
569    }
570    /**
571     * {@inheritDoc}
572     */
573    public void addChangeListener(
574        ConfigurationChangeListener<SynchronizationProviderCfg> listener) {
575      impl.registerChangeListener(listener);
576    }
577
578
579
580    /**
581     * {@inheritDoc}
582     */
583    public void removeChangeListener(
584        ConfigurationChangeListener<SynchronizationProviderCfg> listener) {
585      impl.deregisterChangeListener(listener);
586    }
587
588
589
590    /**
591     * {@inheritDoc}
592     */
593    public long getConnectionTimeout() {
594      return pConnectionTimeout;
595    }
596
597
598
599    /**
600     * {@inheritDoc}
601     */
602    public boolean isEnabled() {
603      return pEnabled;
604    }
605
606
607
608    /**
609     * {@inheritDoc}
610     */
611    public String getJavaClass() {
612      return pJavaClass;
613    }
614
615
616
617    /**
618     * {@inheritDoc}
619     */
620    public Integer getNumUpdateReplayThreads() {
621      return pNumUpdateReplayThreads;
622    }
623
624
625
626    /**
627     * {@inheritDoc}
628     */
629    public String[] listReplicationDomains() {
630      return impl.listChildren(INSTANCE.getReplicationDomainsRelationDefinition());
631    }
632
633
634
635    /**
636     * {@inheritDoc}
637     */
638    public ReplicationDomainCfg getReplicationDomain(String name) throws ConfigException {
639      return impl.getChild(INSTANCE.getReplicationDomainsRelationDefinition(), name).getConfiguration();
640    }
641
642
643
644    /**
645     * {@inheritDoc}
646     */
647    public void addReplicationDomainAddListener(
648        ConfigurationAddListener<ReplicationDomainCfg> listener) throws ConfigException {
649      impl.registerAddListener(INSTANCE.getReplicationDomainsRelationDefinition(), listener);
650    }
651
652
653
654    /**
655     * {@inheritDoc}
656     */
657    public void removeReplicationDomainAddListener(
658        ConfigurationAddListener<ReplicationDomainCfg> listener) {
659      impl.deregisterAddListener(INSTANCE.getReplicationDomainsRelationDefinition(), listener);
660    }
661
662
663
664    /**
665     * {@inheritDoc}
666     */
667    public void addReplicationDomainDeleteListener(
668        ConfigurationDeleteListener<ReplicationDomainCfg> listener) throws ConfigException {
669      impl.registerDeleteListener(INSTANCE.getReplicationDomainsRelationDefinition(), listener);
670    }
671
672
673
674    /**
675     * {@inheritDoc}
676     */
677    public void removeReplicationDomainDeleteListener(
678        ConfigurationDeleteListener<ReplicationDomainCfg> listener) {
679      impl.deregisterDeleteListener(INSTANCE.getReplicationDomainsRelationDefinition(), listener);
680    }
681
682
683
684    /**
685     * {@inheritDoc}
686     */
687    public boolean hasReplicationServer() {
688      return impl.hasChild(INSTANCE.getReplicationServerRelationDefinition());
689    }
690
691
692
693    /**
694     * {@inheritDoc}
695     */
696    public ReplicationServerCfg getReplicationServer() throws ConfigException {
697      return impl.getChild(INSTANCE.getReplicationServerRelationDefinition()).getConfiguration();
698    }
699
700
701
702    /**
703     * {@inheritDoc}
704     */
705    public void addReplicationServerAddListener(
706        ConfigurationAddListener<ReplicationServerCfg> listener) throws ConfigException {
707      impl.registerAddListener(INSTANCE.getReplicationServerRelationDefinition(), listener);
708    }
709
710
711
712    /**
713     * {@inheritDoc}
714     */
715    public void removeReplicationServerAddListener(
716        ConfigurationAddListener<ReplicationServerCfg> listener) {
717      impl.deregisterAddListener(INSTANCE.getReplicationServerRelationDefinition(), listener);
718    }
719
720
721
722    /**
723     * {@inheritDoc}
724     */
725    public void addReplicationServerDeleteListener(
726        ConfigurationDeleteListener<ReplicationServerCfg> listener) throws ConfigException {
727      impl.registerDeleteListener(INSTANCE.getReplicationServerRelationDefinition(), listener);
728    }
729
730
731
732    /**
733     * {@inheritDoc}
734     */
735    public void removeReplicationServerDeleteListener(
736        ConfigurationDeleteListener<ReplicationServerCfg> listener) {
737      impl.deregisterDeleteListener(INSTANCE.getReplicationServerRelationDefinition(), listener);
738    }
739
740
741
742    /**
743     * {@inheritDoc}
744     */
745    public Class<? extends ReplicationSynchronizationProviderCfg> configurationClass() {
746      return ReplicationSynchronizationProviderCfg.class;
747    }
748
749
750
751    /**
752     * {@inheritDoc}
753     */
754    public DN dn() {
755      return impl.getDN();
756    }
757
758
759
760    /** {@inheritDoc} */
761    public String toString() {
762      return impl.toString();
763    }
764  }
765}