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 * docs/licenses/cddl.txt
011 * or http://www.opensource.org/licenses/cddl1.php.
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 * docs/licenses/cddl.txt. 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 2010-2013 UnboundID Corp.
026 */
027 package com.unboundid.directory.sdk.ds.scripting;
028
029
030
031 import com.unboundid.directory.sdk.common.internal.Configurable;
032 import com.unboundid.directory.sdk.ds.internal.DirectoryServerExtension;
033 import com.unboundid.directory.sdk.ds.types.DirectoryServerContext;
034 import com.unboundid.directory.sdk.ds.types.TaskContext;
035 import com.unboundid.directory.sdk.ds.types.TaskReturnState;
036 import com.unboundid.directory.sdk.proxy.internal.DirectoryProxyServerExtension;
037 import com.unboundid.directory.sdk.sync.internal.SynchronizationServerExtension;
038 import com.unboundid.ldap.sdk.LDAPException;
039 import com.unboundid.util.Extensible;
040 import com.unboundid.util.ThreadSafety;
041 import com.unboundid.util.ThreadSafetyLevel;
042 import com.unboundid.util.args.ArgumentException;
043 import com.unboundid.util.args.ArgumentParser;
044
045
046
047 /**
048 * This class defines an API that must be implemented by scripted extensions
049 * which may be used as administrative tasks. Administrative tasks have the
050 * ability to perform arbitrary processing within the server whenever a
051 * particular kind of entry is added, and that processing can be performed
052 * immediately or at some specified time in the future. Tasks may be scheduled
053 * by adding an entry below "cn=Scheduled Tasks,cn=tasks" with a format like
054 * the following:
055 * <PRE>
056 * dn: ds-task-id=TASKID,cn=Scheduled Tasks,cn=tasks
057 * objectClass: top
058 * objectClass: ds-task
059 * objectClass: ds-groovy-scripted-task
060 * ds-task-id: TASKID
061 * ds-task-class-name: com.unboundid.directory.sdk.extensions.GroovyScrip
062 * tedTask
063 * ds-scripted-task-class: com.example.ExampleGroovyTask
064 * ds-scripted-task-argument: name=value
065 * </PRE>
066 * In this example, TASKID should be replaced with a string that uniquely
067 * identifies the task. The value of the ds-scripted-task-class attribute
068 * should contain the fully-qualified name of the non-abstract Groovy class that
069 * extends this com.unboundid.directory.sdk.scripting.ScriptedTask class, and
070 * the ds-scripted-task-argument values (if any) should reflect the set of
071 * arguments to be provided for the task.
072 * method.
073 * <BR><BR>
074 * Alternately, the com.unboundid.ldap.sdk.unboundidds.tasks.GroovyScriptedTask
075 * class included in the Commercial Edition of the UnboundID LDAP SDK for Java
076 * may be used to schedule and interact with these kinds of tasks. See the
077 * documentation for the Commercial Edition of the LDAP SDK for more
078 * information on using the UnboundID LDAP SDK for Java to schedule and interact
079 * with administrative tasks.
080 *
081 * @see com.unboundid.directory.sdk.ds.api.Task
082 */
083 @Extensible()
084 @DirectoryServerExtension()
085 @DirectoryProxyServerExtension(appliesToLocalContent=true,
086 appliesToRemoteContent=false)
087 @SynchronizationServerExtension(appliesToLocalContent=true,
088 appliesToSynchronizedContent=false)
089 @ThreadSafety(level=ThreadSafetyLevel.INTERFACE_THREADSAFE)
090 public abstract class ScriptedTask
091 implements Configurable
092 {
093 /**
094 * Creates a new instance of this task. All task implementations must include
095 * a default constructor, but any initialization should generally be done in
096 * the {@code initializeTask} method.
097 */
098 public ScriptedTask()
099 {
100 // No implementation is required.
101 }
102
103
104
105 /**
106 * {@inheritDoc}
107 */
108 public void defineConfigArguments(final ArgumentParser parser)
109 throws ArgumentException
110 {
111 // No arguments will be allowed by default.
112 }
113
114
115
116 /**
117 * Initializes this task.
118 *
119 * @param serverContext A handle to the server context for the server in
120 * which this extension is running.
121 * @param parser The argument parser which has been initialized from
122 * the configuration for this task.
123 *
124 * @throws LDAPException If a problem occurs while initializing this task.
125 */
126 public void initializeTask(final DirectoryServerContext serverContext,
127 final ArgumentParser parser)
128 throws LDAPException
129 {
130 // No initialization will be performed by default.
131 }
132
133
134
135 /**
136 * Performs the appropriate processing for this task.
137 *
138 * @param taskContext Information about the task to be run.
139 *
140 * @return Information about the state of the task after processing has
141 * completed.
142 */
143 public abstract TaskReturnState runTask(final TaskContext taskContext);
144 }