bug 506579: Introduces Gradle build for api, core, test projects
diff --git a/.gitignore b/.gitignore
index 0206a6a..04a4208 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,4 +12,6 @@
 .project
 .springBeans
 .settings
+bin
+build
 
diff --git a/build.gradle b/build.gradle
index 0c926b5..9452db7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,12 +12,19 @@
 
 def timestamp = new Date().format('yyyyMMddHHmmss', TimeZone.getTimeZone('GMT'))
 
-defaultTasks 'clean', 'build', 'javadoc', 'sourcesJar', 'javadocJar'
+defaultTasks 'clean', 'build', 'snapsDist'
 
-ext.javaProjects = [
-    project(':org.eclipse.virgo.snaps'),
+ext.planProjects = [
+	project(':org.eclipse.virgo.snaps')
+]
+
+ext.bundleProjects = [    
     project(':org.eclipse.virgo.snaps.api'),
-    project(':org.eclipse.virgo.snaps.cor:org.eclipse.virgo.snaps.core')
+    project(':org.eclipse.virgo.snaps.core')
+]
+
+ext.testProjects = [    
+    project(':org.eclipse.virgo.snaps.test')
 ]
 
 allprojects {
@@ -34,7 +41,7 @@
     }
 }
 
-configure(javaProjects) {
+configure(bundleProjects + testProjects + planProjects) {
     apply plugin: 'java'
     apply plugin: 'jacoco'
     apply plugin: 'findbugs'
@@ -68,12 +75,30 @@
             }
         }
     }
+    repositories {
+		mavenCentral()
+		ivy {
+			url "http://build.eclipse.org/rt/virgo/ivy/bundles/release/"
+			layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
+		}        
+        maven{
+            url "http://build.eclipse.org/rt/virgo/gradle/bundles/"
+        }
+	}
     configurations {
     	ecj {}
 		testBundles {
 			transitive = false
 		}
 	}
+	// this is necessary because Gemini Web contains a dependency with wrong groupId/version combination 
+	configurations.all {
+		resolutionStrategy {
+			dependencySubstitution {
+				substitute module('javax.servlet:javax.servlet:3.0.0.v201103241009') with module('org.eclipse.virgo.mirrored:javax.servlet:3.0.0.v201103241009')  
+			}
+		}
+	}
     jar {
     	// add SUA to archive
         from "$rootDir/build-bundlor/resources/about/notice.html"
@@ -121,7 +146,7 @@
 	}    	
 }
 
