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 010 * trunk/opends/resource/legal-notices/OpenDS.LICENSE 011 * or https://OpenDS.dev.java.net/OpenDS.LICENSE. 012 * See the License for the specific language governing permissions 013 * and limitations under the License. 014 * 015 * When distributing Covered Code, include this CDDL HEADER in each 016 * file and include the License file at 017 * trunk/opends/resource/legal-notices/OpenDS.LICENSE. If applicable, 018 * add the following below this CDDL HEADER, with the fields enclosed 019 * by brackets "[]" replaced with your own identifying information: 020 * Portions Copyright [yyyy] [name of copyright owner] 021 * 022 * CDDL HEADER END 023 * 024 * 025 * Copyright 2008 Sun Microsystems, Inc. 026 */ 027 package org.opends.server.admin.std.meta; 028 029 030 031 import java.util.Collection; 032 import java.util.SortedSet; 033 import org.opends.server.admin.AdministratorAction; 034 import org.opends.server.admin.AliasDefaultBehaviorProvider; 035 import org.opends.server.admin.client.AuthorizationException; 036 import org.opends.server.admin.client.CommunicationException; 037 import org.opends.server.admin.client.ConcurrentModificationException; 038 import org.opends.server.admin.client.ManagedObject; 039 import org.opends.server.admin.client.MissingMandatoryPropertiesException; 040 import org.opends.server.admin.client.OperationRejectedException; 041 import org.opends.server.admin.DNPropertyDefinition; 042 import org.opends.server.admin.ManagedObjectAlreadyExistsException; 043 import org.opends.server.admin.ManagedObjectDefinition; 044 import org.opends.server.admin.PropertyOption; 045 import org.opends.server.admin.PropertyProvider; 046 import org.opends.server.admin.server.ConfigurationChangeListener; 047 import org.opends.server.admin.server.ServerManagedObject; 048 import org.opends.server.admin.std.client.RootDNUserCfgClient; 049 import org.opends.server.admin.std.server.RootDNUserCfg; 050 import org.opends.server.admin.Tag; 051 import org.opends.server.admin.TopCfgDefn; 052 import org.opends.server.types.DN; 053 054 055 056 /** 057 * An interface for querying the Root DN User managed object 058 * definition meta information. 059 * <p> 060 * A Root DN User are administrative users who can granted special 061 * privileges that are not available to non-root users (for example, 062 * the ability to bind to the server in lockdown mode). 063 */ 064 public final class RootDNUserCfgDefn extends ManagedObjectDefinition<RootDNUserCfgClient, RootDNUserCfg> { 065 066 // The singleton configuration definition instance. 067 private static final RootDNUserCfgDefn INSTANCE = new RootDNUserCfgDefn(); 068 069 070 071 // The "alternate-bind-dn" property definition. 072 private static final DNPropertyDefinition PD_ALTERNATE_BIND_DN; 073 074 075 076 // Build the "alternate-bind-dn" property definition. 077 static { 078 DNPropertyDefinition.Builder builder = DNPropertyDefinition.createBuilder(INSTANCE, "alternate-bind-dn"); 079 builder.setOption(PropertyOption.MULTI_VALUED); 080 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "alternate-bind-dn")); 081 builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<DN>(INSTANCE, "alternate-bind-dn")); 082 PD_ALTERNATE_BIND_DN = builder.getInstance(); 083 INSTANCE.registerPropertyDefinition(PD_ALTERNATE_BIND_DN); 084 } 085 086 087 088 // Register the tags associated with this managed object definition. 089 static { 090 INSTANCE.registerTag(Tag.valueOf("core-server")); 091 } 092 093 094 095 /** 096 * Get the Root DN User configuration definition singleton. 097 * 098 * @return Returns the Root DN User configuration definition 099 * singleton. 100 */ 101 public static RootDNUserCfgDefn getInstance() { 102 return INSTANCE; 103 } 104 105 106 107 /** 108 * Private constructor. 109 */ 110 private RootDNUserCfgDefn() { 111 super("root-dn-user", TopCfgDefn.getInstance()); 112 } 113 114 115 116 /** 117 * {@inheritDoc} 118 */ 119 public RootDNUserCfgClient createClientConfiguration( 120 ManagedObject<? extends RootDNUserCfgClient> impl) { 121 return new RootDNUserCfgClientImpl(impl); 122 } 123 124 125 126 /** 127 * {@inheritDoc} 128 */ 129 public RootDNUserCfg createServerConfiguration( 130 ServerManagedObject<? extends RootDNUserCfg> impl) { 131 return new RootDNUserCfgServerImpl(impl); 132 } 133 134 135 136 /** 137 * {@inheritDoc} 138 */ 139 public Class<RootDNUserCfg> getServerConfigurationClass() { 140 return RootDNUserCfg.class; 141 } 142 143 144 145 /** 146 * Get the "alternate-bind-dn" property definition. 147 * <p> 148 * Specifies one or more alternate DNs that can be used to bind to 149 * the server as this root user. 150 * 151 * @return Returns the "alternate-bind-dn" property definition. 152 */ 153 public DNPropertyDefinition getAlternateBindDNPropertyDefinition() { 154 return PD_ALTERNATE_BIND_DN; 155 } 156 157 158 159 /** 160 * Managed object client implementation. 161 */ 162 private static class RootDNUserCfgClientImpl implements 163 RootDNUserCfgClient { 164 165 // Private implementation. 166 private ManagedObject<? extends RootDNUserCfgClient> impl; 167 168 169 170 // Private constructor. 171 private RootDNUserCfgClientImpl( 172 ManagedObject<? extends RootDNUserCfgClient> impl) { 173 this.impl = impl; 174 } 175 176 177 178 /** 179 * {@inheritDoc} 180 */ 181 public SortedSet<DN> getAlternateBindDN() { 182 return impl.getPropertyValues(INSTANCE.getAlternateBindDNPropertyDefinition()); 183 } 184 185 186 187 /** 188 * {@inheritDoc} 189 */ 190 public void setAlternateBindDN(Collection<DN> values) { 191 impl.setPropertyValues(INSTANCE.getAlternateBindDNPropertyDefinition(), values); 192 } 193 194 195 196 /** 197 * {@inheritDoc} 198 */ 199 public ManagedObjectDefinition<? extends RootDNUserCfgClient, ? extends RootDNUserCfg> definition() { 200 return INSTANCE; 201 } 202 203 204 205 /** 206 * {@inheritDoc} 207 */ 208 public PropertyProvider properties() { 209 return impl; 210 } 211 212 213 214 /** 215 * {@inheritDoc} 216 */ 217 public void commit() throws ManagedObjectAlreadyExistsException, 218 MissingMandatoryPropertiesException, ConcurrentModificationException, 219 OperationRejectedException, AuthorizationException, 220 CommunicationException { 221 impl.commit(); 222 } 223 224 } 225 226 227 228 /** 229 * Managed object server implementation. 230 */ 231 private static class RootDNUserCfgServerImpl implements 232 RootDNUserCfg { 233 234 // Private implementation. 235 private ServerManagedObject<? extends RootDNUserCfg> impl; 236 237 // The value of the "alternate-bind-dn" property. 238 private final SortedSet<DN> pAlternateBindDN; 239 240 241 242 // Private constructor. 243 private RootDNUserCfgServerImpl(ServerManagedObject<? extends RootDNUserCfg> impl) { 244 this.impl = impl; 245 this.pAlternateBindDN = impl.getPropertyValues(INSTANCE.getAlternateBindDNPropertyDefinition()); 246 } 247 248 249 250 /** 251 * {@inheritDoc} 252 */ 253 public void addChangeListener( 254 ConfigurationChangeListener<RootDNUserCfg> listener) { 255 impl.registerChangeListener(listener); 256 } 257 258 259 260 /** 261 * {@inheritDoc} 262 */ 263 public void removeChangeListener( 264 ConfigurationChangeListener<RootDNUserCfg> listener) { 265 impl.deregisterChangeListener(listener); 266 } 267 268 269 270 /** 271 * {@inheritDoc} 272 */ 273 public SortedSet<DN> getAlternateBindDN() { 274 return pAlternateBindDN; 275 } 276 277 278 279 /** 280 * {@inheritDoc} 281 */ 282 public Class<? extends RootDNUserCfg> configurationClass() { 283 return RootDNUserCfg.class; 284 } 285 286 287 288 /** 289 * {@inheritDoc} 290 */ 291 public DN dn() { 292 return impl.getDN(); 293 } 294 295 } 296 }