private void parse() {
configErrors.clear();
configWarnings.clear();
Table<String, String, Set<String>> groupRolePrivilegeTableTemp = HashBasedTable.create();
Ini ini;
LOGGER.info("Parsing " + resourcePath);
LOGGER.info("Filesystem: " + fileSystem.getUri());
try {
try {
ini = PolicyFiles.loadFromPath(fileSystem, resourcePath);
} catch (IOException e) {
configErrors.add("Failed to read policy file " + resourcePath +
" Error: " + e.getMessage());
throw new SentryConfigurationException("Error loading policy file " + resourcePath, e);
} catch (IllegalArgumentException e) {
configErrors.add("Failed to read policy file " + resourcePath +
" Error: " + e.getMessage());
throw new SentryConfigurationException("Error loading policy file " + resourcePath, e);
}
if(LOGGER.isDebugEnabled()) {
for(String sectionName : ini.getSectionNames()) {
LOGGER.debug("Section: " + sectionName);
Ini.Section section = ini.get(sectionName);
for(String key : section.keySet()) {
String value = section.get(key);
LOGGER.debug(key + " = " + value);
}
}
}
parseIni(null, ini, validators, resourcePath, groupRolePrivilegeTableTemp);
mergeResult(groupRolePrivilegeTableTemp);
groupRolePrivilegeTableTemp.clear();
Ini.Section filesSection = ini.getSection(DATABASES);
if(filesSection == null) {
LOGGER.info("Section " + DATABASES + " needs no further processing");
} else if (!allowPerDatabaseSection) {
String msg = "Per-db policy file is not expected in this configuration.";
throw new SentryConfigurationException(msg);
} else {
for(Map.Entry<String, String> entry : filesSection.entrySet()) {
String database = Strings.nullToEmpty(entry.getKey()).trim().toLowerCase();
Path perDbPolicy = new Path(Strings.nullToEmpty(entry.getValue()).trim());
if(isRelative(perDbPolicy)) {
perDbPolicy = new Path(resourcePath.getParent(), perDbPolicy);
}
try {
LOGGER.debug("Parsing " + perDbPolicy);
Ini perDbIni = PolicyFiles.loadFromPath(perDbPolicy.getFileSystem(conf), perDbPolicy);
if(perDbIni.containsKey(USERS)) {
configErrors.add("Per-db policy file cannot contain " + USERS + " section in " + perDbPolicy);
throw new SentryConfigurationException("Per-db policy files cannot contain " + USERS + " section");
}
if(perDbIni.containsKey(DATABASES)) {
configErrors.add("Per-db policy files cannot contain " + DATABASES
+ " section in " + perDbPolicy);
throw new SentryConfigurationException("Per-db policy files cannot contain " + DATABASES + " section");
}
parseIni(database, perDbIni, validators, perDbPolicy, groupRolePrivilegeTableTemp);