-configure(javaProjects) {
+configure(bundleProjects) {
     apply plugin: 'org.eclipse.virgo.bundlor'
 	
 	task('addProjectVersionToGradlePropertiesTask', type: Copy) {
@@ -165,7 +190,7 @@
     }
 }
 
-configure(javaProjects) {
+configure(bundleProjects + testProjects + planProjects) {
     apply plugin: 'eclipse'
 
     eclipse {
@@ -187,9 +212,41 @@
     }
 }
 
+configure(bundleProjects) {
+	apply plugin: 'maven-publish'
+    publishing {
+    	repositories {
+        	maven {
+                name = "BuildEclipseOrg"
+                url "/opt/public/rt/virgo/gradle/bundles"
+            }
+        }
+        publications {
+            snaps(MavenPublication) {
+                groupId 'org.eclipse.virgo.snaps'
+                from components.java
+            }
+        }
+    }
+}
+
+task snapsDist(type: Zip) {
+    description 'Build Snaps distribution Zip file'
+    group = 'distribution'
+    
+	archiveName "snaps-${version}.zip"
+    duplicatesStrategy 'exclude'
+    into("snaps-${version}/dist") {
+        from 'org.eclipse.virgo.snaps/src/main/resources/'
+        from bundleProjects.jar
+    }
+    into("snaps-${version}") {
+    	from "build-snaps/resources"        
+    }
+}
+
 task wrapper(type: Wrapper) {
     description 'Creates a local Gradle Wrapper'
     group = 'Build Setup'
     gradleVersion = '3.1'
 }
-
diff --git a/gradle.properties b/gradle.properties
index b1762cf..1b94dac 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -7,7 +7,19 @@
 
 # Versions of runtime dependencies
 
+# current 3.7.0.M04 Virgo build includes servlet spec 3.1, although Gemini Web 2.2.7 does not support it
+#javaxServletVersion = 3.1.0.v201410161800
+# therefore we are using the same servlet spec version as Gemini Web 2.2.7 until we can upgrade to Gemini Web 3.0.0
+javaxServletVersion = 3.0.0.v201103241009
+
+javaxServletJspVersion = 2.2.0.v201112011158
+eclipseOsgiVersion = 3.8.1.v20120830-144521
+eclipseGeminiWebVersion = 2.2.7.RELEASE
+eclipseVirgoVersion = 3.7.0.D-20161102123413
+slf4jVersion = 1.7.13
+apacheCatalina = 7.0.61
 
 # Versions of test dependencies
-
-
+junitVersion = 4.7
+easymockVersion = 2.3
+springframeworkVersion = 4.2.4.RELEASE
diff --git a/org.eclipse.virgo.snaps.api/build.gradle b/org.eclipse.virgo.snaps.api/build.gradle
new file mode 100644
index 0000000..a723352
--- /dev/null
+++ b/org.eclipse.virgo.snaps.api/build.gradle
@@ -0,0 +1,15 @@
+description = 'Virgo Snaps API Bundle'
+
+dependencies {
+    ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: "${ecjVersion}"
+    
+	compile group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "compile"
+	compile group: "org.eclipse.virgo.mirrored", name: "javax.servlet.jsp", version: javaxServletJspVersion, configuration: "compile"
+	compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: eclipseOsgiVersion, configuration: "compile"	
+	compile group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.core", version: eclipseGeminiWebVersion, configuration: "compile"
+
+	testCompile "junit:junit:${junitVersion}"
+	testCompile "org.easymock:easymock:${easymockVersion}"
+	testCompile "org.springframework:spring-core:${springframeworkVersion}"
+	testCompile "org.springframework:spring-test:${springframeworkVersion}"
+}
diff --git a/org.eclipse.virgo.snaps.api/src/test/resources/.gitignore b/org.eclipse.virgo.snaps.api/src/test/resources/.gitkeep
similarity index 100%
rename from org.eclipse.virgo.snaps.api/src/test/resources/.gitignore
rename to org.eclipse.virgo.snaps.api/src/test/resources/.gitkeep
diff --git a/org.eclipse.virgo.snaps.api/template.mf b/org.eclipse.virgo.snaps.api/template.mf
index 2f830c2..e4a0815 100644
--- a/org.eclipse.virgo.snaps.api/template.mf
+++ b/org.eclipse.virgo.snaps.api/template.mf
@@ -4,7 +4,7 @@
 Bundle-Version: ${version}
 Bundle-Name: Snaps API
 Import-Template: 
- org.eclipse.gemini.web.*;version="${org.eclipse.gemini.web:[=.=.=, +1)}",
- javax.servlet.jsp*;version="${javax.servlet.jsp:[=.=.=, +1)}",
- javax.servlet.*;version="${javax.servlet:[-1.6.=, +1)}",
+ org.eclipse.gemini.web.*;version="${eclipseGeminiWebVersion:[=.=.=, +1)}",
+ javax.servlet.jsp*;version="${javaxServletJspVersion:[=.=.=, +1)}",
+ javax.servlet.*;version="${javaxServletVersion:[-1.6.=, +1)}",
  org.osgi.framework;version="0"
diff --git a/org.eclipse.virgo.snaps.core/build.gradle b/org.eclipse.virgo.snaps.core/build.gradle
new file mode 100644
index 0000000..0fc2e04
--- /dev/null
+++ b/org.eclipse.virgo.snaps.core/build.gradle
@@ -0,0 +1,30 @@
+description = 'Virgo Snaps Core Bundle'
+
+dependencies {
+	ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: "${ecjVersion}"
+    
+	compile "org.slf4j:slf4j-api:${slf4jVersion}"
+	
+	compile group: "org.eclipse.virgo.mirrored", name: "javax.servlet", version: javaxServletVersion, configuration: "compile"
+	compile group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: eclipseOsgiVersion, configuration: "compile"
+	
+	compile group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.core", version: eclipseGeminiWebVersion, configuration: "compile"
+	compile group: "org.eclipse.gemini", name: "org.eclipse.gemini.web.tomcat", version: eclipseGeminiWebVersion, configuration: "compile"
+
+	compile "org.eclipse.virgo:org.eclipse.virgo.util.common:${eclipseVirgoVersion}"
+	compile "org.eclipse.virgo:org.eclipse.virgo.util.io:${eclipseVirgoVersion}"
+	compile "org.eclipse.virgo:org.eclipse.virgo.util.osgi:${eclipseVirgoVersion}"
+	compile "org.eclipse.virgo:org.eclipse.virgo.util.osgi.manifest:${eclipseVirgoVersion}"
+	compile "org.eclipse.virgo:org.eclipse.virgo.medic:${eclipseVirgoVersion}"
+	compile "org.eclipse.virgo:org.eclipse.virgo.nano.core:${eclipseVirgoVersion}"
+	compile "org.eclipse.virgo:org.eclipse.virgo.nano.deployer.api:${eclipseVirgoVersion}"
+	compile "org.eclipse.virgo:org.eclipse.virgo.kernel.artifact:${eclipseVirgoVersion}"
+	compile "org.eclipse.virgo:org.eclipse.virgo.kernel.deployer:${eclipseVirgoVersion}"
+
+	testCompile "org.eclipse.virgo:org.eclipse.virgo.test.stubs:${eclipseVirgoVersion}"
+	testCompile "org.eclipse.virgo:org.eclipse.virgo.medic.test:${eclipseVirgoVersion}"
+	
+	testCompile "junit:junit:${junitVersion}"
+	testCompile "org.easymock:easymock:${easymockVersion}"
+	testCompile "org.springframework:spring-test:${springframeworkVersion}"	
+}
diff --git a/org.eclipse.virgo.snaps.core/src/main/java/org/eclipse/virgo/snaps/core/internal/webapp/container/SnapHttpSession.java b/org.eclipse.virgo.snaps.core/src/main/java/org/eclipse/virgo/snaps/core/internal/webapp/container/SnapHttpSession.java
index 83d5544..fde835d 100644
--- a/org.eclipse.virgo.snaps.core/src/main/java/org/eclipse/virgo/snaps/core/internal/webapp/container/SnapHttpSession.java
+++ b/org.eclipse.virgo.snaps.core/src/main/java/org/eclipse/virgo/snaps/core/internal/webapp/container/SnapHttpSession.java
@@ -19,7 +19,7 @@
 
 import org.eclipse.virgo.snaps.core.internal.webapp.SnapServletContext;
 
-
+@SuppressWarnings("deprecation")
 public final class SnapHttpSession extends HttpSessionWrapper {
 
     private static final String QUALIFIED_NAME_MARKER = "##";
@@ -55,11 +55,10 @@
         super.setAttribute(qualifyName(name), value);
     }
 
-    @SuppressWarnings("deprecation")
-	@Override
-	public HttpSessionContext getSessionContext() {
-		throw new RuntimeException(new OperationNotSupportedException("getSessionContext is deprecated"));
-	}
+    @Override
+    public HttpSessionContext getSessionContext() {
+        throw new RuntimeException(new OperationNotSupportedException("getSessionContext is deprecated"));
+    }
 
     private String qualifyName(String baseName) {
         return QUALIFIED_NAME_MARKER + this.snapServletContext.getSnapContextPath() + "." + baseName;
diff --git a/org.eclipse.virgo.snaps.core/template.mf b/org.eclipse.virgo.snaps.core/template.mf
index 9047432..7ae4596 100644
--- a/org.eclipse.virgo.snaps.core/template.mf
+++ b/org.eclipse.virgo.snaps.core/template.mf
@@ -4,16 +4,16 @@
 Bundle-Version: ${version}
 Bundle-Name: Snaps Core
 Import-Template: 
- org.eclipse.virgo.kernel.*;version="${org.eclipse.virgo.kernel:[=.=.=, +1)}",
- org.eclipse.virgo.nano.*;version="${org.eclipse.virgo.nano:[=.=.=, +1)}",
- org.eclipse.virgo.util.*;version="${org.eclipse.virgo.util:[=.=.=, +1)}",
- org.eclipse.gemini.web.*;version="${org.eclipse.gemini.web:[=.=.=, +1)}",
- org.eclipse.virgo.medic.*;version="${org.eclipse.virgo.medic:[=.=.=, +1)}",
- javax.servlet.jsp*;version="${javax.servlet.jsp:[=.=.=, +1)}",
- javax.servlet.*;version="${javax.servlet:[-1.6.=, +1)}",
+ org.eclipse.virgo.kernel.*;version="${eclipseVirgoVersion:[=.=.=, +1)}",
+ org.eclipse.virgo.nano.*;version="${eclipseVirgoVersion:[=.=.=, +1)}",
+ org.eclipse.virgo.util.*;version="${eclipseVirgoVersion:[=.=.=, +1)}",
+ org.eclipse.virgo.medic.*;version="${eclipseVirgoVersion:[=.=.=, +1)}",
+ org.eclipse.gemini.web.*;version="${eclipseGeminiWebVersion:[=.=.=, +1)}",
+ javax.servlet.jsp*;version="${javaxServletJspVersion:[=.=.=, +1)}",
+ javax.servlet.*;version="${javaxServletVersion:[-1.6.=, +1)}",
  javax.naming.*;version="0",
- org.apache.catalina.*;version="${org.apache.catalina:[=.=.=,+1)}",
- org.slf4j.*;version="${org.slf4j.api:[=.=.=,=.+1.=)]}",
+ org.apache.catalina.*;version="${apacheCatalina:[=.=.=,+1)}",
+ org.slf4j.*;version="${slf4jVersion:[=.=.=,=.+1.=)]}",
  javax.xml.parsers.*;version="0",
  org.osgi.*;version="0",
  org.w3c.dom.*;version="0",
diff --git a/org.eclipse.virgo.snaps.test/build.gradle b/org.eclipse.virgo.snaps.test/build.gradle
new file mode 100644
index 0000000..2963ce6
--- /dev/null
+++ b/org.eclipse.virgo.snaps.test/build.gradle
@@ -0,0 +1,14 @@
+description = 'Virgo Snaps Test Bundle'
+
+dependencies {
+	ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: "${ecjVersion}"
+    
+    testCompile project(":org.eclipse.virgo.snaps.api")
+    testCompile project(":org.eclipse.virgo.snaps.core")
+    
+	testCompile "org.eclipse.virgo:org.eclipse.virgo.util.osgi.manifest:${eclipseVirgoVersion}"
+	testCompile "org.eclipse.virgo:org.eclipse.virgo.util.osgi:${eclipseVirgoVersion}"
+	
+	testCompile "junit:junit:${junitVersion}"
+	testCompile "org.eclipse.virgo:org.eclipse.virgo.test.framework:${eclipseVirgoVersion}"	
+}
diff --git a/org.eclipse.virgo.snaps.test/src/main/java/.gitignore b/org.eclipse.virgo.snaps.test/src/main/java/.gitkeep
similarity index 100%
rename from org.eclipse.virgo.snaps.test/src/main/java/.gitignore
rename to org.eclipse.virgo.snaps.test/src/main/java/.gitkeep
diff --git a/org.eclipse.virgo.snaps.test/src/main/java/.gitignore b/org.eclipse.virgo.snaps.test/src/main/java/org/eclipse/virgo/snaps/test/.gitkeep
similarity index 100%
copy from org.eclipse.virgo.snaps.test/src/main/java/.gitignore
copy to org.eclipse.virgo.snaps.test/src/main/java/org/eclipse/virgo/snaps/test/.gitkeep
diff --git a/org.eclipse.virgo.snaps/build.gradle b/org.eclipse.virgo.snaps/build.gradle
new file mode 100644
index 0000000..9ff3e21
--- /dev/null
+++ b/org.eclipse.virgo.snaps/build.gradle
@@ -0,0 +1 @@
+description = 'Virgo Snaps Plan deployment unit'
diff --git a/org.eclipse.virgo.snaps.api/src/test/resources/.gitignore b/org.eclipse.virgo.snaps/src/main/java/org/eclipse/virgo/snaps/.gitkeep
similarity index 100%
copy from org.eclipse.virgo.snaps.api/src/test/resources/.gitignore
copy to org.eclipse.virgo.snaps/src/main/java/org/eclipse/virgo/snaps/.gitkeep
diff --git a/org.eclipse.virgo.snaps/src/main/resources/org.eclipse.virgo.snaps.plan b/org.eclipse.virgo.snaps/src/main/resources/org.eclipse.virgo.snaps.plan
new file mode 100644
index 0000000..8f1bd76
--- /dev/null
+++ b/org.eclipse.virgo.snaps/src/main/resources/org.eclipse.virgo.snaps.plan
@@ -0,0 +1,9 @@
+<plan name="org.eclipse.virgo.snaps" version="3.7.0" scoped="false" atomic="true"
+                xmlns="http://www.eclipse.org/virgo/schema/plan"
+				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+				xsi:schemaLocation="http://www.eclipse.org/virgo/schema/plan 
+				        http://www.eclipse.org/virgo/schema/plan/eclipse-virgo-plan.xsd">
+
+        <artifact type="bundle" name="org.eclipse.virgo.snaps.api" version="[3, 4)"/>
+        <artifact type="bundle" name="org.eclipse.virgo.snaps.core" version="[3, 4)"/>
+</plan>
diff --git a/org.eclipse.virgo.snaps/src/org.eclipse.virgo.snaps.plan b/org.eclipse.virgo.snaps/src/org.eclipse.virgo.snaps.plan
deleted file mode 100644
index 8b39d79..0000000
--- a/org.eclipse.virgo.snaps/src/org.eclipse.virgo.snaps.plan
+++ /dev/null
@@ -1,10 +0,0 @@
-<plan name="org.eclipse.virgo.snaps" version="3.0.0" scoped="false" atomic="true"
-                xmlns="http://www.springsource.org/schema/dm-server/plan"
-                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-                xsi:schemaLocation="
-                        http://www.springsource.org/schema/dm-server/plan 
-                        http://www.springsource.org/schema/dm-server/plan/springsource-dm-server-plan.xsd">
-
-        <artifact type="bundle" name="org.eclipse.virgo.snaps.api" version="[3, 4)"/>
-        <artifact type="bundle" name="org.eclipse.virgo.snaps.core" version="[3, 4)"/>
-</plan>
diff --git a/settings.gradle b/settings.gradle
index ec44f68..e84344f 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -2,4 +2,4 @@
 include ':org.eclipse.virgo.snaps'
 include ':org.eclipse.virgo.snaps.api'
 include ':org.eclipse.virgo.snaps.core'
-
+include ':org.eclipse.virgo.snaps.test'