设为首页 收藏本站
查看: 968|回复: 0

[经验分享] LDAP查询结果按照指定的属性排序

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2014-1-14 10:28:51 | 显示全部楼层 |阅读模式
这里将要介绍如何将从LDAP中查询出来的结果按照我们自己的业务需求来排序,文中所有的代码均可以单独运行成功,需要注意的地方我会特别注明。

需要引用的包:ldapjdk_4.1.jar(下载链接在文章末尾处)。

这里我首先要提前申明一些前提:

  我的需求是要将每个节点下的所有子节点按照他们的某一个属性进行排序,但是又仅限于本级,不延伸至下面节点的子节点:

 dc=itrus,dc=com,dc=cn

  |---ou=集团总部
      |---ou=公司领导
      |---ou=办公室
      |---ou=新闻中心
  |---ou=河北分公司
      |---ou=软件部
      |---ou=硬件部
      |---ou=测试部

这是一个简单的结构,我们要求当查询某个节点后,得到的结果是按照他们的某一个属性进行排序的,例如,这些所有的节点都有一个共同的属性:orderCode,我用它来对结果排序,我的orderCode值为:

  集团总部--orderCode=100, 公司领导---orderCode=100, 办公室---orderCode=200,新闻中心---orderCode=300,

  河北分公司----orderCode=200, 软件部---orderCode=100, 硬件部----orderCode=200, 测试部-----orderCode-300

下面开始正式的例子,首先我需要将下载好的JAR包Build Path到项目中,然后代码如下:


1 package com.test;
2
3 import java.util.Comparator;
4 import java.util.Map;
5 import java.util.TreeMap;
6
7 import netscape.ldap.LDAPCompareAttrNames;
8 import netscape.ldap.LDAPConnection;
9 import netscape.ldap.LDAPEntry;
10 import netscape.ldap.LDAPException;
11 import netscape.ldap.LDAPReferralException;
12 import netscape.ldap.LDAPSearchResults;
13 import netscape.ldap.util.ConnectionPool;
14
15 public class SearchPageSort {
16     private static final String HOST="localhost";
17     private static final int PORT=389;
18     private static final int MIN_CONN_SIZE=1;
19     private static final int MAX_CONN_SIZE=5;
20     private static final String USER_ID="cn=Manager,dc=itrus,dc=com,dc=cn";
21     private static final String PASSWORD="password";
22     private static ConnectionPool connPool;
23     
24     static{
25         try{
26             connPool=new ConnectionPool(MIN_CONN_SIZE,MAX_CONN_SIZE,HOST,PORT);
27         }catch(LDAPException e){
28             e.printStackTrace();
29         }
30     }
31     public static ConnectionPool getConnectionPool(){
32         return SearchPageSort.connPool;
33     }
34     public static LDAPConnection getConnection(){
35         LDAPConnection conn=SearchPageSort.getConnectionPool().getConnection();
36         try{
37             conn.authenticate(USER_ID, PASSWORD);
38         }catch(LDAPException e){
39             e.printStackTrace();
40         }
41         return conn;
42     }
43     public static void closeConnection(LDAPConnection conn){
44         SearchPageSort.getConnectionPool().close(conn);
45     }
46     public static void main(String[] args) throws LDAPException {
47         LDAPConnection con=SearchPageSort.getConnection();
48         String[] ATTRS={"orderCode"};
49         LDAPSearchResults res=con.search("ou=集团总部,dc=itrus,dc=com,dc=cn", LDAPConnection.SCOPE_ONE, "orderCode=*", ATTRS, false);
50         
51         LDAPCompareAttrNames compareAttrNames=new LDAPCompareAttrNames("orderCode",true);
52         res.sort(compareAttrNames);
53         Map<Integer,LDAPEntry> map=new TreeMap<Integer,LDAPEntry>(new Comparator<Integer>() {
54             public int compare(Integer obj1, Integer obj2) {
55                 // 升序或降序
56                 return obj1.compareTo(obj2);
57                 //如果需要降序排序则用下面这句
58                // return obj2.compareTo(obj1);
59             }
60         });
61         while(res.hasMoreElements()){
62             try{
63                 LDAPEntry entry=res.next();
64                 map.put(Integer.parseInt(entry.getAttribute("orderCode").getStringValueArray()[0]), entry);
65             }catch(LDAPReferralException e){
66                 e.printStackTrace();
67                 continue;
68             }catch(LDAPException e){
69                 e.printStackTrace();
70                 continue;
71             }
72         }
73         for(int i:map.keySet()){
74             System.out.print(map.get(i).getDN()+" ");
75             System.out.println(map.get(i).getAttribute("orderCode").getStringValueArray()[0]);
76         }
77     }
78 }



如果在64行处添加System.out.println(entry);这行代码,你将看到结果是按照字典顺序排的序,并没有按照数字的大小来排序。



这就是一个简单的排序例子,由于我没有在API中找到怎样对数字按照大小的顺序来排序,所以做了一个TreeMap,用orderCode值作为键,然后实现内部类对键进行排序以此来实现按照orderCode升序或者降序的排列,当然这个也是有局限性的,如果你在第49行使用了LDAPConnection.SCOPE_SUB,并且所查询的节点下面还有子节点,那么你得到的将是一个错误的结果。



--------------------------

参考资料:

http://www.docin.com/p-301603315 ... qq.c2c#userconsent#



如果在运行时候遇到这个错误

error result (2); historical protocol version requested, use LDAPv3 instead; Protocol error



产生这个问题的原因是因为我在客户端bind的协议是LDAPv2,而OpenLDAP服务器使用的协议是LDAPv3,所以无法访问.

解决问题的方法是:需改slapd.conf,在其中加入一句allow bind_v2,重启ldap服务即可.(不要加在最下面)



ldapjdk_4.1.jar下载链接:http://pan.baidu.com/s/1eQdzjSQ

一切痛苦,本质上都是对自己的无能的愤怒。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-14212-1-1.html 上篇帖子: H.264:FFMpeg 实现简单的播放器 下篇帖子: 修改linux文件/文件夹权限
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表