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 org.opends.server.admin.AdministratorAction; 032 import org.opends.server.admin.AggregationPropertyDefinition; 033 import org.opends.server.admin.BooleanPropertyDefinition; 034 import org.opends.server.admin.client.AuthorizationException; 035 import org.opends.server.admin.client.CommunicationException; 036 import org.opends.server.admin.client.ConcurrentModificationException; 037 import org.opends.server.admin.client.ManagedObject; 038 import org.opends.server.admin.client.MissingMandatoryPropertiesException; 039 import org.opends.server.admin.client.OperationRejectedException; 040 import org.opends.server.admin.DNPropertyDefinition; 041 import org.opends.server.admin.ManagedObjectAlreadyExistsException; 042 import org.opends.server.admin.ManagedObjectDefinition; 043 import org.opends.server.admin.PropertyIsReadOnlyException; 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.WorkflowCfgClient; 049 import org.opends.server.admin.std.client.WorkflowElementCfgClient; 050 import org.opends.server.admin.std.server.WorkflowCfg; 051 import org.opends.server.admin.std.server.WorkflowElementCfg; 052 import org.opends.server.admin.StringPropertyDefinition; 053 import org.opends.server.admin.Tag; 054 import org.opends.server.admin.TopCfgDefn; 055 import org.opends.server.admin.UndefinedDefaultBehaviorProvider; 056 import org.opends.server.types.DN; 057 058 059 060 /** 061 * An interface for querying the Workflow managed object definition 062 * meta information. 063 * <p> 064 * The Workflow is a list of processing steps (Work Flow Elements) 065 * that are applied to data as it is retrieved from the Directory 066 * Server. 067 */ 068 public final class WorkflowCfgDefn extends ManagedObjectDefinition<WorkflowCfgClient, WorkflowCfg> { 069 070 // The singleton configuration definition instance. 071 private static final WorkflowCfgDefn INSTANCE = new WorkflowCfgDefn(); 072 073 074 075 // The "base-dn" property definition. 076 private static final DNPropertyDefinition PD_BASE_DN; 077 078 079 080 // The "enabled" property definition. 081 private static final BooleanPropertyDefinition PD_ENABLED; 082 083 084 085 // The "workflow-element" property definition. 086 private static final AggregationPropertyDefinition<WorkflowElementCfgClient, WorkflowElementCfg> PD_WORKFLOW_ELEMENT; 087 088 089 090 // The "workflow-id" property definition. 091 private static final StringPropertyDefinition PD_WORKFLOW_ID; 092 093 094 095 // Build the "base-dn" property definition. 096 static { 097 DNPropertyDefinition.Builder builder = DNPropertyDefinition.createBuilder(INSTANCE, "base-dn"); 098 builder.setOption(PropertyOption.MANDATORY); 099 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "base-dn")); 100 builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<DN>()); 101 PD_BASE_DN = builder.getInstance(); 102 INSTANCE.registerPropertyDefinition(PD_BASE_DN); 103 } 104 105 106 107 // Build the "enabled" property definition. 108 static { 109 BooleanPropertyDefinition.Builder builder = BooleanPropertyDefinition.createBuilder(INSTANCE, "enabled"); 110 builder.setOption(PropertyOption.MANDATORY); 111 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "enabled")); 112 builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<Boolean>()); 113 PD_ENABLED = builder.getInstance(); 114 INSTANCE.registerPropertyDefinition(PD_ENABLED); 115 } 116 117 118 119 // Build the "workflow-element" property definition. 120 static { 121 AggregationPropertyDefinition.Builder<WorkflowElementCfgClient, WorkflowElementCfg> builder = AggregationPropertyDefinition.createBuilder(INSTANCE, "workflow-element"); 122 builder.setOption(PropertyOption.MANDATORY); 123 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "workflow-element")); 124 builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>()); 125 builder.setParentPath("/"); 126 builder.setRelationDefinition("workflow-element"); 127 PD_WORKFLOW_ELEMENT = builder.getInstance(); 128 INSTANCE.registerPropertyDefinition(PD_WORKFLOW_ELEMENT); 129 INSTANCE.registerConstraint(PD_WORKFLOW_ELEMENT.getSourceConstraint()); 130 } 131 132 133 134 // Build the "workflow-id" property definition. 135 static { 136 StringPropertyDefinition.Builder builder = StringPropertyDefinition.createBuilder(INSTANCE, "workflow-id"); 137 builder.setOption(PropertyOption.READ_ONLY); 138 builder.setOption(PropertyOption.MANDATORY); 139 builder.setAdministratorAction(new AdministratorAction(AdministratorAction.Type.NONE, INSTANCE, "workflow-id")); 140 builder.setDefaultBehaviorProvider(new UndefinedDefaultBehaviorProvider<String>()); 141 PD_WORKFLOW_ID = builder.getInstance(); 142 INSTANCE.registerPropertyDefinition(PD_WORKFLOW_ID); 143 } 144 145 146 147 // Register the tags associated with this managed object definition. 148 static { 149 INSTANCE.registerTag(Tag.valueOf("core-server")); 150 } 151 152 153 154 /** 155 * Get the Workflow configuration definition singleton. 156 * 157 * @return Returns the Workflow configuration definition singleton. 158 */ 159 public static WorkflowCfgDefn getInstance() { 160 return INSTANCE; 161 } 162 163 164 165 /** 166 * Private constructor. 167 */ 168 private WorkflowCfgDefn() { 169 super("workflow", TopCfgDefn.getInstance()); 170 } 171 172 173 174 /** 175 * {@inheritDoc} 176 */ 177 public WorkflowCfgClient createClientConfiguration( 178 ManagedObject<? extends WorkflowCfgClient> impl) { 179 return new WorkflowCfgClientImpl(impl); 180 } 181 182 183 184 /** 185 * {@inheritDoc} 186 */ 187 public WorkflowCfg createServerConfiguration( 188 ServerManagedObject<? extends WorkflowCfg> impl) { 189 return new WorkflowCfgServerImpl(impl); 190 } 191 192 193 194 /** 195 * {@inheritDoc} 196 */ 197 public Class<WorkflowCfg> getServerConfigurationClass() { 198 return WorkflowCfg.class; 199 } 200 201 202 203 /** 204 * Get the "base-dn" property definition. 205 * <p> 206 * Specifies the base DN of the data targeted by the Workflow . 207 * 208 * @return Returns the "base-dn" property definition. 209 */ 210 public DNPropertyDefinition getBaseDNPropertyDefinition() { 211 return PD_BASE_DN; 212 } 213 214 215 216 /** 217 * Get the "enabled" property definition. 218 * <p> 219 * Indicates whether the Workflow is enabled for use in the server. 220 * <p> 221 * If a Workflow is not enabled, then its contents are not 222 * accessible when processing operations. 223 * 224 * @return Returns the "enabled" property definition. 225 */ 226 public BooleanPropertyDefinition getEnabledPropertyDefinition() { 227 return PD_ENABLED; 228 } 229 230 231 232 /** 233 * Get the "workflow-element" property definition. 234 * <p> 235 * Specifies the root Work Flow Element in the Workflow . 236 * 237 * @return Returns the "workflow-element" property definition. 238 */ 239 public AggregationPropertyDefinition<WorkflowElementCfgClient, WorkflowElementCfg> getWorkflowElementPropertyDefinition() { 240 return PD_WORKFLOW_ELEMENT; 241 } 242 243 244 245 /** 246 * Get the "workflow-id" property definition. 247 * <p> 248 * Provides a name that identifies the Workflow. 249 * <p> 250 * The name must be unique among all Workflows in the server. 251 * 252 * @return Returns the "workflow-id" property definition. 253 */ 254 public StringPropertyDefinition getWorkflowIdPropertyDefinition() { 255 return PD_WORKFLOW_ID; 256 } 257 258 259 260 /** 261 * Managed object client implementation. 262 */ 263 private static class WorkflowCfgClientImpl implements 264 WorkflowCfgClient { 265 266 // Private implementation. 267 private ManagedObject<? extends WorkflowCfgClient> impl; 268 269 270 271 // Private constructor. 272 private WorkflowCfgClientImpl( 273 ManagedObject<? extends WorkflowCfgClient> impl) { 274 this.impl = impl; 275 } 276 277 278 279 /** 280 * {@inheritDoc} 281 */ 282 public DN getBaseDN() { 283 return impl.getPropertyValue(INSTANCE.getBaseDNPropertyDefinition()); 284 } 285 286 287 288 /** 289 * {@inheritDoc} 290 */ 291 public void setBaseDN(DN value) { 292 impl.setPropertyValue(INSTANCE.getBaseDNPropertyDefinition(), value); 293 } 294 295 296 297 /** 298 * {@inheritDoc} 299 */ 300 public Boolean isEnabled() { 301 return impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition()); 302 } 303 304 305 306 /** 307 * {@inheritDoc} 308 */ 309 public void setEnabled(boolean value) { 310 impl.setPropertyValue(INSTANCE.getEnabledPropertyDefinition(), value); 311 } 312 313 314 315 /** 316 * {@inheritDoc} 317 */ 318 public String getWorkflowElement() { 319 return impl.getPropertyValue(INSTANCE.getWorkflowElementPropertyDefinition()); 320 } 321 322 323 324 /** 325 * {@inheritDoc} 326 */ 327 public void setWorkflowElement(String value) { 328 impl.setPropertyValue(INSTANCE.getWorkflowElementPropertyDefinition(), value); 329 } 330 331 332 333 /** 334 * {@inheritDoc} 335 */ 336 public String getWorkflowId() { 337 return impl.getPropertyValue(INSTANCE.getWorkflowIdPropertyDefinition()); 338 } 339 340 341 342 /** 343 * {@inheritDoc} 344 */ 345 public void setWorkflowId(String value) throws PropertyIsReadOnlyException { 346 impl.setPropertyValue(INSTANCE.getWorkflowIdPropertyDefinition(), value); 347 } 348 349 350 351 /** 352 * {@inheritDoc} 353 */ 354 public ManagedObjectDefinition<? extends WorkflowCfgClient, ? extends WorkflowCfg> definition() { 355 return INSTANCE; 356 } 357 358 359 360 /** 361 * {@inheritDoc} 362 */ 363 public PropertyProvider properties() { 364 return impl; 365 } 366 367 368 369 /** 370 * {@inheritDoc} 371 */ 372 public void commit() throws ManagedObjectAlreadyExistsException, 373 MissingMandatoryPropertiesException, ConcurrentModificationException, 374 OperationRejectedException, AuthorizationException, 375 CommunicationException { 376 impl.commit(); 377 } 378 379 } 380 381 382 383 /** 384 * Managed object server implementation. 385 */ 386 private static class WorkflowCfgServerImpl implements 387 WorkflowCfg { 388 389 // Private implementation. 390 private ServerManagedObject<? extends WorkflowCfg> impl; 391 392 // The value of the "base-dn" property. 393 private final DN pBaseDN; 394 395 // The value of the "enabled" property. 396 private final boolean pEnabled; 397 398 // The value of the "workflow-element" property. 399 private final String pWorkflowElement; 400 401 // The value of the "workflow-id" property. 402 private final String pWorkflowId; 403 404 405 406 // Private constructor. 407 private WorkflowCfgServerImpl(ServerManagedObject<? extends WorkflowCfg> impl) { 408 this.impl = impl; 409 this.pBaseDN = impl.getPropertyValue(INSTANCE.getBaseDNPropertyDefinition()); 410 this.pEnabled = impl.getPropertyValue(INSTANCE.getEnabledPropertyDefinition()); 411 this.pWorkflowElement = impl.getPropertyValue(INSTANCE.getWorkflowElementPropertyDefinition()); 412 this.pWorkflowId = impl.getPropertyValue(INSTANCE.getWorkflowIdPropertyDefinition()); 413 } 414 415 416 417 /** 418 * {@inheritDoc} 419 */ 420 public void addChangeListener( 421 ConfigurationChangeListener<WorkflowCfg> listener) { 422 impl.registerChangeListener(listener); 423 } 424 425 426 427 /** 428 * {@inheritDoc} 429 */ 430 public void removeChangeListener( 431 ConfigurationChangeListener<WorkflowCfg> listener) { 432 impl.deregisterChangeListener(listener); 433 } 434 435 436 437 /** 438 * {@inheritDoc} 439 */ 440 public DN getBaseDN() { 441 return pBaseDN; 442 } 443 444 445 446 /** 447 * {@inheritDoc} 448 */ 449 public boolean isEnabled() { 450 return pEnabled; 451 } 452 453 454 455 /** 456 * {@inheritDoc} 457 */ 458 public String getWorkflowElement() { 459 return pWorkflowElement; 460 } 461 462 463 464 /** 465 * {@inheritDoc} 466 */ 467 public DN getWorkflowElementDN() { 468 String value = getWorkflowElement(); 469 if (value == null) return null; 470 return INSTANCE.getWorkflowElementPropertyDefinition().getChildDN(value); 471 } 472 473 474 475 /** 476 * {@inheritDoc} 477 */ 478 public String getWorkflowId() { 479 return pWorkflowId; 480 } 481 482 483 484 /** 485 * {@inheritDoc} 486 */ 487 public Class<? extends WorkflowCfg> configurationClass() { 488 return WorkflowCfg.class; 489 } 490 491 492 493 /** 494 * {@inheritDoc} 495 */ 496 public DN dn() { 497 return impl.getDN(); 498 } 499 500 } 501 }