blob: dfc2906421891bc6da1a7e92b863908cf939b7c6 [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 flex2.compiler.common;
import flash.localization.LocalizationManager;
import flex2.compiler.common.FramesConfiguration.FrameInfo;
import flex2.compiler.config.AdvancedConfigurationInfo;
import flex2.compiler.config.CommandLineConfigurator;
import flex2.compiler.config.ConfigurationException;
import flex2.compiler.config.ConfigurationValue;
import flex2.compiler.config.ConfigurationInfo;
import flex2.compiler.io.VirtualFile;
import flex2.compiler.util.QName;
import flex2.compiler.util.ThreadLocalToolkit;
import flex2.linker.LinkerConfiguration;
import flex2.tools.LicensesConfiguration;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.LinkedList;
import java.util.Locale;
import java.util.HashSet;
import java.util.Set;
import java.util.Collection;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
import java.io.File;
import flash.util.FileUtils;
import javax.xml.parsers.SAXParserFactory;
import javax.xml.parsers.SAXParser;
import macromedia.asc.util.ContextStatics;
import macromedia.asc.util.ObjectList;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/**
* Tools like mxmlc and compc use configuration objects to store
* configuration options parsed from config files and command-line options.
*
* The configuration object is produced by
* flex2.tools.Mxmlc.processConfiguration().
* This method can produce instances of various subclasses:
*
* Configuration
* ToolsConfiguration
* ASDocConfiguration (for asdoc command-line tool)
* CommandLineConfiguration (for mxmlc command-line tool)
* CompcConfiguration (for compc command-line tool)
* ApplicationCompilerConfiguration (for OEM ApplicationCompiler)
* LibraryCompilerConfiguration (for OEM LibraryCompiler)
*
* There are also "sub-configuration" classes such as
* CompilerConfiguration and MetadataConfiguration.
* Instances of these classes store dotted/nested config options.
* For example, the -compiler.library-path command line option
* (corresponding to <compiler><library-path>...</libraryPath></compiler>
* in an XML config file) is stored in CompilerConfiguration,
* which is owned by Configuration.
*
* A configuration class does not have to extend Configuration
* or implement any interface.
* Instead, configuration objects get populated with configuration
* information via reflection.
* A configuration class declares that it support a particular
* option such as -library-path / <library-path> simply by having
* the public methods getLibraryPathInfo() and cfgLibraryPath().
* (Note the change in spelling from library-path to LibraryPath.)
*
* A method like getLibraryPathInfo() returns a ConfigurationInfo object
* which has metadata about the option, such as its description,
* whether it can have a single value or multiple values, etc.
*
* After the ConfigurationBuffer has accumulated all ConfigurationValue
* objects parsed from various source by "configurators"
* such as DefaultsConfigurator, SystemPropertyConfiguration,
* FileConfigurator, and CommandLineConfigurator, it pushes these
* ConfigurationValues into the configuration objects that accept them
* via methods like cfgLibraryPath().
* The ConfigurationBuffer inspects the type of the second parameter
* of this method and can pass, for example, a String array
* in addition to the general ConfigurationValue.
*
* Typically a cfgXXX() method will simply store the option value,
* or some transformed version of it, in a private field such as
* libraryPath.
* A public method such as getLibraryPath() -- whose name doesn't
* matter because it doesn't get called through reflection --
* then exposes the option to the tool.
*
* You can force one configuration option to be set before another,
* and avoid race conditions, by using the
* ConfigurationInfo.getSoftPrerequisites() method.
*/
public class Configuration implements LinkerConfiguration, Cloneable
{
// ATTENTION:
// Please specify default values inside DefaultsConfigurator.
public Configuration()
{
this.compilerConfiguration = new CompilerConfiguration(this);
frames = new FramesConfiguration();
metadataConfiguration = new MetadataConfiguration();
licensesConfiguration = new LicensesConfiguration();
rslSettingsConfiguration = new RuntimeSharedLibrarySettingsConfiguration(this);
}
/**
*
* @param compilerConfig - may not be null
* @param configuration - may be null
* @return excluded libraries summed from all configuration options
*/
public static VirtualFile[] getAllExcludedLibraries(CompilerConfiguration compilerConfig,
Configuration configuration)
{
return (VirtualFile[]) CompilerConfiguration.merge(
compilerConfig.getExternalLibraryPath(),
((configuration == null) ? null
: configuration.getRslExcludedLibraries()),
VirtualFile.class);
}
/**
* The path of a given file name based on the context of the
* configuration value or the default output directory token.
*
* @param cv
* @param fileName
* @return the full path of the file.
*/
public static String getOutputPath(ConfigurationValue cv, String fileName)
{
String result = fileName;
if (fileName != null)
{
File file = new File(fileName);
if (!FileUtils.isAbsolute(file))
{
String directory = cv.getBuffer().getToken(flex2.tools.oem.Configuration.DEFAULT_OUTPUT_DIRECTORY_TOKEN);
// if no default output directory, then use the configuration context.
if (directory == null)
{
directory = cv.getContext();
}
if (directory != null)
{
result = FileUtils.addPathComponents(directory, fileName, File.separatorChar);
}
}
}
return result;
}
protected ConfigurationPathResolver configResolver;
public void setConfigPathResolver( ConfigurationPathResolver resolver )
{
this.configResolver = resolver;
this.compilerConfiguration.setConfigPathResolver( resolver );
this.rslSettingsConfiguration.setConfigPathResolver(resolver);
}
static private Map<String, String> aliases = null;
static public Map<String, String> getAliases()
{
if (aliases == null)
{
aliases = new HashMap<String, String>();
aliases.put( "l", "compiler.library-path" );
aliases.put( "el", "compiler.external-library-path" );
aliases.put( "sp", "compiler.source-path");
aliases.put( "rsl", "runtime-shared-libraries");
aliases.put( "keep", "compiler.keep-generated-actionscript");
aliases.put( "o", "output" );
aliases.put("rslp", "runtime-shared-library-path");
aliases.put("static-rsls", "static-link-runtime-shared-libraries");
aliases.put("rsl-domain", "runtime-shared-library-settings.application-domain");
}
return aliases;
}
/**
* SWF width
*/
private String width = null;
private String widthPercent = null;
public String width()
{
return width;
}
public String widthPercent()
{
return widthPercent;
}
public void setWidth( String width )
{
this.width = width;
}
public void setWidthPercent(String widthPercent)
{
this.widthPercent = widthPercent;
}
/**
* SWF height
*/
private String height = null;
private String heightPercent = null;
public String height()
{
return height;
}
public String heightPercent()
{
return heightPercent;
}
public void setHeight( String height )
{
this.height = height;
}
public void setHeightPercent(String heightPercent)
{
this.heightPercent = heightPercent;
}
/**
* Page title
*/
private String pageTitle = null;
public String pageTitle()
{
return pageTitle;
}
public void setPageTitle(String title)
{
this.pageTitle = title;
}
/**
* Root class name
*/
private String rootClassName;
public String getRootClassName()
{
return (rootClassName != null)? rootClassName : mainDefinition;
}
public void setRootClassName( String rootClassName )
{
this.rootClassName = rootClassName;
}
/**
* Main definition
*/
private String mainDefinition;
public String getMainDefinition()
{
return mainDefinition;
}
public void setMainDefinition( String mainDefinition )
{
this.mainDefinition = mainDefinition;
}
/**
* Resource bundles
*/
private SortedSet<String> resourceBundles = new TreeSet<String>();
// this list is just used for resourceBundleList. See CU.resourceBundle for the
// names of resource bundles that are linked in
public SortedSet<String> getResourceBundles()
{
return resourceBundles;
}
/**
* Unresolved
*/
private Set<String> unresolved = new HashSet<String>();
public Set<String> getUnresolved()
{
return unresolved;
}
//
// 'framework' option
//
private static final String DEFAULT_FRAMEWORK = "halo";
private String framework = DEFAULT_FRAMEWORK;
public String getFramework()
{
return framework;
}
public void cfgFramework(ConfigurationValue cv, String s)
{
framework = s;
}
//
// 'benchmark' option
//
private boolean benchmark = false;
public boolean benchmark()
{
return benchmark;
}
public void cfgBenchmark(ConfigurationValue cv, boolean b)
{
benchmark = b;
}
public static ConfigurationInfo getBenchmarkInfo()
{
return new ConfigurationInfo() {
public boolean doChecksum()
{
return false;
}
};
}
private int benchmarkCompilerDetails; // 0 = none, 1 = light, 5 = verbose
public int getBenchmarkCompilerDetails()
{
return benchmarkCompilerDetails;
}
/**
* @param cv
* @param b
*/
public void cfgBenchmarkCompilerDetails(ConfigurationValue cv, int details)
{
benchmarkCompilerDetails = details;
}
public static ConfigurationInfo getBenchmarkCompilerDetailsInfo()
{
return new ConfigurationInfo() {
public boolean isHidden()
{
return true;
}
public boolean doChecksum()
{
return false;
}
};
}
private long benchmarkTimeFilter; // min time of units to log in ms
public long getBenchmarkTimeFilter()
{
return benchmarkTimeFilter;
}
/**
* @param cv
* @param b
*/
public void cfgBenchmarkTimeFilter(ConfigurationValue cv, long timeFilter)
{
benchmarkTimeFilter = timeFilter;
}
public static ConfigurationInfo getBenchmarkTimeFilterInfo()
{
return new ConfigurationInfo() {
public boolean isHidden()
{
return true;
}
public boolean doChecksum()
{
return false;
}
};
}
//
// 'compiler.*' options
//
private CompilerConfiguration compilerConfiguration;
public CompilerConfiguration getCompilerConfiguration()
{
return compilerConfiguration;
}
public boolean debug()
{
return compilerConfiguration.debug();
}
public void setDebug(boolean debug)
{
compilerConfiguration.setDebug(debug);
}
public boolean verboseStacktraces()
{
return compilerConfiguration.verboseStacktraces();
}
public boolean optimize()
{
return compilerConfiguration.optimize();
}
public void setOptimize(boolean optimize)
{
compilerConfiguration.setOptimize(optimize);
}
/**
* Includes user specified metadata and extra metadata added by the linker.
*/
public String[] getMetadataToKeep()
{
return getCompilerConfiguration().getKeepAs3Metadata();
}
//
// 'debug-password' option
//
private String debugPassword;
/**
* The password to include in debuggable swfs.
*/
public String debugPassword()
{
return debugPassword;
}
public void setDebugPassword(String debugPassword)
{
this.debugPassword = debugPassword;
}
public void cfgDebugPassword( ConfigurationValue cv, String debugPassword )
{
this.debugPassword = debugPassword;
}
public static ConfigurationInfo getDebugPasswordInfo()
{
return new AdvancedConfigurationInfo();
}
//
// 'default-background-color' option
//
private int backgroundColor = 0x50727E;
public int backgroundColor()
{
return this.backgroundColor;
}
public void setBackgroundColor( int backgroundColor )
{
this.backgroundColor = backgroundColor;
}
public void cfgDefaultBackgroundColor( ConfigurationValue cv, int backgroundColor )
{
this.backgroundColor = backgroundColor;
}
public static ConfigurationInfo getDefaultBackgroundColorInfo()
{
return new AdvancedConfigurationInfo();
}
//
// 'default-frame-rate' option
//
private int frameRate = 24;
public int getFrameRate()
{
return frameRate;
}
public void setFrameRate( int rate )
{
frameRate = rate;
}
public void cfgDefaultFrameRate( ConfigurationValue cv, int rate )
throws ConfigurationException
{
if (rate <= 0)
throw new ConfigurationException.GreaterThanZero( cv.getVar(),
cv.getSource(), cv.getLine() );
frameRate = rate;
}
public static ConfigurationInfo getDefaultFrameRateInfo()
{
return new AdvancedConfigurationInfo();
}
//
// 'default-script-limits' option
//
private int scriptLimit = 60;
private int scriptRecursionLimit = 1000;
private boolean scriptLimitsSet = false;
public int getScriptTimeLimit()
{
return scriptLimit;
}
public int getScriptRecursionLimit()
{
return scriptRecursionLimit;
}
public void setScriptTimeLimit( int scriptLimit )
{
scriptLimitsSet = true;
this.scriptLimit = scriptLimit;
}
public void setScriptRecursionLimit( int recursionLimit )
{
scriptLimitsSet = true;
this.scriptRecursionLimit = recursionLimit;
}
public boolean scriptLimitsSet()
{
return scriptLimitsSet;
}
public void cfgDefaultScriptLimits( ConfigurationValue cv, int maxRecursionDepth, int maxExecutionTime )
throws ConfigurationException
{
if (maxRecursionDepth <= 0)
throw new ConfigurationException.GreaterThanZero( cv.getVar(), cv.getSource(), cv.getLine() );
if (maxExecutionTime <= 0)
throw new ConfigurationException.GreaterThanZero( cv.getVar(),
cv.getSource(), cv.getLine() );
this.scriptLimitsSet = true;
this.scriptLimit = maxExecutionTime;
this.scriptRecursionLimit = maxRecursionDepth;
}
public static ConfigurationInfo getDefaultScriptLimitsInfo()
{
return new ConfigurationInfo( new String[] { "max-recursion-depth", "max-execution-time" } )
{
public boolean isAdvanced()
{
return true;
}
};
}
//
// 'default-size' option
//
private int defaultWidth = 500;
private int defaultHeight = 375;
public int defaultWidth()
{
return defaultWidth;
}
public int defaultHeight()
{
return defaultHeight;
}
public void cfgDefaultSize( ConfigurationValue cv, int width, int height )
throws ConfigurationException
{
if ((width < 1) || (width > 4096) || (height < 1) || (height > 4096)) // whatever
{
throw new ConfigurationException.IllegalDimensions( width, height, cv.getVar(), cv.getSource(), cv.getLine() );
}
this.defaultWidth = width;
this.defaultHeight = height;
}
public static ConfigurationInfo getDefaultSizeInfo()
{
return new ConfigurationInfo( new String[] {"width", "height"} )
{
public boolean isAdvanced()
{
return true;
}
};
}
//
// 'externs' option
//
private Set<String> externs = new HashSet<String>();
public Set<String> getExterns()
{
Collection<String> compilerExterns = compilerConfiguration.getExterns();
if (compilerExterns != null)
{
externs.addAll(compilerExterns);
}
return externs;
}
public void addExterns( Collection<String> externs )
{
this.externs.addAll( externs );
}
public void addExterns(QName[] qNames)
{
for (int i = 0, len = qNames == null ? 0 : qNames.length; i < len; i++)
{
this.externs.add(qNames[i].toString());
}
}
public void cfgExterns( ConfigurationValue cfgval, List<String> vals )
{
externs.addAll(toQNameString(vals));
}
public static ConfigurationInfo getExternsInfo()
{
return new ConfigurationInfo( -1, "symbol" )
{
public boolean allowMultiple()
{
return true;
}
public boolean isAdvanced()
{
return true;
}
public boolean doChecksum()
{
return false;
}
};
}
public void removeExterns(Collection<String> externs)
{
this.externs.removeAll(externs);
}
protected List<String> toQNameString(List<String> vals)
{
for (int i = 0, size = vals == null ? 0 : vals.size(); i < size; i++)
{
String name = vals.get(i);
if ((name.indexOf( ':' ) == -1) && (name.indexOf( '.' ) != -1))
{
int dot = name.lastIndexOf( '.' );
name = name.substring( 0, dot ) + ':' + name.substring( dot + 1 );
}
vals.set(i, name);
}
return vals;
}
//
// 'frames.*' options
//
private FramesConfiguration frames;
public FramesConfiguration getFramesConfiguration()
{
return frames;
}
public List<FrameInfo> getFrameList()
{
return frames.getFrameList();
}
//
// 'generated-frame-loader' option (hidden)
//
public boolean generateFrameLoader = true;
public void cfgGenerateFrameLoader( ConfigurationValue cv, boolean value )
{
this.generateFrameLoader = value;
}
public static ConfigurationInfo getGenerateFrameLoaderInfo()
{
return new AdvancedConfigurationInfo()
{
public boolean isHidden()
{
return true;
}
};
}
//
// 'generated-output' option
//
/*
// TODO - enable this, add hooks to use it!
private String generatedOutput = null;
public String getGeneratedOutput()
{
return generatedOutput;
}
public void cfgGeneratedOutput( ConfigurationValue cfgVal, String path )
{
// We should probably resolve this here or in validate, but its kinda painful right now.
generatedOutput = path;
}
public static ConfigurationInfo getGeneratedOutputInfo()
{
return new ConfigurationInfo( 1, "directory" )
{
public boolean isHidden()
{
return true;
}
public String[] getPrerequisites()
{
return new String[] { "flexlib" };
}
};
}
*/
//
// 'includes' option
//
private Set<String> includes = new LinkedHashSet<String>();
public Set<String> getIncludes()
{
return includes;
}
public void addIncludes( Collection<String> includes )
{
this.includes.addAll(includes);
}
public void cfgIncludes( ConfigurationValue cfgval, List<String> vals )
{
includes.addAll(toQNameString(vals));
}
public static ConfigurationInfo getIncludesInfo()
{
return new ConfigurationInfo( -1, "symbol" )
{
public boolean allowMultiple()
{
return true;
}
public boolean isAdvanced()
{
return true;
}
};
}
//
// 'lazy-init' option (hidden)
//
private boolean lazyInit = false;
public boolean lazyInit()
{
return lazyInit;
}
public void cfgLazyInit(ConfigurationValue cv, boolean b)
{
lazyInit = b;
}
public static ConfigurationInfo getLazyInitInfo()
{
return new AdvancedConfigurationInfo()
{
public boolean isHidden()
{
return true;
}
};
}
//
// 'link-report' option
//
private String linkReportFileName = null;
public String getLinkReportFileName()
{
return linkReportFileName;
}
public boolean generateLinkReport()
{
return linkReportFileName != null;
}
public void cfgLinkReport( ConfigurationValue cv, String filename )
{
this.linkReportFileName = getOutputPath(cv, filename);
}
public static ConfigurationInfo getLinkReportInfo()
{
return new ConfigurationInfo(new String[] {"filename"})
{
public boolean isAdvanced()
{
return true;
}
};
}
//
// 'size-report' option
//
private String sizeReportFileName = null;
public String getSizeReportFileName()
{
return sizeReportFileName;
}
public boolean generateSizeReport()
{
return sizeReportFileName != null;
}
public void cfgSizeReport( ConfigurationValue cv, String filename )
{
this.sizeReportFileName = getOutputPath(cv, filename);
}
public static ConfigurationInfo getSizeReportInfo()
{
return new ConfigurationInfo(new String[] {"filename"})
{
public boolean isAdvanced()
{
return true;
}
};
}
//
// 'load-externs' option
//
public void cfgLoadExterns( ConfigurationValue cfgval, String filename ) throws ConfigurationException
{
VirtualFile f = ConfigurationPathResolver.getVirtualFile( filename, configResolver, cfgval );
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
try
{
SAXParser parser = factory.newSAXParser();
parser.parse(f.getInputStream(),
new DefaultHandler()
{
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
if ("def".equals( qName ) || "pre".equals( qName ) || "ext".equals( qName ))
{
String id = attributes.getValue( "id" );
externs.add( id );
}
}
});
}
catch (Exception e)
{
throw new ConfigurationException.ConfigurationIOError( filename, cfgval.getVar(), cfgval.getSource(), cfgval.getLine() );
}
}
public static ConfigurationInfo getLoadExternsInfo()
{
return new ConfigurationInfo( 1, "filename" )
{
public boolean allowMultiple()
{
return true;
}
public boolean isAdvanced()
{
return true;
}
};
}
//
// 'metadata.*' options
//
private MetadataConfiguration metadataConfiguration;
public MetadataConfiguration getMetadataConfiguration()
{
return metadataConfiguration;
}
//
// 'license.*' options. These must be here rather than in
// ToolsConfiguration so they can be discovered when
// introspection is done on Configuration.class to discover the options.
//
private LicensesConfiguration licensesConfiguration;
public LicensesConfiguration getLicensesConfiguration()
{
return licensesConfiguration;
}
/**
* The RuntimeSharedLibraryPathItem Configuration contains
* options to modify runtime-shared-library-path options
* the user has already specified.
*/
private RuntimeSharedLibrarySettingsConfiguration rslSettingsConfiguration;
public RuntimeSharedLibrarySettingsConfiguration getRuntimeSharedLibrarySettingsConfiguration()
{
return rslSettingsConfiguration;
}
//
// 'raw-metadata' option
//
private String metadata = null;
public String getMetadata()
{
return (metadata == null)? getMetadataConfiguration().toString() : metadata;
}
public void cfgRawMetadata( ConfigurationValue cv, String xml )
throws ConfigurationException
{
if (metadata != null)
{
throw new ConfigurationException.BadMetadataCombo( cv.getVar(), cv.getSource(), cv.getLine() );
}
this.metadata = xml;
}
public static ConfigurationInfo getRawMetadataInfo()
{
return new ConfigurationInfo( 1, "text" )
{
public boolean isAdvanced()
{
return true;
}
};
}
//
// 'resource-bundle-list' option
//
private String rbListFileName = null;
public String getRBListFileName()
{
return rbListFileName;
}
public boolean generateRBList()
{
return rbListFileName != null;
}
public void cfgResourceBundleList( ConfigurationValue cv, String filename )
{
this.rbListFileName = getOutputPath(cv, filename);
}
public static ConfigurationInfo getResourceBundleListInfo()
{
return new ConfigurationInfo(new String[] {"filename"})
{
public boolean isAdvanced()
{
return true;
}
};
}
//
// 'resource-shared-libraries' option
//
private List<String> rslList = new LinkedList<String>();
public List<String> getRuntimeSharedLibraries()
{
return rslList;
}
public void cfgRuntimeSharedLibraries( ConfigurationValue cfgval, String[] urls ) throws ConfigurationException
{
for (int i = 0; i < urls.length; ++i)
{
// can't really validate these easily...
rslList.add( urls[i] );
}
}
public static ConfigurationInfo getRuntimeSharedLibrariesInfo()
{
return new ConfigurationInfo( -1, new String[] { "url" } )
{
public boolean allowMultiple()
{
return true;
}
};
}
//
// 'use-network' option
//
private boolean useNetwork;
public boolean useNetwork()
{
return useNetwork;
}
public void cfgUseNetwork( ConfigurationValue cv, boolean b)
{
this.useNetwork = b;
}
//
// 'broker-local-connection' option
//
private boolean brokerLocalConnection;
public boolean brokerLocalConnection()
{
return brokerLocalConnection;
}
public void cfgBrokerLocalConnection( ConfigurationValue cv, boolean b)
{
this.brokerLocalConnection = b;
}
//
// 'broker-product-manager' option
//
private boolean brokerProductManager;
public boolean brokerProductManager()
{
return brokerProductManager;
}
public void cfgBrokerProductManager( ConfigurationValue cv, boolean b)
{
this.brokerProductManager = b;
}
/**
* Capture the information in one argument specifing -runtime-shared-libraries-path
* information.
*/
public class RslPathInfo
{
/**
* The extension given to a signed RLS that is assumed to be signed.
* Unsigned RSLs should use the standard "swf" extension.
*/
public static final String SIGNED_RSL_URL_EXTENSION = "swz";
public static final String SIGNED_RSL_URL_DOT_EXTENSION = "." + SIGNED_RSL_URL_EXTENSION;
// path to swc to link against, this is logically added
// -external-library-path option
private String swcPath;
private VirtualFile swcVf; // the swc's virtual file
// rsls in the order to load. The first if the primary rsl, the
// others are failover rsls.
private List<String> rslUrls;
// policy file urls, optional. The first in the list if applies to the
// first rsl in _rslUrls. The second in the list applies to the second
// in _rslUrls and so on. If there are more policy file urls than rsl
// urls,
// then display a warning.
private List<String> policyFileUrls;
//
// List of type Boolean. Entry i in this list tells if entry i in the list
// given by getRslUrls() is targeting a signed or unsigned rsl.
//
private List<Boolean> isSignedList;
/**
* Create a new cross-domain RSL entry. The info specified the swc file to
* exclude put a list of RSL urls and policy file urls. The first RSL url/policy
* file url pair are the primary urls. The remaining urls are failovers and are
* only used if the primary RSL fails to load.
*
*/
public RslPathInfo()
{
rslUrls = new ArrayList<String>();
}
/**
* Test is the url is signed.
*
* @param url url to test, the file specified by the url does not
* need to exist.
* @return true if the url specifies a signed rsl, false otherwise.
*/
public boolean isRslUrlSigned(String url) {
if (url == null) {
return false;
}
return url.endsWith(SIGNED_RSL_URL_DOT_EXTENSION);
}
/**
* Set the path to the swc.
*
* @param swcPath
*/
public void setSwcPath(String swcPath)
{
this.swcPath = swcPath;
}
/**
*
* @return the path to the swc
*/
public String getSwcPath()
{
return swcPath;
}
/**
* Set the virtual file associated with the swc path.
*
* @param vf
*/
public void setSwcVf(VirtualFile vf)
{
swcVf = vf;
}
/**
*
* @return
*/
public VirtualFile getSwcVirtualFile() {
return swcVf;
}
/**
* Add an RSL to the list of RSLs.
*
* @param url url of the RSL, may not be null
*/
public void addRslUrl(String url)
{
if (url == null) {
throw new NullPointerException("url may not be null"); // $NON-NLS-1$
}
rslUrls.add(url);
addSignedFlag(isRslUrlSigned(url));
}
/**
*
* @return List of urls to RSLs. Each entry in the list is of type <code>String</code>.
*/
public List<String> getRslUrls()
{
return rslUrls;
}
/**
* Add a policy file to support the associated entry in the RSL URL list. Policy file
* entries my be empty, but must be specified.
* @param url url of the policy file.
*/
public void addPolicyFileUrl(String url)
{
if (policyFileUrls == null)
{
policyFileUrls = new ArrayList<String>();
}
policyFileUrls.add(url == null ? "" : url); // $NON-NLS-1$
}
/**
* Get the list of policy files.
*
* @return Listof policy file urls. Each entry in the list of type <code>String</code>
*/
public List<String> getPolicyFileUrls()
{
return policyFileUrls == null ? Collections.<String>emptyList() : policyFileUrls;
}
/**
* Return a list of booleans that indicate if an RSL URL is signed or unsigned. There is a matching entry
* is this list for every entry in the RSL URL list.
*
* @return List of boolean signed flags for the RSL URL list. Each entry in the list is
* of type <code>Boolean</code>.
*/
public List<Boolean> getSignedFlags() {
return isSignedList;
}
/**
* Add a signed flag to the list of flags. This flag is determines if the RSL URL
* associated with this entry is considered signed or unsigned.
*
* @param isSigned true if the RSL URL is signed.
*/
private void addSignedFlag(boolean isSigned) {
if (isSignedList == null) {
isSignedList = new ArrayList<Boolean>();
}
isSignedList.add(Boolean.valueOf(isSigned));
}
}
private List<RslPathInfo> rslPathInfoList; // list of CdRslInfo objects
private Set<String> loadedRsls; // swc location of the rsls that will be loaded
/**
* @return List of of all the -runtime-shared-libraries-path options.
* Each-runtime-shared-libraries-path option supplied results in
* a RslPathInfo object.
* Each object in the list is of type RslPathInfo.
* The list will be empty if -static-link-runtime-shared-libraries=true.
*/
public List<RslPathInfo> getRslPathInfo() {
return rslPathInfoList == null ? Collections.<RslPathInfo>emptyList() : rslPathInfoList;
}
public VirtualFile[] getRslExcludedLibraries() {
if (rslPathInfoList == null || getStaticLinkRsl()) {
return new VirtualFile[0];
}
List<VirtualFile> libraries = new ArrayList<VirtualFile>();
for (Iterator<RslPathInfo> iter = rslPathInfoList.iterator(); iter.hasNext();)
{
RslPathInfo info = iter.next();
libraries.add(info.getSwcVirtualFile());
}
return libraries.toArray(new VirtualFile[0]);
}
public void cfgRuntimeSharedLibraryPath(ConfigurationValue cfgval,
String[] urls) throws ConfigurationException
{
if (urls.length == 0) {
return; // ignore option
}
// Usage rule: if you use -rslp on the command line
// it will take effect unless you also specify -static-rsls=true on the command line.
if (CommandLineConfigurator.SOURCE_COMMAND_LINE.equals(cfgval.getSource())) {
setOverrideStaticLinkRsl(false);
}
// ignore rsl if told to
if (getStaticLinkRsl()) {
return;
}
if (urls.length < 2)
{
// insufficent arguments
throw new ConfigurationException.MissingArgument("rsl-url",
"runtime-shared-library-path", cfgval.getSource(),
cfgval.getLine());
}
RslPathInfo info = new RslPathInfo();
// validate the first argument, the swc or open directory, required.
VirtualFile include = ConfigurationPathResolver.getVirtualFile(urls[0],
configResolver,
cfgval );
info.setSwcPath(urls[0]);
info.setSwcVf(include);
// the rest of the args are: rsl-url, policy-file-url, rsl-url, policy-file-url,...
for (int i = 1; i < urls.length; ++i)
{
if ((i + 1) % 2 == 0)
{
if (urls[i].length() == 0) {
// rsl urls is required
throw new ConfigurationException.MissingArgument("rsl-url",
"runtime-shared-library-path", cfgval.getSource(),
cfgval.getLine());
}
info.addRslUrl(urls[i]);
}
else {
info.addPolicyFileUrl(urls[i]);
}
}
// if the last policy file was not specified, then add an empty one so
// there are always the same number of rsls and policy files.
if ((urls.length % 2) == 0) {
info.addPolicyFileUrl(""); // $NON-NLS-1$
}
// take local variables and add to overall arguments.
if (rslPathInfoList == null)
{
rslPathInfoList = new ArrayList<RslPathInfo>();
}
rslPathInfoList.add(info);
}
public static ConfigurationInfo getRuntimeSharedLibraryPathInfo()
{
return new ConfigurationInfo()
{
public boolean allowMultiple()
{
return true;
}
public String[] getSoftPrerequisites()
{
return new String[] {"static-link-runtime-shared-libraries"};
}
public String getArgName(int argnum)
{
String argName = null;
if (argnum == 0)
{
argName = "path-element";
}
else
{
argnum = (argnum + 1) % 2;
if (argnum == 0)
{
argName = "rsl-url";
}
else
{
argName = "policy-file-url";
}
}
return argName;
}
public boolean doChecksum()
{
return false;
}
};
}
//
// 'static-link-runtime-shared-libraries' option
//
private boolean staticLinkRsl = true;
private String staticLinkRslSource;
/**
*
* @return true if -cd-rsl option should be used. False otherwise.
*/
public boolean getStaticLinkRsl()
{
return staticLinkRsl;
}
/**
* Allow another option, namely -rslp to override the value of
* static-rsls. But you can not override a -static-rsls option that came from the command line.
*
* @param staticLinkRsl
*/
protected void setOverrideStaticLinkRsl(boolean staticLinkRsl)
{
if (CommandLineConfigurator.SOURCE_COMMAND_LINE.equals(staticLinkRslSource))
{
return;
}
this.staticLinkRsl = staticLinkRsl;
}
/**
*
* @param cv
* @param b
*/
public void cfgStaticLinkRuntimeSharedLibraries(ConfigurationValue cv, boolean b)
{
staticLinkRsl = b;
staticLinkRslSource = cv.getSource();
}
//
// 'verify-digests' options
//
private boolean verifyDigests = true;
/**
*
* @return true if digest information associated with the
* -cd-rsl option is used by the application at runtime. False otherwise.
*/
public boolean getVerifyDigests()
{
return verifyDigests;
}
/**
*
* @param cv
* @param b
*/
public void cfgVerifyDigests(ConfigurationValue cv, boolean b)
{
verifyDigests = b;
}
public static ConfigurationInfo getVerifyDigestsInfo()
{
return new AdvancedConfigurationInfo();
}
//
// 'remove-unused-rsls' option
//
private boolean removeUnusedRSLs = true;
/**
*
* @return true if the user wants to remove unused RSLs. Otherwise false.
*/
public boolean getRemoveUnusedRsls()
{
return removeUnusedRSLs;
}
/**
*
* @param cv
* @param b
*/
public void cfgRemoveUnusedRsls(ConfigurationValue cv, boolean b)
{
removeUnusedRSLs = b;
}
public static ConfigurationInfo getRemoveUnusedRslsInfo()
{
return new AdvancedConfigurationInfo();
}
//
// '-include-inheritance-dependencies-only' option
//
private boolean includeInheritanceDependenciesOnly = false;
/**
*
* @return true if the user want to include inheritance dependencies only.
*/
public boolean getIncludeInheritanceDependenciesOnly()
{
return includeInheritanceDependenciesOnly;
}
/**
*
* @param cv
* @param b
*/
public void cfgIncludeInheritanceDependenciesOnly(ConfigurationValue cv, boolean b)
{
includeInheritanceDependenciesOnly = b;
}
public static ConfigurationInfo getIncludeInheritanceDependenciesOnlyInfo()
{
return new AdvancedConfigurationInfo();
}
//
// 'target-player' option
//
/**
* Returns the correct macromedia.asc.embedding.avmplus.Features.TARGET_AVM*
* for the current target player.
*
* @see macromedia.asc.util.ContextStatics.getTargetAVM()
*/
public int getTargetPlayerTargetAVM()
{
return getTargetPlayerTargetAVM(getTargetPlayerMajorVersion());
}
/**
* Returns the correct macromedia.asc.embedding.avmplus.Features.TARGET_AVM*
* for the given target player major revision (e.g. 10).
*
* @see macromedia.asc.util.ContextStatics.getTargetAVM()
*/
public static int getTargetPlayerTargetAVM(int targetPlayerMajorVersion)
{
return ContextStatics.getTargetAVM(targetPlayerMajorVersion);
}
/**
* Returns an ObjectList filled with the correct namespaces that need to be
* automagically opened for the current target player, e.g. flash10.
*
* @see macromedia.asc.util.ContextStatics.use_namespaces
*/
public ObjectList<String> getTargetPlayerRequiredUseNamespaces()
{
return getTargetPlayerRequiredUseNamespaces(getTargetPlayerMajorVersion());
}
/**
* Returns an ObjectList filled with the correct namespaces that need to be
* automagically opened for the current target player, e.g. flash10.
*
* @see macromedia.asc.util.ContextStatics.use_namespaces
*/
public static ObjectList<String> getTargetPlayerRequiredUseNamespaces(int targetPlayerMajorVersion)
{
return ContextStatics.getRequiredUseNamespaces(targetPlayerMajorVersion);
}
// targeted player version (also set in DefaultsConfigurator)
private int majorVersionTarget = 11;
private int minorVersionTarget = 1;
private int revisionTarget = 0;
/**
*
* @return The major version of the player targeted by this application.
* The returned value will be greater to or equal to 9.
*/
public int getTargetPlayerMajorVersion()
{
return majorVersionTarget;
}
/**
*
* @return The minor version of the player targeted by this application.
* The returned value will be greater to or equal to 0.
*/
public int getTargetPlayerMinorVersion()
{
return minorVersionTarget;
}
/**
*
* @return The revision of the player targeted by this application.
* The returned value will be greater to or equal to 0.
*/
public int getTargetPlayerRevision()
{
return revisionTarget;
}
/**
*
* @param cv
* @param b
*/
public void cfgTargetPlayer(ConfigurationValue cv, String version)
throws ConfigurationException
{
if (version == null)
{
return;
}
String[] results = version.split("\\.");
if (results.length == 0)
{
throw new ConfigurationException.BadVersion(version, "target-player");
}
for (int i = 0; i < results.length; i++)
{
int versionNum = 0;
try
{
versionNum = Integer.parseInt(results[i]);
}
catch (NumberFormatException e)
{
throw new ConfigurationException.BadVersion(version, "target-player");
}
if (i == 0)
{
if (versionNum >= 9)
{
this.majorVersionTarget = versionNum;
}
else
{
throw new ConfigurationException.BadVersion(version, "target-player");
}
}
else
{
if (versionNum >= 0)
{
if (i == 1)
{
this.minorVersionTarget = versionNum;
}
else
{
this.revisionTarget = versionNum;
}
}
else
{
throw new ConfigurationException.BadVersion(version, "target-player");
}
}
}
}
public static ConfigurationInfo getTargetPlayerInfo()
{
return new ConfigurationInfo(new String[] {"version"});
}
//
// 'swf-version' option
//
private int swfVersion = 14;
public int getSwfVersion()
{
assert swfVersion > 0;
return swfVersion;
}
public void setSwfVersion(final int version)
{
assert version > 0;
swfVersion = version;
}
public void cfgSwfVersion(ConfigurationValue cv, int version)
{
setSwfVersion(version);
}
public boolean getComputeDigest()
{
throw new InternalError("compute-digest");
}
//
// 'use-direct-blit' option
//
private boolean useDirectBlit = false;
public boolean getUseDirectBlit()
{
return useDirectBlit;
}
public void setUseDirectBlit(boolean value)
{
useDirectBlit = value;
}
public void cfgUseDirectBlit(ConfigurationValue cv, boolean value)
{
setUseDirectBlit(value);
}
//
// 'use-gpu' option
//
private boolean useGpu = false;
public boolean getUseGpu()
{
return useGpu;
}
public void setUseGpu(boolean value)
{
useGpu = value;
}
public void cfgUseGpu(ConfigurationValue cv, boolean value)
{
setUseGpu(value);
}
//
// 'swc-checksum' options
//
private boolean swcChecksumEnabled = true;
/**
*
* @return true if optimization using signature checksums are enabled.
*/
public boolean isSwcChecksumEnabled()
{
return swcChecksumEnabled;
}
/**
*
* @param cv
* @param b
*/
public void cfgSwcChecksum(ConfigurationValue cv, boolean b)
{
swcChecksumEnabled = b;
}
public static ConfigurationInfo getSwcChecksumInfo()
{
return new ConfigurationInfo() {
public boolean isHidden()
{
return true;
}
public boolean doChecksum()
{
return false;
}
};
}
// cssArchiveFiles and l10nArchiveFiles
private Map<String, VirtualFile> cssArchiveFiles;
private Map<String, VirtualFile> l10nArchiveFiles;
public void addCSSArchiveFiles(Map<String, VirtualFile> m)
{
if (cssArchiveFiles == null)
{
cssArchiveFiles = new HashMap<String, VirtualFile>();
}
cssArchiveFiles.putAll(m);
}
public Map<String, VirtualFile> getCSSArchiveFiles()
{
return cssArchiveFiles;
}
public void addL10nArchiveFiles(Map<String, VirtualFile> m)
{
if (l10nArchiveFiles == null)
{
l10nArchiveFiles = new HashMap<String, VirtualFile>();
}
l10nArchiveFiles.putAll(m);
}
public Map<String, VirtualFile> getL10NArchiveFiles()
{
return l10nArchiveFiles;
}
/**
* The compatibility version specified in the configuration.
*/
public String getCompatibilityVersionString()
{
return compilerConfiguration.getCompatibilityVersionString();
}
public int getCompatibilityVersion()
{
return compilerConfiguration.getCompatibilityVersion();
}
/**
* The minimum supported library version specified in the configuration.
*/
public String getMinimumSupportedVersionString()
{
return compilerConfiguration.getMinimumSupportedVersionString();
}
public int getMinimumSupportedVersion()
{
return compilerConfiguration.getMinimumSupportedVersion();
}
public boolean getQualifiedTypeSelectors()
{
return compilerConfiguration.getQualifiedTypeSelectors();
}
/**
* Configures the LocalizationManager's locale, which is used when
* reporting compile time errors, warnings, and info.
*
* @param toolsLocale A locale in Java format. For example, "en" or "ja_JP".
* @throws ConfigurationException When the specified toolsLocale is
* not available a ToolsLocaleNotAvailable error is reported.
*/
public void cfgToolsLocale(ConfigurationValue cv, String toolsLocale)
throws ConfigurationException
{
Locale[] locales = Locale.getAvailableLocales();
for (int i = 0; i < locales.length; i++)
{
if (locales[i].toString().equals(toolsLocale))
{
LocalizationManager localizationManager = ThreadLocalToolkit.getLocalizationManager();
if (localizationManager != null)
{
localizationManager.setLocale(locales[i]);
}
else
{
assert false : "LocalizationManager not setup yet.";
}
return;
}
}
throw new ConfigurationException.ToolsLocaleNotAvailable(cv.getVar(),
cv.getSource(),
cv.getLine() );
}
public void setAdvancedTelemetry(boolean enableTelemetry)
{
compilerConfiguration.setAdvancedTelemetry(enableTelemetry);
}
public boolean getAdvancedTelemetry()
{
return compilerConfiguration.getAdvancedTelemetry();
}
@Override
public Configuration clone()
throws CloneNotSupportedException
{
Configuration cloneConfig = (Configuration) super.clone();
CompilerConfiguration cloneCompilerConfiguration = (CompilerConfiguration) this.compilerConfiguration.clone();
cloneConfig.compilerConfiguration = cloneCompilerConfiguration;
return cloneConfig;
}
}