/*
 * 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.
 */

// 6.4.0 shows 2 hard to understand errors:
//    > Task :compileJava
//    C:\projectsASF\Git\ofbiz-framework\plugins\ldap\src\main\java\org\apache\ofbiz\ldap\activedirectory\OFBizActiveDirectoryAuthenticationHandler.java:95: error: incompatible types: String cannot be converted to DERBuffer
//                LdapEntry entry = new LdapEntry(username);
//                                                ^
//    C:\projectsASF\Git\ofbiz-framework\plugins\ldap\src\main\java\org\apache\ofbiz\ldap\openldap\OFBizLdapAuthenticationHandler.java:82: error: incompatible types: String cannot be converted to DERBuffer
//                LdapEntry entry = new LdapEntry(username);
//                                                ^
dependencies {
    pluginLibsCompile 'org.apereo.cas:cas-server-support-ldap-core:5.0.10'
}

configurations.all {
    exclude group: 'javax.xml.parsers', module: 'jsr173_api'
    exclude group: 'javax.xml.namespace', module: 'jsr173_api'
    exclude group: 'javax.xml.bind', module: 'jsr173_api'
    exclude group: 'javax.xml.bind', module: 'jaxb-api'
    exclude group: 'geronimo-spec', module: 'geronimo-spec-jta'
    
}
