blob: e20cf7126488d15e8fcbc87e9fcf9bdffa5908f7 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.royale.test.ant.tasks;
import java.io.File;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Java;
import org.apache.tools.ant.types.FilterSet;
import org.apache.tools.ant.types.FilterSetCollection;
import org.apache.tools.ant.types.Commandline.Argument;
import org.apache.tools.ant.types.resources.FileResource;
import org.apache.tools.ant.types.resources.URLResource;
import org.apache.tools.ant.util.ResourceUtils;
import org.apache.royale.test.ant.LoggingUtil;
import org.apache.royale.test.ant.tasks.configuration.CompilationConfiguration;
public class Compilation
{
private final String BASIC_APPLICATION_CLASS = "Application";
private final String MXML2006_PREFIX = "mx";
private final String MXML2006_NAMESPACE="xmlns:" + MXML2006_PREFIX + "=\"http://www.adobe.com/2006/mxml\"";
private final String MXML2009_PREFIX = "fx";
private final String MXML2009_NAMESPACE="xmlns:" + MXML2009_PREFIX + "=\"http://ns.adobe.com/mxml/2009\"";
private final String BASIC_PREFIX = "js";
private final String BASIC_NAMESPACE = "xmlns:" + BASIC_PREFIX + "=\"library://ns.apache.org/royale/basic\"";
private final String CI_LISTENER = "CIListener";
private final String AIR_CI_LISTENER = "AirCIListener";
private final String TESTRUNNER_TEMPLATE = "TestRunner.template";
private final String TESTRUNNER_FILE = "TestRunner.mxml";
private final String MXMLC_RELATIVE_PATH = "lib/mxmlc.jar";
private final String FRAMEWORKS_RELATIVE_PATH = "frameworks";
private final String SWF_FILENAME = "TestRunner.swf";
private CompilationConfiguration configuration;
private Project project;
private String mxmlcPath;
public Compilation(Project project, CompilationConfiguration configuration)
{
this.project = project;
this.configuration = configuration;
mxmlcPath = configuration.getRoyaleHome().getAbsolutePath() + File.separatorChar + MXMLC_RELATIVE_PATH;
}
public File compile() throws BuildException
{
configuration.log();
File runnerFile = generateTestRunnerFromTemplate(configuration.getWorkingDir());
File finalFile = new File(configuration.getWorkingDir().getAbsolutePath() + File.separatorChar + SWF_FILENAME);
Java compilationTask = createJavaTask(runnerFile, finalFile);
LoggingUtil.log("Compiling test classes: [" + configuration.getTestSources().getCanonicalClasses(", ") + "]", true);
LoggingUtil.log(compilationTask.getCommandLine().describeCommand());
if(compilationTask.executeJava() != 0)
{
throw new BuildException("Compilation failed:\n" + project.getProperty("MXMLC_ERROR"));
}
return finalFile;
}
private File generateTestRunnerFromTemplate(File workingDir) throws BuildException
{
try
{
int sdkVersion = getSDKVersion();
String namespaces = MXML2009_NAMESPACE + "\n" + BASIC_NAMESPACE;
String ciListener = configuration.getPlayer().equals("flash") ? CI_LISTENER : AIR_CI_LISTENER;
File runner = new File(workingDir.getAbsolutePath() + File.separatorChar + TESTRUNNER_FILE);
//Template location in JAR
URLResource template = new URLResource(getClass().getResource("/" + TESTRUNNER_TEMPLATE));
//Create tokens to filter
FilterSet filters = new FilterSet();
filters.addFilter("APPLICATION_PREFIX", BASIC_PREFIX);
filters.addFilter("APPLICATION_CLASS", BASIC_APPLICATION_CLASS);
filters.addFilter("NAMESPACES", namespaces);
filters.addFilter("MXML_PREFIX", MXML2009_PREFIX);
filters.addFilter("CI_LISTENER_CLASS", ciListener);
filters.addFilter("CLASS_REFS", configuration.getTestSources().getClasses());
filters.addFilter("IMPORT_REFS", configuration.getTestSources().getImports());
//Copy descriptor template to SWF folder performing token replacement
ResourceUtils.copyResource(
template,
new FileResource(runner),
new FilterSetCollection(filters),
null,
true,
false,
null,
null,
project
);
LoggingUtil.log("Created test runner at [" + runner.getAbsolutePath() + "]");
return runner;
}
catch (Exception e)
{
throw new BuildException("Could not create test runner from template.", e);
}
}
private int getSDKVersion()
{
String outputProperty = "SDK_VERSION";
//Execute mxmlc to find SDK version number
Java task = new Java();
task.setFork(true);
task.setFailonerror(true);
task.setJar(new File(mxmlcPath));
task.setProject(project);
task.setDir(project.getBaseDir());
task.setOutputproperty(outputProperty);
Argument versionArgument = task.createArg();
versionArgument.setValue("--version");
task.execute();
//Parse version number and return as int
String output = project.getProperty(outputProperty);
int prefixIndex = output.indexOf("Version ");
int version = Integer.parseInt(output.substring(prefixIndex + 8, prefixIndex + 9));
LoggingUtil.log("Found SDK version: " + version);
return version;
}
private Java createJavaTask(File runnerFile, File finalFile)
{
String frameworksPath = configuration.getRoyaleHome().getAbsolutePath() + File.separatorChar + FRAMEWORKS_RELATIVE_PATH;
Java task = new Java();
task.setFork(true);
task.setFailonerror(true);
task.setJar(new File(mxmlcPath));
task.setProject(project);
task.setDir(project.getBaseDir());
task.setMaxmemory("256M"); //MXMLC needs to eat
task.setErrorProperty("MXMLC_ERROR");
Argument royaleLibArgument = task.createArg();
royaleLibArgument.setLine("+royalelib \"" + frameworksPath + "\"");
if(configuration.getPlayer().equals("air"))
{
Argument airConfigArgument = task.createArg();
airConfigArgument.setValue("+configname=air");
}
Argument outputFile = task.createArg();
outputFile.setLine("-output \"" + finalFile.getAbsolutePath() + "\"");
Argument sourcePath = task.createArg();
sourcePath.setLine("-source-path " + configuration.getSources().getPathElements(" ") + " " + configuration.getTestSources().getPathElements(" "));
determineLibraryPath( task );
determineLoadConfigArgument( task );
Argument debug = task.createArg();
debug.setLine( "-debug=" + configuration.getDebug() );
Argument headlessServer = task.createArg();
headlessServer.setLine("-headless-server=true");
Argument mainFile = task.createArg();
mainFile.setValue(runnerFile.getAbsolutePath());
return task;
}
private void determineLoadConfigArgument(Java java)
{
if(configuration.getLoadConfig() != null)
{
Argument argument = java.createArg();
argument.setLine(configuration.getLoadConfig().getCommandLineArgument());
}
}
private void determineLibraryPath(Java java)
{
if(!configuration.getLibraries().getPathElements(" -library-path+=").isEmpty())
{
Argument libraryPath = java.createArg();
libraryPath.setLine("-library-path+=" + configuration.getLibraries().getPathElements(" -library-path+="));
}
}
}