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.opends.server.admin.std.meta; 027 028 029 030import java.util.Collection; 031import java.util.SortedSet; 032import org.forgerock.opendj.ldap.AddressMask; 033import org.opends.server.admin.AdministratorAction; 034import org.opends.server.admin.AliasDefaultBehaviorProvider; 035import org.opends.server.admin.BooleanPropertyDefinition; 036import org.opends.server.admin.ClassPropertyDefinition; 037import org.opends.server.admin.client.AuthorizationException; 038import org.opends.server.admin.client.CommunicationException; 039import org.opends.server.admin.client.ConcurrentModificationException; 040import org.opends.server.admin.client.ManagedObject; 041import org.opends.server.admin.client.MissingMandatoryPropertiesException; 042import org.opends.server.admin.client.OperationRejectedException; 043import org.opends.server.admin.IPAddressMaskPropertyDefinition; 044import org.opends.server.admin.ManagedObjectAlreadyExistsException; 045import org.opends.server.admin.ManagedObjectDefinition; 046import org.opends.server.admin.PropertyOption; 047import org.opends.server.admin.PropertyProvider; 048import org.opends.server.admin.server.ConfigurationChangeListener; 049import org.opends.server.admin.server.ServerManagedObject; 050import org.opends.server.admin.std.client.ConnectionHandlerCfgClient; 051import org.opends.server.admin.std.server.ConnectionHandlerCfg; 052import org.opends.server.admin.Tag; 053import org.opends.server.admin.TopCfgDefn; 054import org.opends.server.admin.UndefinedDefaultBehaviorProvider; 055import org.opends.server.types.DN; 056 057 058 059/** 060 * An interface for querying the Connection Handler managed object 061 * definition meta information. 062 * <p> 063 * Connection Handlers are responsible for handling all interaction 064 * with the clients, including accepting the connections, reading 065 * requests, and sending responses. 066 */ 067public final class ConnectionHandlerCfgDefn extends ManagedObjectDefinition<ConnectionHandlerCfgClient, ConnectionHandlerCfg> { 068 069 // The singleton configuration definition instance. 070 private static final ConnectionHandlerCfgDefn INSTANCE = new ConnectionHandlerCfgDefn(); 071 072 073 074 // The "allowed-client" property definition. 075 private static final IPAddressMaskPropertyDefinition PD_ALLOWED_CLIENT; 076 077 078 079 // The "denied-client" property definition. 080 private static final IPAddressMaskPropertyDefinition PD_DENIED_CLIENT; 081 082 083 084 // The "enabled" property definition. 085 private static final BooleanPropertyDefinition PD_ENABLED; 086 087 088 089 // The "java-class" property definition. 090 private static final ClassPropertyDefinition PD_JAVA_CLASS; 091 092 093 094 // Build the "allowed-client" property definition. 095 static { 096 IPAddressMaskPropertyDefinition.Builder builder = IPAddressMaskPropertyDefinition.createBuilder(INSTANCE, "allowed-client"); 097 builder.setOption(PropertyOption.MULTI_VALUED); 098 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "allowed-client")); 099 builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<AddressMask>(INSTANCE, "allowed-client")); 100 PD_ALLOWED_CLIENT = builder.getInstance(); 101 INSTANCE.registerPropertyDefinition(PD_ALLOWED_CLIENT); 102 } 103 104 105 106 // Build the "denied-client" property definition. 107 static { 108 IPAddressMaskPropertyDefinition.Builder builder = IPAddressMaskPropertyDefinition.createBuilder(INSTANCE, "denied-client"); 109 builder.setOption(PropertyOption.MULTI_VALUED); 110 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "denied-client")); 111 builder.setDefaultBehaviorProvider(new AliasDefaultBehaviorProvider<AddressMask>(INSTANCE, "denied-client")); 112 PD_DENIED_CLIENT = builder.getInstance(); 113 INSTANCE.registerPropertyDefinition(PD_DENIED_CLIENT); 114 } 115 116 117 118 // Build the "enabled" property definition. 119 static { 120 BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "enabled"); 121 builder.setOption(PropertyOption.MANDATORY); 122 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "enabled")); 123 builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<Boolean>()); 124 PD_ENABLED = builder.getInstance(); 125 INSTANCE.registerPropertyDefinition(PD_ENABLED); 126 } 127 128 129 130 // Build the "java-class" property definition. 131 static { 132 ClassPropertyDefinition.Builder builder = ClassPropertyDefinition.createBuilder(INSTANCE, "java-class"); 133 builder.setOption(PropertyOption.MANDATORY); 134 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.COMPONENT_RESTART, INSTANCE, "java-class")); 135 builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>()); 136 builder.addInstanceOf("org.opends.server.api.ConnectionHandler"); 137 PD_JAVA_CLASS = builder.getInstance(); 138 INSTANCE.registerPropertyDefinition(PD_JAVA_CLASS); 139 } 140 141 142 143 // Register the tags associated with this managed object definition. 144 static { 145 INSTANCE.registerTag(Tag.valueOf("core-server")); 146 } 147 148 149 150 /** 151 * Get the Connection Handler configuration definition singleton. 152 * 153 * @return Returns the Connection Handler configuration definition 154 * singleton. 155 */ 156 public static ConnectionHandlerCfgDefn getInstance() { 157 return INSTANCE; 158 } 159 160 161 162 /** 163 * Private constructor. 164 */ 165 private ConnectionHandlerCfgDefn() { 166 super("connection-handler", TopCfgDefn.getInstance()); 167 } 168 169 170 171 /** 172 * {@inheritDoc} 173 */ 174 public ConnectionHandlerCfgClient createClientConfiguration( 175 ManagedObject<? extends ConnectionHandlerCfgClient> impl) { 176 return new ConnectionHandlerCfgClientImpl(impl); 177 } 178 179 180 181 /** 182 * {@inheritDoc} 183 */ 184 public ConnectionHandlerCfg createServerConfiguration( 185 ServerManagedObject<? extends ConnectionHandlerCfg> impl) { 186 return new ConnectionHandlerCfgServerImpl(impl); 187 } 188 189 190 191 /** 192 * {@inheritDoc} 193 */ 194 public Class<ConnectionHandlerCfg> getServerConfigurationClass() { 195 return ConnectionHandlerCfg.class; 196 } 197 198 199 200 /** 201 * Get the "allowed-client" property definition. 202 * <p> 203 * Specifies a set of host names or address masks that determine the 204 * clients that are allowed to establish connections to this 205 * Connection Handler. 206 * <p> 207 * Valid values include a host name, a fully qualified domain name, 208 * a domain name, an IP address, or a subnetwork with subnetwork 209 * mask. 210 * 211 * @return Returns the "allowed-client" property definition. 212 */ 213 public IPAddressMaskPropertyDefinition getAllowedClientPropertyDefinition() { 214 return PD_ALLOWED_CLIENT; 215 } 216 217 218 219 /** 220 * Get the "denied-client" property definition. 221 * <p> 222 * Specifies a set of host names or address masks that determine the 223 * clients that are not allowed to establish connections to this 224 * Connection Handler. 225 * <p> 226 * Valid values include a host name, a fully qualified domain name, 227 * a domain name, an IP address, or a subnetwork with subnetwork 228 * mask. If both allowed and denied client masks are defined and a 229 * client connection matches one or more masks in both lists, then 230 * the connection is denied. If only a denied list is specified, then 231 * any client not matching a mask in that list is allowed. 232 * 233 * @return Returns the "denied-client" property definition. 234 */ 235 public IPAddressMaskPropertyDefinition getDeniedClientPropertyDefinition() { 236 return PD_DENIED_CLIENT; 237 } 238 239 240 241 /** 242 * Get the "enabled" property definition. 243 * <p> 244 * Indicates whether the Connection Handler is enabled. 245 * 246 * @return Returns the "enabled" property definition. 247 */ 248 public BooleanPropertyDefinition getEnabledPropertyDefinition() { 249 return PD_ENABLED; 250 } 251 252 253 254 /** 255 * Get the "java-class" property definition. 256 * <p> 257 * Specifies the fully-qualified name of the Java class that 258 * provides the Connection Handler implementation. 259 * 260 * @return Returns the "java-class" property definition. 261 */ 262 public ClassPropertyDefinition getJavaClassPropertyDefinition() { 263 return PD_JAVA_CLASS; 264 } 265 266 267 268 /** 269 * Managed object client implementation. 270 */ 271 private static class ConnectionHandlerCfgClientImpl implements 272 ConnectionHandlerCfgClient { 273 274 // Private implementation. 275 private ManagedObject<? extends ConnectionHandlerCfgClient> impl; 276 277 278 279 // Private constructor. 280 private ConnectionHandlerCfgClientImpl( 281 ManagedObject<? extends ConnectionHandlerCfgClient> impl) { 282 this.impl = impl; 283 } 284 285 286 287 /** 288 * {@inheritDoc} 289 */ 290 public SortedSet<AddressMask> getAllowedClient() { 291 return impl.getPropertyValues(INSTANCE.getAllowedClientPropertyDefinition()); 292 } 293 294 295 296 /** 297 * {@inheritDoc} 298 */ 299 public void setAllowedClient(Collection<AddressMask> values) { 300 impl.setPropertyValues(INSTANCE.getAllowedClientPropertyDefinition(), values); 301 } 302 303 304 305 /** 306 * {@inheritDoc} 307 */ 308 public SortedSet<AddressMask> getDeniedClient() { 309 return impl.getPropertyValues(INSTANCE.getDeniedClientPropertyDefinition()); 310 } 311 312 313 314 /** 315 * {@inheritDoc} 316 */ 317 public void setDeniedClient(Collection<AddressMask> values) { 318 impl.setPropertyValues(INSTANCE.getDeniedClientPropertyDefinition(), values); 319 } 320 321 322 323 /** 324 * {@inheritDoc} 325 */ 326 public Boolean isEnabled() { 327 return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition()); 328 } 329 330 331 332 /** 333 * {@inheritDoc} 334 */ 335 public void setEnabled(boolean value) { 336 impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value); 337 } 338 339 340 341 /** 342 * {@inheritDoc} 343 */ 344 public String getJavaClass() { 345 return impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition()); 346 } 347 348 349 350 /** 351 * {@inheritDoc} 352 */ 353 public void setJavaClass(String value) { 354 impl.setPropertyValue(INSTANCE.getJavaClassPropertyDefinition(), value); 355 } 356 357 358 359 /** 360 * {@inheritDoc} 361 */ 362 public ManagedObjectDefinition<? extends ConnectionHandlerCfgClient, ? extends ConnectionHandlerCfg> definition() { 363 return INSTANCE; 364 } 365 366 367 368 /** 369 * {@inheritDoc} 370 */ 371 public PropertyProvider properties() { 372 return impl; 373 } 374 375 376 377 /** 378 * {@inheritDoc} 379 */ 380 public void commit() throws ManagedObjectAlreadyExistsException, 381 MissingMandatoryPropertiesException, ConcurrentModificationException, 382 OperationRejectedException, AuthorizationException, 383 CommunicationException { 384 impl.commit(); 385 } 386 387 388 389 /** {@inheritDoc} */ 390 public String toString() { 391 return impl.toString(); 392 } 393 } 394 395 396 397 /** 398 * Managed object server implementation. 399 */ 400 private static class ConnectionHandlerCfgServerImpl implements 401 ConnectionHandlerCfg { 402 403 // Private implementation. 404 private ServerManagedObject<? extends ConnectionHandlerCfg> impl; 405 406 // The value of the "allowed-client" property. 407 private final SortedSet<AddressMask> pAllowedClient; 408 409 // The value of the "denied-client" property. 410 private final SortedSet<AddressMask> pDeniedClient; 411 412 // The value of the "enabled" property. 413 private final boolean pEnabled; 414 415 // The value of the "java-class" property. 416 private final String pJavaClass; 417 418 419 420 // Private constructor. 421 private ConnectionHandlerCfgServerImpl(ServerManagedObject<? extends ConnectionHandlerCfg> impl) { 422 this.impl = impl; 423 this.pAllowedClient = impl.getPropertyValues(INSTANCE.getAllowedClientPropertyDefinition()); 424 this.pDeniedClient = impl.getPropertyValues(INSTANCE.getDeniedClientPropertyDefinition()); 425 this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition()); 426 this.pJavaClass = impl.getPropertyValue(INSTANCE.getJavaClassPropertyDefinition()); 427 } 428 429 430 431 /** 432 * {@inheritDoc} 433 */ 434 public void addChangeListener( 435 ConfigurationChangeListener<ConnectionHandlerCfg> listener) { 436 impl.registerChangeListener(listener); 437 } 438 439 440 441 /** 442 * {@inheritDoc} 443 */ 444 public void removeChangeListener( 445 ConfigurationChangeListener<ConnectionHandlerCfg> listener) { 446 impl.deregisterChangeListener(listener); 447 } 448 449 450 451 /** 452 * {@inheritDoc} 453 */ 454 public SortedSet<AddressMask> getAllowedClient() { 455 return pAllowedClient; 456 } 457 458 459 460 /** 461 * {@inheritDoc} 462 */ 463 public SortedSet<AddressMask> getDeniedClient() { 464 return pDeniedClient; 465 } 466 467 468 469 /** 470 * {@inheritDoc} 471 */ 472 public boolean isEnabled() { 473 return pEnabled; 474 } 475 476 477 478 /** 479 * {@inheritDoc} 480 */ 481 public String getJavaClass() { 482 return pJavaClass; 483 } 484 485 486 487 /** 488 * {@inheritDoc} 489 */ 490 public Class<? extends ConnectionHandlerCfg> configurationClass() { 491 return ConnectionHandlerCfg.class; 492 } 493 494 495 496 /** 497 * {@inheritDoc} 498 */ 499 public DN dn() { 500 return impl.getDN(); 501 } 502 503 504 505 /** {@inheritDoc} */ 506 public String toString() { 507 return impl.toString(); 508 } 509 } 510}