1 20 package org.apache.directory.ldapstudio.dsmlv2.request; 21 22 23 import java.util.List ; 24 25 import javax.naming.NamingEnumeration ; 26 import javax.naming.directory.Attributes ; 27 28 import org.apache.directory.ldapstudio.dsmlv2.ParserUtils; 29 import org.apache.directory.shared.ldap.codec.AttributeValueAssertion; 30 import org.apache.directory.shared.ldap.codec.LdapConstants; 31 import org.apache.directory.shared.ldap.codec.LdapMessage; 32 import org.apache.directory.shared.ldap.codec.search.AndFilter; 33 import org.apache.directory.shared.ldap.codec.search.AttributeValueAssertionFilter; 34 import org.apache.directory.shared.ldap.codec.search.ExtensibleMatchFilter; 35 import org.apache.directory.shared.ldap.codec.search.Filter; 36 import org.apache.directory.shared.ldap.codec.search.NotFilter; 37 import org.apache.directory.shared.ldap.codec.search.OrFilter; 38 import org.apache.directory.shared.ldap.codec.search.PresentFilter; 39 import org.apache.directory.shared.ldap.codec.search.SearchRequest; 40 import org.apache.directory.shared.ldap.codec.search.SubstringFilter; 41 import org.apache.directory.shared.ldap.message.ScopeEnum; 42 import org.dom4j.Element; 43 import org.dom4j.Namespace; 44 import org.dom4j.QName; 45 46 47 53 public class SearchRequestDsml extends AbstractRequestDsml 54 { 55 61 public SearchRequestDsml( LdapMessage ldapMessage ) 62 { 63 super( ldapMessage ); 64 } 65 66 67 70 public int getMessageType() 71 { 72 return instance.getMessageType(); 73 } 74 75 76 79 public Element toDsml( Element root ) 80 { 81 Element element = super.toDsml( root ); 82 83 SearchRequest request = ( SearchRequest ) instance; 84 85 if ( request.getBaseObject() != null ) 87 { 88 element.addAttribute( "dn", request.getBaseObject().toString() ); 89 } 90 91 ScopeEnum scope = request.getScope(); 93 if ( scope != null ) 94 { 95 if ( scope == ScopeEnum.BASE_OBJECT ) 96 { 97 element.addAttribute( "scope", "baseObject" ); 98 } 99 else if ( scope == ScopeEnum.SINGLE_LEVEL ) 100 { 101 element.addAttribute( "scope", "singleLevel" ); 102 } 103 else if ( scope == ScopeEnum.WHOLE_SUBTREE ) 104 { 105 element.addAttribute( "scope", "wholeSubtree" ); 106 } 107 } 108 109 int derefAliases = request.getDerefAliases(); 111 if ( derefAliases == LdapConstants.NEVER_DEREF_ALIASES ) 112 { 113 element.addAttribute( "derefAliases", "neverDerefAliases" ); 114 } 115 else if ( derefAliases == LdapConstants.DEREF_IN_SEARCHING ) 116 { 117 element.addAttribute( "derefAliases", "derefInSearching" ); 118 } 119 else if ( derefAliases == LdapConstants.DEREF_FINDING_BASE_OBJ ) 120 { 121 element.addAttribute( "derefAliases", "derefFindingBaseObj" ); 122 } 123 else if ( derefAliases == LdapConstants.DEREF_ALWAYS ) 124 { 125 element.addAttribute( "derefAliases", "derefAlways" ); 126 } 127 128 if ( request.getSizeLimit() != 0 ) 130 { 131 element.addAttribute( "sizeLimit", "" + request.getSizeLimit() ); 132 } 133 134 if ( request.getTimeLimit() != 0 ) 136 { 137 element.addAttribute( "timeLimit", "" + request.getTimeLimit() ); 138 } 139 140 if ( request.isTypesOnly() ) 142 { 143 element.addAttribute( "typesOnly", "true" ); 144 } 145 146 Element filterElement = element.addElement( "filter" ); 148 toDsml( filterElement, request.getFilter() ); 149 150 Attributes attributes = request.getAttributes(); 152 if ( attributes.size() > 0 ) 153 { 154 Element attributesElement = element.addElement( "attributes" ); 155 156 NamingEnumeration <String > ids = attributes.getIDs(); 157 while ( ids.hasMoreElements() ) 158 { 159 attributesElement.addElement( "attribute" ).addAttribute( "name", ids.nextElement() ); 160 } 161 } 162 163 return element; 164 } 165 166 167 176 private void toDsml( Element element, Filter filter ) 177 { 178 if ( filter instanceof AndFilter ) 180 { 181 Element newElement = element.addElement( "and" ); 182 183 List <Filter> filterList = ( ( AndFilter ) filter ).getAndFilter(); 184 for ( int i = 0; i < filterList.size(); i++ ) 185 { 186 toDsml( newElement, filterList.get( i ) ); 187 } 188 } 189 190 else if ( filter instanceof OrFilter ) 192 { 193 Element newElement = element.addElement( "or" ); 194 195 List <Filter> filterList = ( ( OrFilter ) filter ).getOrFilter(); 196 for ( int i = 0; i < filterList.size(); i++ ) 197 { 198 toDsml( newElement, filterList.get( i ) ); 199 } 200 } 201 202 else if ( filter instanceof NotFilter ) 204 { 205 Element newElement = element.addElement( "not" ); 206 207 toDsml( newElement, ( ( NotFilter ) filter ).getNotFilter() ); 208 } 209 210 else if ( filter instanceof SubstringFilter ) 212 { 213 Element newElement = element.addElement( "substrings" ); 214 215 SubstringFilter substringFilter = ( SubstringFilter ) filter; 216 217 newElement.addAttribute("name", substringFilter.getType() ); 218 219 String initial = substringFilter.getInitialSubstrings(); 220 if ( ( initial != null ) && ( !"".equals( initial ) ) ) 221 { 222 newElement.addElement( "initial" ).setText( initial ); 223 } 224 225 List <String > anyList = substringFilter.getAnySubstrings(); 226 for ( int i = 0; i < anyList.size(); i++ ) 227 { 228 newElement.addElement( "any" ).setText( anyList.get( i ) ); 229 } 230 231 String finalString = substringFilter.getFinalSubstrings(); 232 if ( ( finalString != null ) && ( !"".equals( finalString ) ) ) 233 { 234 newElement.addElement( "final" ).setText( finalString ); 235 } 236 } 237 238 else if ( filter instanceof AttributeValueAssertionFilter ) 240 { 241 AttributeValueAssertionFilter avaFilter = ( AttributeValueAssertionFilter ) filter; 242 243 Element newElement = null; 244 int filterType = avaFilter.getFilterType(); 245 if ( filterType == LdapConstants.APPROX_MATCH_FILTER ) 246 { 247 newElement = element.addElement( "approxMatch" ); 248 } 249 else if ( filterType == LdapConstants.EQUALITY_MATCH_FILTER ) 250 { 251 newElement = element.addElement( "equalityMatch" ); 252 } 253 else if ( filterType == LdapConstants.GREATER_OR_EQUAL_FILTER ) 254 { 255 newElement = element.addElement( "greaterOrEqual" ); 256 } 257 else if ( filterType == LdapConstants.LESS_OR_EQUAL_FILTER ) 258 { 259 newElement = element.addElement( "lessOrEqual" ); 260 } 261 262 AttributeValueAssertion assertion = avaFilter.getAssertion(); 263 if ( assertion != null ) 264 { 265 newElement.addAttribute( "name", assertion.getAttributeDesc() ); 266 267 Object value = assertion.getAssertionValue(); 268 if ( value != null ) 269 { 270 if ( ParserUtils.needsBase64Encoding( value ) ) 271 { 272 Namespace xsdNamespace = new Namespace( "xsd", ParserUtils.XML_SCHEMA_URI ); 273 Namespace xsiNamespace = new Namespace( "xsi", ParserUtils.XML_SCHEMA_INSTANCE_URI ); 274 element.getDocument().getRootElement().add( xsdNamespace ); 275 element.getDocument().getRootElement().add( xsiNamespace ); 276 277 Element valueElement = 278 newElement.addElement( "value" ).addText( ParserUtils.base64Encode( value ) ); 279 valueElement 280 .addAttribute( new QName( "type", xsiNamespace ), "xsd:" + ParserUtils.BASE64BINARY ); 281 } 282 else 283 { 284 newElement.addElement( "value" ).setText( (String ) value ); 285 } 286 } 287 } 288 } 289 290 else if ( filter instanceof PresentFilter ) 292 { 293 Element newElement = element.addElement( "present" ); 294 295 newElement.addAttribute( "name", ( ( PresentFilter ) filter ).getAttributeDescription() ); 296 } 297 298 else if ( filter instanceof ExtensibleMatchFilter ) 300 { 301 Element newElement = element.addElement( "extensibleMatch" ); 302 303 ExtensibleMatchFilter extensibleMatchFilter = ( ExtensibleMatchFilter ) filter; 304 305 Object value = extensibleMatchFilter.getMatchValue(); 306 if ( value != null ) 307 { 308 if ( ParserUtils.needsBase64Encoding( value ) ) 309 { 310 Namespace xsdNamespace = new Namespace( "xsd", ParserUtils.XML_SCHEMA_URI ); 311 Namespace xsiNamespace = new Namespace( "xsi", ParserUtils.XML_SCHEMA_INSTANCE_URI ); 312 element.getDocument().getRootElement().add( xsdNamespace ); 313 element.getDocument().getRootElement().add( xsiNamespace ); 314 315 Element valueElement = 316 newElement.addElement( "value" ).addText( ParserUtils.base64Encode( value ) ); 317 valueElement 318 .addAttribute( new QName( "type", xsiNamespace ), "xsd:" + ParserUtils.BASE64BINARY ); 319 } 320 else 321 { 322 newElement.addElement( "value" ).setText( (String ) value ); 323 } 324 } 325 326 if ( extensibleMatchFilter.isDnAttributes() ) 327 { 328 newElement.addAttribute( "dnAttributes", "true" ); 329 } 330 331 String matchingRule = extensibleMatchFilter.getMatchingRule(); 332 if ( ( matchingRule != null ) && ( "".equals( matchingRule ) ) ) 333 { 334 newElement.addAttribute( "matchingRule", matchingRule ); 335 } 336 } 337 } 338 } 339 | Popular Tags |