Merge pull request #79 from kelemen/FREEMARKER-204-gradle-build
FREEMARKER-204 Change build from Ant to Gradle
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index a40850e..9376121 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -29,46 +29,35 @@
jobs:
build:
- runs-on: ubuntu-latest
-
+ strategy:
+ matrix:
+ os: [windows-latest, ubuntu-latest]
+ runs-on: ${{ matrix.os }}
+ concurrency: main_tests_${{ github.ref }}
steps:
- - name: Checkout
- uses: actions/checkout@v4
-
+ - name: Welcome Message
+ run: 'echo "Started with parameters: ${{ matrix.os }} because ${{ github.event_name }} on ${{ github.ref }}"'
+ - uses: actions/checkout@v4
- name: Set up JDK 8
uses: actions/setup-java@v3
with:
java-version: 8
distribution: temurin
-
- name: Set up JDK 16
uses: actions/setup-java@v3
with:
java-version: 16
distribution: zulu
+ - name: Validate Gradle wrapper
+ uses: gradle/wrapper-validation-action@v1.1.0
+ - name: Run Build
+ id: build_step
+ run: './gradlew "-Pfreemarker.signMethod=none" --continue clean build'
+ - name: Upload Failed Report
+ uses: actions/upload-artifact@v2.3.1
+ if: failure() && steps.build_step.outcome == 'failure'
+ with:
+ name: test-reports-${{ matrix.os }}
+ path: build/reports/**
+ retention-days: 30
- - name: Prepare build.properties
- shell: bash
- run: >-
- echo "boot.classpath.j2se1.8=${JAVA_HOME_8_X64}/jre/lib/rt.jar" >> build.properties;
- echo "mvnCommand=$(which mvn)" >> build.properties;
- echo "gpgCommand=$(which gpg)" >> build.properties;
-
- - name: Create a gpg key for signing
- shell: bash
- run: >-
- gpg --quick-gen-key --batch --passphrase '' github-build@apache.invalid;
- echo "batch" >> "/home/runner/.gnupg/gpg.conf";
- echo "pinentry-mode=loopback" >> "/home/runner/.gnupg/gpg.conf";
-
- - name: Prepare ant with ivy
- shell: bash
- run: ant download-ivy
-
- - name: Build with Ant and ivy
- shell: bash
- run: ant ci -Dci=true
-
- - name: RAT check
- shell: bash
- run: ant rat
diff --git a/.gitignore b/.gitignore
index 2ab1d7d..599e1a8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,6 +18,7 @@
/.ivy/
/.bin/
/build/
+/*/build/
/build.properties
/archive/
/ide-dependencies/
diff --git a/README.md b/README.md
index 8cfa8c8..4bdd6be 100644
--- a/README.md
+++ b/README.md
@@ -106,38 +106,22 @@
the source code repository. See repository locations here:
https://freemarker.apache.org/sourcecode.html
-You need JDK 16, Apache Ant (tested with 1.10.6) and Ivy (integrated into
-with 2.5.0) to be installed. To install Ivy (but be sure it's not already
-installed), issue `ant download-ivy`; it will copy Ivy under `~/.ant/lib`.
-(Alternatively, you can copy `ivy-<version>.jar` into the Ant home `lib`
-subfolder manually.)
+You need JDK 8 and JDK 16 to be installed
+(and [visible to Gradle](https://docs.gradle.org/current/userguide/toolchains.html)).
-It's recommended to copy `build.properties.sample` into `build.properties`,
-and edit its content to fit your system. (Although basic jar building should
-succeed without the build.properties file too.)
+To build `freemarker.jar`, just issue `./gradlew jar` in the project root directory, and
+it should download all dependencies automatically and build `freemarker.jar`.
-To build `freemarker.jar`, just issue `ant` in the project root directory, and
-it should download all dependencies automatically and build `freemarker.jar`.
-(Depencies will be cached into the `.ivy/cache` subdirectory of the project.)
+To run all checks, issue `./gradlew check`.
-To test your build, issue `ant test`.
+To generate documentation, issue `./gradlew javadoc` and `./gradlew manualOffline`.
-To generate documentation, issue `ant javadoc` and `ant manualOffline`.
-
+To see how the project would be deployed to Maven Central, issue `./gradlew publishAllPublicationsToLocalRepository`,
+and check the `build/local-deployment` directory.
IDE setup
---------
-### First steps for all IDE-s
-
-Do these first, regardless of which IDE you are using:
-
-- Install Ant and Ivy, if you haven't yet; see earlier.
-
-- From the command line, run `ant clean jar ide-dependencies`
- (Note that now the folders `ide-dependencies`, `build/generated-sources` and
- `META-INF` were created.)
-
### Eclipse
Below you find the step-by-step setup for Eclipse (originally done on Mars.1):
@@ -174,24 +158,7 @@
"Missing tag descriptions": Validate @return tags
"Missing Javadoc tags": Ignore
"Missing Javadoc comments": Ignore
-- Create new "Java Project" in Eclipse:
- - In the first window popping up:
- - Change the "location" to the directory of the FreeMarker project
- - Press "Next"
- - In the next window, you see the build path settings:
- - On "Source" tab, ensure that exactly these are marked as source
- directories (be careful, Eclipse doesn't auto-detect these well):
- build/generated-sources/java
- src/main/java,
- src/main/resources,
- src/test/java,
- src/test/resources
- - On the "Libraries" tab:
- - Delete everyhing from there, except the "JRE System Library [...]"
- - Edit "JRE System Library [...]" to "Execution Environment" "JavaSE 16"
- - Add all jar-s that are directly under the "ide-dependencies" directory
- (use the "Add JARs..." and select all those files).
- - Press "Finish"
+- Import the project as any other Gradle project.
- Eclipse will indicate many errors at this point; it's expected, read on.
- Project -> Properties -> Java Compiler
- In Errors/Warnings, check in "Enable project specific settings", then set
@@ -226,61 +193,15 @@
### IntelliJ IDEA
-Originally done on IntelliJ IDEA Community 2018.2.4:
+Originally done on IntelliJ IDEA Community 2023.3.2:
-- "New" -> "Project". In order as the IntelliJ will prompt you:
+- "File" -> "Open": Select the "settings.gradle.kts" within the freemarker root directory.
+- If the project fails to load (or build), then adjust the following configuration
+ in "File" -> "Settings" -> "Build, Execution, Deployment" -> "Build Tools" -> "Gradle":
+ - Gradle JVM: JDK 8+
+ - Build and run using: "Gradle"
+ - Run tests using: "Gradle"
- - Select "Java" on the left side, and "16" for SDK on the right side. Press "Next".
-
- - Template selection: Don't chose anything, "Next"
-
- - Project name: "FreeMarker-2.3-gae".
- Project location: Wherever you have checked out the 2.3-gae branch from Git.
- Press "Finish"
-
-- Open your newly created "FreeMarker-2.3-gae" project
-
-- "File" -> "Project Structure..."
-
- - Select "Modules" (on the left) / "Sources" (tab on the right). Now you see a Content Root
- that was automatically added (at the rightmost side, under the "Add Content Root" button).
- Remove it (click the "X" next to it); no Content Root should remain.
- Now "Add Content Root", and select the FreeMarker project folder. IntelliJ will now add the new
- Content Root, and automatically add some "Source Folders" and maybe some more under it, but it
- won't be correct, so edit it until your newly added Source Root has this content:
-
- - Source Folders:
- src/main/java,
- build/generated-sources/java [generated]
-
- - Test Source folders:
- src/test/java
-
- - Resource Folders:
- src/main/resources
-
- - Test Resource Folders:
- src/test/resources
-
- - Still inside the "Sources" tab, change the "Language level" to "8". (Yes, we use Java 16 SDK with
- language level 8 in the IDE, due to the tricks FreeMarker uses to support different Java versions.)
- Then, in "File" -> "Settings" -> "Editor" -> "Inspections", uncheck "Uses of API which isn't available at the
- configured language level".
-
- - Switch over to the "Dependencies" tab (still inside "Project Structure" / "Modules"), and add
- all the jar-s inside the `ide-dependencies` directory as dependency. (How: Click the "+" icon
- at the right edge, select "JARs or directory", navigate to `ide-dependencies` directory, expand
- it, then range-select all the jars in it. Thus, you add all of them at once.)
-
-- "File" -> "Settings" -> "Build, Execution, Deployment" -> "Compiler" -> "Excludes":
- Add source files that match these (you simply find them manually, and add their absolute path):
- _Jython20*.java,
- _Jython22*.java,
- _FreeMarkerPageContext2.java,
- FreeMarkerJspFactory2.java,
-
-- You may do "Build" / "Build project" (Ctrl+F9) to see if everything compiles now.
-
- "File" -> "Settings"
- Under "Editor" / "Code style", import and use
freemarker/src/ide-settings/IntelliJ-IDEA/Java-code-style-FreeMarker.xml
diff --git a/build.gradle.kts b/build.gradle.kts
new file mode 100644
index 0000000..35e32bf
--- /dev/null
+++ b/build.gradle.kts
@@ -0,0 +1,596 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.Files
+import java.util.stream.Collectors
+
+plugins {
+ `freemarker-root`
+ `maven-publish`
+ signing
+ id("biz.aQute.bnd.builder") version "6.1.0"
+ id("eclipse")
+}
+
+group = "org.freemarker"
+
+val fmExt = freemarkerRoot
+
+tasks.withType<JavaCompile>().configureEach {
+ options.encoding = "UTF-8"
+}
+
+freemarkerRoot {
+ configureSourceSet(SourceSet.MAIN_SOURCE_SET_NAME) { enableTests() }
+ configureSourceSet("jsp20")
+ configureSourceSet("jsp21") { enableTests() }
+ configureSourceSet("jython20")
+ configureSourceSet("jython22")
+ configureSourceSet("jython25") { enableTests() }
+ configureSourceSet("core16", "16")
+}
+
+val compileJavacc = tasks.register<freemarker.build.CompileJavaccTask>("compileJavacc") {
+ sourceDirectory.set(file("freemarker-core/src/main/javacc"))
+ destinationDirectory.set(project.layout.buildDirectory.map { it.dir("generated").dir("javacc") })
+ javaccVersion.set("7.0.12")
+
+ fileNameOverrides.addAll(
+ "ParseException.java",
+ "TokenMgrError.java"
+ )
+
+ val basePath = "freemarker/core"
+
+ replacePattern(
+ "${basePath}/FMParser.java",
+ "enum",
+ "ENUM"
+ )
+ replacePattern(
+ "${basePath}/FMParserConstants.java",
+ "public interface FMParserConstants",
+ "interface FMParserConstants"
+ )
+ replacePattern(
+ "${basePath}/Token.java",
+ "public class Token",
+ "class Token"
+ )
+ // FIXME: This does nothing at the moment.
+ replacePattern(
+ "${basePath}/SimpleCharStream.java",
+ "public final class SimpleCharStream",
+ "final class SimpleCharStream"
+ )
+}
+sourceSets.main.get().java.srcDir(compileJavacc)
+
+tasks.sourcesJar.configure {
+ from(compileJavacc.flatMap { it.sourceDirectory })
+
+ from(files("LICENSE", "NOTICE")) {
+ into("META-INF")
+ }
+}
+
+tasks.javadocJar.configure {
+ from(files("src/dist/javadoc"))
+ from(files("NOTICE")) {
+ into("META-INF")
+ }
+}
+
+tasks.jar.configure {
+ from(files("src/dist/jar"))
+}
+
+configurations {
+ register("combinedClasspath") {
+ extendsFrom(named("jython25CompileClasspath").get())
+ extendsFrom(named("jsp21CompileClasspath").get())
+ }
+}
+
+// This source set is only needed, because the OSGI plugin supports only a single sourceSet.
+// We are deleting it, because otherwise it would fool IDEs that a source root has multiple owners.
+val otherSourceSetsRef = fmExt
+ .allConfiguredSourceSetNames
+ .map { names -> names.map { name -> sourceSets.named(name).get() } }
+val osgiSourceSet = sourceSets
+ .create("osgi") {
+ val otherSourceSets = otherSourceSetsRef.get()
+ java.setSrcDirs(otherSourceSets.flatMap { s -> s.java.srcDirs })
+ resources.setSrcDirs(otherSourceSets.flatMap { s -> s.resources.srcDirs })
+ }
+ .apply {
+ val osgiClasspath = configurations.named("combinedClasspath").get()
+ compileClasspath = osgiClasspath
+ runtimeClasspath = osgiClasspath
+ }
+ .also {
+ sourceSets.remove(it)
+ tasks.named(it.classesTaskName).configure {
+ description = "Do not run this task! This task exists only as a work around for the OSGI plugin."
+ enabled = false
+ }
+ }
+
+tasks.named<Jar>(JavaPlugin.JAR_TASK_NAME) {
+ configure<aQute.bnd.gradle.BundleTaskExtension> {
+ bndfile.set(file("osgi.bnd"))
+
+ setSourceSet(osgiSourceSet)
+ val otherSourceSets = otherSourceSetsRef
+ .get()
+ .flatMap { sourceSet -> sourceSet.output.files }
+ .toSet()
+
+ classpath(osgiSourceSet.compileClasspath.filter { file -> file !in otherSourceSets })
+ properties.putAll(fmExt.versionDef.versionProperties)
+ properties.put("moduleOrg", project.group.toString())
+ properties.put("moduleName", project.name)
+ }
+}
+
+tasks.named<Javadoc>(JavaPlugin.JAVADOC_TASK_NAME) {
+ val coreExcludes = setOf(
+ "LocalContext.java",
+ "CollectionAndSequence.java",
+ "Comment.java",
+ "DebugBreak.java",
+ "Expression.java",
+ "LibraryLoad.java",
+ "Macro.java",
+ "ReturnInstruction.java",
+ "StringArraySequence.java",
+ "TemplateElement.java",
+ "TemplateObject.java",
+ "TextBlock.java",
+ "ReturnInstruction.java",
+ "TokenMgrError.java"
+ )
+
+ val logExcludes = setOf(
+ "SLF4JLoggerFactory.java",
+ "CommonsLoggingLoggerFactory.java"
+ )
+
+ val compileJavaccDestDir = compileJavacc.get().destinationDirectory.get().asFile
+ setSource(source.filter { f ->
+ val fileName = f.name
+ val parentDirName = f.parentFile?.name
+ !(f.startsWith(compileJavaccDestDir) ||
+ fileName.startsWith("_") && fileName.endsWith(".java") ||
+ fileName == "SunInternalXalanXPathSupport.java" ||
+ parentDirName == "core" && coreExcludes.contains(fileName) ||
+ parentDirName == "template" && fileName == "EmptyMap.java" ||
+ parentDirName == "log" && logExcludes.contains(fileName)
+ )
+ })
+
+ javadocTool.set(javaToolchains.javadocToolFor {
+ languageVersion.set(JavaLanguageVersion.of(fmExt.javadocJavaVersion))
+ })
+
+ (options as StandardJavadocDocletOptions).apply {
+ val displayVersion = fmExt.versionDef.displayVersion
+ val javadocEncoding = StandardCharsets.UTF_8
+
+ locale = "en_US"
+ encoding = javadocEncoding.name()
+ windowTitle = "FreeMarker ${displayVersion} API"
+
+ links("https://docs.oracle.com/en/java/javase/16/docs/api/")
+
+ author(true)
+ version(true)
+ docEncoding = javadocEncoding.name()
+ charSet = javadocEncoding.name()
+ docTitle = "FreeMarker ${displayVersion}"
+
+ // There are too many to check
+ addStringOption("Xdoclint:-missing", "-quiet")
+ }
+
+ classpath = files(configurations.named("combinedClasspath"))
+}
+
+fun registerManualTask(taskName: String, localeValue: String, offlineValue: Boolean) {
+ val manualTaskRef = tasks.register<freemarker.build.ManualBuildTask>(taskName) {
+ inputDirectory.set(file("freemarker-manual/src/main/docgen/${localeValue}"))
+
+ offline.set(offlineValue)
+ locale.set(localeValue)
+ }
+ tasks.named(LifecycleBasePlugin.BUILD_TASK_NAME) { dependsOn(manualTaskRef) }
+}
+
+registerManualTask("manualOffline", "en_US", true)
+registerManualTask("manualOnline", "en_US", false)
+
+publishing {
+ repositories {
+ maven {
+ val snapshot = fmExt.versionDef.version.endsWith("-SNAPSHOT")
+ val defaultDeployUrl = if (snapshot) "https://repository.apache.org/content/repositories/snapshots" else "https://repository.apache.org/service/local/staging/deploy/maven2"
+ setUrl(providers.gradleProperty("freemarkerDeployUrl").getOrElse(defaultDeployUrl))
+ name = providers.gradleProperty("freemarkerDeployServerId").getOrElse("apache.releases.https")
+
+ val apacheUser = providers.gradleProperty("freemarker.deploy.apache.user")
+ .getOrElse("")
+
+ if (apacheUser.isNotEmpty()) {
+ credentials {
+ username = apacheUser
+ password = providers.gradleProperty("freemarker.deploy.apache.password")
+ .getOrElse("")
+ }
+ }
+ }
+ maven {
+ name = "local"
+ setUrl(layout.buildDirectory.map { it.dir("local-deployment") })
+ }
+ }
+
+ publications {
+ val mainPublication = create<MavenPublication>("main") {
+ from(components.getByName("java"))
+ pom {
+ withXml {
+ val headerComment = asElement().ownerDocument.createComment("""
+
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements. See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership. The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied. See the License for the
+ specific language governing permissions and limitations
+ under the License.
+
+ """.trimIndent().prependIndent(" ")
+ )
+ asElement().insertBefore(headerComment, asElement().firstChild)
+ }
+
+ packaging = "jar"
+ name.set("Apache FreeMarker")
+ description.set("""
+
+ Google App Engine compliant variation of FreeMarker.
+ FreeMarker is a "template engine"; a generic tool to generate text output based on templates.
+ """.trimIndent().prependIndent(" ") + "\n "
+ )
+ url.set("https://freemarker.apache.org/")
+
+ organization {
+ name.set("Apache Software Foundation")
+ url.set("http://apache.org")
+ }
+
+ licenses {
+ license {
+ name.set("Apache License, Version 2.0")
+ url.set("http://www.apache.org/licenses/LICENSE-2.0.txt")
+ distribution.set("repo")
+ }
+ }
+
+ scm {
+ connection.set("scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git")
+ developerConnection.set("scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git")
+ url.set("https://git-wip-us.apache.org/repos/asf?p=freemarker.git")
+ tag.set("v${fmExt.versionDef.version}")
+ }
+
+ issueManagement {
+ system.set("jira")
+ url.set("https://issues.apache.org/jira/browse/FREEMARKER/")
+ }
+
+ mailingLists {
+ mailingList {
+ name.set("FreeMarker developer list")
+ post.set("dev@freemarker.apache.org")
+ subscribe.set("dev-subscribe@freemarker.apache.org")
+ unsubscribe.set("dev-unsubscribe@freemarker.apache.org")
+ archive.set("http://mail-archives.apache.org/mod_mbox/freemarker-dev/")
+ }
+ mailingList {
+ name.set("FreeMarker commit and Jira notifications list")
+ post.set("notifications@freemarker.apache.org")
+ subscribe.set("notifications-subscribe@freemarker.apache.org")
+ unsubscribe.set("notifications-unsubscribe@freemarker.apache.org")
+ archive.set("http://mail-archives.apache.org/mod_mbox/freemarker-notifications/")
+ }
+ mailingList {
+ name.set("FreeMarker management private")
+ post.set("private@freemarker.apache.org")
+ }
+ }
+ }
+ }
+ if (fmExt.signMethod.needSignature()) {
+ fmExt.signMethod.configure(signing)
+ signing.sign(mainPublication)
+ }
+ }
+}
+
+tasks.withType<PublishToMavenRepository>().configureEach {
+ if (repository.name != "local") {
+ doFirst {
+ if (fmExt.versionService.developmentBuild) {
+ throw IllegalStateException("Cannot deploy to ${repository.name} in a development build." +
+ " Start the build with -PdevelopmentBuild=false")
+ }
+ }
+ }
+}
+
+val distArchiveBaseName = "apache-${name}"
+val distDir = layout.buildDirectory.map { it.dir("distributions") }
+
+fun registerDistSupportTasks(archiveTask: TaskProvider<Tar>) {
+ val signTask = tasks.register<freemarker.build.SignatureTask>("${archiveTask.name}Signature") {
+ signatureConfiguration.set(fmExt.signMethod)
+ inputFile.set(archiveTask.flatMap { task -> task.archiveFile })
+ }
+
+ val checksumTask = tasks.register<freemarker.build.ChecksumFileTask>("${archiveTask.name}Checksum") {
+ inputFile.set(signTask.flatMap(freemarker.build.SignatureTask::inputFile))
+ }
+
+ tasks.named(LifecycleBasePlugin.BUILD_TASK_NAME) {
+ dependsOn(archiveTask)
+ dependsOn(checksumTask)
+
+ if (fmExt.signMethod.needSignature()) {
+ dependsOn(signTask)
+ }
+ }
+}
+
+fun registerCommonFiles(tar: Tar) {
+ tar.from("README.md") {
+ filter { content -> content.replace("{version}", fmExt.versionDef.displayVersion) }
+ }
+
+ tar.from(files("NOTICE", "RELEASE-NOTES"))
+}
+
+val distBin = tasks.register<Tar>("distBin") {
+ compression = Compression.GZIP
+ archiveBaseName.set(distArchiveBaseName)
+ destinationDirectory.set(distDir)
+ archiveAppendix.set("bin")
+
+ registerCommonFiles(this)
+
+ from("src/dist/bin") {
+ exclude("rat-excludes")
+ }
+
+ val jarFile = tasks.named<Jar>("jar").flatMap { jar -> jar.archiveFile }
+ from(jarFile) {
+ rename { name -> "freemarker.jar" }
+ }
+
+ from(tasks.named("manualOffline")) {
+ into("documentation/_html")
+ }
+
+ from(tasks.named(JavaPlugin.JAVADOC_TASK_NAME)) {
+ into("documentation/_html/api")
+ }
+}
+registerDistSupportTasks(distBin)
+
+val distSrc = tasks.register<Tar>("distSrc") {
+ compression = Compression.GZIP
+ archiveBaseName.set(distArchiveBaseName)
+ destinationDirectory.set(distDir)
+ archiveAppendix.set("src")
+
+ registerCommonFiles(this)
+
+ from(files("LICENSE"))
+
+ from(projectDir) {
+ includeEmptyDirs = false
+ include(
+ "src/**",
+ "*/src/**",
+ "**/*.kts",
+ "*.txt",
+ "osgi.bnd",
+ "rat-excludes"
+ )
+ exclude(
+ "/build",
+ "/*/build",
+ "/gradle/wrapper",
+ "/gradlew*",
+ "**/*.bak",
+ "**/*.~*",
+ "*/*.*~"
+ )
+ }
+}
+registerDistSupportTasks(distSrc)
+
+fun readExcludeFile(excludeFile: File): List<String> {
+ Files.lines(excludeFile.toPath()).use { lines ->
+ return lines
+ .map { it.trim() }
+ .filter { !it.startsWith("#") && !it.isEmpty() }
+ .collect(Collectors.toList())
+ }
+}
+
+tasks.named<org.nosphere.apache.rat.RatTask>("rat") {
+ inputDir.set(projectDir)
+ excludes.addAll(readExcludeFile(file("rat-excludes")))
+}
+
+fun registerDistRatTask(taskName: String, excludeFile: File, srcArchiveTaskRef: TaskProvider<Tar>) {
+ val inputTaskName = "${taskName}Prep"
+ val ratInputTask = tasks.register<Sync>(inputTaskName) {
+ dependsOn(srcArchiveTaskRef)
+
+ destinationDir = layout.buildDirectory.get().asFile.resolve("rat-prep").resolve(taskName)
+ from(tarTree(srcArchiveTaskRef.flatMap { it.archiveFile }))
+ }
+
+ val ratTask = tasks.register<org.nosphere.apache.rat.RatTask>(taskName) {
+ dependsOn(ratInputTask)
+
+ group = LifecycleBasePlugin.VERIFICATION_GROUP
+ description = "RAT report for the output of ${srcArchiveTaskRef.name}"
+ inputDir.set(layout.dir(ratInputTask.map { it.destinationDir }))
+ excludes.addAll(readExcludeFile(excludeFile))
+ }
+ tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) {
+ dependsOn(ratTask)
+ }
+}
+
+registerDistRatTask("ratDistBin", file("src/dist/bin/rat-excludes"), distBin)
+registerDistRatTask("ratDistSrc", file("rat-excludes"), distSrc)
+
+eclipse {
+ classpath {
+ // Eclipse sees only a single classpath,
+ // so make a best effort for a combined classpath.
+ plusConfigurations = listOf(
+ configurations["combinedClasspath"],
+ configurations["core16CompileClasspath"],
+ configurations["testUtilsCompileClasspath"],
+ configurations["jsp21TestCompileClasspath"]
+ )
+ }
+}
+
+// Choose the Jetty version very carefully, as it should implement the same Servlet API, JSP API, and EL API
+// what we declare below, because the same classes will come from Jetty as well. For example, Jetty depends
+// on org.mortbay.jasper:apache-el, which contains the javax.el classes, along with non-javax.el classes, so you
+// can't even exclude it. Similarly, org.eclipse.jetty:apache-jsp contains the JSP API javax.servlet.jsp classes,
+// yet again along with other classes. Anyway, this mess is temporary, as we will migrate to Jakarta, and only
+// support that.
+val jettyVersion = "9.4.53.v20231009"
+val slf4jVersion = "1.6.1"
+val springVersion = "2.5.6.SEC03"
+val tagLibsVersion = "1.2.5"
+
+configurations {
+ compileOnly {
+ exclude(group = "xml-apis", module = "xml-apis")
+ }
+
+ "jsp21TestImplementation" {
+ extendsFrom(compileClasspath.get())
+ exclude(group = "javax.servlet.jsp")
+ exclude(group = "javax.servlet", module = "servlet-api")
+ }
+}
+
+dependencies {
+ val xalan = "xalan:xalan:2.7.0"
+
+ compileOnly("jaxen:jaxen:1.0-FCS")
+ compileOnly("saxpath:saxpath:1.0-FCS")
+ compileOnly(xalan)
+ compileOnly("jdom:jdom:1.0b8")
+ compileOnly("ant:ant:1.6.5") // FIXME: This could be moved to "jython20CompileOnly"
+ compileOnly("rhino:js:1.6R1")
+ compileOnly("avalon-logkit:avalon-logkit:2.0")
+ compileOnly("org.slf4j:slf4j-api:${slf4jVersion}")
+ compileOnly("org.slf4j:log4j-over-slf4j:${slf4jVersion}")
+ compileOnly("org.slf4j:jcl-over-slf4j:${slf4jVersion}") // FIXME: This seems to be unused
+ compileOnly("commons-logging:commons-logging:1.1.1") // FIXME: This seems to be unused
+ compileOnly("org.zeroturnaround:javarebel-sdk:1.2.2")
+ compileOnly("org.dom4j:dom4j:2.1.3") {
+ // Excluding "pull-parser" to avoid test failures due to SAX parser conflict.
+ exclude(group = "pull-parser", module = "pull-parser")
+ }
+
+ testImplementation(xalan)
+
+ "jsp20CompileOnly"("javax.servlet.jsp:jsp-api:2.0")
+ "jsp20CompileOnly"("javax.servlet:servlet-api:2.4")
+
+ "jsp21CompileOnly"(sourceSets["jsp20"].output)
+ "jsp21CompileOnly"("javax.servlet.jsp:jsp-api:2.1")
+ "jsp21CompileOnly"("javax.servlet:servlet-api:2.5")
+
+ "jsp21TestImplementation"("org.eclipse.jetty:jetty-server:${jettyVersion}")
+ "jsp21TestImplementation"("org.eclipse.jetty:jetty-webapp:${jettyVersion}")
+ "jsp21TestImplementation"("org.eclipse.jetty:jetty-util:${jettyVersion}")
+ "jsp21TestImplementation"("org.eclipse.jetty:apache-jsp:${jettyVersion}")
+ // Jetty also contains the servlet-api and jsp-api classes
+
+ // JSP JSTL (not included in Jetty):
+ "jsp21TestImplementation"("org.apache.taglibs:taglibs-standard-impl:${tagLibsVersion}")
+ "jsp21TestImplementation"("org.apache.taglibs:taglibs-standard-spec:${tagLibsVersion}")
+
+ "jsp21TestImplementation"("org.springframework:spring-core:${springVersion}") {
+ exclude(group = "commons-logging", module = "commons-logging")
+ }
+ "jsp21TestImplementation"("org.springframework:spring-test:${springVersion}") {
+ exclude(group = "commons-logging", module = "commons-logging")
+ }
+
+ "jython20CompileOnly"("jython:jython:2.1")
+
+ "jython22CompileOnly"(sourceSets["jython20"].output)
+ "jython22CompileOnly"("org.python:jython:2.2.1")
+
+ "jython25CompileOnly"(sourceSets["jython20"].output)
+ "jython25CompileOnly"("org.python:jython:2.5.0")
+
+ "testUtilsImplementation"("displaytag:displaytag:1.2") {
+ exclude(group = "com.lowagie", module = "itext")
+ // We manage logging centrally:
+ exclude(group = "org.slf4j", module = "slf4j-log4j12")
+ exclude(group = "rg.slf4j", module = "jcl104-over-slf4j")
+ exclude(group = "log4j", module = "log4j")
+ }
+ "testUtilsImplementation"(sourceSets.main.get().output)
+ "testUtilsImplementation"("com.google.code.findbugs:annotations:3.0.0")
+ "testUtilsImplementation"(libs.junit)
+ "testUtilsImplementation"("org.hamcrest:hamcrest-library:1.3")
+ "testUtilsImplementation"("ch.qos.logback:logback-classic:1.1.2")
+ "testUtilsImplementation"("commons-io:commons-io:2.7")
+ "testUtilsImplementation"("com.google.guava:guava:29.0-jre")
+ "testUtilsImplementation"("commons-collections:commons-collections:3.1")
+
+ // Override Java 9 incompatible version (coming from displaytag):
+ "testUtilsImplementation"("commons-lang:commons-lang:2.6")
+}
diff --git a/build.xml b/build.xml
deleted file mode 100644
index c16e571..0000000
--- a/build.xml
+++ /dev/null
@@ -1,955 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<project basedir="." default="jar" name="freemarker"
- xmlns:ivy="antlib:org.apache.ivy.ant"
- xmlns:javacc="http://javacc.dev.java.net/"
- xmlns:docgen="http://freemarker.org/docgen"
- xmlns:bnd="http://www.aqute.biz/bnd"
- xmlns:rat="antlib:org.apache.rat.anttasks"
- xmlns:u="http://freemarker.org/util"
- xmlns:unless="ant:unless"
->
-
- <!-- ================================================================== -->
- <!-- Properties -->
- <!-- ================================================================== -->
-
- <!-- Maven project coordinates: -->
- <property name="mavenGroupId" value="org.freemarker" />
- <property name="mavenArtifactId" value="freemarker-gae" />
- <!-- Ivy project coordinates: -->
- <property name="moduleOrg" value="org.freemarker" />
- <property name="moduleName" value="freemarker" />
- <property name="moduleBranch" value="2.3" />
-
- <!-- Will be overidden on the Continous Integration server: -->
- <property name="server.ivy.repo.root" value="${basedir}/build/dummy-server-ivy-repo" />
-
- <property file="build.properties"/>
- <condition property="has.explicit.boot.classpath.j2se1.8">
- <isset property="boot.classpath.j2se1.8"/>
- </condition>
- <condition property="has.all.explicit.boot.classpaths">
- <and>
- <isset property="has.explicit.boot.classpath.j2se1.8"/>
- </and>
- </condition>
- <available property="atLeastJDK8" classname="java.util.function.Predicate"/>
-
- <!-- When boot.classpath.j* is missing, these will be the defaults: -->
- <!-- Note: Target "dist" doesn't allow using these. -->
- <property name="boot.classpath.j2se1.8" value="${sun.boot.class.path}" />
-
- <!-- For checking the correctness of the boot.classpath.j2se* -->
- <available classpath="${boot.classpath.j2se1.8}"
- classname="java.time.Instant" ignoresystemclasses="true"
- property="boot.classpath.j2se1.8.correct"
- />
-
- <!-- Set up version/timestamp filters and the version property: -->
- <tstamp>
- <format property="timestampNice" pattern="yyyy-MM-dd'T'HH:mm:ss'Z'"
- timezone="UTC" />
- <format property="timestampInVersion" pattern="yyyyMMdd'T'HHmmss'Z'"
- timezone="UTC" />
- </tstamp>
- <filter token="timestampInVersion" value="${timestampInVersion}" />
- <filter token="timestampNice" value="${timestampNice}" />
- <mkdir dir="build"/>
- <!-- Copying is needed to substitute the timestamps. -->
- <copy
- file="src/main/resources/freemarker/version.properties"
- tofile="build/version.properties.tmp"
- filtering="true"
- overwrite="true"
- />
- <property file="build/version.properties.tmp" />
- <delete file="build/version.properties.tmp" />
- <filter token="version" value="${version}" />
-
- <property name="dist.dir" value="build/dist" />
- <property name="dist.archiveBaseName" value="apache-${mavenArtifactId}-${mavenVersion}" />
- <property name="dist.bin.dir" value="${dist.dir}/bin/${dist.archiveBaseName}-bin" />
- <property name="dist.src.dir" value="${dist.dir}/src/${dist.archiveBaseName}-src" />
-
- <!-- ================================================================== -->
- <!-- Initialization -->
- <!-- ================================================================== -->
-
-
- <target name="clean" description="get rid of all generated files">
- <delete dir="build" />
- <delete dir="META-INF" />
- </target>
-
- <target name="clean-classes" description="get rid of compiled classes">
- <delete dir="build/classes" />
- <delete dir="build/test-classes" />
- <delete dir="build/coverage/classes" />
- </target>
-
- <target name="init">
- <mkdir dir="build"/>
- </target>
-
- <property name="ivy.install.version" value="2.5.0" />
- <property name="ivy.home" value="${user.home}/.ant" />
- <property name="ivy.jar.dir" value="${ivy.home}/lib" />
- <property name="ivy.jar.file" value="${ivy.jar.dir}/ivy.jar" />
- <target name="download-ivy">
- <mkdir dir="${ivy.jar.dir}"/>
- <get src="https://repo1.maven.org/maven2/org/apache/ivy/ivy/${ivy.install.version}/ivy-${ivy.install.version}.jar"
- dest="${ivy.jar.file}" usetimestamp="true"/>
- </target>
-
- <!-- ================================================================= -->
- <!-- Compilation -->
- <!-- ================================================================= -->
-
- <target name="javacc" depends="init" unless="parser.uptodate"
- description="Build the parser from its grammar file"
- >
- <ivy:cachepath conf="parser" pathid="ivy.dep" />
- <taskdef name="generate" classname="org.apache.tools.ant.taskdefs.optional.javacc.JavaCC"
- uri="http://javacc.dev.java.net/"
- classpathref="ivy.dep"
- />
-
- <property name="_javaccOutputDir"
- value="build/generated-sources/java/freemarker/core/"
- />
-
- <mkdir dir="${_javaccOutputDir}" />
- <ivy:retrieve conf="parser" pattern="build/javacc-home.tmp/[artifact].[ext]" />
- <javacc:generate
- target="src/main/javacc/FTL.jj"
- outputdirectory="${_javaccOutputDir}"
- javacchome="build/javacc-home.tmp"
- />
- <delete dir="build/javacc-home.tmp" />
-
- <replace
- file="${_javaccOutputDir}/FMParserConstants.java"
- token="public interface FMParserConstants"
- value="interface FMParserConstants"
- />
- <replace
- file="${_javaccOutputDir}/FMParserTokenManager.java"
- token="public class FMParserTokenManager"
- value="class FMParserTokenManager"
- />
- <replace
- file="${_javaccOutputDir}/Token.java"
- token="public class Token"
- value="class Token"
- />
- <replace
- file="${_javaccOutputDir}/SimpleCharStream.java"
- token="public final class SimpleCharStream"
- value="final class SimpleCharStream"
- />
- <replace
- file="${_javaccOutputDir}/FMParser.java"
- token="enum"
- value="ENUM"
- />
-
- <!-- As we have a modified version in src/main/java: -->
- <move
- file="${_javaccOutputDir}/ParseException.java"
- tofile="${_javaccOutputDir}/ParseException.java.ignore"
- />
- <move
- file="${_javaccOutputDir}/TokenMgrError.java"
- tofile="${_javaccOutputDir}/TokenMgrError.java.ignore"
- />
- </target>
-
- <target name="compile" depends="javacc">
- <fail unless="boot.classpath.j2se1.8.correct"><!--
- -->The "boot.classpath.j2se1.8" property value (${boot.classpath.j2se1.8}) <!--
- -->seems to be an incorrect boot classpath. Please fix it in <!--
- -->the <projectDir>/build.properties file, or wherever you <!--
- -->set it.<!--
- --></fail>
- <echo level="info"><!--
- -->Using boot classpaths: <!--
- -->Java 8: ${boot.classpath.j2se1.8}<!--
- -->Java 16: Current JDK classpath<!--
- --></echo>
-
- <!-- Comment out @SuppressFBWarnings, as it causes compilation warnings in dependent Gradle projects -->
- <delete dir="build/src-main-java-filtered" />
- <mkdir dir="build/src-main-java-filtered" />
- <copy toDir="build/src-main-java-filtered">
- <fileset dir="src/main/java" excludes="**/AdhocTest*" />
- </copy>
- <replaceregexp
- flags="gs" encoding="utf-8"
- match='(@SuppressFBWarnings\(.+?"\s*\))' replace="/*\1*/"
- >
- <fileset dir="build/src-main-java-filtered" includes="**/*.java" />
- </replaceregexp>
- <replaceregexp
- flags="gs" encoding="utf-8"
- match='(import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;)' replace="// \1"
- >
- <fileset dir="build/src-main-java-filtered" includes="**/*.java" />
- </replaceregexp>
-
- <mkdir dir="build/classes" />
-
- <!-- Note: the "build.base" conf doesn't include optional FreeMarker dependencies. -->
- <ivy:cachepath conf="build.base" pathid="ivy.dep" />
- <javac destdir="build/classes" deprecation="off"
- debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
- includeantruntime="false"
- classpathref="ivy.dep"
- bootclasspath="${boot.classpath.j2se1.8}"
- excludes="
- freemarker/core/_Java?*Impl.java,
- freemarker/ext/jsp/**,
- freemarker/ext/servlet/**,
- freemarker/cache/WebappTemplateLoader.java,
-
- freemarker/ext/jython/**,
- freemarker/template/utility/JythonRuntime.java,
- freemarker/ext/ant/**"
- >
- <src>
- <pathelement location="build/src-main-java-filtered" />
- <pathelement location="build/generated-sources" />
- </src>
- </javac>
-
- <ivy:cachepath conf="build.base" pathid="ivy.dep" />
- <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
- debug="on" optimize="off" release="16" encoding="utf-8"
- includeantruntime="false"
- classpathref="ivy.dep"
- includes="freemarker/core/_Java16Impl.java"
- />
-
- <ivy:cachepath conf="build.jsp2.0" pathid="ivy.dep.jsp2.0" />
- <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
- debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
- includeantruntime="false"
- classpathref="ivy.dep.jsp2.0"
- bootclasspath="${boot.classpath.j2se1.8}"
- includes="
- freemarker/ext/jsp/**,
- freemarker/ext/servlet/**,
- freemarker/cache/WebappTemplateLoader.java"
- excludes="
- freemarker/ext/jsp/_FreeMarkerPageContext21.java,
- freemarker/ext/jsp/FreeMarkerJspFactory21.java,
- freemarker/ext/jsp/FreeMarkerJspApplicationContext.java"
- />
-
- <!-- There's no build.jsp2.0, as those classes are part of the common build subset. -->
-
- <ivy:cachepath conf="build.jsp2.1" pathid="ivy.dep.jsp2.1" />
- <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
- debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
- includeantruntime="false"
- classpathref="ivy.dep.jsp2.1"
- bootclasspath="${boot.classpath.j2se1.8}"
- includes="
- freemarker/ext/jsp/_FreeMarkerPageContext21.java,
- freemarker/ext/jsp/FreeMarkerJspFactory21.java,
- freemarker/ext/jsp/FreeMarkerJspApplicationContext.java"
- />
-
- <ivy:cachepath conf="build.jython2.0" pathid="ivy.dep.jython2.0" />
- <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
- debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
- includeantruntime="false"
- classpathref="ivy.dep.jython2.0"
- bootclasspath="${boot.classpath.j2se1.8}"
- includes="
- freemarker/ext/ant/**,
- freemarker/template/utility/JythonRuntime.java,
- freemarker/ext/jython/**"
- excludes="
- freemarker/ext/jython/_Jython22VersionAdapter.java,
- freemarker/ext/jython/_Jython25VersionAdapter.java"
- />
-
- <ivy:cachepath conf="build.jython2.2" pathid="ivy.dep.jython2.2" />
- <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
- debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
- includeantruntime="false"
- classpathref="ivy.dep.jython2.2"
- bootclasspath="${boot.classpath.j2se1.8}"
- includes="
- freemarker/ext/jython/_Jython22VersionAdapter.java"
- />
-
- <ivy:cachepath conf="build.jython2.5" pathid="ivy.dep.jython2.5" />
- <javac srcdir="build/src-main-java-filtered" destdir="build/classes" deprecation="off"
- debug="on" optimize="off" target="1.8" source="1.8" encoding="utf-8"
- includeantruntime="false"
- classpathref="ivy.dep.jython2.5"
- bootclasspath="${boot.classpath.j2se1.8}"
- includes="
- freemarker/ext/jython/_Jython25VersionAdapter.java"
- />
-
- <copy toDir="build/classes">
- <fileset dir="src/main/resources"
- excludes="
- freemarker/version.properties"
- />
- </copy>
- <copy toDir="build/classes" filtering="true" overwrite="true">
- <fileset dir="src/main/resources"
- includes="
- freemarker/version.properties"
- />
- </copy>
- <copy toDir="build/classes/META-INF">
- <fileset dir="src/dist/jar/META-INF" includes="*" />
- </copy>
- <delete dir="build/src-main-java-filtered" />
- </target>
-
- <target name="compileTest" depends="compile">
- <mkdir dir="build/test-classes" />
-
- <ivy:cachepath conf="build.test" pathid="ivy.dep.build.test" />
- <javac srcdir="src/test/java" destdir="build/test-classes" deprecation="off"
- debug="on" optimize="off" release="16" encoding="utf-8"
- includeantruntime="false"
- classpath="build/classes"
- classpathref="ivy.dep.build.test"
- />
- <copy toDir="build/test-classes">
- <fileset dir="src/test/resources"
- excludes=""
- />
- </copy>
- </target>
-
- <target name="jar" depends="compile">
- <ivy:cachepath pathid="ivy.dep" conf="bnd" />
- <taskdef resource="aQute/bnd/ant/taskdef.properties"
- uri="http://www.aqute.biz/bnd"
- classpathref="ivy.dep"
- />
-
- <!-- Hack: This file should be excluded, but I can't explain that to bnd. -->
- <!-- We don't have this file in 2.4.X... yet?
- <move
- file="build/classes/freemarker/core/SecureRendererImpl.class"
- tofile="build/SecureRendererImpl.class.tmp"
- preservelastmodified="true" overwrite="true"
- />
- -->
- <bnd:bnd
- files="osgi.bnd" eclipse="false"
- output="build/freemarker.jar"
- />
- <!-- Revert previous hack... -->
- <!-- We don't have this file in 2.4.X... yet?
- <move
- file="build/SecureRendererImpl.class.tmp"
- tofile="build/classes/freemarker/core/SecureRendererImpl.class"
- preservelastmodified="true" overwrite="true"
- />
- -->
- </target>
-
- <!-- ================================================================= -->
- <!-- Testing -->
- <!-- ================================================================= -->
-
- <target name="test" depends="compileTest" description="Run test cases">
- <mkdir dir="build/junit-reports" />
- <ivy:cachepath conf="run.test" pathid="ivy.dep.run.test" />
- <junit haltonfailure="on" logfailedtests="true" fork="true" forkmode="once">
- <classpath>
- <pathelement path="build/test-classes" />
- <pathelement path="build/classes" />
- <path refid="ivy.dep.run.test" />
- </classpath>
- <formatter type="plain" />
- <formatter type="xml" />
- <batchtest todir="build/junit-reports">
- <fileset dir="src/test/java">
- <include name="**/*Test.java" />
- <include name="**/*TestSuite.java" />
- <exclude name="**/Abstract*.java" />
- </fileset>
- </batchtest>
- </junit>
- </target>
-
- <!-- ================================================================= -->
- <!-- Generate docs -->
- <!-- ================================================================= -->
-
- <target name="javadoc" depends="compile" description="Build the JavaDocs">
- <mkdir dir="build/api" />
- <delete includeEmptyDirs="yes">
- <fileset dir="build/api" includes="**/*" />
- </delete>
- <!-- javadoc with <fileset> has bugs, so we create a filtered copy: -->
- <copy todir="build/javadoc-sources">
- <fileset dir="src/main/java">
- <exclude name="**/_*.java" />
- <exclude name="**/SunInternalXalanXPathSupport.java" />
- <!-- Remove classes that are, I suppose, only accidentally public: -->
- <exclude name="**/core/LocalContext.java" />
- <exclude name="**/core/CollectionAndSequence.java" />
- <exclude name="**/core/Comment.java" />
- <exclude name="**/core/DebugBreak.java" />
- <exclude name="**/core/Expression.java" />
- <exclude name="**/core/LibraryLoad.java" />
- <exclude name="**/core/Macro.java" />
- <exclude name="**/core/ReturnInstruction.java" />
- <exclude name="**/core/StringArraySequence.java" />
- <exclude name="**/core/TemplateElement.java" />
- <exclude name="**/core/TemplateObject.java" />
- <exclude name="**/core/TextBlock.java" />
- <exclude name="**/core/ReturnInstruction.java" />
- <exclude name="**/core/TokenMgrError.java" />
- <exclude name="**/template/EmptyMap.java" />
- <exclude name="**/log/SLF4JLoggerFactory.java" />
- <exclude name="**/log/CommonsLoggingLoggerFactory.java" />
- </fileset>
- </copy>
-
- <!-- conf="IDE": as that has to contain all depedencies -->
- <ivy:cachepath conf="IDE" pathid="ivy.dep" />
- <javadoc
- sourcepath="build/javadoc-sources"
- destdir="build/api"
- doctitle="FreeMarker ${version}"
- packagenames="
- freemarker.debug, freemarker.template.*,
- freemarker.core.*, freemarker.ext.*,
- freemarker.cache.*, freemarker.log.*"
- use="true"
- version="true"
- author="true"
- windowtitle="FreeMarker ${version} API"
- classpath="build/classes"
- classpathref="ivy.dep"
- failonerror="true"
- charset="UTF-8"
- docencoding="UTF-8"
- encoding="UTF-8"
- locale="en_US"
- >
- <link href="https://docs.oracle.com/en/java/javase/16/docs/api/"/>
- </javadoc>
- <delete dir="build/javadoc-sources" />
- </target>
-
- <!-- ====================== -->
- <!-- Manual -->
- <!-- ====================== -->
-
- <macrodef name="manual" uri="http://freemarker.org/util">
- <attribute name="offline" />
- <attribute name="locale" />
- <sequential>
- <ivy:cachepath conf="manual" pathid="ivy.dep" />
- <taskdef resource="org/freemarker/docgen/ant/antlib.properties"
- uri="http://freemarker.org/docgen"
- classpathref="ivy.dep"
- />
-
- <docgen:transform
- srcdir="src/manual/@{locale}" destdir="build/manual/@{locale}"
- offline="@{offline}"
- />
- </sequential>
- </macrodef>
-
- <target name="manualOffline" depends="init" description="Build the Manual for offline use" >
- <u:manual offline="true" locale="en_US" />
- </target>
-
- <target name="manualOnline" depends="init" description="Build the Manual to be upload to the FreeMarker homepage" >
- <u:manual offline="false" locale="en_US" />
- </target>
-
- <target name="manualOffline_zh_CN" depends="init" description="Build the Manual for offline use" >
- <u:manual offline="true" locale="zh_CN" />
- </target>
-
- <target name="manualOnline_zh_CN" depends="init" description="Build the Manual to be upload to the FreeMarker homepage" >
- <u:manual offline="false" locale="zh_CN" />
- </target>
-
-
- <!-- ===================== -->
- <!-- Distribution building -->
- <!-- ===================== -->
-
- <target name="dist"
- description="Build the FreeMarker distribution files"
- >
- <fail
- unless="has.all.explicit.boot.classpaths"
- message="All boot.classpath properties must be set in build.properties for dist!"
- />
- <fail unless="atLeastJDK8" message="The release should be built with JDK 8+ (you may need to set JAVA_HOME)" />
- <antcall target="clean" /> <!-- To improve the reliability -->
- <antcall target="_dist" />
- </target>
-
- <target name="_dist"
- depends="test, jar, javadoc, manualOffline"
- >
- <delete dir="${dist.dir}" />
-
- <!-- ..................................... -->
- <!-- Binary distribution -->
- <!-- ..................................... -->
-
- <mkdir dir="${dist.bin.dir}" />
-
- <!-- Copy txt-s -->
- <copy todir="${dist.bin.dir}" includeEmptyDirs="no">
- <fileset dir="." defaultexcludes="no">
- <include name="README.md" />
- <!-- LICENSE is binary-distribution-specific, and is copied later. -->
- <include name="NOTICE" />
- <include name="RELEASE-NOTES" />
- </fileset>
- </copy>
- <replace
- file="${dist.bin.dir}/README.md"
- token="{version}"
- value="${version}"
- />
- <!-- Copy binary-distribution-specific files: -->
- <copy todir="${dist.bin.dir}/">
- <fileset dir="src/dist/bin/">
- <exclude name="rat-excludes" />
- </fileset>
- </copy>
-
- <!-- Copy binary -->
- <copy file="build/freemarker.jar" tofile="${dist.bin.dir}/freemarker.jar" />
-
- <!-- Copy documentation -->
- <mkdir dir="${dist.bin.dir}/documentation" />
-
- <!--
- The US English Manual is the source of any translations and thus it's the
- only one that is guaranteed to be up to date when doing the release, so we
- only pack that into it.
- -->
- <copy todir="${dist.bin.dir}/documentation/_html" includeEmptyDirs="no">
- <fileset dir="build/manual/en_US" />
- </copy>
- <copy todir="${dist.bin.dir}/documentation/_html/api" includeEmptyDirs="no">
- <fileset dir="build/api" />
- </copy>
-
- <u:packageAndSignDist
- srcDir="${dist.bin.dir}/.."
- archiveNameWithoutExt="${dist.archiveBaseName}-bin"
- />
-
- <!-- ..................................... -->
- <!-- Source distribution -->
- <!-- ..................................... -->
-
- <mkdir dir="${dist.src.dir}" />
-
- <!-- Copy extensionless files: -->
- <copy todir="${dist.src.dir}" includeEmptyDirs="no">
- <fileset dir="." defaultexcludes="no">
- <include name="README.md" />
- <include name="LICENSE" />
- <include name="NOTICE" />
- <include name="RELEASE-NOTES" />
- </fileset>
- </copy>
- <replace
- file="${dist.src.dir}/README.md"
- token="{version}"
- value="${version}"
- />
-
- <copy todir="${dist.src.dir}" includeEmptyDirs="no">
- <fileset dir="." defaultexcludes="no">
- <exclude name="**/*.bak" />
- <exclude name="**/*.~*" />
- <exclude name="**/*.*~" />
- <include name="src/**" />
- <include name="*.xml" />
- <include name="*.sample" />
- <include name="*.txt" />
- <include name="osgi.bnd" />
- <include name=".git*" />
- <include name="rat-excludes" />
- </fileset>
- </copy>
-
- <u:packageAndSignDist
- srcDir="${dist.src.dir}/.."
- archiveNameWithoutExt="${dist.archiveBaseName}-src"
- />
- </target>
-
- <macrodef name="packageAndSignDist" uri="http://freemarker.org/util">
- <attribute name="srcDir" />
- <attribute name="archiveNameWithoutExt" />
- <sequential>
- <local name="archive.tar"/>
- <property name="archive.tar" value="build/dist/@{archiveNameWithoutExt}.tar" />
- <local name="archive.gzip"/>
- <property name="archive.gzip" value="${archive.tar}.gz" />
- <delete file="${archive.tar}" />
- <tar tarfile="${archive.tar}" basedir="@{srcDir}" />
- <delete file="${archive.gzip}" />
- <gzip zipfile="${archive.gzip}" src="${archive.tar}" />
- <delete file="${archive.tar}" />
-
- <echo>Signing "${archive.gzip}"...</echo>
- <!-- gpg may hang if it exists: -->
- <delete file="${archive.gzip}.asc" />
- <exec executable="${gpgCommand}" failonerror="true">
- <arg value="--armor" />
- <arg value="--output" />
- <arg value="${archive.gzip}.asc" />
- <arg value="--detach-sig" />
- <arg value="${archive.gzip}" />
- </exec>
-
- <echo>*** Signature verification: ***</echo>
- <exec executable="${gpgCommand}" failonerror="true">
- <arg value="--verify" />
- <arg value="${archive.gzip}.asc" />
- <arg value="${archive.gzip}" />
- </exec>
- <local name="signatureGood" />
- <local name="signatureGood.y" />
- <input
- validargs="y,n"
- addproperty="signatureGood"
- unless:set="ci"
- >Is the above signer the intended one for Apache releases?</input>
- <condition property="signatureGood.y" unless:set="ci">
- <equals arg1="y" arg2="${signatureGood}"/>
- </condition>
- <fail unless:set="ci" unless="signatureGood.y" message="Task aborted by user." />
-
- <echo>Creating checksum file for "${archive.gzip}"...</echo>
- <checksum file="${archive.gzip}" fileext=".sha512" algorithm="SHA-512" forceOverwrite="yes" />
- </sequential>
- </macrodef>
-
- <target name="maven-pom">
- <echo file="build/pom.xml"><![CDATA[<?xml version="1.0" encoding="utf-8"?>
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
- <modelVersion>4.0.0</modelVersion>
-
- <parent>
- <groupId>org.apache</groupId>
- <artifactId>apache</artifactId>
- <version>17</version>
- </parent>
-
- <groupId>${mavenGroupId}</groupId>
- <artifactId>${mavenArtifactId}</artifactId>
- <version>${mavenVersion}</version>
-
- <packaging>jar</packaging>
-
- <name>Apache FreeMarker</name>
- <description>
- Google App Engine compliant variation of FreeMarker.
- FreeMarker is a "template engine"; a generic tool to generate text output based on templates.
- </description>
- <url>https://freemarker.apache.org/</url>
- <organization>
- <name>Apache Software Foundation</name>
- <url>http://apache.org</url>
- </organization>
-
- <licenses>
- <license>
- <name>Apache License, Version 2.0</name>
- <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
- <distribution>repo</distribution>
- </license>
- </licenses>
-
- <scm>
- <connection>scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git</connection>
- <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git</developerConnection>
- <url>https://git-wip-us.apache.org/repos/asf?p=freemarker.git</url>
- <tag>v${version}</tag>
- </scm>
-
- <issueManagement>
- <system>jira</system>
- <url>https://issues.apache.org/jira/browse/FREEMARKER/</url>
- </issueManagement>
-
- <mailingLists>
- <mailingList>
- <name>FreeMarker developer list</name>
- <post>dev@freemarker.apache.org</post>
- <subscribe>dev-subscribe@freemarker.apache.org</subscribe>
- <unsubscribe>dev-unsubscribe@freemarker.apache.org</unsubscribe>
- <archive>http://mail-archives.apache.org/mod_mbox/freemarker-dev/</archive>
- </mailingList>
- <mailingList>
- <name>FreeMarker commit and Jira notifications list</name>
- <post>notifications@freemarker.apache.org</post>
- <subscribe>notifications-subscribe@freemarker.apache.org</subscribe>
- <unsubscribe>notifications-unsubscribe@freemarker.apache.org</unsubscribe>
- <archive>http://mail-archives.apache.org/mod_mbox/freemarker-notifications/</archive>
- </mailingList>
- <mailingList>
- <name>FreeMarker management private</name>
- <post>private@freemarker.apache.org</post>
- </mailingList>
- </mailingLists>
-
- <dependencies>
- <!-- no required dependencies -->
- </dependencies>
-</project>
-]]></echo>
- </target>
-
- <target name="maven-install" depends="jar, maven-pom"
- description="Installs the jar into the local maven repo (without signing)">
- <exec executable="${mvnCommand}" failonerror="true">
- <arg value="install:install-file" />
- <arg value="-Dfile=build/freemarker.jar" />
- <arg value="-DpomFile=build/pom.xml" />
- </exec>
- </target>
-
- <!--
- Uploads the freemarker.jar that is in the current DISTRIBUTION DIRECTORY
- to a Maven repository (snapshot or central).
- Use this after "dist" (without interleaving "clean").
- -->
- <target name="maven-dist" depends="maven-pom"
- description="Releases the already built distro to a Maven repository">
- <jar destfile="build/maven-source-attachment.jar">
- <fileset dir="${dist.src.dir}/src/main/java" />
- <fileset dir="${dist.src.dir}/src/main/resources" />
- <fileset dir="${dist.src.dir}/src/main/javacc/" />
- <fileset dir="build/generated-sources/java/" includes="**/*.java" />
- <metainf dir="${dist.src.dir}" includes="LICENSE, NOTICE" />
- </jar>
-
- <mkdir dir="build/javadoc-attachment-metainf"/>
- <copy todir="build/javadoc-attachment-metainf">
- <fileset dir="${dist.bin.dir}" includes="NOTICE" />
- </copy>
- <copy todir="build/javadoc-attachment-metainf">
- <fileset dir="src/dist/javadoc/META-INF/" />
- </copy>
- <jar destfile="build/maven-javadoc-attachment.jar">
- <fileset dir="${dist.bin.dir}/documentation/_html/api" />
- <metainf dir="build/javadoc-attachment-metainf" includes="**/*" />
- </jar>
- <delete dir="build/javadoc-attachment-metainf" />
-
- <!-- These were copy-pasted from the org.apacha:apache parent POM: -->
- <property name="maven-server-id" value="apache.releases.https" />
- <condition property="maven-repository-url"
- value="https://repository.apache.org/content/repositories/snapshots/"
- else="https://repository.apache.org/service/local/staging/deploy/maven2">
- <matches pattern="-SNAPSHOT$" string="${mavenVersion}" />
- </condition>
- <!-- Snapshot repo: https://repository.apache.org/content/repositories/snapshots/ -->
- <input
- validargs="y,n"
- addproperty="mavenUpload.answer"
- >
-You are about uploading
-${dist.bin.dir}/freemarker.jar
-and its attachments with Maven coordinates
-${mavenGroupId}:${mavenArtifactId}:${mavenVersion}
-to this Maven repository:
-${maven-repository-url}
-
-Note that it's assumed that you have run `ant dist` just before this.
-Proceed? </input>
- <condition property="mavenUpload.yes">
- <equals arg1="y" arg2="${mavenUpload.answer}"/>
- </condition>
- <fail unless="mavenUpload.yes" message="Task aborted by user." />
-
- <!-- Sign and deploy the main artifact -->
- <exec executable="${mvnCommand}" failonerror="true">
- <arg value="org.apache.maven.plugins:maven-gpg-plugin:1.6:sign-and-deploy-file" />
- <!--
- As we use the gpg plugin instead of a normal Maven "deploy", sadly we can't just
- inherit the repo URL and repositoryId from the parent POM.
- -->
- <arg value="-Durl=${maven-repository-url}" />
- <arg value="-DrepositoryId=${maven-server-id}" />
- <arg value="-DpomFile=build/pom.xml" />
- <arg value="-Dfile=${dist.bin.dir}/freemarker.jar" />
- <arg value="-Dsources=build/maven-source-attachment.jar" />
- <arg value="-Djavadoc=build/maven-javadoc-attachment.jar" />
- <arg value="-Pgpg" />
- </exec>
-
- <echo>*****************************************************************</echo>
- <echo>Check the above lines for any Maven errors!</echo>
- <echo>Now you need to close and maybe release the staged repo on</echo>
- <echo>http://repository.apache.org (except for SNAPSHOT versions).</echo>
- <echo>Note that before releasing, voting is needed!</echo>
- <echo>*****************************************************************</echo>
- </target>
-
- <!-- ================================================================= -->
- <!-- CI (like Travis)....................... -->
- <!-- ================================================================= -->
-
- <target name="ci-setup">
- <ivy:settings file="ivysettings-ci.xml" />
- </target>
-
- <target name="ci"
- depends="ci-setup, clean, _dist"
- description="CI should invoke this task"
- />
-
- <!-- ================================================================== -->
- <!-- Dependency management -->
- <!-- ================================================================== -->
-
- <target name="report-deps"
- description="Creates a HTML document that summarizes the dependencies."
- >
- <mkdir dir="build/deps-report" />
- <ivy:resolve />
- <ivy:report todir="build/deps-report" />
- </target>
-
- <target name="ide-dependencies" depends="jar"
- description="If your IDE has no Ivy support, this generates ide-lib/*.jar for it">
- <mkdir dir="ide-dependencies" />
- <delete includeEmptyDirs="true">
- <fileset dir="ide-dependencies">
- <include name="*/**" />
- </fileset>
- </delete>
- <ivy:retrieve conf="IDE" pattern="ide-dependencies/[artifact]-[revision].[ext]" />
-
- <!--
- Extract META-INF/MANITSET.MF from freemarker.jar and put it into the project directory for Eclipse (this is
- needed if you want to reference freemarker source code in the context of OSGI development with Eclipse)
- -->
- <unzip src="build/freemarker.jar" dest=".">
- <patternset>
- <include name="META-INF/*"/>
- <exclude name="META-INF/LICENSE"/>
- <exclude name="META-INF/NOTICE"/>
- </patternset>
- </unzip>
- <echo file="META-INF/DO-NOT-EDIT.txt"><!--
- -->Do not edit the files in this directory! They are extracted from freemarker.jar as part of
<!--
- -->the ide-dependencies Ant task, because Eclipse OSGi support expects them to be here.<!--
- --></echo>
-
- <!--
- Add bndtools support (bnd workspace model), which requires a bnd.bnd file to be present.
- See https://bndtools.org/concepts.html#workspacerepositoriesproject-model for more information.
- We copy the existing osgi.bnd to bnd.bnd and replace the variables
- with values from this build.xml and version.properties
- The resulting bnd.bnd in the project root is only consumed by Eclipse
- if the bndtools plugin is installed.
- bnd.bnd is also in .gitignore, to avoid accidental commits.
- -->
- <filter token="moduleOrg" value="${moduleOrg}" />
- <filter token="moduleName" value="${moduleName}" />
- <filter filtersfile="build/classes/freemarker/version.properties" />
-
- <copy
- file="osgi.bnd"
- tofile="bnd.bnd"
- filtering="true"
- overwrite="true"
- >
- <filterchain>
- <expandproperties />
- </filterchain>
- </copy>
-
-
-
- </target>
-
- <!-- ================================================================== -->
- <!-- Misc. -->
- <!-- ================================================================== -->
-
- <target name="rat" description="Generates Apache RAT report">
- <ivy:cachepath conf="rat" pathid="ivy.dep" />
- <taskdef
- uri="antlib:org.apache.rat.anttasks"
- resource="org/apache/rat/anttasks/antlib.xml"
- classpathref="ivy.dep"
- />
-
- <rat:report reportFile="build/rat-report-root.txt">
- <fileset dir="" excludesfile="rat-excludes" />
- </rat:report>
- <rat:report reportFile="build/rat-report-dist-src.txt">
- <fileset dir="${dist.src.dir}" excludesfile="rat-excludes" />
- </rat:report>
- <rat:report reportFile="build/rat-report-dist-bin.txt">
- <fileset dir="${dist.bin.dir}" excludesfile="src/dist/bin/rat-excludes" />
- </rat:report>
- <echo level="info"><!--
- -->Rat reports were written into build/rat-report-*.txt<!--
- --></echo>
- </target>
-
-</project>
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
new file mode 100644
index 0000000..5058c92
--- /dev/null
+++ b/buildSrc/build.gradle.kts
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+plugins {
+ `kotlin-dsl`
+}
+
+dependencies {
+ implementation(gradleApi())
+
+ implementation("org.apache.freemarker.docgen:freemarker-docgen-core:0.0.2-SNAPSHOT")
+ implementation("org.nosphere.apache:creadur-rat-gradle:0.7.0")
+}
diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts
new file mode 100644
index 0000000..49565d2
--- /dev/null
+++ b/buildSrc/settings.gradle.kts
@@ -0,0 +1,22 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+rootProject.name = "freemarker-buildSrc"
+
+apply(from = rootDir.toPath().parent.resolve("gradle").resolve("repositories.gradle.kts"))
diff --git a/buildSrc/src/main/kotlin/freemarker/build/ChecksumFileTask.kt b/buildSrc/src/main/kotlin/freemarker/build/ChecksumFileTask.kt
new file mode 100644
index 0000000..5bb641e
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/ChecksumFileTask.kt
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import com.google.common.hash.HashFunction
+import com.google.common.hash.Hashing
+import com.google.common.io.Files
+import java.io.File
+import java.nio.charset.StandardCharsets
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.ProjectLayout
+import org.gradle.api.model.ObjectFactory
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.OutputFile
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import org.gradle.kotlin.dsl.property
+
+open class ChecksumFileTask @Inject constructor(
+ layout: ProjectLayout,
+ objects: ObjectFactory
+): DefaultTask() {
+
+ enum class Algorithm(
+ internal val hashFunction: HashFunction,
+ private val extension: String) {
+
+ SHA256(Hashing.sha256(), "sha256"),
+ SHA384(Hashing.sha384(), "sha384"),
+ SHA512(Hashing.sha512(), "sha512");
+
+ internal fun getHashFile(file: File): File {
+ val path = file.toPath()
+ return path.resolveSibling("${path.fileName}.$extension").toFile()
+ }
+ }
+
+ @InputFile
+ @PathSensitive(PathSensitivity.NONE)
+ val inputFile = objects.fileProperty()
+
+ @Input
+ val algorithm = objects.property<Algorithm>().value(Algorithm.SHA512)
+
+ @OutputFile
+ val outputHashFile = objects.fileProperty().value(inputFile
+ .zip(algorithm) { inputFileValue, algValue -> algValue.getHashFile(inputFileValue.asFile) }
+ .let { layout.file(it) }
+ )
+
+ @TaskAction
+ fun createHash() {
+ val hash = Files.asByteSource(inputFile.get().asFile)
+ .hash(algorithm.get().hashFunction)
+
+ Files.write(
+ hash.toString().toByteArray(StandardCharsets.US_ASCII),
+ outputHashFile.get().asFile
+ )
+ }
+}
diff --git a/buildSrc/src/main/kotlin/freemarker/build/CompileJavaccTask.kt b/buildSrc/src/main/kotlin/freemarker/build/CompileJavaccTask.kt
new file mode 100644
index 0000000..4acf27e
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/CompileJavaccTask.kt
@@ -0,0 +1,234 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import java.io.File
+import java.nio.charset.StandardCharsets
+import java.nio.file.FileVisitResult
+import java.nio.file.Files
+import java.nio.file.Path
+import java.nio.file.SimpleFileVisitor
+import java.nio.file.attribute.BasicFileAttributes
+import java.util.TreeSet
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.EmptyFileVisitor
+import org.gradle.api.file.FileSystemOperations
+import org.gradle.api.file.FileVisitDetails
+import org.gradle.api.file.ProjectLayout
+import org.gradle.api.model.ObjectFactory
+import org.gradle.api.provider.ListProperty
+import org.gradle.api.tasks.IgnoreEmptyDirectories
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputDirectory
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.SkipWhenEmpty
+import org.gradle.api.tasks.TaskAction
+import org.gradle.kotlin.dsl.property
+import org.gradle.kotlin.dsl.setProperty
+import org.gradle.kotlin.dsl.submit
+import org.gradle.process.ExecOperations
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
+
+private const val JAVACC_MAIN_CLASS = "org.javacc.parser.Main"
+
+data class JavaccReplacePattern(val relPath: String, val pattern: String, val replacement: String) : java.io.Serializable
+
+open class CompileJavaccTask @Inject constructor(
+ private val fs: FileSystemOperations,
+ private val execOps: ExecOperations,
+ private val exec: WorkerExecutor,
+ layout: ProjectLayout,
+ objects: ObjectFactory
+) : DefaultTask() {
+
+ @InputDirectory
+ @SkipWhenEmpty
+ @IgnoreEmptyDirectories
+ @PathSensitive(PathSensitivity.RELATIVE)
+ val sourceDirectory = objects.directoryProperty().value(layout.projectDirectory.dir("src/main/javacc"))
+
+ @Input
+ val javaccVersion = objects.property<String>().value("7.0.12")
+
+ private val javaccClasspath = objects.fileCollection().apply {
+ val dependencies = project.dependencies
+ val configurations = project.configurations
+
+ from(javaccVersion.map { versionValue ->
+ dependencies
+ .create("net.java.dev.javacc:javacc:${versionValue}")
+ .let { configurations.detachedConfiguration(it) }
+ })
+ }
+
+ @Input
+ val fileNameOverrides = objects.setProperty<String>()
+
+ @Input
+ val replacePatterns = objects.setProperty<JavaccReplacePattern>()
+
+ @OutputDirectory
+ val destinationDirectory = objects.directoryProperty().value(layout.buildDirectory.dir("generated/javacc"))
+
+ fun replacePattern(relPath: String, pattern: String, replacement: String) {
+ replacePatterns.add(JavaccReplacePattern(relPath, pattern, replacement))
+ }
+
+ private fun hasJavaccOnClasspath(): Boolean {
+ try {
+ Class.forName(JAVACC_MAIN_CLASS)
+ return true
+ } catch (ex: ClassNotFoundException) {
+ return false
+ }
+ }
+
+ @TaskAction
+ fun compileFiles() {
+ fs.delete { delete(destinationDirectory) }
+
+ val destRoot = destinationDirectory.get().asFile
+
+ compileFiles(destRoot)
+ deleteOverriddenFiles(destRoot)
+ updateFiles(destRoot)
+ }
+
+ private fun compileFiles(destRoot: File) {
+ withJavaccRunner {
+ sourceDirectory.asFileTree.visit(object : EmptyFileVisitor() {
+ override fun visitFile(fileDetails: FileVisitDetails) {
+ val outputDir = fileDetails.relativePath.parent.getFile(destRoot)
+ Files.createDirectories(outputDir.toPath())
+
+ runJavacc(listOf(
+ "-OUTPUT_DIRECTORY=$outputDir",
+ fileDetails.file.toString()
+ ))
+ }
+ })
+ }
+ }
+
+ private fun deleteOverriddenFiles(destRoot: File) {
+ val fileNameOverridesSnapshot = fileNameOverrides.get()
+ val deletedFileNames = HashSet<String>()
+
+ Files.walkFileTree(destRoot.toPath(), object : SimpleFileVisitor<Path>() {
+ override fun visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult {
+ val fileName = file.fileName.toString()
+ if (fileNameOverridesSnapshot.contains(fileName)) {
+ deletedFileNames.add(fileName)
+ Files.delete(file)
+ }
+ return FileVisitResult.CONTINUE
+ }
+ })
+
+ val unusedFileNames = TreeSet(fileNameOverridesSnapshot)
+ unusedFileNames.removeAll(deletedFileNames)
+ if (unusedFileNames.isNotEmpty()) {
+ logger.warn("Javacc did not generate the following files," +
+ " even though they are marked as overridden: $unusedFileNames")
+ }
+ }
+
+ private fun updateFiles(destRoot: File) {
+ replacePatterns.get().groupBy { it.relPath }.forEach { (relPath, patternDefs) ->
+ val file = destRoot.toPath().resolve(relPath.replace("/", File.separator))
+
+ val encoding = StandardCharsets.ISO_8859_1
+ val origContent = String(Files.readAllBytes(file), encoding)
+ var adjContent = origContent
+ for (patternDef in patternDefs) {
+ val prevContent = adjContent
+ adjContent = adjContent.replace(patternDef.pattern, patternDef.replacement)
+ if (prevContent == adjContent) {
+ logger.warn("$file was not modified, because it does not contain the requested token: '${patternDef.pattern}'")
+ }
+ }
+
+ if (origContent != adjContent) {
+ Files.write(file, adjContent.toByteArray(encoding))
+ }
+ }
+ }
+
+ private fun withJavaccRunner(action: JavaccRunner.() -> Unit) {
+ if (hasJavaccOnClasspath()) {
+ logger.warn("Found Javacc (${JAVACC_MAIN_CLASS}) on classpath. Switching to process isolation," +
+ " because Javacc relies on static fields. Consider removing Javacc from the classpath" +
+ " to improve performance."
+ )
+ withProcessJavaccRunner(action)
+ } else {
+ withClasspathJavaccRunner(action)
+ }
+ }
+
+ private fun withProcessJavaccRunner(action: JavaccRunner.() -> Unit) {
+ action { actionArgs ->
+ val execResult = execOps.javaexec {
+ classpath = javaccClasspath
+ mainClass.set(JAVACC_MAIN_CLASS)
+ args = actionArgs
+ isIgnoreExitValue = true
+ }
+
+ checkJavaccError(execResult.exitValue)
+ }
+ }
+
+ private fun withClasspathJavaccRunner(action: JavaccRunner.() -> Unit) {
+ val workQueue = exec.classLoaderIsolation { classpath.from(javaccClasspath) }
+ action { actionArgs ->
+ workQueue.submit(JavaccRunnerWorkAction::class) { arguments.set(actionArgs) }
+ }
+ workQueue.await()
+ }
+
+ private fun interface JavaccRunner {
+ fun runJavacc(args: List<String>)
+ }
+
+ interface JavaccCommandLineParameters : WorkParameters {
+ val arguments: ListProperty<String>
+ }
+
+ abstract class JavaccRunnerWorkAction @Inject constructor() : WorkAction<JavaccCommandLineParameters> {
+ override fun execute() {
+ Class.forName(JAVACC_MAIN_CLASS)
+ .getMethod("mainProgram", Array<String>::class.java)
+ .invoke(null, parameters.arguments.get().toTypedArray())
+ .let { checkJavaccError(it as Int) }
+ }
+ }
+}
+
+private fun checkJavaccError(errorCode: Int) {
+ if (errorCode != 0) {
+ throw IllegalStateException("Javacc failed with error code: $errorCode")
+ }
+}
diff --git a/buildSrc/src/main/kotlin/freemarker/build/FreemarkerPathExtensions.kt b/buildSrc/src/main/kotlin/freemarker/build/FreemarkerPathExtensions.kt
new file mode 100644
index 0000000..5c60824
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/FreemarkerPathExtensions.kt
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import java.nio.file.Path
+
+fun Path.withChildren(children: List<String>): Path {
+ return children.fold(this) { parent, child -> parent.resolve(child) }
+}
diff --git a/buildSrc/src/main/kotlin/freemarker/build/FreemarkerRootExtension.kt b/buildSrc/src/main/kotlin/freemarker/build/FreemarkerRootExtension.kt
new file mode 100644
index 0000000..6683f0a
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/FreemarkerRootExtension.kt
@@ -0,0 +1,285 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import java.util.concurrent.atomic.AtomicBoolean
+import org.gradle.api.NamedDomainObjectProvider
+import org.gradle.api.Project
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.api.plugins.JavaPlugin
+import org.gradle.api.plugins.JavaPluginExtension
+import org.gradle.api.plugins.JvmTestSuitePlugin
+import org.gradle.api.plugins.jvm.JvmTestSuite
+import org.gradle.api.plugins.jvm.JvmTestSuiteTarget
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.SourceSet
+import org.gradle.api.tasks.bundling.Jar
+import org.gradle.api.tasks.compile.JavaCompile
+import org.gradle.api.tasks.javadoc.Javadoc
+import org.gradle.jvm.toolchain.JavaLanguageVersion
+import org.gradle.jvm.toolchain.JavaToolchainService
+import org.gradle.kotlin.dsl.dependencies
+import org.gradle.kotlin.dsl.named
+import org.gradle.kotlin.dsl.setProperty
+import org.gradle.kotlin.dsl.the
+import org.gradle.language.base.plugins.LifecycleBasePlugin
+import org.gradle.language.jvm.tasks.ProcessResources
+import org.gradle.testing.base.TestingExtension
+
+private const val TEST_UTILS_SOURCE_SET_NAME = "test-utils"
+
+internal class JavaProjectContext constructor(
+ val project: Project
+) {
+ val providers = project.providers
+ val tasks = project.tasks
+ val libs = project.the<VersionCatalogsExtension>().named("libs")
+ val testing = project.the<TestingExtension>()
+ val javaToolchains = project.the<JavaToolchainService>()
+ val java = project.the<JavaPluginExtension>()
+ val sourceSets = java.sourceSets
+
+ val mainSourceSet = sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME).get()
+
+ fun version(versionStr: String): String {
+ return libs
+ .findVersion(versionStr)
+ .orElseThrow { NoSuchElementException("Missing version for $versionStr") }
+ .requiredVersion
+ }
+
+ fun inheritConfig(child: SourceSet, parent: SourceSet, nameProvider: ((SourceSet) -> String)) {
+ val configurations = project.configurations
+ val childConfigRef = configurations.named(nameProvider.invoke(child))
+ childConfigRef.configure {
+ extendsFrom(configurations.named(nameProvider.invoke(parent)).get())
+ }
+ }
+
+ fun inheritCompileRuntime(child: SourceSet, parent: SourceSet) {
+ inheritConfig(child, parent, SourceSet::getCompileClasspathConfigurationName)
+ inheritConfig(child, parent, SourceSet::getRuntimeClasspathConfigurationName)
+ }
+
+ fun inheritCompileRuntimeAndOutput(child: SourceSet, parent: SourceSet) {
+ project.dependencies {
+ add(child.implementationConfigurationName, parent.output)
+ }
+
+ inheritCompileRuntime(child, parent)
+ }
+}
+
+class FreemarkerModuleDef internal constructor(
+ private val context: JavaProjectContext,
+ private val ext: FreemarkerRootExtension,
+ val sourceSetName: String,
+ val compilerVersion: JavaLanguageVersion
+) {
+ val main = sourceSetName == SourceSet.MAIN_SOURCE_SET_NAME
+ val baseDirName = if (main) "core" else sourceSetName
+
+ val sourceSet = context.sourceSets.maybeCreate(sourceSetName)
+
+ val sourceSetRootDirName = "freemarker-${baseDirName}"
+ val sourceSetSrcPath = "${sourceSetRootDirName}/src"
+
+ fun enableTests(testJavaVersion: String = ext.testJavaVersion) {
+ configureTests(JavaLanguageVersion.of(testJavaVersion))
+ }
+
+ private fun configureTests(testJavaVersion: JavaLanguageVersion) {
+ getOrCreateTestSuiteRef().configure {
+ useJUnit(context.version("junit"))
+
+ configureSources(sources, testJavaVersion)
+ targets.all { configureTarget(this, sources, testJavaVersion) }
+ }
+ }
+
+ private fun getOrCreateTestSuiteRef(): NamedDomainObjectProvider<JvmTestSuite> {
+ val suites = context.testing.suites
+ if (main) {
+ return suites.named<JvmTestSuite>(JvmTestSuitePlugin.DEFAULT_TEST_SUITE_NAME)
+ } else {
+ return suites.register("${sourceSetName}Test", JvmTestSuite::class.java)
+ }
+ }
+
+ private fun testUtils(): SourceSet {
+ val testUtilsRef = context.sourceSets.named(TEST_UTILS_SOURCE_SET_NAME)
+ if (!testUtilsRef.isPresent) {
+ throw IllegalStateException("Forgot to configure the ${TEST_UTILS_SOURCE_SET_NAME} source set." +
+ " Call the configureTestUtils method.")
+ }
+ return testUtilsRef.get()
+ }
+
+ private fun configureSources(sources: SourceSet, testJavaVersion: JavaLanguageVersion) {
+ sources.apply {
+ val testSrcPath = "${sourceSetSrcPath}/test"
+ java.setSrcDirs(listOf("${testSrcPath}/java"))
+ resources.setSrcDirs(listOf("${testSrcPath}/resources"))
+
+ if (!main) {
+ context.inheritCompileRuntimeAndOutput(this, sourceSet)
+ }
+
+ context.inheritCompileRuntimeAndOutput(this, testUtils())
+
+ // Because of the compileOnly hacks on the source sets, we have to add the compilation classpath to runtime.
+ val configurations = context.project.configurations
+ configurations.named(runtimeClasspathConfigurationName) {
+ extendsFrom(configurations.named(compileClasspathConfigurationName).get())
+ }
+
+ context.tasks.named<JavaCompile>(compileJavaTaskName) {
+ javaCompiler.set(context.javaToolchains.compilerFor {
+ languageVersion.set(testJavaVersion)
+ })
+ }
+ }
+ }
+
+ private fun configureTarget(target: JvmTestSuiteTarget, sources: SourceSet, testRunnerJavaVersion: JavaLanguageVersion) {
+ target.apply {
+ testTask.configure {
+ description = "Runs the tests in ${sourceSetRootDirName}."
+ val processResourcesName = sources.processResourcesTaskName
+ val resourcesDestDir = context.tasks
+ .named<ProcessResources>(processResourcesName)
+ .get()
+ .destinationDir
+ .toString()
+ systemProperty("freemarker.test.resourcesDir", resourcesDestDir)
+
+ javaLauncher.set(context.javaToolchains.launcherFor {
+ languageVersion.set(testRunnerJavaVersion)
+ })
+ }
+
+ context.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) { dependsOn(testTask) }
+ }
+ }
+}
+
+class FreemarkerRootExtension constructor(
+ project: Project,
+ val versionService: FreemarkerVersionService
+) {
+
+ private val context = JavaProjectContext(project)
+
+ val versionDef = versionService.versionDef
+
+ val javaVersion = context.providers
+ .gradleProperty("freemarker.javaVersion")
+ .get()
+
+ val testJavaVersion = context.providers
+ .gradleProperty("freemarker.test.javaVersion")
+ .get()
+
+ val javadocJavaVersion = context.providers
+ .gradleProperty("freemarker.javadoc.javaVersion")
+ .get()
+
+ val signMethod = context.providers
+ .gradleProperty("freemarker.signMethod")
+ .map { SignatureConfiguration.valueOf(it.uppercase()) }
+ .get()
+
+ private val allConfiguredSourceSetNamesRef = project.objects.setProperty<String>()
+ val allConfiguredSourceSetNames: Provider<Set<String>> = allConfiguredSourceSetNamesRef
+
+ private val tasks = project.tasks
+ private val java = project.the<JavaPluginExtension>()
+ private val sourceSets = java.sourceSets
+ private val testUtilsConfigured = AtomicBoolean(false)
+
+ fun isPublishedVersion(): Boolean {
+ return !versionDef.version.endsWith("-SNAPSHOT") ||
+ !versionDef.displayVersion.contains("-nightly")
+ }
+
+ private fun configureTestUtils() {
+ sourceSets.register(TEST_UTILS_SOURCE_SET_NAME) {
+ val baseDir = "freemarker-${TEST_UTILS_SOURCE_SET_NAME}/src/main"
+ java.setSrcDirs(listOf("${baseDir}/java"))
+ resources.setSrcDirs(listOf("${baseDir}/resources"))
+
+ tasks.named<JavaCompile>(compileJavaTaskName) {
+ javaCompiler.set(context.javaToolchains.compilerFor {
+ languageVersion.set(JavaLanguageVersion.of(testJavaVersion))
+ })
+ }
+ }
+ }
+
+ fun configureSourceSet(
+ sourceSetName: String,
+ configuration: FreemarkerModuleDef.() -> Unit = { }
+ ) {
+ configureSourceSet(sourceSetName, javaVersion, configuration)
+ }
+
+ fun configureSourceSet(
+ sourceSetName: String,
+ sourceSetVersion: String,
+ configuration: FreemarkerModuleDef.() -> Unit = { }
+ ) {
+ if (testUtilsConfigured.compareAndSet(false, true)) {
+ configureTestUtils()
+ }
+
+ allConfiguredSourceSetNamesRef.add(sourceSetName)
+
+ FreemarkerModuleDef(context, this, sourceSetName, JavaLanguageVersion.of(sourceSetVersion)).apply {
+ val sourceSetSrcMainPath = "${sourceSetSrcPath}/main"
+
+ sourceSet.apply {
+ java.setSrcDirs(listOf("${sourceSetSrcMainPath}/java"))
+ resources.setSrcDirs(listOf("${sourceSetSrcMainPath}/resources"))
+ }
+
+ if (!main) {
+ context.apply {
+ inheritCompileRuntimeAndOutput(sourceSet, mainSourceSet)
+
+ tasks.apply {
+ named<Jar>(mainSourceSet.sourcesJarTaskName) { from(sourceSet.allSource) }
+ named<Jar>(JavaPlugin.JAR_TASK_NAME) { from(sourceSet.output) }
+ named<Javadoc>(JavaPlugin.JAVADOC_TASK_NAME) { source(sourceSet.java) }
+ }
+
+ project.dependencies { add(sourceSet.compileOnlyConfigurationName, mainSourceSet.output) }
+ }
+ }
+
+ tasks.named<JavaCompile>(sourceSet.compileJavaTaskName) {
+ javaCompiler.set(context.javaToolchains.compilerFor {
+ languageVersion.set(compilerVersion)
+ })
+ }
+
+ configuration.invoke(this)
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/freemarker/build/FreemarkerRootPlugin.kt b/buildSrc/src/main/kotlin/freemarker/build/FreemarkerRootPlugin.kt
new file mode 100644
index 0000000..bbb2fb0
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/FreemarkerRootPlugin.kt
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import org.apache.tools.ant.filters.ReplaceTokens
+import org.gradle.api.Plugin
+import org.gradle.api.Project
+import org.gradle.api.plugins.JavaPlugin
+import org.gradle.api.plugins.JavaPluginExtension
+import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven
+import org.gradle.api.tasks.SourceSet
+import org.gradle.api.tasks.bundling.Jar
+import org.gradle.jvm.toolchain.JavaLanguageVersion
+import org.gradle.kotlin.dsl.configure
+import org.gradle.kotlin.dsl.filter
+import org.gradle.kotlin.dsl.named
+import org.gradle.kotlin.dsl.the
+import org.gradle.kotlin.dsl.withType
+import org.gradle.language.base.plugins.LifecycleBasePlugin
+import org.gradle.language.jvm.tasks.ProcessResources
+
+open class FreemarkerRootPlugin : Plugin<Project> {
+ private class Configurer(
+ private val project: Project,
+ private val ext: FreemarkerRootExtension
+ ) {
+ private val tasks = project.tasks
+ private val java = project.the<JavaPluginExtension>()
+ private val mainSourceSet = java.sourceSets.named(SourceSet.MAIN_SOURCE_SET_NAME).get()
+
+ fun configure() {
+ project.version = ext.versionDef.version
+ project.extensions.add("freemarkerRoot", ext)
+
+ project.configure<JavaPluginExtension> {
+ withSourcesJar()
+ withJavadocJar()
+
+ toolchain {
+ languageVersion.set(JavaLanguageVersion.of(ext.javaVersion))
+ }
+ }
+
+ tasks.apply {
+ val resourceTemplatesDir = ext.versionService.resourceTemplatesDir
+
+ named<ProcessResources>(JavaPlugin.PROCESS_RESOURCES_TASK_NAME) {
+ with(project.copySpec {
+ from(resourceTemplatesDir)
+ filter<ReplaceTokens>(mapOf("tokens" to ext.versionDef.versionFileTokens))
+ })
+ }
+
+ named<Jar>(mainSourceSet.sourcesJarTaskName) {
+ from(resourceTemplatesDir)
+ }
+
+ withType<org.nosphere.apache.rat.RatTask>() {
+ doLast {
+ println("RAT (${name} task) report was successful: ${reportDir.get().asFile.toPath().resolve("index.html").toUri()}")
+ }
+ }
+ }
+
+ configureReleaseVerification()
+ }
+
+ private fun configureReleaseVerification() {
+ val verifyReleaseSetup = project.tasks.register("verifyReleaseSetup") {
+ group = LifecycleBasePlugin.VERIFICATION_GROUP
+ description = "Basic checks to check to avoid accidental development configuration"
+
+ doLast {
+ if (ext.versionService.developmentBuild) {
+ throw IllegalStateException("The development build configuration is active!")
+ }
+ if (!ext.signMethod.needSignature()) {
+ throw IllegalStateException("Package signing is disabled!")
+ }
+ }
+ }
+
+ if (ext.isPublishedVersion()) {
+ project.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) {
+ dependsOn(verifyReleaseSetup)
+ }
+ }
+
+ project.tasks.withType<AbstractPublishToMaven>() {
+ shouldRunAfter(verifyReleaseSetup)
+ }
+ }
+ }
+
+ override fun apply(project: Project) {
+ project.pluginManager.apply("java-library")
+ project.pluginManager.apply("org.nosphere.apache.rat")
+
+ val versionService = FreemarkerVersionService(project.layout, project.providers)
+ val ext = FreemarkerRootExtension(project, versionService)
+
+ Configurer(project, ext).configure()
+
+ project.afterEvaluate {
+ // We are setting this, so the pom.xml will be generated properly
+ System.setProperty("line.separator", "\n")
+ }
+ }
+}
diff --git a/buildSrc/src/main/kotlin/freemarker/build/FreemarkerVersionService.kt b/buildSrc/src/main/kotlin/freemarker/build/FreemarkerVersionService.kt
new file mode 100644
index 0000000..7a3690f
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/FreemarkerVersionService.kt
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import java.nio.charset.StandardCharsets
+import java.nio.file.Files
+import java.time.Instant
+import java.time.ZoneOffset
+import java.time.format.DateTimeFormatter
+import java.util.Properties
+import org.gradle.api.file.ProjectLayout
+import org.gradle.api.provider.ProviderFactory
+
+private val RESOURCE_TEMPLATES_PATH = listOf("freemarker-core", "src", "main", "resource-templates")
+private val VERSION_PROPERTIES_PATH = listOf("freemarker", "version.properties")
+
+class FreemarkerVersionDef(versionFileTokens: Map<String, String>, versionProperties: Map<String, String>) {
+ val versionFileTokens = versionFileTokens.toMap()
+ val versionProperties = versionProperties.toMap()
+ val version = this.versionProperties["mavenVersion"]!!
+ val displayVersion = this.versionProperties["version"]!!
+}
+
+class FreemarkerVersionService constructor(
+ layout: ProjectLayout,
+ providers: ProviderFactory
+) {
+
+ val developmentBuild = providers
+ .gradleProperty("developmentBuild")
+ .map { it.toBoolean() }
+ .getOrElse(false)
+
+ val buildTimeStamp = if (developmentBuild) Instant.EPOCH else Instant.now()
+
+ val resourceTemplatesDir = layout.projectDirectory.asFile.toPath().withChildren(RESOURCE_TEMPLATES_PATH)
+
+ val versionFileTokens = buildTimeStamp.atOffset(ZoneOffset.UTC).let { buildTimeStampUtc ->
+ mapOf(
+ "timestampNice" to buildTimeStampUtc.format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")),
+ "timestampInVersion" to buildTimeStampUtc.format(DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'"))
+ )
+ }
+
+ val versionDef = run {
+ val versionPropertiesPath = resourceTemplatesDir.withChildren(VERSION_PROPERTIES_PATH)
+
+ val versionPropertiesTemplate = Properties()
+ Files.newBufferedReader(versionPropertiesPath, StandardCharsets.ISO_8859_1).use {
+ versionPropertiesTemplate.load(it)
+ }
+
+ val versionProperties = HashMap<String, String>()
+ versionPropertiesTemplate.forEach { (key, value) ->
+ var updatedValue = value.toString()
+ for (token in versionFileTokens) {
+ updatedValue = updatedValue.replace("@${token.key}@", token.value)
+ }
+ versionProperties[key.toString()] = updatedValue.trim()
+ }
+
+ FreemarkerVersionDef(versionFileTokens, versionProperties)
+ }
+}
diff --git a/buildSrc/src/main/kotlin/freemarker/build/ManualBuildTask.kt b/buildSrc/src/main/kotlin/freemarker/build/ManualBuildTask.kt
new file mode 100644
index 0000000..794762d
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/ManualBuildTask.kt
@@ -0,0 +1,69 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import javax.inject.Inject
+import org.freemarker.docgen.core.Transform
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.ProjectLayout
+import org.gradle.api.model.ObjectFactory
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputDirectory
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.SkipWhenEmpty
+import org.gradle.api.tasks.TaskAction
+import org.gradle.kotlin.dsl.property
+
+open class ManualBuildTask @Inject constructor(
+ layout: ProjectLayout,
+ objects: ObjectFactory
+) : DefaultTask() {
+
+ @InputDirectory
+ @SkipWhenEmpty
+ @PathSensitive(PathSensitivity.NONE)
+ val inputDirectory = objects.directoryProperty()
+
+ @Input
+ val offline = objects.property<Boolean>().value(true)
+
+ @Input
+ val locale = objects.property<String>().value("unknown")
+
+ @OutputDirectory
+ val destinationDirectory = this.offline
+ .zip(layout.buildDirectory) { offlineValue, buildDirValue ->
+ buildDirValue.asFile.toPath().resolve("manual-${if (offlineValue) "offline" else "online"}")
+ }
+ .zip(this.locale) { localelessDirValue, localeValue -> localelessDirValue.resolve(localeValue).toFile() }
+ .let { objects.directoryProperty().value(layout.dir(it)) }
+
+ @TaskAction
+ fun buildManual() {
+ val transform = Transform()
+ transform.offline = offline.get()
+ transform.sourceDirectory = inputDirectory.get().asFile
+ transform.destinationDirectory = destinationDirectory.get().asFile
+
+ transform.execute()
+ }
+}
diff --git a/buildSrc/src/main/kotlin/freemarker/build/SignatureConfiguration.kt b/buildSrc/src/main/kotlin/freemarker/build/SignatureConfiguration.kt
new file mode 100644
index 0000000..12ae3ca
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/SignatureConfiguration.kt
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import org.gradle.plugins.signing.SigningExtension
+
+enum class SignatureConfiguration {
+ NONE,
+ GPG_COMMAND {
+ override fun configure(ext: SigningExtension) {
+ ext.useGpgCmd()
+ }
+ },
+ GRADLE_PROPERTIES;
+
+ fun needSignature() = this != NONE
+
+ open fun configure(ext: SigningExtension) {
+ }
+}
diff --git a/buildSrc/src/main/kotlin/freemarker/build/SignatureTask.kt b/buildSrc/src/main/kotlin/freemarker/build/SignatureTask.kt
new file mode 100644
index 0000000..0b9f094
--- /dev/null
+++ b/buildSrc/src/main/kotlin/freemarker/build/SignatureTask.kt
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.build
+
+import java.io.File
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.model.ObjectFactory
+import org.gradle.api.provider.Property
+import org.gradle.api.provider.Provider
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFile
+import org.gradle.api.tasks.OutputFile
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import org.gradle.kotlin.dsl.property
+import org.gradle.kotlin.dsl.the
+import org.gradle.plugins.signing.SigningExtension
+
+open class SignatureTask @Inject constructor(
+ objects: ObjectFactory
+) : DefaultTask() {
+ @Input
+ val signatureConfiguration: Property<SignatureConfiguration> = objects.property()
+
+ @InputFile
+ @PathSensitive(PathSensitivity.NONE)
+ val inputFile: RegularFileProperty = objects.fileProperty()
+
+ @OutputFile
+ val outputFile: Provider<File> = this.inputFile.map { f -> File("${f.asFile}.asc") }
+
+ private val signing : SigningExtension = project.the()
+
+ @TaskAction
+ fun signFile() {
+ val config = signatureConfiguration.get()
+ if (config.needSignature()) {
+ config.configure(signing)
+ signing.sign(inputFile.get().asFile)
+ }
+ }
+}
diff --git a/build.properties.sample b/buildSrc/src/main/resources/META-INF/gradle-plugins/freemarker-root.properties
similarity index 75%
copy from build.properties.sample
copy to buildSrc/src/main/resources/META-INF/gradle-plugins/freemarker-root.properties
index dd796c3..9ae0053 100644
--- a/build.properties.sample
+++ b/buildSrc/src/main/resources/META-INF/gradle-plugins/freemarker-root.properties
@@ -5,9 +5,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -15,7 +15,4 @@
# specific language governing permissions and limitations
# under the License.
-# Copy this file to "build.properties" before editing!
-boot.classpath.j2se1.8=C:/Program Files/Java/jdk1.8.0_66/jre/lib/rt.jar
-mvnCommand=C:/Program Files (x86)/maven3/bin/mvn.bat
-gpgCommand=C:/Program Files (x86)/GNU/GnuPG/pub/gpg.exe
\ No newline at end of file
+implementation-class=freemarker.build.FreemarkerRootPlugin
diff --git a/src/main/java/freemarker/cache/AndMatcher.java b/freemarker-core/src/main/java/freemarker/cache/AndMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/AndMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/AndMatcher.java
diff --git a/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/CacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/CacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/CacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/CacheStorage.java
diff --git a/src/main/java/freemarker/cache/CacheStorageWithGetSize.java b/freemarker-core/src/main/java/freemarker/cache/CacheStorageWithGetSize.java
similarity index 100%
rename from src/main/java/freemarker/cache/CacheStorageWithGetSize.java
rename to freemarker-core/src/main/java/freemarker/cache/CacheStorageWithGetSize.java
diff --git a/src/main/java/freemarker/cache/ClassTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/ClassTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/ClassTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/ClassTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/ConcurrentCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/ConcurrentCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/ConcurrentCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/ConcurrentCacheStorage.java
diff --git a/src/main/java/freemarker/cache/ConditionalTemplateConfigurationFactory.java b/freemarker-core/src/main/java/freemarker/cache/ConditionalTemplateConfigurationFactory.java
similarity index 100%
rename from src/main/java/freemarker/cache/ConditionalTemplateConfigurationFactory.java
rename to freemarker-core/src/main/java/freemarker/cache/ConditionalTemplateConfigurationFactory.java
diff --git a/src/main/java/freemarker/cache/FileExtensionMatcher.java b/freemarker-core/src/main/java/freemarker/cache/FileExtensionMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/FileExtensionMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/FileExtensionMatcher.java
diff --git a/src/main/java/freemarker/cache/FileNameGlobMatcher.java b/freemarker-core/src/main/java/freemarker/cache/FileNameGlobMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/FileNameGlobMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/FileNameGlobMatcher.java
diff --git a/src/main/java/freemarker/cache/FileTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/FileTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/FileTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/FileTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/FirstMatchTemplateConfigurationFactory.java b/freemarker-core/src/main/java/freemarker/cache/FirstMatchTemplateConfigurationFactory.java
similarity index 100%
rename from src/main/java/freemarker/cache/FirstMatchTemplateConfigurationFactory.java
rename to freemarker-core/src/main/java/freemarker/cache/FirstMatchTemplateConfigurationFactory.java
diff --git a/src/main/java/freemarker/cache/MergingTemplateConfigurationFactory.java b/freemarker-core/src/main/java/freemarker/cache/MergingTemplateConfigurationFactory.java
similarity index 100%
rename from src/main/java/freemarker/cache/MergingTemplateConfigurationFactory.java
rename to freemarker-core/src/main/java/freemarker/cache/MergingTemplateConfigurationFactory.java
diff --git a/src/main/java/freemarker/cache/MruCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/MruCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/MruCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/MruCacheStorage.java
diff --git a/src/main/java/freemarker/cache/MultiTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/MultiTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/MultiTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/MultiTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/NotMatcher.java b/freemarker-core/src/main/java/freemarker/cache/NotMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/NotMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/NotMatcher.java
diff --git a/src/main/java/freemarker/cache/NullCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/NullCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/NullCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/NullCacheStorage.java
diff --git a/src/main/java/freemarker/cache/OrMatcher.java b/freemarker-core/src/main/java/freemarker/cache/OrMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/OrMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/OrMatcher.java
diff --git a/src/main/java/freemarker/cache/PathGlobMatcher.java b/freemarker-core/src/main/java/freemarker/cache/PathGlobMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/PathGlobMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/PathGlobMatcher.java
diff --git a/src/main/java/freemarker/cache/PathRegexMatcher.java b/freemarker-core/src/main/java/freemarker/cache/PathRegexMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/PathRegexMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/PathRegexMatcher.java
diff --git a/src/main/java/freemarker/cache/SoftCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/SoftCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/SoftCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/SoftCacheStorage.java
diff --git a/src/main/java/freemarker/cache/StatefulTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/StatefulTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/StatefulTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/StatefulTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/StringTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/StringTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/StringTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/StringTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/StrongCacheStorage.java b/freemarker-core/src/main/java/freemarker/cache/StrongCacheStorage.java
similarity index 100%
rename from src/main/java/freemarker/cache/StrongCacheStorage.java
rename to freemarker-core/src/main/java/freemarker/cache/StrongCacheStorage.java
diff --git a/src/main/java/freemarker/cache/TemplateCache.java b/freemarker-core/src/main/java/freemarker/cache/TemplateCache.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateCache.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateCache.java
diff --git a/src/main/java/freemarker/cache/TemplateConfigurationFactory.java b/freemarker-core/src/main/java/freemarker/cache/TemplateConfigurationFactory.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateConfigurationFactory.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateConfigurationFactory.java
diff --git a/src/main/java/freemarker/cache/TemplateConfigurationFactoryException.java b/freemarker-core/src/main/java/freemarker/cache/TemplateConfigurationFactoryException.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateConfigurationFactoryException.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateConfigurationFactoryException.java
diff --git a/src/main/java/freemarker/cache/TemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLoader.java
diff --git a/src/main/java/freemarker/cache/TemplateLoaderUtils.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLoaderUtils.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLoaderUtils.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLoaderUtils.java
diff --git a/src/main/java/freemarker/cache/TemplateLookupContext.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLookupContext.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLookupContext.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLookupContext.java
diff --git a/src/main/java/freemarker/cache/TemplateLookupResult.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLookupResult.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLookupResult.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLookupResult.java
diff --git a/src/main/java/freemarker/cache/TemplateLookupStrategy.java b/freemarker-core/src/main/java/freemarker/cache/TemplateLookupStrategy.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateLookupStrategy.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateLookupStrategy.java
diff --git a/src/main/java/freemarker/cache/TemplateNameFormat.java b/freemarker-core/src/main/java/freemarker/cache/TemplateNameFormat.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateNameFormat.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateNameFormat.java
diff --git a/src/main/java/freemarker/cache/TemplateSourceMatcher.java b/freemarker-core/src/main/java/freemarker/cache/TemplateSourceMatcher.java
similarity index 100%
rename from src/main/java/freemarker/cache/TemplateSourceMatcher.java
rename to freemarker-core/src/main/java/freemarker/cache/TemplateSourceMatcher.java
diff --git a/src/main/java/freemarker/cache/URLTemplateLoader.java b/freemarker-core/src/main/java/freemarker/cache/URLTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/URLTemplateLoader.java
rename to freemarker-core/src/main/java/freemarker/cache/URLTemplateLoader.java
diff --git a/src/main/java/freemarker/cache/URLTemplateSource.java b/freemarker-core/src/main/java/freemarker/cache/URLTemplateSource.java
similarity index 100%
rename from src/main/java/freemarker/cache/URLTemplateSource.java
rename to freemarker-core/src/main/java/freemarker/cache/URLTemplateSource.java
diff --git a/src/main/java/freemarker/cache/_CacheAPI.java b/freemarker-core/src/main/java/freemarker/cache/_CacheAPI.java
similarity index 100%
rename from src/main/java/freemarker/cache/_CacheAPI.java
rename to freemarker-core/src/main/java/freemarker/cache/_CacheAPI.java
diff --git a/src/main/java/freemarker/cache/package.html b/freemarker-core/src/main/java/freemarker/cache/package.html
similarity index 100%
rename from src/main/java/freemarker/cache/package.html
rename to freemarker-core/src/main/java/freemarker/cache/package.html
diff --git a/src/main/java/freemarker/core/APINotSupportedTemplateException.java b/freemarker-core/src/main/java/freemarker/core/APINotSupportedTemplateException.java
similarity index 100%
rename from src/main/java/freemarker/core/APINotSupportedTemplateException.java
rename to freemarker-core/src/main/java/freemarker/core/APINotSupportedTemplateException.java
diff --git a/src/main/java/freemarker/core/AbstractJSONLikeFormat.java b/freemarker-core/src/main/java/freemarker/core/AbstractJSONLikeFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/AbstractJSONLikeFormat.java
rename to freemarker-core/src/main/java/freemarker/core/AbstractJSONLikeFormat.java
diff --git a/src/main/java/freemarker/core/AddConcatExpression.java b/freemarker-core/src/main/java/freemarker/core/AddConcatExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/AddConcatExpression.java
rename to freemarker-core/src/main/java/freemarker/core/AddConcatExpression.java
diff --git a/src/main/java/freemarker/core/AliasTargetTemplateValueFormatException.java b/freemarker-core/src/main/java/freemarker/core/AliasTargetTemplateValueFormatException.java
similarity index 100%
rename from src/main/java/freemarker/core/AliasTargetTemplateValueFormatException.java
rename to freemarker-core/src/main/java/freemarker/core/AliasTargetTemplateValueFormatException.java
diff --git a/src/main/java/freemarker/core/AliasTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/AliasTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/AliasTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/AliasTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/AliasTemplateNumberFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/AliasTemplateNumberFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/AliasTemplateNumberFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/AliasTemplateNumberFormatFactory.java
diff --git a/src/main/java/freemarker/core/AndExpression.java b/freemarker-core/src/main/java/freemarker/core/AndExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/AndExpression.java
rename to freemarker-core/src/main/java/freemarker/core/AndExpression.java
diff --git a/src/main/java/freemarker/core/ArithmeticEngine.java b/freemarker-core/src/main/java/freemarker/core/ArithmeticEngine.java
similarity index 100%
rename from src/main/java/freemarker/core/ArithmeticEngine.java
rename to freemarker-core/src/main/java/freemarker/core/ArithmeticEngine.java
diff --git a/src/main/java/freemarker/core/ArithmeticExpression.java b/freemarker-core/src/main/java/freemarker/core/ArithmeticExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/ArithmeticExpression.java
rename to freemarker-core/src/main/java/freemarker/core/ArithmeticExpression.java
diff --git a/src/main/java/freemarker/core/Assignment.java b/freemarker-core/src/main/java/freemarker/core/Assignment.java
similarity index 100%
rename from src/main/java/freemarker/core/Assignment.java
rename to freemarker-core/src/main/java/freemarker/core/Assignment.java
diff --git a/src/main/java/freemarker/core/AssignmentInstruction.java b/freemarker-core/src/main/java/freemarker/core/AssignmentInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/AssignmentInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/AssignmentInstruction.java
diff --git a/src/main/java/freemarker/core/AttemptBlock.java b/freemarker-core/src/main/java/freemarker/core/AttemptBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/AttemptBlock.java
rename to freemarker-core/src/main/java/freemarker/core/AttemptBlock.java
diff --git a/src/main/java/freemarker/core/AutoEscBlock.java b/freemarker-core/src/main/java/freemarker/core/AutoEscBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/AutoEscBlock.java
rename to freemarker-core/src/main/java/freemarker/core/AutoEscBlock.java
diff --git a/src/main/java/freemarker/core/BackwardCompatibleTemplateNumberFormat.java b/freemarker-core/src/main/java/freemarker/core/BackwardCompatibleTemplateNumberFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/BackwardCompatibleTemplateNumberFormat.java
rename to freemarker-core/src/main/java/freemarker/core/BackwardCompatibleTemplateNumberFormat.java
diff --git a/src/main/java/freemarker/core/BlockAssignment.java b/freemarker-core/src/main/java/freemarker/core/BlockAssignment.java
similarity index 100%
rename from src/main/java/freemarker/core/BlockAssignment.java
rename to freemarker-core/src/main/java/freemarker/core/BlockAssignment.java
diff --git a/src/main/java/freemarker/core/BodyInstruction.java b/freemarker-core/src/main/java/freemarker/core/BodyInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/BodyInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/BodyInstruction.java
diff --git a/src/main/java/freemarker/core/BooleanExpression.java b/freemarker-core/src/main/java/freemarker/core/BooleanExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/BooleanExpression.java
rename to freemarker-core/src/main/java/freemarker/core/BooleanExpression.java
diff --git a/src/main/java/freemarker/core/BooleanLiteral.java b/freemarker-core/src/main/java/freemarker/core/BooleanLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/BooleanLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/BooleanLiteral.java
diff --git a/src/main/java/freemarker/core/BoundedRangeModel.java b/freemarker-core/src/main/java/freemarker/core/BoundedRangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/BoundedRangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/BoundedRangeModel.java
diff --git a/src/main/java/freemarker/core/BreakInstruction.java b/freemarker-core/src/main/java/freemarker/core/BreakInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/BreakInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/BreakInstruction.java
diff --git a/src/main/java/freemarker/core/BreakOrContinueException.java b/freemarker-core/src/main/java/freemarker/core/BreakOrContinueException.java
similarity index 100%
rename from src/main/java/freemarker/core/BreakOrContinueException.java
rename to freemarker-core/src/main/java/freemarker/core/BreakOrContinueException.java
diff --git a/src/main/java/freemarker/core/BugException.java b/freemarker-core/src/main/java/freemarker/core/BugException.java
similarity index 100%
rename from src/main/java/freemarker/core/BugException.java
rename to freemarker-core/src/main/java/freemarker/core/BugException.java
diff --git a/src/main/java/freemarker/core/BuiltIn.java b/freemarker-core/src/main/java/freemarker/core/BuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltIn.java
diff --git a/src/main/java/freemarker/core/BuiltInBannedWhenAutoEscaping.java b/freemarker-core/src/main/java/freemarker/core/BuiltInBannedWhenAutoEscaping.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInBannedWhenAutoEscaping.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInBannedWhenAutoEscaping.java
diff --git a/src/main/java/freemarker/core/BuiltInBannedWhenForcedAutoEscaping.java b/freemarker-core/src/main/java/freemarker/core/BuiltInBannedWhenForcedAutoEscaping.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInBannedWhenForcedAutoEscaping.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInBannedWhenForcedAutoEscaping.java
diff --git a/src/main/java/freemarker/core/BuiltInForDate.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForDate.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForDate.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForDate.java
diff --git a/src/main/java/freemarker/core/BuiltInForHashEx.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForHashEx.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForHashEx.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForHashEx.java
diff --git a/src/main/java/freemarker/core/BuiltInForLegacyEscaping.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForLegacyEscaping.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForLegacyEscaping.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForLegacyEscaping.java
diff --git a/src/main/java/freemarker/core/BuiltInForLoopVariable.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForLoopVariable.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForLoopVariable.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForLoopVariable.java
diff --git a/src/main/java/freemarker/core/BuiltInForMarkupOutput.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForMarkupOutput.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForMarkupOutput.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForMarkupOutput.java
diff --git a/src/main/java/freemarker/core/BuiltInForNode.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForNode.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForNode.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForNode.java
diff --git a/src/main/java/freemarker/core/BuiltInForNodeEx.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForNodeEx.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForNodeEx.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForNodeEx.java
diff --git a/src/main/java/freemarker/core/BuiltInForNumber.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForNumber.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForNumber.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForNumber.java
diff --git a/src/main/java/freemarker/core/BuiltInForSequence.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForSequence.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForSequence.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForSequence.java
diff --git a/src/main/java/freemarker/core/BuiltInForString.java b/freemarker-core/src/main/java/freemarker/core/BuiltInForString.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInForString.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInForString.java
diff --git a/src/main/java/freemarker/core/BuiltInWithDirectCallOptimization.java b/freemarker-core/src/main/java/freemarker/core/BuiltInWithDirectCallOptimization.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInWithDirectCallOptimization.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInWithDirectCallOptimization.java
diff --git a/src/main/java/freemarker/core/BuiltInWithParseTimeParameters.java b/freemarker-core/src/main/java/freemarker/core/BuiltInWithParseTimeParameters.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInWithParseTimeParameters.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInWithParseTimeParameters.java
diff --git a/src/main/java/freemarker/core/BuiltInsForCallables.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForCallables.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForCallables.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForCallables.java
diff --git a/src/main/java/freemarker/core/BuiltInsForDates.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForDates.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForDates.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForDates.java
diff --git a/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
diff --git a/src/main/java/freemarker/core/BuiltInsForHashes.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForHashes.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForHashes.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForHashes.java
diff --git a/src/main/java/freemarker/core/BuiltInsForLoopVariables.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForLoopVariables.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForLoopVariables.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForLoopVariables.java
diff --git a/src/main/java/freemarker/core/BuiltInsForMarkupOutputs.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForMarkupOutputs.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForMarkupOutputs.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForMarkupOutputs.java
diff --git a/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
diff --git a/src/main/java/freemarker/core/BuiltInsForNodes.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForNodes.java
similarity index 98%
rename from src/main/java/freemarker/core/BuiltInsForNodes.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForNodes.java
index ff75b6e..cb863ba 100644
--- a/src/main/java/freemarker/core/BuiltInsForNodes.java
+++ b/freemarker-core/src/main/java/freemarker/core/BuiltInsForNodes.java
@@ -21,7 +21,6 @@
import java.util.List;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.ext.dom._ExtDomApi;
import freemarker.template.SimpleScalar;
import freemarker.template.SimpleSequence;
diff --git a/src/main/java/freemarker/core/BuiltInsForNumbers.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForNumbers.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForNumbers.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForNumbers.java
diff --git a/src/main/java/freemarker/core/BuiltInsForOutputFormatRelated.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForOutputFormatRelated.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForOutputFormatRelated.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForOutputFormatRelated.java
diff --git a/src/main/java/freemarker/core/BuiltInsForSequences.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForSequences.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForSequences.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForSequences.java
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsBasic.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForStringsBasic.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsMisc.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsMisc.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForStringsMisc.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsMisc.java
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
diff --git a/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java b/freemarker-core/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
diff --git a/src/main/java/freemarker/core/BuiltinVariable.java b/freemarker-core/src/main/java/freemarker/core/BuiltinVariable.java
similarity index 100%
rename from src/main/java/freemarker/core/BuiltinVariable.java
rename to freemarker-core/src/main/java/freemarker/core/BuiltinVariable.java
diff --git a/src/main/java/freemarker/core/CFormat.java b/freemarker-core/src/main/java/freemarker/core/CFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CFormat.java
diff --git a/src/main/java/freemarker/core/CSSOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/CSSOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CSSOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CSSOutputFormat.java
diff --git a/src/main/java/freemarker/core/CTemplateNumberFormat.java b/freemarker-core/src/main/java/freemarker/core/CTemplateNumberFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CTemplateNumberFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CTemplateNumberFormat.java
diff --git a/src/main/java/freemarker/core/CallPlaceCustomDataInitializationException.java b/freemarker-core/src/main/java/freemarker/core/CallPlaceCustomDataInitializationException.java
similarity index 100%
rename from src/main/java/freemarker/core/CallPlaceCustomDataInitializationException.java
rename to freemarker-core/src/main/java/freemarker/core/CallPlaceCustomDataInitializationException.java
diff --git a/src/main/java/freemarker/core/Case.java b/freemarker-core/src/main/java/freemarker/core/Case.java
similarity index 100%
rename from src/main/java/freemarker/core/Case.java
rename to freemarker-core/src/main/java/freemarker/core/Case.java
diff --git a/src/main/java/freemarker/core/CollectionAndSequence.java b/freemarker-core/src/main/java/freemarker/core/CollectionAndSequence.java
similarity index 100%
rename from src/main/java/freemarker/core/CollectionAndSequence.java
rename to freemarker-core/src/main/java/freemarker/core/CollectionAndSequence.java
diff --git a/src/main/java/freemarker/core/CombinedMarkupOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/CombinedMarkupOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CombinedMarkupOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CombinedMarkupOutputFormat.java
diff --git a/src/main/java/freemarker/core/CommandLine.java b/freemarker-core/src/main/java/freemarker/core/CommandLine.java
similarity index 100%
rename from src/main/java/freemarker/core/CommandLine.java
rename to freemarker-core/src/main/java/freemarker/core/CommandLine.java
diff --git a/src/main/java/freemarker/core/Comment.java b/freemarker-core/src/main/java/freemarker/core/Comment.java
similarity index 100%
rename from src/main/java/freemarker/core/Comment.java
rename to freemarker-core/src/main/java/freemarker/core/Comment.java
diff --git a/src/main/java/freemarker/core/CommonMarkupOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/CommonMarkupOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/CommonMarkupOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/CommonMarkupOutputFormat.java
diff --git a/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java b/freemarker-core/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
diff --git a/src/main/java/freemarker/core/ComparisonExpression.java b/freemarker-core/src/main/java/freemarker/core/ComparisonExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/ComparisonExpression.java
rename to freemarker-core/src/main/java/freemarker/core/ComparisonExpression.java
diff --git a/src/main/java/freemarker/core/CompressedBlock.java b/freemarker-core/src/main/java/freemarker/core/CompressedBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/CompressedBlock.java
rename to freemarker-core/src/main/java/freemarker/core/CompressedBlock.java
diff --git a/src/main/java/freemarker/core/ConditionalBlock.java b/freemarker-core/src/main/java/freemarker/core/ConditionalBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/ConditionalBlock.java
rename to freemarker-core/src/main/java/freemarker/core/ConditionalBlock.java
diff --git a/src/main/java/freemarker/core/Configurable.java b/freemarker-core/src/main/java/freemarker/core/Configurable.java
similarity index 100%
rename from src/main/java/freemarker/core/Configurable.java
rename to freemarker-core/src/main/java/freemarker/core/Configurable.java
diff --git a/src/main/java/freemarker/core/ContinueInstruction.java b/freemarker-core/src/main/java/freemarker/core/ContinueInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/ContinueInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/ContinueInstruction.java
diff --git a/src/main/java/freemarker/core/CustomAttribute.java b/freemarker-core/src/main/java/freemarker/core/CustomAttribute.java
similarity index 100%
rename from src/main/java/freemarker/core/CustomAttribute.java
rename to freemarker-core/src/main/java/freemarker/core/CustomAttribute.java
diff --git a/src/main/java/freemarker/core/DebugBreak.java b/freemarker-core/src/main/java/freemarker/core/DebugBreak.java
similarity index 100%
rename from src/main/java/freemarker/core/DebugBreak.java
rename to freemarker-core/src/main/java/freemarker/core/DebugBreak.java
diff --git a/src/main/java/freemarker/core/DefaultToExpression.java b/freemarker-core/src/main/java/freemarker/core/DefaultToExpression.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/core/DefaultToExpression.java
rename to freemarker-core/src/main/java/freemarker/core/DefaultToExpression.java
diff --git a/src/main/java/freemarker/core/DefaultTruncateBuiltinAlgorithm.java b/freemarker-core/src/main/java/freemarker/core/DefaultTruncateBuiltinAlgorithm.java
similarity index 100%
rename from src/main/java/freemarker/core/DefaultTruncateBuiltinAlgorithm.java
rename to freemarker-core/src/main/java/freemarker/core/DefaultTruncateBuiltinAlgorithm.java
diff --git a/src/main/java/freemarker/core/DirectiveCallPlace.java b/freemarker-core/src/main/java/freemarker/core/DirectiveCallPlace.java
similarity index 100%
rename from src/main/java/freemarker/core/DirectiveCallPlace.java
rename to freemarker-core/src/main/java/freemarker/core/DirectiveCallPlace.java
diff --git a/src/main/java/freemarker/core/DollarVariable.java b/freemarker-core/src/main/java/freemarker/core/DollarVariable.java
similarity index 100%
rename from src/main/java/freemarker/core/DollarVariable.java
rename to freemarker-core/src/main/java/freemarker/core/DollarVariable.java
diff --git a/src/main/java/freemarker/core/Dot.java b/freemarker-core/src/main/java/freemarker/core/Dot.java
similarity index 100%
rename from src/main/java/freemarker/core/Dot.java
rename to freemarker-core/src/main/java/freemarker/core/Dot.java
diff --git a/src/main/java/freemarker/core/DynamicKeyName.java b/freemarker-core/src/main/java/freemarker/core/DynamicKeyName.java
similarity index 100%
rename from src/main/java/freemarker/core/DynamicKeyName.java
rename to freemarker-core/src/main/java/freemarker/core/DynamicKeyName.java
diff --git a/src/main/java/freemarker/core/ElseOfList.java b/freemarker-core/src/main/java/freemarker/core/ElseOfList.java
similarity index 100%
rename from src/main/java/freemarker/core/ElseOfList.java
rename to freemarker-core/src/main/java/freemarker/core/ElseOfList.java
diff --git a/src/main/java/freemarker/core/Environment.java b/freemarker-core/src/main/java/freemarker/core/Environment.java
similarity index 99%
rename from src/main/java/freemarker/core/Environment.java
rename to freemarker-core/src/main/java/freemarker/core/Environment.java
index 66f1214..a24c333 100644
--- a/src/main/java/freemarker/core/Environment.java
+++ b/freemarker-core/src/main/java/freemarker/core/Environment.java
@@ -41,7 +41,6 @@
import java.util.Set;
import java.util.TimeZone;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.cache.TemplateNameFormat;
import freemarker.cache._CacheAPI;
import freemarker.ext.beans.BeansWrapper;
diff --git a/src/main/java/freemarker/core/EscapeBlock.java b/freemarker-core/src/main/java/freemarker/core/EscapeBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/EscapeBlock.java
rename to freemarker-core/src/main/java/freemarker/core/EscapeBlock.java
diff --git a/src/main/java/freemarker/core/EvalUtil.java b/freemarker-core/src/main/java/freemarker/core/EvalUtil.java
similarity index 100%
rename from src/main/java/freemarker/core/EvalUtil.java
rename to freemarker-core/src/main/java/freemarker/core/EvalUtil.java
diff --git a/src/main/java/freemarker/core/ExistsExpression.java b/freemarker-core/src/main/java/freemarker/core/ExistsExpression.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/core/ExistsExpression.java
rename to freemarker-core/src/main/java/freemarker/core/ExistsExpression.java
diff --git a/src/main/java/freemarker/core/Expression.java b/freemarker-core/src/main/java/freemarker/core/Expression.java
similarity index 100%
rename from src/main/java/freemarker/core/Expression.java
rename to freemarker-core/src/main/java/freemarker/core/Expression.java
diff --git a/src/main/java/freemarker/core/ExpressionWithFixedResult.java b/freemarker-core/src/main/java/freemarker/core/ExpressionWithFixedResult.java
similarity index 100%
rename from src/main/java/freemarker/core/ExpressionWithFixedResult.java
rename to freemarker-core/src/main/java/freemarker/core/ExpressionWithFixedResult.java
diff --git a/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java b/freemarker-core/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
similarity index 100%
rename from src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
rename to freemarker-core/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
diff --git a/src/main/java/freemarker/core/FallbackInstruction.java b/freemarker-core/src/main/java/freemarker/core/FallbackInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/FallbackInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/FallbackInstruction.java
diff --git a/src/main/java/freemarker/core/FlowControlException.java b/freemarker-core/src/main/java/freemarker/core/FlowControlException.java
similarity index 100%
rename from src/main/java/freemarker/core/FlowControlException.java
rename to freemarker-core/src/main/java/freemarker/core/FlowControlException.java
diff --git a/src/main/java/freemarker/core/FlushInstruction.java b/freemarker-core/src/main/java/freemarker/core/FlushInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/FlushInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/FlushInstruction.java
diff --git a/src/main/java/freemarker/core/FreeMarkerTree.java b/freemarker-core/src/main/java/freemarker/core/FreeMarkerTree.java
similarity index 100%
rename from src/main/java/freemarker/core/FreeMarkerTree.java
rename to freemarker-core/src/main/java/freemarker/core/FreeMarkerTree.java
diff --git a/src/main/java/freemarker/core/GetOptionalTemplateMethod.java b/freemarker-core/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
similarity index 100%
rename from src/main/java/freemarker/core/GetOptionalTemplateMethod.java
rename to freemarker-core/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
diff --git a/src/main/java/freemarker/core/HTMLOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/HTMLOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/HTMLOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/HTMLOutputFormat.java
diff --git a/src/main/java/freemarker/core/HashLiteral.java b/freemarker-core/src/main/java/freemarker/core/HashLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/HashLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/HashLiteral.java
diff --git a/src/main/java/freemarker/core/ICIChainMember.java b/freemarker-core/src/main/java/freemarker/core/ICIChainMember.java
similarity index 100%
rename from src/main/java/freemarker/core/ICIChainMember.java
rename to freemarker-core/src/main/java/freemarker/core/ICIChainMember.java
diff --git a/src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java
similarity index 99%
rename from src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java
index aeff3c8..9eb50ab 100644
--- a/src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java
+++ b/freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormat.java
@@ -22,7 +22,6 @@
import java.util.Date;
import java.util.TimeZone;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.template.TemplateDateModel;
import freemarker.template.TemplateModelException;
import freemarker.template.utility.DateUtil;
diff --git a/src/main/java/freemarker/core/ISOLikeTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/ISOLikeTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/ISOLikeTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/ISOTemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/ISOTemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/ISOTemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/ISOTemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/ISOTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/ISOTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/ISOTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/ISOTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/Identifier.java b/freemarker-core/src/main/java/freemarker/core/Identifier.java
similarity index 100%
rename from src/main/java/freemarker/core/Identifier.java
rename to freemarker-core/src/main/java/freemarker/core/Identifier.java
diff --git a/src/main/java/freemarker/core/IfBlock.java b/freemarker-core/src/main/java/freemarker/core/IfBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/IfBlock.java
rename to freemarker-core/src/main/java/freemarker/core/IfBlock.java
diff --git a/src/main/java/freemarker/core/Include.java b/freemarker-core/src/main/java/freemarker/core/Include.java
similarity index 100%
rename from src/main/java/freemarker/core/Include.java
rename to freemarker-core/src/main/java/freemarker/core/Include.java
diff --git a/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java b/freemarker-core/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
diff --git a/src/main/java/freemarker/core/Interpolation.java b/freemarker-core/src/main/java/freemarker/core/Interpolation.java
similarity index 100%
rename from src/main/java/freemarker/core/Interpolation.java
rename to freemarker-core/src/main/java/freemarker/core/Interpolation.java
diff --git a/src/main/java/freemarker/core/Interpret.java b/freemarker-core/src/main/java/freemarker/core/Interpret.java
similarity index 100%
rename from src/main/java/freemarker/core/Interpret.java
rename to freemarker-core/src/main/java/freemarker/core/Interpret.java
diff --git a/src/main/java/freemarker/core/InvalidFormatParametersException.java b/freemarker-core/src/main/java/freemarker/core/InvalidFormatParametersException.java
similarity index 100%
rename from src/main/java/freemarker/core/InvalidFormatParametersException.java
rename to freemarker-core/src/main/java/freemarker/core/InvalidFormatParametersException.java
diff --git a/src/main/java/freemarker/core/InvalidFormatStringException.java b/freemarker-core/src/main/java/freemarker/core/InvalidFormatStringException.java
similarity index 100%
rename from src/main/java/freemarker/core/InvalidFormatStringException.java
rename to freemarker-core/src/main/java/freemarker/core/InvalidFormatStringException.java
diff --git a/src/main/java/freemarker/core/InvalidReferenceException.java b/freemarker-core/src/main/java/freemarker/core/InvalidReferenceException.java
similarity index 100%
rename from src/main/java/freemarker/core/InvalidReferenceException.java
rename to freemarker-core/src/main/java/freemarker/core/InvalidReferenceException.java
diff --git a/src/main/java/freemarker/core/Items.java b/freemarker-core/src/main/java/freemarker/core/Items.java
similarity index 100%
rename from src/main/java/freemarker/core/Items.java
rename to freemarker-core/src/main/java/freemarker/core/Items.java
diff --git a/src/main/java/freemarker/core/IteratorBlock.java b/freemarker-core/src/main/java/freemarker/core/IteratorBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/IteratorBlock.java
rename to freemarker-core/src/main/java/freemarker/core/IteratorBlock.java
diff --git a/src/main/java/freemarker/core/JSONCFormat.java b/freemarker-core/src/main/java/freemarker/core/JSONCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JSONCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JSONCFormat.java
diff --git a/src/main/java/freemarker/core/JSONOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/JSONOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JSONOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JSONOutputFormat.java
diff --git a/src/main/java/freemarker/core/JSONParser.java b/freemarker-core/src/main/java/freemarker/core/JSONParser.java
similarity index 100%
rename from src/main/java/freemarker/core/JSONParser.java
rename to freemarker-core/src/main/java/freemarker/core/JSONParser.java
diff --git a/src/main/java/freemarker/core/JavaCFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaCFormat.java
diff --git a/src/main/java/freemarker/core/JavaScriptCFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaScriptCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaScriptCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaScriptCFormat.java
diff --git a/src/main/java/freemarker/core/JavaScriptOrJSONCFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaScriptOrJSONCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaScriptOrJSONCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaScriptOrJSONCFormat.java
diff --git a/src/main/java/freemarker/core/JavaScriptOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaScriptOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaScriptOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaScriptOutputFormat.java
diff --git a/src/main/java/freemarker/core/JavaTemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaTemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaTemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaTemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/JavaTemplateNumberFormat.java b/freemarker-core/src/main/java/freemarker/core/JavaTemplateNumberFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaTemplateNumberFormat.java
rename to freemarker-core/src/main/java/freemarker/core/JavaTemplateNumberFormat.java
diff --git a/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModel.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModel.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModel.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModel.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelEx.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelEx.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelEx.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelEx.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithUnknownSize.java b/freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithUnknownSize.java
similarity index 100%
rename from src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithUnknownSize.java
rename to freemarker-core/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithUnknownSize.java
diff --git a/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java b/freemarker-core/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
similarity index 100%
rename from src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
rename to freemarker-core/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
diff --git a/src/main/java/freemarker/core/LazySequenceIterator.java b/freemarker-core/src/main/java/freemarker/core/LazySequenceIterator.java
similarity index 100%
rename from src/main/java/freemarker/core/LazySequenceIterator.java
rename to freemarker-core/src/main/java/freemarker/core/LazySequenceIterator.java
diff --git a/src/main/java/freemarker/core/LegacyCFormat.java b/freemarker-core/src/main/java/freemarker/core/LegacyCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/LegacyCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/LegacyCFormat.java
diff --git a/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java b/freemarker-core/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
rename to freemarker-core/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
diff --git a/src/main/java/freemarker/core/LibraryLoad.java b/freemarker-core/src/main/java/freemarker/core/LibraryLoad.java
similarity index 100%
rename from src/main/java/freemarker/core/LibraryLoad.java
rename to freemarker-core/src/main/java/freemarker/core/LibraryLoad.java
diff --git a/src/main/java/freemarker/core/ListElseContainer.java b/freemarker-core/src/main/java/freemarker/core/ListElseContainer.java
similarity index 100%
rename from src/main/java/freemarker/core/ListElseContainer.java
rename to freemarker-core/src/main/java/freemarker/core/ListElseContainer.java
diff --git a/src/main/java/freemarker/core/ListLiteral.java b/freemarker-core/src/main/java/freemarker/core/ListLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/ListLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/ListLiteral.java
diff --git a/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java b/freemarker-core/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
diff --git a/src/main/java/freemarker/core/LocalContext.java b/freemarker-core/src/main/java/freemarker/core/LocalContext.java
similarity index 100%
rename from src/main/java/freemarker/core/LocalContext.java
rename to freemarker-core/src/main/java/freemarker/core/LocalContext.java
diff --git a/src/main/java/freemarker/core/LocalContextStack.java b/freemarker-core/src/main/java/freemarker/core/LocalContextStack.java
similarity index 100%
rename from src/main/java/freemarker/core/LocalContextStack.java
rename to freemarker-core/src/main/java/freemarker/core/LocalContextStack.java
diff --git a/src/main/java/freemarker/core/LocalLambdaExpression.java b/freemarker-core/src/main/java/freemarker/core/LocalLambdaExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/LocalLambdaExpression.java
rename to freemarker-core/src/main/java/freemarker/core/LocalLambdaExpression.java
diff --git a/src/main/java/freemarker/core/Macro.java b/freemarker-core/src/main/java/freemarker/core/Macro.java
similarity index 100%
rename from src/main/java/freemarker/core/Macro.java
rename to freemarker-core/src/main/java/freemarker/core/Macro.java
diff --git a/src/main/java/freemarker/core/MarkupOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/MarkupOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/MarkupOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/MarkupOutputFormat.java
diff --git a/src/main/java/freemarker/core/MarkupOutputFormatBoundBuiltIn.java b/freemarker-core/src/main/java/freemarker/core/MarkupOutputFormatBoundBuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/MarkupOutputFormatBoundBuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/MarkupOutputFormatBoundBuiltIn.java
diff --git a/src/main/java/freemarker/core/MethodCall.java b/freemarker-core/src/main/java/freemarker/core/MethodCall.java
similarity index 100%
rename from src/main/java/freemarker/core/MethodCall.java
rename to freemarker-core/src/main/java/freemarker/core/MethodCall.java
diff --git a/src/main/java/freemarker/core/MiscUtil.java b/freemarker-core/src/main/java/freemarker/core/MiscUtil.java
similarity index 100%
rename from src/main/java/freemarker/core/MiscUtil.java
rename to freemarker-core/src/main/java/freemarker/core/MiscUtil.java
diff --git a/src/main/java/freemarker/core/MixedContent.java b/freemarker-core/src/main/java/freemarker/core/MixedContent.java
similarity index 100%
rename from src/main/java/freemarker/core/MixedContent.java
rename to freemarker-core/src/main/java/freemarker/core/MixedContent.java
diff --git a/src/main/java/freemarker/core/NestedContentNotSupportedException.java b/freemarker-core/src/main/java/freemarker/core/NestedContentNotSupportedException.java
similarity index 100%
rename from src/main/java/freemarker/core/NestedContentNotSupportedException.java
rename to freemarker-core/src/main/java/freemarker/core/NestedContentNotSupportedException.java
diff --git a/src/main/java/freemarker/core/NewBI.java b/freemarker-core/src/main/java/freemarker/core/NewBI.java
similarity index 100%
rename from src/main/java/freemarker/core/NewBI.java
rename to freemarker-core/src/main/java/freemarker/core/NewBI.java
diff --git a/src/main/java/freemarker/core/NoAutoEscBlock.java b/freemarker-core/src/main/java/freemarker/core/NoAutoEscBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/NoAutoEscBlock.java
rename to freemarker-core/src/main/java/freemarker/core/NoAutoEscBlock.java
diff --git a/src/main/java/freemarker/core/NoEscapeBlock.java b/freemarker-core/src/main/java/freemarker/core/NoEscapeBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/NoEscapeBlock.java
rename to freemarker-core/src/main/java/freemarker/core/NoEscapeBlock.java
diff --git a/src/main/java/freemarker/core/NonBooleanException.java b/freemarker-core/src/main/java/freemarker/core/NonBooleanException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonBooleanException.java
rename to freemarker-core/src/main/java/freemarker/core/NonBooleanException.java
diff --git a/src/main/java/freemarker/core/NonDateException.java b/freemarker-core/src/main/java/freemarker/core/NonDateException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonDateException.java
rename to freemarker-core/src/main/java/freemarker/core/NonDateException.java
diff --git a/src/main/java/freemarker/core/NonExtendedHashException.java b/freemarker-core/src/main/java/freemarker/core/NonExtendedHashException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonExtendedHashException.java
rename to freemarker-core/src/main/java/freemarker/core/NonExtendedHashException.java
diff --git a/src/main/java/freemarker/core/NonExtendedNodeException.java b/freemarker-core/src/main/java/freemarker/core/NonExtendedNodeException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonExtendedNodeException.java
rename to freemarker-core/src/main/java/freemarker/core/NonExtendedNodeException.java
diff --git a/src/main/java/freemarker/core/NonHashException.java b/freemarker-core/src/main/java/freemarker/core/NonHashException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonHashException.java
rename to freemarker-core/src/main/java/freemarker/core/NonHashException.java
diff --git a/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java b/freemarker-core/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
diff --git a/src/main/java/freemarker/core/NonMarkupOutputException.java b/freemarker-core/src/main/java/freemarker/core/NonMarkupOutputException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonMarkupOutputException.java
rename to freemarker-core/src/main/java/freemarker/core/NonMarkupOutputException.java
diff --git a/src/main/java/freemarker/core/NonMethodException.java b/freemarker-core/src/main/java/freemarker/core/NonMethodException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonMethodException.java
rename to freemarker-core/src/main/java/freemarker/core/NonMethodException.java
diff --git a/src/main/java/freemarker/core/NonNamespaceException.java b/freemarker-core/src/main/java/freemarker/core/NonNamespaceException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonNamespaceException.java
rename to freemarker-core/src/main/java/freemarker/core/NonNamespaceException.java
diff --git a/src/main/java/freemarker/core/NonNodeException.java b/freemarker-core/src/main/java/freemarker/core/NonNodeException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonNodeException.java
rename to freemarker-core/src/main/java/freemarker/core/NonNodeException.java
diff --git a/src/main/java/freemarker/core/NonNumericalException.java b/freemarker-core/src/main/java/freemarker/core/NonNumericalException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonNumericalException.java
rename to freemarker-core/src/main/java/freemarker/core/NonNumericalException.java
diff --git a/src/main/java/freemarker/core/NonSequenceException.java b/freemarker-core/src/main/java/freemarker/core/NonSequenceException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonSequenceException.java
rename to freemarker-core/src/main/java/freemarker/core/NonSequenceException.java
diff --git a/src/main/java/freemarker/core/NonSequenceOrCollectionException.java b/freemarker-core/src/main/java/freemarker/core/NonSequenceOrCollectionException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonSequenceOrCollectionException.java
rename to freemarker-core/src/main/java/freemarker/core/NonSequenceOrCollectionException.java
diff --git a/src/main/java/freemarker/core/NonStringException.java b/freemarker-core/src/main/java/freemarker/core/NonStringException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonStringException.java
rename to freemarker-core/src/main/java/freemarker/core/NonStringException.java
diff --git a/src/main/java/freemarker/core/NonStringOrTemplateOutputException.java b/freemarker-core/src/main/java/freemarker/core/NonStringOrTemplateOutputException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonStringOrTemplateOutputException.java
rename to freemarker-core/src/main/java/freemarker/core/NonStringOrTemplateOutputException.java
diff --git a/src/main/java/freemarker/core/NonUserDefinedDirectiveLikeException.java b/freemarker-core/src/main/java/freemarker/core/NonUserDefinedDirectiveLikeException.java
similarity index 100%
rename from src/main/java/freemarker/core/NonUserDefinedDirectiveLikeException.java
rename to freemarker-core/src/main/java/freemarker/core/NonUserDefinedDirectiveLikeException.java
diff --git a/src/main/java/freemarker/core/NotExpression.java b/freemarker-core/src/main/java/freemarker/core/NotExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/NotExpression.java
rename to freemarker-core/src/main/java/freemarker/core/NotExpression.java
diff --git a/src/main/java/freemarker/core/NumberLiteral.java b/freemarker-core/src/main/java/freemarker/core/NumberLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/NumberLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/NumberLiteral.java
diff --git a/src/main/java/freemarker/core/NumericalOutput.java b/freemarker-core/src/main/java/freemarker/core/NumericalOutput.java
similarity index 100%
rename from src/main/java/freemarker/core/NumericalOutput.java
rename to freemarker-core/src/main/java/freemarker/core/NumericalOutput.java
diff --git a/src/main/java/freemarker/core/OptInTemplateClassResolver.java b/freemarker-core/src/main/java/freemarker/core/OptInTemplateClassResolver.java
similarity index 100%
rename from src/main/java/freemarker/core/OptInTemplateClassResolver.java
rename to freemarker-core/src/main/java/freemarker/core/OptInTemplateClassResolver.java
diff --git a/src/main/java/freemarker/core/OrExpression.java b/freemarker-core/src/main/java/freemarker/core/OrExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/OrExpression.java
rename to freemarker-core/src/main/java/freemarker/core/OrExpression.java
diff --git a/src/main/java/freemarker/core/OutputFormat.java b/freemarker-core/src/main/java/freemarker/core/OutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/OutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/OutputFormat.java
diff --git a/src/main/java/freemarker/core/OutputFormatBlock.java b/freemarker-core/src/main/java/freemarker/core/OutputFormatBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/OutputFormatBlock.java
rename to freemarker-core/src/main/java/freemarker/core/OutputFormatBlock.java
diff --git a/src/main/java/freemarker/core/OutputFormatBoundBuiltIn.java b/freemarker-core/src/main/java/freemarker/core/OutputFormatBoundBuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/OutputFormatBoundBuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/OutputFormatBoundBuiltIn.java
diff --git a/src/main/java/freemarker/core/ParameterRole.java b/freemarker-core/src/main/java/freemarker/core/ParameterRole.java
similarity index 100%
rename from src/main/java/freemarker/core/ParameterRole.java
rename to freemarker-core/src/main/java/freemarker/core/ParameterRole.java
diff --git a/src/main/java/freemarker/core/ParentheticalExpression.java b/freemarker-core/src/main/java/freemarker/core/ParentheticalExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/ParentheticalExpression.java
rename to freemarker-core/src/main/java/freemarker/core/ParentheticalExpression.java
diff --git a/src/main/java/freemarker/core/ParseException.java b/freemarker-core/src/main/java/freemarker/core/ParseException.java
similarity index 100%
rename from src/main/java/freemarker/core/ParseException.java
rename to freemarker-core/src/main/java/freemarker/core/ParseException.java
diff --git a/src/main/java/freemarker/core/ParserConfiguration.java b/freemarker-core/src/main/java/freemarker/core/ParserConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/core/ParserConfiguration.java
rename to freemarker-core/src/main/java/freemarker/core/ParserConfiguration.java
diff --git a/src/main/java/freemarker/core/ParsingNotSupportedException.java b/freemarker-core/src/main/java/freemarker/core/ParsingNotSupportedException.java
similarity index 100%
rename from src/main/java/freemarker/core/ParsingNotSupportedException.java
rename to freemarker-core/src/main/java/freemarker/core/ParsingNotSupportedException.java
diff --git a/src/main/java/freemarker/core/PlainTextOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/PlainTextOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/PlainTextOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/PlainTextOutputFormat.java
diff --git a/src/main/java/freemarker/core/PropertySetting.java b/freemarker-core/src/main/java/freemarker/core/PropertySetting.java
similarity index 100%
rename from src/main/java/freemarker/core/PropertySetting.java
rename to freemarker-core/src/main/java/freemarker/core/PropertySetting.java
diff --git a/src/main/java/freemarker/core/RTFOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/RTFOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/RTFOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/RTFOutputFormat.java
diff --git a/src/main/java/freemarker/core/Range.java b/freemarker-core/src/main/java/freemarker/core/Range.java
similarity index 100%
rename from src/main/java/freemarker/core/Range.java
rename to freemarker-core/src/main/java/freemarker/core/Range.java
diff --git a/src/main/java/freemarker/core/RangeModel.java b/freemarker-core/src/main/java/freemarker/core/RangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/RangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/RangeModel.java
diff --git a/src/main/java/freemarker/core/RecoveryBlock.java b/freemarker-core/src/main/java/freemarker/core/RecoveryBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/RecoveryBlock.java
rename to freemarker-core/src/main/java/freemarker/core/RecoveryBlock.java
diff --git a/src/main/java/freemarker/core/RecurseNode.java b/freemarker-core/src/main/java/freemarker/core/RecurseNode.java
similarity index 100%
rename from src/main/java/freemarker/core/RecurseNode.java
rename to freemarker-core/src/main/java/freemarker/core/RecurseNode.java
diff --git a/src/main/java/freemarker/core/RegexpHelper.java b/freemarker-core/src/main/java/freemarker/core/RegexpHelper.java
similarity index 100%
rename from src/main/java/freemarker/core/RegexpHelper.java
rename to freemarker-core/src/main/java/freemarker/core/RegexpHelper.java
diff --git a/src/main/java/freemarker/core/ReturnInstruction.java b/freemarker-core/src/main/java/freemarker/core/ReturnInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/ReturnInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/ReturnInstruction.java
diff --git a/src/main/java/freemarker/core/RightUnboundedRangeModel.java b/freemarker-core/src/main/java/freemarker/core/RightUnboundedRangeModel.java
similarity index 100%
rename from src/main/java/freemarker/core/RightUnboundedRangeModel.java
rename to freemarker-core/src/main/java/freemarker/core/RightUnboundedRangeModel.java
diff --git a/src/main/java/freemarker/core/Sep.java b/freemarker-core/src/main/java/freemarker/core/Sep.java
similarity index 100%
rename from src/main/java/freemarker/core/Sep.java
rename to freemarker-core/src/main/java/freemarker/core/Sep.java
diff --git a/src/main/java/freemarker/core/SequenceIterator.java b/freemarker-core/src/main/java/freemarker/core/SequenceIterator.java
similarity index 100%
rename from src/main/java/freemarker/core/SequenceIterator.java
rename to freemarker-core/src/main/java/freemarker/core/SequenceIterator.java
diff --git a/src/main/java/freemarker/core/SingleIterationCollectionModel.java b/freemarker-core/src/main/java/freemarker/core/SingleIterationCollectionModel.java
similarity index 100%
rename from src/main/java/freemarker/core/SingleIterationCollectionModel.java
rename to freemarker-core/src/main/java/freemarker/core/SingleIterationCollectionModel.java
diff --git a/src/main/java/freemarker/core/SpecialBuiltIn.java b/freemarker-core/src/main/java/freemarker/core/SpecialBuiltIn.java
similarity index 100%
rename from src/main/java/freemarker/core/SpecialBuiltIn.java
rename to freemarker-core/src/main/java/freemarker/core/SpecialBuiltIn.java
diff --git a/src/main/java/freemarker/core/StandardCFormats.java b/freemarker-core/src/main/java/freemarker/core/StandardCFormats.java
similarity index 100%
rename from src/main/java/freemarker/core/StandardCFormats.java
rename to freemarker-core/src/main/java/freemarker/core/StandardCFormats.java
diff --git a/src/main/java/freemarker/core/StopException.java b/freemarker-core/src/main/java/freemarker/core/StopException.java
similarity index 100%
rename from src/main/java/freemarker/core/StopException.java
rename to freemarker-core/src/main/java/freemarker/core/StopException.java
diff --git a/src/main/java/freemarker/core/StopInstruction.java b/freemarker-core/src/main/java/freemarker/core/StopInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/StopInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/StopInstruction.java
diff --git a/src/main/java/freemarker/core/StringArraySequence.java b/freemarker-core/src/main/java/freemarker/core/StringArraySequence.java
similarity index 100%
rename from src/main/java/freemarker/core/StringArraySequence.java
rename to freemarker-core/src/main/java/freemarker/core/StringArraySequence.java
diff --git a/src/main/java/freemarker/core/StringLiteral.java b/freemarker-core/src/main/java/freemarker/core/StringLiteral.java
similarity index 100%
rename from src/main/java/freemarker/core/StringLiteral.java
rename to freemarker-core/src/main/java/freemarker/core/StringLiteral.java
diff --git a/freemarker-core/src/main/java/freemarker/core/SuppressFBWarnings.java b/freemarker-core/src/main/java/freemarker/core/SuppressFBWarnings.java
new file mode 100644
index 0000000..14b8042
--- /dev/null
+++ b/freemarker-core/src/main/java/freemarker/core/SuppressFBWarnings.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.core;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.CLASS)
+@interface SuppressFBWarnings {
+ String[] value() default {};
+ String justification() default "";
+}
diff --git a/src/main/java/freemarker/core/SwitchBlock.java b/freemarker-core/src/main/java/freemarker/core/SwitchBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/SwitchBlock.java
rename to freemarker-core/src/main/java/freemarker/core/SwitchBlock.java
diff --git a/src/main/java/freemarker/core/TemplateClassResolver.java b/freemarker-core/src/main/java/freemarker/core/TemplateClassResolver.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateClassResolver.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateClassResolver.java
diff --git a/src/main/java/freemarker/core/TemplateCombinedMarkupOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateCombinedMarkupOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateCombinedMarkupOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateCombinedMarkupOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateConfiguration.java b/freemarker-core/src/main/java/freemarker/core/TemplateConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateConfiguration.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateConfiguration.java
diff --git a/src/main/java/freemarker/core/TemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/TemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/TemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/TemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/TemplateElement.java b/freemarker-core/src/main/java/freemarker/core/TemplateElement.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateElement.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateElement.java
diff --git a/src/main/java/freemarker/core/TemplateElementArrayBuilder.java b/freemarker-core/src/main/java/freemarker/core/TemplateElementArrayBuilder.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateElementArrayBuilder.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateElementArrayBuilder.java
diff --git a/src/main/java/freemarker/core/TemplateElementsToVisit.java b/freemarker-core/src/main/java/freemarker/core/TemplateElementsToVisit.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateElementsToVisit.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateElementsToVisit.java
diff --git a/src/main/java/freemarker/core/TemplateFormatUtil.java b/freemarker-core/src/main/java/freemarker/core/TemplateFormatUtil.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateFormatUtil.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateFormatUtil.java
diff --git a/src/main/java/freemarker/core/TemplateHTMLOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateHTMLOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateHTMLOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateHTMLOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateMarkupOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateMarkupOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateMarkupOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateMarkupOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateNullModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateNullModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateNullModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateNullModel.java
diff --git a/src/main/java/freemarker/core/TemplateNumberFormat.java b/freemarker-core/src/main/java/freemarker/core/TemplateNumberFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateNumberFormat.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateNumberFormat.java
diff --git a/src/main/java/freemarker/core/TemplateNumberFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/TemplateNumberFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateNumberFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateNumberFormatFactory.java
diff --git a/src/main/java/freemarker/core/TemplateObject.java b/freemarker-core/src/main/java/freemarker/core/TemplateObject.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateObject.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateObject.java
diff --git a/src/main/java/freemarker/core/TemplatePostProcessor.java b/freemarker-core/src/main/java/freemarker/core/TemplatePostProcessor.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplatePostProcessor.java
rename to freemarker-core/src/main/java/freemarker/core/TemplatePostProcessor.java
diff --git a/src/main/java/freemarker/core/TemplatePostProcessorException.java b/freemarker-core/src/main/java/freemarker/core/TemplatePostProcessorException.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplatePostProcessorException.java
rename to freemarker-core/src/main/java/freemarker/core/TemplatePostProcessorException.java
diff --git a/src/main/java/freemarker/core/TemplateProcessingTracer.java b/freemarker-core/src/main/java/freemarker/core/TemplateProcessingTracer.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateProcessingTracer.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateProcessingTracer.java
diff --git a/src/main/java/freemarker/core/TemplateRTFOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateRTFOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateRTFOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateRTFOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateValueFormat.java b/freemarker-core/src/main/java/freemarker/core/TemplateValueFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateValueFormat.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateValueFormat.java
diff --git a/src/main/java/freemarker/core/TemplateValueFormatException.java b/freemarker-core/src/main/java/freemarker/core/TemplateValueFormatException.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateValueFormatException.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateValueFormatException.java
diff --git a/src/main/java/freemarker/core/TemplateValueFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/TemplateValueFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateValueFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateValueFormatFactory.java
diff --git a/src/main/java/freemarker/core/TemplateXHTMLOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateXHTMLOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateXHTMLOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateXHTMLOutputModel.java
diff --git a/src/main/java/freemarker/core/TemplateXMLOutputModel.java b/freemarker-core/src/main/java/freemarker/core/TemplateXMLOutputModel.java
similarity index 100%
rename from src/main/java/freemarker/core/TemplateXMLOutputModel.java
rename to freemarker-core/src/main/java/freemarker/core/TemplateXMLOutputModel.java
diff --git a/src/main/java/freemarker/core/TextBlock.java b/freemarker-core/src/main/java/freemarker/core/TextBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/TextBlock.java
rename to freemarker-core/src/main/java/freemarker/core/TextBlock.java
diff --git a/src/main/java/freemarker/core/ThreadInterruptionSupportTemplatePostProcessor.java b/freemarker-core/src/main/java/freemarker/core/ThreadInterruptionSupportTemplatePostProcessor.java
similarity index 100%
rename from src/main/java/freemarker/core/ThreadInterruptionSupportTemplatePostProcessor.java
rename to freemarker-core/src/main/java/freemarker/core/ThreadInterruptionSupportTemplatePostProcessor.java
diff --git a/src/main/java/freemarker/core/TokenMgrError.java b/freemarker-core/src/main/java/freemarker/core/TokenMgrError.java
similarity index 100%
rename from src/main/java/freemarker/core/TokenMgrError.java
rename to freemarker-core/src/main/java/freemarker/core/TokenMgrError.java
diff --git a/src/main/java/freemarker/core/TransformBlock.java b/freemarker-core/src/main/java/freemarker/core/TransformBlock.java
similarity index 100%
rename from src/main/java/freemarker/core/TransformBlock.java
rename to freemarker-core/src/main/java/freemarker/core/TransformBlock.java
diff --git a/src/main/java/freemarker/core/TrimInstruction.java b/freemarker-core/src/main/java/freemarker/core/TrimInstruction.java
similarity index 100%
rename from src/main/java/freemarker/core/TrimInstruction.java
rename to freemarker-core/src/main/java/freemarker/core/TrimInstruction.java
diff --git a/src/main/java/freemarker/core/TruncateBuiltinAlgorithm.java b/freemarker-core/src/main/java/freemarker/core/TruncateBuiltinAlgorithm.java
similarity index 100%
rename from src/main/java/freemarker/core/TruncateBuiltinAlgorithm.java
rename to freemarker-core/src/main/java/freemarker/core/TruncateBuiltinAlgorithm.java
diff --git a/src/main/java/freemarker/core/UnaryPlusMinusExpression.java b/freemarker-core/src/main/java/freemarker/core/UnaryPlusMinusExpression.java
similarity index 100%
rename from src/main/java/freemarker/core/UnaryPlusMinusExpression.java
rename to freemarker-core/src/main/java/freemarker/core/UnaryPlusMinusExpression.java
diff --git a/src/main/java/freemarker/core/UncheckedParseException.java b/freemarker-core/src/main/java/freemarker/core/UncheckedParseException.java
similarity index 100%
rename from src/main/java/freemarker/core/UncheckedParseException.java
rename to freemarker-core/src/main/java/freemarker/core/UncheckedParseException.java
diff --git a/src/main/java/freemarker/core/UndefinedCustomFormatException.java b/freemarker-core/src/main/java/freemarker/core/UndefinedCustomFormatException.java
similarity index 100%
rename from src/main/java/freemarker/core/UndefinedCustomFormatException.java
rename to freemarker-core/src/main/java/freemarker/core/UndefinedCustomFormatException.java
diff --git a/src/main/java/freemarker/core/UndefinedOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/UndefinedOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/UndefinedOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/UndefinedOutputFormat.java
diff --git a/src/main/java/freemarker/core/UnexpectedTypeException.java b/freemarker-core/src/main/java/freemarker/core/UnexpectedTypeException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnexpectedTypeException.java
rename to freemarker-core/src/main/java/freemarker/core/UnexpectedTypeException.java
diff --git a/src/main/java/freemarker/core/UnformattableValueException.java b/freemarker-core/src/main/java/freemarker/core/UnformattableValueException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnformattableValueException.java
rename to freemarker-core/src/main/java/freemarker/core/UnformattableValueException.java
diff --git a/src/main/java/freemarker/core/UnifiedCall.java b/freemarker-core/src/main/java/freemarker/core/UnifiedCall.java
similarity index 99%
rename from src/main/java/freemarker/core/UnifiedCall.java
rename to freemarker-core/src/main/java/freemarker/core/UnifiedCall.java
index 5f2d0ba..ec877aa 100644
--- a/src/main/java/freemarker/core/UnifiedCall.java
+++ b/freemarker-core/src/main/java/freemarker/core/UnifiedCall.java
@@ -27,7 +27,6 @@
import java.util.List;
import java.util.Map;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.template.EmptyMap;
import freemarker.template.TemplateDirectiveModel;
import freemarker.template.TemplateException;
diff --git a/src/main/java/freemarker/core/UnknownDateTypeFormattingUnsupportedException.java b/freemarker-core/src/main/java/freemarker/core/UnknownDateTypeFormattingUnsupportedException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnknownDateTypeFormattingUnsupportedException.java
rename to freemarker-core/src/main/java/freemarker/core/UnknownDateTypeFormattingUnsupportedException.java
diff --git a/src/main/java/freemarker/core/UnknownDateTypeParsingUnsupportedException.java b/freemarker-core/src/main/java/freemarker/core/UnknownDateTypeParsingUnsupportedException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnknownDateTypeParsingUnsupportedException.java
rename to freemarker-core/src/main/java/freemarker/core/UnknownDateTypeParsingUnsupportedException.java
diff --git a/src/main/java/freemarker/core/UnparsableValueException.java b/freemarker-core/src/main/java/freemarker/core/UnparsableValueException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnparsableValueException.java
rename to freemarker-core/src/main/java/freemarker/core/UnparsableValueException.java
diff --git a/src/main/java/freemarker/core/UnregisteredOutputFormatException.java b/freemarker-core/src/main/java/freemarker/core/UnregisteredOutputFormatException.java
similarity index 100%
rename from src/main/java/freemarker/core/UnregisteredOutputFormatException.java
rename to freemarker-core/src/main/java/freemarker/core/UnregisteredOutputFormatException.java
diff --git a/src/main/java/freemarker/core/VisitNode.java b/freemarker-core/src/main/java/freemarker/core/VisitNode.java
similarity index 100%
rename from src/main/java/freemarker/core/VisitNode.java
rename to freemarker-core/src/main/java/freemarker/core/VisitNode.java
diff --git a/src/main/java/freemarker/core/XHTMLOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/XHTMLOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/XHTMLOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/XHTMLOutputFormat.java
diff --git a/src/main/java/freemarker/core/XMLOutputFormat.java b/freemarker-core/src/main/java/freemarker/core/XMLOutputFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/XMLOutputFormat.java
rename to freemarker-core/src/main/java/freemarker/core/XMLOutputFormat.java
diff --git a/src/main/java/freemarker/core/XSCFormat.java b/freemarker-core/src/main/java/freemarker/core/XSCFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/XSCFormat.java
rename to freemarker-core/src/main/java/freemarker/core/XSCFormat.java
diff --git a/src/main/java/freemarker/core/XSTemplateDateFormat.java b/freemarker-core/src/main/java/freemarker/core/XSTemplateDateFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/XSTemplateDateFormat.java
rename to freemarker-core/src/main/java/freemarker/core/XSTemplateDateFormat.java
diff --git a/src/main/java/freemarker/core/XSTemplateDateFormatFactory.java b/freemarker-core/src/main/java/freemarker/core/XSTemplateDateFormatFactory.java
similarity index 100%
rename from src/main/java/freemarker/core/XSTemplateDateFormatFactory.java
rename to freemarker-core/src/main/java/freemarker/core/XSTemplateDateFormatFactory.java
diff --git a/src/main/java/freemarker/core/_ArrayEnumeration.java b/freemarker-core/src/main/java/freemarker/core/_ArrayEnumeration.java
similarity index 100%
rename from src/main/java/freemarker/core/_ArrayEnumeration.java
rename to freemarker-core/src/main/java/freemarker/core/_ArrayEnumeration.java
diff --git a/src/main/java/freemarker/core/_ArrayIterator.java b/freemarker-core/src/main/java/freemarker/core/_ArrayIterator.java
similarity index 100%
rename from src/main/java/freemarker/core/_ArrayIterator.java
rename to freemarker-core/src/main/java/freemarker/core/_ArrayIterator.java
diff --git a/src/main/java/freemarker/core/_CoreAPI.java b/freemarker-core/src/main/java/freemarker/core/_CoreAPI.java
similarity index 100%
rename from src/main/java/freemarker/core/_CoreAPI.java
rename to freemarker-core/src/main/java/freemarker/core/_CoreAPI.java
diff --git a/src/main/java/freemarker/core/_CoreLocaleUtils.java b/freemarker-core/src/main/java/freemarker/core/_CoreLocaleUtils.java
similarity index 100%
rename from src/main/java/freemarker/core/_CoreLocaleUtils.java
rename to freemarker-core/src/main/java/freemarker/core/_CoreLocaleUtils.java
diff --git a/src/main/java/freemarker/core/_CoreStringUtils.java b/freemarker-core/src/main/java/freemarker/core/_CoreStringUtils.java
similarity index 100%
rename from src/main/java/freemarker/core/_CoreStringUtils.java
rename to freemarker-core/src/main/java/freemarker/core/_CoreStringUtils.java
diff --git a/src/main/java/freemarker/core/_DelayedAOrAn.java b/freemarker-core/src/main/java/freemarker/core/_DelayedAOrAn.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedAOrAn.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedAOrAn.java
diff --git a/src/main/java/freemarker/core/_DelayedConversionToString.java b/freemarker-core/src/main/java/freemarker/core/_DelayedConversionToString.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedConversionToString.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedConversionToString.java
diff --git a/src/main/java/freemarker/core/_DelayedFTLTypeDescription.java b/freemarker-core/src/main/java/freemarker/core/_DelayedFTLTypeDescription.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedFTLTypeDescription.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedFTLTypeDescription.java
diff --git a/src/main/java/freemarker/core/_DelayedGetCanonicalForm.java b/freemarker-core/src/main/java/freemarker/core/_DelayedGetCanonicalForm.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedGetCanonicalForm.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedGetCanonicalForm.java
diff --git a/src/main/java/freemarker/core/_DelayedGetMessage.java b/freemarker-core/src/main/java/freemarker/core/_DelayedGetMessage.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedGetMessage.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedGetMessage.java
diff --git a/src/main/java/freemarker/core/_DelayedGetMessageWithoutStackTop.java b/freemarker-core/src/main/java/freemarker/core/_DelayedGetMessageWithoutStackTop.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedGetMessageWithoutStackTop.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedGetMessageWithoutStackTop.java
diff --git a/src/main/java/freemarker/core/_DelayedJQuote.java b/freemarker-core/src/main/java/freemarker/core/_DelayedJQuote.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedJQuote.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedJQuote.java
diff --git a/src/main/java/freemarker/core/_DelayedJoinWithComma.java b/freemarker-core/src/main/java/freemarker/core/_DelayedJoinWithComma.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedJoinWithComma.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedJoinWithComma.java
diff --git a/src/main/java/freemarker/core/_DelayedOrdinal.java b/freemarker-core/src/main/java/freemarker/core/_DelayedOrdinal.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedOrdinal.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedOrdinal.java
diff --git a/src/main/java/freemarker/core/_DelayedShortClassName.java b/freemarker-core/src/main/java/freemarker/core/_DelayedShortClassName.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedShortClassName.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedShortClassName.java
diff --git a/src/main/java/freemarker/core/_DelayedToString.java b/freemarker-core/src/main/java/freemarker/core/_DelayedToString.java
similarity index 100%
rename from src/main/java/freemarker/core/_DelayedToString.java
rename to freemarker-core/src/main/java/freemarker/core/_DelayedToString.java
diff --git a/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java b/freemarker-core/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
similarity index 100%
rename from src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
rename to freemarker-core/src/main/java/freemarker/core/_ErrorDescriptionBuilder.java
diff --git a/src/main/java/freemarker/core/_Java16.java b/freemarker-core/src/main/java/freemarker/core/_Java16.java
similarity index 100%
rename from src/main/java/freemarker/core/_Java16.java
rename to freemarker-core/src/main/java/freemarker/core/_Java16.java
diff --git a/src/main/java/freemarker/core/_JavaVersions.java b/freemarker-core/src/main/java/freemarker/core/_JavaVersions.java
similarity index 100%
rename from src/main/java/freemarker/core/_JavaVersions.java
rename to freemarker-core/src/main/java/freemarker/core/_JavaVersions.java
diff --git a/src/main/java/freemarker/core/_MarkupBuilder.java b/freemarker-core/src/main/java/freemarker/core/_MarkupBuilder.java
similarity index 100%
rename from src/main/java/freemarker/core/_MarkupBuilder.java
rename to freemarker-core/src/main/java/freemarker/core/_MarkupBuilder.java
diff --git a/src/main/java/freemarker/core/_MessageUtil.java b/freemarker-core/src/main/java/freemarker/core/_MessageUtil.java
similarity index 100%
rename from src/main/java/freemarker/core/_MessageUtil.java
rename to freemarker-core/src/main/java/freemarker/core/_MessageUtil.java
diff --git a/src/main/java/freemarker/core/_MiscTemplateException.java b/freemarker-core/src/main/java/freemarker/core/_MiscTemplateException.java
similarity index 100%
rename from src/main/java/freemarker/core/_MiscTemplateException.java
rename to freemarker-core/src/main/java/freemarker/core/_MiscTemplateException.java
diff --git a/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluationException.java b/freemarker-core/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluationException.java
similarity index 100%
rename from src/main/java/freemarker/core/_ObjectBuilderSettingEvaluationException.java
rename to freemarker-core/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluationException.java
diff --git a/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluator.java b/freemarker-core/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluator.java
similarity index 100%
rename from src/main/java/freemarker/core/_ObjectBuilderSettingEvaluator.java
rename to freemarker-core/src/main/java/freemarker/core/_ObjectBuilderSettingEvaluator.java
diff --git a/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java b/freemarker-core/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
similarity index 100%
rename from src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
rename to freemarker-core/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
diff --git a/src/main/java/freemarker/core/_SettingEvaluationEnvironment.java b/freemarker-core/src/main/java/freemarker/core/_SettingEvaluationEnvironment.java
similarity index 100%
rename from src/main/java/freemarker/core/_SettingEvaluationEnvironment.java
rename to freemarker-core/src/main/java/freemarker/core/_SettingEvaluationEnvironment.java
diff --git a/src/main/java/freemarker/core/_SortedArraySet.java b/freemarker-core/src/main/java/freemarker/core/_SortedArraySet.java
similarity index 100%
rename from src/main/java/freemarker/core/_SortedArraySet.java
rename to freemarker-core/src/main/java/freemarker/core/_SortedArraySet.java
diff --git a/src/main/java/freemarker/core/_TemplateModelException.java b/freemarker-core/src/main/java/freemarker/core/_TemplateModelException.java
similarity index 100%
rename from src/main/java/freemarker/core/_TemplateModelException.java
rename to freemarker-core/src/main/java/freemarker/core/_TemplateModelException.java
diff --git a/src/main/java/freemarker/core/_TimeZoneBuilder.java b/freemarker-core/src/main/java/freemarker/core/_TimeZoneBuilder.java
similarity index 100%
rename from src/main/java/freemarker/core/_TimeZoneBuilder.java
rename to freemarker-core/src/main/java/freemarker/core/_TimeZoneBuilder.java
diff --git a/src/main/java/freemarker/core/_UnexpectedTypeErrorExplainerTemplateModel.java b/freemarker-core/src/main/java/freemarker/core/_UnexpectedTypeErrorExplainerTemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/core/_UnexpectedTypeErrorExplainerTemplateModel.java
rename to freemarker-core/src/main/java/freemarker/core/_UnexpectedTypeErrorExplainerTemplateModel.java
diff --git a/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java b/freemarker-core/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
similarity index 100%
rename from src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
rename to freemarker-core/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
diff --git a/src/main/java/freemarker/core/_UnmodifiableSet.java b/freemarker-core/src/main/java/freemarker/core/_UnmodifiableSet.java
similarity index 100%
rename from src/main/java/freemarker/core/_UnmodifiableSet.java
rename to freemarker-core/src/main/java/freemarker/core/_UnmodifiableSet.java
diff --git a/src/main/java/freemarker/core/package.html b/freemarker-core/src/main/java/freemarker/core/package.html
similarity index 100%
rename from src/main/java/freemarker/core/package.html
rename to freemarker-core/src/main/java/freemarker/core/package.html
diff --git a/src/main/java/freemarker/debug/Breakpoint.java b/freemarker-core/src/main/java/freemarker/debug/Breakpoint.java
similarity index 100%
rename from src/main/java/freemarker/debug/Breakpoint.java
rename to freemarker-core/src/main/java/freemarker/debug/Breakpoint.java
diff --git a/src/main/java/freemarker/debug/DebugModel.java b/freemarker-core/src/main/java/freemarker/debug/DebugModel.java
similarity index 100%
rename from src/main/java/freemarker/debug/DebugModel.java
rename to freemarker-core/src/main/java/freemarker/debug/DebugModel.java
diff --git a/src/main/java/freemarker/debug/DebuggedEnvironment.java b/freemarker-core/src/main/java/freemarker/debug/DebuggedEnvironment.java
similarity index 100%
rename from src/main/java/freemarker/debug/DebuggedEnvironment.java
rename to freemarker-core/src/main/java/freemarker/debug/DebuggedEnvironment.java
diff --git a/src/main/java/freemarker/debug/Debugger.java b/freemarker-core/src/main/java/freemarker/debug/Debugger.java
similarity index 100%
rename from src/main/java/freemarker/debug/Debugger.java
rename to freemarker-core/src/main/java/freemarker/debug/Debugger.java
diff --git a/src/main/java/freemarker/debug/DebuggerClient.java b/freemarker-core/src/main/java/freemarker/debug/DebuggerClient.java
similarity index 100%
rename from src/main/java/freemarker/debug/DebuggerClient.java
rename to freemarker-core/src/main/java/freemarker/debug/DebuggerClient.java
diff --git a/src/main/java/freemarker/debug/DebuggerListener.java b/freemarker-core/src/main/java/freemarker/debug/DebuggerListener.java
similarity index 100%
rename from src/main/java/freemarker/debug/DebuggerListener.java
rename to freemarker-core/src/main/java/freemarker/debug/DebuggerListener.java
diff --git a/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java b/freemarker-core/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
similarity index 100%
rename from src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
rename to freemarker-core/src/main/java/freemarker/debug/EnvironmentSuspendedEvent.java
diff --git a/src/main/java/freemarker/debug/impl/DebuggerServer.java b/freemarker-core/src/main/java/freemarker/debug/impl/DebuggerServer.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/DebuggerServer.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/DebuggerServer.java
diff --git a/src/main/java/freemarker/debug/impl/DebuggerService.java b/freemarker-core/src/main/java/freemarker/debug/impl/DebuggerService.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/DebuggerService.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/DebuggerService.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
similarity index 99%
rename from src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
index 8719fcb..3bbb3e3 100644
--- a/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
+++ b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
@@ -32,7 +32,6 @@
import java.util.List;
import java.util.Set;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.cache.CacheStorage;
import freemarker.cache.SoftCacheStorage;
import freemarker.core.Configurable;
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
similarity index 100%
rename from src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerService.java b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerService.java
similarity index 99%
rename from src/main/java/freemarker/debug/impl/RmiDebuggerService.java
rename to freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerService.java
index d889af5..72ca88f 100644
--- a/src/main/java/freemarker/debug/impl/RmiDebuggerService.java
+++ b/freemarker-core/src/main/java/freemarker/debug/impl/RmiDebuggerService.java
@@ -35,7 +35,6 @@
import java.util.List;
import java.util.Map;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.core.DebugBreak;
import freemarker.core.Environment;
import freemarker.core.TemplateElement;
diff --git a/freemarker-core/src/main/java/freemarker/debug/impl/SuppressFBWarnings.java b/freemarker-core/src/main/java/freemarker/debug/impl/SuppressFBWarnings.java
new file mode 100644
index 0000000..3059b0c
--- /dev/null
+++ b/freemarker-core/src/main/java/freemarker/debug/impl/SuppressFBWarnings.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.debug.impl;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.CLASS)
+@interface SuppressFBWarnings {
+ String[] value() default {};
+ String justification() default "";
+}
diff --git a/src/main/java/freemarker/debug/package.html b/freemarker-core/src/main/java/freemarker/debug/package.html
similarity index 100%
rename from src/main/java/freemarker/debug/package.html
rename to freemarker-core/src/main/java/freemarker/debug/package.html
diff --git a/src/main/java/freemarker/ext/beans/APIModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/APIModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/APIModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/APIModel.java
diff --git a/src/main/java/freemarker/ext/beans/AllowAllMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/AllowAllMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/AllowAllMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/AllowAllMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/ArgumentTypes.java b/freemarker-core/src/main/java/freemarker/ext/beans/ArgumentTypes.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ArgumentTypes.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ArgumentTypes.java
diff --git a/src/main/java/freemarker/ext/beans/ArrayModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/ArrayModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ArrayModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ArrayModel.java
diff --git a/src/main/java/freemarker/ext/beans/BeanModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeanModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeanModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeanModel.java
diff --git a/src/main/java/freemarker/ext/beans/BeansModelCache.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansModelCache.java
similarity index 97%
rename from src/main/java/freemarker/ext/beans/BeansModelCache.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansModelCache.java
index 99374b6..bc21c9b 100644
--- a/src/main/java/freemarker/ext/beans/BeansModelCache.java
+++ b/freemarker-core/src/main/java/freemarker/ext/beans/BeansModelCache.java
@@ -24,7 +24,6 @@
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.ext.util.ModelCache;
import freemarker.ext.util.ModelFactory;
import freemarker.template.TemplateModel;
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapper.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansWrapper.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapper.java
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperConfiguration.java
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapperSingletonHolder.java b/freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperSingletonHolder.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BeansWrapperSingletonHolder.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BeansWrapperSingletonHolder.java
diff --git a/src/main/java/freemarker/ext/beans/BlacklistMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/BlacklistMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BlacklistMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BlacklistMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/BooleanModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/BooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/BooleanModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/BooleanModel.java
diff --git a/src/main/java/freemarker/ext/beans/CallableMemberDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/CallableMemberDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/CallableMemberDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/CallableMemberDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/CharacterOrString.java b/freemarker-core/src/main/java/freemarker/ext/beans/CharacterOrString.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/CharacterOrString.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/CharacterOrString.java
diff --git a/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
diff --git a/src/main/java/freemarker/ext/beans/ClassChangeNotifier.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassChangeNotifier.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassChangeNotifier.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassChangeNotifier.java
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospector.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospector.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassIntrospector.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospector.java
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
diff --git a/src/main/java/freemarker/ext/beans/ClassMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/ClassMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ClassMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ClassMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/CollectionAdapter.java b/freemarker-core/src/main/java/freemarker/ext/beans/CollectionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/CollectionAdapter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/CollectionAdapter.java
diff --git a/src/main/java/freemarker/ext/beans/CollectionModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/CollectionModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/CollectionModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/CollectionModel.java
diff --git a/src/main/java/freemarker/ext/beans/ConstructorMatcher.java b/freemarker-core/src/main/java/freemarker/ext/beans/ConstructorMatcher.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ConstructorMatcher.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ConstructorMatcher.java
diff --git a/src/main/java/freemarker/ext/beans/DateModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/DateModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/DateModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/DateModel.java
diff --git a/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/EmptyCallableMemberDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/EmptyCallableMemberDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/EmptyCallableMemberDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/EmptyCallableMemberDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/EmptyMemberAndArguments.java b/freemarker-core/src/main/java/freemarker/ext/beans/EmptyMemberAndArguments.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/EmptyMemberAndArguments.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/EmptyMemberAndArguments.java
diff --git a/src/main/java/freemarker/ext/beans/EnumerationModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/EnumerationModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/EnumerationModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/EnumerationModel.java
diff --git a/src/main/java/freemarker/ext/beans/ExecutableMemberSignature.java b/freemarker-core/src/main/java/freemarker/ext/beans/ExecutableMemberSignature.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ExecutableMemberSignature.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ExecutableMemberSignature.java
diff --git a/src/main/java/freemarker/ext/beans/FastPropertyDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/FastPropertyDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/FastPropertyDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/FastPropertyDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/FieldMatcher.java b/freemarker-core/src/main/java/freemarker/ext/beans/FieldMatcher.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/FieldMatcher.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/FieldMatcher.java
diff --git a/src/main/java/freemarker/ext/beans/HashAdapter.java b/freemarker-core/src/main/java/freemarker/ext/beans/HashAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/HashAdapter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/HashAdapter.java
diff --git a/src/main/java/freemarker/ext/beans/InvalidPropertyException.java b/freemarker-core/src/main/java/freemarker/ext/beans/InvalidPropertyException.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/ext/beans/InvalidPropertyException.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/InvalidPropertyException.java
diff --git a/src/main/java/freemarker/ext/beans/IteratorModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/IteratorModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/IteratorModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/IteratorModel.java
diff --git a/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java b/freemarker-core/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
diff --git a/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/MapModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/MapModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MapModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MapModel.java
diff --git a/src/main/java/freemarker/ext/beans/MaybeEmptyCallableMemberDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/MaybeEmptyCallableMemberDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MaybeEmptyCallableMemberDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MaybeEmptyCallableMemberDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/MaybeEmptyMemberAndArguments.java b/freemarker-core/src/main/java/freemarker/ext/beans/MaybeEmptyMemberAndArguments.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MaybeEmptyMemberAndArguments.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MaybeEmptyMemberAndArguments.java
diff --git a/src/main/java/freemarker/ext/beans/MemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/MemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/MemberAndArguments.java b/freemarker-core/src/main/java/freemarker/ext/beans/MemberAndArguments.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MemberAndArguments.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MemberAndArguments.java
diff --git a/src/main/java/freemarker/ext/beans/MemberMatcher.java b/freemarker-core/src/main/java/freemarker/ext/beans/MemberMatcher.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MemberMatcher.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MemberMatcher.java
diff --git a/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/MethodAppearanceFineTuner.java b/freemarker-core/src/main/java/freemarker/ext/beans/MethodAppearanceFineTuner.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MethodAppearanceFineTuner.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MethodAppearanceFineTuner.java
diff --git a/src/main/java/freemarker/ext/beans/MethodMatcher.java b/freemarker-core/src/main/java/freemarker/ext/beans/MethodMatcher.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MethodMatcher.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MethodMatcher.java
diff --git a/src/main/java/freemarker/ext/beans/MethodSorter.java b/freemarker-core/src/main/java/freemarker/ext/beans/MethodSorter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/MethodSorter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/MethodSorter.java
diff --git a/src/main/java/freemarker/ext/beans/NonPrimitiveArrayBackedReadOnlyList.java b/freemarker-core/src/main/java/freemarker/ext/beans/NonPrimitiveArrayBackedReadOnlyList.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/NonPrimitiveArrayBackedReadOnlyList.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/NonPrimitiveArrayBackedReadOnlyList.java
diff --git a/src/main/java/freemarker/ext/beans/NumberModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/NumberModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/NumberModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/NumberModel.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedFixArgsMethods.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedFixArgsMethods.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedFixArgsMethods.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedFixArgsMethods.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedMethods.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethods.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedMethods.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethods.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java
similarity index 99%
rename from src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java
index ea7f091..10488f7 100644
--- a/src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java
+++ b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedMethodsSubset.java
@@ -27,7 +27,6 @@
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.template.TemplateModelException;
import freemarker.template.utility.ClassUtil;
import freemarker.template.utility.NullArgumentException;
diff --git a/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
diff --git a/src/main/java/freemarker/ext/beans/OverloadedVarArgsMethods.java b/freemarker-core/src/main/java/freemarker/ext/beans/OverloadedVarArgsMethods.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/OverloadedVarArgsMethods.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/OverloadedVarArgsMethods.java
diff --git a/src/main/java/freemarker/ext/beans/PrimtiveArrayBackedReadOnlyList.java b/freemarker-core/src/main/java/freemarker/ext/beans/PrimtiveArrayBackedReadOnlyList.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/PrimtiveArrayBackedReadOnlyList.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/PrimtiveArrayBackedReadOnlyList.java
diff --git a/src/main/java/freemarker/ext/beans/ReflectionCallableMemberDescriptor.java b/freemarker-core/src/main/java/freemarker/ext/beans/ReflectionCallableMemberDescriptor.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ReflectionCallableMemberDescriptor.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ReflectionCallableMemberDescriptor.java
diff --git a/src/main/java/freemarker/ext/beans/ResourceBundleModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/ResourceBundleModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/ResourceBundleModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/ResourceBundleModel.java
diff --git a/src/main/java/freemarker/ext/beans/SequenceAdapter.java b/freemarker-core/src/main/java/freemarker/ext/beans/SequenceAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SequenceAdapter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SequenceAdapter.java
diff --git a/src/main/java/freemarker/ext/beans/SetAdapter.java b/freemarker-core/src/main/java/freemarker/ext/beans/SetAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SetAdapter.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SetAdapter.java
diff --git a/src/main/java/freemarker/ext/beans/SimpleMapModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/SimpleMapModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SimpleMapModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SimpleMapModel.java
diff --git a/src/main/java/freemarker/ext/beans/SimpleMethod.java b/freemarker-core/src/main/java/freemarker/ext/beans/SimpleMethod.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SimpleMethod.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SimpleMethod.java
diff --git a/src/main/java/freemarker/ext/beans/SimpleMethodModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/SimpleMethodModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SimpleMethodModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SimpleMethodModel.java
diff --git a/src/main/java/freemarker/ext/beans/SingletonCustomizer.java b/freemarker-core/src/main/java/freemarker/ext/beans/SingletonCustomizer.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/SingletonCustomizer.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/SingletonCustomizer.java
diff --git a/src/main/java/freemarker/ext/beans/StaticModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/StaticModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/StaticModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/StaticModel.java
diff --git a/src/main/java/freemarker/ext/beans/StaticModels.java b/freemarker-core/src/main/java/freemarker/ext/beans/StaticModels.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/StaticModels.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/StaticModels.java
diff --git a/src/main/java/freemarker/ext/beans/StringModel.java b/freemarker-core/src/main/java/freemarker/ext/beans/StringModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/StringModel.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/StringModel.java
diff --git a/freemarker-core/src/main/java/freemarker/ext/beans/SuppressFBWarnings.java b/freemarker-core/src/main/java/freemarker/ext/beans/SuppressFBWarnings.java
new file mode 100644
index 0000000..0174640
--- /dev/null
+++ b/freemarker-core/src/main/java/freemarker/ext/beans/SuppressFBWarnings.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.ext.beans;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.CLASS)
+@interface SuppressFBWarnings {
+ String[] value() default {};
+ String justification() default "";
+}
diff --git a/src/main/java/freemarker/ext/beans/TemplateAccessible.java b/freemarker-core/src/main/java/freemarker/ext/beans/TemplateAccessible.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/TemplateAccessible.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/TemplateAccessible.java
diff --git a/src/main/java/freemarker/ext/beans/TypeFlags.java b/freemarker-core/src/main/java/freemarker/ext/beans/TypeFlags.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/TypeFlags.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/TypeFlags.java
diff --git a/src/main/java/freemarker/ext/beans/WhitelistMemberAccessPolicy.java b/freemarker-core/src/main/java/freemarker/ext/beans/WhitelistMemberAccessPolicy.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/WhitelistMemberAccessPolicy.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/WhitelistMemberAccessPolicy.java
diff --git a/src/main/java/freemarker/ext/beans/_BeansAPI.java b/freemarker-core/src/main/java/freemarker/ext/beans/_BeansAPI.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/_BeansAPI.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/_BeansAPI.java
diff --git a/src/main/java/freemarker/ext/beans/_EnumModels.java b/freemarker-core/src/main/java/freemarker/ext/beans/_EnumModels.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/_EnumModels.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/_EnumModels.java
diff --git a/src/main/java/freemarker/ext/beans/_MethodUtil.java b/freemarker-core/src/main/java/freemarker/ext/beans/_MethodUtil.java
similarity index 100%
rename from src/main/java/freemarker/ext/beans/_MethodUtil.java
rename to freemarker-core/src/main/java/freemarker/ext/beans/_MethodUtil.java
diff --git a/src/main/java/freemarker/ext/beans/package.html b/freemarker-core/src/main/java/freemarker/ext/beans/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/beans/package.html
rename to freemarker-core/src/main/java/freemarker/ext/beans/package.html
diff --git a/src/main/java/freemarker/ext/dom/AtAtKey.java b/freemarker-core/src/main/java/freemarker/ext/dom/AtAtKey.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/AtAtKey.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/AtAtKey.java
diff --git a/src/main/java/freemarker/ext/dom/AttributeNodeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/AttributeNodeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/AttributeNodeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/AttributeNodeModel.java
diff --git a/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
diff --git a/src/main/java/freemarker/ext/dom/DocumentModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/DocumentModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/DocumentModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/DocumentModel.java
diff --git a/src/main/java/freemarker/ext/dom/DocumentTypeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/DocumentTypeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/DocumentTypeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/DocumentTypeModel.java
diff --git a/src/main/java/freemarker/ext/dom/DomStringUtil.java b/freemarker-core/src/main/java/freemarker/ext/dom/DomStringUtil.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/DomStringUtil.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/DomStringUtil.java
diff --git a/src/main/java/freemarker/ext/dom/ElementModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/ElementModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/ElementModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/ElementModel.java
diff --git a/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java b/freemarker-core/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
diff --git a/src/main/java/freemarker/ext/dom/NodeListModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/NodeListModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/NodeListModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/NodeListModel.java
diff --git a/src/main/java/freemarker/ext/dom/NodeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/NodeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/NodeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/NodeModel.java
diff --git a/src/main/java/freemarker/ext/dom/NodeOutputter.java b/freemarker-core/src/main/java/freemarker/ext/dom/NodeOutputter.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/NodeOutputter.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/NodeOutputter.java
diff --git a/src/main/java/freemarker/ext/dom/PINodeModel.java b/freemarker-core/src/main/java/freemarker/ext/dom/PINodeModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/PINodeModel.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/PINodeModel.java
diff --git a/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java b/freemarker-core/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
diff --git a/src/main/java/freemarker/ext/dom/Transform.java b/freemarker-core/src/main/java/freemarker/ext/dom/Transform.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/Transform.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/Transform.java
diff --git a/src/main/java/freemarker/ext/dom/XPathSupport.java b/freemarker-core/src/main/java/freemarker/ext/dom/XPathSupport.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/XPathSupport.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/XPathSupport.java
diff --git a/src/main/java/freemarker/ext/dom/XalanXPathSupport.java b/freemarker-core/src/main/java/freemarker/ext/dom/XalanXPathSupport.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/XalanXPathSupport.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/XalanXPathSupport.java
diff --git a/src/main/java/freemarker/ext/dom/_ExtDomApi.java b/freemarker-core/src/main/java/freemarker/ext/dom/_ExtDomApi.java
similarity index 100%
rename from src/main/java/freemarker/ext/dom/_ExtDomApi.java
rename to freemarker-core/src/main/java/freemarker/ext/dom/_ExtDomApi.java
diff --git a/src/main/java/freemarker/ext/dom/package.html b/freemarker-core/src/main/java/freemarker/ext/dom/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/dom/package.html
rename to freemarker-core/src/main/java/freemarker/ext/dom/package.html
diff --git a/src/main/java/freemarker/ext/jdom/NodeListModel.java b/freemarker-core/src/main/java/freemarker/ext/jdom/NodeListModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jdom/NodeListModel.java
rename to freemarker-core/src/main/java/freemarker/ext/jdom/NodeListModel.java
diff --git a/src/main/java/freemarker/ext/jdom/package.html b/freemarker-core/src/main/java/freemarker/ext/jdom/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/jdom/package.html
rename to freemarker-core/src/main/java/freemarker/ext/jdom/package.html
diff --git a/src/main/java/freemarker/ext/package.html b/freemarker-core/src/main/java/freemarker/ext/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/package.html
rename to freemarker-core/src/main/java/freemarker/ext/package.html
diff --git a/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java b/freemarker-core/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
rename to freemarker-core/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
diff --git a/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java b/freemarker-core/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
rename to freemarker-core/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
diff --git a/src/main/java/freemarker/ext/rhino/RhinoWrapper.java b/freemarker-core/src/main/java/freemarker/ext/rhino/RhinoWrapper.java
similarity index 100%
rename from src/main/java/freemarker/ext/rhino/RhinoWrapper.java
rename to freemarker-core/src/main/java/freemarker/ext/rhino/RhinoWrapper.java
diff --git a/src/main/java/freemarker/ext/rhino/package.html b/freemarker-core/src/main/java/freemarker/ext/rhino/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/rhino/package.html
rename to freemarker-core/src/main/java/freemarker/ext/rhino/package.html
diff --git a/src/main/java/freemarker/ext/util/IdentityHashMap.java b/freemarker-core/src/main/java/freemarker/ext/util/IdentityHashMap.java
similarity index 100%
rename from src/main/java/freemarker/ext/util/IdentityHashMap.java
rename to freemarker-core/src/main/java/freemarker/ext/util/IdentityHashMap.java
diff --git a/src/main/java/freemarker/ext/util/ModelCache.java b/freemarker-core/src/main/java/freemarker/ext/util/ModelCache.java
similarity index 100%
rename from src/main/java/freemarker/ext/util/ModelCache.java
rename to freemarker-core/src/main/java/freemarker/ext/util/ModelCache.java
diff --git a/src/main/java/freemarker/ext/util/ModelFactory.java b/freemarker-core/src/main/java/freemarker/ext/util/ModelFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/util/ModelFactory.java
rename to freemarker-core/src/main/java/freemarker/ext/util/ModelFactory.java
diff --git a/src/main/java/freemarker/ext/util/WrapperTemplateModel.java b/freemarker-core/src/main/java/freemarker/ext/util/WrapperTemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/util/WrapperTemplateModel.java
rename to freemarker-core/src/main/java/freemarker/ext/util/WrapperTemplateModel.java
diff --git a/src/main/java/freemarker/ext/util/package.html b/freemarker-core/src/main/java/freemarker/ext/util/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/util/package.html
rename to freemarker-core/src/main/java/freemarker/ext/util/package.html
diff --git a/src/main/java/freemarker/ext/xml/Namespaces.java b/freemarker-core/src/main/java/freemarker/ext/xml/Namespaces.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/Namespaces.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/Namespaces.java
diff --git a/src/main/java/freemarker/ext/xml/Navigator.java b/freemarker-core/src/main/java/freemarker/ext/xml/Navigator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/Navigator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/Navigator.java
diff --git a/src/main/java/freemarker/ext/xml/NodeListModel.java b/freemarker-core/src/main/java/freemarker/ext/xml/NodeListModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/NodeListModel.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/NodeListModel.java
diff --git a/src/main/java/freemarker/ext/xml/NodeOperator.java b/freemarker-core/src/main/java/freemarker/ext/xml/NodeOperator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/NodeOperator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/NodeOperator.java
diff --git a/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java b/freemarker-core/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
diff --git a/src/main/java/freemarker/ext/xml/_DomNavigator.java b/freemarker-core/src/main/java/freemarker/ext/xml/_DomNavigator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/_DomNavigator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/_DomNavigator.java
diff --git a/src/main/java/freemarker/ext/xml/_JaxenNamespaces.java b/freemarker-core/src/main/java/freemarker/ext/xml/_JaxenNamespaces.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/_JaxenNamespaces.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/_JaxenNamespaces.java
diff --git a/src/main/java/freemarker/ext/xml/_JdomNavigator.java b/freemarker-core/src/main/java/freemarker/ext/xml/_JdomNavigator.java
similarity index 100%
rename from src/main/java/freemarker/ext/xml/_JdomNavigator.java
rename to freemarker-core/src/main/java/freemarker/ext/xml/_JdomNavigator.java
diff --git a/src/main/java/freemarker/ext/xml/package.html b/freemarker-core/src/main/java/freemarker/ext/xml/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/xml/package.html
rename to freemarker-core/src/main/java/freemarker/ext/xml/package.html
diff --git a/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
diff --git a/src/main/java/freemarker/log/Logger.java b/freemarker-core/src/main/java/freemarker/log/Logger.java
similarity index 100%
rename from src/main/java/freemarker/log/Logger.java
rename to freemarker-core/src/main/java/freemarker/log/Logger.java
diff --git a/src/main/java/freemarker/log/LoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/LoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/LoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/LoggerFactory.java
diff --git a/src/main/java/freemarker/log/SLF4JLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/SLF4JLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/SLF4JLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/SLF4JLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_AvalonLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_AvalonLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_AvalonLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_AvalonLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_CommonsLoggingLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_JULLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_JULLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_JULLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_JULLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_Log4jLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_Log4jLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_Log4jLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_Log4jLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java b/freemarker-core/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
similarity index 100%
rename from src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
rename to freemarker-core/src/main/java/freemarker/log/_Log4jOverSLF4JTester.java
diff --git a/src/main/java/freemarker/log/_NullLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_NullLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_NullLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_NullLoggerFactory.java
diff --git a/src/main/java/freemarker/log/_SLF4JLoggerFactory.java b/freemarker-core/src/main/java/freemarker/log/_SLF4JLoggerFactory.java
similarity index 100%
rename from src/main/java/freemarker/log/_SLF4JLoggerFactory.java
rename to freemarker-core/src/main/java/freemarker/log/_SLF4JLoggerFactory.java
diff --git a/src/main/java/freemarker/log/package.html b/freemarker-core/src/main/java/freemarker/log/package.html
similarity index 100%
rename from src/main/java/freemarker/log/package.html
rename to freemarker-core/src/main/java/freemarker/log/package.html
diff --git a/src/main/java/freemarker/template/AdapterTemplateModel.java b/freemarker-core/src/main/java/freemarker/template/AdapterTemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/template/AdapterTemplateModel.java
rename to freemarker-core/src/main/java/freemarker/template/AdapterTemplateModel.java
diff --git a/src/main/java/freemarker/template/AttemptExceptionReporter.java b/freemarker-core/src/main/java/freemarker/template/AttemptExceptionReporter.java
similarity index 100%
rename from src/main/java/freemarker/template/AttemptExceptionReporter.java
rename to freemarker-core/src/main/java/freemarker/template/AttemptExceptionReporter.java
diff --git a/src/main/java/freemarker/template/Configuration.java b/freemarker-core/src/main/java/freemarker/template/Configuration.java
similarity index 100%
rename from src/main/java/freemarker/template/Configuration.java
rename to freemarker-core/src/main/java/freemarker/template/Configuration.java
diff --git a/src/main/java/freemarker/template/DefaultArrayAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultArrayAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultArrayAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultArrayAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultEnumerationAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
similarity index 98%
rename from src/main/java/freemarker/template/DefaultEnumerationAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
index fdd0bea..a456440 100644
--- a/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
+++ b/freemarker-core/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
@@ -22,7 +22,6 @@
import java.util.Enumeration;
import java.util.Iterator;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.ext.util.WrapperTemplateModel;
import freemarker.template.utility.ObjectWrapperWithAPISupport;
diff --git a/src/main/java/freemarker/template/DefaultIterableAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultIterableAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultIterableAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultIterableAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultIteratorAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultIteratorAdapter.java
similarity index 98%
rename from src/main/java/freemarker/template/DefaultIteratorAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultIteratorAdapter.java
index 8f8d0c3..50305d0 100644
--- a/src/main/java/freemarker/template/DefaultIteratorAdapter.java
+++ b/freemarker-core/src/main/java/freemarker/template/DefaultIteratorAdapter.java
@@ -22,7 +22,6 @@
import java.io.Serializable;
import java.util.Iterator;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.ext.util.WrapperTemplateModel;
import freemarker.template.utility.ObjectWrapperWithAPISupport;
diff --git a/src/main/java/freemarker/template/DefaultListAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultListAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultListAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultListAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultMapAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultMapAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultMapAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultMapAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java b/freemarker-core/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapper.java b/freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultObjectWrapper.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapper.java
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java b/freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java b/freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
similarity index 100%
rename from src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
rename to freemarker-core/src/main/java/freemarker/template/DefaultObjectWrapperConfiguration.java
diff --git a/src/main/java/freemarker/template/EmptyMap.java b/freemarker-core/src/main/java/freemarker/template/EmptyMap.java
similarity index 100%
rename from src/main/java/freemarker/template/EmptyMap.java
rename to freemarker-core/src/main/java/freemarker/template/EmptyMap.java
diff --git a/src/main/java/freemarker/template/FalseTemplateBooleanModel.java b/freemarker-core/src/main/java/freemarker/template/FalseTemplateBooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/template/FalseTemplateBooleanModel.java
rename to freemarker-core/src/main/java/freemarker/template/FalseTemplateBooleanModel.java
diff --git a/src/main/java/freemarker/template/GeneralPurposeNothing.java b/freemarker-core/src/main/java/freemarker/template/GeneralPurposeNothing.java
similarity index 100%
rename from src/main/java/freemarker/template/GeneralPurposeNothing.java
rename to freemarker-core/src/main/java/freemarker/template/GeneralPurposeNothing.java
diff --git a/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java b/freemarker-core/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
diff --git a/src/main/java/freemarker/template/LocalizedString.java b/freemarker-core/src/main/java/freemarker/template/LocalizedString.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/template/LocalizedString.java
rename to freemarker-core/src/main/java/freemarker/template/LocalizedString.java
diff --git a/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java b/freemarker-core/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
similarity index 100%
rename from src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
rename to freemarker-core/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
diff --git a/src/main/java/freemarker/template/MalformedTemplateNameException.java b/freemarker-core/src/main/java/freemarker/template/MalformedTemplateNameException.java
similarity index 100%
rename from src/main/java/freemarker/template/MalformedTemplateNameException.java
rename to freemarker-core/src/main/java/freemarker/template/MalformedTemplateNameException.java
diff --git a/src/main/java/freemarker/template/MapKeyValuePairIterator.java b/freemarker-core/src/main/java/freemarker/template/MapKeyValuePairIterator.java
similarity index 100%
rename from src/main/java/freemarker/template/MapKeyValuePairIterator.java
rename to freemarker-core/src/main/java/freemarker/template/MapKeyValuePairIterator.java
diff --git a/src/main/java/freemarker/template/ObjectWrapper.java b/freemarker-core/src/main/java/freemarker/template/ObjectWrapper.java
similarity index 98%
rename from src/main/java/freemarker/template/ObjectWrapper.java
rename to freemarker-core/src/main/java/freemarker/template/ObjectWrapper.java
index 71eea17..1739a64 100644
--- a/src/main/java/freemarker/template/ObjectWrapper.java
+++ b/freemarker-core/src/main/java/freemarker/template/ObjectWrapper.java
@@ -22,7 +22,6 @@
import java.util.Map;
import java.util.ResourceBundle;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.ext.beans.BeansWrapper;
import freemarker.ext.beans.BeansWrapperBuilder;
import freemarker.ext.util.WrapperTemplateModel;
diff --git a/src/main/java/freemarker/template/ObjectWrapperAndUnwrapper.java b/freemarker-core/src/main/java/freemarker/template/ObjectWrapperAndUnwrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/ObjectWrapperAndUnwrapper.java
rename to freemarker-core/src/main/java/freemarker/template/ObjectWrapperAndUnwrapper.java
diff --git a/src/main/java/freemarker/template/ResourceBundleLocalizedString.java b/freemarker-core/src/main/java/freemarker/template/ResourceBundleLocalizedString.java
old mode 100755
new mode 100644
similarity index 100%
rename from src/main/java/freemarker/template/ResourceBundleLocalizedString.java
rename to freemarker-core/src/main/java/freemarker/template/ResourceBundleLocalizedString.java
diff --git a/src/main/java/freemarker/template/SerializableTemplateBooleanModel.java b/freemarker-core/src/main/java/freemarker/template/SerializableTemplateBooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/template/SerializableTemplateBooleanModel.java
rename to freemarker-core/src/main/java/freemarker/template/SerializableTemplateBooleanModel.java
diff --git a/src/main/java/freemarker/template/SimpleCollection.java b/freemarker-core/src/main/java/freemarker/template/SimpleCollection.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleCollection.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleCollection.java
diff --git a/src/main/java/freemarker/template/SimpleDate.java b/freemarker-core/src/main/java/freemarker/template/SimpleDate.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleDate.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleDate.java
diff --git a/src/main/java/freemarker/template/SimpleHash.java b/freemarker-core/src/main/java/freemarker/template/SimpleHash.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleHash.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleHash.java
diff --git a/src/main/java/freemarker/template/SimpleList.java b/freemarker-core/src/main/java/freemarker/template/SimpleList.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleList.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleList.java
diff --git a/src/main/java/freemarker/template/SimpleNumber.java b/freemarker-core/src/main/java/freemarker/template/SimpleNumber.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleNumber.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleNumber.java
diff --git a/src/main/java/freemarker/template/SimpleObjectWrapper.java b/freemarker-core/src/main/java/freemarker/template/SimpleObjectWrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleObjectWrapper.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleObjectWrapper.java
diff --git a/src/main/java/freemarker/template/SimpleScalar.java b/freemarker-core/src/main/java/freemarker/template/SimpleScalar.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleScalar.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleScalar.java
diff --git a/src/main/java/freemarker/template/SimpleSequence.java b/freemarker-core/src/main/java/freemarker/template/SimpleSequence.java
similarity index 100%
rename from src/main/java/freemarker/template/SimpleSequence.java
rename to freemarker-core/src/main/java/freemarker/template/SimpleSequence.java
diff --git a/freemarker-core/src/main/java/freemarker/template/SuppressFBWarnings.java b/freemarker-core/src/main/java/freemarker/template/SuppressFBWarnings.java
new file mode 100644
index 0000000..b771c47
--- /dev/null
+++ b/freemarker-core/src/main/java/freemarker/template/SuppressFBWarnings.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.template;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.CLASS)
+@interface SuppressFBWarnings {
+ String[] value() default {};
+ String justification() default "";
+}
diff --git a/src/main/java/freemarker/template/Template.java b/freemarker-core/src/main/java/freemarker/template/Template.java
similarity index 100%
rename from src/main/java/freemarker/template/Template.java
rename to freemarker-core/src/main/java/freemarker/template/Template.java
diff --git a/src/main/java/freemarker/template/TemplateBooleanModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateBooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateBooleanModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateBooleanModel.java
diff --git a/src/main/java/freemarker/template/TemplateCollectionModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateCollectionModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateCollectionModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateCollectionModel.java
diff --git a/src/main/java/freemarker/template/TemplateCollectionModelEx.java b/freemarker-core/src/main/java/freemarker/template/TemplateCollectionModelEx.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateCollectionModelEx.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateCollectionModelEx.java
diff --git a/src/main/java/freemarker/template/TemplateDateModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateDateModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateDateModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateDateModel.java
diff --git a/src/main/java/freemarker/template/TemplateDirectiveBody.java b/freemarker-core/src/main/java/freemarker/template/TemplateDirectiveBody.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateDirectiveBody.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateDirectiveBody.java
diff --git a/src/main/java/freemarker/template/TemplateDirectiveModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateDirectiveModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateDirectiveModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateDirectiveModel.java
diff --git a/src/main/java/freemarker/template/TemplateException.java b/freemarker-core/src/main/java/freemarker/template/TemplateException.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateException.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateException.java
diff --git a/src/main/java/freemarker/template/TemplateExceptionHandler.java b/freemarker-core/src/main/java/freemarker/template/TemplateExceptionHandler.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateExceptionHandler.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateExceptionHandler.java
diff --git a/src/main/java/freemarker/template/TemplateHashModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateHashModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateHashModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateHashModel.java
diff --git a/src/main/java/freemarker/template/TemplateHashModelEx.java b/freemarker-core/src/main/java/freemarker/template/TemplateHashModelEx.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateHashModelEx.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateHashModelEx.java
diff --git a/src/main/java/freemarker/template/TemplateHashModelEx2.java b/freemarker-core/src/main/java/freemarker/template/TemplateHashModelEx2.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateHashModelEx2.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateHashModelEx2.java
diff --git a/src/main/java/freemarker/template/TemplateMethodModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateMethodModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateMethodModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateMethodModel.java
diff --git a/src/main/java/freemarker/template/TemplateMethodModelEx.java b/freemarker-core/src/main/java/freemarker/template/TemplateMethodModelEx.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateMethodModelEx.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateMethodModelEx.java
diff --git a/src/main/java/freemarker/template/TemplateModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModel.java
diff --git a/src/main/java/freemarker/template/TemplateModelAdapter.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelAdapter.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelAdapter.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelAdapter.java
diff --git a/src/main/java/freemarker/template/TemplateModelException.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelException.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelException.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelException.java
diff --git a/src/main/java/freemarker/template/TemplateModelIterator.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelIterator.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelIterator.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelIterator.java
diff --git a/src/main/java/freemarker/template/TemplateModelListSequence.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelListSequence.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelListSequence.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelListSequence.java
diff --git a/src/main/java/freemarker/template/TemplateModelWithAPISupport.java b/freemarker-core/src/main/java/freemarker/template/TemplateModelWithAPISupport.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateModelWithAPISupport.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateModelWithAPISupport.java
diff --git a/src/main/java/freemarker/template/TemplateNodeModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateNodeModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateNodeModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateNodeModel.java
diff --git a/src/main/java/freemarker/template/TemplateNodeModelEx.java b/freemarker-core/src/main/java/freemarker/template/TemplateNodeModelEx.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateNodeModelEx.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateNodeModelEx.java
diff --git a/src/main/java/freemarker/template/TemplateNotFoundException.java b/freemarker-core/src/main/java/freemarker/template/TemplateNotFoundException.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateNotFoundException.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateNotFoundException.java
diff --git a/src/main/java/freemarker/template/TemplateNumberModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateNumberModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateNumberModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateNumberModel.java
diff --git a/src/main/java/freemarker/template/TemplateScalarModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateScalarModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateScalarModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateScalarModel.java
diff --git a/src/main/java/freemarker/template/TemplateSequenceModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateSequenceModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateSequenceModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateSequenceModel.java
diff --git a/src/main/java/freemarker/template/TemplateTransformModel.java b/freemarker-core/src/main/java/freemarker/template/TemplateTransformModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TemplateTransformModel.java
rename to freemarker-core/src/main/java/freemarker/template/TemplateTransformModel.java
diff --git a/src/main/java/freemarker/template/TransformControl.java b/freemarker-core/src/main/java/freemarker/template/TransformControl.java
similarity index 100%
rename from src/main/java/freemarker/template/TransformControl.java
rename to freemarker-core/src/main/java/freemarker/template/TransformControl.java
diff --git a/src/main/java/freemarker/template/TrueTemplateBooleanModel.java b/freemarker-core/src/main/java/freemarker/template/TrueTemplateBooleanModel.java
similarity index 100%
rename from src/main/java/freemarker/template/TrueTemplateBooleanModel.java
rename to freemarker-core/src/main/java/freemarker/template/TrueTemplateBooleanModel.java
diff --git a/src/main/java/freemarker/template/Version.java b/freemarker-core/src/main/java/freemarker/template/Version.java
similarity index 100%
rename from src/main/java/freemarker/template/Version.java
rename to freemarker-core/src/main/java/freemarker/template/Version.java
diff --git a/src/main/java/freemarker/template/WrappingTemplateModel.java b/freemarker-core/src/main/java/freemarker/template/WrappingTemplateModel.java
similarity index 100%
rename from src/main/java/freemarker/template/WrappingTemplateModel.java
rename to freemarker-core/src/main/java/freemarker/template/WrappingTemplateModel.java
diff --git a/src/main/java/freemarker/template/_ObjectWrappers.java b/freemarker-core/src/main/java/freemarker/template/_ObjectWrappers.java
similarity index 100%
rename from src/main/java/freemarker/template/_ObjectWrappers.java
rename to freemarker-core/src/main/java/freemarker/template/_ObjectWrappers.java
diff --git a/src/main/java/freemarker/template/_TemplateAPI.java b/freemarker-core/src/main/java/freemarker/template/_TemplateAPI.java
similarity index 100%
rename from src/main/java/freemarker/template/_TemplateAPI.java
rename to freemarker-core/src/main/java/freemarker/template/_TemplateAPI.java
diff --git a/src/main/java/freemarker/template/_VersionInts.java b/freemarker-core/src/main/java/freemarker/template/_VersionInts.java
similarity index 100%
rename from src/main/java/freemarker/template/_VersionInts.java
rename to freemarker-core/src/main/java/freemarker/template/_VersionInts.java
diff --git a/src/main/java/freemarker/template/package.html b/freemarker-core/src/main/java/freemarker/template/package.html
similarity index 100%
rename from src/main/java/freemarker/template/package.html
rename to freemarker-core/src/main/java/freemarker/template/package.html
diff --git a/src/main/java/freemarker/template/utility/CaptureOutput.java b/freemarker-core/src/main/java/freemarker/template/utility/CaptureOutput.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/CaptureOutput.java
rename to freemarker-core/src/main/java/freemarker/template/utility/CaptureOutput.java
diff --git a/src/main/java/freemarker/template/utility/ClassUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/ClassUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ClassUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ClassUtil.java
diff --git a/src/main/java/freemarker/template/utility/CollectionUtils.java b/freemarker-core/src/main/java/freemarker/template/utility/CollectionUtils.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/CollectionUtils.java
rename to freemarker-core/src/main/java/freemarker/template/utility/CollectionUtils.java
diff --git a/src/main/java/freemarker/template/utility/Collections12.java b/freemarker-core/src/main/java/freemarker/template/utility/Collections12.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/Collections12.java
rename to freemarker-core/src/main/java/freemarker/template/utility/Collections12.java
diff --git a/src/main/java/freemarker/template/utility/Constants.java b/freemarker-core/src/main/java/freemarker/template/utility/Constants.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/Constants.java
rename to freemarker-core/src/main/java/freemarker/template/utility/Constants.java
diff --git a/src/main/java/freemarker/template/utility/DOMNodeModel.java b/freemarker-core/src/main/java/freemarker/template/utility/DOMNodeModel.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/DOMNodeModel.java
rename to freemarker-core/src/main/java/freemarker/template/utility/DOMNodeModel.java
diff --git a/src/main/java/freemarker/template/utility/DateUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/DateUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/DateUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/DateUtil.java
diff --git a/src/main/java/freemarker/template/utility/DeepUnwrap.java b/freemarker-core/src/main/java/freemarker/template/utility/DeepUnwrap.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/DeepUnwrap.java
rename to freemarker-core/src/main/java/freemarker/template/utility/DeepUnwrap.java
diff --git a/src/main/java/freemarker/template/utility/Execute.java b/freemarker-core/src/main/java/freemarker/template/utility/Execute.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/Execute.java
rename to freemarker-core/src/main/java/freemarker/template/utility/Execute.java
diff --git a/src/main/java/freemarker/template/utility/HtmlEscape.java b/freemarker-core/src/main/java/freemarker/template/utility/HtmlEscape.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/HtmlEscape.java
rename to freemarker-core/src/main/java/freemarker/template/utility/HtmlEscape.java
diff --git a/src/main/java/freemarker/template/utility/NormalizeNewlines.java b/freemarker-core/src/main/java/freemarker/template/utility/NormalizeNewlines.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/NormalizeNewlines.java
rename to freemarker-core/src/main/java/freemarker/template/utility/NormalizeNewlines.java
diff --git a/src/main/java/freemarker/template/utility/NullArgumentException.java b/freemarker-core/src/main/java/freemarker/template/utility/NullArgumentException.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/NullArgumentException.java
rename to freemarker-core/src/main/java/freemarker/template/utility/NullArgumentException.java
diff --git a/src/main/java/freemarker/template/utility/NullWriter.java b/freemarker-core/src/main/java/freemarker/template/utility/NullWriter.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/NullWriter.java
rename to freemarker-core/src/main/java/freemarker/template/utility/NullWriter.java
diff --git a/src/main/java/freemarker/template/utility/NumberUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/NumberUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/NumberUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/NumberUtil.java
diff --git a/src/main/java/freemarker/template/utility/ObjectConstructor.java b/freemarker-core/src/main/java/freemarker/template/utility/ObjectConstructor.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ObjectConstructor.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ObjectConstructor.java
diff --git a/src/main/java/freemarker/template/utility/ObjectFactory.java b/freemarker-core/src/main/java/freemarker/template/utility/ObjectFactory.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ObjectFactory.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ObjectFactory.java
diff --git a/src/main/java/freemarker/template/utility/ObjectWrapperWithAPISupport.java b/freemarker-core/src/main/java/freemarker/template/utility/ObjectWrapperWithAPISupport.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ObjectWrapperWithAPISupport.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ObjectWrapperWithAPISupport.java
diff --git a/src/main/java/freemarker/template/utility/OptimizerUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/OptimizerUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/OptimizerUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/OptimizerUtil.java
diff --git a/src/main/java/freemarker/template/utility/RichObjectWrapper.java b/freemarker-core/src/main/java/freemarker/template/utility/RichObjectWrapper.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/RichObjectWrapper.java
rename to freemarker-core/src/main/java/freemarker/template/utility/RichObjectWrapper.java
diff --git a/src/main/java/freemarker/template/utility/SecurityUtilities.java b/freemarker-core/src/main/java/freemarker/template/utility/SecurityUtilities.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/SecurityUtilities.java
rename to freemarker-core/src/main/java/freemarker/template/utility/SecurityUtilities.java
diff --git a/src/main/java/freemarker/template/utility/StandardCompress.java b/freemarker-core/src/main/java/freemarker/template/utility/StandardCompress.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/StandardCompress.java
rename to freemarker-core/src/main/java/freemarker/template/utility/StandardCompress.java
diff --git a/src/main/java/freemarker/template/utility/StringUtil.java b/freemarker-core/src/main/java/freemarker/template/utility/StringUtil.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/StringUtil.java
rename to freemarker-core/src/main/java/freemarker/template/utility/StringUtil.java
diff --git a/src/main/java/freemarker/template/utility/TemplateModelUtils.java b/freemarker-core/src/main/java/freemarker/template/utility/TemplateModelUtils.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/TemplateModelUtils.java
rename to freemarker-core/src/main/java/freemarker/template/utility/TemplateModelUtils.java
diff --git a/src/main/java/freemarker/template/utility/ToCanonical.java b/freemarker-core/src/main/java/freemarker/template/utility/ToCanonical.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/ToCanonical.java
rename to freemarker-core/src/main/java/freemarker/template/utility/ToCanonical.java
diff --git a/src/main/java/freemarker/template/utility/UndeclaredThrowableException.java b/freemarker-core/src/main/java/freemarker/template/utility/UndeclaredThrowableException.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/UndeclaredThrowableException.java
rename to freemarker-core/src/main/java/freemarker/template/utility/UndeclaredThrowableException.java
diff --git a/src/main/java/freemarker/template/utility/UnrecognizedTimeZoneException.java b/freemarker-core/src/main/java/freemarker/template/utility/UnrecognizedTimeZoneException.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/UnrecognizedTimeZoneException.java
rename to freemarker-core/src/main/java/freemarker/template/utility/UnrecognizedTimeZoneException.java
diff --git a/src/main/java/freemarker/template/utility/UnsupportedNumberClassException.java b/freemarker-core/src/main/java/freemarker/template/utility/UnsupportedNumberClassException.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/UnsupportedNumberClassException.java
rename to freemarker-core/src/main/java/freemarker/template/utility/UnsupportedNumberClassException.java
diff --git a/src/main/java/freemarker/template/utility/WriteProtectable.java b/freemarker-core/src/main/java/freemarker/template/utility/WriteProtectable.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/WriteProtectable.java
rename to freemarker-core/src/main/java/freemarker/template/utility/WriteProtectable.java
diff --git a/src/main/java/freemarker/template/utility/XmlEscape.java b/freemarker-core/src/main/java/freemarker/template/utility/XmlEscape.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/XmlEscape.java
rename to freemarker-core/src/main/java/freemarker/template/utility/XmlEscape.java
diff --git a/src/main/java/freemarker/template/utility/package.html b/freemarker-core/src/main/java/freemarker/template/utility/package.html
similarity index 100%
rename from src/main/java/freemarker/template/utility/package.html
rename to freemarker-core/src/main/java/freemarker/template/utility/package.html
diff --git a/src/main/javacc/FTL.jj b/freemarker-core/src/main/javacc/freemarker/core/FTL.jj
similarity index 100%
rename from src/main/javacc/FTL.jj
rename to freemarker-core/src/main/javacc/freemarker/core/FTL.jj
diff --git a/src/main/misc/identifierChars/src/main/freemarker/adhoc/IdentifierCharGenerator.java b/freemarker-core/src/main/misc/identifierChars/src/main/freemarker/adhoc/IdentifierCharGenerator.java
similarity index 100%
rename from src/main/misc/identifierChars/src/main/freemarker/adhoc/IdentifierCharGenerator.java
rename to freemarker-core/src/main/misc/identifierChars/src/main/freemarker/adhoc/IdentifierCharGenerator.java
diff --git a/src/main/misc/overloadedNumberRules/README.txt b/freemarker-core/src/main/misc/overloadedNumberRules/README.txt
similarity index 100%
rename from src/main/misc/overloadedNumberRules/README.txt
rename to freemarker-core/src/main/misc/overloadedNumberRules/README.txt
diff --git a/src/main/misc/overloadedNumberRules/config.fmpp b/freemarker-core/src/main/misc/overloadedNumberRules/config.fmpp
similarity index 100%
rename from src/main/misc/overloadedNumberRules/config.fmpp
rename to freemarker-core/src/main/misc/overloadedNumberRules/config.fmpp
diff --git a/src/main/misc/overloadedNumberRules/generator.ftl b/freemarker-core/src/main/misc/overloadedNumberRules/generator.ftl
similarity index 100%
rename from src/main/misc/overloadedNumberRules/generator.ftl
rename to freemarker-core/src/main/misc/overloadedNumberRules/generator.ftl
diff --git a/src/main/misc/overloadedNumberRules/prices.ods b/freemarker-core/src/main/misc/overloadedNumberRules/prices.ods
similarity index 100%
rename from src/main/misc/overloadedNumberRules/prices.ods
rename to freemarker-core/src/main/misc/overloadedNumberRules/prices.ods
Binary files differ
diff --git a/src/main/resources/freemarker/version.properties b/freemarker-core/src/main/resource-templates/freemarker/version.properties
similarity index 100%
rename from src/main/resources/freemarker/version.properties
rename to freemarker-core/src/main/resource-templates/freemarker/version.properties
diff --git a/src/main/resources/freemarker/ext/beans/DefaultMemberAccessPolicy-rules b/freemarker-core/src/main/resources/freemarker/ext/beans/DefaultMemberAccessPolicy-rules
similarity index 100%
rename from src/main/resources/freemarker/ext/beans/DefaultMemberAccessPolicy-rules
rename to freemarker-core/src/main/resources/freemarker/ext/beans/DefaultMemberAccessPolicy-rules
diff --git a/src/main/resources/freemarker/ext/beans/unsafeMethods.properties b/freemarker-core/src/main/resources/freemarker/ext/beans/unsafeMethods.properties
similarity index 100%
rename from src/main/resources/freemarker/ext/beans/unsafeMethods.properties
rename to freemarker-core/src/main/resources/freemarker/ext/beans/unsafeMethods.properties
diff --git a/src/test/java/freemarker/cache/FileTemplateLoaderTest.java b/freemarker-core/src/test/java/freemarker/cache/FileTemplateLoaderTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/FileTemplateLoaderTest.java
rename to freemarker-core/src/test/java/freemarker/cache/FileTemplateLoaderTest.java
diff --git a/src/test/java/freemarker/cache/MultiTemplateLoaderTest.java b/freemarker-core/src/test/java/freemarker/cache/MultiTemplateLoaderTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/MultiTemplateLoaderTest.java
rename to freemarker-core/src/test/java/freemarker/cache/MultiTemplateLoaderTest.java
diff --git a/src/test/java/freemarker/cache/TemplateCacheTest.java b/freemarker-core/src/test/java/freemarker/cache/TemplateCacheTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/TemplateCacheTest.java
rename to freemarker-core/src/test/java/freemarker/cache/TemplateCacheTest.java
diff --git a/src/test/java/freemarker/cache/TemplateConfigurationFactoryTest.java b/freemarker-core/src/test/java/freemarker/cache/TemplateConfigurationFactoryTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/TemplateConfigurationFactoryTest.java
rename to freemarker-core/src/test/java/freemarker/cache/TemplateConfigurationFactoryTest.java
diff --git a/src/test/java/freemarker/cache/TemplateNameFormatTest.java b/freemarker-core/src/test/java/freemarker/cache/TemplateNameFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/TemplateNameFormatTest.java
rename to freemarker-core/src/test/java/freemarker/cache/TemplateNameFormatTest.java
diff --git a/src/test/java/freemarker/cache/TemplateSourceMatcherTest.java b/freemarker-core/src/test/java/freemarker/cache/TemplateSourceMatcherTest.java
similarity index 100%
rename from src/test/java/freemarker/cache/TemplateSourceMatcherTest.java
rename to freemarker-core/src/test/java/freemarker/cache/TemplateSourceMatcherTest.java
diff --git a/src/test/java/freemarker/core/ASTBasedErrorMessagesTest.java b/freemarker-core/src/test/java/freemarker/core/ASTBasedErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ASTBasedErrorMessagesTest.java
rename to freemarker-core/src/test/java/freemarker/core/ASTBasedErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/ASTTest.java b/freemarker-core/src/test/java/freemarker/core/ASTTest.java
similarity index 96%
rename from src/test/java/freemarker/core/ASTTest.java
rename to freemarker-core/src/test/java/freemarker/core/ASTTest.java
index b1b308e..57aabf5 100644
--- a/src/test/java/freemarker/core/ASTTest.java
+++ b/freemarker-core/src/test/java/freemarker/core/ASTTest.java
@@ -22,11 +22,15 @@
import java.io.FileNotFoundException;
import java.io.IOException;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.core.ASTPrinter.Options;
import freemarker.template.utility.StringUtil;
import freemarker.test.utility.FileTestCase;
import freemarker.test.utility.TestUtil;
+@RunWith(JUnit38ClassRunner.class)
public class ASTTest extends FileTestCase {
public ASTTest(String name) {
diff --git a/src/test/java/freemarker/core/AbsoluteTemplateNameBITest.java b/freemarker-core/src/test/java/freemarker/core/AbsoluteTemplateNameBITest.java
similarity index 100%
rename from src/test/java/freemarker/core/AbsoluteTemplateNameBITest.java
rename to freemarker-core/src/test/java/freemarker/core/AbsoluteTemplateNameBITest.java
diff --git a/src/test/java/freemarker/core/AppMetaTemplateDateFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/AppMetaTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/AppMetaTemplateDateFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/AppMetaTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/ArgsSpecialVariableTest.java b/freemarker-core/src/test/java/freemarker/core/ArgsSpecialVariableTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ArgsSpecialVariableTest.java
rename to freemarker-core/src/test/java/freemarker/core/ArgsSpecialVariableTest.java
diff --git a/src/test/java/freemarker/core/ArithmeticEngineTest.java b/freemarker-core/src/test/java/freemarker/core/ArithmeticEngineTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ArithmeticEngineTest.java
rename to freemarker-core/src/test/java/freemarker/core/ArithmeticEngineTest.java
diff --git a/src/test/java/freemarker/core/AttemptLoggingTest.java b/freemarker-core/src/test/java/freemarker/core/AttemptLoggingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/AttemptLoggingTest.java
rename to freemarker-core/src/test/java/freemarker/core/AttemptLoggingTest.java
diff --git a/src/test/java/freemarker/core/BaseNTemplateNumberFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/BaseNTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/BaseNTemplateNumberFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/BaseNTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/core/BooleanFormatEnvironmentCachingTest.java b/freemarker-core/src/test/java/freemarker/core/BooleanFormatEnvironmentCachingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/BooleanFormatEnvironmentCachingTest.java
rename to freemarker-core/src/test/java/freemarker/core/BooleanFormatEnvironmentCachingTest.java
diff --git a/src/test/java/freemarker/core/BreakAndContinuePlacementTest.java b/freemarker-core/src/test/java/freemarker/core/BreakAndContinuePlacementTest.java
similarity index 100%
rename from src/test/java/freemarker/core/BreakAndContinuePlacementTest.java
rename to freemarker-core/src/test/java/freemarker/core/BreakAndContinuePlacementTest.java
diff --git a/src/test/java/freemarker/core/CAndCnBuiltInTest.java b/freemarker-core/src/test/java/freemarker/core/CAndCnBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CAndCnBuiltInTest.java
rename to freemarker-core/src/test/java/freemarker/core/CAndCnBuiltInTest.java
diff --git a/src/test/java/freemarker/core/CFormatTemplateTest.java b/freemarker-core/src/test/java/freemarker/core/CFormatTemplateTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CFormatTemplateTest.java
rename to freemarker-core/src/test/java/freemarker/core/CFormatTemplateTest.java
diff --git a/src/test/java/freemarker/core/CTemplateNumberFormatTest.java b/freemarker-core/src/test/java/freemarker/core/CTemplateNumberFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CTemplateNumberFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/CTemplateNumberFormatTest.java
diff --git a/src/test/java/freemarker/core/CallerTemplateNameTest.java b/freemarker-core/src/test/java/freemarker/core/CallerTemplateNameTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CallerTemplateNameTest.java
rename to freemarker-core/src/test/java/freemarker/core/CallerTemplateNameTest.java
diff --git a/src/test/java/freemarker/core/CamelCaseTest.java b/freemarker-core/src/test/java/freemarker/core/CamelCaseTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CamelCaseTest.java
rename to freemarker-core/src/test/java/freemarker/core/CamelCaseTest.java
diff --git a/src/test/java/freemarker/core/CanonicalFormTest.java b/freemarker-core/src/test/java/freemarker/core/CanonicalFormTest.java
similarity index 95%
rename from src/test/java/freemarker/core/CanonicalFormTest.java
rename to freemarker-core/src/test/java/freemarker/core/CanonicalFormTest.java
index 79c1136..a7bbdab 100644
--- a/src/test/java/freemarker/core/CanonicalFormTest.java
+++ b/freemarker-core/src/test/java/freemarker/core/CanonicalFormTest.java
@@ -22,6 +22,9 @@
import java.io.IOException;
import java.io.StringWriter;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.cache.ClassTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.MalformedTemplateNameException;
@@ -29,6 +32,7 @@
import freemarker.test.CopyrightCommentRemoverTemplateLoader;
import freemarker.test.utility.FileTestCase;
+@RunWith(JUnit38ClassRunner.class)
public class CanonicalFormTest extends FileTestCase {
public CanonicalFormTest(String name) {
diff --git a/src/test/java/freemarker/core/CapturingAssignmentTest.java b/freemarker-core/src/test/java/freemarker/core/CapturingAssignmentTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CapturingAssignmentTest.java
rename to freemarker-core/src/test/java/freemarker/core/CapturingAssignmentTest.java
diff --git a/src/test/java/freemarker/core/CoercionToTextualTest.java b/freemarker-core/src/test/java/freemarker/core/CoercionToTextualTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CoercionToTextualTest.java
rename to freemarker-core/src/test/java/freemarker/core/CoercionToTextualTest.java
diff --git a/src/test/java/freemarker/core/CombinedMarkupOutputFormatTest.java b/freemarker-core/src/test/java/freemarker/core/CombinedMarkupOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CombinedMarkupOutputFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/CombinedMarkupOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/ConcatenatedSequenceTest.java b/freemarker-core/src/test/java/freemarker/core/ConcatenatedSequenceTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ConcatenatedSequenceTest.java
rename to freemarker-core/src/test/java/freemarker/core/ConcatenatedSequenceTest.java
diff --git a/src/test/java/freemarker/core/ConfigurableTest.java b/freemarker-core/src/test/java/freemarker/core/ConfigurableTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ConfigurableTest.java
rename to freemarker-core/src/test/java/freemarker/core/ConfigurableTest.java
diff --git a/src/test/java/freemarker/core/CoreLocaleUtilsTest.java b/freemarker-core/src/test/java/freemarker/core/CoreLocaleUtilsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/CoreLocaleUtilsTest.java
rename to freemarker-core/src/test/java/freemarker/core/CoreLocaleUtilsTest.java
diff --git a/src/test/java/freemarker/core/CustomCFormat.java b/freemarker-core/src/test/java/freemarker/core/CustomCFormat.java
similarity index 100%
rename from src/test/java/freemarker/core/CustomCFormat.java
rename to freemarker-core/src/test/java/freemarker/core/CustomCFormat.java
diff --git a/src/test/java/freemarker/core/CustomHTMLOutputFormat.java b/freemarker-core/src/test/java/freemarker/core/CustomHTMLOutputFormat.java
similarity index 100%
rename from src/test/java/freemarker/core/CustomHTMLOutputFormat.java
rename to freemarker-core/src/test/java/freemarker/core/CustomHTMLOutputFormat.java
diff --git a/src/test/java/freemarker/core/CustomTemplateHTMLModel.java b/freemarker-core/src/test/java/freemarker/core/CustomTemplateHTMLModel.java
similarity index 100%
rename from src/test/java/freemarker/core/CustomTemplateHTMLModel.java
rename to freemarker-core/src/test/java/freemarker/core/CustomTemplateHTMLModel.java
diff --git a/src/test/java/freemarker/core/DateFormatTest.java b/freemarker-core/src/test/java/freemarker/core/DateFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/DateFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/DateFormatTest.java
diff --git a/src/test/java/freemarker/core/DefaultTruncateBuiltinAlgorithmTest.java b/freemarker-core/src/test/java/freemarker/core/DefaultTruncateBuiltinAlgorithmTest.java
similarity index 100%
rename from src/test/java/freemarker/core/DefaultTruncateBuiltinAlgorithmTest.java
rename to freemarker-core/src/test/java/freemarker/core/DefaultTruncateBuiltinAlgorithmTest.java
diff --git a/src/test/java/freemarker/core/DirectiveCallPlaceTest.java b/freemarker-core/src/test/java/freemarker/core/DirectiveCallPlaceTest.java
similarity index 100%
rename from src/test/java/freemarker/core/DirectiveCallPlaceTest.java
rename to freemarker-core/src/test/java/freemarker/core/DirectiveCallPlaceTest.java
diff --git a/src/test/java/freemarker/core/DummyOutputFormat.java b/freemarker-core/src/test/java/freemarker/core/DummyOutputFormat.java
similarity index 100%
rename from src/test/java/freemarker/core/DummyOutputFormat.java
rename to freemarker-core/src/test/java/freemarker/core/DummyOutputFormat.java
diff --git a/src/test/java/freemarker/core/EncodingOverrideTest.java b/freemarker-core/src/test/java/freemarker/core/EncodingOverrideTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EncodingOverrideTest.java
rename to freemarker-core/src/test/java/freemarker/core/EncodingOverrideTest.java
diff --git a/src/test/java/freemarker/core/EndTagSyntaxTest.java b/freemarker-core/src/test/java/freemarker/core/EndTagSyntaxTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EndTagSyntaxTest.java
rename to freemarker-core/src/test/java/freemarker/core/EndTagSyntaxTest.java
diff --git a/src/test/java/freemarker/core/EnvironmentCustomStateTest.java b/freemarker-core/src/test/java/freemarker/core/EnvironmentCustomStateTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EnvironmentCustomStateTest.java
rename to freemarker-core/src/test/java/freemarker/core/EnvironmentCustomStateTest.java
diff --git a/src/test/java/freemarker/core/EnvironmentGetTemplateVariantsTest.java b/freemarker-core/src/test/java/freemarker/core/EnvironmentGetTemplateVariantsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EnvironmentGetTemplateVariantsTest.java
rename to freemarker-core/src/test/java/freemarker/core/EnvironmentGetTemplateVariantsTest.java
diff --git a/src/test/java/freemarker/core/EpochMillisDivTemplateDateFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/EpochMillisDivTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/EpochMillisDivTemplateDateFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/EpochMillisDivTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/EpochMillisTemplateDateFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/EpochMillisTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/EpochMillisTemplateDateFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/EpochMillisTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/EvalJsonBuiltInTest.java b/freemarker-core/src/test/java/freemarker/core/EvalJsonBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/EvalJsonBuiltInTest.java
rename to freemarker-core/src/test/java/freemarker/core/EvalJsonBuiltInTest.java
diff --git a/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java b/freemarker-core/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/ExtendedDecimalFormatTest.java
diff --git a/src/test/java/freemarker/core/FilterBiTest.java b/freemarker-core/src/test/java/freemarker/core/FilterBiTest.java
similarity index 100%
rename from src/test/java/freemarker/core/FilterBiTest.java
rename to freemarker-core/src/test/java/freemarker/core/FilterBiTest.java
diff --git a/src/test/java/freemarker/core/GetOptionalTemplateTest.java b/freemarker-core/src/test/java/freemarker/core/GetOptionalTemplateTest.java
similarity index 100%
rename from src/test/java/freemarker/core/GetOptionalTemplateTest.java
rename to freemarker-core/src/test/java/freemarker/core/GetOptionalTemplateTest.java
diff --git a/src/test/java/freemarker/core/HTMLISOTemplateDateFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/HTMLISOTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/HTMLISOTemplateDateFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/HTMLISOTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/HTMLOutputFormatTest.java b/freemarker-core/src/test/java/freemarker/core/HTMLOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/HTMLOutputFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/HTMLOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/HeaderParsingTest.java b/freemarker-core/src/test/java/freemarker/core/HeaderParsingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/HeaderParsingTest.java
rename to freemarker-core/src/test/java/freemarker/core/HeaderParsingTest.java
diff --git a/src/test/java/freemarker/core/HexTemplateNumberFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/HexTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/HexTemplateNumberFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/HexTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/core/IncludeAndImportConfigurableLayersTest.java b/freemarker-core/src/test/java/freemarker/core/IncludeAndImportConfigurableLayersTest.java
similarity index 100%
rename from src/test/java/freemarker/core/IncludeAndImportConfigurableLayersTest.java
rename to freemarker-core/src/test/java/freemarker/core/IncludeAndImportConfigurableLayersTest.java
diff --git a/src/test/java/freemarker/core/IncludeAndImportTest.java b/freemarker-core/src/test/java/freemarker/core/IncludeAndImportTest.java
similarity index 100%
rename from src/test/java/freemarker/core/IncludeAndImportTest.java
rename to freemarker-core/src/test/java/freemarker/core/IncludeAndImportTest.java
diff --git a/src/test/java/freemarker/core/InterpolationSyntaxTest.java b/freemarker-core/src/test/java/freemarker/core/InterpolationSyntaxTest.java
similarity index 100%
rename from src/test/java/freemarker/core/InterpolationSyntaxTest.java
rename to freemarker-core/src/test/java/freemarker/core/InterpolationSyntaxTest.java
diff --git a/src/test/java/freemarker/core/InterpretAndEvalTemplateNameTest.java b/freemarker-core/src/test/java/freemarker/core/InterpretAndEvalTemplateNameTest.java
similarity index 100%
rename from src/test/java/freemarker/core/InterpretAndEvalTemplateNameTest.java
rename to freemarker-core/src/test/java/freemarker/core/InterpretAndEvalTemplateNameTest.java
diff --git a/src/test/java/freemarker/core/InterpretSettingInheritanceTest.java b/freemarker-core/src/test/java/freemarker/core/InterpretSettingInheritanceTest.java
similarity index 100%
rename from src/test/java/freemarker/core/InterpretSettingInheritanceTest.java
rename to freemarker-core/src/test/java/freemarker/core/InterpretSettingInheritanceTest.java
diff --git a/src/test/java/freemarker/core/IteratorIssuesTest.java b/freemarker-core/src/test/java/freemarker/core/IteratorIssuesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/IteratorIssuesTest.java
rename to freemarker-core/src/test/java/freemarker/core/IteratorIssuesTest.java
diff --git a/src/test/java/freemarker/core/JSONParserTest.java b/freemarker-core/src/test/java/freemarker/core/JSONParserTest.java
similarity index 100%
rename from src/test/java/freemarker/core/JSONParserTest.java
rename to freemarker-core/src/test/java/freemarker/core/JSONParserTest.java
diff --git a/src/test/java/freemarker/core/LambdaParsingTest.java b/freemarker-core/src/test/java/freemarker/core/LambdaParsingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/LambdaParsingTest.java
rename to freemarker-core/src/test/java/freemarker/core/LambdaParsingTest.java
diff --git a/src/test/java/freemarker/core/LamdaAndEscapeTest.java b/freemarker-core/src/test/java/freemarker/core/LamdaAndEscapeTest.java
similarity index 100%
rename from src/test/java/freemarker/core/LamdaAndEscapeTest.java
rename to freemarker-core/src/test/java/freemarker/core/LamdaAndEscapeTest.java
diff --git a/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java b/freemarker-core/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
similarity index 100%
rename from src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
rename to freemarker-core/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
diff --git a/src/test/java/freemarker/core/LegacyFMParserConstructorsTest.java b/freemarker-core/src/test/java/freemarker/core/LegacyFMParserConstructorsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/LegacyFMParserConstructorsTest.java
rename to freemarker-core/src/test/java/freemarker/core/LegacyFMParserConstructorsTest.java
diff --git a/src/test/java/freemarker/core/ListBreakContinueTest.java b/freemarker-core/src/test/java/freemarker/core/ListBreakContinueTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ListBreakContinueTest.java
rename to freemarker-core/src/test/java/freemarker/core/ListBreakContinueTest.java
diff --git a/src/test/java/freemarker/core/ListErrorsTest.java b/freemarker-core/src/test/java/freemarker/core/ListErrorsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ListErrorsTest.java
rename to freemarker-core/src/test/java/freemarker/core/ListErrorsTest.java
diff --git a/src/test/java/freemarker/core/ListWithStreamLikeBuiltinsTest.java b/freemarker-core/src/test/java/freemarker/core/ListWithStreamLikeBuiltinsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ListWithStreamLikeBuiltinsTest.java
rename to freemarker-core/src/test/java/freemarker/core/ListWithStreamLikeBuiltinsTest.java
diff --git a/src/test/java/freemarker/core/LocAndTZSensitiveTemplateDateFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/LocAndTZSensitiveTemplateDateFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/LocAndTZSensitiveTemplateDateFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/LocAndTZSensitiveTemplateDateFormatFactory.java
diff --git a/src/test/java/freemarker/core/LocaleSensitiveTemplateNumberFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/LocaleSensitiveTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/LocaleSensitiveTemplateNumberFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/LocaleSensitiveTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/core/MapBiTest.java b/freemarker-core/src/test/java/freemarker/core/MapBiTest.java
similarity index 100%
rename from src/test/java/freemarker/core/MapBiTest.java
rename to freemarker-core/src/test/java/freemarker/core/MapBiTest.java
diff --git a/src/test/java/freemarker/core/MinMaxBITest.java b/freemarker-core/src/test/java/freemarker/core/MinMaxBITest.java
similarity index 100%
rename from src/test/java/freemarker/core/MinMaxBITest.java
rename to freemarker-core/src/test/java/freemarker/core/MinMaxBITest.java
diff --git a/src/test/java/freemarker/core/MiscErrorMessagesTest.java b/freemarker-core/src/test/java/freemarker/core/MiscErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/MiscErrorMessagesTest.java
rename to freemarker-core/src/test/java/freemarker/core/MiscErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/NullTransparencyTest.java b/freemarker-core/src/test/java/freemarker/core/NullTransparencyTest.java
similarity index 100%
rename from src/test/java/freemarker/core/NullTransparencyTest.java
rename to freemarker-core/src/test/java/freemarker/core/NullTransparencyTest.java
diff --git a/src/test/java/freemarker/core/NumberBiTest.java b/freemarker-core/src/test/java/freemarker/core/NumberBiTest.java
similarity index 100%
rename from src/test/java/freemarker/core/NumberBiTest.java
rename to freemarker-core/src/test/java/freemarker/core/NumberBiTest.java
diff --git a/src/test/java/freemarker/core/NumberFormatTest.java b/freemarker-core/src/test/java/freemarker/core/NumberFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/NumberFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/NumberFormatTest.java
diff --git a/src/test/java/freemarker/core/OptInTemplateClassResolverTest.java b/freemarker-core/src/test/java/freemarker/core/OptInTemplateClassResolverTest.java
similarity index 98%
rename from src/test/java/freemarker/core/OptInTemplateClassResolverTest.java
rename to freemarker-core/src/test/java/freemarker/core/OptInTemplateClassResolverTest.java
index b0a9d29..89dfbf7 100644
--- a/src/test/java/freemarker/core/OptInTemplateClassResolverTest.java
+++ b/freemarker-core/src/test/java/freemarker/core/OptInTemplateClassResolverTest.java
@@ -24,6 +24,9 @@
import java.util.List;
import java.util.Set;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
@@ -31,6 +34,7 @@
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class OptInTemplateClassResolverTest extends TestCase {
public OptInTemplateClassResolverTest(String name) {
diff --git a/src/test/java/freemarker/core/OutputFormatTest.java b/freemarker-core/src/test/java/freemarker/core/OutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/OutputFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/OutputFormatTest.java
diff --git a/src/test/java/freemarker/core/ParseTimeParameterBIErrorMessagesTest.java b/freemarker-core/src/test/java/freemarker/core/ParseTimeParameterBIErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ParseTimeParameterBIErrorMessagesTest.java
rename to freemarker-core/src/test/java/freemarker/core/ParseTimeParameterBIErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/ParsingErrorMessagesTest.java b/freemarker-core/src/test/java/freemarker/core/ParsingErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ParsingErrorMessagesTest.java
rename to freemarker-core/src/test/java/freemarker/core/ParsingErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java b/freemarker-core/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/core/RTFOutputFormatTest.java b/freemarker-core/src/test/java/freemarker/core/RTFOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/RTFOutputFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/RTFOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/SQLTimeZoneTest.java b/freemarker-core/src/test/java/freemarker/core/SQLTimeZoneTest.java
similarity index 100%
rename from src/test/java/freemarker/core/SQLTimeZoneTest.java
rename to freemarker-core/src/test/java/freemarker/core/SQLTimeZoneTest.java
diff --git a/src/test/java/freemarker/core/SeldomEscapedOutputFormat.java b/freemarker-core/src/test/java/freemarker/core/SeldomEscapedOutputFormat.java
similarity index 100%
rename from src/test/java/freemarker/core/SeldomEscapedOutputFormat.java
rename to freemarker-core/src/test/java/freemarker/core/SeldomEscapedOutputFormat.java
diff --git a/src/test/java/freemarker/core/SequenceBuiltInTest.java b/freemarker-core/src/test/java/freemarker/core/SequenceBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/SequenceBuiltInTest.java
rename to freemarker-core/src/test/java/freemarker/core/SequenceBuiltInTest.java
diff --git a/src/test/java/freemarker/core/SettingDirectiveTest.java b/freemarker-core/src/test/java/freemarker/core/SettingDirectiveTest.java
similarity index 100%
rename from src/test/java/freemarker/core/SettingDirectiveTest.java
rename to freemarker-core/src/test/java/freemarker/core/SettingDirectiveTest.java
diff --git a/src/test/java/freemarker/core/SpecialVariableTest.java b/freemarker-core/src/test/java/freemarker/core/SpecialVariableTest.java
similarity index 100%
rename from src/test/java/freemarker/core/SpecialVariableTest.java
rename to freemarker-core/src/test/java/freemarker/core/SpecialVariableTest.java
diff --git a/src/test/java/freemarker/core/StringLiteralInterpolationTest.java b/freemarker-core/src/test/java/freemarker/core/StringLiteralInterpolationTest.java
similarity index 100%
rename from src/test/java/freemarker/core/StringLiteralInterpolationTest.java
rename to freemarker-core/src/test/java/freemarker/core/StringLiteralInterpolationTest.java
diff --git a/src/test/java/freemarker/core/TabSizeTest.java b/freemarker-core/src/test/java/freemarker/core/TabSizeTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TabSizeTest.java
rename to freemarker-core/src/test/java/freemarker/core/TabSizeTest.java
diff --git a/src/test/java/freemarker/core/TagSyntaxVariationsTest.java b/freemarker-core/src/test/java/freemarker/core/TagSyntaxVariationsTest.java
similarity index 98%
rename from src/test/java/freemarker/core/TagSyntaxVariationsTest.java
rename to freemarker-core/src/test/java/freemarker/core/TagSyntaxVariationsTest.java
index 7343796..b5cb659 100644
--- a/src/test/java/freemarker/core/TagSyntaxVariationsTest.java
+++ b/freemarker-core/src/test/java/freemarker/core/TagSyntaxVariationsTest.java
@@ -23,6 +23,9 @@
import java.io.StringReader;
import java.io.StringWriter;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
@@ -33,6 +36,7 @@
* Test various generated templates (permutations), including some deliberately
* wrong ones, with various tag_syntax settings.
*/
+@RunWith(JUnit38ClassRunner.class)
public class TagSyntaxVariationsTest extends TestCase {
private static final String HDR_ANG = "<#ftl>";
diff --git a/src/test/java/freemarker/core/TakeWhileAndDropWhileBiTest.java b/freemarker-core/src/test/java/freemarker/core/TakeWhileAndDropWhileBiTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TakeWhileAndDropWhileBiTest.java
rename to freemarker-core/src/test/java/freemarker/core/TakeWhileAndDropWhileBiTest.java
diff --git a/src/test/java/freemarker/core/TemplatGetEncodingTest.java b/freemarker-core/src/test/java/freemarker/core/TemplatGetEncodingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplatGetEncodingTest.java
rename to freemarker-core/src/test/java/freemarker/core/TemplatGetEncodingTest.java
diff --git a/src/test/java/freemarker/core/TemplateConfigurationTest.java b/freemarker-core/src/test/java/freemarker/core/TemplateConfigurationTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateConfigurationTest.java
rename to freemarker-core/src/test/java/freemarker/core/TemplateConfigurationTest.java
diff --git a/src/test/java/freemarker/core/TemplateConfigurationWithTemplateCacheTest.java b/freemarker-core/src/test/java/freemarker/core/TemplateConfigurationWithTemplateCacheTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateConfigurationWithTemplateCacheTest.java
rename to freemarker-core/src/test/java/freemarker/core/TemplateConfigurationWithTemplateCacheTest.java
diff --git a/src/test/java/freemarker/core/TemplateDummyOutputModel.java b/freemarker-core/src/test/java/freemarker/core/TemplateDummyOutputModel.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateDummyOutputModel.java
rename to freemarker-core/src/test/java/freemarker/core/TemplateDummyOutputModel.java
diff --git a/src/test/java/freemarker/core/TemplateLevelSettings.java b/freemarker-core/src/test/java/freemarker/core/TemplateLevelSettings.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateLevelSettings.java
rename to freemarker-core/src/test/java/freemarker/core/TemplateLevelSettings.java
diff --git a/src/test/java/freemarker/core/TemplateNameSpecialVariablesTest.java b/freemarker-core/src/test/java/freemarker/core/TemplateNameSpecialVariablesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateNameSpecialVariablesTest.java
rename to freemarker-core/src/test/java/freemarker/core/TemplateNameSpecialVariablesTest.java
diff --git a/src/test/java/freemarker/core/TemplateProcessingTracerTest.java b/freemarker-core/src/test/java/freemarker/core/TemplateProcessingTracerTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateProcessingTracerTest.java
rename to freemarker-core/src/test/java/freemarker/core/TemplateProcessingTracerTest.java
diff --git a/src/test/java/freemarker/core/TemplateSeldomEscapedOutputModel.java b/freemarker-core/src/test/java/freemarker/core/TemplateSeldomEscapedOutputModel.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateSeldomEscapedOutputModel.java
rename to freemarker-core/src/test/java/freemarker/core/TemplateSeldomEscapedOutputModel.java
diff --git a/src/test/java/freemarker/core/TemplateTransformModelTest.java b/freemarker-core/src/test/java/freemarker/core/TemplateTransformModelTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TemplateTransformModelTest.java
rename to freemarker-core/src/test/java/freemarker/core/TemplateTransformModelTest.java
diff --git a/src/test/java/freemarker/core/ThreadInterruptingSupportTest.java b/freemarker-core/src/test/java/freemarker/core/ThreadInterruptingSupportTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ThreadInterruptingSupportTest.java
rename to freemarker-core/src/test/java/freemarker/core/ThreadInterruptingSupportTest.java
diff --git a/src/test/java/freemarker/core/TruncateBuiltInTest.java b/freemarker-core/src/test/java/freemarker/core/TruncateBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TruncateBuiltInTest.java
rename to freemarker-core/src/test/java/freemarker/core/TruncateBuiltInTest.java
diff --git a/src/test/java/freemarker/core/TypeErrorMessagesTest.java b/freemarker-core/src/test/java/freemarker/core/TypeErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/core/TypeErrorMessagesTest.java
rename to freemarker-core/src/test/java/freemarker/core/TypeErrorMessagesTest.java
diff --git a/src/test/java/freemarker/core/UncheckedExceptionHandlingTest.java b/freemarker-core/src/test/java/freemarker/core/UncheckedExceptionHandlingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/UncheckedExceptionHandlingTest.java
rename to freemarker-core/src/test/java/freemarker/core/UncheckedExceptionHandlingTest.java
diff --git a/src/test/java/freemarker/core/UnclosedCommentTest.java b/freemarker-core/src/test/java/freemarker/core/UnclosedCommentTest.java
similarity index 100%
rename from src/test/java/freemarker/core/UnclosedCommentTest.java
rename to freemarker-core/src/test/java/freemarker/core/UnclosedCommentTest.java
diff --git a/src/test/java/freemarker/core/WhitespaceStrippingTest.java b/freemarker-core/src/test/java/freemarker/core/WhitespaceStrippingTest.java
similarity index 100%
rename from src/test/java/freemarker/core/WhitespaceStrippingTest.java
rename to freemarker-core/src/test/java/freemarker/core/WhitespaceStrippingTest.java
diff --git a/src/test/java/freemarker/core/WithArgsBuiltInTest.java b/freemarker-core/src/test/java/freemarker/core/WithArgsBuiltInTest.java
similarity index 100%
rename from src/test/java/freemarker/core/WithArgsBuiltInTest.java
rename to freemarker-core/src/test/java/freemarker/core/WithArgsBuiltInTest.java
diff --git a/src/test/java/freemarker/core/XHTMLOutputFormatTest.java b/freemarker-core/src/test/java/freemarker/core/XHTMLOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/XHTMLOutputFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/XHTMLOutputFormatTest.java
diff --git a/src/test/java/freemarker/core/XMLOutputFormatTest.java b/freemarker-core/src/test/java/freemarker/core/XMLOutputFormatTest.java
similarity index 100%
rename from src/test/java/freemarker/core/XMLOutputFormatTest.java
rename to freemarker-core/src/test/java/freemarker/core/XMLOutputFormatTest.java
diff --git a/src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java
similarity index 97%
rename from src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java
index e6d8b01..3c310d6 100644
--- a/src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/AbstractParallelIntrospectionTest.java
@@ -19,12 +19,16 @@
package freemarker.ext.beans;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.TemplateHashModel;
import freemarker.template.TemplateMethodModel;
import freemarker.template.TemplateModelException;
import freemarker.template.TemplateNumberModel;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public abstract class AbstractParallelIntrospectionTest extends TestCase {
private static final int NUM_THREADS = 8;
diff --git a/src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java
similarity index 97%
rename from src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java
index fac6e45..7ea5a54 100644
--- a/src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/BeansAPINewInstanceTest.java
@@ -19,10 +19,14 @@
package freemarker.ext.beans;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.Configuration;
import freemarker.test.utility.TestUtil;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class BeansAPINewInstanceTest extends TestCase {
private BeansWrapper beansWrapper = new BeansWrapperBuilder(Configuration.VERSION_2_3_21).build();
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperBasics.java b/freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperBasics.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperBasics.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperBasics.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperCachesTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperCachesTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperCachesTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperCachesTest.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperMiscTest.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java
similarity index 96%
rename from src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java
index 5cbcd6e..d979092 100644
--- a/src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperReadOnlyTest.java
@@ -25,6 +25,9 @@
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.DefaultObjectWrapper;
import freemarker.template.ObjectWrapper;
import freemarker.template.utility.ClassUtil;
@@ -35,6 +38,7 @@
* Tests if all JavaBean properties of the standard {@link ObjectWrapper} classes are locked by
* {@link WriteProtectable#writeProtect()}.
*/
+@RunWith(JUnit38ClassRunner.class)
public class BeansWrapperReadOnlyTest extends TestCase {
private static final String EXPECTED_MESSAGE_PART = "write protected";
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
similarity index 99%
rename from src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
index d5054e8..28ba8df 100644
--- a/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
@@ -29,6 +29,9 @@
import java.util.List;
import java.util.Map;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.ext.beans.BeansWrapper.MethodAppearanceDecision;
import freemarker.ext.beans.BeansWrapper.MethodAppearanceDecisionInput;
import freemarker.template.Configuration;
@@ -42,6 +45,7 @@
import freemarker.test.utility.TestUtil;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class BeansWrapperSingletonsTest extends TestCase {
public BeansWrapperSingletonsTest(String name) {
diff --git a/src/test/java/freemarker/ext/beans/BridgeMethodsBean.java b/freemarker-core/src/test/java/freemarker/ext/beans/BridgeMethodsBean.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BridgeMethodsBean.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/BridgeMethodsBean.java
diff --git a/src/test/java/freemarker/ext/beans/BridgeMethodsBeanBase.java b/freemarker-core/src/test/java/freemarker/ext/beans/BridgeMethodsBeanBase.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BridgeMethodsBeanBase.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/BridgeMethodsBeanBase.java
diff --git a/src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java
similarity index 98%
rename from src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java
index 68db7e2..db749d8 100644
--- a/src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/CommonSupertypeForUnwrappingHintTest.java
@@ -22,10 +22,14 @@
import java.io.Serializable;
import java.util.List;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.Configuration;
import freemarker.template.TemplateModelException;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class CommonSupertypeForUnwrappingHintTest extends TestCase {
final OverloadedMethodsSubset buggy
diff --git a/src/test/java/freemarker/ext/beans/DefaultMemberAccessPolicyTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/DefaultMemberAccessPolicyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultMemberAccessPolicyTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/DefaultMemberAccessPolicyTest.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
diff --git a/src/test/java/freemarker/ext/beans/EnumModelsTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/EnumModelsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/EnumModelsTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/EnumModelsTest.java
diff --git a/src/test/java/freemarker/ext/beans/ErrorMessagesTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/ErrorMessagesTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ErrorMessagesTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/ErrorMessagesTest.java
diff --git a/src/test/java/freemarker/ext/beans/FineTuneMethodAppearanceTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/FineTuneMethodAppearanceTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/FineTuneMethodAppearanceTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/FineTuneMethodAppearanceTest.java
diff --git a/src/test/java/freemarker/ext/beans/GetPropertyNameFromReaderMethodNameTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/GetPropertyNameFromReaderMethodNameTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/GetPropertyNameFromReaderMethodNameTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/GetPropertyNameFromReaderMethodNameTest.java
diff --git a/src/test/java/freemarker/ext/beans/GetlessMethodsAsPropertyGettersRule.java b/freemarker-core/src/test/java/freemarker/ext/beans/GetlessMethodsAsPropertyGettersRule.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/GetlessMethodsAsPropertyGettersRule.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/GetlessMethodsAsPropertyGettersRule.java
diff --git a/src/test/java/freemarker/ext/beans/IsApplicableTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/IsApplicableTest.java
similarity index 98%
rename from src/test/java/freemarker/ext/beans/IsApplicableTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/IsApplicableTest.java
index df5a221..f28f292 100644
--- a/src/test/java/freemarker/ext/beans/IsApplicableTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/IsApplicableTest.java
@@ -26,9 +26,13 @@
import java.util.ArrayList;
import java.util.List;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import junit.framework.TestCase;
@SuppressWarnings("boxing")
+@RunWith(JUnit38ClassRunner.class)
public class IsApplicableTest extends TestCase {
public IsApplicableTest(String name) {
diff --git a/src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java
similarity index 97%
rename from src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java
index 4d456de..8a1dbcb 100644
--- a/src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/IsMoreSpecificParameterTypeTest.java
@@ -23,8 +23,12 @@
import java.util.HashMap;
import java.util.Map;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class IsMoreSpecificParameterTypeTest extends TestCase {
public IsMoreSpecificParameterTypeTest(String name) {
diff --git a/src/test/java/freemarker/ext/beans/Java8BeansWrapperBridgeMethodsTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java8BeansWrapperBridgeMethodsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BeansWrapperBridgeMethodsTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java8BeansWrapperBridgeMethodsTest.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BeansWrapperTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java8BeansWrapperTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BeansWrapperTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java8BeansWrapperTest.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean2.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean2.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean2.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBean2.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase.java
diff --git a/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase2.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase2.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase2.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java8BridgeMethodsWithDefaultMethodBeanBase2.java
diff --git a/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBean.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBean.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8DefaultMethodsBean.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBean.java
diff --git a/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBeanBase.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBeanBase.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java8DefaultMethodsBeanBase.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java8DefaultMethodsBeanBase.java
diff --git a/src/test/java/freemarker/ext/beans/Java9InstrospectorBugWorkaroundTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/Java9InstrospectorBugWorkaroundTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java9InstrospectorBugWorkaroundTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/Java9InstrospectorBugWorkaroundTest.java
diff --git a/src/test/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicyTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicyTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicyTest.java
diff --git a/src/test/java/freemarker/ext/beans/ManyObjectsOfDifferentClasses.java b/freemarker-core/src/test/java/freemarker/ext/beans/ManyObjectsOfDifferentClasses.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ManyObjectsOfDifferentClasses.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/ManyObjectsOfDifferentClasses.java
diff --git a/src/test/java/freemarker/ext/beans/ManyStaticsOfDifferentClasses.java b/freemarker-core/src/test/java/freemarker/ext/beans/ManyStaticsOfDifferentClasses.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ManyStaticsOfDifferentClasses.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/ManyStaticsOfDifferentClasses.java
diff --git a/src/test/java/freemarker/ext/beans/MemberAccessMonitoringTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/MemberAccessMonitoringTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MemberAccessMonitoringTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/MemberAccessMonitoringTest.java
diff --git a/src/test/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicyTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicyTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicyTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicyTest.java
diff --git a/src/test/java/freemarker/ext/beans/MethodMatcherTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/MethodMatcherTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MethodMatcherTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/MethodMatcherTest.java
diff --git a/src/test/java/freemarker/ext/beans/MethodUtilTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/MethodUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MethodUtilTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/MethodUtilTest.java
diff --git a/src/test/java/freemarker/ext/beans/MethodUtilTest2.java b/freemarker-core/src/test/java/freemarker/ext/beans/MethodUtilTest2.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/MethodUtilTest2.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/MethodUtilTest2.java
diff --git a/src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java
similarity index 97%
rename from src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java
index 508bbcb..db2959d 100644
--- a/src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/MiscNumericalOperationsTest.java
@@ -23,10 +23,13 @@
import java.math.BigInteger;
import org.junit.Assert;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
import freemarker.template.Configuration;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class MiscNumericalOperationsTest extends TestCase {
public MiscNumericalOperationsTest(String name) {
diff --git a/src/test/java/freemarker/ext/beans/ModelCacheTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/ModelCacheTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/ModelCacheTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/ModelCacheTest.java
diff --git a/src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java
similarity index 99%
rename from src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java
index 68a83fd..f3d251d 100644
--- a/src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/OverloadedNumberUtilTest.java
@@ -22,9 +22,13 @@
import java.math.BigDecimal;
import java.math.BigInteger;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import junit.framework.TestCase;
@SuppressWarnings("boxing")
+@RunWith(JUnit38ClassRunner.class)
public class OverloadedNumberUtilTest extends TestCase {
public OverloadedNumberUtilTest(String name) {
diff --git a/src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java
similarity index 99%
rename from src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java
index e2c3976..9025fde 100644
--- a/src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/ParameterListPreferabilityTest.java
@@ -27,10 +27,14 @@
import java.util.Map;
import java.util.TreeMap;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.utility.NumberUtil;
import junit.framework.TestCase;
@SuppressWarnings("boxing")
+@RunWith(JUnit38ClassRunner.class)
public class ParameterListPreferabilityTest extends TestCase {
public ParameterListPreferabilityTest(String name) {
diff --git a/src/test/java/freemarker/ext/beans/PrallelObjectIntrospectionTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/PrallelObjectIntrospectionTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/PrallelObjectIntrospectionTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/PrallelObjectIntrospectionTest.java
diff --git a/src/test/java/freemarker/ext/beans/PrallelStaticIntrospectionTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/PrallelStaticIntrospectionTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/PrallelStaticIntrospectionTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/PrallelStaticIntrospectionTest.java
diff --git a/src/test/java/freemarker/ext/beans/StaticModelsTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/StaticModelsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/StaticModelsTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/StaticModelsTest.java
diff --git a/src/test/java/freemarker/ext/beans/TypeFlagsTest.java b/freemarker-core/src/test/java/freemarker/ext/beans/TypeFlagsTest.java
similarity index 99%
rename from src/test/java/freemarker/ext/beans/TypeFlagsTest.java
rename to freemarker-core/src/test/java/freemarker/ext/beans/TypeFlagsTest.java
index d1584c5..192ea57 100644
--- a/src/test/java/freemarker/ext/beans/TypeFlagsTest.java
+++ b/freemarker-core/src/test/java/freemarker/ext/beans/TypeFlagsTest.java
@@ -34,9 +34,13 @@
import java.util.Map;
import java.util.Set;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.Configuration;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class TypeFlagsTest extends TestCase {
public TypeFlagsTest(String name) {
diff --git a/src/test/java/freemarker/ext/dom/DOMConvenienceStaticsTest.java b/freemarker-core/src/test/java/freemarker/ext/dom/DOMConvenienceStaticsTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/dom/DOMConvenienceStaticsTest.java
rename to freemarker-core/src/test/java/freemarker/ext/dom/DOMConvenienceStaticsTest.java
diff --git a/src/test/java/freemarker/ext/dom/DOMSiblingTest.java b/freemarker-core/src/test/java/freemarker/ext/dom/DOMSiblingTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/dom/DOMSiblingTest.java
rename to freemarker-core/src/test/java/freemarker/ext/dom/DOMSiblingTest.java
diff --git a/src/test/java/freemarker/ext/dom/DOMTest.java b/freemarker-core/src/test/java/freemarker/ext/dom/DOMTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/dom/DOMTest.java
rename to freemarker-core/src/test/java/freemarker/ext/dom/DOMTest.java
diff --git a/src/test/java/freemarker/manual/AbsoluteTemplateNameBIExample.java b/freemarker-core/src/test/java/freemarker/manual/AbsoluteTemplateNameBIExample.java
similarity index 100%
rename from src/test/java/freemarker/manual/AbsoluteTemplateNameBIExample.java
rename to freemarker-core/src/test/java/freemarker/manual/AbsoluteTemplateNameBIExample.java
diff --git a/src/test/java/freemarker/manual/AutoEscapingExample.java b/freemarker-core/src/test/java/freemarker/manual/AutoEscapingExample.java
similarity index 100%
rename from src/test/java/freemarker/manual/AutoEscapingExample.java
rename to freemarker-core/src/test/java/freemarker/manual/AutoEscapingExample.java
diff --git a/src/test/java/freemarker/manual/ConfigureOutputFormatExamples.java b/freemarker-core/src/test/java/freemarker/manual/ConfigureOutputFormatExamples.java
similarity index 100%
rename from src/test/java/freemarker/manual/ConfigureOutputFormatExamples.java
rename to freemarker-core/src/test/java/freemarker/manual/ConfigureOutputFormatExamples.java
diff --git a/src/test/java/freemarker/manual/CustomFormatsExample.java b/freemarker-core/src/test/java/freemarker/manual/CustomFormatsExample.java
similarity index 100%
rename from src/test/java/freemarker/manual/CustomFormatsExample.java
rename to freemarker-core/src/test/java/freemarker/manual/CustomFormatsExample.java
diff --git a/src/test/java/freemarker/manual/ExamplesTest.java b/freemarker-core/src/test/java/freemarker/manual/ExamplesTest.java
similarity index 100%
rename from src/test/java/freemarker/manual/ExamplesTest.java
rename to freemarker-core/src/test/java/freemarker/manual/ExamplesTest.java
diff --git a/src/test/java/freemarker/manual/GettingStartedExample.java b/freemarker-core/src/test/java/freemarker/manual/GettingStartedExample.java
similarity index 100%
rename from src/test/java/freemarker/manual/GettingStartedExample.java
rename to freemarker-core/src/test/java/freemarker/manual/GettingStartedExample.java
diff --git a/src/test/java/freemarker/manual/Product.java b/freemarker-core/src/test/java/freemarker/manual/Product.java
similarity index 100%
rename from src/test/java/freemarker/manual/Product.java
rename to freemarker-core/src/test/java/freemarker/manual/Product.java
diff --git a/src/test/java/freemarker/manual/TemplateConfigurationExamples.java b/freemarker-core/src/test/java/freemarker/manual/TemplateConfigurationExamples.java
similarity index 100%
rename from src/test/java/freemarker/manual/TemplateConfigurationExamples.java
rename to freemarker-core/src/test/java/freemarker/manual/TemplateConfigurationExamples.java
diff --git a/src/test/java/freemarker/manual/UnitAwareTemplateNumberFormatFactory.java b/freemarker-core/src/test/java/freemarker/manual/UnitAwareTemplateNumberFormatFactory.java
similarity index 100%
rename from src/test/java/freemarker/manual/UnitAwareTemplateNumberFormatFactory.java
rename to freemarker-core/src/test/java/freemarker/manual/UnitAwareTemplateNumberFormatFactory.java
diff --git a/src/test/java/freemarker/manual/UnitAwareTemplateNumberModel.java b/freemarker-core/src/test/java/freemarker/manual/UnitAwareTemplateNumberModel.java
similarity index 100%
rename from src/test/java/freemarker/manual/UnitAwareTemplateNumberModel.java
rename to freemarker-core/src/test/java/freemarker/manual/UnitAwareTemplateNumberModel.java
diff --git a/src/test/java/freemarker/manual/WithArgsExamples.java b/freemarker-core/src/test/java/freemarker/manual/WithArgsExamples.java
similarity index 100%
rename from src/test/java/freemarker/manual/WithArgsExamples.java
rename to freemarker-core/src/test/java/freemarker/manual/WithArgsExamples.java
diff --git a/src/test/java/freemarker/manual/WithArgsLastExamples.java b/freemarker-core/src/test/java/freemarker/manual/WithArgsLastExamples.java
similarity index 100%
rename from src/test/java/freemarker/manual/WithArgsLastExamples.java
rename to freemarker-core/src/test/java/freemarker/manual/WithArgsLastExamples.java
diff --git a/src/test/java/freemarker/template/ActualNamingConvetionTest.java b/freemarker-core/src/test/java/freemarker/template/ActualNamingConvetionTest.java
similarity index 100%
rename from src/test/java/freemarker/template/ActualNamingConvetionTest.java
rename to freemarker-core/src/test/java/freemarker/template/ActualNamingConvetionTest.java
diff --git a/src/test/java/freemarker/template/ActualTagSyntaxTest.java b/freemarker-core/src/test/java/freemarker/template/ActualTagSyntaxTest.java
similarity index 100%
rename from src/test/java/freemarker/template/ActualTagSyntaxTest.java
rename to freemarker-core/src/test/java/freemarker/template/ActualTagSyntaxTest.java
diff --git a/src/test/java/freemarker/template/ConfigurationTest.java b/freemarker-core/src/test/java/freemarker/template/ConfigurationTest.java
similarity index 99%
rename from src/test/java/freemarker/template/ConfigurationTest.java
rename to freemarker-core/src/test/java/freemarker/template/ConfigurationTest.java
index 72287e6..6a08ea9 100644
--- a/src/test/java/freemarker/template/ConfigurationTest.java
+++ b/freemarker-core/src/test/java/freemarker/template/ConfigurationTest.java
@@ -37,6 +37,8 @@
import java.util.TimeZone;
import org.junit.Test;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
@@ -98,6 +100,7 @@
import freemarker.template.utility.NullWriter;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class ConfigurationTest extends TestCase {
public ConfigurationTest(String name) {
diff --git a/src/test/java/freemarker/template/CustomAttributeTest.java b/freemarker-core/src/test/java/freemarker/template/CustomAttributeTest.java
similarity index 100%
rename from src/test/java/freemarker/template/CustomAttributeTest.java
rename to freemarker-core/src/test/java/freemarker/template/CustomAttributeTest.java
diff --git a/src/test/java/freemarker/template/ExceptionTest.java b/freemarker-core/src/test/java/freemarker/template/ExceptionTest.java
similarity index 97%
rename from src/test/java/freemarker/template/ExceptionTest.java
rename to freemarker-core/src/test/java/freemarker/template/ExceptionTest.java
index 938cc16..d795c95 100644
--- a/src/test/java/freemarker/template/ExceptionTest.java
+++ b/freemarker-core/src/test/java/freemarker/template/ExceptionTest.java
@@ -32,10 +32,15 @@
import java.util.Collections;
import java.util.Locale;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.cache.StringTemplateLoader;
import freemarker.core.ParseException;
import freemarker.template.utility.NullWriter;
import junit.framework.TestCase;
+
+@RunWith(JUnit38ClassRunner.class)
public class ExceptionTest extends TestCase {
public ExceptionTest(String name) {
diff --git a/src/test/java/freemarker/template/GetSourceTest.java b/freemarker-core/src/test/java/freemarker/template/GetSourceTest.java
similarity index 100%
rename from src/test/java/freemarker/template/GetSourceTest.java
rename to freemarker-core/src/test/java/freemarker/template/GetSourceTest.java
diff --git a/src/test/java/freemarker/template/IncudeFromNamelessTest.java b/freemarker-core/src/test/java/freemarker/template/IncudeFromNamelessTest.java
similarity index 93%
rename from src/test/java/freemarker/template/IncudeFromNamelessTest.java
rename to freemarker-core/src/test/java/freemarker/template/IncudeFromNamelessTest.java
index 19dbe58..539871d 100644
--- a/src/test/java/freemarker/template/IncudeFromNamelessTest.java
+++ b/freemarker-core/src/test/java/freemarker/template/IncudeFromNamelessTest.java
@@ -23,9 +23,13 @@
import java.io.StringReader;
import java.io.StringWriter;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.cache.StringTemplateLoader;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class IncudeFromNamelessTest extends TestCase {
public IncudeFromNamelessTest(String name) {
diff --git a/src/test/java/freemarker/template/JavaCCExceptionAsEOFFixTest.java b/freemarker-core/src/test/java/freemarker/template/JavaCCExceptionAsEOFFixTest.java
similarity index 100%
rename from src/test/java/freemarker/template/JavaCCExceptionAsEOFFixTest.java
rename to freemarker-core/src/test/java/freemarker/template/JavaCCExceptionAsEOFFixTest.java
diff --git a/src/test/java/freemarker/template/MistakenlyPublicImportAPIsTest.java b/freemarker-core/src/test/java/freemarker/template/MistakenlyPublicImportAPIsTest.java
similarity index 100%
rename from src/test/java/freemarker/template/MistakenlyPublicImportAPIsTest.java
rename to freemarker-core/src/test/java/freemarker/template/MistakenlyPublicImportAPIsTest.java
diff --git a/src/test/java/freemarker/template/MistakenlyPublicMacroAPIsTest.java b/freemarker-core/src/test/java/freemarker/template/MistakenlyPublicMacroAPIsTest.java
similarity index 100%
rename from src/test/java/freemarker/template/MistakenlyPublicMacroAPIsTest.java
rename to freemarker-core/src/test/java/freemarker/template/MistakenlyPublicMacroAPIsTest.java
diff --git a/src/test/java/freemarker/template/NullConfigurationTest.java b/freemarker-core/src/test/java/freemarker/template/NullConfigurationTest.java
similarity index 100%
rename from src/test/java/freemarker/template/NullConfigurationTest.java
rename to freemarker-core/src/test/java/freemarker/template/NullConfigurationTest.java
diff --git a/src/test/java/freemarker/template/StaticObjectWrappersTest.java b/freemarker-core/src/test/java/freemarker/template/StaticObjectWrappersTest.java
similarity index 100%
rename from src/test/java/freemarker/template/StaticObjectWrappersTest.java
rename to freemarker-core/src/test/java/freemarker/template/StaticObjectWrappersTest.java
diff --git a/src/test/java/freemarker/template/TemplateConstructorsTest.java b/freemarker-core/src/test/java/freemarker/template/TemplateConstructorsTest.java
similarity index 100%
rename from src/test/java/freemarker/template/TemplateConstructorsTest.java
rename to freemarker-core/src/test/java/freemarker/template/TemplateConstructorsTest.java
diff --git a/src/test/java/freemarker/template/TemplateLanguageVersionTest.java b/freemarker-core/src/test/java/freemarker/template/TemplateLanguageVersionTest.java
similarity index 100%
rename from src/test/java/freemarker/template/TemplateLanguageVersionTest.java
rename to freemarker-core/src/test/java/freemarker/template/TemplateLanguageVersionTest.java
diff --git a/src/test/java/freemarker/template/TemplateLookupStrategyTest.java b/freemarker-core/src/test/java/freemarker/template/TemplateLookupStrategyTest.java
similarity index 100%
rename from src/test/java/freemarker/template/TemplateLookupStrategyTest.java
rename to freemarker-core/src/test/java/freemarker/template/TemplateLookupStrategyTest.java
diff --git a/src/test/java/freemarker/template/VersionTest.java b/freemarker-core/src/test/java/freemarker/template/VersionTest.java
similarity index 100%
rename from src/test/java/freemarker/template/VersionTest.java
rename to freemarker-core/src/test/java/freemarker/template/VersionTest.java
diff --git a/src/test/java/freemarker/template/utility/ConstantsTest.java b/freemarker-core/src/test/java/freemarker/template/utility/ConstantsTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/ConstantsTest.java
rename to freemarker-core/src/test/java/freemarker/template/utility/ConstantsTest.java
diff --git a/src/test/java/freemarker/template/utility/DateUtilTest.java b/freemarker-core/src/test/java/freemarker/template/utility/DateUtilTest.java
similarity index 99%
rename from src/test/java/freemarker/template/utility/DateUtilTest.java
rename to freemarker-core/src/test/java/freemarker/template/utility/DateUtilTest.java
index 27243d9..af84948 100644
--- a/src/test/java/freemarker/template/utility/DateUtilTest.java
+++ b/freemarker-core/src/test/java/freemarker/template/utility/DateUtilTest.java
@@ -30,12 +30,16 @@
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
+
import freemarker.template.utility.DateUtil.CalendarFieldsToDateConverter;
import freemarker.template.utility.DateUtil.DateParseException;
import freemarker.template.utility.DateUtil.DateToISO8601CalendarFactory;
import freemarker.template.utility.DateUtil.TrivialCalendarFieldsToDateConverter;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class DateUtilTest extends TestCase {
private final TimeZone originalDefaultTZ = TimeZone.getDefault();
diff --git a/src/test/java/freemarker/template/utility/DeepUnwrapTest.java b/freemarker-core/src/test/java/freemarker/template/utility/DeepUnwrapTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/DeepUnwrapTest.java
rename to freemarker-core/src/test/java/freemarker/template/utility/DeepUnwrapTest.java
diff --git a/src/test/java/freemarker/template/utility/NumberUtilTest.java b/freemarker-core/src/test/java/freemarker/template/utility/NumberUtilTest.java
similarity index 98%
rename from src/test/java/freemarker/template/utility/NumberUtilTest.java
rename to freemarker-core/src/test/java/freemarker/template/utility/NumberUtilTest.java
index 3e13b6c..307a773 100644
--- a/src/test/java/freemarker/template/utility/NumberUtilTest.java
+++ b/freemarker-core/src/test/java/freemarker/template/utility/NumberUtilTest.java
@@ -23,9 +23,12 @@
import java.math.BigInteger;
import org.junit.Test;
+import org.junit.internal.runners.JUnit38ClassRunner;
+import org.junit.runner.RunWith;
import junit.framework.TestCase;
+@RunWith(JUnit38ClassRunner.class)
public class NumberUtilTest extends TestCase {
@Test
diff --git a/src/test/java/freemarker/template/utility/StringUtilTest.java b/freemarker-core/src/test/java/freemarker/template/utility/StringUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/StringUtilTest.java
rename to freemarker-core/src/test/java/freemarker/template/utility/StringUtilTest.java
diff --git a/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java b/freemarker-core/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
rename to freemarker-core/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
diff --git a/src/test/java/freemarker/test/MonitoredTemplateLoader.java b/freemarker-core/src/test/java/freemarker/test/MonitoredTemplateLoader.java
similarity index 100%
rename from src/test/java/freemarker/test/MonitoredTemplateLoader.java
rename to freemarker-core/src/test/java/freemarker/test/MonitoredTemplateLoader.java
diff --git a/src/test/java/freemarker/test/RuntimeEnvironmentReporterTest.java b/freemarker-core/src/test/java/freemarker/test/RuntimeEnvironmentReporterTest.java
similarity index 100%
rename from src/test/java/freemarker/test/RuntimeEnvironmentReporterTest.java
rename to freemarker-core/src/test/java/freemarker/test/RuntimeEnvironmentReporterTest.java
diff --git a/src/test/java/freemarker/test/TemplateTest.java b/freemarker-core/src/test/java/freemarker/test/TemplateTest.java
similarity index 98%
rename from src/test/java/freemarker/test/TemplateTest.java
rename to freemarker-core/src/test/java/freemarker/test/TemplateTest.java
index b55eb62..a730b3e 100644
--- a/src/test/java/freemarker/test/TemplateTest.java
+++ b/freemarker-core/src/test/java/freemarker/test/TemplateTest.java
@@ -45,11 +45,11 @@
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.utility.StringUtil;
-import freemarker.test.templatesuite.TemplateTestSuite;
import freemarker.test.utility.TestUtil;
/**
- * Superclass of JUnit tests that process templates but aren't practical to implement via {@link TemplateTestSuite}.
+ * Superclass of JUnit tests that process templates but aren't practical to implement via
+ * {@code freemarker.test.templatesuite.TemplateTestSuite}.
*/
@Ignore
public abstract class TemplateTest {
diff --git a/src/test/java/freemarker/test/TreeView.java b/freemarker-core/src/test/java/freemarker/test/TreeView.java
similarity index 100%
rename from src/test/java/freemarker/test/TreeView.java
rename to freemarker-core/src/test/java/freemarker/test/TreeView.java
diff --git a/src/test/resources/freemarker/cache/test.ftl b/freemarker-core/src/test/resources/freemarker/cache/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/cache/test.ftl
rename to freemarker-core/src/test/resources/freemarker/cache/test.ftl
diff --git a/src/test/resources/freemarker/core/ast-1.ast b/freemarker-core/src/test/resources/freemarker/core/ast-1.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-1.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-1.ast
diff --git a/src/test/resources/freemarker/core/ast-1.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-1.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-1.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-1.ftl
diff --git a/src/test/resources/freemarker/core/ast-assignments.ast b/freemarker-core/src/test/resources/freemarker/core/ast-assignments.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-assignments.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-assignments.ast
diff --git a/src/test/resources/freemarker/core/ast-assignments.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-assignments.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-assignments.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-assignments.ftl
diff --git a/src/test/resources/freemarker/core/ast-builtins.ast b/freemarker-core/src/test/resources/freemarker/core/ast-builtins.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-builtins.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-builtins.ast
diff --git a/src/test/resources/freemarker/core/ast-builtins.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-builtins.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-builtins.ftl
diff --git a/src/test/resources/freemarker/core/ast-lambda.ast b/freemarker-core/src/test/resources/freemarker/core/ast-lambda.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-lambda.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-lambda.ast
diff --git a/src/test/resources/freemarker/core/ast-lambda.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-lambda.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-lambda.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-lambda.ftl
diff --git a/src/test/resources/freemarker/core/ast-locations.ast b/freemarker-core/src/test/resources/freemarker/core/ast-locations.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-locations.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-locations.ast
diff --git a/src/test/resources/freemarker/core/ast-locations.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-locations.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-locations.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-locations.ftl
diff --git a/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ast b/freemarker-core/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ast
diff --git a/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-mixedcontentsimplifications.ftl
diff --git a/src/test/resources/freemarker/core/ast-multipleignoredchildren.ast b/freemarker-core/src/test/resources/freemarker/core/ast-multipleignoredchildren.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-multipleignoredchildren.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-multipleignoredchildren.ast
diff --git a/src/test/resources/freemarker/core/ast-multipleignoredchildren.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-multipleignoredchildren.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-multipleignoredchildren.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-multipleignoredchildren.ftl
diff --git a/src/test/resources/freemarker/core/ast-nestedignoredchildren.ast b/freemarker-core/src/test/resources/freemarker/core/ast-nestedignoredchildren.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-nestedignoredchildren.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-nestedignoredchildren.ast
diff --git a/src/test/resources/freemarker/core/ast-nestedignoredchildren.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-nestedignoredchildren.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-nestedignoredchildren.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-nestedignoredchildren.ftl
diff --git a/src/test/resources/freemarker/core/ast-range.ast b/freemarker-core/src/test/resources/freemarker/core/ast-range.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-range.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-range.ast
diff --git a/src/test/resources/freemarker/core/ast-range.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-range.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-range.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-range.ftl
diff --git a/src/test/resources/freemarker/core/ast-strlitinterpolation.ast b/freemarker-core/src/test/resources/freemarker/core/ast-strlitinterpolation.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-strlitinterpolation.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-strlitinterpolation.ast
diff --git a/src/test/resources/freemarker/core/ast-strlitinterpolation.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-strlitinterpolation.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-strlitinterpolation.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-strlitinterpolation.ftl
diff --git a/src/test/resources/freemarker/core/ast-whitespacestripping.ast b/freemarker-core/src/test/resources/freemarker/core/ast-whitespacestripping.ast
similarity index 100%
rename from src/test/resources/freemarker/core/ast-whitespacestripping.ast
rename to freemarker-core/src/test/resources/freemarker/core/ast-whitespacestripping.ast
diff --git a/src/test/resources/freemarker/core/ast-whitespacestripping.ftl b/freemarker-core/src/test/resources/freemarker/core/ast-whitespacestripping.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/ast-whitespacestripping.ftl
rename to freemarker-core/src/test/resources/freemarker/core/ast-whitespacestripping.ftl
diff --git a/src/test/resources/freemarker/core/cano-assignments.ftl b/freemarker-core/src/test/resources/freemarker/core/cano-assignments.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-assignments.ftl
rename to freemarker-core/src/test/resources/freemarker/core/cano-assignments.ftl
diff --git a/src/test/resources/freemarker/core/cano-assignments.ftl.out b/freemarker-core/src/test/resources/freemarker/core/cano-assignments.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-assignments.ftl.out
rename to freemarker-core/src/test/resources/freemarker/core/cano-assignments.ftl.out
diff --git a/src/test/resources/freemarker/core/cano-builtins.ftl b/freemarker-core/src/test/resources/freemarker/core/cano-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-builtins.ftl
rename to freemarker-core/src/test/resources/freemarker/core/cano-builtins.ftl
diff --git a/src/test/resources/freemarker/core/cano-builtins.ftl.out b/freemarker-core/src/test/resources/freemarker/core/cano-builtins.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-builtins.ftl.out
rename to freemarker-core/src/test/resources/freemarker/core/cano-builtins.ftl.out
diff --git a/src/test/resources/freemarker/core/cano-identifier-escaping.ftl b/freemarker-core/src/test/resources/freemarker/core/cano-identifier-escaping.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-identifier-escaping.ftl
rename to freemarker-core/src/test/resources/freemarker/core/cano-identifier-escaping.ftl
diff --git a/src/test/resources/freemarker/core/cano-identifier-escaping.ftl.out b/freemarker-core/src/test/resources/freemarker/core/cano-identifier-escaping.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-identifier-escaping.ftl.out
rename to freemarker-core/src/test/resources/freemarker/core/cano-identifier-escaping.ftl.out
diff --git a/src/test/resources/freemarker/core/cano-macros.ftl b/freemarker-core/src/test/resources/freemarker/core/cano-macros.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-macros.ftl
rename to freemarker-core/src/test/resources/freemarker/core/cano-macros.ftl
diff --git a/src/test/resources/freemarker/core/cano-macros.ftl.out b/freemarker-core/src/test/resources/freemarker/core/cano-macros.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-macros.ftl.out
rename to freemarker-core/src/test/resources/freemarker/core/cano-macros.ftl.out
diff --git a/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl b/freemarker-core/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/cano-strlitinterpolation.ftl
rename to freemarker-core/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl
diff --git a/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl.out b/freemarker-core/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/core/cano-strlitinterpolation.ftl.out
rename to freemarker-core/src/test/resources/freemarker/core/cano-strlitinterpolation.ftl.out
diff --git a/src/test/resources/freemarker/core/encodingOverride-ISO-8859-1.ftl b/freemarker-core/src/test/resources/freemarker/core/encodingOverride-ISO-8859-1.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/encodingOverride-ISO-8859-1.ftl
rename to freemarker-core/src/test/resources/freemarker/core/encodingOverride-ISO-8859-1.ftl
diff --git a/src/test/resources/freemarker/core/encodingOverride-UTF-8.ftl b/freemarker-core/src/test/resources/freemarker/core/encodingOverride-UTF-8.ftl
similarity index 100%
rename from src/test/resources/freemarker/core/encodingOverride-UTF-8.ftl
rename to freemarker-core/src/test/resources/freemarker/core/encodingOverride-UTF-8.ftl
diff --git a/src/test/resources/freemarker/ext/dom/DOMSiblingTest.xml b/freemarker-core/src/test/resources/freemarker/ext/dom/DOMSiblingTest.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/dom/DOMSiblingTest.xml
rename to freemarker-core/src/test/resources/freemarker/ext/dom/DOMSiblingTest.xml
diff --git a/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-foo.ftl b/freemarker-core/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-foo.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-foo.ftl
rename to freemarker-core/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-foo.ftl
diff --git a/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-lib.ftl b/freemarker-core/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-lib.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-lib.ftl
rename to freemarker-core/src/test/resources/freemarker/manual/AbsoluteTemplateNameBIExample-lib.ftl
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-capture.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-convert.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl.out b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl.out
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-convert2.ftl.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-infoBox.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-markup.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringConcat.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral.ftlh.out
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh
diff --git a/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/AutoEscapingExample-stringLiteral2.ftlh.out
diff --git a/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples1.properties b/freemarker-core/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples1.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/ConfigureOutputFormatExamples1.properties
rename to freemarker-core/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples1.properties
diff --git a/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples2.properties b/freemarker-core/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples2.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/ConfigureOutputFormatExamples2.properties
rename to freemarker-core/src/test/resources/freemarker/manual/ConfigureOutputFormatExamples2.properties
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh b/freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-alias1.ftlh.out
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh b/freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-alias2.ftlh.out
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh b/freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh
diff --git a/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh.out b/freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh.out
similarity index 100%
rename from src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh.out
rename to freemarker-core/src/test/resources/freemarker/manual/CustomFormatsExample-modelAware.ftlh.out
diff --git a/src/test/resources/freemarker/manual/TemplateConfigurationExamples1.properties b/freemarker-core/src/test/resources/freemarker/manual/TemplateConfigurationExamples1.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/TemplateConfigurationExamples1.properties
rename to freemarker-core/src/test/resources/freemarker/manual/TemplateConfigurationExamples1.properties
diff --git a/src/test/resources/freemarker/manual/TemplateConfigurationExamples2.properties b/freemarker-core/src/test/resources/freemarker/manual/TemplateConfigurationExamples2.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/TemplateConfigurationExamples2.properties
rename to freemarker-core/src/test/resources/freemarker/manual/TemplateConfigurationExamples2.properties
diff --git a/src/test/resources/freemarker/manual/TemplateConfigurationExamples3.properties b/freemarker-core/src/test/resources/freemarker/manual/TemplateConfigurationExamples3.properties
similarity index 100%
rename from src/test/resources/freemarker/manual/TemplateConfigurationExamples3.properties
rename to freemarker-core/src/test/resources/freemarker/manual/TemplateConfigurationExamples3.properties
diff --git a/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl b/freemarker-core/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl
rename to freemarker-core/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl
diff --git a/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl.out b/freemarker-core/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl.out
rename to freemarker-core/src/test/resources/freemarker/manual/WithArgsExamples-usingWithArgsSpecialVariable.ftl.out
diff --git a/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl b/freemarker-core/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/WithArgsLastExamples.ftl
rename to freemarker-core/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl
diff --git a/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl.out b/freemarker-core/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/manual/WithArgsLastExamples.ftl.out
rename to freemarker-core/src/test/resources/freemarker/manual/WithArgsLastExamples.ftl.out
diff --git a/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-foo.ftl b/freemarker-core/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-foo.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-foo.ftl
rename to freemarker-core/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-foo.ftl
diff --git a/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl b/freemarker-core/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl
similarity index 100%
rename from src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl
rename to freemarker-core/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl
diff --git a/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl.out b/freemarker-core/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl.out
similarity index 100%
rename from src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl.out
rename to freemarker-core/src/test/resources/freemarker/manual/dir/AbsoluteTemplateNameBIExample-main.ftl.out
diff --git a/src/test/resources/freemarker/manual/test.ftlh b/freemarker-core/src/test/resources/freemarker/manual/test.ftlh
similarity index 100%
rename from src/test/resources/freemarker/manual/test.ftlh
rename to freemarker-core/src/test/resources/freemarker/manual/test.ftlh
diff --git a/src/test/resources/freemarker/template/toCache1.ftl b/freemarker-core/src/test/resources/freemarker/template/toCache1.ftl
similarity index 100%
rename from src/test/resources/freemarker/template/toCache1.ftl
rename to freemarker-core/src/test/resources/freemarker/template/toCache1.ftl
diff --git a/src/test/resources/freemarker/template/toCache2.ftl b/freemarker-core/src/test/resources/freemarker/template/toCache2.ftl
similarity index 100%
rename from src/test/resources/freemarker/template/toCache2.ftl
rename to freemarker-core/src/test/resources/freemarker/template/toCache2.ftl
diff --git a/src/main/java/freemarker/core/_Java16Impl.java b/freemarker-core16/src/main/java/freemarker/core/_Java16Impl.java
similarity index 100%
rename from src/main/java/freemarker/core/_Java16Impl.java
rename to freemarker-core16/src/main/java/freemarker/core/_Java16Impl.java
diff --git a/src/main/java/freemarker/cache/WebappTemplateLoader.java b/freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java
similarity index 100%
rename from src/main/java/freemarker/cache/WebappTemplateLoader.java
rename to freemarker-jsp20/src/main/java/freemarker/cache/WebappTemplateLoader.java
diff --git a/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
diff --git a/src/main/java/freemarker/ext/jsp/EventForwarding.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/EventForwarding.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/EventForwarding.java
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory.java
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
diff --git a/src/main/java/freemarker/ext/jsp/FreemarkerTag.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreemarkerTag.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
diff --git a/src/main/java/freemarker/ext/jsp/JspContextModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/JspContextModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspContextModel.java
diff --git a/src/main/java/freemarker/ext/jsp/JspTagModelBase.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/JspTagModelBase.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
diff --git a/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/JspWriterAdapter.java
diff --git a/src/main/java/freemarker/ext/jsp/PageContextFactory.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/PageContextFactory.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/PageContextFactory.java
diff --git a/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
diff --git a/src/main/java/freemarker/ext/jsp/TagTransformModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/TagTransformModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/TagTransformModel.java
diff --git a/src/main/java/freemarker/ext/jsp/TaglibFactory.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/TaglibFactory.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibFactory.java
diff --git a/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/TaglibMethodUtil.java
diff --git a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
diff --git a/src/main/java/freemarker/ext/jsp/package.html b/freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/package.html
rename to freemarker-jsp20/src/main/java/freemarker/ext/jsp/package.html
diff --git a/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/AllHttpScopesHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
similarity index 99%
rename from src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
index b9164ab..40ca7a4 100644
--- a/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
+++ b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
@@ -40,7 +40,6 @@
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.cache.ClassTemplateLoader;
import freemarker.cache.FileTemplateLoader;
import freemarker.cache.MultiTemplateLoader;
diff --git a/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
diff --git a/src/main/java/freemarker/ext/servlet/IncludePage.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/IncludePage.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/IncludePage.java
diff --git a/src/main/java/freemarker/ext/servlet/InitParamParser.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/InitParamParser.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/InitParamParser.java
diff --git a/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
diff --git a/freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java
new file mode 100644
index 0000000..45e9652
--- /dev/null
+++ b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/SuppressFBWarnings.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package freemarker.ext.servlet;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.CLASS)
+@interface SuppressFBWarnings {
+ String[] value() default {};
+ String justification() default "";
+}
diff --git a/src/main/java/freemarker/ext/servlet/package.html b/freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/servlet/package.html
rename to freemarker-jsp20/src/main/java/freemarker/ext/servlet/package.html
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
rename to freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
rename to freemarker-jsp21/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory21.java
diff --git a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java b/freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
similarity index 100%
rename from src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
rename to freemarker-jsp21/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
diff --git a/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServlet.java
diff --git a/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/JspTestFreemarkerServletWithDefaultOverride.java
diff --git a/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
diff --git a/src/test/java/freemarker/ext/jsp/TLDParsingTest.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/TLDParsingTest.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/TLDParsingTest.java
diff --git a/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/TaglibMethodUtilTest.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeAccessorTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/AttributeInfoTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/EnclosingClass.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/GetAndSetTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag2.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestSimpleTag3.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag2.java
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/taglibmembers/TestTag3.java
diff --git a/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java b/freemarker-jsp21/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
similarity index 100%
rename from src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/jsp/webapps/config/WebappLocalFreemarkerServlet.java
diff --git a/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java b/freemarker-jsp21/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/servlet/FreemarkerServletTest.java
diff --git a/src/test/java/freemarker/ext/servlet/InitParamParserTest.java b/freemarker-jsp21/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
similarity index 100%
rename from src/test/java/freemarker/ext/servlet/InitParamParserTest.java
rename to freemarker-jsp21/src/test/java/freemarker/ext/servlet/InitParamParserTest.java
diff --git a/src/test/java/freemarker/template/MockServletContext.java b/freemarker-jsp21/src/test/java/freemarker/template/MockServletContext.java
similarity index 100%
rename from src/test/java/freemarker/template/MockServletContext.java
rename to freemarker-jsp21/src/test/java/freemarker/template/MockServletContext.java
diff --git a/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java b/freemarker-jsp21/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
similarity index 100%
rename from src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
rename to freemarker-jsp21/src/test/java/freemarker/template/TemplateNotFoundMessageTest.java
diff --git a/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java b/freemarker-jsp21/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
similarity index 100%
rename from src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
rename to freemarker-jsp21/src/test/java/freemarker/test/servlet/DefaultModel2TesterAction.java
diff --git a/src/test/java/freemarker/test/servlet/Model2Action.java b/freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2Action.java
similarity index 100%
rename from src/test/java/freemarker/test/servlet/Model2Action.java
rename to freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2Action.java
diff --git a/src/test/java/freemarker/test/servlet/Model2TesterServlet.java b/freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
similarity index 100%
rename from src/test/java/freemarker/test/servlet/Model2TesterServlet.java
rename to freemarker-jsp21/src/test/java/freemarker/test/servlet/Model2TesterServlet.java
diff --git a/src/test/java/freemarker/test/servlet/WebAppTestCase.java b/freemarker-jsp21/src/test/java/freemarker/test/servlet/WebAppTestCase.java
similarity index 100%
rename from src/test/java/freemarker/test/servlet/WebAppTestCase.java
rename to freemarker-jsp21/src/test/java/freemarker/test/servlet/WebAppTestCase.java
diff --git a/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld b/freemarker-jsp21/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
similarity index 100%
rename from src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
rename to freemarker-jsp21/src/test/resources/META-INF/tldDiscovery MetaInfTldSources-1.tld
diff --git a/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/TLDParsingTest.tld
diff --git a/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/templates/classpath-test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-1.tld
diff --git a/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/tldDiscovery-ClassPathTlds-2.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-function-tag-name-clash.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/el-functions.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.0.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes-2.3.22-future.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/attributes.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/test.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/attributes.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customELFunctions1.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/customTags1.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/elFunctionsTagNameClash.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial-jstl-@Ignore.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/basic/trivial.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/sub/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/classes/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/lib/templates.jar/sub/test2.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/templates/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/config/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.ftlnv
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-parsetime.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/failing-runtime.jsp
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/errors/not-failing.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/templates/test.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/multipleLoaders/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/CONTENTS.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/subdir/test-rel.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test-noClasspath.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/expected/test1.txt
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag 2.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/fmtesttag4.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/lib/taglib-foo.jar/META-INF/foo bar.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/subdir-with-tld/fmtesttag3.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/taglib 2.jar/META-INF/taglib.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/WEB-INF/web.xml
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/not-auto-scanned/fmtesttag.tld
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/subdir/test-rel.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test-noClasspath.ftl
diff --git a/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl b/freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
similarity index 100%
rename from src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
rename to freemarker-jsp21/src/test/resources/freemarker/ext/jsp/webapps/tldDiscovery/test1.ftl
diff --git a/src/test/java/freemarker/test/servlet/web.xml b/freemarker-jsp21/src/test/resources/freemarker/test/servlet/web.xml
similarity index 100%
rename from src/test/java/freemarker/test/servlet/web.xml
rename to freemarker-jsp21/src/test/resources/freemarker/test/servlet/web.xml
diff --git a/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java b/freemarker-jython20/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
similarity index 100%
rename from src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
diff --git a/src/main/java/freemarker/ext/ant/JythonAntTask.java b/freemarker-jython20/src/main/java/freemarker/ext/ant/JythonAntTask.java
similarity index 100%
rename from src/main/java/freemarker/ext/ant/JythonAntTask.java
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/JythonAntTask.java
diff --git a/src/main/java/freemarker/ext/ant/UnlinkedJythonOperations.java b/freemarker-jython20/src/main/java/freemarker/ext/ant/UnlinkedJythonOperations.java
similarity index 100%
rename from src/main/java/freemarker/ext/ant/UnlinkedJythonOperations.java
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/UnlinkedJythonOperations.java
diff --git a/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java b/freemarker-jython20/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
similarity index 100%
rename from src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
diff --git a/src/main/java/freemarker/ext/ant/package.html b/freemarker-jython20/src/main/java/freemarker/ext/ant/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/ant/package.html
rename to freemarker-jython20/src/main/java/freemarker/ext/ant/package.html
diff --git a/src/main/java/freemarker/ext/jython/JythonHashModel.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonHashModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonHashModel.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonHashModel.java
diff --git a/src/main/java/freemarker/ext/jython/JythonModel.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonModel.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonModel.java
diff --git a/src/main/java/freemarker/ext/jython/JythonModelCache.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonModelCache.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonModelCache.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonModelCache.java
diff --git a/src/main/java/freemarker/ext/jython/JythonNumberModel.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonNumberModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonNumberModel.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonNumberModel.java
diff --git a/src/main/java/freemarker/ext/jython/JythonSequenceModel.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonSequenceModel.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonSequenceModel.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonSequenceModel.java
diff --git a/src/main/java/freemarker/ext/jython/JythonVersionAdapter.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonVersionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonVersionAdapter.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonVersionAdapter.java
diff --git a/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
diff --git a/src/main/java/freemarker/ext/jython/JythonWrapper.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/JythonWrapper.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/JythonWrapper.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/JythonWrapper.java
diff --git a/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java b/freemarker-jython20/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
diff --git a/src/main/java/freemarker/ext/jython/package.html b/freemarker-jython20/src/main/java/freemarker/ext/jython/package.html
similarity index 100%
rename from src/main/java/freemarker/ext/jython/package.html
rename to freemarker-jython20/src/main/java/freemarker/ext/jython/package.html
diff --git a/src/main/java/freemarker/template/utility/JythonRuntime.java b/freemarker-jython20/src/main/java/freemarker/template/utility/JythonRuntime.java
similarity index 100%
rename from src/main/java/freemarker/template/utility/JythonRuntime.java
rename to freemarker-jython20/src/main/java/freemarker/template/utility/JythonRuntime.java
diff --git a/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java b/freemarker-jython22/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
rename to freemarker-jython22/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
diff --git a/src/main/java/freemarker/ext/jython/_Jython25VersionAdapter.java b/freemarker-jython25/src/main/java/freemarker/ext/jython/_Jython25VersionAdapter.java
similarity index 100%
rename from src/main/java/freemarker/ext/jython/_Jython25VersionAdapter.java
rename to freemarker-jython25/src/main/java/freemarker/ext/jython/_Jython25VersionAdapter.java
diff --git a/src/test/java/freemarker/core/ObjectBuilderSettingsTest.java b/freemarker-jython25/src/test/java/freemarker/core/ObjectBuilderSettingsTest.java
similarity index 100%
rename from src/test/java/freemarker/core/ObjectBuilderSettingsTest.java
rename to freemarker-jython25/src/test/java/freemarker/core/ObjectBuilderSettingsTest.java
diff --git a/src/test/java/freemarker/core/subpkg/PackageVisibleAll.java b/freemarker-jython25/src/test/java/freemarker/core/subpkg/PackageVisibleAll.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PackageVisibleAll.java
rename to freemarker-jython25/src/test/java/freemarker/core/subpkg/PackageVisibleAll.java
diff --git a/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilder.java b/freemarker-jython25/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilder.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilder.java
rename to freemarker-jython25/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilder.java
diff --git a/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilderBuilder.java b/freemarker-jython25/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilderBuilder.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilderBuilder.java
rename to freemarker-jython25/src/test/java/freemarker/core/subpkg/PackageVisibleAllWithBuilderBuilder.java
diff --git a/src/test/java/freemarker/core/subpkg/PackageVisibleWithPublicConstructor.java b/freemarker-jython25/src/test/java/freemarker/core/subpkg/PackageVisibleWithPublicConstructor.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PackageVisibleWithPublicConstructor.java
rename to freemarker-jython25/src/test/java/freemarker/core/subpkg/PackageVisibleWithPublicConstructor.java
diff --git a/src/test/java/freemarker/core/subpkg/PublicAll.java b/freemarker-jython25/src/test/java/freemarker/core/subpkg/PublicAll.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PublicAll.java
rename to freemarker-jython25/src/test/java/freemarker/core/subpkg/PublicAll.java
diff --git a/src/test/java/freemarker/core/subpkg/PublicWithMixedConstructors.java b/freemarker-jython25/src/test/java/freemarker/core/subpkg/PublicWithMixedConstructors.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PublicWithMixedConstructors.java
rename to freemarker-jython25/src/test/java/freemarker/core/subpkg/PublicWithMixedConstructors.java
diff --git a/src/test/java/freemarker/core/subpkg/PublicWithPackageVisibleConstructor.java b/freemarker-jython25/src/test/java/freemarker/core/subpkg/PublicWithPackageVisibleConstructor.java
similarity index 100%
rename from src/test/java/freemarker/core/subpkg/PublicWithPackageVisibleConstructor.java
rename to freemarker-jython25/src/test/java/freemarker/core/subpkg/PublicWithPackageVisibleConstructor.java
diff --git a/src/test/java/freemarker/template/DefaultObjectWrapperTest.java b/freemarker-jython25/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
similarity index 100%
rename from src/test/java/freemarker/template/DefaultObjectWrapperTest.java
rename to freemarker-jython25/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
diff --git a/src/test/java/freemarker/template/SimpleObjectWrapperTest.java b/freemarker-jython25/src/test/java/freemarker/template/SimpleObjectWrapperTest.java
similarity index 100%
rename from src/test/java/freemarker/template/SimpleObjectWrapperTest.java
rename to freemarker-jython25/src/test/java/freemarker/template/SimpleObjectWrapperTest.java
diff --git a/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java b/freemarker-jython25/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
rename to freemarker-jython25/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
diff --git a/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java b/freemarker-jython25/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
similarity index 98%
rename from src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
rename to freemarker-jython25/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
index 52435d1..1fd83e5 100644
--- a/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
+++ b/freemarker-jython25/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
@@ -32,6 +32,8 @@
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
@@ -53,6 +55,7 @@
* If you only want to run certain tests, you can specify a regular expression for
* the test name in the {@link #TEST_FILTER_PROPERTY_NAME} system property.
*/
+@RunWith(AllTests.class)
public class TemplateTestSuite extends TestSuite {
private static final String ELEM_TEST_CASE = "testCase";
diff --git a/src/test/java/freemarker/test/templatesuite/package.html b/freemarker-jython25/src/test/java/freemarker/test/templatesuite/package.html
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/package.html
rename to freemarker-jython25/src/test/java/freemarker/test/templatesuite/package.html
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/arithmetic.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/arithmetic.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/arithmetic.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/arithmetic.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/bean-maps.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/bean-maps.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/bean-maps.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/bean-maps.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/beans.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/beans.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/beans.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/beans.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/boolean-formatting.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/boolean-formatting.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/boolean-formatting.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/boolean-formatting.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/boolean.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/boolean.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/boolean.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/boolean.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/charset-in-header.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/charset-in-header.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/charset-in-header.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/charset-in-header.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/classic-compatible.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/classic-compatible.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/classic-compatible.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/classic-compatible.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/comment.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/comment.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/comment.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/comment.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/comparisons.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/comparisons.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/comparisons.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/comparisons.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/compress.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/compress.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/compress.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/compress.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/dateformat-java.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/dateformat-java.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/dateformat-java.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/dateformat-java.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/default-xmlns.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/default-xmlns.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/default-xmlns.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/default-xmlns.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/default.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/default.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/default.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/default.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins-ici-2.3.20.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins-ici-2.3.20.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins-ici-2.3.20.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins-ici-2.3.20.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/encoding-builtins.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/escapes.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/escapes.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/escapes.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/escapes.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/exception.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/exception.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/exception.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/exception.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/exception2.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/exception2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/exception2.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/exception2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/exception3.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/exception3.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/exception3.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/exception3.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/exthash.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/exthash.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/exthash.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/exthash.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/hashconcat.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/hashconcat.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/hashconcat.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/hashconcat.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/hashliteral.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/hashliteral.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/hashliteral.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/hashliteral.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/helloworld.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/helloworld.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/helloworld.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/helloworld.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/identifier-escaping.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/identifier-escaping.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/identifier-escaping.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/identifier-escaping.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/identifier-non-ascii.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/identifier-non-ascii.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/identifier-non-ascii.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/identifier-non-ascii.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/if.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/if.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/if.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/if.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/import.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/import.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/import.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/import.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/include.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/include.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/include.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/include.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/include2.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/include2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/include2.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/include2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/interpret.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/interpret.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/interpret.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/interpret.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/iterators.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/iterators.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/iterators.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/iterators.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/lastcharacter.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/lastcharacter.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/lastcharacter.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/lastcharacter.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/list-bis.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/list-bis.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/list-bis.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/list-bis.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/list.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/list.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/list.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/list.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/list2.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/list2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/list2.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/list2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/list3.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/list3.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/list3.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/list3.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/listhash.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/listhash.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/listhash.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/listhash.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.20.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.20.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.20.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.20.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.21.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.21.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.21.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/listhashliteral-ici-2.3.21.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/listliteral.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/listliteral.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/listliteral.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/listliteral.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/localization.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/localization.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/localization.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/localization.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/logging.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/logging.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/logging.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/logging.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/loopvariable.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/loopvariable.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/loopvariable.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/loopvariable.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/macros-return.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/macros-return.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/macros-return.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/macros-return.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/macros.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/macros.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/macros.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/macros.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/macros2.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/macros2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/macros2.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/macros2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/multimodels.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/multimodels.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/multimodels.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/multimodels.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/nested.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/nested.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/nested.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/nested.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-allowsnothing.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-allowsnothing.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-allowsnothing.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-allowsnothing.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-defaultresolver.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-defaultresolver.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-defaultresolver.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-defaultresolver.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-optin.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-optin.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-optin.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-optin.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-safer.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-safer.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-safer.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-safer.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/new-unrestricted.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-unrestricted.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/new-unrestricted.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/new-unrestricted.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/newlines1.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/newlines1.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/newlines1.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/newlines1.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/newlines2.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/newlines2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/newlines2.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/newlines2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/non-strict-syntax.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/non-strict-syntax.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/non-strict-syntax.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/non-strict-syntax.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/noparse.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/noparse.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/noparse.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/noparse.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/number-format.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/number-format.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/number-format.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/number-format.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/number-literal.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/number-literal.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/number-literal.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/number-literal.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/number-to-date.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/number-to-date.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/number-to-date.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/number-to-date.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/numerical-cast.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/numerical-cast.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/numerical-cast.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/numerical-cast.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/output-encoding1.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/output-encoding1.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/output-encoding1.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/output-encoding1.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
Binary files differ
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/output-encoding3.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/output-encoding3.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/output-encoding3.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/output-encoding3.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/precedence.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/precedence.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/precedence.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/precedence.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/recover.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/recover.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/recover.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/recover.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/root.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/root.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/root.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/root.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/sequence-builtins.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/specialvars.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/strictinheader.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/strictinheader.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/strictinheader.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/strictinheader.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps-matches.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps-matches.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps-matches.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps-matches.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/string-builtins-regexps.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/string-builtins1.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/string-builtins1.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/string-builtins1.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/string-builtins1.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/string-builtins2.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/string-builtins2.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/string-builtins2.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/string-builtins2.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/stringbimethods.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/stringbimethods.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/stringbimethods.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/stringbimethods.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/stringliteral.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/stringliteral.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/stringliteral.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/stringliteral.txt
Binary files differ
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/switch.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/switch.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/switch.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/switch.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/transforms.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/transforms.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/transforms.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/transforms.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.21.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.21.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.21.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.21.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.24.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.24.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.24.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/type-builtins-ici-2.3.24.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/type-builtins.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/type-builtins.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/type-builtins.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/type-builtins.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/var-layers.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/var-layers.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/var-layers.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/var-layers.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/varargs.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/varargs.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/varargs.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/varargs.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/variables.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/variables.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/variables.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/variables.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/whitespace-trim.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/whitespace-trim.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/whitespace-trim.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/whitespace-trim.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/wstrip-in-header.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/wstrip-in-header.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/wstrip-in-header.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/wstrip-in-header.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/wstripping.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/wstripping.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/wstripping.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/wstripping.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xml-fragment.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xml-fragment.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xml-fragment.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xml-fragment.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xml-ns_prefix-scope.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xml-ns_prefix-scope.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xml-ns_prefix-scope.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xml-ns_prefix-scope.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xml.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xml.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xml.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xml.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xmlns1.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xmlns1.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xmlns1.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xmlns1.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xmlns3.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xmlns3.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xmlns3.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xmlns3.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xmlns4.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xmlns4.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xmlns4.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xmlns4.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/expected/xmlns5.txt b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xmlns5.txt
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/expected/xmlns5.txt
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/expected/xmlns5.txt
diff --git a/src/test/resources/freemarker/test/templatesuite/models/BeansTestResources.properties b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/BeansTestResources.properties
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/BeansTestResources.properties
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/BeansTestResources.properties
diff --git a/src/test/resources/freemarker/test/templatesuite/models/defaultxmlns1.xml b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/defaultxmlns1.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/defaultxmlns1.xml
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/defaultxmlns1.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xml-ns_prefix-scope.xml b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xml-ns_prefix-scope.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xml-ns_prefix-scope.xml
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xml-ns_prefix-scope.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xml.xml b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xml.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xml.xml
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xml.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xmlfragment.xml b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xmlfragment.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xmlfragment.xml
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xmlfragment.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xmlns.xml b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xmlns.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xmlns.xml
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xmlns.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xmlns2.xml b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xmlns2.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xmlns2.xml
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xmlns2.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/models/xmlns3.xml b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xmlns3.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/models/xmlns3.xml
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/models/xmlns3.xml
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/api-builtins.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/api-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/api-builtins.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/api-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/arithmetic.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/arithmetic.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/arithmetic.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/arithmetic.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/assignments.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/assignments.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/assignments.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/assignments.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/bean-maps.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/bean-maps.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/bean-maps.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/bean-maps.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/beans.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/beans.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/beans.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/beans.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/boolean-formatting.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/boolean-formatting.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/boolean-formatting.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/boolean-formatting.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/boolean.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/boolean.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/boolean.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/boolean.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/charset-in-header.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc1.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc1.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/charset-in-header_inc2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible-mode2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible-mode2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/classic-compatible-mode2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible-mode2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/classic-compatible.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/classic-compatible.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/comment.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/comment.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/comment.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/comment.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/comparisons.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/comparisons.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/comparisons.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/comparisons.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/compress.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/compress.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/compress.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/compress.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/date-type-builtins.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/date-type-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/date-type-builtins.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/date-type-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-common.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-common.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-common.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-common.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-ici-2.3.21.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-ici-2.3.21.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-ici-2.3.21.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi-ici-2.3.21.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-bi.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-like.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-like.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-like.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-iso-like.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateformat-java.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-java.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateformat-java.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateformat-java.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/dateparsing.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateparsing.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/dateparsing.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/dateparsing.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/default-xmlns.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/default-xmlns.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/default-xmlns.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/default-xmlns.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/default.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/default.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/default.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/default.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/encoding-builtins.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/encoding-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/encoding-builtins.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/encoding-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/escapes.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/escapes.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/escapes.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/escapes.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/exception.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/exception.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/exception.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/exception.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/exception2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/exception2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/exception2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/exception2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/exception3.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/exception3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/exception3.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/exception3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/existence-operators.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/existence-operators.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/existence-operators.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/existence-operators.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/hashconcat.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/hashconcat.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/hashconcat.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/hashconcat.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/hashliteral.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/hashliteral.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/hashliteral.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/hashliteral.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/helloworld.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/helloworld.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/helloworld.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/helloworld.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/identifier-escaping.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/identifier-escaping.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/identifier-escaping.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/identifier-escaping.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/identifier-non-ascii.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/identifier-non-ascii.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/identifier-non-ascii.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/identifier-non-ascii.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/if.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/if.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/if.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/if.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/import.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/import.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/import.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/import.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/import_lib.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/import_lib.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/import_lib.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/import_lib.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/include.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/include.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/include.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/include.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/include2-included-encoding.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/include2-included-encoding.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/include2-included-encoding.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/include2-included-encoding.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/include2-included.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/include2-included.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/include2-included.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/include2-included.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/include2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/include2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/include2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/include2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/included.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/included.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/included.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/included.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/interpret.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/interpret.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/interpret.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/interpret.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/iterators.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/iterators.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/iterators.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/iterators.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/lastcharacter.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/lastcharacter.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/lastcharacter.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/lastcharacter.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/list-bis.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/list-bis.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/list-bis.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/list-bis.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/list.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/list.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/list.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/list.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/list2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/list2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/list2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/list2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/list3.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/list3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/list3.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/list3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/listhash.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/listhash.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/listhash.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/listhash.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/listhashliteral.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/listhashliteral.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/listhashliteral.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/listhashliteral.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/listliteral.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/listliteral.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/listliteral.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/listliteral.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/localization.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/localization.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/localization.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/localization.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/localization_en.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/localization_en.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/localization_en.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/localization_en.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/localization_en_AU.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/localization_en_AU.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/localization_en_AU.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/localization_en_AU.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/logging.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/logging.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/logging.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/logging.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/loopvariable.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/loopvariable.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/loopvariable.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/loopvariable.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/macros-return.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/macros-return.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/macros-return.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/macros-return.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/macros.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/macros.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/macros.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/macros.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/macros2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/macros2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/macros2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/macros2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/multimodels.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/multimodels.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/multimodels.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/multimodels.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/nested.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/nested.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/nested.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/nested.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/nestedinclude.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/nestedinclude.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/nestedinclude.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/nestedinclude.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-allowsnothing.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-allowsnothing.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-allowsnothing.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-allowsnothing.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-defaultresolver.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-defaultresolver.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-defaultresolver.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-defaultresolver.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-optin.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-optin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-optin.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-optin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-safer.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-safer.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-safer.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-safer.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/new-unrestricted.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-unrestricted.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/new-unrestricted.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/new-unrestricted.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/newlines1.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/newlines1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/newlines1.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/newlines1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/newlines2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/newlines2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/newlines2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/newlines2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/non-strict-syntax.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/non-strict-syntax.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/non-strict-syntax.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/non-strict-syntax.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/noparse.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/noparse.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/noparse.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/noparse.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/number-format.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/number-format.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/number-format.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/number-format.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/number-literal.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/number-literal.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/number-literal.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/number-literal.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/number-math-builtins.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/number-math-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/number-math-builtins.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/number-math-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/number-to-date.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/number-to-date.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/number-to-date.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/number-to-date.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/numerical-cast.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/numerical-cast.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/numerical-cast.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/numerical-cast.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/output-encoding1.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/output-encoding1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/output-encoding1.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/output-encoding1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/output-encoding2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/output-encoding2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/output-encoding2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/output-encoding2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/output-encoding3.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/output-encoding3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/output-encoding3.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/output-encoding3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.20.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.20.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.21.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.21.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.21.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-bwici-2.3.21.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-common.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-common.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-common.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-common.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-desc-bwici-2.3.20.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-desc-bwici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-desc-bwici-2.3.20.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-desc-bwici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-inc-bwici-2.3.20.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-inc-bwici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-inc-bwici-2.3.20.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-2-inc-bwici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-23bc.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-23bc.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-23bc.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/overloaded-methods-23bc.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/precedence.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/precedence.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/precedence.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/precedence.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/range-common.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/range-common.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/range-common.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/range-common.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/range-ici-2.3.21.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/range-lazy.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/range-lazy.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/range-lazy.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/range-lazy.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/recover.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/recover.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/recover.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/recover.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/root.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/root.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/root.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/root.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/sequence-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/setting.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/setting.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/simplehash-char-key.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/simplehash-char-key.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/simplehash-char-key.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/simplehash-char-key.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/specialvars.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/strictinheader.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/strictinheader.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/strictinheader.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/strictinheader.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc1.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc1.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/strictinheader_inc2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtin-coercion.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtin-coercion.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtin-coercion.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtin-coercion.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.19.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-ici-2.3.20.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps-matches.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps-matches.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps-matches.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps-matches.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins-regexps.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins1.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins1.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/string-builtins3.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/string-builtins3.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/string-builtins3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/stringbimethods.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/stringbimethods.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/stringbimethods.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/stringbimethods.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/stringliteral.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/stringliteral.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/stringliteral.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/stringliteral.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/include-subdir2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin-2.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin-2.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin-2.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin-2.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/new-optin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/subdir/subsub/new-optin.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/subsub/new-optin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/subdir/subsub/new-optin.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/subdir/subsub/new-optin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/switch-builtin.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/switch-builtin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/switch-builtin.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/switch-builtin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/switch.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/switch.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/switch.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/switch.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/then-builtin.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/then-builtin.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/then-builtin.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/then-builtin.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/transforms.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/transforms.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/transforms.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/transforms.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/type-builtins.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/type-builtins.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/type-builtins.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/type-builtins.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/undefined.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/undefined.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/undefined.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/undefined.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/url.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/url.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/url.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/url.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/var-layers.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/var-layers.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/var-layers.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/var-layers.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/varargs.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/varargs.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/varargs.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/varargs.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/variables.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/variables.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/variables.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/variables.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/varlayers_lib.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/varlayers_lib.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/varlayers_lib.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/varlayers_lib.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/whitespace-trim.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/whitespace-trim.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/whitespace-trim.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/whitespace-trim.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/wsstripinheader_inc.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/wsstripinheader_inc.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/wsstripinheader_inc.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/wsstripinheader_inc.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/wstrip-in-header.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/wstrip-in-header.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/wstrip-in-header.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/wstrip-in-header.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xml-fragment.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xml-fragment.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xml-fragment.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xml-fragment.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-lib.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-lib.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-lib.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-lib.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-main.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-main.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-main.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xml-ns_prefix-scope-main.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xml.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xml.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xml.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xml.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xmlns1.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xmlns1.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xmlns1.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xmlns1.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xmlns3.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xmlns3.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xmlns3.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xmlns3.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xmlns4.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xmlns4.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xmlns4.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xmlns4.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/templates/xmlns5.ftl b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xmlns5.ftl
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/templates/xmlns5.ftl
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/templates/xmlns5.ftl
diff --git a/src/test/resources/freemarker/test/templatesuite/testcases.xml b/freemarker-jython25/src/test/resources/freemarker/test/templatesuite/testcases.xml
similarity index 100%
rename from src/test/resources/freemarker/test/templatesuite/testcases.xml
rename to freemarker-jython25/src/test/resources/freemarker/test/templatesuite/testcases.xml
diff --git a/src/manual/en_US/book.xml b/freemarker-manual/src/main/docgen/en_US/book.xml
similarity index 100%
rename from src/manual/en_US/book.xml
rename to freemarker-manual/src/main/docgen/en_US/book.xml
diff --git a/src/manual/en_US/docgen-help/editors-readme.txt b/freemarker-manual/src/main/docgen/en_US/docgen-help/editors-readme.txt
similarity index 100%
rename from src/manual/en_US/docgen-help/editors-readme.txt
rename to freemarker-manual/src/main/docgen/en_US/docgen-help/editors-readme.txt
diff --git a/src/manual/en_US/docgen-misc/copyrightComment.txt b/freemarker-manual/src/main/docgen/en_US/docgen-misc/copyrightComment.txt
similarity index 100%
rename from src/manual/en_US/docgen-misc/copyrightComment.txt
rename to freemarker-manual/src/main/docgen/en_US/docgen-misc/copyrightComment.txt
diff --git a/src/manual/en_US/docgen-misc/googleAnalytics.html b/freemarker-manual/src/main/docgen/en_US/docgen-misc/googleAnalytics.html
similarity index 100%
rename from src/manual/en_US/docgen-misc/googleAnalytics.html
rename to freemarker-manual/src/main/docgen/en_US/docgen-misc/googleAnalytics.html
diff --git a/src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png b/freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/model2sketch_with_alpha.png
similarity index 100%
rename from src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
rename to freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/model2sketch_with_alpha.png
Binary files differ
diff --git a/src/manual/en_US/docgen-originals/figures/odg-convert-howto.txt b/freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/odg-convert-howto.txt
similarity index 100%
rename from src/manual/en_US/docgen-originals/figures/odg-convert-howto.txt
rename to freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/odg-convert-howto.txt
diff --git a/src/manual/en_US/docgen-originals/figures/overview.odg b/freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/overview.odg
similarity index 100%
rename from src/manual/en_US/docgen-originals/figures/overview.odg
rename to freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/overview.odg
Binary files differ
diff --git a/src/manual/en_US/docgen-originals/figures/tree_with_alpha.png b/freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/tree_with_alpha.png
similarity index 100%
rename from src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
rename to freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/tree_with_alpha.png
Binary files differ
diff --git a/src/manual/en_US/docgen.cjson b/freemarker-manual/src/main/docgen/en_US/docgen.cjson
similarity index 100%
rename from src/manual/en_US/docgen.cjson
rename to freemarker-manual/src/main/docgen/en_US/docgen.cjson
diff --git a/src/manual/en_US/favicon.png b/freemarker-manual/src/main/docgen/en_US/favicon.png
similarity index 100%
rename from src/manual/en_US/favicon.png
rename to freemarker-manual/src/main/docgen/en_US/favicon.png
Binary files differ
diff --git a/src/manual/en_US/figures/model2sketch.png b/freemarker-manual/src/main/docgen/en_US/figures/model2sketch.png
similarity index 100%
rename from src/manual/en_US/figures/model2sketch.png
rename to freemarker-manual/src/main/docgen/en_US/figures/model2sketch.png
Binary files differ
diff --git a/src/manual/en_US/figures/overview.png b/freemarker-manual/src/main/docgen/en_US/figures/overview.png
similarity index 100%
rename from src/manual/en_US/figures/overview.png
rename to freemarker-manual/src/main/docgen/en_US/figures/overview.png
Binary files differ
diff --git a/src/manual/en_US/figures/tree.png b/freemarker-manual/src/main/docgen/en_US/figures/tree.png
similarity index 100%
rename from src/manual/en_US/figures/tree.png
rename to freemarker-manual/src/main/docgen/en_US/figures/tree.png
Binary files differ
diff --git a/src/manual/en_US/logo.png b/freemarker-manual/src/main/docgen/en_US/logo.png
similarity index 100%
rename from src/manual/en_US/logo.png
rename to freemarker-manual/src/main/docgen/en_US/logo.png
Binary files differ
diff --git a/src/test/java/freemarker/core/ASTPrinter.java b/freemarker-test-utils/src/main/java/freemarker/core/ASTPrinter.java
similarity index 100%
rename from src/test/java/freemarker/core/ASTPrinter.java
rename to freemarker-test-utils/src/main/java/freemarker/core/ASTPrinter.java
diff --git a/src/test/java/freemarker/ext/beans/AlphabeticalMethodSorter.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/AlphabeticalMethodSorter.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/AlphabeticalMethodSorter.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/AlphabeticalMethodSorter.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperDesc2003020.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperDesc2003020.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperDesc2003020.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperDesc2003020.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperDesc2003021.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperDesc2003021.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperDesc2003021.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperDesc2003021.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperInc2003020.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperInc2003020.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperInc2003020.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperInc2003020.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperInc2003021.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperInc2003021.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperInc2003021.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperInc2003021.java
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperWithShortedMethods.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperWithShortedMethods.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/BeansWrapperWithShortedMethods.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/BeansWrapperWithShortedMethods.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003020.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003020.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003020.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003020.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003021.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003021.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003021.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003021.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003022.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003022.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003022.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperDesc2003022.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003020.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperInc2003020.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003020.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperInc2003020.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003021.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperInc2003021.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003021.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperInc2003021.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003022.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperInc2003022.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperInc2003022.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperInc2003022.java
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperWithSortedMethods.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperWithSortedMethods.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/DefaultObjectWrapperWithSortedMethods.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/DefaultObjectWrapperWithSortedMethods.java
diff --git a/src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
diff --git a/src/test/java/freemarker/ext/beans/RationalNumber.java b/freemarker-test-utils/src/main/java/freemarker/ext/beans/RationalNumber.java
similarity index 100%
rename from src/test/java/freemarker/ext/beans/RationalNumber.java
rename to freemarker-test-utils/src/main/java/freemarker/ext/beans/RationalNumber.java
diff --git a/src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java b/freemarker-test-utils/src/main/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
similarity index 100%
rename from src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
rename to freemarker-test-utils/src/main/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
diff --git a/src/test/java/freemarker/test/ResourcesExtractor.java b/freemarker-test-utils/src/main/java/freemarker/test/ResourcesExtractor.java
similarity index 100%
rename from src/test/java/freemarker/test/ResourcesExtractor.java
rename to freemarker-test-utils/src/main/java/freemarker/test/ResourcesExtractor.java
diff --git a/src/test/java/freemarker/test/hamcerst/Matchers.java b/freemarker-test-utils/src/main/java/freemarker/test/hamcerst/Matchers.java
similarity index 100%
rename from src/test/java/freemarker/test/hamcerst/Matchers.java
rename to freemarker-test-utils/src/main/java/freemarker/test/hamcerst/Matchers.java
diff --git a/src/test/java/freemarker/test/hamcerst/StringContainsIgnoringCase.java b/freemarker-test-utils/src/main/java/freemarker/test/hamcerst/StringContainsIgnoringCase.java
similarity index 100%
rename from src/test/java/freemarker/test/hamcerst/StringContainsIgnoringCase.java
rename to freemarker-test-utils/src/main/java/freemarker/test/hamcerst/StringContainsIgnoringCase.java
diff --git a/src/test/java/freemarker/test/package.html b/freemarker-test-utils/src/main/java/freemarker/test/package.html
similarity index 100%
rename from src/test/java/freemarker/test/package.html
rename to freemarker-test-utils/src/main/java/freemarker/test/package.html
diff --git a/src/test/java/freemarker/test/templatesuite/models/AllTemplateModels.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/AllTemplateModels.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/AllTemplateModels.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/AllTemplateModels.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BeanTestClass.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BeanTestClass.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BeanTestClass.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BeanTestClass.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BeanTestInterface.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BeanTestInterface.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BeanTestInterface.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BeanTestInterface.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BeanTestSuperclass.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BeanTestSuperclass.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BeanTestSuperclass.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BeanTestSuperclass.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanAndScalarModel.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanAndScalarModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanAndScalarModel.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanAndScalarModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanAndStringTemplateModel.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanAndStringTemplateModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanAndStringTemplateModel.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanAndStringTemplateModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanHash1.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanHash1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanHash1.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanHash1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanHash2.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanHash2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanHash2.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanHash2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanList1.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanList1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanList1.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanList1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanList2.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanList2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanList2.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanList2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/BooleanVsStringMethods.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanVsStringMethods.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/BooleanVsStringMethods.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/BooleanVsStringMethods.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/EnumTestClass.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/EnumTestClass.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/EnumTestClass.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/EnumTestClass.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/ExceptionModel.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/ExceptionModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/ExceptionModel.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/ExceptionModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/HashAndScalarModel.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/HashAndScalarModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/HashAndScalarModel.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/HashAndScalarModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/JavaObjectInfo.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/JavaObjectInfo.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/JavaObjectInfo.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/JavaObjectInfo.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/LegacyList.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/LegacyList.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/LegacyList.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/LegacyList.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/Listables.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/Listables.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/Listables.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/Listables.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel1.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel1.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel2.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel2.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel3.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel3.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel3.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel3.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel4.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel4.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel4.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel4.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/MultiModel5.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel5.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/MultiModel5.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/MultiModel5.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/NewTestModel.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/NewTestModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/NewTestModel.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/NewTestModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/NewTestModel2.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/NewTestModel2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/NewTestModel2.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/NewTestModel2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/NumberAndStringModel.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/NumberAndStringModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/NumberAndStringModel.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/NumberAndStringModel.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/OverloadedConstructor.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/OverloadedConstructor.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/OverloadedConstructor.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/OverloadedConstructor.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/OverloadedMethods.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/OverloadedMethods.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/OverloadedMethods.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/SimpleTestMethod.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/SimpleTestMethod.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/SimpleTestMethod.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/SimpleTestMethod.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/TransformHashWrapper.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper1.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/TransformMethodWrapper1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper1.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/TransformMethodWrapper1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper2.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/TransformMethodWrapper2.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/TransformMethodWrapper2.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/TransformMethodWrapper2.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/TransformModel1.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/TransformModel1.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/TransformModel1.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/TransformModel1.java
diff --git a/src/test/java/freemarker/test/templatesuite/models/VarArgTestModel.java b/freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/VarArgTestModel.java
similarity index 100%
rename from src/test/java/freemarker/test/templatesuite/models/VarArgTestModel.java
rename to freemarker-test-utils/src/main/java/freemarker/test/templatesuite/models/VarArgTestModel.java
diff --git a/src/test/java/freemarker/test/utility/AssertDirective.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/AssertDirective.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/AssertDirective.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/AssertDirective.java
diff --git a/src/test/java/freemarker/test/utility/AssertEqualsDirective.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/AssertEqualsDirective.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/AssertEqualsDirective.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/AssertEqualsDirective.java
diff --git a/src/test/java/freemarker/test/utility/AssertFailsDirective.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/AssertFailsDirective.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/AssertFailsDirective.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/AssertFailsDirective.java
diff --git a/src/test/java/freemarker/test/utility/AssertationFailedInTemplateException.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/AssertationFailedInTemplateException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/AssertationFailedInTemplateException.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/AssertationFailedInTemplateException.java
diff --git a/src/test/java/freemarker/test/utility/BadParameterTypeException.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/BadParameterTypeException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/BadParameterTypeException.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/BadParameterTypeException.java
diff --git a/src/test/java/freemarker/test/utility/FileTestCase.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/FileTestCase.java
similarity index 62%
rename from src/test/java/freemarker/test/utility/FileTestCase.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/FileTestCase.java
index 8f4fc75..652f107 100644
--- a/src/test/java/freemarker/test/utility/FileTestCase.java
+++ b/freemarker-test-utils/src/main/java/freemarker/test/utility/FileTestCase.java
@@ -29,9 +29,12 @@
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
import freemarker.template.utility.StringUtil;
import junit.framework.AssertionFailedError;
import junit.framework.TestCase;
@@ -133,11 +136,121 @@
return getExpectedFileDirectory();
}
- @SuppressFBWarnings(value="UI_INHERITANCE_UNSAFE_GETRESOURCE", justification="By design relative to subclass")
+ private static String extractRawPathFromJarUrl(URL url) {
+ String jarPathTerminator = "!/";
+
+ String path = url.getPath();
+ if (path.endsWith(jarPathTerminator)) {
+ return path.substring(0, path.length() - jarPathTerminator.length());
+ }
+
+ int jarPathEnd = path.indexOf(jarPathTerminator);
+ return path.substring(0, jarPathEnd);
+ }
+
+ private static URL extractUrlFromJarUrl(URL url) {
+ try {
+ return new URL(extractRawPathFromJarUrl(url));
+ } catch (MalformedURLException ex) {
+ throw new IllegalArgumentException("Unexpected URL: " + url, ex);
+ }
+ }
+
+ private static URL extractFileUrlFromUrl(URL url) {
+ String protocol = url.getProtocol();
+ if ("jar".equals(protocol)) {
+ return extractUrlFromJarUrl(url);
+ }
+ else{
+ return url;
+ }
+ }
+
+ private static File urlToFile(URL url) {
+ try {
+ return new File(url.toURI());
+ } catch (URISyntaxException ex) {
+ throw new IllegalArgumentException(ex);
+ }
+ }
+
+ private static File extractPathFromURL(URL url) {
+ URL fileUrl = extractFileUrlFromUrl(url);
+ if ("file".equals(fileUrl.getProtocol())) {
+ return urlToFile(fileUrl);
+ }
+ else {
+ throw new IllegalArgumentException("Unexpected URL: " + url);
+ }
+ }
+
+ private static URL findUrlClassPathOfClass(Class<?> cl) {
+ URL urlOfClassPath = cl.getProtectionDomain().getCodeSource().getLocation();
+ if (urlOfClassPath == null) {
+ throw new IllegalArgumentException("Unable to locate classpath of " + cl);
+ }
+
+ return extractFileUrlFromUrl(urlOfClassPath);
+ }
+
+ private static File toCanonicalFile(File file) {
+ if (file == null) {
+ return null;
+ }
+
+ try {
+ return file.getCanonicalFile();
+ } catch (IOException ex) {
+ return file;
+ }
+ }
+
+ private static File findClassPathOfClass(Class<?> cl) {
+ return toCanonicalFile(extractPathFromURL(findUrlClassPathOfClass(cl)));
+ }
+
+ private static Path switchToResourceRoot(Path classesClasspathRoot) {
+ Path javaDir = classesClasspathRoot.getParent();
+ if (javaDir == null || !javaDir.endsWith("java")) {
+ return classesClasspathRoot;
+ }
+
+ Path classesDir = javaDir.getParent();
+ if (classesDir == null || !classesDir.endsWith("classes")) {
+ return classesClasspathRoot;
+ }
+
+ Path parent = classesDir.getParent();
+ if (parent == null) {
+ return classesClasspathRoot;
+ }
+
+ return parent.resolve("resources").resolve(classesClasspathRoot.getFileName());
+ }
+
+ private static Path addPackageDir(Path root, Class<?> relPathClass) {
+ Path result = root;
+ for (String child : relPathClass.getPackage().getName().split("\\.")) {
+ result = result.resolve(child);
+ }
+ return result;
+ }
+
+ private File getTestClassDirectoryAssumingGradleStructure() throws IOException {
+ File classpathRoot = findClassPathOfClass(getClass());
+ if (classpathRoot != null) {
+ Path resourcesRoot = switchToResourceRoot(classpathRoot.toPath());
+ return addPackageDir(resourcesRoot, getClass()).toFile();
+ }
+ throw new IOException("Couldn't get resource URL for " + getClass().getPackage().getName());
+ }
+
protected final File getTestClassDirectory() throws IOException {
- URL url = this.getClass().getResource(".");
- if (url == null) throw new IOException("Couldn't get resource URL for \".\"");
- return new File(url.getFile());
+ String rootStr = System.getProperty("freemarker.test.resourcesDir");
+ if (rootStr == null) {
+ return getTestClassDirectoryAssumingGradleStructure();
+ }
+ return addPackageDir(Paths.get(rootStr), getClass()).toFile();
}
protected String loadFile(File f) throws FileNotFoundException, IOException {
diff --git a/src/test/java/freemarker/test/utility/MissingRequiredParameterException.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/MissingRequiredParameterException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/MissingRequiredParameterException.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/MissingRequiredParameterException.java
diff --git a/src/test/java/freemarker/test/utility/NoOutputDirective.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/NoOutputDirective.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/NoOutputDirective.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/NoOutputDirective.java
diff --git a/src/test/java/freemarker/test/utility/ParameterException.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/ParameterException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/ParameterException.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/ParameterException.java
diff --git a/src/test/java/freemarker/test/utility/TestUtil.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/TestUtil.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/TestUtil.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/TestUtil.java
diff --git a/src/test/java/freemarker/test/utility/UnsupportedParameterException.java b/freemarker-test-utils/src/main/java/freemarker/test/utility/UnsupportedParameterException.java
similarity index 100%
rename from src/test/java/freemarker/test/utility/UnsupportedParameterException.java
rename to freemarker-test-utils/src/main/java/freemarker/test/utility/UnsupportedParameterException.java
diff --git a/src/test/resources/logback-test.xml b/freemarker-test-utils/src/main/resources/logback-test.xml
similarity index 100%
rename from src/test/resources/logback-test.xml
rename to freemarker-test-utils/src/main/resources/logback-test.xml
diff --git a/build.properties.sample b/gradle.properties
similarity index 76%
rename from build.properties.sample
rename to gradle.properties
index dd796c3..9a9e336 100644
--- a/build.properties.sample
+++ b/gradle.properties
@@ -5,9 +5,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -15,7 +15,9 @@
# specific language governing permissions and limitations
# under the License.
-# Copy this file to "build.properties" before editing!
-boot.classpath.j2se1.8=C:/Program Files/Java/jdk1.8.0_66/jre/lib/rt.jar
-mvnCommand=C:/Program Files (x86)/maven3/bin/mvn.bat
-gpgCommand=C:/Program Files (x86)/GNU/GnuPG/pub/gpg.exe
\ No newline at end of file
+freemarker.javaVersion=8
+freemarker.javadoc.javaVersion=16
+freemarker.test.javaVersion=16
+
+# Allowed values: "none", "gradle_properties", "gpg_command"
+freemarker.signMethod=none
diff --git a/gradle/repositories.gradle.kts b/gradle/repositories.gradle.kts
new file mode 100644
index 0000000..dcf15f3
--- /dev/null
+++ b/gradle/repositories.gradle.kts
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+fun RepositoryHandler.configurePluginRepositories() {
+ maven {
+ setUrl("https://repository.apache.org/content/groups/public")
+ mavenContent {
+ includeGroup("org.apache.freemarker.docgen")
+ }
+ }
+ gradlePluginPortal()
+ mavenCentral()
+}
+
+fun RepositoryHandler.configureMainRepositories() {
+ mavenCentral()
+}
+
+pluginManagement.repositories.configurePluginRepositories()
+
+dependencyResolutionManagement {
+ repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
+
+ if (rootDir.name == "buildSrc") {
+ repositories.configurePluginRepositories()
+ } else {
+ repositories.configureMainRepositories()
+ }
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..d64cd49
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.jar
Binary files differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..9cac784
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
+distributionSha256Sum=9d926787066a081739e8200858338b4a69e837c3a821a33aca9db09dd4a41026
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..1aa94a4
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,249 @@
+#!/bin/sh
+
+#
+# Copyright © 2015-2021 the original authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+#
+# Gradle start up script for POSIX generated by Gradle.
+#
+# Important for running:
+#
+# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
+# noncompliant, but you have some other compliant shell such as ksh or
+# bash, then to run this script, type that shell name before the whole
+# command line, like:
+#
+# ksh Gradle
+#
+# Busybox and similar reduced shells will NOT work, because this script
+# requires all of these POSIX shell features:
+# * functions;
+# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
+# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
+# * compound commands having a testable exit status, especially «case»;
+# * various built-in commands including «command», «set», and «ulimit».
+#
+# Important for patching:
+#
+# (2) This script targets any POSIX shell, so it avoids extensions provided
+# by Bash, Ksh, etc; in particular arrays are avoided.
+#
+# The "traditional" practice of packing multiple parameters into a
+# space-separated string is a well documented source of bugs and security
+# problems, so this is (mostly) avoided, by progressively accumulating
+# options in "$@", and eventually passing that to Java.
+#
+# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
+# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
+# see the in-line comments for details.
+#
+# There are tweaks for specific operating systems such as AIX, CygWin,
+# Darwin, MinGW, and NonStop.
+#
+# (3) This script is generated from the Groovy template
+# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
+# within the Gradle project.
+#
+# You can find Gradle at https://github.com/gradle/gradle/.
+#
+##############################################################################
+
+# Attempt to set APP_HOME
+
+# Resolve links: $0 may be a link
+app_path=$0
+
+# Need this for daisy-chained symlinks.
+while
+ APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
+ [ -h "$app_path" ]
+do
+ ls=$( ls -ld "$app_path" )
+ link=${ls#*' -> '}
+ case $link in #(
+ /*) app_path=$link ;; #(
+ *) app_path=$APP_HOME$link ;;
+ esac
+done
+
+# This is normally unused
+# shellcheck disable=SC2034
+APP_BASE_NAME=${0##*/}
+# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
+APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD=maximum
+
+warn () {
+ echo "$*"
+} >&2
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+} >&2
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "$( uname )" in #(
+ CYGWIN* ) cygwin=true ;; #(
+ Darwin* ) darwin=true ;; #(
+ MSYS* | MINGW* ) msys=true ;; #(
+ NONSTOP* ) nonstop=true ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD=$JAVA_HOME/jre/sh/java
+ else
+ JAVACMD=$JAVA_HOME/bin/java
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD=java
+ if ! command -v java >/dev/null 2>&1
+ then
+ die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+fi
+
+# Increase the maximum file descriptors if we can.
+if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
+ case $MAX_FD in #(
+ max*)
+ # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ MAX_FD=$( ulimit -H -n ) ||
+ warn "Could not query maximum file descriptor limit"
+ esac
+ case $MAX_FD in #(
+ '' | soft) :;; #(
+ *)
+ # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
+ # shellcheck disable=SC2039,SC3045
+ ulimit -n "$MAX_FD" ||
+ warn "Could not set maximum file descriptor limit to $MAX_FD"
+ esac
+fi
+
+# Collect all arguments for the java command, stacking in reverse order:
+# * args from the command line
+# * the main class name
+# * -classpath
+# * -D...appname settings
+# * --module-path (only if needed)
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if "$cygwin" || "$msys" ; then
+ APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
+ CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
+
+ JAVACMD=$( cygpath --unix "$JAVACMD" )
+
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ for arg do
+ if
+ case $arg in #(
+ -*) false ;; # don't mess with options #(
+ /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
+ [ -e "$t" ] ;; #(
+ *) false ;;
+ esac
+ then
+ arg=$( cygpath --path --ignore --mixed "$arg" )
+ fi
+ # Roll the args list around exactly as many times as the number of
+ # args, so each arg winds up back in the position where it started, but
+ # possibly modified.
+ #
+ # NB: a `for` loop captures its iteration list before it begins, so
+ # changing the positional parameters here affects neither the number of
+ # iterations, nor the values presented in `arg`.
+ shift # remove old arg
+ set -- "$@" "$arg" # push replacement arg
+ done
+fi
+
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Collect all arguments for the java command:
+# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
+# and any embedded shellness will be escaped.
+# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
+# treated as '${Hostname}' itself on the command line.
+
+set -- \
+ "-Dorg.gradle.appname=$APP_BASE_NAME" \
+ -classpath "$CLASSPATH" \
+ org.gradle.wrapper.GradleWrapperMain \
+ "$@"
+
+# Stop when "xargs" is not available.
+if ! command -v xargs >/dev/null 2>&1
+then
+ die "xargs is not available"
+fi
+
+# Use "xargs" to parse quoted args.
+#
+# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
+#
+# In Bash we could simply go:
+#
+# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
+# set -- "${ARGS[@]}" "$@"
+#
+# but POSIX shell has neither arrays nor command substitution, so instead we
+# post-process each arg (as a line of input to sed) to backslash-escape any
+# character that might be a shell metacharacter, then use eval to reverse
+# that process (while maintaining the separation between arguments), and wrap
+# the whole thing up as a single "set" statement.
+#
+# This will of course break if any of these variables contains a newline or
+# an unmatched quote.
+#
+
+eval "set -- $(
+ printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
+ xargs -n1 |
+ sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
+ tr '\n' ' '
+ )" '"$@"'
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..93e3f59
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,92 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if %ERRORLEVEL% equ 0 goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+set EXIT_CODE=%ERRORLEVEL%
+if %EXIT_CODE% equ 0 set EXIT_CODE=1
+if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
+exit /b %EXIT_CODE%
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/ivy.xml b/ivy.xml
deleted file mode 100644
index cc573d2..0000000
--- a/ivy.xml
+++ /dev/null
@@ -1,193 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<!--
- AFTER CHANGING THIS FILE don't forget to issue: ant update-deps
--->
-<!DOCTYPE ivy-module [
- <!ENTITY jetty.version "9.4.53.v20231009">
- <!ENTITY standardTaglibs.version "1.2.5">
- <!ENTITY slf4j.version "1.6.1">
- <!ENTITY spring.version "2.5.6.SEC03">
-]>
-<ivy-module version="2.0">
- <info organisation="org.freemarker" module="freemarker">
- <license name="Apache License, Version 2.0" url="https://freemarker.apache.org/docs/app_license.html" />
- <description homepage="https://freemarker.apache.org/">
- FreeMarker is a "template engine"; a generic tool to
- generate text output (anything from HTML to autogenerated source
- code) based on templates.
- </description>
- </info>
- <configurations>
- <conf name="default" extends="runtime" />
-
- <conf name="runtime"
- description="for using FreeMarker under J2SE 1.4+ (no optional dependencies included)"
- />
-
- <conf name="build.base" extends="default" visibility="private"
- description="for building FreeMarker without dependencies that optinal dependencies"
- />
-
- <conf name="build.jsp2.0" extends="build.base"
- description="for building FreeMarker with JSP 2.0 support"
- />
- <conf name="build.jsp2.1" extends="build.base"
- description="for building FreeMarker with JSP 2.1 support"
- />
-
- <conf name="build.jython2.0" extends="build.base"
- description="for building FreeMarker with Jython 2.0 support"
- />
- <conf name="build.jython2.2" extends="build.base"
- description="for building FreeMarker with Jython 2.2 support"
- />
- <conf name="build.jython2.5" extends="build.base"
- description="for building FreeMarker with Jython 2.5 support"
- />
-
- <conf name="test" extends="build.jython2.5"
- description="commons for both building and running the FreeMarker test suite"
- />
- <conf name="build.test" extends="test"
- description="for building FreeMarker test suite"
- />
- <conf name="run.test" extends="test"
- description="for running FreeMarker test suite"
- />
-
- <conf name="IDE" extends="build.test"
- description="to be used in IDE-s (maybe with the Ivy plugin)"
- />
-
- <conf name="parser" extends="default" description="for generating parser" />
-
- <conf name="manual" description="for generating the manual with Docgen" />
-
- <conf name="rat" description="for generating the Rat report" />
-
- <conf name="bnd" description="for creating OSGi bundle" />
- </configurations>
- <publications>
- <artifact name="freemarker" type="jar" conf="runtime" ext="jar" />
- </publications>
- <dependencies>
- <!-- build -->
-
- <dependency org="jaxen" name="jaxen" rev="1.0-FCS" conf="build.base->default" />
- <dependency org="saxpath" name="saxpath" rev="1.0-FCS" conf="build.base->default" />
- <dependency org="xalan" name="xalan" rev="2.7.0" conf="build.base->default">
- <!-- The lowerst supported xml-apis version depends on JDK version; prevent any collision: -->
- <exclude org="xml-apis" module="xml-apis" />
- </dependency>
- <dependency org="org.dom4j" name="dom4j" rev="2.1.3" conf="build.base->default" /> <!-- legacy -->
- <dependency org="jdom" name="jdom" rev="1.0b8" conf="build.base->default" /> <!-- legacy -->
-
- <dependency org="ant" name="ant" rev="1.6.5" conf="build.base->default">
- <!-- The lowerst supported xml-apis version depends on JDK version; prevent any collision: -->
- <exclude org="xml-apis" module="xml-apis" />
- </dependency>
-
- <dependency org="javax.servlet.jsp" name="jsp-api" rev="2.0" conf="build.jsp2.0->default" />
- <dependency org="javax.servlet" name="servlet-api" rev="2.4" conf="build.jsp2.0->default" />
- <dependency org="javax.servlet.jsp" name="jsp-api" rev="2.1" conf="build.jsp2.1->default" />
- <dependency org="javax.servlet" name="servlet-api" rev="2.5" conf="build.jsp2.1->default" />
-
- <dependency org="rhino" name="js" rev="1.6R1" conf="build.base->default" />
-
- <!-- We use Jython 2.1 because there was no 2.0 in central; the relevant methods are the same. -->
- <dependency org="jython" name="jython" rev="2.1" conf="build.jython2.0->default" />
- <dependency org="org.python" name="jython" rev="2.2.1" conf="build.jython2.2->default" />
- <dependency org="org.python" name="jython" rev="2.5.0" conf="build.jython2.5->default" />
-
- <dependency org="avalon-logkit" name="avalon-logkit" rev="2.0" conf="build.base->default" />
- <dependency org="org.slf4j" name="slf4j-api" rev="&slf4j.version;" conf="build.base->default" />
- <dependency org="org.slf4j" name="log4j-over-slf4j" rev="&slf4j.version;" conf="build.base->default" />
- <dependency org="org.slf4j" name="jcl-over-slf4j" rev="&slf4j.version;" conf="build.base->default" />
- <dependency org="commons-logging" name="commons-logging" rev="1.1.1" conf="build.base->default" />
-
- <dependency org="org.zeroturnaround" name="javarebel-sdk" rev="1.2.2" conf="build.base->default" />
-
- <!-- Not for build.base, as @SuppressFBWarnings causes compilation warnings in dependent Gradle projects -->
- <dependency org="com.google.code.findbugs" name="annotations" rev="3.0.0" conf="IDE->default; test->default" />
-
- <!--dependency org="javax.script" name="script-api" rev="1.0" conf="build.base->default" /-->
- <!--dependency org="org.visigoths" name="cavalry" rev="1.0" conf="build.base->default" /-->
-
- <!-- test -->
-
- <!-- Note: Ant doesn't contain junit.jar any more -->
- <dependency org="junit" name="junit" rev="4.12" conf="test->default" />
- <dependency org="org.hamcrest" name="hamcrest-library" rev="1.3" conf="test->default" />
-
- <dependency org="ch.qos.logback" name="logback-classic" rev="1.1.2" conf="test->default" />
-
- <dependency org="commons-io" name="commons-io" rev="2.7" conf="test->default" />
- <dependency org="com.google.guava" name="guava" rev="29.0-jre" conf="test->default" />
-
- <dependency org="org.eclipse.jetty" name="jetty-server" rev="&jetty.version;" conf="test->default" />
- <dependency org="org.eclipse.jetty" name="jetty-webapp" rev="&jetty.version;" conf="test->default" />
- <dependency org="org.eclipse.jetty" name="jetty-util" rev="&jetty.version;" conf="test->default" />
- <dependency org="org.eclipse.jetty" name="apache-jsp" rev="&jetty.version;" conf="test->default" />
- <!-- JSP JSTL (not included in Jetty): -->
- <dependency org="org.apache.taglibs" name="taglibs-standard-impl" rev="&standardTaglibs.version;" conf="test->default" />
- <dependency org="org.apache.taglibs" name="taglibs-standard-spec" rev="&standardTaglibs.version;" conf="test->default" />
-
- <dependency org="displaytag" name="displaytag" rev="1.2" conf="test->default">
- <exclude org="com.lowagie" name="itext" />
- <exclude org="org.slf4j" name="slf4j-log4j12" />
- <exclude org="org.slf4j" name="jcl104-over-slf4j" />
- <exclude org="log4j" name="log4j" />
- </dependency>
- <!-- Override Java 9 incompatible version (coming from displaytag): -->
- <dependency org="commons-lang" name="commons-lang" rev="2.6" conf="test->default" />
-
- <dependency org="org.springframework" name="spring-core" rev="&spring.version;" conf="test->default">
- <exclude org="commons-logging" name="commons-logging" />
- </dependency>
- <dependency org="org.springframework" name="spring-test" rev="&spring.version;" conf="test->default">
- <exclude org="commons-logging" name="commons-logging" />
- </dependency>
-
- <!-- docs -->
-
- <dependency org="org.apache.freemarker.docgen" name="freemarker-docgen-ant" rev="0.0.2-SNAPSHOT" conf="manual->default" changing="true" />
-
- <!-- parser -->
-
- <dependency org="net.java.dev.javacc" name="javacc" rev="7.0.12" conf="parser->default" />
-
- <!-- bnd -->
-
- <dependency org="biz.aQute" name="bnd" rev="1.50.0" conf="bnd->default" />
-
- <!-- Rat -->
-
- <dependency org="org.apache.rat" name="apache-rat-tasks" rev="0.11" conf="rat->default" />
-
- <!-- As the tests *run* on Ant, so it's a provided dependency there. -->
- <exclude org="ant" module="ant" conf="run.test" />
-
- <!-- Ensure that JSP versions don't accidentally hide each-other -->
-
- <conflict org="javax.servlet.jsp" module="jsp-api" manager="strict" />
-
- </dependencies>
-</ivy-module>
diff --git a/ivysettings-ci.xml b/ivysettings-ci.xml
deleted file mode 100644
index 3f0dc4c..0000000
--- a/ivysettings-ci.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<ivysettings>
- <!-- We want this to be cacheable, so it has to be outside the project checkout directory: -->
- <caches defaultCacheDir="${user.home}/.ivy-freemarker/cache">
- <cache name="freemarkerCache" useOrigin="true" />
- </caches>
-
- <settings defaultResolver="default" />
- <resolvers>
- <chain name="default">
- <ibiblio name="mavenCentral" m2compatible="true" />
- <ibiblio name="mavenApacheStaging" m2compatible="true" root="https://repository.apache.org/content/repositories/staging/" />
- <ibiblio name="mavenApacheSnapshot" m2compatible="true" root="https://repository.apache.org/content/repositories/snapshots/" />
- </chain>
- </resolvers>
-</ivysettings>
diff --git a/ivysettings.xml b/ivysettings.xml
deleted file mode 100644
index e54516e..0000000
--- a/ivysettings.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements. See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership. The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License. You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing,
- software distributed under the License is distributed on an
- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- KIND, either express or implied. See the License for the
- specific language governing permissions and limitations
- under the License.
--->
-
-<ivysettings>
- <!-- As we use our own resolved, we rather don't use the user level Ivy cache: -->
- <caches defaultCacheDir="${ivy.project.dir}/.ivy/cache">
- <cache name="freemarkerCache" useOrigin="true" />
- </caches>
-
- <settings defaultResolver="default" />
- <property name="localMaveRepoDir" value="${user.home}/.m2/repository/" />
- <resolvers>
- <chain name="default">
- <!--
- <filesystem name="mavenLocal" m2compatible="true">
- <artifact pattern="${localMaveRepoDir}/[organisation]/[module]/[revision]/[module]-[revision].[ext]" />
- <ivy pattern="${localMaveRepoDir}/[organisation]/[module]/[revision]/[module]-[revision].pom" />
- </filesystem>
- -->
- <ibiblio name="mavenCentral" m2compatible="true" />
- <ibiblio name="mavenApacheStaging" m2compatible="true" root="https://repository.apache.org/content/repositories/staging/" />
- <ibiblio name="mavenApacheSnapshot" m2compatible="true" root="https://repository.apache.org/content/repositories/snapshots/" />
- </chain>
- </resolvers>
-</ivysettings>
diff --git a/osgi.bnd b/osgi.bnd
index 491eb84..9cbe266 100644
--- a/osgi.bnd
+++ b/osgi.bnd
@@ -21,7 +21,6 @@
# imports by examining the class files, and generates the OSGi meta-info
# based on that and this file.
--classpath: build/classes
-failok: false
Bundle-SymbolicName: ${moduleOrg}.${moduleName}
@@ -29,8 +28,6 @@
Bundle-License: Apache License, Version 2.0; see: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-Vendor: freemarker.org
-Include-Resource: META-INF=build/classes/META-INF
-
Export-Package: !freemarker.test.*, freemarker.*;version="${versionForOSGi}"
# Important:
# Packages that don't match nor the Export-Package nor the
diff --git a/rat-excludes b/rat-excludes
index 221d104..5db1b24 100644
--- a/rat-excludes
+++ b/rat-excludes
@@ -5,9 +5,9 @@
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
-#
+#
# http://www.apache.org/licenses/LICENSE-2.0
-#
+#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@@ -19,24 +19,24 @@
# --------
# Generated files basically; see details in the files:
-src/manual/en_US/docgen-misc/googleAnalytics.html
-src/manual/zh_CN/docgen-misc/googleAnalytics.html
+freemarker-manual/src/main/docgen/en_US/docgen-misc/googleAnalytics.html
+freemarker-manual/src/main/docgen/zh_CN/docgen-misc/googleAnalytics.html
# Binaries/archives created in the FreeMarker project:
src/main/misc/overloadedNumberRules/prices.ods
-src/manual/en_US/docgen-originals/figures/overview.odg
-src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
-src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
-src/manual/en_US/favicon.png
-src/manual/en_US/figures/model2sketch.png
-src/manual/en_US/figures/overview.png
-src/manual/en_US/figures/tree.png
-src/manual/en_US/logo.png
-src/manual/zh_CN/favicon.png
-src/manual/zh_CN/figures/model2sketch.png
-src/manual/zh_CN/figures/overview.png
-src/manual/zh_CN/figures/tree.png
-src/manual/zh_CN/logo.png
+freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/overview.odg
+freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+freemarker-manual/src/main/docgen/en_US/docgen-originals/figures/tree_with_alpha.png
+freemarker-manual/src/main/docgen/en_US/favicon.png
+freemarker-manual/src/main/docgen/en_US/figures/model2sketch.png
+freemarker-manual/src/main/docgen/en_US/figures/overview.png
+freemarker-manual/src/main/docgen/en_US/figures/tree.png
+freemarker-manual/src/main/docgen/en_US/logo.png
+freemarker-manual/src/main/docgen/zh_CN/favicon.png
+freemarker-manual/src/main/docgen/zh_CN/figures/model2sketch.png
+freemarker-manual/src/main/docgen/zh_CN/figures/overview.png
+freemarker-manual/src/main/docgen/zh_CN/figures/tree.png
+freemarker-manual/src/main/docgen/zh_CN/logo.png
# Rat thinks it's a binary, but it's UTF-16 text:
src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
@@ -50,6 +50,7 @@
.ivy/**
.bin/**
bin/**
+buildSrc/build/**
build/**
.build/**
out/**
@@ -77,4 +78,4 @@
# -------------------------------------------
README.md
-gradlew.bat
\ No newline at end of file
+gradlew.bat
diff --git a/settings.gradle.kts b/settings.gradle.kts
new file mode 100644
index 0000000..eb1de9c
--- /dev/null
+++ b/settings.gradle.kts
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+rootProject.name = "freemarker-gae"
+
+apply(from = rootDir.toPath().resolve("gradle").resolve("repositories.gradle.kts"))
+
+dependencyResolutionManagement {
+ versionCatalogs {
+ create("libs") {
+ version("junit", "4.12")
+
+ library("junit", "junit", "junit").versionRef("junit")
+ }
+ }
+}