Add recursive variant of Config.getNames() methods
These methods allow to find all configuration entry names for a given section or section/subsection searching recursively through all base configurations of the given configuration. These methods are needed to calculate the names for the effective configuration of a git repository which combines the configuration entry names found in the repository, global and system configuration files Bug: 396659 Change-Id: Ie3731b5e877f8686aadad3f1a46b2e583ad3b7c6 Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
This commit is contained in:
parent
162a5c4c89
commit
2e0d178855
|
@ -519,6 +519,31 @@ public void test009_readNamesInSection() throws ConfigInvalidException {
|
||||||
assertFalse(itr.hasNext());
|
assertFalse(itr.hasNext());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test_ReadNamesInSectionRecursive()
|
||||||
|
throws ConfigInvalidException {
|
||||||
|
String baseConfigString = "[core]\n" + "logAllRefUpdates = true\n";
|
||||||
|
String configString = "[core]\n" + "repositoryFormatVersion = 0\n"
|
||||||
|
+ "filemode = false\n";
|
||||||
|
final Config c = parse(configString, parse(baseConfigString));
|
||||||
|
Set<String> names = c.getNames("core", true);
|
||||||
|
assertEquals("Core section size", 3, names.size());
|
||||||
|
assertTrue("Core section should contain \"filemode\"",
|
||||||
|
names.contains("filemode"));
|
||||||
|
assertTrue("Core section should contain \"repositoryFormatVersion\"",
|
||||||
|
names.contains("repositoryFormatVersion"));
|
||||||
|
assertTrue("Core section should contain \"logAllRefUpdates\"",
|
||||||
|
names.contains("logAllRefUpdates"));
|
||||||
|
assertTrue("Core section should contain \"logallrefupdates\"",
|
||||||
|
names.contains("logallrefupdates"));
|
||||||
|
|
||||||
|
Iterator<String> itr = names.iterator();
|
||||||
|
assertEquals("filemode", itr.next());
|
||||||
|
assertEquals("repositoryFormatVersion", itr.next());
|
||||||
|
assertEquals("logAllRefUpdates", itr.next());
|
||||||
|
assertFalse(itr.hasNext());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test010_readNamesInSubSection() throws ConfigInvalidException {
|
public void test010_readNamesInSubSection() throws ConfigInvalidException {
|
||||||
String configString = "[a \"sub1\"]\n"//
|
String configString = "[a \"sub1\"]\n"//
|
||||||
|
@ -540,6 +565,30 @@ public void test010_readNamesInSubSection() throws ConfigInvalidException {
|
||||||
assertTrue("Subsection should contain \"b\"", names.contains("b"));
|
assertTrue("Subsection should contain \"b\"", names.contains("b"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void readNamesInSubSectionRecursive() throws ConfigInvalidException {
|
||||||
|
String baseConfigString = "[a \"sub1\"]\n"//
|
||||||
|
+ "x = 0\n" //
|
||||||
|
+ "y = false\n"//
|
||||||
|
+ "[a \"sub2\"]\n"//
|
||||||
|
+ "A=0\n";//
|
||||||
|
String configString = "[a \"sub1\"]\n"//
|
||||||
|
+ "z = true\n"//
|
||||||
|
+ "[a \"sub2\"]\n"//
|
||||||
|
+ "B=1\n";
|
||||||
|
final Config c = parse(configString, parse(baseConfigString));
|
||||||
|
Set<String> names = c.getNames("a", "sub1", true);
|
||||||
|
assertEquals("Subsection size", 3, names.size());
|
||||||
|
assertTrue("Subsection should contain \"x\"", names.contains("x"));
|
||||||
|
assertTrue("Subsection should contain \"y\"", names.contains("y"));
|
||||||
|
assertTrue("Subsection should contain \"z\"", names.contains("z"));
|
||||||
|
names = c.getNames("a", "sub2", true);
|
||||||
|
assertEquals("Subsection size", 2, names.size());
|
||||||
|
assertTrue("Subsection should contain \"A\"", names.contains("A"));
|
||||||
|
assertTrue("Subsection should contain \"a\"", names.contains("a"));
|
||||||
|
assertTrue("Subsection should contain \"B\"", names.contains("B"));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testQuotingForSubSectionNames() {
|
public void testQuotingForSubSectionNames() {
|
||||||
String resultPattern = "[testsection \"{0}\"]\n\ttestname = testvalue\n";
|
String resultPattern = "[testsection \"{0}\"]\n\ttestname = testvalue\n";
|
||||||
|
@ -584,7 +633,12 @@ private static void assertReadLong(long exp, String act)
|
||||||
|
|
||||||
private static Config parse(final String content)
|
private static Config parse(final String content)
|
||||||
throws ConfigInvalidException {
|
throws ConfigInvalidException {
|
||||||
final Config c = new Config(null);
|
return parse(content, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Config parse(final String content, Config baseConfig)
|
||||||
|
throws ConfigInvalidException {
|
||||||
|
final Config c = new Config(baseConfig);
|
||||||
c.fromText(content);
|
c.fromText(content);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
|
@ -527,6 +527,33 @@ public Set<String> getNames(String section, String subsection) {
|
||||||
return getState().getNames(section, subsection);
|
return getState().getNames(section, subsection);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param section
|
||||||
|
* the section
|
||||||
|
* @param recursive
|
||||||
|
* if {@code true} recursively adds the names defined in all base
|
||||||
|
* configurations
|
||||||
|
* @return the list of names defined for this section
|
||||||
|
*/
|
||||||
|
public Set<String> getNames(String section, boolean recursive) {
|
||||||
|
return getState().getNames(section, null, recursive);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param section
|
||||||
|
* the section
|
||||||
|
* @param subsection
|
||||||
|
* the subsection
|
||||||
|
* @param recursive
|
||||||
|
* if {@code true} recursively adds the names defined in all base
|
||||||
|
* configurations
|
||||||
|
* @return the list of names defined for this subsection
|
||||||
|
*/
|
||||||
|
public Set<String> getNames(String section, String subsection,
|
||||||
|
boolean recursive) {
|
||||||
|
return getState().getNames(section, subsection, recursive);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Obtain a handle to a parsed set of configuration values.
|
* Obtain a handle to a parsed set of configuration values.
|
||||||
*
|
*
|
||||||
|
|
|
@ -97,6 +97,16 @@ Set<String> getSubsections(String section) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<String> getNames(String section, String subsection) {
|
Set<String> getNames(String section, String subsection) {
|
||||||
|
return getNames(section, subsection, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Set<String> getNames(String section, String subsection, boolean recursive) {
|
||||||
|
Map<String, String> m = getNamesInternal(section, subsection, recursive);
|
||||||
|
return new CaseFoldingSet(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
private Map<String, String> getNamesInternal(String section,
|
||||||
|
String subsection, boolean recursive) {
|
||||||
List<ConfigLine> s = sorted();
|
List<ConfigLine> s = sorted();
|
||||||
int idx = find(s, section, subsection, ""); //$NON-NLS-1$
|
int idx = find(s, section, subsection, ""); //$NON-NLS-1$
|
||||||
if (idx < 0)
|
if (idx < 0)
|
||||||
|
@ -113,7 +123,9 @@ Set<String> getNames(String section, String subsection) {
|
||||||
if (!m.containsKey(l))
|
if (!m.containsKey(l))
|
||||||
m.put(l, e.name);
|
m.put(l, e.name);
|
||||||
}
|
}
|
||||||
return new CaseFoldingSet(m);
|
if (recursive && baseState != null)
|
||||||
|
m.putAll(baseState.getNamesInternal(section, subsection, recursive));
|
||||||
|
return m;
|
||||||
}
|
}
|
||||||
|
|
||||||
String[] get(String section, String subsection, String name) {
|
String[] get(String section, String subsection, String name) {
|
||||||
|
|
Loading…
Reference in New Issue