/* * * 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 java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import flex2.compiler.config.ConfigurationException; import flex2.compiler.config.ConfigurationInfo; import flex2.compiler.config.ConfigurationValue; import flex2.compiler.io.VirtualFile; /** * Configuration options association with the * runtime-shared-library-path option. * * @author dloverin * */ public class RuntimeSharedLibrarySettingsConfiguration { private Configuration configuration; public RuntimeSharedLibrarySettingsConfiguration(Configuration configuration) { this.configuration = configuration; } protected ConfigurationPathResolver configResolver; public void setConfigPathResolver( ConfigurationPathResolver resolver ) { this.configResolver = resolver; } // // 'force-rsl' option // private Set<VirtualFile> forceRsls; /** * Get the array of SWCs that should have their RSLs loaded, even if * the compiler detects no classes being used from the SWC. * @return Array of SWCs that should have their RSLs loaded. */ public VirtualFile[] getForceRsls() { if (forceRsls == null) { return new VirtualFile[0]; } return forceRsls.toArray(new VirtualFile[0]); } /** * Get the SWCs that are forced to load RSLs as a set of paths. * * @return a set of SWC paths. */ public Set<String> getForceRslsPaths() { if (forceRsls == null) { return Collections.emptySet(); } Set<String> rslPaths = new HashSet<String>(); for (VirtualFile file : forceRsls) { rslPaths.add(file.getName()); } return rslPaths; } public void cfgForceRsls(ConfigurationValue cfgval, String[] args) throws ConfigurationException { // ignore the force option if we are static linking if (configuration.getStaticLinkRsl()) return; if (forceRsls == null) { forceRsls = new HashSet<VirtualFile>(); } // Add swc to the forceRsls set. for (String arg : args) { // path-element parameter (swc) // verify path exists and the swc has an // existing -rslp option specified. VirtualFile swcFile = ConfigurationPathResolver.getVirtualFile(arg, configResolver, cfgval); String swcPath = swcFile.getName(); // verify the swc is used in an the RSL configuration. if (!doesSwcHaveRSLInfo(swcPath)) { throw new ConfigurationException.SwcDoesNotHaveRslData(swcPath, cfgval.getVar(), cfgval.getSource(), cfgval.getLine()); } forceRsls.add(swcFile); } } public static ConfigurationInfo getForceRslsInfo() { return new ConfigurationInfo(-1, new String[] {"path-element"}) { public boolean allowMultiple() { return true; } public boolean isAdvanced() { return true; } }; } // // 'application-domain' option // /** * Enum of the supported application domain targets of an RSL. The string * values represent the valid values that may specified for the * application-domain option. */ public static enum ApplicationDomainTarget { DEFAULT("default"), CURRENT("current"), PARENT("parent"), TOP_LEVEL("top-level"); private String applicationDomainValue; private ApplicationDomainTarget( String applicationDomainValue ) { this.applicationDomainValue = applicationDomainValue; } public String getApplicationDomainValue() { return applicationDomainValue; } } /* * Key: swc file path; Value: application domain */ private HashMap<VirtualFile,String> applicationDomains; /** * Get the application domain an RSL should be loaded into. The default is * the current application domain but the user can override this setting. * @param swcPath The full path of the swc file. * * @return The application domain the RSL should be loaded into. If the * swc is not found, then 'default' is returned. */ public String getApplicationDomain(String swcPath) { if (applicationDomains == null || swcPath == null) { return ApplicationDomainTarget.DEFAULT.applicationDomainValue; } for (Map.Entry<VirtualFile, String> entry : applicationDomains.entrySet()) { VirtualFile swcFile = entry.getKey(); if (swcFile.getName().equals(swcPath)) { return entry.getValue(); } } return ApplicationDomainTarget.DEFAULT.applicationDomainValue; } /** * Get the HashMap of any applicationDomain overrides for RSL loading. * * @return Map, key: SWC file path, value: on of application domain strings. */ public Map<VirtualFile,String> getApplicationDomains() { if (applicationDomains == null) { return Collections.emptyMap(); } return applicationDomains; } public void cfgApplicationDomain(ConfigurationValue cfgval, String[] args) throws ConfigurationException { // ignore the force option if we are static linking if (configuration.getStaticLinkRsl()) return; if (applicationDomains == null) { applicationDomains = new HashMap<VirtualFile,String>(); } // Add swc and application domain target to the map. // The args are: swc file path, application domain type, ... for (int i = 0; i < args.length; i++) { String arg = args[i++]; // path-element parameter (swc) // verify path exists and the swc has an // existing -rslp option specified. VirtualFile swcFile = ConfigurationPathResolver.getVirtualFile(arg, configResolver, cfgval); String swcPath = swcFile.getName(); // verify the swc is used in an the RSL configuration. if (!doesSwcHaveRSLInfo(swcPath)) { throw new ConfigurationException.SwcDoesNotHaveRslData(swcPath, cfgval.getVar(), cfgval.getSource(), cfgval.getLine()); } // Verify the application domain target is valid. arg = args[i]; if (!isValidApplicationDomainTarget(arg)) { // throw a configuration exception that the application domain // type is incorrect. throw new ConfigurationException.BadApplicationDomainValue(swcPath, arg, cfgval.getVar(), cfgval.getSource(), cfgval.getLine()); } applicationDomains.put(swcFile, arg); } } public static ConfigurationInfo getApplicationDomainInfo() { return new ConfigurationInfo(-1, new String[] {"path-element", "application-domain-target"}) { public boolean allowMultiple() { return true; } public boolean isAdvanced() { return true; } public String getArgName(int argnum) { String argName = null; argnum = argnum % 2; if (argnum == 0) { argName = "path-element"; } else { argName = "application-domain-target"; } return argName; } }; } /** * Check if the SWC has any RSL info associated with it. * @param swcPath * @return true if the swc has RSL info, false otherwise. */ private boolean doesSwcHaveRSLInfo(String swcPath) { if (swcPath == null) return false; List<Configuration.RslPathInfo> rslInfoList = configuration.getRslPathInfo(); for (Configuration.RslPathInfo rslInfo : rslInfoList) { if (swcPath.equals(rslInfo.getSwcVirtualFile().getName())) return true; } return false; } /** * Test if the specified parameter is a valid application domain type. * @param arg * @return true if parameter is a valid application domain type, false otherwise. */ private boolean isValidApplicationDomainTarget(String arg) { for (ApplicationDomainTarget appDomain : ApplicationDomainTarget.values()) { if (appDomain.applicationDomainValue.equals(arg)) return true; } return false; } }