ItEr24S08CUAsignacionGrupoRecursosAPlanificacionItEr23S10: Adding dependencies sorter
This commit is contained in:
parent
59dd6d0d2f
commit
8527fa13dd
3 changed files with 151 additions and 0 deletions
|
|
@ -0,0 +1,52 @@
|
|||
package org.zkoss.ganttz.util.script;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import org.apache.commons.lang.Validate;
|
||||
|
||||
public class ScriptDependenciesSorter {
|
||||
|
||||
private List<ScriptDependency> allScripts = new ArrayList<ScriptDependency>();
|
||||
|
||||
public ScriptDependenciesSorter() {
|
||||
}
|
||||
|
||||
public void add(ScriptDependency scriptDependency) {
|
||||
addAll(Arrays.asList(scriptDependency));
|
||||
}
|
||||
|
||||
public void addAll(List<ScriptDependency> dependencies) {
|
||||
Validate.noNullElements(dependencies);
|
||||
allScripts.addAll(dependencies);
|
||||
}
|
||||
|
||||
public List<ScriptDependency> getScriptDependenciesOrderered() {
|
||||
List<ScriptDependency> result = new ArrayList<ScriptDependency>();
|
||||
Set<ScriptDependency> alreadyAdded = new HashSet<ScriptDependency>();
|
||||
for (ScriptDependency scriptDependency : allScripts) {
|
||||
result.addAll(extract(alreadyAdded, scriptDependency));
|
||||
}
|
||||
return Collections.unmodifiableList(result);
|
||||
}
|
||||
|
||||
private List<ScriptDependency> extract(Set<ScriptDependency> alreadyAdded,
|
||||
ScriptDependency scriptDependency) {
|
||||
List<ScriptDependency> result = new ArrayList<ScriptDependency>();
|
||||
for (ScriptDependency d : scriptDependency.getDependsOn()) {
|
||||
if (!alreadyAdded.contains(d)) {
|
||||
result.addAll(extract(alreadyAdded, d));
|
||||
}
|
||||
}
|
||||
if (!alreadyAdded.contains(scriptDependency)) {
|
||||
result.add(scriptDependency);
|
||||
alreadyAdded.add(scriptDependency);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -14,6 +14,15 @@ import org.apache.commons.lang.builder.HashCodeBuilder;
|
|||
*/
|
||||
public class ScriptDependency {
|
||||
|
||||
public static List<String> getOnlyURLs(
|
||||
Collection<? extends ScriptDependency> dependencies) {
|
||||
List<String> result = new ArrayList<String>();
|
||||
for (ScriptDependency scriptDependency : dependencies) {
|
||||
result.add(scriptDependency.getURL());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private final String url;
|
||||
private final List<ScriptDependency> dependsOn;
|
||||
|
||||
|
|
@ -52,4 +61,9 @@ public class ScriptDependency {
|
|||
return new HashCodeBuilder().append(url).toHashCode();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return url;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,85 @@
|
|||
package org.zkoss.ganttz.util.script;
|
||||
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.hamcrest.BaseMatcher;
|
||||
import org.hamcrest.Description;
|
||||
import org.hamcrest.Matcher;
|
||||
import org.junit.Test;
|
||||
|
||||
public class ScriptDependenciesSorterTest {
|
||||
|
||||
private ScriptDependenciesSorter scriptDependenciesSorter;
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void cannotAddNullDependency() {
|
||||
givenAllScriptsRequired();
|
||||
scriptDependenciesSorter.add(null);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testWithoutDependencies() {
|
||||
givenAllScriptsRequired();
|
||||
scriptDependenciesSorter.add(new ScriptDependency("A"));
|
||||
scriptDependenciesSorter.add(new ScriptDependency("B"));
|
||||
assertThat(scriptDependenciesSorter.getScriptDependenciesOrderered(),
|
||||
scriptsReturnedAre("A", "B"));
|
||||
}
|
||||
|
||||
@Test(expected = UnsupportedOperationException.class)
|
||||
public void theDependenciesOrderedCannotBeModified() {
|
||||
givenAllScriptsRequired();
|
||||
scriptDependenciesSorter.getScriptDependenciesOrderered().add(
|
||||
new ScriptDependency("bla"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dependenciesGoesFirst() {
|
||||
givenAllScriptsRequired();
|
||||
scriptDependenciesSorter.add(new ScriptDependency("A", Arrays
|
||||
.asList(new ScriptDependency("B"))));
|
||||
assertThat(scriptDependenciesSorter.getScriptDependenciesOrderered(),
|
||||
scriptsReturnedAre("B", "A"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void dependenciesAreNotRepeated() {
|
||||
givenAllScriptsRequired();
|
||||
scriptDependenciesSorter.add(new ScriptDependency("A", Arrays
|
||||
.asList(new ScriptDependency("B"))));
|
||||
scriptDependenciesSorter.add(new ScriptDependency("C", Arrays
|
||||
.asList(new ScriptDependency("B"))));
|
||||
assertThat(scriptDependenciesSorter.getScriptDependenciesOrderered(),
|
||||
scriptsReturnedAre("B", "A", "C"));
|
||||
}
|
||||
|
||||
private Matcher<List<ScriptDependency>> scriptsReturnedAre(String... urls) {
|
||||
final List<String> urlsList = Arrays.asList(urls);
|
||||
return new BaseMatcher<List<ScriptDependency>>() {
|
||||
|
||||
@Override
|
||||
public boolean matches(Object object) {
|
||||
if (object instanceof List) {
|
||||
List<ScriptDependency> scriptsRequired = (List<ScriptDependency>) object;
|
||||
List<String> onlyURLs = ScriptDependency
|
||||
.getOnlyURLs(scriptsRequired);
|
||||
return onlyURLs.equals(urlsList);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void describeTo(Description description) {
|
||||
description.appendText("must return " + urlsList);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void givenAllScriptsRequired() {
|
||||
scriptDependenciesSorter = new ScriptDependenciesSorter();
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue