ItEr24S08CUAsignacionGrupoRecursosAPlanificacionItEr23S10: Adding dependencies sorter

This commit is contained in:
Óscar González Fernández 2009-08-31 16:58:07 +02:00
parent 59dd6d0d2f
commit 8527fa13dd
3 changed files with 151 additions and 0 deletions

View file

@ -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;
}
}

View file

@ -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;
}
}

View file

@ -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();
}
}