保留大小写的 LDIF reader/parser/stream
case-preserving LDIF reader/parser/stream
我必须读取 LDIF 文件,拆分条目,修改它们,然后将结果写入 LDIF 文件。
我在 Apache Directory LDAP API (org.apache.directory.api:api-ldap-client-api
) 中找到了一个 LdifReader,所以我尝试了这样一个:
Stream<LdifEntry> stream = StreamSupport.stream(reader.spliterator(), false);
Predicate<LdifEntry> isEnabled = entry -> entry.get("pwdAccountLockedTime") == null;
Map<Boolean, List<LdifEntry>> parts = stream.collect(Collectors.partitioningBy(isEnabled));
List<LdifEntry> enabledAccounts = parts.get(true);
List<LdifEntry> disabledAccounts = parts.get(false);
效果很好。然而,出于某种原因,所有属性 names/ids 都是小写的(“pwdAccountLockedTime” 变为 “pwdaccountlockedtime”,等等)但我需要它们(保留大小写)——为了保持相同 人类可读性 和以前一样。
知道怎么做吗?如果需要,我会使用不同的库。
注意:我想改进我的问题,因为我得到了一些反对票。请告诉我,它有什么问题或缺少什么。
我可以通过用 org.springframework.ldap:spring-ldap-ldif-core
替换库并编写一个小助手来解决我的问题。
public class LdifUtils {
/**
* Reads an LDIF file and returns its entries as a collection
* of <code>LdapAttributes</code> (LDAP entries).
* <br>
* Note: This method is not for huge files,
* as the content is loaded completely into memory.
*
* @param pathToLdifFile the <code>Path</code> to the LDAP Data Interchange Format file
* @return a <code>Collection</code> of <code>LdapAttributes</code> (LDAP entries)
* @throws IOException if reading the file fails
*/
public static Collection<LdapAttributes> read(final Path pathToLdifFile) throws IOException {
final LdifParser ldifParser = new LdifParser(pathToLdifFile.toFile());
ldifParser.open();
final Collection<LdapAttributes> c = new LinkedList<>();
while (ldifParser.hasMoreRecords()){
c.add(ldifParser.getRecord());
}
ldifParser.close();
return c;
}
}
像以前一样使用...
final Stream<LdapAttributes> stream = LdifUtils.read(path).stream();
final Predicate<LdapAttributes> isEnabled = entry -> entry.get("pwdAccountLockedTime") == null;
final Map<Boolean, List<LdapAttributes>> parts = stream.collect(Collectors.partitioningBy(isEnabled));
final List<LdapAttributes> enabledAccounts = parts.get(true);
final List<LdapAttributes> disabledAccounts = parts.get(false);
logger.info("enabled accounts: " + enabledAccounts.size());
logger.info("disabled accounts: " + disabledAccounts.size());
注意:我想改进我的答案,因为我得到了一些反对票。请告诉我,它有什么问题或缺少什么。
我必须读取 LDIF 文件,拆分条目,修改它们,然后将结果写入 LDIF 文件。
我在 Apache Directory LDAP API (org.apache.directory.api:api-ldap-client-api
) 中找到了一个 LdifReader,所以我尝试了这样一个:
Stream<LdifEntry> stream = StreamSupport.stream(reader.spliterator(), false);
Predicate<LdifEntry> isEnabled = entry -> entry.get("pwdAccountLockedTime") == null;
Map<Boolean, List<LdifEntry>> parts = stream.collect(Collectors.partitioningBy(isEnabled));
List<LdifEntry> enabledAccounts = parts.get(true);
List<LdifEntry> disabledAccounts = parts.get(false);
效果很好。然而,出于某种原因,所有属性 names/ids 都是小写的(“pwdAccountLockedTime” 变为 “pwdaccountlockedtime”,等等)但我需要它们(保留大小写)——为了保持相同 人类可读性 和以前一样。
知道怎么做吗?如果需要,我会使用不同的库。
注意:我想改进我的问题,因为我得到了一些反对票。请告诉我,它有什么问题或缺少什么。
我可以通过用 org.springframework.ldap:spring-ldap-ldif-core
替换库并编写一个小助手来解决我的问题。
public class LdifUtils {
/**
* Reads an LDIF file and returns its entries as a collection
* of <code>LdapAttributes</code> (LDAP entries).
* <br>
* Note: This method is not for huge files,
* as the content is loaded completely into memory.
*
* @param pathToLdifFile the <code>Path</code> to the LDAP Data Interchange Format file
* @return a <code>Collection</code> of <code>LdapAttributes</code> (LDAP entries)
* @throws IOException if reading the file fails
*/
public static Collection<LdapAttributes> read(final Path pathToLdifFile) throws IOException {
final LdifParser ldifParser = new LdifParser(pathToLdifFile.toFile());
ldifParser.open();
final Collection<LdapAttributes> c = new LinkedList<>();
while (ldifParser.hasMoreRecords()){
c.add(ldifParser.getRecord());
}
ldifParser.close();
return c;
}
}
像以前一样使用...
final Stream<LdapAttributes> stream = LdifUtils.read(path).stream();
final Predicate<LdapAttributes> isEnabled = entry -> entry.get("pwdAccountLockedTime") == null;
final Map<Boolean, List<LdapAttributes>> parts = stream.collect(Collectors.partitioningBy(isEnabled));
final List<LdapAttributes> enabledAccounts = parts.get(true);
final List<LdapAttributes> disabledAccounts = parts.get(false);
logger.info("enabled accounts: " + enabledAccounts.size());
logger.info("disabled accounts: " + disabledAccounts.size());
注意:我想改进我的答案,因为我得到了一些反对票。请告诉我,它有什么问题或缺少什么。