From 59dd6d0d2f3102b891dc3196cd1cdfc834ddc32c 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 support for declaring via class the scripts required. --- .../ganttz/util/script/ScriptExtractor.java | 67 ++++++++++++++ .../script/ScriptsRequiredDeclaration.java | 13 +++ .../util/script/ScriptExtractorTest.java | 87 +++++++++++++++++++ .../util/script/ScriptIncludedExample.java | 9 ++ .../script/ScriptsDeclarationsExample.java | 16 ++++ 5 files changed, 192 insertions(+) create mode 100644 ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptExtractor.java create mode 100644 ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptsRequiredDeclaration.java create mode 100644 ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptExtractorTest.java create mode 100644 ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptIncludedExample.java create mode 100644 ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptsDeclarationsExample.java diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptExtractor.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptExtractor.java new file mode 100644 index 000000000..e150727b7 --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptExtractor.java @@ -0,0 +1,67 @@ +package org.zkoss.ganttz.util.script; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class ScriptExtractor { + + public static List extractFrom(Class classWithScripts) { + ScriptsRequiredDeclaration annotation = classWithScripts + .getAnnotation(ScriptsRequiredDeclaration.class); + if (annotation == null) + throw new IllegalArgumentException(classWithScripts + + " must be annotated with " + + ScriptsRequiredDeclaration.class.getName()); + List dependsOn = getDependencies(annotation); + List result = new ArrayList(); + for (Field field : getStringFields(getStaticFields(classWithScripts + .getFields()))) { + result.add(new ScriptDependency(getValueFromStringField(field), + dependsOn)); + } + return result; + } + + private static ArrayList getDependencies( + ScriptsRequiredDeclaration declaration) { + Class[] dependsOn = declaration.dependsOn(); + ArrayList result = new ArrayList(); + for (Class klass : dependsOn) { + result.addAll(extractFrom(klass)); + } + return result; + } + + + private static String getValueFromStringField(Field stringField) { + try { + return (String) stringField.get(null); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static List getStaticFields(Field[] fields) { + List result = new ArrayList(); + for (Field field : fields) { + if (Modifier.isStatic(field.getModifiers())) { + result.add(field); + } + } + return result; + } + + private static List getStringFields(Collection fields) { + List stringFields = new ArrayList(); + for (Field field : fields) { + if (field.getType().equals(String.class)) { + stringFields.add(field); + } + } + return stringFields; + } + +} diff --git a/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptsRequiredDeclaration.java b/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptsRequiredDeclaration.java new file mode 100644 index 000000000..cd3803260 --- /dev/null +++ b/ganttzk/src/main/java/org/zkoss/ganttz/util/script/ScriptsRequiredDeclaration.java @@ -0,0 +1,13 @@ +package org.zkoss.ganttz.util.script; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface ScriptsRequiredDeclaration { + + public Class[] dependsOn() default {}; +} diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptExtractorTest.java b/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptExtractorTest.java new file mode 100644 index 000000000..9afadbf57 --- /dev/null +++ b/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptExtractorTest.java @@ -0,0 +1,87 @@ +package org.zkoss.ganttz.util.script; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertThat; +import static org.junit.matchers.JUnitMatchers.each; +import static org.junit.matchers.JUnitMatchers.hasItem; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import org.hamcrest.BaseMatcher; +import org.hamcrest.Description; +import org.hamcrest.Matcher; +import org.junit.Test; + +public class ScriptExtractorTest { + + @Test(expected = IllegalArgumentException.class) + public void aClassWithoutScriptRequiredAnnotationIsNotIncluded() { + ScriptExtractor.extractFrom(String.class); + } + + @Test + public void onlyPublicStringFieldsAreIncluded() { + List scripts = ScriptExtractor + .extractFrom(ScriptsDeclarationsExample.class); + assertThat(scripts.size(), equalTo(2)); + assertThat(scripts, + hasItem(withURL(ScriptsDeclarationsExample.EXAMPLE_A))); + } + + @Test + public void testIncludesDependencies() { + List scripts = ScriptExtractor + .extractFrom(ScriptsDeclarationsExample.class); + assertThat(scripts, each(withDependencies(ScriptIncludedExample.base, + ScriptIncludedExample.other))); + + } + + private Matcher withDependencies(final String... urls) { + final Set urlsSet = new HashSet(Arrays.asList(urls)); + return new BaseMatcher() { + + @Override + public boolean matches(Object object) { + if (object instanceof ScriptDependency) { + ScriptDependency dependency = (ScriptDependency) object; + Set urls = new HashSet(); + for (ScriptDependency s : dependency.getDependsOn()) { + urls.add(s.getURL()); + } + return urlsSet.equals(urls); + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("depends on " + + Arrays.toString(urls)); + } + }; + } + + private Matcher withURL(final String url) { + return new BaseMatcher() { + + @Override + public boolean matches(Object dependency) { + if (dependency instanceof ScriptDependency) { + ScriptDependency d = (ScriptDependency) dependency; + return d.getURL().equals(url); + } + return false; + } + + @Override + public void describeTo(Description description) { + description.appendText("it has url:" + url); + } + }; + } + +} diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptIncludedExample.java b/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptIncludedExample.java new file mode 100644 index 000000000..afe8a6482 --- /dev/null +++ b/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptIncludedExample.java @@ -0,0 +1,9 @@ +package org.zkoss.ganttz.util.script; + +@ScriptsRequiredDeclaration +public class ScriptIncludedExample { + + public static final String base = "blabla/bla/base.js"; + public static final String other = "othare/other.js"; + +} diff --git a/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptsDeclarationsExample.java b/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptsDeclarationsExample.java new file mode 100644 index 000000000..db389463a --- /dev/null +++ b/ganttzk/src/test/java/org/zkoss/ganttz/util/script/ScriptsDeclarationsExample.java @@ -0,0 +1,16 @@ +package org.zkoss.ganttz.util.script; + +@ScriptsRequiredDeclaration(dependsOn = ScriptIncludedExample.class) +public class ScriptsDeclarationsExample { + + public static final String EXAMPLE_A = "/project-a/blabla/a.js"; + + public static final String EXAMPLE_B = "/project-a/blabla/b.js"; + + private static String EXAMPLE_NOT_INCLUDED = "/project-a/blablaadsf/a.js"; + + public static int NOT_INCLUDED_BECAUSE_IS_NOT_STRING = 4; + + private String NOT_INCLUDED_BECAUSE_IS_NOT_STATIC = "balbla/bladsfafa/ba.js"; + +}