From 8527fa13dd940a1a939f8b1ca9e63d4f51125643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Gonz=C3=A1lez=20Fern=C3=A1ndez?= Date: Mon, 31 Aug 2009 16:58:07 +0200 Subject: [PATCH] ItEr24S08CUAsignacionGrupoRecursosAPlanificacionItEr23S10: Adding dependencies sorter --- .../util/script/ScriptDependenciesSorter.java | 52 ++++++++++++ .../ganttz/util/script/ScriptDependency.java | 14 +++ .../script/ScriptDependenciesSorterTest.java | 85 +++++++++++++++++++ 3 files changed, 151 insertions(+) create mode 100644 ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptDependenciesSorter.java create mode 100644 ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptDependenciesSorterTest.java diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptDependenciesSorter.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptDependenciesSorter.java new file mode 100644 index 000000000..c5c73e470 --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptDependenciesSorter.java @@ -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 allScripts = new ArrayList(); + + public ScriptDependenciesSorter() { + } + + public void add(ScriptDependency scriptDependency) { + addAll(Arrays.asList(scriptDependency)); + } + + public void addAll(List dependencies) { + Validate.noNullElements(dependencies); + allScripts.addAll(dependencies); + } + + public List getScriptDependenciesOrderered() { + List result = new ArrayList(); + Set alreadyAdded = new HashSet(); + for (ScriptDependency scriptDependency : allScripts) { + result.addAll(extract(alreadyAdded, scriptDependency)); + } + return Collections.unmodifiableList(result); + } + + private List extract(Set alreadyAdded, + ScriptDependency scriptDependency) { + List result = new ArrayList(); + 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; + } + +} diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptDependency.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptDependency.java index cbc6f693c..65013069b 100644 --- a/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptDependency.java +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptDependency.java @@ -14,6 +14,15 @@ import org.apache.commons.lang.builder.HashCodeBuilder; */ public class ScriptDependency { + public static List getOnlyURLs( + Collection dependencies) { + List result = new ArrayList(); + for (ScriptDependency scriptDependency : dependencies) { + result.add(scriptDependency.getURL()); + } + return result; + } + private final String url; private final List dependsOn; @@ -52,4 +61,9 @@ public class ScriptDependency { return new HashCodeBuilder().append(url).toHashCode(); } + @Override + public String toString() { + return url; + } + } diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptDependenciesSorterTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptDependenciesSorterTest.java new file mode 100644 index 000000000..f50ad19f4 --- /dev/null +++ b/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptDependenciesSorterTest.java @@ -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> scriptsReturnedAre(String... urls) { + final List urlsList = Arrays.asList(urls); + return new BaseMatcher>() { + + @Override + public boolean matches(Object object) { + if (object instanceof List) { + List scriptsRequired = (List) object; + List 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(); + } + +}