[Java] Spring LDAP LDIF Parsing(1)

LDIF 介紹

假設在 keeplearning.blog 底下有一個叫做
research department 的組織,且這個組織底下有一個人叫做 Dennis(姓 Shen)。

LDIF 的格式大概如下:

dn: o=research department,dc=keeplearning,dc=blog
objectclass: organization
objectclass: top
o: research department

dn: cn=Dennis,o=research department,dc=keeplearning,dc=blog
objectclass: person
objectclass: top
cn: Dennis
sn: Shen

其中:

  • dn (distinguished name): 一個用來查找物件,包含根目錄的完整路徑名稱。必定唯一。
  • objectclass: 在 LDAP 目錄裡的物件
  • o (organizationName): organization 物件裡的一個屬性名稱。存放組織名稱。
  • cn (commonName): person 物件裡的一個屬性名稱。存放名字。
  • sn (surname): person 物件裡的一個屬性名稱。存放姓氏。

LDIF 解析

首先如果是 maven 專案的話,我們需要在 pom.xml 加入以下的 jar 檔。
Source Code 參考這裡

<dependency>
    <groupId>org.springframework.ldap</groupId>
    <artifactId>spring-ldap-ldif-core<artifactId>
    <version>2.3.1.RELEASE</version>
</dependency>

方法一:

第一步:打開資源

假設我們有一個 data.ldif 檔,我們產生一個 LdifParser 物件將 data.ldif 放入。
並打開資源。

LdifParser parser = new LdifParser(new ClassPathResource("data.ldif"));
try {
    parser.open();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}   
第二步:解析資源

我們利用 hasMoreRecords 這個方法來判斷是否還有資料需要讀取,若是還有資料需讀取,則利用 getRecord 方法來將 data.ldif 的資料讀近來,並將讀取的資料轉成 LdapAttributes 回傳。



以下只從 attributes 中將 dn 取出並印出來。

LdapAttributes attributes;
try {
    while (parser.hasMoreRecords()) {
        try {
            attributes = parser.getRecord();
            if (attributes != null) {
                // do something you want
                System.out.println(attributes.getName());
            }
        } catch (InvalidAttributeFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        System.out.println();
    }
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
第三步:關閉資源
try {
    parser.close();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

方法二:整合 Spring Batch

放入需要的 jar 檔

<dependency>
    <groupId>org.springframework.batch</groupId>
    <artifactId>spring-batch-core</artifactId>
    <version>3.0.7.RELEASE</version>
</dependency>
第一步:打開資源

假設我們想要將讀取的資料轉成一個叫做 Entity 的物件,我們可以利用實作 RecordMapper 這個界面的 mapRecord 這個方法來達成。

以下例子假設 Entity 這個類別只有 dn 這個屬性。

MappingLdifReader<Entity> mappingLdifReader = new MappingLdifReader<>();
    mappingLdifReader.setRecordMapper(new RecordMapper<Entity>(){
        @Override
        public Entity mapRecord(LdapAttributes attributes) {
            // do something you want
            Entity entity = new Entity();
            entity.setDn(attributes.getName());
            return entity;
        }
    });
mappingLdifReader.setResource(new ClassPathResource("data.ldif"));
mappingLdifReader.open(new ExecutionContext());
public class Entity{
    private Name dn;

    public Name getDn() {
        return dn;
    }

    public void setDn(Name dn) {
        this.dn = dn;
    }
}
第二步:解析並產生 Entity 物件
try {
    // 解析並回傳 entity 物件(轉換方式為方法一中 RecordMapper 的實作方式。)
    Entity entity = mappingLdifReader.read();
} catch (UnexpectedInputException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
第三步:
mappingLdifReader.close();

在〈“[Java] Spring LDAP LDIF Parsing(1)”〉中有 2 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *