/*
*
* 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.flex.compiler.internal.projects;
import static org.apache.flex.abc.ABCConstants.CONSTANT_PackageNs;
import static org.apache.flex.abc.ABCConstants.CONSTANT_Qname;
import java.util.HashMap;
import java.util.Map;
import org.apache.flex.abc.semantics.Name;
import org.apache.flex.abc.semantics.Namespace;
import org.apache.flex.abc.semantics.Nsset;
import org.apache.flex.compiler.config.Configuration;
import org.apache.flex.compiler.internal.as.codegen.BindableHelper;
import org.apache.flex.compiler.internal.definitions.ClassDefinition;
import org.apache.flex.compiler.internal.embedding.transcoders.DataTranscoder;
import org.apache.flex.compiler.mxml.IMXMLTypeConstants;
/**
* This class applies configuration settings to a FlexProject.
* Currently the settings are hard-coded
* and only applied when the project is originally created.
* Eventually they will come from flex-config.xml
* and this class will support updating with new configuration values.
*/
public class FlexProjectConfigurator
{
/**
* These imports will eventually come from flex-config.xml.
* <p>
* Note taht we include AIR-specific imports even for non-AIR projects.
* This does not cause compiler warnings about unknown imports
* in non-AIR projects because the implicit imports don't get
* semantically checked.
* The AIR imports don't increase SWF size if they don't get used
* because the new compiler resolves multinames down to qnames.
*/
private static final String[] IMPLICIT_IMPORTS_FOR_MXML = new String[]
{
"flash.accessibility.*",
"flash.data.*", // needed only for AIR
"flash.debugger.*",
"flash.desktop.*", // needed only for AIR
"flash.display.*",
"flash.errors.*",
"flash.events.*",
"flash.external.*",
"flash.filesystem.*", // needed only for AIR
"flash.geom.*",
"flash.html.*", // needed only for AIR
"flash.html.script.*", // needed only for AIR
"flash.media.*",
"flash.net.*",
"flash.printing.*",
"flash.profiler.*",
"flash.system.*",
"flash.text.*",
"flash.ui.*",
"flash.utils.*",
"flash.xml.*",
"mx.binding.*",
"mx.core.ClassFactory",
"mx.core.DeferredInstanceFromClass",
"mx.core.DeferredInstanceFromFunction",
"mx.core.IDeferredInstance",
"mx.core.IFactory",
"mx.core.IFlexModuleFactory",
"mx.core.IPropertyChangeNotifier",
"mx.core.mx_internal",
"mx.styles.*"
};
private static final Map<String, Integer> NAMED_COLORS = new HashMap<String, Integer>();
static
{
NAMED_COLORS.put("aqua", 0x00FFFF);
NAMED_COLORS.put("black", 0x000000);
NAMED_COLORS.put("blue", 0x0000FF);
NAMED_COLORS.put("cyan", 0x00FFFF); // nonstandard
NAMED_COLORS.put("fuchsia", 0xFF00FF);
NAMED_COLORS.put("gray", 0x808080);
NAMED_COLORS.put("green", 0x008000);
NAMED_COLORS.put("lime", 0x00FF00);
NAMED_COLORS.put("magenta", 0xFF00FF); // nonstandard
NAMED_COLORS.put("maroon", 0x800000);
NAMED_COLORS.put("navy", 0x000080);
NAMED_COLORS.put("olive", 0x808000);
NAMED_COLORS.put("purple", 0x800080);
NAMED_COLORS.put("red", 0xFF0000);
NAMED_COLORS.put("silver", 0xC0C0C0);
NAMED_COLORS.put("teal", 0x008080);
NAMED_COLORS.put("white", 0xFFFFFF);
NAMED_COLORS.put("yellow", 0xFFFF00);
NAMED_COLORS.put("haloBlue", 0x009DFF);
NAMED_COLORS.put("haloGreen", 0x80FF4D);
NAMED_COLORS.put("haloOrange", 0xFFB600);
NAMED_COLORS.put("haloSilver", 0xAECAD9);
}
public static void configure(FlexProject project)
{
configure(project, null);
}
public static void configure(FlexProject project, Configuration configuration)
{
String[] imports = null;
if (configuration != null)
imports = configuration.getCompilerMxmlImplicitImports();
if (imports == null)
imports = IMPLICIT_IMPORTS_FOR_MXML;
project.setImplicitImportsForMXML(imports);
// Set the qualified names of various runtime types
// that the compiler needs to know about.
// They will also eventually come from flex-config.xml.
project.setComponentTagType(IMXMLTypeConstants.IFactory);
project.setStateClass(IMXMLTypeConstants.State);
project.setStateClientInterface(IMXMLTypeConstants.StateClient);
project.setInstanceOverrideClass(IMXMLTypeConstants.AddItems);
project.setPropertyOverrideClass(IMXMLTypeConstants.SetProperty);
project.setStyleOverrideClass(IMXMLTypeConstants.SetStyle);
project.setEventOverrideClass(IMXMLTypeConstants.SetEventHandler);
project.setDeferredInstanceInterface(IMXMLTypeConstants.IDeferredInstance);
project.setTransientDeferredInstanceInterface(IMXMLTypeConstants.ITransientDeferredInstance);
project.setDeferredInstanceFromClassClass(IMXMLTypeConstants.DeferredInstanceFromClass);
project.setDeferredInstanceFromFunctionClass(IMXMLTypeConstants.DeferredInstanceFromFunction);
project.setFactoryInterface(IMXMLTypeConstants.IFactory);
project.setClassFactoryClass(IMXMLTypeConstants.ClassFactory);
project.setMXMLObjectInterface(IMXMLTypeConstants.IMXMLObject);
project.setContainerInterface(IMXMLTypeConstants.IContainer);
project.setVisualElementContainerInterface(IMXMLTypeConstants.IVisualElementContainer);
project.setResourceBundleClass(IMXMLTypeConstants.ResourceBundle);
project.setResourceManagerClass(IMXMLTypeConstants.ResourceManager);
project.setResourceModuleBaseClass(IMXMLTypeConstants.ResourceModuleBase);
project.setBindingManagerClass(IMXMLTypeConstants.BindingManager);
project.setCSSStyleDeclarationClass(IMXMLTypeConstants.CSSStyleDeclaration);
project.setFlexModuleInterface(IMXMLTypeConstants.IFlexModule);
project.setDeferredInstantiationUIComponentInterface(IMXMLTypeConstants.IDeferredInstantiationUIComponent);
project.setXMLUtilClass(IMXMLTypeConstants.XMLUtil);
project.setUIComponentDescriptorClass(IMXMLTypeConstants.UIComponentDescriptor);
project.setModelClass(IMXMLTypeConstants.ObjectProxy);
project.setBindingClass(IMXMLTypeConstants.Binding);
project.setPropertyWatcherClass(IMXMLTypeConstants.PropertyWatcher);
project.setObjectProxyClass(IMXMLTypeConstants.ObjectProxy);
project.setStaticPropertyWatcherClass(IMXMLTypeConstants.StaticPropertyWatcher);
project.setFunctionReturnWatcherClass(IMXMLTypeConstants.FunctionReturnWatcher);
project.setXMLWatcherClass(IMXMLTypeConstants.XMLWatcherClass);
project.setWebServiceClass(IMXMLTypeConstants.WebService);
project.setWebServiceOperationClass(IMXMLTypeConstants.WebServiceOperation);
project.setRemoteObjectClass(IMXMLTypeConstants.RemoteObject);
project.setRemoteObjectMethodClass(IMXMLTypeConstants.RemoteObjectOperation);
project.setHTTPServiceClass(IMXMLTypeConstants.HTTPService);
project.setDesignLayerClass(IMXMLTypeConstants.DesignLayer);
project.setRepeaterClass(IMXMLTypeConstants.Repeater);
project.setNamedColors(NAMED_COLORS);
if (configuration != null)
{
String configValue = configuration.getBindingEventHandlerEvent();
ClassDefinition.Event = configValue;
int dotIndex;
dotIndex = configValue.lastIndexOf(".");
String packageName = configValue.substring(0, dotIndex);
String className = configValue.substring(dotIndex + 1);
BindableHelper.NAME_EVENT = new Name(CONSTANT_Qname, new Nsset(new Namespace(CONSTANT_PackageNs, packageName)), className);
BindableHelper.STRING_EVENT = configValue;
configValue = configuration.getBindingEventHandlerClass();
dotIndex = configValue.lastIndexOf(".");
packageName = configValue.substring(0, dotIndex);
className = configValue.substring(dotIndex + 1);
BindableHelper.NAME_EVENT_DISPATCHER = new Name(CONSTANT_Qname, new Nsset(new Namespace(CONSTANT_PackageNs, packageName)), className);
BindableHelper.STRING_EVENT_DISPATCHER = configValue;
configValue = configuration.getBindingEventHandlerInterface();
dotIndex = configValue.lastIndexOf(".");
packageName = configValue.substring(0, dotIndex);
className = configValue.substring(dotIndex + 1);
BindableHelper.NAME_IEVENT_DISPATCHER = new Name(CONSTANT_Qname, new Nsset(new Namespace(CONSTANT_PackageNs, packageName)), className);
BindableHelper.STRING_IEVENT_DISPATCHER = configValue;
configValue = configuration.getBindingValueChangeEvent();
dotIndex = configValue.lastIndexOf(".");
packageName = configValue.substring(0, dotIndex);
className = configValue.substring(dotIndex + 1);
BindableHelper.NAME_PROPERTY_CHANGE_EVENT = new Name(CONSTANT_Qname, new Nsset(new Namespace(CONSTANT_PackageNs, packageName)), className);
BindableHelper.NAMESPACE_MX_EVENTS = new Namespace(CONSTANT_PackageNs, packageName);
BindableHelper.PROPERTY_CHANGE_EVENT = configValue;
configValue = configuration.getBindingValueChangeEventKind();
dotIndex = configValue.lastIndexOf(".");
packageName = configValue.substring(0, dotIndex);
className = configValue.substring(dotIndex + 1);
BindableHelper.NAME_PROPERTY_CHANGE_EVENT_KIND = new Name(CONSTANT_Qname, new Nsset(new Namespace(CONSTANT_PackageNs, packageName)), className);
configValue = configuration.getBindingValueChangeEventType();
BindableHelper.PROPERTY_CHANGE = configValue;
configValue = configuration.getStatesClass();
project.setStateClass(configValue);
configValue = configuration.getStatesInstanceOverrideClass();
project.setInstanceOverrideClass(configValue);
configValue = configuration.getStatesPropertyOverrideClass();
project.setPropertyOverrideClass(configValue);
configValue = configuration.getStatesEventOverrideClass();
project.setEventOverrideClass(configValue);
configValue = configuration.getStatesStyleOverrideClass();
project.setStyleOverrideClass(configValue);
configValue = configuration.getComponentFactoryInterface();
project.setFactoryInterface(configValue);
configValue = configuration.getComponentFactoryClass();
project.setClassFactoryClass(configValue);
configValue = configuration.getProxyBaseClass();
project.setProxyBaseClass(configValue);
project.setStrictXML(configuration.isStrictXML());
DataTranscoder.embedClassName = configuration.getByteArrayEmbedClass();
}
}
}