def prj = { project ->

  "(jde-project-file-version" (["1.0"])
  "(jde-set-variables" { 
    "'(jde-compile-option-directory" ([project.sourceSets.main.output.classesDir])
    "'(jde-junit-working-directory" ([project.projectDir])
    
    "'(jde-compile-option-source" { 
      "'(" (["default"])
    }

    "'(jde-compile-option-target" { 
      "'(" (["default"])
    }

    "'(jde-compile-option-command-line-args" { 
      "'(" (["-${project.sourceCompatibility}"])
    }
    
    "'(jde-sourcepath" { 
      "'(" (
        project.sourceSets.main.allSource.srcDirs 
        + project.sourceSets.test.allSource.srcDirs)
    }
    
    "'(jde-global-classpath" { 
      "'(" (
        [] + project.sourceSets.main.output.classesDir
        + project.sourceSets.test.output.classesDir
        + project.sourceSets.main.allSource.srcDirs
        + project.sourceSets.test.allSource.srcDirs
        + (([] as Set) + project.configurations.compile.getFiles() 
           + project.configurations.testCompile.getFiles()))
    }
  }
}

subprojects {
  task("jdee") << { 
    def output = new File(project.projectDir, "prj.el").newPrintWriter()
    try { 
      prj.delegate = new NodeBuilder() { 
          def lev = 0
          
          def write = { Object file -> 
            output.print '\n' + ''.padRight(lev, ' ') +  "\"${file}\"".tr('\\', '/') 
          }

          Object createNode(Object name) { 
            output.print '\n'  + ''.padRight(lev++, ' ') + name
            return name
          }
  
          Object createNode(Object name, Object value) { 
            createNode(name)
            value.each write
            return name
          }

          void nodeCompleted(Object parent, Object child) { 
            output.print ")"
            lev--
          }
      }
      prj(project)
      output.close()
    } finally { 
      output.flush()
    }
  }
}