blob: 7b41b20e3a789ee090eb1d2268533a5036938b9c [file] [log] [blame]
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.xpath.XPathFactory
import java.util.regex.Matcher
/*
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.
*/
allConditionsMet = true
baseDirectory = project.model.pomFile.parent
/*
Check if the Flash player executable is specified and available at the specified location
*/
def detectFlashPlayer() {
print "Detecting FlashPlayer Debugger: "
String flashplayerDebuggerPath = System.getenv("FLASHPLAYER_DEBUGGER")
if(flashplayerDebuggerPath != null) {
// If the property is specified with surrounding double-quotes, remove them.
if(flashplayerDebuggerPath.startsWith("\"") && flashplayerDebuggerPath.endsWith("\"")) {
flashplayerDebuggerPath = flashplayerDebuggerPath.substring(1, flashplayerDebuggerPath.length() - 1)
}
File flashplayerDebuggerFile = new File(flashplayerDebuggerPath)
if(flashplayerDebuggerFile.exists()) {
if(!flashplayerDebuggerFile.isFile()) {
println "not a file: FLASHPLAYER_DEBUGGER must point to a file"
allConditionsMet = false
return
}
// On a Mac, we can also check the version.
if(os == "mac") {
if(!flashplayerDebuggerFile.canExecute()) {
println "executable: FLASHPLAYER_DEBUGGER must point to an executable file"
allConditionsMet = false
return
}
// Check the version by inspecting the ../Info.plst
String curVersion = getMacFlashPlayerVersion(flashplayerDebuggerFile)
// Check at least the version 32 is installed.
def result = checkVersionAtLeast(curVersion, flashVersion)
if(!result) {
allConditionsMet = false
return
}
println "OK"
} else if(os == "linux") {
if(!flashplayerDebuggerFile.canExecute()) {
println "executable: FLASHPLAYER_DEBUGGER must point to an executable file"
allConditionsMet = false
return
}
println "OK"
} else if(os == "win") {
println "OK"
}
} else {
println "missing: File referenced by FLASHPLAYER_DEBUGGER does not exist. " + flashplayerDebuggerPath
allConditionsMet = false
}
} else {
println "missing: FLASHPLAYER_DEBUGGER environment variable. " +
"Please get the 'Flash Player projector content debugger' for your platform from here: " +
"https://www.adobe.com/support/flashplayer/debug_downloads.html"
allConditionsMet = false
}
}
def checkFlashPlayer(File flashplayerExecutable) {
flashplayerExecutable.exists() && flashplayerExecutable.isFile()
}
def getMacFlashPlayerVersion(File flashplayerExecutable) {
File infoPlistFile = new File(flashplayerExecutable.parentFile.parentFile, "Info.plist")
if(!infoPlistFile.exists()) {
throw new RuntimeException("Unable to parse Info.plist file for FlashPlayer Debugger at " + flashplayerExecutable.path)
}
def xpath = XPathFactory.newInstance().newXPath()
def builder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
def inputStream = new FileInputStream( infoPlistFile )
def document = builder.parse(inputStream).documentElement
xpath.evaluate("//key[text() = \"CFBundleShortVersionString\"]/following-sibling::string[1]/text()", document)
}
/*
Checks if a given version number is at least as high as a given reference version.
*/
def checkVersionAtLeast(String current, String minimum) {
def currentSegments = current.tokenize('.')
def minimumSegments = minimum.tokenize('.')
def numSegments = Math.min(currentSegments.size(), minimumSegments.size())
for (int i = 0; i < numSegments; ++i) {
def currentSegment = currentSegments[i].toInteger()
def minimumSegment = minimumSegments[i].toInteger()
if(currentSegment < minimumSegment) {
println current.padRight(14) + "FAILED (required " + minimum + ")"
return false
} else if(currentSegment > minimumSegment) {
println current.padRight(14) + "OK"
return true
}
}
def curNotShorter = currentSegments.size() >= minimumSegments.size()
if(curNotShorter) {
println current.padRight(14) + " OK"
} else {
println current.padRight(14) + " (required " + minimum + ")"
}
curNotShorter
}
/**
* Version extraction function/macro. It looks for occurrence of x.y or x.y.z
* in passed input text (likely output from `program --version` command if found).
*
* @param input
* @return
*/
private Matcher extractVersion(input) {
def matcher = input =~ /(\d+\.\d+(\.\d+)?).*/
matcher
}
/////////////////////////////////////////////////////
// Find out which OS and arch are bring used.
/////////////////////////////////////////////////////
def osString = project.properties['os.type']
def osMatcher = osString =~ /(.*)/
if(osMatcher.size() == 0) {
throw new RuntimeException("Currently unsupported OS")
}
os = osMatcher[0][1]
println "Detected OS: " + os
flashVersion = project.properties['flash.version']
println "Detected minimum Flash version: " + flashVersion
airVersion = project.properties['air.version']
println "Detected minimum Air version: " + airVersion
/////////////////////////////////////////////////////
// Find out which profiles are enabled.
/////////////////////////////////////////////////////
println "Enabled profiles:"
println ""
// - Windows:
// - Check the length of the path of the base dir as we're having issues with the length of paths being too long.
if(os == "win") {
File pomFile = project.model.pomFile
if(pomFile.absolutePath.length() > 100) {
println "On Windows we encounter problems with maximum path lengths. " +
"Please move the project to a place it has a shorter base path " +
"and run the build again."
allConditionsMet = false
}
}
/////////////////////////////////////////////////////
// Do the actual checks depending on the enabled
// profiles.
/////////////////////////////////////////////////////
def optionWithSwfEnabled = false
def activeProfiles = session.request.activeProfiles
for (def activeProfile : activeProfiles) {
if(activeProfile == "option-with-swf") {
optionWithSwfEnabled = true
println "option-with-swf"
}
}
println ""
if(optionWithSwfEnabled) {
if(os == "linux") {
println "As linux doesn't support the FlashPlayer, we cannot build with the 'option-with-swf' profile on Linux."
allConditionsMet = false
} else {
detectFlashPlayer()
}
}
if(!allConditionsMet) {
throw new RuntimeException("Not all conditions met, see log for details.")
}
println ""
println "All known conditions met successfully."
println ""