diff --git a/framework/build.xml b/framework/build.xml
index 545fbe1fa6..037d86df92 100644
--- a/framework/build.xml
+++ b/framework/build.xml
@@ -361,6 +361,7 @@
+
diff --git a/framework/dependencies.yml b/framework/dependencies.yml
index 46191f5a04..a6edfdf018 100644
--- a/framework/dependencies.yml
+++ b/framework/dependencies.yml
@@ -41,7 +41,7 @@ require: &allDependencies
- mysql -> mysql-connector-java 5.1.20
- oauth.signpost -> signpost-core 1.2
- org.apache.geronimo.specs -> geronimo-servlet_2.5_spec 1.2
- - org.apache.ivy -> ivy 2.2.0
+ - org.apache.ivy -> ivy 2.3.0
- org.bouncycastle -> bcprov-jdk15 1.45
- org.codehaus.groovy -> groovy-all 1.8.6
- org.eclipse.jdt.core 3.7.1.v_B76_R37x
diff --git a/framework/lib/ivy-2.2.0.jar b/framework/lib/ivy-2.2.0.jar
deleted file mode 100644
index 7e73dab66d..0000000000
Binary files a/framework/lib/ivy-2.2.0.jar and /dev/null differ
diff --git a/framework/lib/ivy-2.3.0.jar b/framework/lib/ivy-2.3.0.jar
new file mode 100644
index 0000000000..543de46096
Binary files /dev/null and b/framework/lib/ivy-2.3.0.jar differ
diff --git a/framework/src/play/Play.java b/framework/src/play/Play.java
index cfc9ff2398..2ce3548843 100644
--- a/framework/src/play/Play.java
+++ b/framework/src/play/Play.java
@@ -736,11 +736,12 @@ public static void loadModules() {
if (moduleName.contains("-")) {
moduleName = moduleName.substring(0, moduleName.indexOf("-"));
}
-
- if (module.isDirectory()) {
+
+ if(module == null || !module.exists()){
+ Logger.error("Module %s will not be loaded because %s does not exist", moduleName, module.getAbsolutePath());
+ } else if (module.isDirectory()) {
addModule(moduleName, module);
} else {
-
File modulePath = new File(IO.readContentAsString(module).trim());
if (!modulePath.exists() || !modulePath.isDirectory()) {
Logger.error("Module %s will not be loaded because %s does not exist", moduleName, modulePath.getAbsolutePath());
diff --git a/framework/src/play/deps/YamlParser.java b/framework/src/play/deps/YamlParser.java
index fb3192e1cb..62b7bfc865 100644
--- a/framework/src/play/deps/YamlParser.java
+++ b/framework/src/play/deps/YamlParser.java
@@ -1,6 +1,8 @@
package play.deps;
import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
import java.io.FileInputStream;
@@ -12,10 +14,12 @@
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
+
import org.apache.ivy.core.module.descriptor.Configuration;
import org.apache.ivy.core.module.descriptor.DefaultDependencyDescriptor;
import org.apache.ivy.core.module.descriptor.DefaultExcludeRule;
import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
+import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
import org.apache.ivy.core.module.descriptor.ExcludeRule;
import org.apache.ivy.core.module.descriptor.MDArtifact;
import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
@@ -30,6 +34,7 @@
import org.apache.ivy.plugins.repository.Resource;
import org.yaml.snakeyaml.Yaml;
+
public class YamlParser extends AbstractModuleDescriptorParser {
static class Oops extends Exception {
@@ -42,15 +47,18 @@ public Oops(String message) {
public boolean accept(Resource rsrc) {
return rsrc.exists() && rsrc.getName().endsWith(".yml");
}
-
public ModuleDescriptor parseDescriptor(ParserSettings ps, URL url, Resource rsrc, boolean bln) throws ParseException, IOException {
+ return parseDescriptor( ps, url, rsrc.openStream(), rsrc.getLastModified(), bln);
+ }
+
+ public ModuleDescriptor parseDescriptor(ParserSettings ps, URL url, InputStream srcStream, long lastModified, boolean bln) throws ParseException, IOException {
try {
Yaml yaml = new Yaml();
Object o = null;
// Try to parse the yaml
try {
- o = yaml.load(rsrc.openStream());
+ o = yaml.load(srcStream);
} catch (Exception e) {
throw new Oops(e.toString().replace("\n", "\n~ \t"));
}
@@ -93,7 +101,7 @@ public ModuleDescriptorParser getParser() {
};
descriptor.addConfiguration(new Configuration("default"));
descriptor.addArtifact("default", new MDArtifact(descriptor, id.getName(), "jar", "zip"));
- descriptor.setLastModified(rsrc.getLastModified());
+ descriptor.setLastModified(lastModified);
boolean transitiveDependencies = get(data, "transitiveDependencies", boolean.class, true);
@@ -240,37 +248,59 @@ T get(Map data, String key, Class type, T defaultValue) {
return o;
}
- public static List getOrderedModuleList(File file) throws Oops {
- Yaml yaml = new Yaml();
- Object o = null;
-
- // Try to parse the yaml
- try {
- o = yaml.load(new FileInputStream(file));
- } catch (Exception e) {
- throw new Oops(e.toString().replace("\n", "\n~ \t"));
+ public static List getOrderedModuleList(File file) throws FileNotFoundException, ParseException, IOException {
+ List modules = new ArrayList();
+ if (file == null || !file.exists()) {
+ throw new FileNotFoundException("There was a problem to find the file");
}
+ System.setProperty("application.path", Play.applicationPath.getAbsolutePath());
- // We expect a Map here
- if (!(o instanceof Map)) {
- throw new Oops("Unexpected format -> " + o);
- }
+ YamlParser parser = new YamlParser();
- Map data = (Map) o;
- ModuleRevisionId id = null;
+ ModuleDescriptor md = parser.parseDescriptor(null, null, new FileInputStream(file), 0, true);
-
-
- if (data.containsKey("require")) {
- if (data.get("require") instanceof List) {
-
- List dependencies = (List) data.get("require");
- // filter out play
- dependencies.remove("play");
- System.out.println("loading modules " + dependencies);
- return dependencies;
+ DependencyDescriptor[] rules = md.getDependencies();
+ for (DependencyDescriptor dep : rules) {
+ ModuleRevisionId rev = dep.getDependencyRevisionId();
+ String moduleName = filterModuleName(rev);
+ if (moduleName != null) {
+ modules.add(moduleName);
}
}
- return new ArrayList();
+ return modules;
}
+
+
+ private static String filterModuleName(ModuleRevisionId rev) {
+ if (!"play".equals(rev.getName())) {
+ File moduleDir = new File(Play.applicationPath, "modules");
+ // create new filename filter to check if it is a module (lib will
+ // be skipped)
+ File[] filterFiles = moduleDir.listFiles(new ModuleFilter(rev));
+ if (filterFiles != null && filterFiles.length > 0) {
+ return filterFiles[0].getName();
+ }
+ }
+
+ return null;
+
+ }
+
+ private static class ModuleFilter implements FilenameFilter {
+
+ private ModuleRevisionId moduleRevision;
+
+ public ModuleFilter(ModuleRevisionId moduleRevision) {
+ this.moduleRevision = moduleRevision;
+ }
+ @Override
+ public boolean accept(File dir, String name) {
+ // Accept module with the same name or with a version number
+ if (name.equals(moduleRevision.getName())
+ || name.equals(moduleRevision.getName() + "-" + moduleRevision.getRevision())
+ || name.startsWith(moduleRevision.getName() + "-")) {
+ return true;
+ }
+ return false;
+
}
diff --git a/framework/test-src/play/PlayBuilder.java b/framework/test-src/play/PlayBuilder.java
index 8420b2e4e2..6a8e27884d 100644
--- a/framework/test-src/play/PlayBuilder.java
+++ b/framework/test-src/play/PlayBuilder.java
@@ -35,6 +35,7 @@ public PlayBuilder withConfiguration(Properties config){
@SuppressWarnings({"deprecation"})
public void build(){
+ Play.version = "localbuild";
Play.configuration = configuration;
Play.classes = new ApplicationClasses();
Play.javaPath = new ArrayList();
diff --git a/framework/test-src/play/deps/YamlParserTest.java b/framework/test-src/play/deps/YamlParserTest.java
new file mode 100644
index 0000000000..15d6ddf7ca
--- /dev/null
+++ b/framework/test-src/play/deps/YamlParserTest.java
@@ -0,0 +1,100 @@
+package play.deps;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.text.ParseException;
+import java.util.List;
+
+import org.apache.commons.io.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import play.Play;
+import play.PlayBuilder;
+
+public class YamlParserTest {
+
+ @BeforeClass
+ public static void setUp(){
+ // Play
+ new PlayBuilder().build();
+ System.setProperty("play.version", Play.version);
+
+ // We will create a "tmp/modules" directory to simulate the play dependencies
+ File moduleDir = new File(Play.applicationPath, "modules");
+ moduleDir.mkdirs();
+
+ String[] moduleNames = {"crud", "deadbolt-1.5.4", "pdf-1.5"};
+ try {
+ for (String module : moduleNames) {
+ File moduleFile = new File(moduleDir, module);
+ moduleFile.createNewFile();
+ }
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ @AfterClass
+ public static void cleanUp(){
+ File moduleDir = new File(Play.applicationPath, "modules");
+ try {
+ FileUtils.deleteDirectory(moduleDir);
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+
+ @Test(expected = FileNotFoundException.class)
+ public void fileNotFoundTest() throws Exception {
+ List modules = null;
+ try {
+ modules = YamlParser.getOrderedModuleList(new File(Play.applicationPath, "fakeFile.yml"));
+ } catch (Exception e) {
+ assertTrue(e.getMessage().startsWith("There was a problem to find the file"));
+ throw e;
+ }
+ }
+
+
+ @Test
+ public void retrieveModulesTest() {
+ List modules = null;
+ try {
+ modules = YamlParser.getOrderedModuleList(new File(getClass().getResource("/play/deps/dependencies_test1.yml").toURI()));
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ assertNotNull(modules);
+ assertEquals("crud", modules.get(0));
+ assertEquals("deadbolt-1.5.4", modules.get(1));
+ assertEquals("pdf-1.5", modules.get(2));
+ }
+
+ @Test
+ public void retrieveModulesTest2() {
+ List modules = null;
+ try {
+ modules = YamlParser.getOrderedModuleList(new File(getClass().getResource("/play/deps/dependencies_test2.yml").toURI()));
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ assertNotNull(modules);
+ assertEquals("pdf-1.5", modules.get(0));
+ assertEquals("deadbolt-1.5.4", modules.get(1));
+ assertEquals("crud", modules.get(2));
+ }
+
+
+}
diff --git a/framework/test-src/play/deps/dependencies_test1.yml b/framework/test-src/play/deps/dependencies_test1.yml
new file mode 100644
index 0000000000..3aa282d5c4
--- /dev/null
+++ b/framework/test-src/play/deps/dependencies_test1.yml
@@ -0,0 +1,12 @@
+# Application dependencies
+
+require:
+ - play
+ - crud
+ - play -> deadbolt 1.5.4
+ - play -> cobertura 2.4:
+ id: test
+ - play -> pdf [0.9,)
+ - commons-lang -> commons-lang 2.5
+ - commons-codec 1.7
+ - net.sf.json-lib -> json-lib 2.4 jdk15
diff --git a/framework/test-src/play/deps/dependencies_test2.yml b/framework/test-src/play/deps/dependencies_test2.yml
new file mode 100644
index 0000000000..e8f3121574
--- /dev/null
+++ b/framework/test-src/play/deps/dependencies_test2.yml
@@ -0,0 +1,12 @@
+# Application dependencies
+
+require:
+ - play
+ - play -> pdf [0.9,)
+ - play -> deadbolt 1.5.4
+ - play -> cobertura 2.4:
+ id: test
+ - commons-lang -> commons-lang 2.5
+ - commons-codec 1.7
+ - net.sf.json-lib -> json-lib 2.4 jdk15
+ - crud