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 則留言