001 /*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements. See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership. The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License. You may obtain a copy of the License at
009 *
010 * http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied. See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 *
019 */
020 package org.apache.directory.shared.dsmlv2.request;
021
022
023 import org.apache.directory.shared.dsmlv2.ParserUtils;
024 import org.apache.directory.shared.ldap.codec.MessageTypeEnum;
025 import org.apache.directory.shared.ldap.codec.add.AddRequestCodec;
026 import org.apache.directory.shared.ldap.entry.Entry;
027 import org.apache.directory.shared.ldap.entry.EntryAttribute;
028 import org.apache.directory.shared.ldap.entry.Value;
029 import org.apache.directory.shared.ldap.exception.LdapException;
030 import org.apache.directory.shared.ldap.name.DN;
031 import org.dom4j.Element;
032 import org.dom4j.Namespace;
033 import org.dom4j.QName;
034
035
036 /**
037 * DSML Decorator for AddRequest
038 *
039 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
040 * @version $Rev$, $Date$
041 */
042 public class AddRequestDsml extends AbstractRequestDsml
043 {
044 /**
045 * Creates a new instance of AddRequestDsml.
046 */
047 public AddRequestDsml()
048 {
049 super( new AddRequestCodec() );
050 }
051
052
053 /**
054 * Creates a new instance of AddRequestDsml.
055 *
056 * @param ldapMessage
057 * the message to decorate
058 */
059 public AddRequestDsml( AddRequestCodec ldapMessage )
060 {
061 super( ldapMessage );
062 }
063
064
065 /**
066 * {@inheritDoc}
067 */
068 public MessageTypeEnum getMessageType()
069 {
070 return instance.getMessageType();
071 }
072
073
074 /**
075 * {@inheritDoc}
076 */
077 public Element toDsml( Element root )
078 {
079 Element element = super.toDsml( root );
080
081 AddRequestCodec request = ( AddRequestCodec ) instance;
082
083 // DN
084 if ( request.getEntry() != null )
085 {
086 element.addAttribute( "dn", request.getEntry().getDn().getName() );
087 }
088
089 // Attributes
090 Entry entry = request.getEntry();
091 if ( entry != null )
092 {
093 for ( EntryAttribute attribute : entry )
094 {
095 Element attributeElement = element.addElement( "attr" );
096 attributeElement.addAttribute( "name", attribute.getId() );
097 // Looping on Values
098 for ( Value<?> value : attribute )
099 {
100 if ( ParserUtils.needsBase64Encoding( value.get() ) )
101 {
102 Namespace xsdNamespace = new Namespace( "xsd", ParserUtils.XML_SCHEMA_URI );
103 Namespace xsiNamespace = new Namespace( "xsi", ParserUtils.XML_SCHEMA_INSTANCE_URI );
104 attributeElement.getDocument().getRootElement().add( xsdNamespace );
105 attributeElement.getDocument().getRootElement().add( xsiNamespace );
106
107 Element valueElement = attributeElement.addElement( "value" ).addText(
108 ParserUtils.base64Encode( value.get() ) );
109 valueElement
110 .addAttribute( new QName( "type", xsiNamespace ), "xsd:" + ParserUtils.BASE64BINARY );
111 }
112 else
113 {
114 attributeElement.addElement( "value" ).addText( value.getString() );
115 }
116 }
117 }
118 }
119
120 return element;
121 }
122
123
124 /**
125 * Initialize the Entry.
126 */
127 public void initEntry()
128 {
129 ( ( AddRequestCodec ) instance ).initEntry();
130 }
131
132
133 /**
134 * Get the entry with its attributes.
135 *
136 * @return Returns the entry.
137 */
138 public Entry getEntry()
139 {
140 return ( ( AddRequestCodec ) instance ).getEntry();
141 }
142
143
144 /**
145 * Create a new attributeValue
146 *
147 * @param type The attribute's name (called 'type' in the grammar)
148 * @throws LdapException
149 */
150 public void addAttributeType( String type ) throws LdapException
151 {
152 ( ( AddRequestCodec ) instance ).addAttributeType( type );
153 }
154
155
156 /**
157 * Add a new value to the current attribute
158 *
159 * @param value The value to be added
160 */
161 public void addAttributeValue( Object value )
162 {
163 if ( value instanceof Value<?> )
164 {
165 ( ( AddRequestCodec ) instance ).addAttributeValue( ( Value<?> ) value );
166 }
167 else if ( value instanceof String )
168 {
169 ( ( AddRequestCodec ) instance ).addAttributeValue( ( String ) value );
170 }
171 else if ( value instanceof byte[] )
172 {
173 ( ( AddRequestCodec ) instance ).addAttributeValue( ( byte[] ) value );
174 }
175 }
176
177
178 /**
179 * Get the added DN
180 *
181 * @return Returns the entry DN.
182 */
183 public DN getEntryDn()
184 {
185 return ( ( AddRequestCodec ) instance ).getEntryDn();
186 }
187
188
189 /**
190 * Set the added DN.
191 *
192 * @param entry The entry DN to set.
193 */
194 public void setEntryDn( DN entryDn )
195 {
196 ( ( AddRequestCodec ) instance ).setEntryDn( entryDn );
197 }
198
199
200 /**
201 * Sets the entry.
202 *
203 * @param entry
204 * the entry
205 */
206 public void setEntry( Entry entry )
207 {
208 ( ( AddRequestCodec ) instance ).setEntry( entry );
209 }
210
211
212 /**
213 * @return Returns the currentAttribute type.
214 */
215 public String getCurrentAttributeType()
216 {
217 return ( ( AddRequestCodec ) instance ).getCurrentAttributeType();
218 }
219 }