Author: jleroux
Date: Tue Jul 19 10:41:28 2016 New Revision: 1753360 URL: http://svn.apache.org/viewvc?rev=1753360&view=rev Log: Creates a (short term) Gradle "cleanAnt" task to remove old build dirs - https://issues.apache.org/jira/browse/OFBIZ-7898 This adapts the "old" Ant "clean*" targets in order to allow to remove old build dirs. It's not a problem if you have done an Ant clean just before removing Ant whith a "svn up" but I guess most of us did not. I will then also remove the related svn:ignore (build dirs)... WIP... Modified: ofbiz/trunk/build.gradle Modified: ofbiz/trunk/build.gradle URL: http://svn.apache.org/viewvc/ofbiz/trunk/build.gradle?rev=1753360&r1=1753359&r2=1753360&view=diff ============================================================================== --- ofbiz/trunk/build.gradle (original) +++ ofbiz/trunk/build.gradle Tue Jul 19 10:41:28 2016 @@ -1,850 +1,872 @@ -/* - * 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 org.apache.tools.ant.filters.ReplaceTokens - -/* ======================================================== - * Project setup - * ======================================================== */ - -apply plugin: 'java' -apply plugin: 'eclipse' - -apply from: 'common.gradle' - -// java settings -def jvmArguments = ['-Xms128M', '-Xmx512M'] -ext.ofbizMainClass = 'org.apache.ofbiz.base.start.Start' -javadoc.failOnError = false -sourceCompatibility = '1.8' -targetCompatibility = '1.8' - -// root and subproject settings -defaultTasks 'build' - -allprojects { - repositories{ - jcenter() - } -} - -subprojects { - configurations { - // compile-time plugin libraries - pluginLibsCompile - // runtime plugin libraries - pluginLibsRuntime - } -} - -configurations { - junitLibs -} - -dependencies { - // general framework libs - compile 'apache-xerces:resolver:2.9.1' - compile 'apache-xerces:xercesImpl:2.9.1' - compile 'avalon-framework:avalon-framework-impl:4.2.0' - compile 'bouncycastle:bouncycastle-jce-jdk13:112' - compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.0' - compile 'com.fasterxml.jackson.core:jackson-core:2.4.2' - compile 'com.google.guava:guava:19.0' - compile 'com.google.zxing:core:3.2.1' - compile 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.0' - compile 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20160628.1' - compile 'com.ibm.icu:icu4j:57.1' - compile 'com.lowagie:itext:2.1.7' - compile 'com.sun.mail:javax.mail:1.5.1' - compile 'com.sun.syndication:com.springsource.com.sun.syndication:0.9.0' - compile 'com.thoughtworks.xstream:xstream:1.4.9' - compile 'commons-beanutils:commons-beanutils-core:1.8.3' - compile 'commons-cli:commons-cli:1.3.1' - compile 'commons-codec:commons-codec:1.10' - compile 'commons-el:commons-el:1.0' - compile 'commons-fileupload:commons-fileupload:1.3.1' - compile 'commons-io:commons-io:2.4' - compile 'commons-logging:commons-logging:1.2' - compile 'commons-net:commons-net:3.3' - compile 'commons-validator:commons-validator:1.5.1' - compile 'de.odysseus.juel:juel-impl:2.2.7' - compile 'de.odysseus.juel:juel-spi:2.2.7' - compile 'httpunit:httpunit:1.7' - compile 'javax.el:javax.el-api:3.0.1-b04' - compile 'javax.servlet:javax.servlet-api:3.1.0' - compile 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.0' - compile 'javolution:javolution:5.4.3' - compile 'junit:junit-dep:4.10' - compile 'jython:jython:2.1' - compile 'net.fortuna.ical4j:ical4j:1.0-rc3-atlassian-11' - compile 'net.sf.barcode4j:barcode4j-fop-ext-complete:2.0' - compile 'net.sf.dozer:dozer:4.2.1' - compile 'net.sf.ezmorph:ezmorph:0.9.1' - compile 'net.sourceforge.nekohtml:nekohtml:1.9.16' - compile 'org.apache.ant:ant-apache-bsf:1.9.0' - compile 'org.apache.ant:ant-junit:1.9.0' - compile 'org.apache.ant:ant-launcher:1.9.0' - compile 'org.apache.axis2:axis2-adb:1.7.1' - compile 'org.apache.axis2:axis2-kernel:1.7.1' - compile 'org.apache.axis2:axis2-transport-http:1.7.1' - compile 'org.apache.axis2:axis2-transport-local:1.7.1' - compile 'org.apache.bsf:com.springsource.org.apache.bsf:2.4.0' - compile 'org.apache.commons:commons-collections4:4.1' - compile 'org.apache.commons:commons-compress:1.11' - compile 'org.apache.commons:commons-csv:1.1' - compile 'org.apache.commons:commons-dbcp2:2.1' - compile 'org.apache.commons:commons-pool2:2.3' - compile 'org.apache.derby:derby:10.11.1.1' - compile 'org.apache.geronimo.components:geronimo-transaction:3.1.1' - compile 'org.apache.geronimo.specs:geronimo-activation_1.0.2_spec:1.0' - compile 'org.apache.geronimo.specs:geronimo-j2ee-connector_1.5_spec:2.0.0' - compile 'org.apache.geronimo.specs:geronimo-jaxr_1.0_spec:1.0' - compile 'org.apache.geronimo.specs:geronimo-jaxrpc_1.1_spec:1.1' - compile 'org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1' - compile 'org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1' - compile 'org.apache.geronimo.specs:geronimo-saaj_1.3_spec:1.1' - compile 'org.apache.httpcomponents:httpclient-cache:4.4.1' - compile 'org.apache.httpcomponents:httpcore:4.4.1' - compile 'org.apache.logging.log4j:log4j-1.2-api:2.3' - compile 'org.apache.logging.log4j:log4j-api:2.3' - compile 'org.apache.logging.log4j:log4j-core:2.3' - compile 'org.apache.logging.log4j:log4j-nosql:2.3' - compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.3' - compile 'org.apache.neethi:neethi:3.0.3' - compile 'org.apache.pdfbox:fontbox:1.8.11' - compile 'org.apache.pdfbox:jempbox:1.8.11' - compile 'org.apache.pdfbox:pdfbox:1.8.12' - compile 'org.apache.poi:poi:3.14' - compile 'org.apache.servicemix.bundles:org.apache.servicemix.bundles.xpp3:1.1.4c_7' - compile 'org.apache.shiro:shiro-core:1.2.5' - compile 'org.apache.tika:tika-core:1.12' - compile 'org.apache.tika:tika-parsers:1.12' - compile 'org.apache.tomcat:tomcat-annotations-api:7.0.54' - compile 'org.apache.tomcat:tomcat-api:8.0.33' - compile 'org.apache.tomcat:tomcat-catalina-ha:8.0.33' - compile 'org.apache.tomcat:tomcat-catalina:8.0.33' - compile 'org.apache.tomcat:tomcat-coyote:8.0.33' - compile 'org.apache.tomcat:tomcat-jasper:8.0.33' - compile 'org.apache.tomcat:tomcat-jni:8.0.33' - compile 'org.apache.tomcat:tomcat-tribes:8.0.33' - compile 'org.apache.tomcat:tomcat-util-scan:8.0.33' - compile 'org.apache.tomcat:tomcat-util:8.0.33' - compile 'org.apache.tomcat.embed:tomcat-embed-websocket:8.0.33' - compile 'org.apache.tomcat.extras:tomcat-extras-juli-adapters:8.0.33' - compile 'org.apache.tomcat.extras:tomcat-extras-juli:8.0.33' - compile 'org.apache.woden:woden-core:1.0M10' - compile 'org.apache.ws.commons.axiom:axiom-api:1.2.17' - compile 'org.apache.ws.commons.axiom:axiom-impl:1.2.17' - compile 'org.apache.ws.commons.util:ws-commons-util:1.0.2' - compile 'org.apache.ws.xmlschema:xmlschema-core:2.2.1' - compile 'org.apache.xalan:com.springsource.org.apache.xml.serializer:2.7.1' - compile 'org.apache.xmlgraphics:fop:2.1' - compile 'org.apache.xmlgraphics:xmlgraphics-commons:2.1' - compile 'org.apache.xmlrpc:xmlrpc-client:3.1.2' - compile 'org.apache.xmlrpc:xmlrpc-common:3.1.2' - compile 'org.apache.xmlrpc:xmlrpc-server:3.1.2' - compile 'org.codeartisans.thirdparties.swing:batik-all:1.8pre-r1084380' - compile 'org.codehaus.groovy:groovy-all:2.4.5' - compile 'org.dom4j:com.springsource.org.dom4j:1.6.1' - compile 'org.eclipse.jdt.core.compiler:ecj:4.5' - compile 'org.freemarker:freemarker:2.3.24-incubating' - compile 'org.hamcrest:hamcrest-all:1.3' - compile 'org.jdom:jdom:1.1' - compile 'org.lucee:commons-lang:2.6.0' - compile 'org.owasp.esapi:esapi:2.1.0' - compile 'org.slf4j:slf4j-api:1.6.4' - compile 'org.springframework:spring-core:4.2.3.RELEASE' - compile 'org.springframework:spring-test:4.2.3.RELEASE' - compile 'org.zapodot:jackson-databind-java-optional:2.4.2' - compile 'oro:oro:2.0.8' - compile 'ws-commons-java5:ws-commons-java5:1.0.1' - compile 'wsdl4j:wsdl4j:1.6.2' - compile 'xalan:xalan:2.7.2' - compile 'xml-apis:xml-apis-ext:1.3.04' - compile 'xml-apis:xml-apis:1.4.01' - compile 'mysql:mysql-connector-java:5.1.36' - compile 'postgresql:postgresql:9.0-801.jdbc4' - - - // plugin libs - subprojects.each { subProject -> - compile project(path: subProject.path, configuration: 'pluginLibsCompile') - runtime project(path: subProject.path, configuration: 'pluginLibsRuntime') - } - - // libs needed for junitreport - junitLibs 'junit:junit:4.12' - junitLibs 'org.apache.ant:ant-junit:1.9.7' - junitLibs 'org.apache.ant:ant-junit4:1.9.7' - - // local libs - getDirectoryInActiveComponentsIfExists('lib').each { libDir -> - compile fileTree(dir: libDir, include: '**/*.jar') - } - runtime files("${rootDir}/build/libs/ofbiz-base-test.jar") -} - -def excludedJavaSources = [] -excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/cybersource/IcsPaymentServices.java' -excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/ideal/IdealEvents.java' -excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/ideal/IdealPaymentServiceTest.java' -excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/orbital/OrbitalPaymentServices.java' -excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/paypal/PayPalServices.java' -excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/securepay/SecurePayPaymentServices.java' -excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/securepay/SecurePayServiceTest.java' -excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/verisign/PayflowPro.java' -excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeByteArrayInputStream.java' -excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeByteArrayOutputStream.java' -excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeServices.java' -excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeWorker.java' -excludedJavaSources.add 'org/apache/ofbiz/content/report/JREntityListIteratorDataSource.java' -excludedJavaSources.add 'org/apache/ofbiz/content/report/JRMapCollectionDataSource.java' -excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareException.java' -excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareServices.java' -excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareUTL.java' -excludedJavaSources.add 'ShipmentScaleApplet.java' -excludedJavaSources.add 'org/apache/ofbiz/securityext/thirdparty/truition/TruitionCoReg.java' -excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsJXlsViewHandler.java' -excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsPdfViewHandler.java' -excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsPoiXlsViewHandler.java' -excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsXmlViewHandler.java' - -sourceSets { - main { - java { - srcDirs = getDirectoryInActiveComponentsIfExists('src/main/java') - exclude excludedJavaSources - } - resources { - srcDirs = getDirectoryInActiveComponentsIfExists('src/main/java') - srcDirs += getDirectoryInActiveComponentsIfExists('config') - exclude excludedJavaSources - } - } - - test { - java { - srcDirs = getDirectoryInActiveComponentsIfExists('src/test/java') - } - resources { - srcDirs = getDirectoryInActiveComponentsIfExists('src/test/java') - } - } -} - -jar { - manifest { - attributes( - "Implementation-Title": project.name, - "Main-Class": ofbizMainClass, - "Class-Path": getJarManifestClasspathForCurrentOs() - ) - } -} - -// Eclipse plugin settings -eclipse.classpath.file.whenMerged { classpath -> - /* The code inside this block removes unnecessary entries - * in the .classpath file which are generated automatically - * due to the settings in the sourceSets block - */ - def osName = System.getProperty('os.name').toLowerCase() - def osDirSeparator = osName.contains('windows') ? '\\' : '/' - - iterateOverActiveComponents { component -> - def componentName = component.toString() - rootDir.toString() - classpath.entries.removeAll { entry -> - // remove any "src" entries in .classpath of the form /componentName - entry.kind == 'src' && - entry.path ==~ '.*/+(' + componentName.tokenize(osDirSeparator).last() + ')$' - } - } - classpath.entries.removeAll { entry -> - /* remove "src" entries in .classpath named: - * /framework, /applications, /specialpurpose and /hot-deploy - */ - entry.kind == 'src' && - entry.path ==~ /(\/+framework)$/ || - entry.path ==~ /(\/+applications)$/ || - entry.path ==~ /(\/+specialpurpose)$/ || - entry.path ==~ /(\/+hot-deploy)$/ - } - getDirectoryInActiveComponentsIfExists('config').each { configDir -> - /* remove any "src" entries in .classpath of the form componentName/config - * - * windows format: \framework\base\config - * Unix format: /framework/base/config - * .classpath format: framework/base/config - * - * Must convert both windows and unix to .classpath format to - * be able to remove it from the file - */ - def relativeDir = configDir.toString() - rootDir.toString() - osDirSeparator - def eclipseConfigSrc = osName.contains('windows') ? relativeDir.replaceAll("\\\\", "/") : relativeDir - classpath.entries.removeAll { entry -> - entry.kind == 'src' && - entry.path == eclipseConfigSrc - } - } -} -tasks.eclipse.dependsOn(cleanEclipse) - -/* ======================================================== - * Tasks - * ======================================================== */ - -// ========== Task group labels ========== -def cleanupGroup = 'Cleaning' -def ofbizServer = 'OFBiz Server' -def sysadminGroup = 'System Administration' -def committerGroup = 'OFBiz committers' - -// ========== OFBiz Server tasks ========== - -task loadDefault(group: ofbizServer) { - dependsOn 'ofbiz --load-data' - description 'Load default data; meant for OFBiz development, testing, and demo purposes' -} - -task testIntegration(group: ofbizServer) { - dependsOn 'ofbiz --test' - description 'Run OFBiz integration tests; You must run loadDefault before running this task' -} - -task terminateOfbiz(group: ofbizServer, - description: 'Force termination of any running OFBiz servers, only use if \"--shutdown\" command fails') << { - def os = System.getProperty("os.name").toLowerCase() - if (os.contains("windows")) { - Runtime.getRuntime().exec("wmic process where \"CommandLine Like \'%org.apache.ofbiz.base.start.Start%\'\" Call Terminate") - } else { - def processOutput = new ByteArrayOutputStream() - exec { - commandLine 'ps', 'ax' - standardOutput = processOutput - } - processOutput.toString().split(System.lineSeparator()).each { line -> - if(line ==~ /.*org\.apache\.ofbiz\.base\.start\.Start.*/) { - exec { commandLine 'kill', '-9', line.tokenize().first() } - } - } - } -} - -task loadAdminUserLogin(group: ofbizServer) { - description 'Create admin user with temporary password equal to ofbiz. You must provide userLoginId' - createOfbizCommandTask('executeLoadAdminUser', - ['--load-data', 'file=/runtime/tmp/AdminUserLoginData.xml'], - jvmArguments, false) - executeLoadAdminUser.doFirst { - copy { - from ("${rootDir}/framework/resources/templates/AdminUserLoginData.xml") { - filter(ReplaceTokens, tokens: [userLoginId: userLoginId]) - } - into "${rootDir}/runtime/tmp/" - } - } - dependsOn executeLoadAdminUser - doLast { - delete("${rootDir}/runtime/tmp/AdminUserLoginData.xml") - } -} - -task loadTenant(group: ofbizServer, description: 'Load data using tenantId') { - - createOfbizCommandTask('executeLoadTenant', [], jvmArguments, false) - - if(project.hasProperty('tenantId')) { - executeLoadTenant.args '--load-data' - executeLoadTenant.args "delegator=default#${tenantId}" - } - if(project.hasProperty('tenantReaders')) { - executeLoadTenant.args '--load-data' - executeLoadTenant.args "readers=${tenantReaders}" - } - if(project.hasProperty('tenantComponent')) { - executeLoadTenant.args '--load-data' - executeLoadTenant.args "component=${tenantComponent}" - } - - doLast { - if(!project.hasProperty('tenantId')) { - throw new GradleException('Missing project property tenantId') - } - } - dependsOn executeLoadTenant -} - -task createTenant(group: ofbizServer, description: 'Create a new tenant in your environment') { - - def databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Derby.xml" - - task prepareAndValidateTenantArguments << { - if(!project.hasProperty('tenantId')) { - throw new GradleException('Project property tenantId is missing') - } - if(!project.hasProperty('tenantName')) { - throw new GradleException('Project property tenantName is missing') - } - // dbPlatform values: D(Derby), M(MySQL), O(Oracle), P(PostgreSQL) (default D) - if(project.hasProperty('dbPlatform')) { - if(dbPlatform == 'D') { - databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Derby.xml" - } else if(dbPlatform == 'M') { - databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-MySQL.xml" - } else if(dbPlatform == 'O') { - databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Oracle.xml" - } else if(dbPlatform == 'P') { - databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml" - } else { - throw new GradleException('Invalid value for property dbPlatform: ' + "${dbPlatform}") - } - } - } - - task generateDatabaseTemplateFile(dependsOn: prepareAndValidateTenantArguments) << { - def filterTokens = ['tenantId': tenantId, - 'tenantName': tenantName, - 'domainName': project.hasProperty('domainName')? "${domainName}":'org.apache.ofbiz', - 'db-IP': project.hasProperty('dbIp')? "${dbIp}":'', - 'db-User': project.hasProperty('dbUser')? "${dbUser}":'', - 'db-Password': project.hasProperty('dbPassword')? "${dbPassword}":''] - - generateFileFromTemplate(databaseTemplateFile, 'runtime/tmp', - filterTokens, 'tmpFilteredTenantData.xml') - } - - task generateAdminUserTemplateFile(dependsOn: prepareAndValidateTenantArguments) << { - generateFileFromTemplate( - "${rootDir}/framework/resources/templates/AdminUserLoginData.xml", - 'runtime/tmp', - ['userLoginId': "${tenantId}-admin".toString()], - 'tmpFilteredUserLogin.xml') - } - - // Load the tenants master database - createOfbizCommandTask('loadTenantOnDefaultDelegator', - ['--load-data', 'file=/runtime/tmp/tmpFilteredTenantData.xml'], - jvmArguments, false) - loadTenantOnDefaultDelegator.dependsOn(generateDatabaseTemplateFile, generateAdminUserTemplateFile) - - // Load the actual tenant data - createOfbizCommandTask('loadTenantData', [], jvmArguments, false) - loadTenantData.dependsOn(loadTenantOnDefaultDelegator) - - // Load the tenant admin user account - createOfbizCommandTask('loadTenantAdminUserLogin', [], jvmArguments, false) - loadTenantAdminUserLogin.dependsOn(loadTenantData) - - /* pass arguments to tasks, must be done this way - * because we are in the configuration phase. We cannot - * set the parameters at the execution phase. */ - if(project.hasProperty('tenantId')) { - loadTenantData.args '--load-data' - loadTenantData.args "delegator=default#${tenantId}" - - loadTenantAdminUserLogin.args '--load-data' - loadTenantAdminUserLogin.args "delegator=default#${tenantId}" - loadTenantAdminUserLogin.args '--load-data' - loadTenantAdminUserLogin.args "file=${rootDir}/runtime/tmp/tmpFilteredUserLogin.xml" - } - if(project.hasProperty('tenantReaders')) { - loadTenantData.args '--load-data' - loadTenantData.args "readers=${tenantReaders}" - } - - dependsOn(loadTenantAdminUserLogin) - - // cleanup - doLast { - delete("${rootDir}/runtime/tmp/tmpFilteredTenantData.xml") - delete("${rootDir}/runtime/tmp/tmpFilteredUserLogin.xml") - } -} - -// ========== System Administration tasks ========== -task createComponent(group: sysadminGroup, description: 'Create the layout of an OFBiz component in the hot-deploy folder.') << { - - def filterTokens = ['component-name': componentName, - 'component-resource-name': componentResourceName, - 'webapp-name': webappName, - 'base-permission': basePermission] - def templateDir = "${rootDir}/framework/resources/templates" - def componentDir = "${rootDir}/hot-deploy/${componentName}" - - logger.info('Creating a component with the following properties: ') - logger.info(" - componentName: ${componentName}") - logger.info(" - componentResourceName: ${componentResourceName}") - logger.info(" - webappName: ${webappName}") - logger.info(" - basePermission: ${basePermission}") - - mkdir componentDir - mkdir componentDir+"/config" - mkdir componentDir+"/data" - mkdir componentDir+"/data/helpdata" - mkdir componentDir+"/dtd" - mkdir componentDir+"/documents" - mkdir componentDir+"/entitydef" - mkdir componentDir+"/lib" - mkdir componentDir+"/patches" - mkdir componentDir+"/patches/test" - mkdir componentDir+"/patches/qa" - mkdir componentDir+"/patches/production" - mkdir componentDir+"/script" - mkdir componentDir+"/servicedef" - mkdir componentDir+"/src" - mkdir componentDir+"/testdef" - mkdir componentDir+"/webapp" - mkdir componentDir+"/webapp/${webappName}" - mkdir componentDir+"/webapp/${webappName}/error" - mkdir componentDir+"/webapp/${webappName}/WEB-INF" - mkdir componentDir+"/webapp/${webappName}/WEB-INF/actions" - mkdir componentDir+"/widget/" - - generateFileFromTemplate(templateDir+"/ofbiz-component.xml", componentDir, - filterTokens, "ofbiz-component.xml") - generateFileFromTemplate(templateDir+"/TypeData.xml", componentDir+"/data", - filterTokens, "${componentResourceName}TypeData.xml") - generateFileFromTemplate(templateDir+"/SecurityPermissionSeedData.xml", componentDir+"/data", - filterTokens, "${componentResourceName}SecurityPermissionSeedData.xml") - generateFileFromTemplate(templateDir+"/SecurityGroupDemoData.xml", componentDir+"/data", - filterTokens, "${componentResourceName}SecurityGroupDemoData.xml") - generateFileFromTemplate(templateDir+"/DemoData.xml", componentDir+"/data", - filterTokens, "${componentResourceName}DemoData.xml") - generateFileFromTemplate(templateDir+"/HELP.xml", componentDir+"/data/helpdata", - filterTokens, "HELP_${componentResourceName}.xml") - generateFileFromTemplate(templateDir+"/document.xml", componentDir+"/documents", - filterTokens, "${componentResourceName}.xml") - generateFileFromTemplate(templateDir+"/entitymodel.xml", componentDir+"/entitydef", - filterTokens, "entitymodel.xml") - generateFileFromTemplate(templateDir+"/services.xml", componentDir+"/servicedef", - filterTokens, "services.xml") - generateFileFromTemplate(templateDir+"/Tests.xml", componentDir+"/testdef", - filterTokens, "${componentResourceName}Tests.xml") - generateFileFromTemplate(templateDir+"/UiLabels.xml", componentDir+"/config", - filterTokens, "${componentResourceName}UiLabels.xml") - generateFileFromTemplate(templateDir+"/index.jsp", componentDir+"/webapp/${webappName}", - filterTokens, "index.jsp") - generateFileFromTemplate(templateDir+"/error.jsp", componentDir+"/webapp/${webappName}/error", - filterTokens, "error.jsp") - generateFileFromTemplate(templateDir+"/controller.xml", componentDir+"/webapp/${webappName}/WEB-INF", - filterTokens, "controller.xml") - generateFileFromTemplate(templateDir+"/web.xml", componentDir+"/webapp/${webappName}/WEB-INF", - filterTokens, "web.xml") - generateFileFromTemplate(templateDir+"/CommonScreens.xml", componentDir+"/widget", - filterTokens, "CommonScreens.xml") - generateFileFromTemplate(templateDir+"/Screens.xml", componentDir+"/widget", - filterTokens, "${componentResourceName}Screens.xml") - generateFileFromTemplate(templateDir+"/Menus.xml", componentDir+"/widget", - filterTokens, "${componentResourceName}Menus.xml") - generateFileFromTemplate(templateDir+"/Forms.xml", componentDir+"/widget", - filterTokens, "${componentResourceName}Forms.xml") - - logger.info("Component successfully created in folder ${rootDir}/hot-deploy/${componentName}.") - logger.info("Restart OFBiz and then visit the URL: https://localhost:8443/${webappName}") -} - -task createTestReports(group: sysadminGroup, description: 'Generate HTML reports from junit XML output') << { - ant.taskdef(name: 'junitreport', - classname: 'org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator', - classpath: configurations.junitLibs.asPath) - ant.junitreport(todir: './runtime/logs/test-results') { - fileset(dir: './runtime/logs/test-results') { - include(name: '*.xml') - } - report(format:'frames', todir:'./runtime/logs/test-results/html') - } -} -/* - * TODO replace this code with something more declarative. - * We are using it so that if tests fail we still get HTML reports - */ -gradle.taskGraph.afterTask { Task task, TaskState state -> - if (task.name ==~ /^ofbiz.*--test.*/ - || task.name ==~ /^ofbiz.*-t.*/) { - tasks.createTestReports.execute() - } -} - -// ========== Clean up tasks ========== -task cleanCatalina(group: cleanupGroup, description: 'Clean Catalina data in runtime/catalina/work') << { - delete "${rootDir}/runtime/catalina/work" -} -task cleanData(group: cleanupGroup, description: 'Clean all DB data (Derby) under runtime/data') << { - deleteAllInDirWithExclusions("${rootDir}/runtime/data/", ['README', 'derby.properties']) -} -task cleanDownloads(group: cleanupGroup, description: 'Clean all downloaded files') << { - delete fileTree(dir: "${rootDir}/framework/base/lib", includes: ['activemq-*.jar']) - delete fileTree(dir: "${rootDir}/framework/entity/lib/jdbc", includes: ['postgresql-*.jar']) - delete fileTree(dir: "${rootDir}/framework/entity/lib/jdbc", includes: ['mysql-*.jar']) -} -task cleanLogs(group: cleanupGroup, description: 'Clean all logs in runtime/logs') << { - deleteAllInDirWithExclusions("${rootDir}/runtime/logs/", ['README']) -} -task cleanOutput(group: cleanupGroup, description: 'Clean runtime/output directory') << { - deleteAllInDirWithExclusions("${rootDir}/runtime/output/", ['README']) -} -task cleanIndexes(group: cleanupGroup, description: 'Remove search indexes (e.g. Lucene) from runtime/indexes') << { - deleteAllInDirWithExclusions("${rootDir}/runtime/indexes/", ['README', 'index.properties']) -} -task cleanTempfiles(group: cleanupGroup, description: 'Remove file in runtime/tempfiles') << { - deleteAllInDirWithExclusions("${rootDir}/runtime/tempfiles/", ['README']) - deleteAllInDirWithExclusions("${rootDir}/runtime/tmp/", ['README']) -} -task cleanUploads(group: cleanupGroup, description: 'Remove uploaded files.') << { - deleteAllInDirWithExclusions("${rootDir}/runtime/uploads/", []) -} -task cleanXtra(group: cleanupGroup, description: 'Clean extra generated files like .rej, .DS_Store, etc.') << { - delete fileTree(dir: "${rootDir}", includes: ['**/.nbattrs', '**/*~','**/.#*', '**/.DS_Store', '**/*.rej', '**/*.orig']) -} -task cleanGradle(group: cleanupGroup, description: 'clean generated files from gradle') << { - delete file("${rootDir}/.gradle") -} - -def cleanTasks = getTasksMatchingRegex(/^clean.+/) -task cleanAll(group: cleanupGroup, dependsOn: [cleanTasks, clean]) { - description 'Execute all cleaning tasks.' -} - -// ========== Tasks for OFBiz committers ========== -def websiteDir = "${rootDir}/../site" -task copyDtds(group: committerGroup, description: 'Copy all DTDs from OFBiz instance to website') << { - mkdir websiteDir+'/dtds' - copy { - from(fileTree("${rootDir}").files) { - include '**/*.xsd' - exclude '**/002*.xsd' - exclude '**/068*.xsd' - exclude '**/161*.xsd' - exclude '**/196*.xsd' - exclude '**/197*.xsd' - } - into websiteDir+'/dtds' - } -} - -task gitInfoFooter(group: committerGroup, description: 'Update the Git Branch-revision info in the footer') << { - def branch - def revision - def timestamp = new Date().format 'yyyy-MM-dd HH:mm:ss' - File gitFooterFile = new File("${rootDir}/runtime/GitInfo.ftl") - - def branchOutput = new ByteArrayOutputStream() - exec{ - commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD' - standardOutput = branchOutput - } - branch = branchOutput.toString() - def revisionOutput = new ByteArrayOutputStream() - exec{ - commandLine 'git', 'rev-parse', 'HEAD' - standardOutput = revisionOutput - } - revision = revisionOutput.toString() - gitFooterFile.delete() - gitFooterFile.createNewFile() - gitFooterFile << "Branch: ${branch}" - gitFooterFile << "Revision: ${revision}" - gitFooterFile << "Built on: ${timestamp}" + System.lineSeparator() - gitFooterFile << "Java Version: ${org.gradle.internal.jvm.Jvm.current()}" -} - -task svnInfoFooter(group: committerGroup, description: 'Update the Subversion revision info in the footer') << { - def timestamp = new Date().format 'yyyy-MM-dd HH:mm:ss' - File svnFooterFile = new File("${rootDir}/runtime/SvnInfo.ftl") - def svnOutput = new ByteArrayOutputStream() - exec{ - commandLine 'svn', 'info', '--xml' - standardOutput = svnOutput - } - def info = new XmlParser().parseText(svnOutput.toString()) - svnFooterFile.delete() - svnFooterFile.createNewFile() - svnFooterFile << "Branch: ${info.entry.url.text()}" + System.lineSeparator() - svnFooterFile << "Revision: ${info.entry.commit.@revision}" + System.lineSeparator() - svnFooterFile << "Built on: ${timestamp}" + System.lineSeparator() - svnFooterFile << "Java Version: ${org.gradle.internal.jvm.Jvm.current()}" -} - -// ========== hidden support tasks ========== - -/* without executing this task, a test would fail that is named - * org.apache.ofbiz.base.util.test.UtilObjectTests.testGetObjectFromFactory() - * - * The test fails because it requires defining a service provider, read more below. - * http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Service_Provider - */ -task createBaseTestServiceProviderJar << { - ant.jar(destfile: "${rootDir}/build/libs/ofbiz-base-test.jar") { - service(type: 'org.apache.ofbiz.base.util.test.UtilObjectTests$TestFactoryIntf') { - provider(classname: 'org.apache.ofbiz.base.util.test.UtilObjectTests$FirstTestFactory') - provider(classname: 'org.apache.ofbiz.base.util.test.UtilObjectTests$SecondTestFactory') - } - } -} -classes.dependsOn createBaseTestServiceProviderJar - -/* ======================================================== - * Rules-based OFBiz server commands - * ======================================================== */ - -tasks.addRule('Pattern: ofbiz <Commands>: Execute OFBiz startup commands') { String taskName -> - if(taskName ==~ /^ofbiz\s.*/ || taskName == 'ofbiz') { - def arguments = (taskName - 'ofbiz').toLowerCase().tokenize(' ') - createOfbizCommandTask(taskName, arguments, jvmArguments, false) - } -} - -tasks.addRule('Pattern: ofbizDebug <Commands>: Execute OFBiz startup commands in remote debug mode') { String taskName -> - if(taskName ==~ /^ofbizDebug\s.*/ || taskName == 'ofbizDebug') { - def arguments = (taskName - 'ofbizDebug').toLowerCase().tokenize(' ') - createOfbizCommandTask(taskName, arguments, jvmArguments, true) - } -} - -tasks.addRule('Pattern: ofbizSecure <Commands>: Execute OFBiz startup commands pre-loading the notsoserial Java agent') { String taskName -> - if(taskName ==~ /^ofbizSecure\s.*/ || taskName == 'ofbizSecure') { - def arguments = (taskName - 'ofbizSecure').toLowerCase().tokenize(' ') - jvmArguments.add('-server') - jvmArguments.add("-javaagent:${rootDir}/tools/security/notsoserial/notsoserial-1.0-SNAPSHOT.jar") - jvmArguments.add("-Dnotsoserial.whitelist=${rootDir}/tools/security/notsoserial/empty.txt") - jvmArguments.add("-Dnotsoserial.dryrun=${rootDir}/tools/security/notsoserial/is-deserialized.txt") - jvmArguments.add("-Dnotsoserial.trace=${rootDir}/tools/security/notsoserial/deserialize-trace.txt") - createOfbizCommandTask(taskName, arguments, jvmArguments, false) - } -} - -tasks.addRule('Pattern: ofbizBackground <Commands>: Execute OFBiz startup commands in background and output to console.log') { String taskName -> - if(taskName ==~ /^ofbizBackground\s.*/ || taskName == 'ofbizBackground') { - createOfbizBackgroundCommandTask(taskName) - } -} - -tasks.addRule('Pattern: ofbizBackgroundSecure <Commands>: Execute OFBiz startup commands in background (secure mode) and output to console.log') { String taskName -> - if(taskName ==~ /^ofbizBackgroundSecure\s.*/ || taskName == 'ofbizBackgroundSecure') { - createOfbizBackgroundCommandTask(taskName) - } -} - -/* ======================================================== - * Helper Functions - * ======================================================== */ - -def createOfbizCommandTask(taskName, arguments, jvmArguments, isDebugMode) { - - def ofbizJarName = buildDir.toString()+'/libs/'+project.name+'.jar' - - task(type: JavaExec, dependsOn: build, taskName) { - jvmArgs(jvmArguments) - debug = isDebugMode - classpath = files(ofbizJarName) - main = ofbizMainClass - arguments.each { argument -> - args argument - } - } -} - -def createOfbizBackgroundCommandTask(taskName) { - def os = System.getProperty("os.name").toLowerCase() - def sourceTask = taskName.tokenize().first() - def arguments = (taskName - sourceTask) - - def targetTask - def gradleRunner - - if(sourceTask == 'ofbizBackground') { - targetTask = 'ofbiz' - } else if(sourceTask == 'ofbizBackgroundSecure') { - targetTask = 'ofbizSecure' - } - - if (os.contains("windows")) { - gradleRunner = 'gradlew' - } else { - gradleRunner = './gradlew' - } - - task (taskName) { - doLast { - spawnProcess(gradleRunner, "${targetTask} ${arguments}") - } - } -} - -def spawnProcess(command, arguments) { - ProcessBuilder pb = new ProcessBuilder(command, arguments) - File consoleLog = file("${rootDir}/runtime/logs/console.log"); - - pb.directory(file("${rootDir}")) - pb.redirectErrorStream(true) - pb.redirectOutput(ProcessBuilder.Redirect.appendTo(consoleLog)) - pb.start() -} - -def getDirectoryInActiveComponentsIfExists(String dirName) { - def dirInComponents = [] - iterateOverActiveComponents { component -> - def subDir = file(component.toString() + '/' + dirName) - if(subDir.exists()) { - dirInComponents.add subDir - } - } - return dirInComponents -} - -def deleteAllInDirWithExclusions(dirName, exclusions) { - ant.delete (includeEmptyDirs: 'true', verbose: 'on') { - fileset(dir: dirName, includes: '**/*', erroronmissingdir: "false") { - exclusions.each { exclusion -> - exclude name: exclusion - } - } - } -} - -def getTasksMatchingRegex(theRegex) { - def filteredTasks = [] - tasks.each { task -> - if(task.name ==~ theRegex) { - filteredTasks.add(task) - } - } - return filteredTasks -} - -def generateFileFromTemplate(templateFileInFullPath, targetDirectory, filterTokens, newFileName) { - copy { - from (templateFileInFullPath) { - filter ReplaceTokens, tokens: filterTokens - rename templateFileInFullPath.tokenize('/').last(), newFileName - } - into targetDirectory - } -} - -def getJarManifestClasspathForCurrentOs() { - def osClassPath = '' - if(System.getProperty('os.name').toLowerCase().contains('windows')) { - configurations.runtime.files.each { cpEntry -> - osClassPath += '\\' + cpEntry.toString() + ' ' - } - } else { - osClassPath = configurations.runtime.files.collect { "$it" }.join(' ') - } - return osClassPath -} +/* + * 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 org.apache.tools.ant.filters.ReplaceTokens + +/* ======================================================== + * Project setup + * ======================================================== */ + +apply plugin: 'java' +apply plugin: 'eclipse' + +apply from: 'common.gradle' + +// java settings +def jvmArguments = ['-Xms128M', '-Xmx512M'] +ext.ofbizMainClass = 'org.apache.ofbiz.base.start.Start' +javadoc.failOnError = false +sourceCompatibility = '1.8' +targetCompatibility = '1.8' + +// root and subproject settings +defaultTasks 'build' + +allprojects { + repositories{ + jcenter() + } +} + +subprojects { + configurations { + // compile-time plugin libraries + pluginLibsCompile + // runtime plugin libraries + pluginLibsRuntime + } +} + +configurations { + junitLibs +} + +dependencies { + // general framework libs + compile 'apache-xerces:resolver:2.9.1' + compile 'apache-xerces:xercesImpl:2.9.1' + compile 'avalon-framework:avalon-framework-impl:4.2.0' + compile 'bouncycastle:bouncycastle-jce-jdk13:112' + compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.0' + compile 'com.fasterxml.jackson.core:jackson-core:2.4.2' + compile 'com.google.guava:guava:19.0' + compile 'com.google.zxing:core:3.2.1' + compile 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.0' + compile 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20160628.1' + compile 'com.ibm.icu:icu4j:57.1' + compile 'com.lowagie:itext:2.1.7' + compile 'com.sun.mail:javax.mail:1.5.1' + compile 'com.sun.syndication:com.springsource.com.sun.syndication:0.9.0' + compile 'com.thoughtworks.xstream:xstream:1.4.9' + compile 'commons-beanutils:commons-beanutils-core:1.8.3' + compile 'commons-cli:commons-cli:1.3.1' + compile 'commons-codec:commons-codec:1.10' + compile 'commons-el:commons-el:1.0' + compile 'commons-fileupload:commons-fileupload:1.3.1' + compile 'commons-io:commons-io:2.4' + compile 'commons-logging:commons-logging:1.2' + compile 'commons-net:commons-net:3.3' + compile 'commons-validator:commons-validator:1.5.1' + compile 'de.odysseus.juel:juel-impl:2.2.7' + compile 'de.odysseus.juel:juel-spi:2.2.7' + compile 'httpunit:httpunit:1.7' + compile 'javax.el:javax.el-api:3.0.1-b04' + compile 'javax.servlet:javax.servlet-api:3.1.0' + compile 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.0' + compile 'javolution:javolution:5.4.3' + compile 'junit:junit-dep:4.10' + compile 'jython:jython:2.1' + compile 'net.fortuna.ical4j:ical4j:1.0-rc3-atlassian-11' + compile 'net.sf.barcode4j:barcode4j-fop-ext-complete:2.0' + compile 'net.sf.dozer:dozer:4.2.1' + compile 'net.sf.ezmorph:ezmorph:0.9.1' + compile 'net.sourceforge.nekohtml:nekohtml:1.9.16' + compile 'org.apache.ant:ant-apache-bsf:1.9.0' + compile 'org.apache.ant:ant-junit:1.9.0' + compile 'org.apache.ant:ant-launcher:1.9.0' + compile 'org.apache.axis2:axis2-adb:1.7.1' + compile 'org.apache.axis2:axis2-kernel:1.7.1' + compile 'org.apache.axis2:axis2-transport-http:1.7.1' + compile 'org.apache.axis2:axis2-transport-local:1.7.1' + compile 'org.apache.bsf:com.springsource.org.apache.bsf:2.4.0' + compile 'org.apache.commons:commons-collections4:4.1' + compile 'org.apache.commons:commons-compress:1.11' + compile 'org.apache.commons:commons-csv:1.1' + compile 'org.apache.commons:commons-dbcp2:2.1' + compile 'org.apache.commons:commons-pool2:2.3' + compile 'org.apache.derby:derby:10.11.1.1' + compile 'org.apache.geronimo.components:geronimo-transaction:3.1.1' + compile 'org.apache.geronimo.specs:geronimo-activation_1.0.2_spec:1.0' + compile 'org.apache.geronimo.specs:geronimo-j2ee-connector_1.5_spec:2.0.0' + compile 'org.apache.geronimo.specs:geronimo-jaxr_1.0_spec:1.0' + compile 'org.apache.geronimo.specs:geronimo-jaxrpc_1.1_spec:1.1' + compile 'org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1' + compile 'org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1' + compile 'org.apache.geronimo.specs:geronimo-saaj_1.3_spec:1.1' + compile 'org.apache.httpcomponents:httpclient-cache:4.4.1' + compile 'org.apache.httpcomponents:httpcore:4.4.1' + compile 'org.apache.logging.log4j:log4j-1.2-api:2.3' + compile 'org.apache.logging.log4j:log4j-api:2.3' + compile 'org.apache.logging.log4j:log4j-core:2.3' + compile 'org.apache.logging.log4j:log4j-nosql:2.3' + compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.3' + compile 'org.apache.neethi:neethi:3.0.3' + compile 'org.apache.pdfbox:fontbox:1.8.11' + compile 'org.apache.pdfbox:jempbox:1.8.11' + compile 'org.apache.pdfbox:pdfbox:1.8.12' + compile 'org.apache.poi:poi:3.14' + compile 'org.apache.servicemix.bundles:org.apache.servicemix.bundles.xpp3:1.1.4c_7' + compile 'org.apache.shiro:shiro-core:1.2.5' + compile 'org.apache.tika:tika-core:1.12' + compile 'org.apache.tika:tika-parsers:1.12' + compile 'org.apache.tomcat:tomcat-annotations-api:7.0.54' + compile 'org.apache.tomcat:tomcat-api:8.0.33' + compile 'org.apache.tomcat:tomcat-catalina-ha:8.0.33' + compile 'org.apache.tomcat:tomcat-catalina:8.0.33' + compile 'org.apache.tomcat:tomcat-coyote:8.0.33' + compile 'org.apache.tomcat:tomcat-jasper:8.0.33' + compile 'org.apache.tomcat:tomcat-jni:8.0.33' + compile 'org.apache.tomcat:tomcat-tribes:8.0.33' + compile 'org.apache.tomcat:tomcat-util-scan:8.0.33' + compile 'org.apache.tomcat:tomcat-util:8.0.33' + compile 'org.apache.tomcat.embed:tomcat-embed-websocket:8.0.33' + compile 'org.apache.tomcat.extras:tomcat-extras-juli-adapters:8.0.33' + compile 'org.apache.tomcat.extras:tomcat-extras-juli:8.0.33' + compile 'org.apache.woden:woden-core:1.0M10' + compile 'org.apache.ws.commons.axiom:axiom-api:1.2.17' + compile 'org.apache.ws.commons.axiom:axiom-impl:1.2.17' + compile 'org.apache.ws.commons.util:ws-commons-util:1.0.2' + compile 'org.apache.ws.xmlschema:xmlschema-core:2.2.1' + compile 'org.apache.xalan:com.springsource.org.apache.xml.serializer:2.7.1' + compile 'org.apache.xmlgraphics:fop:2.1' + compile 'org.apache.xmlgraphics:xmlgraphics-commons:2.1' + compile 'org.apache.xmlrpc:xmlrpc-client:3.1.2' + compile 'org.apache.xmlrpc:xmlrpc-common:3.1.2' + compile 'org.apache.xmlrpc:xmlrpc-server:3.1.2' + compile 'org.codeartisans.thirdparties.swing:batik-all:1.8pre-r1084380' + compile 'org.codehaus.groovy:groovy-all:2.4.5' + compile 'org.dom4j:com.springsource.org.dom4j:1.6.1' + compile 'org.eclipse.jdt.core.compiler:ecj:4.5' + compile 'org.freemarker:freemarker:2.3.24-incubating' + compile 'org.hamcrest:hamcrest-all:1.3' + compile 'org.jdom:jdom:1.1' + compile 'org.lucee:commons-lang:2.6.0' + compile 'org.owasp.esapi:esapi:2.1.0' + compile 'org.slf4j:slf4j-api:1.6.4' + compile 'org.springframework:spring-core:4.2.3.RELEASE' + compile 'org.springframework:spring-test:4.2.3.RELEASE' + compile 'org.zapodot:jackson-databind-java-optional:2.4.2' + compile 'oro:oro:2.0.8' + compile 'ws-commons-java5:ws-commons-java5:1.0.1' + compile 'wsdl4j:wsdl4j:1.6.2' + compile 'xalan:xalan:2.7.2' + compile 'xml-apis:xml-apis-ext:1.3.04' + compile 'xml-apis:xml-apis:1.4.01' + compile 'mysql:mysql-connector-java:5.1.36' + compile 'postgresql:postgresql:9.0-801.jdbc4' + + + // plugin libs + subprojects.each { subProject -> + compile project(path: subProject.path, configuration: 'pluginLibsCompile') + runtime project(path: subProject.path, configuration: 'pluginLibsRuntime') + } + + // libs needed for junitreport + junitLibs 'junit:junit:4.12' + junitLibs 'org.apache.ant:ant-junit:1.9.7' + junitLibs 'org.apache.ant:ant-junit4:1.9.7' + + // local libs + getDirectoryInActiveComponentsIfExists('lib').each { libDir -> + compile fileTree(dir: libDir, include: '**/*.jar') + } + runtime files("${rootDir}/build/libs/ofbiz-base-test.jar") +} + +def excludedJavaSources = [] +excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/cybersource/IcsPaymentServices.java' +excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/ideal/IdealEvents.java' +excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/ideal/IdealPaymentServiceTest.java' +excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/orbital/OrbitalPaymentServices.java' +excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/paypal/PayPalServices.java' +excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/securepay/SecurePayPaymentServices.java' +excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/securepay/SecurePayServiceTest.java' +excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/verisign/PayflowPro.java' +excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeByteArrayInputStream.java' +excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeByteArrayOutputStream.java' +excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeServices.java' +excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeWorker.java' +excludedJavaSources.add 'org/apache/ofbiz/content/report/JREntityListIteratorDataSource.java' +excludedJavaSources.add 'org/apache/ofbiz/content/report/JRMapCollectionDataSource.java' +excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareException.java' +excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareServices.java' +excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareUTL.java' +excludedJavaSources.add 'ShipmentScaleApplet.java' +excludedJavaSources.add 'org/apache/ofbiz/securityext/thirdparty/truition/TruitionCoReg.java' +excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsJXlsViewHandler.java' +excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsPdfViewHandler.java' +excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsPoiXlsViewHandler.java' +excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsXmlViewHandler.java' + +sourceSets { + main { + java { + srcDirs = getDirectoryInActiveComponentsIfExists('src/main/java') + exclude excludedJavaSources + } + resources { + srcDirs = getDirectoryInActiveComponentsIfExists('src/main/java') + srcDirs += getDirectoryInActiveComponentsIfExists('config') + exclude excludedJavaSources + } + } + + test { + java { + srcDirs = getDirectoryInActiveComponentsIfExists('src/test/java') + } + resources { + srcDirs = getDirectoryInActiveComponentsIfExists('src/test/java') + } + } +} + +jar { + manifest { + attributes( + "Implementation-Title": project.name, + "Main-Class": ofbizMainClass, + "Class-Path": getJarManifestClasspathForCurrentOs() + ) + } +} + +// Eclipse plugin settings +eclipse.classpath.file.whenMerged { classpath -> + /* The code inside this block removes unnecessary entries + * in the .classpath file which are generated automatically + * due to the settings in the sourceSets block + */ + def osName = System.getProperty('os.name').toLowerCase() + def osDirSeparator = osName.contains('windows') ? '\\' : '/' + + iterateOverActiveComponents { component -> + def componentName = component.toString() - rootDir.toString() + classpath.entries.removeAll { entry -> + // remove any "src" entries in .classpath of the form /componentName + entry.kind == 'src' && + entry.path ==~ '.*/+(' + componentName.tokenize(osDirSeparator).last() + ')$' + } + } + classpath.entries.removeAll { entry -> + /* remove "src" entries in .classpath named: + * /framework, /applications, /specialpurpose and /hot-deploy + */ + entry.kind == 'src' && + entry.path ==~ /(\/+framework)$/ || + entry.path ==~ /(\/+applications)$/ || + entry.path ==~ /(\/+specialpurpose)$/ || + entry.path ==~ /(\/+hot-deploy)$/ + } + getDirectoryInActiveComponentsIfExists('config').each { configDir -> + /* remove any "src" entries in .classpath of the form componentName/config + * + * windows format: \framework\base\config + * Unix format: /framework/base/config + * .classpath format: framework/base/config + * + * Must convert both windows and unix to .classpath format to + * be able to remove it from the file + */ + def relativeDir = configDir.toString() - rootDir.toString() - osDirSeparator + def eclipseConfigSrc = osName.contains('windows') ? relativeDir.replaceAll("\\\\", "/") : relativeDir + classpath.entries.removeAll { entry -> + entry.kind == 'src' && + entry.path == eclipseConfigSrc + } + } +} +tasks.eclipse.dependsOn(cleanEclipse) + +/* ======================================================== + * Tasks + * ======================================================== */ + +// ========== Task group labels ========== +def cleanupGroup = 'Cleaning' +def ofbizServer = 'OFBiz Server' +def sysadminGroup = 'System Administration' +def committerGroup = 'OFBiz committers' + +// ========== OFBiz Server tasks ========== + +task loadDefault(group: ofbizServer) { + dependsOn 'ofbiz --load-data' + description 'Load default data; meant for OFBiz development, testing, and demo purposes' +} + +task testIntegration(group: ofbizServer) { + dependsOn 'ofbiz --test' + description 'Run OFBiz integration tests; You must run loadDefault before running this task' +} + +task terminateOfbiz(group: ofbizServer, + description: 'Force termination of any running OFBiz servers, only use if \"--shutdown\" command fails') << { + def os = System.getProperty("os.name").toLowerCase() + if (os.contains("windows")) { + Runtime.getRuntime().exec("wmic process where \"CommandLine Like \'%org.apache.ofbiz.base.start.Start%\'\" Call Terminate") + } else { + def processOutput = new ByteArrayOutputStream() + exec { + commandLine 'ps', 'ax' + standardOutput = processOutput + } + processOutput.toString().split(System.lineSeparator()).each { line -> + if(line ==~ /.*org\.apache\.ofbiz\.base\.start\.Start.*/) { + exec { commandLine 'kill', '-9', line.tokenize().first() } + } + } + } +} + +task loadAdminUserLogin(group: ofbizServer) { + description 'Create admin user with temporary password equal to ofbiz. You must provide userLoginId' + createOfbizCommandTask('executeLoadAdminUser', + ['--load-data', 'file=/runtime/tmp/AdminUserLoginData.xml'], + jvmArguments, false) + executeLoadAdminUser.doFirst { + copy { + from ("${rootDir}/framework/resources/templates/AdminUserLoginData.xml") { + filter(ReplaceTokens, tokens: [userLoginId: userLoginId]) + } + into "${rootDir}/runtime/tmp/" + } + } + dependsOn executeLoadAdminUser + doLast { + delete("${rootDir}/runtime/tmp/AdminUserLoginData.xml") + } +} + +task loadTenant(group: ofbizServer, description: 'Load data using tenantId') { + + createOfbizCommandTask('executeLoadTenant', [], jvmArguments, false) + + if(project.hasProperty('tenantId')) { + executeLoadTenant.args '--load-data' + executeLoadTenant.args "delegator=default#${tenantId}" + } + if(project.hasProperty('tenantReaders')) { + executeLoadTenant.args '--load-data' + executeLoadTenant.args "readers=${tenantReaders}" + } + if(project.hasProperty('tenantComponent')) { + executeLoadTenant.args '--load-data' + executeLoadTenant.args "component=${tenantComponent}" + } + + doLast { + if(!project.hasProperty('tenantId')) { + throw new GradleException('Missing project property tenantId') + } + } + dependsOn executeLoadTenant +} + +task createTenant(group: ofbizServer, description: 'Create a new tenant in your environment') { + + def databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Derby.xml" + + task prepareAndValidateTenantArguments << { + if(!project.hasProperty('tenantId')) { + throw new GradleException('Project property tenantId is missing') + } + if(!project.hasProperty('tenantName')) { + throw new GradleException('Project property tenantName is missing') + } + // dbPlatform values: D(Derby), M(MySQL), O(Oracle), P(PostgreSQL) (default D) + if(project.hasProperty('dbPlatform')) { + if(dbPlatform == 'D') { + databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Derby.xml" + } else if(dbPlatform == 'M') { + databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-MySQL.xml" + } else if(dbPlatform == 'O') { + databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Oracle.xml" + } else if(dbPlatform == 'P') { + databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml" + } else { + throw new GradleException('Invalid value for property dbPlatform: ' + "${dbPlatform}") + } + } + } + + task generateDatabaseTemplateFile(dependsOn: prepareAndValidateTenantArguments) << { + def filterTokens = ['tenantId': tenantId, + 'tenantName': tenantName, + 'domainName': project.hasProperty('domainName')? "${domainName}":'org.apache.ofbiz', + 'db-IP': project.hasProperty('dbIp')? "${dbIp}":'', + 'db-User': project.hasProperty('dbUser')? "${dbUser}":'', + 'db-Password': project.hasProperty('dbPassword')? "${dbPassword}":''] + + generateFileFromTemplate(databaseTemplateFile, 'runtime/tmp', + filterTokens, 'tmpFilteredTenantData.xml') + } + + task generateAdminUserTemplateFile(dependsOn: prepareAndValidateTenantArguments) << { + generateFileFromTemplate( + "${rootDir}/framework/resources/templates/AdminUserLoginData.xml", + 'runtime/tmp', + ['userLoginId': "${tenantId}-admin".toString()], + 'tmpFilteredUserLogin.xml') + } + + // Load the tenants master database + createOfbizCommandTask('loadTenantOnDefaultDelegator', + ['--load-data', 'file=/runtime/tmp/tmpFilteredTenantData.xml'], + jvmArguments, false) + loadTenantOnDefaultDelegator.dependsOn(generateDatabaseTemplateFile, generateAdminUserTemplateFile) + + // Load the actual tenant data + createOfbizCommandTask('loadTenantData', [], jvmArguments, false) + loadTenantData.dependsOn(loadTenantOnDefaultDelegator) + + // Load the tenant admin user account + createOfbizCommandTask('loadTenantAdminUserLogin', [], jvmArguments, false) + loadTenantAdminUserLogin.dependsOn(loadTenantData) + + /* pass arguments to tasks, must be done this way + * because we are in the configuration phase. We cannot + * set the parameters at the execution phase. */ + if(project.hasProperty('tenantId')) { + loadTenantData.args '--load-data' + loadTenantData.args "delegator=default#${tenantId}" + + loadTenantAdminUserLogin.args '--load-data' + loadTenantAdminUserLogin.args "delegator=default#${tenantId}" + loadTenantAdminUserLogin.args '--load-data' + loadTenantAdminUserLogin.args "file=${rootDir}/runtime/tmp/tmpFilteredUserLogin.xml" + } + if(project.hasProperty('tenantReaders')) { + loadTenantData.args '--load-data' + loadTenantData.args "readers=${tenantReaders}" + } + + dependsOn(loadTenantAdminUserLogin) + + // cleanup + doLast { + delete("${rootDir}/runtime/tmp/tmpFilteredTenantData.xml") + delete("${rootDir}/runtime/tmp/tmpFilteredUserLogin.xml") + } +} + +// ========== System Administration tasks ========== +task createComponent(group: sysadminGroup, description: 'Create the layout of an OFBiz component in the hot-deploy folder.') << { + + def filterTokens = ['component-name': componentName, + 'component-resource-name': componentResourceName, + 'webapp-name': webappName, + 'base-permission': basePermission] + def templateDir = "${rootDir}/framework/resources/templates" + def componentDir = "${rootDir}/hot-deploy/${componentName}" + + logger.info('Creating a component with the following properties: ') + logger.info(" - componentName: ${componentName}") + logger.info(" - componentResourceName: ${componentResourceName}") + logger.info(" - webappName: ${webappName}") + logger.info(" - basePermission: ${basePermission}") + + mkdir componentDir + mkdir componentDir+"/config" + mkdir componentDir+"/data" + mkdir componentDir+"/data/helpdata" + mkdir componentDir+"/dtd" + mkdir componentDir+"/documents" + mkdir componentDir+"/entitydef" + mkdir componentDir+"/lib" + mkdir componentDir+"/patches" + mkdir componentDir+"/patches/test" + mkdir componentDir+"/patches/qa" + mkdir componentDir+"/patches/production" + mkdir componentDir+"/script" + mkdir componentDir+"/servicedef" + mkdir componentDir+"/src" + mkdir componentDir+"/testdef" + mkdir componentDir+"/webapp" + mkdir componentDir+"/webapp/${webappName}" + mkdir componentDir+"/webapp/${webappName}/error" + mkdir componentDir+"/webapp/${webappName}/WEB-INF" + mkdir componentDir+"/webapp/${webappName}/WEB-INF/actions" + mkdir componentDir+"/widget/" + + generateFileFromTemplate(templateDir+"/ofbiz-component.xml", componentDir, + filterTokens, "ofbiz-component.xml") + generateFileFromTemplate(templateDir+"/TypeData.xml", componentDir+"/data", + filterTokens, "${componentResourceName}TypeData.xml") + generateFileFromTemplate(templateDir+"/SecurityPermissionSeedData.xml", componentDir+"/data", + filterTokens, "${componentResourceName}SecurityPermissionSeedData.xml") + generateFileFromTemplate(templateDir+"/SecurityGroupDemoData.xml", componentDir+"/data", + filterTokens, "${componentResourceName}SecurityGroupDemoData.xml") + generateFileFromTemplate(templateDir+"/DemoData.xml", componentDir+"/data", + filterTokens, "${componentResourceName}DemoData.xml") + generateFileFromTemplate(templateDir+"/HELP.xml", componentDir+"/data/helpdata", + filterTokens, "HELP_${componentResourceName}.xml") + generateFileFromTemplate(templateDir+"/document.xml", componentDir+"/documents", + filterTokens, "${componentResourceName}.xml") + generateFileFromTemplate(templateDir+"/entitymodel.xml", componentDir+"/entitydef", + filterTokens, "entitymodel.xml") + generateFileFromTemplate(templateDir+"/services.xml", componentDir+"/servicedef", + filterTokens, "services.xml") + generateFileFromTemplate(templateDir+"/Tests.xml", componentDir+"/testdef", + filterTokens, "${componentResourceName}Tests.xml") + generateFileFromTemplate(templateDir+"/UiLabels.xml", componentDir+"/config", + filterTokens, "${componentResourceName}UiLabels.xml") + generateFileFromTemplate(templateDir+"/index.jsp", componentDir+"/webapp/${webappName}", + filterTokens, "index.jsp") + generateFileFromTemplate(templateDir+"/error.jsp", componentDir+"/webapp/${webappName}/error", + filterTokens, "error.jsp") + generateFileFromTemplate(templateDir+"/controller.xml", componentDir+"/webapp/${webappName}/WEB-INF", + filterTokens, "controller.xml") + generateFileFromTemplate(templateDir+"/web.xml", componentDir+"/webapp/${webappName}/WEB-INF", + filterTokens, "web.xml") + generateFileFromTemplate(templateDir+"/CommonScreens.xml", componentDir+"/widget", + filterTokens, "CommonScreens.xml") + generateFileFromTemplate(templateDir+"/Screens.xml", componentDir+"/widget", + filterTokens, "${componentResourceName}Screens.xml") + generateFileFromTemplate(templateDir+"/Menus.xml", componentDir+"/widget", + filterTokens, "${componentResourceName}Menus.xml") + generateFileFromTemplate(templateDir+"/Forms.xml", componentDir+"/widget", + filterTokens, "${componentResourceName}Forms.xml") + + logger.info("Component successfully created in folder ${rootDir}/hot-deploy/${componentName}.") + logger.info("Restart OFBiz and then visit the URL: https://localhost:8443/${webappName}") +} + +task createTestReports(group: sysadminGroup, description: 'Generate HTML reports from junit XML output') << { + ant.taskdef(name: 'junitreport', + classname: 'org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator', + classpath: configurations.junitLibs.asPath) + ant.junitreport(todir: './runtime/logs/test-results') { + fileset(dir: './runtime/logs/test-results') { + include(name: '*.xml') + } + report(format:'frames', todir:'./runtime/logs/test-results/html') + } +} +/* + * TODO replace this code with something more declarative. + * We are using it so that if tests fail we still get HTML reports + */ +gradle.taskGraph.afterTask { Task task, TaskState state -> + if (task.name ==~ /^ofbiz.*--test.*/ + || task.name ==~ /^ofbiz.*-t.*/) { + tasks.createTestReports.execute() + } +} + +// ========== Clean up tasks ========== +task cleanCatalina(group: cleanupGroup, description: 'Clean Catalina data in runtime/catalina/work') << { + delete "${rootDir}/runtime/catalina/work" +} +task cleanData(group: cleanupGroup, description: 'Clean all DB data (Derby) under runtime/data') << { + deleteAllInDirWithExclusions("${rootDir}/runtime/data/", ['README', 'derby.properties']) +} +task cleanDownloads(group: cleanupGroup, description: 'Clean all downloaded files') << { + delete fileTree(dir: "${rootDir}/framework/base/lib", includes: ['activemq-*.jar']) + delete fileTree(dir: "${rootDir}/framework/entity/lib/jdbc", includes: ['postgresql-*.jar']) + delete fileTree(dir: "${rootDir}/framework/entity/lib/jdbc", includes: ['mysql-*.jar']) +} +task cleanLogs(group: cleanupGroup, description: 'Clean all logs in runtime/logs') << { + deleteAllInDirWithExclusions("${rootDir}/runtime/logs/", ['README']) +} +task cleanOutput(group: cleanupGroup, description: 'Clean runtime/output directory') << { + deleteAllInDirWithExclusions("${rootDir}/runtime/output/", ['README']) +} +task cleanIndexes(group: cleanupGroup, description: 'Remove search indexes (e.g. Lucene) from runtime/indexes') << { + deleteAllInDirWithExclusions("${rootDir}/runtime/indexes/", ['README', 'index.properties']) +} +task cleanTempfiles(group: cleanupGroup, description: 'Remove file in runtime/tempfiles') << { + deleteAllInDirWithExclusions("${rootDir}/runtime/tempfiles/", ['README']) + deleteAllInDirWithExclusions("${rootDir}/runtime/tmp/", ['README']) +} +task cleanUploads(group: cleanupGroup, description: 'Remove uploaded files.') << { + deleteAllInDirWithExclusions("${rootDir}/runtime/uploads/", []) +} +task cleanXtra(group: cleanupGroup, description: 'Clean extra generated files like .rej, .DS_Store, etc.') << { + delete fileTree(dir: "${rootDir}", includes: ['**/.nbattrs', '**/*~','**/.#*', '**/.DS_Store', '**/*.rej', '**/*.orig']) +} +task cleanGradle(group: cleanupGroup, description: 'clean generated files from Gradle') << { + delete file("${rootDir}/.gradle") +} + +def cleanTasks = getTasksMatchingRegex(/^clean.+/) +task cleanAll(group: cleanupGroup, dependsOn: [cleanTasks, clean]) { + description 'Execute all cleaning tasks.' +} + +task cleanAntBuild(type: Delete, description: "Sort Term Task: clean old build dirs generated by Ant and the old ofbiz.jar in OFBiz root dir, see OFBIZ-7898") { + FileCollection applicationsBuildDirs = files("${rootDir}/applications/content/build.xml", "${rootDir}/applications/party/build.xml", "${rootDir}/applications/workeffort/build.xml", + "${rootDir}/applications/product/build.xml", "${rootDir}/applications/marketing/build.xml", "${rootDir}/applications/order/build.xml", "${rootDir}/applications/manufacturing/build.xml", + "${rootDir}/applications/accounting/build.xml", "${rootDir}/applications/securityext/build.xml", "${rootDir}/applications/ humanres/build.xml") + + + FileCollection frameworkBuildDirs = files("${rootDir}/framework/start/build.xml,base/build.xml", "${rootDir}/framework/entity/build.xml", "${rootDir}/framework/geronimo/build.xml", + "${rootDir}/framework/catalina/build.xml", "${rootDir}/framework/security/build.xml", "${rootDir}/framework/service/build.xml", "${rootDir}/framework/entityext/build.xml", + "${rootDir}/framework/minilang/build.xml", "${rootDir}/framework/webapp/build.xml", "${rootDir}/framework/widget/build.xml", "${rootDir}/framework/common/build.xml", + "${rootDir}/framework/datafile/build.xml", "${rootDir}/framework/testtools/build.xml", "${rootDir}/framework/webtools/build.xml") + + FileCollection specialpurposeBuildDirs = files("${rootDir}/specialpurpose/assetmaint/build.xml", "${rootDir}/specialpurpose/birt/build.xml", "${rootDir}/specialpurpose/ebay/build.xml", + "${rootDir}/specialpurpose/ebaystore/build.xml", "${rootDir}/specialpurpose/ecommerce/build.xml", "${rootDir}/specialpurpose/example/build.xml", "${rootDir}/specialpurpose/hhfacility/build.xml", + "${rootDir}/specialpurpose/ldap/build.xml", "${rootDir}/specialpurpose/lucene/build.xml", "${rootDir}/specialpurpose/solr/build.xml", "${rootDir}/specialpurpose/oagis/build.xml", + "${rootDir}/specialpurpose/pos/build.xml", "${rootDir}/specialpurpose/projectmgr/build.xml", "${rootDir}/specialpurpose/scrum/build.xml", "${rootDir}/specialpurpose/bi/build.xml", + "${rootDir}/specialpurpose/ webpos/build.xml", "${rootDir}/specialpurpose/passport/build.xml") + + FileCollection buildDirs = files("ofbiz.jar") + applicationsBuildDirs + frameworkBuildDirs + specialpurposeBuildDirs + + delete(buildDirs) +} + +// ========== Tasks for OFBiz committers ========== +def websiteDir = "${rootDir}/../site" +task copyDtds(group: committerGroup, description: 'Copy all DTDs from OFBiz instance to website') << { + mkdir websiteDir+'/dtds' + copy { + from(fileTree("${rootDir}").files) { + include '**/*.xsd' + exclude '**/002*.xsd' + exclude '**/068*.xsd' + exclude '**/161*.xsd' + exclude '**/196*.xsd' + exclude '**/197*.xsd' + } + into websiteDir+'/dtds' + } +} + +task gitInfoFooter(group: committerGroup, description: 'Update the Git Branch-revision info in the footer') << { + def branch + def revision + def timestamp = new Date().format 'yyyy-MM-dd HH:mm:ss' + File gitFooterFile = new File("${rootDir}/runtime/GitInfo.ftl") + + def branchOutput = new ByteArrayOutputStream() + exec{ + commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD' + standardOutput = branchOutput + } + branch = branchOutput.toString() + def revisionOutput = new ByteArrayOutputStream() + exec{ + commandLine 'git', 'rev-parse', 'HEAD' + standardOutput = revisionOutput + } + revision = revisionOutput.toString() + gitFooterFile.delete() + gitFooterFile.createNewFile() + gitFooterFile << "Branch: ${branch}" + gitFooterFile << "Revision: ${revision}" + gitFooterFile << "Built on: ${timestamp}" + System.lineSeparator() + gitFooterFile << "Java Version: ${org.gradle.internal.jvm.Jvm.current()}" +} + +task svnInfoFooter(group: committerGroup, description: 'Update the Subversion revision info in the footer') << { + def timestamp = new Date().format 'yyyy-MM-dd HH:mm:ss' + File svnFooterFile = new File("${rootDir}/runtime/SvnInfo.ftl") + def svnOutput = new ByteArrayOutputStream() + exec{ + commandLine 'svn', 'info', '--xml' + standardOutput = svnOutput + } + def info = new XmlParser().parseText(svnOutput.toString()) + svnFooterFile.delete() + svnFooterFile.createNewFile() + svnFooterFile << "Branch: ${info.entry.url.text()}" + System.lineSeparator() + svnFooterFile << "Revision: ${info.entry.commit.@revision}" + System.lineSeparator() + svnFooterFile << "Built on: ${timestamp}" + System.lineSeparator() + svnFooterFile << "Java Version: ${org.gradle.internal.jvm.Jvm.current()}" +} + +// ========== hidden support tasks ========== + +/* without executing this task, a test would fail that is named + * org.apache.ofbiz.base.util.test.UtilObjectTests.testGetObjectFromFactory() + * + * The test fails because it requires defining a service provider, read more below. + * http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Service_Provider + */ +task createBaseTestServiceProviderJar << { + ant.jar(destfile: "${rootDir}/build/libs/ofbiz-base-test.jar") { + service(type: 'org.apache.ofbiz.base.util.test.UtilObjectTests$TestFactoryIntf') { + provider(classname: 'org.apache.ofbiz.base.util.test.UtilObjectTests$FirstTestFactory') + provider(classname: 'org.apache.ofbiz.base.util.test.UtilObjectTests$SecondTestFactory') + } + } +} +classes.dependsOn createBaseTestServiceProviderJar + +/* ======================================================== + * Rules-based OFBiz server commands + * ======================================================== */ + +tasks.addRule('Pattern: ofbiz <Commands>: Execute OFBiz startup commands') { String taskName -> + if(taskName ==~ /^ofbiz\s.*/ || taskName == 'ofbiz') { + def arguments = (taskName - 'ofbiz').toLowerCase().tokenize(' ') + createOfbizCommandTask(taskName, arguments, jvmArguments, false) + } +} + +tasks.addRule('Pattern: ofbizDebug <Commands>: Execute OFBiz startup commands in remote debug mode') { String taskName -> + if(taskName ==~ /^ofbizDebug\s.*/ || taskName == 'ofbizDebug') { + def arguments = (taskName - 'ofbizDebug').toLowerCase().tokenize(' ') + createOfbizCommandTask(taskName, arguments, jvmArguments, true) + } +} + +tasks.addRule('Pattern: ofbizSecure <Commands>: Execute OFBiz startup commands pre-loading the notsoserial Java agent') { String taskName -> + if(taskName ==~ /^ofbizSecure\s.*/ || taskName == 'ofbizSecure') { + def arguments = (taskName - 'ofbizSecure').toLowerCase().tokenize(' ') + jvmArguments.add('-server') + jvmArguments.add("-javaagent:${rootDir}/tools/security/notsoserial/notsoserial-1.0-SNAPSHOT.jar") + jvmArguments.add("-Dnotsoserial.whitelist=${rootDir}/tools/security/notsoserial/empty.txt") + jvmArguments.add("-Dnotsoserial.dryrun=${rootDir}/tools/security/notsoserial/is-deserialized.txt") + jvmArguments.add("-Dnotsoserial.trace=${rootDir}/tools/security/notsoserial/deserialize-trace.txt") + createOfbizCommandTask(taskName, arguments, jvmArguments, false) + } +} + +tasks.addRule('Pattern: ofbizBackground <Commands>: Execute OFBiz startup commands in background and output to console.log') { String taskName -> + if(taskName ==~ /^ofbizBackground\s.*/ || taskName == 'ofbizBackground') { + createOfbizBackgroundCommandTask(taskName) + } +} + +tasks.addRule('Pattern: ofbizBackgroundSecure <Commands>: Execute OFBiz startup commands in background (secure mode) and output to console.log') { String taskName -> + if(taskName ==~ /^ofbizBackgroundSecure\s.*/ || taskName == 'ofbizBackgroundSecure') { + createOfbizBackgroundCommandTask(taskName) + } +} + +/* ======================================================== + * Helper Functions + * ======================================================== */ + +def createOfbizCommandTask(taskName, arguments, jvmArguments, isDebugMode) { + + def ofbizJarName = buildDir.toString()+'/libs/'+project.name+'.jar' + + task(type: JavaExec, dependsOn: build, taskName) { + jvmArgs(jvmArguments) + debug = isDebugMode + classpath = files(ofbizJarName) + main = ofbizMainClass + arguments.each { argument -> + args argument + } + } +} + +def createOfbizBackgroundCommandTask(taskName) { + def os = System.getProperty("os.name").toLowerCase() + def sourceTask = taskName.tokenize().first() + def arguments = (taskName - sourceTask) + + def targetTask + def gradleRunner + + if(sourceTask == 'ofbizBackground') { + targetTask = 'ofbiz' + } else if(sourceTask == 'ofbizBackgroundSecure') { + targetTask = 'ofbizSecure' + } + + if (os.contains("windows")) { + gradleRunner = 'gradlew' + } else { + gradleRunner = './gradlew' + } + + task (taskName) { + doLast { + spawnProcess(gradleRunner, "${targetTask} ${arguments}") + } + } +} + +def spawnProcess(command, arguments) { + ProcessBuilder pb = new ProcessBuilder(command, arguments) + File consoleLog = file("${rootDir}/runtime/logs/console.log"); + + pb.directory(file("${rootDir}")) + pb.redirectErrorStream(true) + pb.redirectOutput(ProcessBuilder.Redirect.appendTo(consoleLog)) + pb.start() +} + +def getDirectoryInActiveComponentsIfExists(String dirName) { + def dirInComponents = [] + iterateOverActiveComponents { component -> + def subDir = file(component.toString() + '/' + dirName) + if(subDir.exists()) { + dirInComponents.add subDir + } + } + return dirInComponents +} + +def deleteAllInDirWithExclusions(dirName, exclusions) { + ant.delete (includeEmptyDirs: 'true', verbose: 'on') { + fileset(dir: dirName, includes: '**/*', erroronmissingdir: "false") { + exclusions.each { exclusion -> + exclude name: exclusion + } + } + } +} + +def getTasksMatchingRegex(theRegex) { + def filteredTasks = [] + tasks.each { task -> + if(task.name ==~ theRegex) { + filteredTasks.add(task) + } + } + return filteredTasks +} + +def generateFileFromTemplate(templateFileInFullPath, targetDirectory, filterTokens, newFileName) { + copy { + from (templateFileInFullPath) { + filter ReplaceTokens, tokens: filterTokens + rename templateFileInFullPath.tokenize('/').last(), newFileName + } + into targetDirectory + } +} + +def getJarManifestClasspathForCurrentOs() { + def osClassPath = '' + if(System.getProperty('os.name').toLowerCase().contains('windows')) { + configurations.runtime.files.each { cpEntry -> + osClassPath += '\\' + cpEntry.toString() + ' ' + } + } else { + osClassPath = configurations.runtime.files.collect { "$it" }.join(' ') + } + return osClassPath +} |
Free forum by Nabble | Edit this page |