程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 封裝JNDI操作LDAP服務器的工具類(4.1)

封裝JNDI操作LDAP服務器的工具類(4.1)

編輯:關於JAVA

目標:使用者只需要會使用List,Map 數據結構,將對LDAP的操作進行封裝

  

  類:主要有三個類

  

  1 Env類 包含LDAP的連接信息

  

  2 LdapConnectionFactory類 ldap連接工廠,提供初始化及獲取ldap連接的方法

  

  3 LdapOperUtils ldap的處理工具類,提供了各種操作ldap的方法。

  

  接 封裝JNDI操作LDAP服務器

的工具類(3) LdapOperUtils類的其余方法

  

  /**

  * 在當前連接的DirContext 修改指定Context下的一個 或 多個屬性

  * @param context 連接的DirContext

  * @param cn 指定Context下的名字

  * @param attMap 包含List key為屬性名稱,當屬性為多值時

  * value 為包含多值的List,為單值時,為包含單值的String類型

  * @throws BaseException

  * @throws NamingException

  */

  public static void modifyAttributes(DirContext context, String cn,

  Map attMap) throws

  BaseException, NamingException {

  

  // 參數為空

  if (context == null) {

  String[] args = {

  "context"};

  // 打印錯誤日志

  StringBuffer msglog = new StringBuffer(

  "empty invoke parameter context NULL ");

  log.error(msglog.toString());

  throw new BaseException("error.common.parameter.empty", args);

  }

  

  // 參數為空

  if (attMap == null) {

  String[] args = {

  "attMap"};

  // 打印錯誤日志

  StringBuffer msglog = new StringBuffer(

  "empty invoke parameter attMap NULL ");

  log.error(msglog.toString());

  throw new BaseException("error.common.parameter.empty", args);

  }

  // 參數為空

  if (StringUtils.isEmpty(cn)) {

  String[] args = {

  "cn"};

  // 打印錯誤日志

  StringBuffer msglog = new StringBuffer(

  "empty invoke parameter cn NULL ");

  log.error(msglog.toString());

  throw new BaseException("error.common.parameter.empty", args);

  }

  

  // 為空,退出

  if (attMap.isEmpty()) {

  return;

  }

  // 取所有的屬性key

  Set keySet = attMap.keySet();

  Iterator keyIterator = keySet.iterator();

  Attributes attrs = new BasicAttributes();

  // 迭代所有的屬性key

  while (keyIterator.hasNext()) {

  // 取下一個屬笥

  String key = (String) keyIterator.next();

  Attribute att = null;

  Object valueObj = attMap.get(key);

  

  if (valueObj instanceof List) {

  // 為List ,為多值屬性

  att = new BasicAttribute(key);

  List valueList = (List) valueObj;

  // 加入多值屬性

  for (int i = 0; i < valueList.size(); i++) {

  att.add(valueList.get(i));

  }

  } else if (valueObj instanceof String) {

  att = new BasicAttribute(key, valueObj);

  }

  // 加入

  attrs.put(att);

  }

  context.modifyAttributes(cn, DirContext.REPLACE_ATTRIBUTE, attrs);

  // context.close();

  }

  

  //

  /**

  * 獲取連接的DirContext中指定Context下的指定屬性

  * @param context 連接的DirContext

  * @param cn 指定Context的名稱

  * @param attNameList 要取的屬性的名稱List

  * @return Map包含List ,key 為屬性的名稱,當屬性值為多值時,Value為List類型,

  * 否則,value 為String 類型

  * @throws NamingException

  */

  public static Map getAttributes(DirContext context, String cn,

  List attNameList) throws NamingException {

  Map attsMap = new HashMap();

  Attributes results = null;

  List attValList = null;

  String attrId = null;

  

  if (attNameList == null) {

  results = context.getAttributes(cn);

  } else {

  if (!attNameList.isEmpty()) {

  // results = context.getAttributes(cn);

  String[] stTemp = new String[attNameList.size()];

  /////////////////////////////////////////// 以下方法性能太低 ////////////////////////////////

  //        for (int i = 0; i < attNameList.size(); i++) {

  //          stTemp[i] = (String) attNameList.get(i);

  //        }

  //        results = context.getAttributes(cn,

  //                        stTemp);

  ///////////////////////////////////////////////////////////////////////////////////////////

  // 比較高性能的List 轉為 數組的方法

  results = context.getAttributes(cn,

  (String[]) (attNameList.toArray(stTemp)));

  }

  }

  for (int i = 0; i < attNameList.size(); i++) {

  Attribute attr = results.get((String) attNameList.get(i));

  attrId = (String) attNameList.get(i);

  if (attr != null) {

  if (attr.size() > 0) {

  NamingEnumeration vals = attr.getAll();

  if (vals == null) {

  continue;

  }

  Object obj1 = vals.nextElement();

  if (obj1 == null) {

  continue;

  }

  // 迭代這個屬性的所有屬性值

  while (vals.hasMoreElements()) {

  if (attValList == null) {

  attValList = new ArrayList();

  attValList.add(obj1);

  }

  attValList.add(vals.nextElement());

  }

  // 當屬性為單值域時,存為字符串

  // 當屬性為多值域時,存為包含多值域的List

  if (attValList != null) {

  attsMap.put(attrId, attValList);

  // 清空

  attValList = null;

  } else {

  attsMap.put(attrId, obj1);

  }

  }

  }

  }

  // context.close();

  return attsMap;

  }

  

  /**

  * 在當前連接的DirContext 獲取指定Context下的指定屬性名稱的所有屬性值(一個或多個值)

  * @param context 連接的DirContext

  * @param cn 指定Context的cn名

  * @param attName 屬性名稱

  * @return 返回包括屬性值的List 注意,當屬性只有一個值時,返回的List長度為1,當屬性

  * 是多值屬性時,返回List長度為屬性值的數目

  * @throws NamingException

  */

  public static List getAttributeValues(DirContext context, String cn,

  String attName) throws

  NamingException {

  List attValList = new ArrayList();

  List attNameList = new ArrayList();

  attNameList.add(attName);

  Map attMap = null;

  attMap = getAttributes(context, cn, attNameList);

  

  if (attMap != null) {

  Object attValObj = attMap.get(attName);

  if (attValObj instanceof String) {

  attValList.add((String) attValObj);

  } else if (attValObj instanceof List) {

  attValList = ((List) attValObj);

  }

  }

  // context.close();

  return attValList;

  }

  

  /**

  * 獲取角色的相關信息

  * @param context DirContext

  * @param cn String

  * @param attName String

  * @return String

  * @throws NamingException

  */

  public static String getRoleAttributeValues(DirContext context, String cn,

  String attName) throws

  NamingException {

  String result = "";

  List attNameList = new ArrayList();

  attNameList.add(attName);

  Map attMap = null;

  attMap = getAttributes(context, cn, attNameList);

  

  if (attMap != null) {

  Object attValObj = attMap.get(attName);

  result = (String)attValObj;

  }

  return result;

  }

  

  /**

  * 根據條件查找指定CN的Context下的一層所有屬性

  * @param context 連接了的DirContext

  * @param cn 要查詢的BaseCN名稱

  * @param filter 要查詢的過濾字符串

  * @return 符合查詢結果的List

  * @throws NamingException

  */

  public static List searchContextOne(DirContext context, String cn,

  String filter) throws

  NamingException {

  List resultList = new ArrayList();

  Map resultRowMap = null;

  List attValList = null;

  String attValStr = null;

  // 實例化一個搜索器

  SearchControls constraints = new SearchControls();

  // 設置搜索器的搜索范圍

  constraints.setSearchScope(SearchControls.ONELEVEL_SCOPE);

  // 在基目錄中搜索條件為Env.MY_FILTER的所有屬性 注意:這裡返回是的所有的條目集合

  NamingEnumeration results

  = context.search(cn, filter, constraints);

  

  // 打印條目的識別名(DN)及其所有的屬性名,值

  while (results != null && results.hasMore()) {

  // 取一個條目

  SearchResult si = (SearchResult) results.next();

  

  // 獲取條目的所有屬性集合

  Attributes attrs = si.getAttributes();

  if (attrs != null) {

  String attrId = null;

  // 一行數據

  resultRowMap = new HashMap();

  // 打印所有屬性

  for (NamingEnumeration ae = attrs.getAll();

  ae.hasMoreElements(); ) {

  // 獲取一個屬性

  Attribute attr = (Attribute) ae.next();

  attrId = attr.getID();

  Enumeration vals = attr.getAll();

  if (vals == null) {

  continue;

  }

  Object obj1 = vals.nextElement();

  if (obj1 == null) {

  continue;

  }

  // 迭代這個屬性的所有屬性值

  while (vals.hasMoreElements()) {

  if (attValList == null) {

  attValList = new ArrayList();

  attValList.add(obj1);

  }

  attValList.add(vals.nextElement());

  }

  // 當屬性為單值域時,存為字符串

  // 當屬性為多值域時,存為包含多值域的List

  if (attValList != null) {

  resultRowMap.put(attrId, attValList);

  // 清空

  attValList = null;

  } else {

  resultRowMap.put(attrId, obj1);

  }

  

  }

  }

  resultList.add(resultRowMap);

  }

  return resultList;

  }

  

  /**

  * 根所條件查找指定CN的Context下的子樹下的所有屬性

  * @param context 連接了的DirContext

  * @param cn 要查詢的BaseCN名稱

  * @param filter 要查詢的過濾字符串

  * @return 符合查詢結果的List

  * @throws NamingException

  */

  public static List searchContextSub(DirContext context, String cn,

  String filter) throws

  NamingException {

  List resultList = new ArrayList();

  Map resultRowMap = null;

  List attValList = null;

  // 實例化一個搜索器

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved