mirror of https://github.com/apache/poi.git
447 lines
16 KiB
Groovy
447 lines
16 KiB
Groovy
/* ====================================================================
|
|
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.
|
|
==================================================================== */
|
|
buildscript {
|
|
repositories {
|
|
maven { url "https://plugins.gradle.org/m2/" }
|
|
}
|
|
|
|
dependencies {
|
|
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0"
|
|
}
|
|
}
|
|
|
|
plugins {
|
|
id 'base'
|
|
id("org.nosphere.apache.rat") version "0.7.0"
|
|
}
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
// Only add the plugin for Sonar if enabled
|
|
if (project.hasProperty('enableSonar')) {
|
|
println 'Enabling Sonar support'
|
|
apply plugin: "org.sonarqube"
|
|
}
|
|
|
|
// For help converting an Ant build to a Gradle build, see
|
|
// https://docs.gradle.org/current/userguide/ant.html
|
|
|
|
configurations {
|
|
antLibs {
|
|
attributes {
|
|
attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling, Bundling.EXTERNAL))
|
|
}
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
antLibs("org.junit.jupiter:junit-jupiter:5.7.1")
|
|
antLibs("org.apache.ant:ant-junitlauncher:1.10.9")
|
|
}
|
|
|
|
ant.taskdef(name: "junit",
|
|
classname: "org.apache.tools.ant.taskdefs.optional.junitlauncher.confined.JUnitLauncherTask",
|
|
classpath: configurations.antLibs.asPath)
|
|
|
|
|
|
wrapper {
|
|
// https://stackoverflow.com/a/54741656/2066598
|
|
gradleVersion = '6.8'
|
|
}
|
|
|
|
task adjustWrapperPropertiesFile {
|
|
doLast {
|
|
ant.replaceregexp(match:'^#.*', replace:'', flags:'g', byline:true) {
|
|
fileset(dir: project.projectDir, includes: 'gradle/wrapper/gradle-wrapper.properties')
|
|
}
|
|
new File(project.projectDir, 'gradle/wrapper/gradle-wrapper.properties').with { it.text = it.readLines().findAll { it }.sort().join('\n') }
|
|
ant.fixcrlf(file: 'gradle/wrapper/gradle-wrapper.properties', eol: 'lf')
|
|
}
|
|
}
|
|
wrapper.finalizedBy adjustWrapperPropertiesFile
|
|
|
|
/**
|
|
Define properties for all projects, including this one
|
|
*/
|
|
allprojects {
|
|
// apply plugin: 'eclipse'
|
|
apply plugin: 'idea'
|
|
}
|
|
|
|
/**
|
|
|
|
Define things that are only necessary in sub-projects, but not in the master-project itself
|
|
|
|
*/
|
|
subprojects {
|
|
//Put instructions for each sub project, but not the master
|
|
apply plugin: 'java-library'
|
|
apply plugin: 'jacoco'
|
|
apply plugin: 'maven-publish'
|
|
|
|
version = '5.0.1-SNAPSHOT'
|
|
ext {
|
|
bouncyCastleVersion = '1.68'
|
|
commonsCodecVersion = '1.15'
|
|
commonsCompressVersion = '1.20'
|
|
commonsMathVersion = '3.6.1'
|
|
junitVersion = '5.7.1'
|
|
log4jVersion = '2.14.0'
|
|
mockitoVersion = '3.6.0'
|
|
hamcrestVersion = '2.2'
|
|
xmlbeansVersion = '5.0.0'
|
|
batikVersion = '1.14'
|
|
}
|
|
|
|
tasks.withType(JavaCompile) {
|
|
options.encoding = 'UTF-8'
|
|
}
|
|
|
|
tasks.withType(Jar) {
|
|
duplicatesStrategy = 'fail'
|
|
}
|
|
|
|
sourceCompatibility = 1.8
|
|
targetCompatibility = 1.8
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
maven {
|
|
url 'https://repository.apache.org/content/repositories/releases'
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
testImplementation "org.junit.jupiter:junit-jupiter:${junitVersion}"
|
|
testImplementation "org.mockito:mockito-core:${mockitoVersion}"
|
|
testImplementation "org.hamcrest:hamcrest:${hamcrestVersion}"
|
|
testImplementation "org.apache.logging.log4j:log4j-core:${log4jVersion}"
|
|
}
|
|
|
|
task wrapper(type: Wrapper){
|
|
// https://stackoverflow.com/a/65701523/2066598
|
|
gradleVersion = '6.8'
|
|
}
|
|
|
|
jar {
|
|
manifest {
|
|
attributes 'Implementation-Title': 'Apache POI', 'Implementation-Version': project.version
|
|
}
|
|
}
|
|
|
|
test {
|
|
// make XML test-results available for Jenkins CI
|
|
useJUnitPlatform()
|
|
reports {
|
|
junitXml.enabled = true
|
|
}
|
|
|
|
// Exclude some tests that are not actually tests or do not run cleanly on purpose
|
|
exclude '**/BaseTestBorderStyle.class'
|
|
exclude '**/BaseTestCellUtil.class'
|
|
exclude '**/TestUnfixedBugs.class'
|
|
exclude '**/TestOneFile.class'
|
|
|
|
// Exclude Test Suites
|
|
exclude '**/All*Tests.class'
|
|
exclude '**/HSSFTests.class'
|
|
|
|
// set heap size for the test JVM(s)
|
|
minHeapSize = "128m"
|
|
maxHeapSize = "768m"
|
|
|
|
// Specifying the local via system properties did not work, so we set them this way
|
|
jvmArgs '-Duser.language=en -Duser.country=US'
|
|
|
|
// show standard out and standard error of the test JVM(s) on the console
|
|
//testLogging.showStandardStreams = true
|
|
|
|
// http://forums.gradle.org/gradle/topics/jacoco_related_failure_in_multiproject_build
|
|
systemProperties['user.dir'] = workingDir
|
|
|
|
systemProperties['POI.testdata.path'] = '../test-data'
|
|
|
|
// this is necessary for JDK 9+ to keep formatting dates the same way as in previous JDK-versions
|
|
systemProperties['java.locale.providers'] = 'JRE,CLDR'
|
|
|
|
systemProperties['junit.jupiter.execution.parallel.enabled'] = 'false'
|
|
}
|
|
|
|
jacoco {
|
|
toolVersion = '0.8.6'
|
|
}
|
|
|
|
jacocoTestReport {
|
|
reports {
|
|
xml.enabled true
|
|
}
|
|
}
|
|
|
|
// ensure the build-dir exists
|
|
projectDir.mkdirs()
|
|
|
|
if (project.hasProperty('enableSonar')) {
|
|
// See https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-gradle/ and
|
|
// https://docs.sonarqube.org/display/SONARQUBE52/Analyzing+with+SonarQube+Scanner+for+Gradle
|
|
// for documentation of properties.
|
|
//
|
|
// Some additional properties are currently set in the Jenkins-DSL, see jenksin/create_jobs.groovy
|
|
//
|
|
sonarqube {
|
|
properties {
|
|
// as we currently use build/<module>/ as project-basedir, we need to tell Sonar to use
|
|
// the root-folder as "basedir" for the projects
|
|
property "sonar.projectBaseDir", "$projectDir"
|
|
// currently supported providers on Jenkins: "hg,git": property "sonar.scm.provider", "svn"
|
|
|
|
// the plugin seems to not detect our non-standard build-layout
|
|
property "sonar.junit.reportPaths", "$projectDir/build/test-results/test"
|
|
|
|
// the Gradle run will report an invalid directory for 'ooxml-schema', but it seems to still work fine
|
|
property "sonar.coverage.jacoco.xmlReportPaths", "$projectDir/build/reports/jacoco/test/jacocoTestReport.xml"
|
|
}
|
|
}
|
|
}
|
|
|
|
task jenkins
|
|
jenkins.dependsOn build
|
|
jenkins.dependsOn check
|
|
jenkins.dependsOn javadoc
|
|
jenkins.dependsOn jacocoTestReport
|
|
jenkins.dependsOn rat
|
|
|
|
publishing {
|
|
publications {
|
|
POI(MavenPublication) {
|
|
groupId 'org.apache.poi'
|
|
|
|
pom {
|
|
packaging = 'jar'
|
|
url = 'https://poi.apache.org/'
|
|
|
|
mailingLists {
|
|
mailingList {
|
|
name = 'POI Users List'
|
|
subscribe = 'user-subscribe@poi.apache.org'
|
|
unsubscribe = 'user-unsubscribe@poi.apache.org'
|
|
archive = 'http://mail-archives.apache.org/mod_mbox/poi-user/'
|
|
}
|
|
mailingList {
|
|
name = 'POI Developer List'
|
|
subscribe = 'dev-subscribe@poi.apache.org'
|
|
unsubscribe = 'dev-unsubscribe@poi.apache.org'
|
|
archive = 'http://mail-archives.apache.org/mod_mbox/poi-dev/'
|
|
}
|
|
}
|
|
|
|
licenses {
|
|
license {
|
|
name = 'Apache License, Version 2.0'
|
|
url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
|
|
distribution = 'repo'
|
|
}
|
|
}
|
|
|
|
organization {
|
|
name = 'Apache Software Foundation'
|
|
url = 'http://www.apache.org/'
|
|
}
|
|
|
|
withXml {
|
|
def r = asElement()
|
|
def doc = r.getOwnerDocument()
|
|
def asl = doc.createComment(new File('../legal/HEADER').text)
|
|
// adding ASF header before root node is ignored
|
|
// doc.insertBefore(asl, doc.getDocumentElement())
|
|
r.insertBefore(asl, r.getFirstChild())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// Make JavaDoc behave similar to Ant, i.e. be a bit more lenient
|
|
// and define amount of memory
|
|
// https://blog.joda.org/2014/02/turning-off-doclint-in-jdk-8-javadoc.html
|
|
if (JavaVersion.current().isJava8Compatible()) {
|
|
allprojects {
|
|
tasks.withType(Javadoc) {
|
|
options.addStringOption('Xdoclint:none', '-quiet')
|
|
maxMemory="384M"
|
|
}
|
|
}
|
|
}
|
|
|
|
// initial try to provide a combined JavaDoc, grouping is still missing here, though!
|
|
task allJavaDoc(type: Javadoc) {
|
|
source subprojects.collect { it.sourceSets.main.allJava }
|
|
|
|
// for possible settings see https://docs.gradle.org/current/dsl/org.gradle.api.tasks.javadoc.Javadoc.html
|
|
classpath = files(subprojects.collect { it.sourceSets.main.compileClasspath })
|
|
destinationDir = file("${buildDir}/docs/javadoc")
|
|
maxMemory="768M"
|
|
|
|
// for possible options see https://docs.gradle.org/current/javadoc/org/gradle/external/javadoc/StandardJavadocDocletOptions.html
|
|
options.use = true
|
|
options.splitIndex = true
|
|
|
|
title = 'POI API Documentation'
|
|
options.bottom = '<![CDATA[<i>Copyright ' + new Date().format('yyyy') + ' The Apache Software Foundation or\n' +
|
|
'its licensors, as applicable.</i>]]>'
|
|
|
|
options.group('DDF - Dreadful Drawing Format', 'org.apache.poi.ddf*')
|
|
options.group('HPSF - Horrible Property Set Format', 'org.apache.poi.hpsf*')
|
|
options.group('SS - Common Spreadsheet Format', 'org.apache.poi.ss*')
|
|
options.group('HSSF - Horrible Spreadsheet Format', 'org.apache.poi.hssf*')
|
|
options.group('XSSF - Open Office XML Spreadsheet Format', 'org.apache.poi.xssf*')
|
|
options.group('SL - Common Slideshow Format', 'org.apache.poi.sl*')
|
|
options.group('HSLF - Horrible Slideshow Format', 'org.apache.poi.hslf*', 'org.apache.poi.hwmf*', 'org.apache.poi.hemf*')
|
|
options.group('XSLF - Open Office XML Slideshow Format', 'org.apache.poi.xslf*')
|
|
options.group('HWPF - Horrible Word Processor Format', 'org.apache.poi.hwpf*')
|
|
options.group('XWPF - Open Office XML Word Processor Format', 'org.apache.poi.xwpf*')
|
|
options.group('HDGF - Horrible Diagram Format', 'org.apache.poi.hdgf*')
|
|
options.group('XDGF - Open Office XML Diagram Format', 'org.apache.poi.xdgf*')
|
|
options.group('HMEF - Transport Neutral Encoding Files (TNEF)', 'org.apache.poi.hmef*')
|
|
options.group('HSMF Outlook message file format', 'org.apache.poi.hsmf*')
|
|
options.group('HPBF - Publisher Format Files', 'org.apache.poi.hpbf*')
|
|
options.group('POIFS - POI File System', 'org.apache.poi.poifs*')
|
|
options.group('Utilities', 'org.apache.poi.util*')
|
|
options.group('Excelant', 'org.apache.poi.ss.excelant**')
|
|
options.group('Examples', 'org.apache.poi.examples*')
|
|
}
|
|
|
|
task jenkins
|
|
jenkins.dependsOn allJavaDoc
|
|
|
|
clean {
|
|
delete "${rootDir}/build/dist"
|
|
}
|
|
|
|
rat {
|
|
// Input directory, defaults to '.'
|
|
inputDir.set(file("."))
|
|
|
|
// include all directories which contain files that are included in releases
|
|
includes.add("poi-examples/**")
|
|
includes.add("poi-excelant/**")
|
|
includes.add("poi-integration/**")
|
|
includes.add("legal/**")
|
|
includes.add("poi/**")
|
|
includes.add("maven/**")
|
|
includes.add("poi-ooxml/**")
|
|
includes.add("poi-ooxml-full/**")
|
|
includes.add("poi-ooxml-lite/**")
|
|
includes.add("poi-ooxml-lite-agent/**")
|
|
//includes.add("osgi/**")
|
|
includes.add("poi-scratchpad/**")
|
|
includes.add("src/**")
|
|
//includes.add("sonar/**")
|
|
includes.add("build.*")
|
|
|
|
// List of Gradle exclude directives, defaults to ['**/.gradle/**']
|
|
//excludes.add("main/java/org/apache/poi/**/*-chart-data.txt")
|
|
excludes.add("build.javacheck.xml")
|
|
excludes.add("**/build/**")
|
|
excludes.add("**/out/**")
|
|
excludes.add("**/*.iml")
|
|
excludes.add("**/*.log")
|
|
excludes.add("**/main/java/org/apache/poi/**/*-chart-data.txt")
|
|
excludes.add("poi/src/main/resources/org/apache/poi/sl/draw/geom/presetShapeDefinitions.xml")
|
|
excludes.add("poi-ooxml/src/main/resources/org/apache/poi/xslf/usermodel/notesMaster.xml")
|
|
excludes.add("poi-ooxml/src/main/resources/org/apache/poi/xssf/usermodel/presetTableStyles.xml")
|
|
excludes.add("poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/XAdES*.xsd")
|
|
excludes.add("poi-ooxml-full/src/main/xmlschema/org/apache/poi/schemas/xmldsig-core-schema.xsd")
|
|
excludes.add("poi-ooxml-full/src/main/xmlschema/org/apache/poi/xdgf/visio.xsd")
|
|
/*
|
|
<exclude name="documentation/*.txt" />
|
|
<exclude name="documentation/content/xdocs/dtd/" />
|
|
<exclude name="documentation/content/xdocs/entity/" />
|
|
<exclude name="documentation/resources/images/pb-poi.cdr"/>
|
|
*/
|
|
|
|
// Prints the list of files with unapproved licences to the console, defaults to false
|
|
verbose.set(true)
|
|
}
|
|
|
|
/*task downloadJarsToLibs() {
|
|
def f = new File("$projectDir/../lib/ooxml/xmlbeans-5.0.0.jar")
|
|
if (!f.exists()) {
|
|
println 'writing file ' + f.getAbsolutePath()
|
|
f.getParentFile().mkdirs()
|
|
new URL('https://ci-builds.apache.org/job/POI/job/POI-XMLBeans-DSL-1.8/lastSuccessfulBuild/artifact/build/xmlbeans-5.0.0.jar').withInputStream{ i -> f.withOutputStream{ it << i }}
|
|
}
|
|
}*/
|
|
|
|
//compileJava.dependsOn 'downloadJarsToLibs'
|
|
|
|
task site(type:Exec) {
|
|
doFirst {
|
|
if (System.env.FORREST_HOME == null) {
|
|
throw new InvalidUserDataException(
|
|
'Apache Forrest is not installed.\n' +
|
|
'Please install Apache Forrest (see https://forrest.apache.org/index.html) and set the\n' +
|
|
'FORREST_HOME environment variable!')
|
|
}
|
|
|
|
if (JavaVersion.current() != JavaVersion.VERSION_1_8) {
|
|
// maybe Java 9-11 works too?
|
|
throw new GradleException("Apache Forrest must be executed with Java 8!")
|
|
}
|
|
}
|
|
|
|
if (System.getProperty('os.name').toLowerCase(Locale.ROOT).contains('windows')) {
|
|
commandLine 'cmd', '/c', "${System.env.FORREST_HOME}/bin/forrest.bat"
|
|
} else {
|
|
commandLine "${System.env.FORREST_HOME}/bin/forrest"
|
|
}
|
|
|
|
//store the output instead of printing to the console:
|
|
standardOutput = new ByteArrayOutputStream()
|
|
|
|
ext.output = {
|
|
return standardOutput.toString()
|
|
}
|
|
|
|
doLast {
|
|
println 'Broken links:'
|
|
println file("${buildDir}/tmp/brokenlinks.xml").text
|
|
|
|
/* Apache Forrest is dead, so we cannot expect fixes there however it does not handle "https" in "credits"
|
|
currently if the *.xml file is in a sub-directory, see Apache Forrest code at
|
|
main/webapp/skins/pelt/xslt/html/site-to-xhtml.xsl:350
|
|
|
|
So we need to replace the links afterwards to have a fully "https" website and avoid browser warning about
|
|
a "mixed content" website */
|
|
def buildSite = "${buildDir}/site"
|
|
|
|
println "Fix https in ${buildSite}"
|
|
|
|
ant.replace(dir: buildSite, summary:'true', includes:'**/*.html',
|
|
token:'http://www.apache.org/events/current-event-125x125.png',
|
|
value:'https://www.apache.org/events/current-event-125x125.png')
|
|
|
|
ant.replace(dir: buildSite, summary:'true', includes:'**/*.html',
|
|
token:'http://www.google.com/search',
|
|
value:'https://www.google.com/search')
|
|
|
|
ant.fixcrlf(srcdir: buildSite, includes:'**/*.html,**/*.css', eol:'unix', eof:'remove')
|
|
}
|
|
}
|