From 22094368c2865dcfb6daf8366425212b721a4657 Mon Sep 17 00:00:00 2001
From: matthew_swift <matthew_swift@localhost>
Date: Thu, 05 Feb 2009 17:42:14 +0000
Subject: [PATCH] Merge ASN1 branch to trunk
---
opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java | 212 ++++++++++++++++++++++++++++++++---------------------
1 files changed, 128 insertions(+), 84 deletions(-)
diff --git a/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java b/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
index 20eea6f..57da85e 100644
--- a/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
+++ b/opends/tests/unit-tests-testng/src/server/org/opends/server/plugins/DelayPreOpPlugin.java
@@ -28,22 +28,23 @@
+import java.util.Set;
import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
+import java.io.IOException;
import org.opends.server.admin.std.server.PluginCfg;
import org.opends.server.api.plugin.DirectoryServerPlugin;
import org.opends.server.api.plugin.PluginType;
import org.opends.server.api.plugin.PluginResult;
import org.opends.server.config.ConfigException;
-import org.opends.server.protocols.asn1.ASN1Long;
-import org.opends.server.protocols.asn1.ASN1OctetString;
-import org.opends.server.protocols.ldap.LDAPControl;
-import org.opends.server.types.Control;
-import org.opends.server.types.ResultCode;
-import org.opends.server.types.CanceledOperationException;
+import org.opends.server.protocols.asn1.ASN1Writer;
+import org.opends.server.protocols.asn1.ASN1Reader;
+import org.opends.server.protocols.asn1.ASN1;
+import static org.opends.server.protocols.asn1.ASN1Constants.UNIVERSAL_OCTET_STRING_TYPE;
+import org.opends.server.types.*;
import org.opends.server.types.operation.*;
+import org.opends.server.controls.ControlDecoder;
import org.opends.messages.Message;
@@ -64,6 +65,93 @@
*/
public static final String OID_DELAY_REQUEST = "1.3.6.1.4.1.26027.1.999.1";
+ /**
+ * The control used by this plugin.
+ */
+ public static class DelayRequestControl extends Control
+ {
+
+ /**
+ * ControlDecoder implentation to decode this control from a ByteString.
+ */
+ private final static class Decoder
+ implements ControlDecoder<DelayRequestControl>
+ {
+ /**
+ * {@inheritDoc}
+ */
+ public DelayRequestControl decode(boolean isCritical, ByteString value)
+ throws DirectoryException
+ {
+ ASN1Reader reader = ASN1.getReader(value);
+
+ try
+ {
+ long delay = reader.readInteger();
+
+ return new DelayRequestControl(isCritical, delay);
+ }
+ catch (Exception e)
+ {
+ // TODO: Need a better message
+ throw new DirectoryException(ResultCode.PROTOCOL_ERROR, null, e);
+ }
+ }
+
+ public String getOID()
+ {
+ return OID_DELAY_REQUEST;
+ }
+
+ }
+
+ /**
+ * The Control Decoder that can be used to decode this control.
+ */
+ public static final ControlDecoder<DelayRequestControl> DECODER =
+ new Decoder();
+
+
+ private long delayDuration;
+
+ /**
+ * Constructs a new change number control.
+ *
+ * @param isCritical Indicates whether support for this control should be
+ * considered a critical part of the server processing.
+ * @param delayDuration The requested delay duration.
+ */
+ public DelayRequestControl(boolean isCritical, long delayDuration)
+ {
+ super(OID_DELAY_REQUEST, isCritical);
+ this.delayDuration = delayDuration;
+ }
+
+ /**
+ * Writes this control's value to an ASN.1 writer. The value (if any)
+ * must be written as an ASN1OctetString.
+ *
+ * @param writer The ASN.1 writer to use.
+ * @throws IOException If a problem occurs while writing to the stream.
+ */
+ @Override
+ protected void writeValue(ASN1Writer writer) throws IOException {
+ writer.writeStartSequence(UNIVERSAL_OCTET_STRING_TYPE);
+ writer.writeInteger(delayDuration);
+ writer.writeEndSequence();
+ }
+
+ /**
+ * Retrieves the delay duration.
+ *
+ * @return The delay duration.
+ */
+ public long getDelayDuration()
+ {
+ return delayDuration;
+ }
+ }
+
/**
@@ -228,45 +316,39 @@
*/
private PluginResult.PreOperation
doPreOperationInternal(PreOperationOperation operation)
- throws CanceledOperationException {
- long delayDuration = 0L;
- List<Control> requestControls = operation.getRequestControls();
- if (requestControls != null)
+ throws CanceledOperationException
+ {
+ DelayRequestControl control;
+ try
{
- for (Control c : requestControls)
+ control = operation.getRequestControl(DelayRequestControl.DECODER);
+ }
+ catch (Exception e)
+ {
+ return PluginResult.PreOperation.stopProcessing(
+ ResultCode.PROTOCOL_ERROR,
+ Message.raw("Unable to decode the delay request control: " +
+ e));
+ }
+
+ if(control != null)
+ {
+ long delayDuration = control.getDelayDuration();
+ if (delayDuration <= 0)
{
- if (c.getOID().equals(OID_DELAY_REQUEST))
- {
- try
- {
- delayDuration =
- ASN1Long.decodeAsLong(c.getValue().value()).longValue();
- }
- catch (Exception e)
- {
- return PluginResult.PreOperation.stopProcessing(
- ResultCode.PROTOCOL_ERROR,
- Message.raw("Unable to decode the delay request control: " +
- e));
- }
- }
+ return PluginResult.PreOperation.continueOperationProcessing();
}
- }
- if (delayDuration <= 0)
- {
- return PluginResult.PreOperation.continueOperationProcessing();
- }
-
- long stopSleepTime = System.currentTimeMillis() + delayDuration;
- while (System.currentTimeMillis() < stopSleepTime)
- {
- operation.checkIfCanceled(false);
-
- try
+ long stopSleepTime = System.currentTimeMillis() + delayDuration;
+ while (System.currentTimeMillis() < stopSleepTime)
{
- Thread.sleep(10);
- } catch (Exception e) {}
+ operation.checkIfCanceled(false);
+
+ try
+ {
+ Thread.sleep(10);
+ } catch (Exception e) {}
+ }
}
return PluginResult.PreOperation.continueOperationProcessing();
@@ -274,6 +356,7 @@
+
/**
* Creates a delay request control with the specified delay.
*
@@ -283,44 +366,7 @@
*/
public static Control createDelayControl(long delay)
{
- return new Control(OID_DELAY_REQUEST, false,
- new ASN1OctetString(new ASN1Long(delay).encode()));
- }
-
-
-
- /**
- * Retrieves a list containing a delay request control with the specified
- * delay.
- *
- * @param delay The length of time in milliseconds to sleep.
- *
- * @return A list containing the appropriate delay request control.
- */
- public static List<Control> createDelayControlList(long delay)
- {
- ArrayList<Control> controlList = new ArrayList<Control>(1);
-
- ASN1OctetString controlValue =
- new ASN1OctetString(new ASN1Long(delay).encode());
- controlList.add(new Control(OID_DELAY_REQUEST, false, controlValue));
-
- return controlList;
- }
-
-
-
- /**
- * Creates a delay request LDAP control with the specified delay.
- *
- * @param delay The length of time in milliseconds to sleep.
- *
- * @return The appropriate delay request LDAP control.
- */
- public static LDAPControl createDelayLDAPControl(long delay)
- {
- return new LDAPControl(OID_DELAY_REQUEST, false,
- new ASN1OctetString(new ASN1Long(delay).encode()));
+ return new DelayRequestControl(false, delay);
}
@@ -333,13 +379,11 @@
*
* @return A list containing the appropriate delay request LDAP control.
*/
- public static ArrayList<LDAPControl> createDelayLDAPControlList(long delay)
+ public static List<Control> createDelayControlList(long delay)
{
- ArrayList<LDAPControl> controlList = new ArrayList<LDAPControl>(1);
+ ArrayList<Control> controlList = new ArrayList<Control>(1);
- ASN1OctetString controlValue =
- new ASN1OctetString(new ASN1Long(delay).encode());
- controlList.add(new LDAPControl(OID_DELAY_REQUEST, false, controlValue));
+ controlList.add(new DelayRequestControl(false, delay));
return controlList;
}
--
Gitblit v1.10.0