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    }