You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by pa...@apache.org on 2009/07/21 19:04:29 UTC

svn commit: r796383 [3/23] - in /directory/shared/trunk: ./ dsml-parser/ dsml-parser/src/ dsml-parser/src/main/ dsml-parser/src/main/java/ dsml-parser/src/main/java/org/ dsml-parser/src/main/java/org/apache/ dsml-parser/src/main/java/org/apache/directo...

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/LdapMessageDecorator.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/LdapMessageDecorator.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/LdapMessageDecorator.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/LdapMessageDecorator.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,478 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2;
+
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+import org.apache.directory.shared.asn1.AbstractAsn1Object;
+import org.apache.directory.shared.asn1.Asn1Object;
+import org.apache.directory.shared.asn1.codec.DecoderException;
+import org.apache.directory.shared.asn1.codec.EncoderException;
+import org.apache.directory.shared.ldap.codec.ControlCodec;
+import org.apache.directory.shared.ldap.codec.LdapMessageCodec;
+import org.apache.directory.shared.ldap.codec.LdapResponseCodec;
+import org.apache.directory.shared.ldap.codec.abandon.AbandonRequestCodec;
+import org.apache.directory.shared.ldap.codec.add.AddRequestCodec;
+import org.apache.directory.shared.ldap.codec.add.AddResponseCodec;
+import org.apache.directory.shared.ldap.codec.bind.BindRequestCodec;
+import org.apache.directory.shared.ldap.codec.bind.BindResponseCodec;
+import org.apache.directory.shared.ldap.codec.compare.CompareRequestCodec;
+import org.apache.directory.shared.ldap.codec.compare.CompareResponseCodec;
+import org.apache.directory.shared.ldap.codec.del.DelRequestCodec;
+import org.apache.directory.shared.ldap.codec.del.DelResponseCodec;
+import org.apache.directory.shared.ldap.codec.extended.ExtendedRequestCodec;
+import org.apache.directory.shared.ldap.codec.extended.ExtendedResponseCodec;
+import org.apache.directory.shared.ldap.codec.modify.ModifyRequestCodec;
+import org.apache.directory.shared.ldap.codec.modify.ModifyResponseCodec;
+import org.apache.directory.shared.ldap.codec.modifyDn.ModifyDNRequestCodec;
+import org.apache.directory.shared.ldap.codec.modifyDn.ModifyDNResponseCodec;
+import org.apache.directory.shared.ldap.codec.search.SearchRequestCodec;
+import org.apache.directory.shared.ldap.codec.search.SearchResultDoneCodec;
+import org.apache.directory.shared.ldap.codec.search.SearchResultEntryCodec;
+import org.apache.directory.shared.ldap.codec.search.SearchResultReferenceCodec;
+import org.apache.directory.shared.ldap.codec.unbind.UnBindRequestCodec;
+
+
+/**
+ * Decorator class for LDAP Message. This is the top level class, the one 
+ * that holds the instance.
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public abstract class LdapMessageDecorator extends LdapMessageCodec
+{
+    /** The decorated instance */
+    protected LdapMessageCodec instance;
+
+
+    /**
+     * Creates a new instance of LdapMessageDecorator.
+     *
+     * @param ldapMessage
+     *      the message to decorate
+     */
+    public LdapMessageDecorator( LdapMessageCodec ldapMessage )
+    {
+        instance = ldapMessage;
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#addControl(org.apache.directory.shared.ldap.codec.Control)
+     */
+    @Override
+    public void addControl( ControlCodec control )
+    {
+        instance.addControl( control );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#computeLength()
+     */
+    @Override
+    public int computeLength()
+    {
+        return instance.computeLength();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#encode(java.nio.ByteBuffer)
+     */
+    @Override
+    public ByteBuffer encode( ByteBuffer buffer ) throws EncoderException
+    {
+        return instance.encode( buffer );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getAbandonRequest()
+     */
+    @Override
+    public AbandonRequestCodec getAbandonRequest()
+    {
+        return instance.getAbandonRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getAddRequest()
+     */
+    @Override
+    public AddRequestCodec getAddRequest()
+    {
+        return instance.getAddRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getAddResponse()
+     */
+    @Override
+    public AddResponseCodec getAddResponse()
+    {
+        return instance.getAddResponse();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getBindRequest()
+     */
+    @Override
+    public BindRequestCodec getBindRequest()
+    {
+        return instance.getBindRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getBindResponse()
+     */
+    @Override
+    public BindResponseCodec getBindResponse()
+    {
+        return instance.getBindResponse();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getCompareRequest()
+     */
+    @Override
+    public CompareRequestCodec getCompareRequest()
+    {
+        return instance.getCompareRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getCompareResponse()
+     */
+    @Override
+    public CompareResponseCodec getCompareResponse()
+    {
+        return instance.getCompareResponse();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getControls()
+     */
+    @Override
+    public List<ControlCodec> getControls()
+    {
+        return instance.getControls();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getControls(int)
+     */
+    @Override
+    public ControlCodec getControls( int i )
+    {
+        return instance.getControls( i );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getCurrentControl()
+     */
+    @Override
+    public ControlCodec getCurrentControl()
+    {
+        return instance.getCurrentControl();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getDelRequest()
+     */
+    @Override
+    public DelRequestCodec getDelRequest()
+    {
+        return instance.getDelRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getDelResponse()
+     */
+    @Override
+    public DelResponseCodec getDelResponse()
+    {
+        return instance.getDelResponse();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getExtendedRequest()
+     */
+    @Override
+    public ExtendedRequestCodec getExtendedRequest()
+    {
+        return instance.getExtendedRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getExtendedResponse()
+     */
+    @Override
+    public ExtendedResponseCodec getExtendedResponse()
+    {
+        return instance.getExtendedResponse();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getLdapResponse()
+     */
+    @Override
+    public LdapResponseCodec getLdapResponse()
+    {
+        return instance.getLdapResponse();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getMessageId()
+     */
+    @Override
+    public int getMessageId()
+    {
+        return instance.getMessageId();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getMessageType()
+     */
+    @Override
+    public int getMessageType()
+    {
+        return instance.getMessageType();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getMessageTypeName()
+     */
+    @Override
+    public String getMessageTypeName()
+    {
+        return instance.getMessageTypeName();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getModifyDNRequest()
+     */
+    @Override
+    public ModifyDNRequestCodec getModifyDNRequest()
+    {
+        return instance.getModifyDNRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getModifyDNResponse()
+     */
+    @Override
+    public ModifyDNResponseCodec getModifyDNResponse()
+    {
+        return instance.getModifyDNResponse();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getModifyRequest()
+     */
+    @Override
+    public ModifyRequestCodec getModifyRequest()
+    {
+        return instance.getModifyRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getModifyResponse()
+     */
+    @Override
+    public ModifyResponseCodec getModifyResponse()
+    {
+        return instance.getModifyResponse();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getSearchRequest()
+     */
+    @Override
+    public SearchRequestCodec getSearchRequest()
+    {
+        return instance.getSearchRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getSearchResultDone()
+     */
+    @Override
+    public SearchResultDoneCodec getSearchResultDone()
+    {
+        return instance.getSearchResultDone();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getSearchResultEntry()
+     */
+    @Override
+    public SearchResultEntryCodec getSearchResultEntry()
+    {
+        return instance.getSearchResultEntry();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getSearchResultReference()
+     */
+    @Override
+    public SearchResultReferenceCodec getSearchResultReference()
+    {
+        return instance.getSearchResultReference();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#getUnBindRequest()
+     */
+    @Override
+    public UnBindRequestCodec getUnBindRequest()
+    {
+        return instance.getUnBindRequest();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#setMessageId(int)
+     */
+    @Override
+    public void setMessageId( int messageId )
+    {
+        instance.setMessageId( messageId );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#setProtocolOP(org.apache.directory.shared.asn1.Asn1Object)
+     */
+    @Override
+    public void setProtocolOP( Asn1Object protocolOp )
+    {
+        instance.setProtocolOP( protocolOp );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.ldap.codec.LdapMessageCodec#toString()
+     */
+    @Override
+    public String toString()
+    {
+        return instance.toString();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.asn1.Asn1Object#addLength(int)
+     */
+    @Override
+    public void addLength( int length ) throws DecoderException
+    {
+        instance.addLength( length );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.asn1.Asn1Object#getCurrentLength()
+     */
+    @Override
+    public int getCurrentLength()
+    {
+        return instance.getCurrentLength();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.asn1.Asn1Object#getExpectedLength()
+     */
+    @Override
+    public int getExpectedLength()
+    {
+        return instance.getExpectedLength();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.asn1.Asn1Object#getParent()
+     */
+    @Override
+    public AbstractAsn1Object getParent()
+    {
+        return instance.getParent();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.asn1.Asn1Object#setCurrentLength(int)
+     */
+    @Override
+    public void setCurrentLength( int currentLength )
+    {
+        instance.setCurrentLength( currentLength );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.asn1.Asn1Object#setExpectedLength(int)
+     */
+    @Override
+    public void setExpectedLength( int expectedLength )
+    {
+        instance.setExpectedLength( expectedLength );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.shared.asn1.Asn1Object#setParent(org.apache.directory.shared.asn1.Asn1Object)
+     */
+    public void setParent( AbstractAsn1Object parent )
+    {
+        instance.setParent( parent );
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/ParserUtils.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/ParserUtils.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/ParserUtils.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/ParserUtils.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,309 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2;
+
+
+import java.util.List;
+
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.stream.StreamSource;
+
+import org.apache.directory.shared.ldap.codec.ControlCodec;
+import org.apache.directory.shared.ldap.ldif.LdifUtils;
+import org.apache.directory.shared.ldap.util.Base64;
+import org.apache.directory.shared.ldap.util.StringTools;
+import org.apache.directory.studio.dsmlv2.engine.Dsmlv2Engine;
+import org.apache.directory.studio.dsmlv2.request.BatchRequest;
+import org.apache.directory.studio.dsmlv2.request.BatchRequest.Processing;
+import org.apache.directory.studio.dsmlv2.request.BatchRequest.ResponseOrder;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.dom4j.Namespace;
+import org.dom4j.QName;
+import org.dom4j.io.DocumentResult;
+import org.dom4j.io.DocumentSource;
+import org.xmlpull.v1.XmlPullParser;
+import org.xmlpull.v1.XmlPullParserException;
+
+
+/**
+ * This class is a Helper class for the DSML Parser
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class ParserUtils
+{
+    public static final String XML_SCHEMA_URI = "http://www.w3c.org/2001/XMLSchema";
+    public static final String XML_SCHEMA_INSTANCE_URI = "http://www.w3c.org/2001/XMLSchema-instance";
+    public static final String BASE64BINARY = "base64Binary";
+    public static final String XSI = "xsi";
+    public static final String XSD = "xsd";
+
+
+    /**
+     * Returns the value of the attribute 'type' of the "XMLSchema-instance' namespace if it exists
+     *
+     * @param xpp 
+     *      the XPP parser to use
+     * @return 
+     *      the value of the attribute 'type' of the "XMLSchema-instance' namespace if it exists
+     */
+    public static String getXsiTypeAttributeValue( XmlPullParser xpp )
+    {
+        String type = null;
+        int nbAttributes = xpp.getAttributeCount();
+        for ( int i = 0; i < nbAttributes; i++ )
+        {
+            // Checking if the attribute 'type' from XML Schema Instance namespace is used.
+            if ( xpp.getAttributeName( i ).equals( "type" )
+                && xpp.getNamespace( xpp.getAttributePrefix( i ) ).equals( XML_SCHEMA_INSTANCE_URI ) )
+            {
+                type = xpp.getAttributeValue( i );
+                break;
+            }
+        }
+        return type;
+    }
+
+
+    /**
+     * Tells is the given value is a Base64 binary value
+     * 
+     * @param parser
+     *      the XPP parser to use
+     * @param attrValue 
+     *      the attribute value
+     * @return 
+     *      true if the value of the current tag is Base64BinaryEncoded, false if not
+     */
+    public static boolean isBase64BinaryValue( XmlPullParser parser, String attrValue )
+    {
+        if ( attrValue == null )
+        {
+            return false;
+        }
+        // We are looking for something that should look like that: "aNameSpace:base64Binary"
+        // We split the String. The first element should be the namespace prefix and the second "base64Binary"
+        String[] splitedString = attrValue.split( ":" );
+        return ( splitedString.length == 2 ) && ( XML_SCHEMA_URI.equals( parser.getNamespace( splitedString[0] ) ) )
+            && ( BASE64BINARY.equals( splitedString[1] ) );
+    }
+
+
+    /**
+     * Indicates if the value needs to be encoded as Base64
+     *
+     * @param value 
+     *      the value to check
+     * @return 
+     *      true if the value needs to be encoded as Base64
+     */
+    public static boolean needsBase64Encoding( Object value )
+    {
+        if ( value instanceof byte[] )
+        {
+            return true;
+        }
+        else if ( value instanceof String )
+        {
+            return !LdifUtils.isLDIFSafe( ( String ) value );
+        }
+        return true;
+    }
+
+
+    /**
+     * Encodes the value as a Base64 String
+     *
+     * @param value 
+     *      the value to encode
+     * @return 
+     *      the value encoded as a Base64 String 
+     */
+    public static String base64Encode( Object value )
+    {
+        if ( value instanceof byte[] )
+        {
+            return new String( Base64.encode( ( byte[] ) value ) );
+        }
+        else if ( value instanceof String )
+        {
+            return new String( Base64.encode( StringTools.getBytesUtf8( ( String ) value ) ) );
+        }
+
+        return "";
+    }
+
+
+    /**
+     * Parses and verify the parsed value of the requestID
+     * 
+     * @param attributeValue 
+     *      the value of the attribute
+     * @param xpp 
+     *      the XmlPullParser
+     * @return
+     *      the int value of the resquestID
+     * @throws XmlPullParserException
+     *      if RequestID isn't an Integer and if requestID equals 0
+     */
+    public static int parseAndVerifyRequestID( String attributeValue, XmlPullParser xpp ) throws XmlPullParserException
+    {
+        try
+        {
+            int requestID = Integer.parseInt( attributeValue );
+
+            if ( requestID == 0 )
+            {
+                throw new XmlPullParserException( "The attribute requestID can't be equal to 0", xpp, null );
+            }
+
+            return requestID;
+        }
+        catch ( NumberFormatException e )
+        {
+            throw new XmlPullParserException( "the given requestID is not an integer", xpp, null );
+        }
+    }
+
+
+    /**
+     * Adds Controls to the given Element.
+     *
+     * @param element
+     *      the element to add the Controls to
+     * @param controls
+     *      a List of Controls
+     */
+    public static void addControls( Element element, List<ControlCodec> controls )
+    {
+        if ( controls != null )
+        {
+            for ( int i = 0; i < controls.size(); i++ )
+            {
+                ControlCodec control = controls.get( i );
+
+                Element controlElement = element.addElement( "control" );
+
+                if ( control.getControlType() != null )
+                {
+                    controlElement.addAttribute( "type", control.getControlType() );
+                }
+
+                if ( control.getCriticality() )
+                {
+                    controlElement.addAttribute( "criticality", "true" );
+                }
+
+                Object value = control.getControlValue();
+                if ( value != null )
+                {
+                    if ( ParserUtils.needsBase64Encoding( value ) )
+                    {
+                        Namespace xsdNamespace = new Namespace( ParserUtils.XSD, ParserUtils.XML_SCHEMA_URI );
+                        Namespace xsiNamespace = new Namespace( ParserUtils.XSI, ParserUtils.XML_SCHEMA_INSTANCE_URI );
+                        element.getDocument().getRootElement().add( xsdNamespace );
+                        element.getDocument().getRootElement().add( xsiNamespace );
+
+                        Element valueElement = controlElement.addElement( "controlValue" ).addText(
+                            ParserUtils.base64Encode( value ) );
+                        valueElement.addAttribute( new QName( "type", xsiNamespace ), ParserUtils.XSD + ":"
+                            + ParserUtils.BASE64BINARY );
+                    }
+                    else
+                    {
+                        controlElement.addElement( "controlValue" ).setText( ( String ) value );
+                    }
+                }
+            }
+        }
+    }
+
+
+    /**
+     * Indicates if a request ID is needed.
+     *
+     * @param container
+     *      the associated container
+     * @return
+     *      true if a request ID is needed (ie Processing=Parallel and ResponseOrder=Unordered)
+     * @throws XmlPullParserException
+     *      if the batch request has not been parsed yet
+     */
+    public static boolean isRequestIdNeeded( Dsmlv2Container container ) throws XmlPullParserException
+    {
+        BatchRequest batchRequest = container.getBatchRequest();
+
+        if ( batchRequest == null )
+        {
+            throw new XmlPullParserException( "unable to find the batch request", container.getParser(), null );
+        }
+
+        return ( ( batchRequest.getProcessing() == Processing.PARALLEL ) && ( batchRequest.getResponseOrder() == ResponseOrder.UNORDERED ) );
+    }
+
+
+    /**
+     * XML Pretty Printer XSLT Tranformation
+     * 
+     * @param document
+     *      the Dom4j Document
+     * @return
+     *      the transformed document
+     */
+    public static Document styleDocument( Document document )
+    {
+        // load the transformer using JAXP
+        TransformerFactory factory = TransformerFactory.newInstance();
+        Transformer transformer = null;
+        try
+        {
+            transformer = factory.newTransformer( new StreamSource( Dsmlv2Engine.class
+                .getResourceAsStream( "DSMLv2.xslt" ) ) );
+        }
+        catch ( TransformerConfigurationException e1 )
+        {
+            // TODO Auto-generated catch block
+            e1.printStackTrace();
+        }
+
+        // now lets style the given document
+        DocumentSource source = new DocumentSource( document );
+        DocumentResult result = new DocumentResult();
+        try
+        {
+            transformer.transform( source, result );
+        }
+        catch ( TransformerException e )
+        {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+
+        // return the transformed document
+        Document transformedDoc = result.getDocument();
+        return transformedDoc;
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/Tag.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/Tag.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/Tag.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/Tag.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,157 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2;
+
+
+/**
+ * This class represents a XML tag.
+ * A XML tag is defined with :
+ * <ul>
+ *      <li>a name</li>
+ *      <li>a type (START tag or END tag)</li>
+ * </ul>
+ * 
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class Tag
+{
+    /** The name of the tag */
+    private String name;
+
+    /** The type of the tag */
+    private int type;
+
+    /** This int represents a START tag */
+    public static int START = 0;
+
+    /** This int represents a END tag */
+    public static int END = 1;
+
+
+    /**
+     * Creates a new instance of Tag.
+     *
+     * @param name
+     *      the name of the tag
+     * @param type
+     *      the type of the tag
+     */
+    public Tag( String name, int type )
+    {
+        setName( name );
+        setType( type );
+    }
+
+
+    /**
+     * Gets the name of the tag
+     *
+     * @return
+     *      the name of the tag
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+
+    /**
+     * Sets the name of the tag
+     *
+     * @param name
+     *      the name to set
+     */
+    public void setName( String name )
+    {
+        this.name = name.toLowerCase();
+    }
+
+
+    /**
+     * Gets the type of the tag
+     *
+     * @return
+     *      the type of the tag
+     */
+    public int getType()
+    {
+        return type;
+    }
+
+
+    /**
+     * Sets the type of the tag
+     *
+     * @param type
+     *      the type to set
+     */
+    public void setType( int type )
+    {
+        this.type = type;
+    }
+
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#equals(java.lang.Object)
+     */
+    @Override
+    public boolean equals( Object obj )
+    {
+        if ( obj instanceof Tag )
+        {
+            Tag tag = ( Tag ) obj;
+            return ( ( this.name.equals( tag.getName() ) ) && ( this.type == tag.getType() ) );
+
+        }
+        else
+        {
+            return false;
+        }
+    }
+
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#hashCode()
+     */
+    @Override
+    public int hashCode()
+    {
+        return name.hashCode() + type << 24;
+    }
+
+
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString()
+    {
+        if ( name != null )
+        {
+            return "<" + ( ( type == Tag.END ) ? "/" : "" ) + name + ">";
+        }
+        else
+        {
+            return "Unknown tag";
+        }
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/engine/Dsmlv2Engine.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/engine/Dsmlv2Engine.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/engine/Dsmlv2Engine.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/engine/Dsmlv2Engine.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,649 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2.engine;
+
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.nio.channels.SocketChannel;
+
+import javax.naming.NamingException;
+
+import org.apache.directory.shared.asn1.ber.Asn1Decoder;
+import org.apache.directory.shared.asn1.ber.IAsn1Container;
+import org.apache.directory.shared.asn1.ber.tlv.TLVStateEnum;
+import org.apache.directory.shared.asn1.codec.DecoderException;
+import org.apache.directory.shared.asn1.codec.EncoderException;
+import org.apache.directory.shared.ldap.codec.ControlCodec;
+import org.apache.directory.shared.ldap.codec.LdapConstants;
+import org.apache.directory.shared.ldap.codec.LdapDecoder;
+import org.apache.directory.shared.ldap.codec.LdapMessageCodec;
+import org.apache.directory.shared.ldap.codec.LdapMessageContainer;
+import org.apache.directory.shared.ldap.codec.LdapResponseCodec;
+import org.apache.directory.shared.ldap.codec.add.AddResponseCodec;
+import org.apache.directory.shared.ldap.codec.bind.BindRequestCodec;
+import org.apache.directory.shared.ldap.codec.bind.BindResponseCodec;
+import org.apache.directory.shared.ldap.codec.bind.LdapAuthentication;
+import org.apache.directory.shared.ldap.codec.bind.SimpleAuthentication;
+import org.apache.directory.shared.ldap.codec.compare.CompareResponseCodec;
+import org.apache.directory.shared.ldap.codec.del.DelResponseCodec;
+import org.apache.directory.shared.ldap.codec.extended.ExtendedResponseCodec;
+import org.apache.directory.shared.ldap.codec.modify.ModifyResponseCodec;
+import org.apache.directory.shared.ldap.codec.modifyDn.ModifyDNResponseCodec;
+import org.apache.directory.shared.ldap.codec.search.SearchResultDoneCodec;
+import org.apache.directory.shared.ldap.codec.search.SearchResultEntryCodec;
+import org.apache.directory.shared.ldap.codec.search.SearchResultReferenceCodec;
+import org.apache.directory.shared.ldap.message.ResultCodeEnum;
+import org.apache.directory.shared.ldap.name.LdapDN;
+import org.apache.directory.shared.ldap.util.StringTools;
+import org.apache.directory.studio.dsmlv2.Dsmlv2Parser;
+import org.apache.directory.studio.dsmlv2.reponse.AddResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.AuthResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.BatchResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.CompareResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.DelResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.ErrorResponse;
+import org.apache.directory.studio.dsmlv2.reponse.ExtendedResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.ModDNResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.ModifyResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.SearchResponseDsml;
+import org.apache.directory.studio.dsmlv2.reponse.SearchResultDoneDsml;
+import org.apache.directory.studio.dsmlv2.reponse.SearchResultEntryDsml;
+import org.apache.directory.studio.dsmlv2.reponse.SearchResultReferenceDsml;
+import org.apache.directory.studio.dsmlv2.reponse.ErrorResponse.ErrorResponseType;
+import org.apache.directory.studio.dsmlv2.request.BatchRequest;
+import org.apache.directory.studio.dsmlv2.request.BatchRequest.OnError;
+import org.apache.directory.studio.dsmlv2.request.BatchRequest.Processing;
+import org.apache.directory.studio.dsmlv2.request.BatchRequest.ResponseOrder;
+import org.xmlpull.v1.XmlPullParserException;
+
+
+/**
+ * This is the DSMLv2Engine. It can be use to execute operations on a LDAP Server and get the results of these operations.
+ * The format used for request and responses is the DSMLv2 format.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class Dsmlv2Engine
+{
+    /** Socket used to connect to the server */
+    private SocketChannel channel;
+    private SocketAddress serverAddress;
+
+    // server configuration
+    private int port;
+    private String host;
+    private String user;
+    private String password;
+
+    private Asn1Decoder ldapDecoder = new LdapDecoder();
+
+    private IAsn1Container ldapMessageContainer = new LdapMessageContainer();
+
+    private Dsmlv2Parser parser;
+
+    private boolean continueOnError;
+    private boolean exit = false;
+
+    private int bbLimit;
+
+    private int bbposition;
+    private BatchRequest batchRequest;
+    private BatchResponseDsml batchResponse;
+
+
+    /**
+     * Creates a new instance of Dsmlv2Engine.
+     * 
+     * @param host 
+     *      the server host
+     * @param port 
+     *      the server port
+     * @param user 
+     *      the server admin DN
+     * @param password 
+     *      the server admin's password
+     */
+    public Dsmlv2Engine( String host, int port, String user, String password )
+    {
+        this.host = host;
+        this.port = port;
+        this.user = user;
+        this.password = password;
+    }
+
+
+    /**
+     * Processes the file given and return the result of the operations
+     * 
+     * @param dsmlInput 
+     *      the DSMLv2 formatted request input
+     * @return
+     *      the XML response in DSMLv2 Format
+     * @throws XmlPullParserException
+     *      if an error occurs in the parser
+     */
+    public String processDSML( String dsmlInput ) throws XmlPullParserException
+    {
+        parser = new Dsmlv2Parser();
+        parser.setInput( dsmlInput );
+        return processDSML();
+    }
+
+
+    /**
+     * Processes the file given and return the result of the operations
+     * 
+     * @param fileName 
+     *      the path to the file
+     * @return 
+     *      the XML response in DSMLv2 Format
+     * @throws XmlPullParserException
+     *      if an error occurs in the parser
+     * @throws FileNotFoundException
+     *      if the file does not exist
+     */
+    public String processDSMLFile( String fileName ) throws XmlPullParserException, FileNotFoundException
+    {
+        parser = new Dsmlv2Parser();
+        parser.setInputFile( fileName );
+        return processDSML();
+    }
+
+
+    /**
+     * Processes the file given and return the result of the operations
+     * 
+     * @param inputStream 
+     *      contains a raw byte input stream of possibly unknown encoding (when inputEncoding is null).
+     * @param inputEncoding 
+     *      if not null it MUST be used as encoding for inputStream
+     * @return 
+     *      the XML response in DSMLv2 Format
+     * @throws XmlPullParserException
+     *      if an error occurs in the parser
+     */
+    public String processDSML( InputStream inputStream, String inputEncoding ) throws XmlPullParserException
+    {
+        parser = new Dsmlv2Parser();
+        parser.setInput( inputStream, inputEncoding );
+        return processDSML();
+    }
+
+
+    /**
+     * Processes the Request document
+     * 
+     * @return 
+     *      the XML response in DSMLv2 Format
+     */
+    private String processDSML()
+    {
+        batchResponse = new BatchResponseDsml();
+
+        // Binding to LDAP Server
+        try
+        {
+            bind( 1 );
+        }
+        catch ( Exception e )
+        {
+            // Unable to connect to server
+            // We create a new ErrorResponse and return the XML response.
+            ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.COULD_NOT_CONNECT, e.getMessage() );
+            batchResponse.addResponse( errorResponse );
+            return batchResponse.toDsml();
+        }
+
+        // Processing BatchRequest:
+        //    - Parsing and Getting BatchRequest
+        //    - Getting and registering options from BatchRequest
+        try
+        {
+            processBatchRequest();
+        }
+        catch ( XmlPullParserException e )
+        {
+            // We create a new ErrorResponse and return the XML response.
+            ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.MALFORMED_REQUEST, e.getMessage()
+                + " - Line " + e.getLineNumber() + " - Column " + e.getColumnNumber() );
+            batchResponse.addResponse( errorResponse );
+            return batchResponse.toDsml();
+        }
+
+        // Processing each request:
+        //    - Getting a new request
+        //    - Checking if the request is well formed
+        //    - Sending the request to the server
+        //    - Getting and converting reponse(s) as XML
+        //    - Looping until last request
+        LdapMessageCodec request = null;
+        try
+        {
+            request = parser.getNextRequest();
+        }
+        catch ( XmlPullParserException e )
+        {
+            // We create a new ErrorResponse and return the XML response.
+            ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.MALFORMED_REQUEST, e.getMessage()
+                + " - Line " + e.getLineNumber() + " - Column " + e.getColumnNumber() );
+            batchResponse.addResponse( errorResponse );
+            return batchResponse.toDsml();
+        }
+
+        while ( request != null ) // (Request == null when there's no more request to process)
+        {
+            // Checking the request has a requestID attribute if Processing = Parallel and ResponseOrder = Unordered
+            if ( ( batchRequest.getProcessing().equals( Processing.PARALLEL ) )
+                && ( batchRequest.getResponseOrder().equals( ResponseOrder.UNORDERED ) )
+                && ( request.getMessageId() == 0 ) )
+            {
+                // Then we have to send an errorResponse
+                ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.MALFORMED_REQUEST,
+                    "A requestID must be specified to each request when Processing is Parallel and ReponseOrder is Unordered." );
+                batchResponse.addResponse( errorResponse );
+                return batchResponse.toDsml();
+            }
+
+            try
+            {
+                processRequest( request );
+            }
+            catch ( Exception e )
+            {
+                // We create a new ErrorResponse and return the XML response.
+                ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.GATEWAY_INTERNAL_ERROR,
+                    "Internal Error: " + e.getMessage() );
+                batchResponse.addResponse( errorResponse );
+                return batchResponse.toDsml();
+            }
+
+            // Checking if we need to exit processing (if an error has ocurred if onError == Exit)
+            if ( exit )
+            {
+                break;
+            }
+
+            // Getting next request
+            try
+            {
+                request = parser.getNextRequest();
+            }
+            catch ( XmlPullParserException e )
+            {
+                // We create a new ErrorResponse and return the XML response.
+                ErrorResponse errorResponse = new ErrorResponse( 0, ErrorResponseType.MALFORMED_REQUEST, e.getMessage()
+                    + " - Line " + e.getLineNumber() + " - Column " + e.getColumnNumber() );
+                batchResponse.addResponse( errorResponse );
+                return batchResponse.toDsml();
+            }
+        }
+
+        return batchResponse.toDsml();
+    }
+
+
+    /**
+     * Processes a single request
+     * 
+     * @param request 
+     *      the request to process
+     * @throws EncoderException 
+     * @throws IOException 
+     * @throws NamingException 
+     * @throws DecoderException 
+     */
+    private void processRequest( LdapMessageCodec request ) throws EncoderException, IOException, DecoderException,
+        NamingException
+    {
+        LdapMessageCodec message = new LdapMessageCodec();
+
+        message.setProtocolOP( request );
+
+        message.setMessageId( request.getMessageId() );
+
+        ByteBuffer bb = null;
+
+        bb = message.encode( null );
+
+        bb.flip();
+
+        sendMessage( bb );
+
+        bb.clear();
+        bb.position( bb.capacity() );
+        // Get the response
+        LdapMessageCodec response = null;
+
+        response = readResponse( bb );
+
+        if ( LdapConstants.ADD_RESPONSE == response.getMessageType() )
+        {
+            AddResponseCodec addResponse = response.getAddResponse();
+            copyMessageIdAndControls( response, addResponse );
+
+            AddResponseDsml addResponseDsml = new AddResponseDsml( addResponse );
+            batchResponse.addResponse( addResponseDsml );
+        }
+        else if ( LdapConstants.BIND_RESPONSE == response.getMessageType() )
+        {
+            BindResponseCodec bindResponse = response.getBindResponse();
+            copyMessageIdAndControls( response, bindResponse );
+
+            AuthResponseDsml authResponseDsml = new AuthResponseDsml( bindResponse );
+            batchResponse.addResponse( authResponseDsml );
+        }
+        else if ( LdapConstants.COMPARE_RESPONSE == response.getMessageType() )
+        {
+            CompareResponseCodec compareResponse = response.getCompareResponse();
+            copyMessageIdAndControls( response, compareResponse );
+
+            CompareResponseDsml authResponseDsml = new CompareResponseDsml( compareResponse );
+            batchResponse.addResponse( authResponseDsml );
+        }
+        else if ( LdapConstants.DEL_RESPONSE == response.getMessageType() )
+        {
+            DelResponseCodec delResponse = response.getDelResponse();
+            copyMessageIdAndControls( response, delResponse );
+
+            DelResponseDsml delResponseDsml = new DelResponseDsml( delResponse );
+            batchResponse.addResponse( delResponseDsml );
+        }
+        else if ( LdapConstants.MODIFY_RESPONSE == response.getMessageType() )
+        {
+            ModifyResponseCodec modifyResponse = response.getModifyResponse();
+            copyMessageIdAndControls( response, modifyResponse );
+
+            ModifyResponseDsml modifyResponseDsml = new ModifyResponseDsml( modifyResponse );
+            batchResponse.addResponse( modifyResponseDsml );
+        }
+        else if ( LdapConstants.MODIFYDN_RESPONSE == response.getMessageType() )
+        {
+            ModifyDNResponseCodec modifyDNResponse = response.getModifyDNResponse();
+            copyMessageIdAndControls( response, modifyDNResponse );
+
+            ModDNResponseDsml modDNResponseDsml = new ModDNResponseDsml( modifyDNResponse );
+            batchResponse.addResponse( modDNResponseDsml );
+        }
+        else if ( LdapConstants.EXTENDED_RESPONSE == response.getMessageType() )
+        {
+            ExtendedResponseCodec extendedResponse = response.getExtendedResponse();
+            copyMessageIdAndControls( response, extendedResponse );
+
+            ExtendedResponseDsml extendedResponseDsml = new ExtendedResponseDsml( extendedResponse );
+            batchResponse.addResponse( extendedResponseDsml );
+        }
+        else if ( ( LdapConstants.SEARCH_RESULT_ENTRY == response.getMessageType() )
+            || ( LdapConstants.SEARCH_RESULT_REFERENCE == response.getMessageType() )
+            || ( LdapConstants.SEARCH_RESULT_DONE == response.getMessageType() ) )
+        {
+            // A SearchResponse can contains multiple responses of 3 types:
+            //     - 0 to n SearchResultEntry
+            //     - O to n SearchResultReference
+            //     - 1 (only) SearchResultDone
+            // So we have to include those individual reponses in a "General" SearchResponse
+            //            Element searchResponse = xmlResponse.getRootElement().addElement( "searchResponse" );
+            SearchResponseDsml searchResponseDsml = new SearchResponseDsml();
+
+            // RequestID
+            int requestID = response.getMessageId();
+            if ( requestID != 0 )
+            {
+                searchResponseDsml.setMessageId( requestID );
+            }
+
+            while ( LdapConstants.SEARCH_RESULT_DONE != response.getMessageType() )
+            {
+                if ( LdapConstants.SEARCH_RESULT_ENTRY == response.getMessageType() )
+                {
+                    SearchResultEntryCodec sre = response.getSearchResultEntry();
+                    copyMessageIdAndControls( response, sre );
+
+                    SearchResultEntryDsml searchResultEntryDsml = new SearchResultEntryDsml( sre );
+                    searchResponseDsml.addResponse( searchResultEntryDsml );
+                }
+                else if ( LdapConstants.SEARCH_RESULT_REFERENCE == response.getMessageType() )
+                {
+                    SearchResultReferenceCodec srr = response.getSearchResultReference();
+                    copyMessageIdAndControls( response, srr );
+
+                    SearchResultReferenceDsml searchResultReferenceDsml = new SearchResultReferenceDsml( srr );
+                    searchResponseDsml.addResponse( searchResultReferenceDsml );
+                }
+
+                response = readResponse( bb );
+            }
+
+            SearchResultDoneCodec srd = response.getSearchResultDone();
+            copyMessageIdAndControls( response, srd );
+
+            SearchResultDoneDsml searchResultDoneDsml = new SearchResultDoneDsml( srd );
+            searchResponseDsml.addResponse( searchResultDoneDsml );
+        }
+
+        LdapResponseCodec realResponse = response.getLdapResponse();
+
+        if ( !continueOnError )
+        {
+            if ( ( realResponse.getLdapResult().getResultCode() != ResultCodeEnum.SUCCESS )
+                && ( realResponse.getLdapResult().getResultCode() != ResultCodeEnum.COMPARE_TRUE )
+                && ( realResponse.getLdapResult().getResultCode() != ResultCodeEnum.COMPARE_FALSE )
+                && ( realResponse.getLdapResult().getResultCode() != ResultCodeEnum.REFERRAL ) )
+            {
+                // Turning on Exit flag
+                exit = true;
+            }
+        }
+
+    }
+
+
+    private void copyMessageIdAndControls( LdapMessageCodec from, LdapMessageCodec to )
+    {
+        to.setMessageId( from.getMessageId() );
+        for ( ControlCodec control : from.getControls() )
+        {
+            to.addControl( control );
+        }
+    }
+
+
+    /**
+     * Processes the BatchRequest
+     * <ul>
+     *     <li>Parsing and Getting BatchRequest</li>
+     *     <li>Getting and registering options from BatchRequest</li>
+     * </ul>
+     *     
+     * @throws XmlPullParserException
+     *      if an error occurs in the parser
+     */
+    private void processBatchRequest() throws XmlPullParserException
+    {
+        // Parsing BatchRequest
+        parser.parseBatchRequest();
+
+        // Getting BatchRequest
+        batchRequest = parser.getBatchRequest();
+
+        if ( OnError.RESUME.equals( batchRequest.getOnError() ) )
+        {
+            continueOnError = true;
+        }
+        else if ( OnError.EXIT.equals( batchRequest.getOnError() ) )
+        {
+            continueOnError = false;
+        }
+
+        if ( batchRequest.getRequestID() != 0 )
+        {
+            batchResponse.setRequestID( batchRequest.getRequestID() );
+        }
+    }
+
+
+    /**
+     * Connect to the LDAP server through a socket and establish the Input and
+     * Output Streams. All the required information for the connection should be
+     * in the options from the command line, or the default values.
+     * 
+     * @throws UnknownHostException
+     *      if the hostname or the Address of server could not be found
+     * @throws IOException
+     *      if there was a error opening or establishing the socket
+     */
+    private void connect() throws UnknownHostException, IOException
+    {
+        serverAddress = new InetSocketAddress( host, port );
+        channel = SocketChannel.open( serverAddress );
+        channel.configureBlocking( true );
+    }
+
+
+    /**
+     * Sends a message
+     * 
+     * @param bb
+     *      the message as a byte buffer
+     * @throws IOException
+     *      if the message could not be sent
+     */
+    private void sendMessage( ByteBuffer bb ) throws IOException
+    {
+        channel.write( bb );
+        bb.clear();
+    }
+
+
+    /**
+     * Reads the response to a request
+     * 
+     * @param bb
+     *      the response as a byte buffer
+     * @return the response
+     *      the response as a LDAP message
+     * @throws IOException
+     * @throws DecoderException
+     * @throws NamingException
+     */
+    private LdapMessageCodec readResponse( ByteBuffer bb ) throws IOException, DecoderException, NamingException
+    {
+
+        LdapMessageCodec messageResp = null;
+
+        if ( bb.hasRemaining() )
+        {
+            bb.position( bbposition );
+            bb.limit( bbLimit );
+            ldapDecoder.decode( bb, ldapMessageContainer );
+            bbposition = bb.position();
+            bbLimit = bb.limit();
+        }
+        bb.flip();
+        while ( ldapMessageContainer.getState() != TLVStateEnum.PDU_DECODED )
+        {
+
+            int nbRead = channel.read( bb );
+
+            if ( nbRead == -1 )
+            {
+                System.err.println( "fsdfsdfsdfsd" );
+            }
+
+            bb.flip();
+            ldapDecoder.decode( bb, ldapMessageContainer );
+            bbposition = bb.position();
+            bbLimit = bb.limit();
+            bb.flip();
+        }
+
+        messageResp = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage();
+
+        if ( messageResp instanceof BindResponseCodec )
+        {
+            BindResponseCodec resp = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage().getBindResponse();
+
+            if ( resp.getLdapResult().getResultCode() != ResultCodeEnum.SUCCESS )
+            {
+                System.err.println( "Error : " + resp.getLdapResult().getErrorMessage() );
+            }
+        }
+        else if ( messageResp instanceof ExtendedResponseCodec )
+        {
+            ExtendedResponseCodec resp = ( ( LdapMessageContainer ) ldapMessageContainer ).getLdapMessage()
+                .getExtendedResponse();
+
+            if ( resp.getLdapResult().getResultCode() != ResultCodeEnum.SUCCESS )
+            {
+                System.err.println( "Error : " + resp.getLdapResult().getErrorMessage() );
+            }
+        }
+
+        ( ( LdapMessageContainer ) ldapMessageContainer ).clean();
+
+        return messageResp;
+    }
+
+
+    /**
+     * Binds to the ldap server
+     * 
+     * @param messageId 
+     *      the message Id
+     * @throws EncoderException
+     * @throws DecoderException
+     * @throws IOException
+     * @throws NamingException
+     */
+    private void bind( int messageId ) throws EncoderException, DecoderException, IOException, NamingException
+    {
+        BindRequestCodec bindRequest = new BindRequestCodec();
+        LdapMessageCodec message = new LdapMessageCodec();
+        LdapAuthentication authentication = new SimpleAuthentication();
+        ( ( SimpleAuthentication ) authentication ).setSimple( StringTools.getBytesUtf8( password ) );
+
+        bindRequest.setAuthentication( authentication );
+        bindRequest.setName( new LdapDN( user ) );
+        bindRequest.setVersion( 3 );
+
+        message.setProtocolOP( bindRequest );
+        message.setMessageId( messageId );
+
+        // Encode and send the bind request
+        ByteBuffer bb = message.encode( null );
+        bb.flip();
+
+        connect();
+        sendMessage( bb );
+
+        bb.clear();
+
+        bb.position( bb.limit() );
+
+        readResponse( bb );
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/AddResponseDsml.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/AddResponseDsml.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/AddResponseDsml.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/AddResponseDsml.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,78 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2.reponse;
+
+
+import org.apache.directory.shared.ldap.codec.add.AddResponseCodec;
+import org.apache.directory.studio.dsmlv2.DsmlDecorator;
+import org.dom4j.Element;
+
+
+/**
+ * DSML Decorator for AddResponse
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AddResponseDsml extends LdapResponseDecorator implements DsmlDecorator
+{
+    /**
+     * Creates a new instance of AddResponseDsml.
+     */
+    public AddResponseDsml()
+    {
+        super( new AddResponseCodec() );
+    }
+
+
+    /**
+     * Creates a new instance of AddResponseDsml.
+     *
+     * @param ldapMessage
+     *      the message to decorate
+     */
+    public AddResponseDsml( AddResponseCodec ldapMessage )
+    {
+        super( ldapMessage );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.dsmlv2.reponse.LdapMessageDecorator#getMessageType()
+     */
+    public int getMessageType()
+    {
+        return instance.getMessageType();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.dsmlv2.reponse.DsmlDecorator#toDsml(org.dom4j.Element)
+     */
+    public Element toDsml( Element root )
+    {
+        Element element = root.addElement( "addResponse" );
+
+        LdapResultDsml ldapResultDsml = new LdapResultDsml( ( ( AddResponseCodec ) instance ).getLdapResult(), instance );
+        ldapResultDsml.toDsml( element );
+        return element;
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/AuthResponseDsml.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/AuthResponseDsml.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/AuthResponseDsml.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/AuthResponseDsml.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,78 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2.reponse;
+
+
+import org.apache.directory.shared.ldap.codec.bind.BindResponseCodec;
+import org.apache.directory.studio.dsmlv2.DsmlDecorator;
+import org.dom4j.Element;
+
+
+/**
+ * DSML Decorator for AuthResponse
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class AuthResponseDsml extends LdapResponseDecorator implements DsmlDecorator
+{
+    /**
+     * Creates a new instance of AuthResponseDsml.
+     */
+    public AuthResponseDsml()
+    {
+        super( new BindResponseCodec() );
+    }
+
+
+    /**
+     * Creates a new instance of AuthResponseDsml.
+     *
+     * @param ldapMessage
+     *      the message to decorate
+     */
+    public AuthResponseDsml( BindResponseCodec ldapMessage )
+    {
+        super( ldapMessage );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.dsmlv2.reponse.LdapMessageDecorator#getMessageType()
+     */
+    public int getMessageType()
+    {
+        return instance.getMessageType();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.dsmlv2.reponse.DsmlDecorator#toDsml(org.dom4j.Element)
+     */
+    public Element toDsml( Element root )
+    {
+        Element element = root.addElement( "authResponse" );
+
+        LdapResultDsml ldapResultDsml = new LdapResultDsml( ( ( BindResponseCodec ) instance ).getLdapResult(), instance );
+        ldapResultDsml.toDsml( element );
+        return element;
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/BatchResponse.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/BatchResponse.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/BatchResponse.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/BatchResponse.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,118 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2.reponse;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.shared.ldap.codec.LdapResponseCodec;
+
+
+/**
+ * This class represents the Batch Response of a DSML Response
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BatchResponse
+{
+
+    /**
+     * The responses contained in the Batch Response
+     */
+    private List<LdapResponseCodec> responses;
+
+    /**
+     * The ID of the response
+     */
+    private int requestID;
+
+
+    /**
+     * Creates a new instance of BatchResponse.
+     */
+    public BatchResponse()
+    {
+        responses = new ArrayList<LdapResponseCodec>();
+    }
+
+
+    /**
+     * Adds a reponse
+     *
+     * @param response
+     *      the response to add
+     * @return
+     *      true (as per the general contract of the Collection.add method)
+     */
+    public boolean addResponse( LdapResponseCodec response )
+    {
+        return responses.add( response );
+    }
+
+
+    /**
+     * Gets the current reponse
+     *
+     * @return
+     *      the current response
+     */
+    public LdapResponseCodec getCurrentResponse()
+    {
+        return responses.get( responses.size() - 1 );
+    }
+
+
+    /**
+     * Gets the ID of the response
+     * @return
+     *      the ID of the response
+     */
+    public int getRequestID()
+    {
+        return requestID;
+    }
+
+
+    /**
+     * Sets the ID of the response
+     *
+     * @param requestID
+     *      the ID to set
+     */
+    public void setRequestID( int requestID )
+    {
+        this.requestID = requestID;
+    }
+
+
+    /**
+     * Gets the List of all the reponses
+     *
+     * @return
+     *      the List of all the responses
+     */
+    public List getResponses()
+    {
+        return responses;
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/BatchResponseDsml.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/BatchResponseDsml.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/BatchResponseDsml.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/BatchResponseDsml.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,129 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+package org.apache.directory.studio.dsmlv2.reponse;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.directory.studio.dsmlv2.DsmlDecorator;
+import org.apache.directory.studio.dsmlv2.ParserUtils;
+import org.dom4j.Document;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+
+
+/**
+ * This class represents the Batch Response. It can be used to generate an the XML String of a BatchResponse.
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class BatchResponseDsml
+{
+    /** The Responses list */
+    private List<DsmlDecorator> responses;
+
+    /** The ID of the response */
+    private int requestID;
+
+
+    /**
+     * Creates a new instance of BatchResponseDsml.
+     */
+    public BatchResponseDsml()
+    {
+        responses = new ArrayList<DsmlDecorator>();
+    }
+
+
+    /**
+     * Adds a request to the Batch Response DSML.
+     *
+     * @param response
+     *      the request to add
+     * @return
+     *      true (as per the general contract of the Collection.add method).
+     */
+    public boolean addResponse( DsmlDecorator response )
+    {
+        return responses.add( response );
+    }
+
+
+    /**
+     * Removes a request from the Batch Response DSML.
+     *
+     * @param response
+     *      the request to remove
+     * @return
+     *      true if this list contained the specified element.
+     */
+    public boolean removeResponse( DsmlDecorator response )
+    {
+        return responses.remove( response );
+    }
+
+
+    /**
+     * Gets the ID of the response
+     * @return
+     *      the ID of the response
+     */
+    public int getRequestID()
+    {
+        return requestID;
+    }
+
+
+    /**
+     * Sets the ID of the response
+     *
+     * @param requestID
+     *      the ID to set
+     */
+    public void setRequestID( int requestID )
+    {
+        this.requestID = requestID;
+    }
+
+
+    /**
+     * Converts the Batch Response to its XML representation in the DSMLv2 format.
+     */
+    public String toDsml()
+    {
+        Document document = DocumentHelper.createDocument();
+        Element element = document.addElement( "batchResponse" );
+
+        // RequestID
+        if ( requestID != 0 )
+        {
+            element.addAttribute( "requestID", "" + requestID );
+        }
+
+        for ( DsmlDecorator response : responses )
+        {
+            response.toDsml( element );
+        }
+
+        return ParserUtils.styleDocument( document ).asXML();
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/CompareResponseDsml.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/CompareResponseDsml.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/CompareResponseDsml.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/CompareResponseDsml.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,78 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2.reponse;
+
+
+import org.apache.directory.shared.ldap.codec.compare.CompareResponseCodec;
+import org.apache.directory.studio.dsmlv2.DsmlDecorator;
+import org.dom4j.Element;
+
+
+/**
+ * DSML Decorator for CompareResponse
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class CompareResponseDsml extends LdapResponseDecorator implements DsmlDecorator
+{
+    /**
+     * Creates a new instance of CompareResponseDsml.
+     */
+    public CompareResponseDsml()
+    {
+        super( new CompareResponseCodec() );
+    }
+
+
+    /**
+     * Creates a new instance of CompareResponseDsml.
+     *
+     * @param ldapMessage
+     *      the message to decorate
+     */
+    public CompareResponseDsml( CompareResponseCodec ldapMessage )
+    {
+        super( ldapMessage );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.dsmlv2.reponse.LdapMessageDecorator#getMessageType()
+     */
+    public int getMessageType()
+    {
+        return instance.getMessageType();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.dsmlv2.reponse.DsmlDecorator#toDsml(org.dom4j.Element)
+     */
+    public Element toDsml( Element root )
+    {
+        Element element = root.addElement( "compareResponse" );
+
+        LdapResultDsml ldapResultDsml = new LdapResultDsml( ( ( CompareResponseCodec ) instance ).getLdapResult(), instance );
+        ldapResultDsml.toDsml( element );
+        return element;
+    }
+}

Added: directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/DelResponseDsml.java
URL: http://svn.apache.org/viewvc/directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/DelResponseDsml.java?rev=796383&view=auto
==============================================================================
--- directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/DelResponseDsml.java (added)
+++ directory/shared/trunk/dsml-parser/src/main/java/org/apache/directory/studio/dsmlv2/reponse/DelResponseDsml.java Tue Jul 21 17:04:13 2009
@@ -0,0 +1,78 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *  
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *  
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License. 
+ *  
+ */
+
+package org.apache.directory.studio.dsmlv2.reponse;
+
+
+import org.apache.directory.shared.ldap.codec.del.DelResponseCodec;
+import org.apache.directory.studio.dsmlv2.DsmlDecorator;
+import org.dom4j.Element;
+
+
+/**
+ * DSML Decorator for DelResponse
+ *
+ * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
+ * @version $Rev$, $Date$
+ */
+public class DelResponseDsml extends LdapResponseDecorator implements DsmlDecorator
+{
+    /**
+     * Creates a new instance of DelResponseDsml.
+     */
+    public DelResponseDsml()
+    {
+        super( new DelResponseCodec() );
+    }
+
+
+    /**
+     * Creates a new instance of DelResponseDsml.
+     *
+     * @param ldapMessage
+     *      the message to decorate
+     */
+    public DelResponseDsml( DelResponseCodec ldapMessage )
+    {
+        super( ldapMessage );
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.dsmlv2.reponse.LdapMessageDecorator#getMessageType()
+     */
+    public int getMessageType()
+    {
+        return instance.getMessageType();
+    }
+
+
+    /* (non-Javadoc)
+     * @see org.apache.directory.studio.dsmlv2.reponse.DsmlDecorator#toDsml(org.dom4j.Element)
+     */
+    public Element toDsml( Element root )
+    {
+        Element element = root.addElement( "delResponse" );
+
+        LdapResultDsml ldapResultDsml = new LdapResultDsml( ( ( DelResponseCodec ) instance ).getLdapResult(), instance );
+        ldapResultDsml.toDsml( element );
+        return element;
+    }
+}