the creation and use of 
_ControlBarStyle
and 
_PanelStyle
mixins
, which in turn lead
to an uninitialized 
titleBackgroundSkin
and, finally, a reference error in the panel’s
layoutChrome()
. All in all, there are two problems:
• RSLs are not quite reusable libraries. They are “under”-libraries that require boot-
strap support from the loading .swf.
• The bootstrap code generated by the Flex compiler fails to support classes that
your application (or module) is referencing dynamically.
Now that we’ve admitted the problems, the rest is technicality.
Bootstrapping Libraries As Applications
Step back a little and consider Flex library projects, or more specifically, library .swc
files. At the end of the day, when you link your application with the library, you link
it with the .swc, whether made from sources in a library project or obtained from a third
party.
If you recall, Figure 7-9 included the option “Automatically extract swf to deployment
path.” Being an option, it underscores the two missions of the SWC. The critical mis-
sion is to resolve the compile-time references for the application. The optional mission
is to begin autoextracting the RSL SWF.
Here comes the big idea: do not rely on the automatically extracted library SWF, be-
cause it’s incomplete, and do not trust the bootstrap from the application SWF, because
the application does not necessarily know about all library classes. Instead, purposely
create this knowing application yourself, merge it with the library classes, and give it
the same name as the SWF of the library that otherwise would have been autoextracted.
In other words, say “no” to autoextraction. Replace it with the custom compilation of
the library as a fully bootstrapped application. Doing so changes nothing in how the
main application gets compiled, but it no longer relies on bootstrap generation for the
main application. Copy the custom-compiled library into the deployment folder, and
when the main application loads the library (for instance, ComponentLibrary.swf), it
will not know that it is loading a self-sufficient, custom-compiled SWF instead of the
immature, autoextracted one.
Example 7-26 contains the example of the 
ComponentLibrary_Application
class that is
added to the library project to bootstrap the library. Notice the static reference to the
CustomPanel
: it is your responsibility to add such references as 
import com.farata.sam
ples.CustomPanel; CustomPanel;
to the body of the 
ComponentLibrary_Application
class whenever you add new components to the library. Importantly, all these references
stay encapsulated in the library itself. This library will not need outside help to guar-
antee the success of the dynamic calls.
Paying Tribute to Libraries s | | 357
Batch pdf to jpg converter - Convert PDF to JPEG images in C#.net, ASP.NET MVC, WinForms, WPF project
How to convert PDF to JPEG using C#.NET PDF to JPEG conversion / converter library control SDK
batch convert pdf to jpg; convert pdf to jpg 300 dpi
Batch pdf to jpg converter - VB.NET PDF Convert to Jpeg SDK: Convert PDF to JPEG images in vb.net, ASP.NET MVC, WinForms, WPF project
Online Tutorial for PDF to JPEG (JPG) Conversion in VB.NET Image Application
to jpeg; bulk pdf to jpg converter
Example 7-26. Example of bootstrapping the library as SimpleApplication to consolidate compiler-
generated and manual code in one SWF
// ComponentLibrary_Application.as
// Example of Library bootstrapped as SimpleApplication
package {
import mx.core.SimpleApplication;
public class ComponentLibrary_Application extends SimpleApplication {
import com.farata.samples.CustomPanel; CustomPanel;
public function ComponentLibrary_Application() {
// Custom library initialization code should go here
}
}
}
Example 7-27 contains the example of the ComponentLibrary_Bootstrap.mxml class
derived from the 
ComponentLibrary_Application
.
Example 7-27. MXML extension of the bootstrap to force MXML compiler into code generation
<?xml version="1.0" encoding="UTF-8"?>
<!-- ComponentLibrary_Bootstrap.mxml
By wrapping ComponentLibrary_Application into MXML tag, we
force Flex compiler to create all mixins required by the
library  classes  (in the generated bootstrap class)
-->
<ComponentLibrary_Application xmlns="*" />
This extra step up to MXML is required to trick the Flex compiler into generating its
own bootstrap class (the code of that class is shown in Example 7-30). Finally, Exam-
ple 7-28 contains the example of the Ant script that can be used to compile the SWF
of the self-initializing library.
Example 7-28. Ant script that compiles ComponentLibrary_Bootstrap.mxml
<project name="Library-Application" default="compile" basedir="." >
<target name="compile">
in/sdks/3.2.0" />
<property name="swclibs" value="${sdkdir}/frameworks/libs"   />
<property name="library.name" value="ComponentLibrary" />
<exec executable="${sdkdir}/bin/mxmlc.exe" dir="${basedir}">
<arg line="-external-library-
path='${swclibs}/player/9/playerglobal.swc'"/>
<arg line="-keep-generated-actionscript=true "/>
<arg line="src/${application.name}.mxml"/>
<arg line="-output bin/${library.name}.swf"/>
</exec>
358 | | Chapter 7: Modules, Libraries, Applications, and Portals
JPEG to PDF Converter | Convert JPEG to PDF, Convert PDF to JPEG
Open JPEG to PDF Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "PDF" in "Output
batch convert pdf to jpg online; convert pdf to high quality jpg
JPG to GIF Converter | Convert JPEG to GIF, Convert GIF to JPG
Open JPEG to GIF Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "GIF" in "Output
convert pdf to jpg; change pdf to jpg
</target>
</project>
When you run this script in Flash Builder, you will see output similar to that of Exam-
ple 7-29.
Example 7-29. Output of the Ant script compiling library-bootstrapped-as-application
Buildfile: C:\workspaces\farata.samples\ComponentLibrary\build.xml
compile:
Plug-in\sdks\3.2.0\frameworks\flex-config.xml
(181812 bytes)
BUILD SUCCESSFUL
Total time: 5 seconds
Make sure you copy ComponentLibrary.swf into the output folder of your application
project and do not forget to turn off the autoextraction of the SWF, as shown in
Figure 7-12.
Figure 7-12. Autoextraction of the RSL SWF is turned off to avoid overwriting the custom-compiled
library
Congratulations! You just created a bulletproof Flex RSL. If you are a practitioner, your
job is complete. If you are a researcher, however, you may want to look at Exam-
ple 7-30, which is the bootstrap class generated by the Flex compiler in response to this
Ant-based compilation. Notice it contains yet another implementation of the 
IFlexMo
duleFactory
interface. In response to the base class being 
flex.core.SimpleApplica
tion
, the compiler generates a descendant of 
mx.core.FlexApplicationBootstrap
(as
opposed to 
mx.managers.SystemManager
, which is being generated in response to
mx.core.Application
). Upon the load of the library’s SWF, Flash will instantiate the
ComponentLibrary_Bootstrap_mx_core_FlexApplicationBootstrap
class. 
The
Paying Tribute to Libraries s | | 359
JPG to DICOM Converter | Convert JPEG to DICOM, Convert DICOM to
Open JPEG to DICOM Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "DICOM" in
change file from pdf to jpg; convert multiple pdf to jpg
JPG to JBIG2 Converter | Convert JPEG to JBIG2, Convert JBIG2 to
Open JPEG to JBIG2 Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "JBIG2" in
best program to convert pdf to jpg; pdf to jpeg
construction of the superclass results in calling the 
create()
method, which consumes
the return of the method 
info()
. This way, the library bootstrap is completely owned
and controlled by the library itself.
Example 7-30. Compiler-generated main class for the bootstrapped library
// Compiler-generated descendant of the FlexApplicationBootstrap
package
{
import flash.text.Font;
import flash.text.TextFormat;
import flash.system.ApplicationDomain;
import flash.utils.getDefinitionByName;
import mx.core.IFlexModule;
import mx.core.IFlexModuleFactory;
import mx.core.FlexApplicationBootstrap;
[ResourceBundle("containers")]
[ResourceBundle("core")]
[ResourceBundle("effects")]
[ResourceBundle("skins")]
[ResourceBundle("styles")]
extends mx.core.FlexApplicationBootstrap
implements IFlexModuleFactory
{
{
super();
}
override     public function create(... params):Object
{
if (params.length > 0 && !(params[0] is String))
return super.create.apply(this, params);
var mainClassName:String = params.length == 0 ?
"ComponentLibrary_Bootstrap" : String(params[0]);
if (!mainClass)
return null;
var instance:Object = new mainClass();
if (instance is IFlexModule)
(IFlexModule(instance)).moduleFactory = this;
return instance;
}
override    public function info():Object{
return {
compiledLocales: [ "en_US" ],
360 | | Chapter 7: Modules, Libraries, Applications, and Portals
JPG to JPEG2000 Converter | Convert JPEG to JPEG2000, Convert
Open JPEG to JPEG2000 Converter first; ad JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "JPEG2000" in
change pdf into jpg; convert pdf pages to jpg online
JPG to Word Converter | Convert JPEG to Word, Convert Word to JPG
Open JPEG to Word Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "Word" in
conversion pdf to jpg; convert pdf to 300 dpi jpg
currentDomain: ApplicationDomain.currentDomain,
mainClassName: "ComponentLibrary_Bootstrap",
mixins: [ "_ComponentLibrary_Bootstrap_FlexInit",
"_richTextEditorTextAreaStyleStyle",
"_ControlBarStyle",
"_dateFieldPopupStyle", "_dataGridStylesStyle", "_popUpMenuStyle",
"_headerDragProxyStyleStyle", "_activeTabStyleStyle", 
"_PanelStyle",
"_ContainerStyle", "_windowStatusStyle", "_ScrollBarStyle",
"_ButtonStyle", "_weekDayStyleStyle", "_linkButtonStyleStyle",
"_CustomPanelWatcherSetupUtil" ]
}
}
}
}
Read the blog post “Avoiding pitfalls of Flex RSL with Self Initialized
Libraries” for more information.
Sibling Domains and Multiversioning
By now, it should be clear that applications, modules, and libraries (albeit bootstrapped
as applications) are simply different forms of packaging .swf files. Libraries assume the
tightest coupling with the loading code, and that’s why they get preloaded (by the
application’s code generated by the Flex compiler). Modules get loaded and unloaded
on demand, because they are needed only conditionally and only temporarily. Appli-
cations are similar to modules, in that they get loaded and unloaded on demand. The
important advantage of applications over modules (as units of modularization) is that
applications are self-sufficient, which allows you to mix multiple application .swfs
compiled against different versions of the Flex framework (Flex 3.1, Flex 3.2, Flex 4.0,
and so on).
Let’s elaborate. As you already know, libraries get loaded into the same domain as the
application: 
ApplicationDomain.currentDomain
. Accordingly, to avoid conflicts, a li-
brary has to be compiled against the same version of the Flex framework as the enclosing
application. With modules, you get to choose between the same domain or a child
domain (
new ApplicationDomain(ApplicationDomain.currentDomain)
), but even in the
latter case, the class search starts with the parent domain. Again, to avoid conflicts,
modules have to be compiled against the same version of the Flex framework as the
consuming application. When it comes to applications, you still may use same-domain
Sibling Domains and Multiversioning g | 361
JPG to PNG Converter | Convert JPEG to PNG, Convert PNG to JPG
Open JPEG to PNG Converter first; Load JPG images from local folders in "File" in toolbar Windows Explorer; Select "Batch Conversion" & Choose "PNG" in "Output
change pdf to jpg online; change from pdf to jpg on
VB.NET Image: PDF to Image Converter, Convert Batch PDF Pages to
RasterEdge .NET Imaging PDF Converter makes it non-professional end users to convert PDF and PDF/A documents commonly in daily life (like tiff, jpg, png, bitmap
convert pdf to jpg 300 dpi; change pdf to jpg
or child-domain techniques, provided that the loading application and subapplication
are compiled against the same version of the Flex framework. What if you can’t re-
compile the Flex 3.2 subapplication and you want to load it from the Flex 4 main
application? Then you need to load into the domain that is the sibling of the main
application domain (
new ApplicationDomain(null)
).
Sibling domains allow ultimate separation of classes; you absolutely have to load the
sub into the sibling domain to support multiversioning. That said, you may want to
indiscriminately use sibling domains even when multiversioning is not an issue. A typ-
ical use case for this is portals, when you have to integrate portlets, perhaps developed
by a third party. In brief:
• If you can compile from sources, make modules and load them into the same do-
main or a child domain.
• If you are integrating compiled applications, use sibling domains.
To simplify the discussion, the following sections will use the term “portlet” instead of
the subapplication and “portal” instead of the loading application.
Four Scenarios of Loading Portlets
To load and unload a portlet, you have to use 
SWFLoader
(unless you are into writing
your own loader). As you remember, 
SWFLoader
is a wrapper around 
flash.dis
play.Loader
. As such, 
SWFLoader
exposes the 
loaderContext
property that controls the
application domain precisely, like it does it for 
Loader
. For instance, Example 7-31’s
MXML illustrates the loading of the RemoteApplication.swf portlet using the default
loaderContext
.
Example 7-31. Using SWFLoader with default LoaderContext
<mx:SWFLoader id="swfLoader"
source="http://localhost:8080/RemoteSite/RemoteApplication.swf"
/>
Identical results can be achieved by Example 7-32’s script.
Example 7-32. Using SWFLoader with explicit LoaderContext
private function loadApplication():void {
swfLoader.loaderContext = new LoaderContext(
false,
new ApplicationDomain(ApplicationDomain.currentDomain)
);
}
In both cases, the portlet’s classes get loaded in the child domain of the portal, according
to the default 
loaderContext
of a 
flash.display.Loader
. However, there is more to
loaderContext
than controlling the application domain.
362 | | Chapter 7: Modules, Libraries, Applications, and Portals
When a Flex application is loaded from a web domain, Flash Player, by default, assigns
it a security sandbox. Applications coming from the different web domains get assigned
different sandboxes. As an example, consider that the portal comes from http://local-
host and loads the portlet from http://127.0.0.1. Unless you deviate from the default
settings, these two applications will be assigned different sandboxes. Remember that
class definitions get loaded into application domains and that application domains
form a tree. There is one and only one tree per sandbox.
You can read more about sandboxes in the Flash documentation (Adobe often refers
to them as security domains as well), but a few important points should be noted here:
• You can indicate the sandbox preference in the constructor of the 
LoaderContext
.
For instance, Example 7-33’s code snippet results in loading classes into the current
security sandbox.
Example 7-33. Forced loading into the current sandbox
swfLoader.loaderContext = new LoaderContext(
false,
new ApplicationDomain(
ApplicationDomain.currentDomain
)
SecurityDomain.currentDomain
)
• Although you can easily load portlets from other web domains into the current
sandbox, there is no way you can programmatically load the portlet from the same
web domain into the different sandbox. In other words, you can admit strangers
into your family, but you can’t expel your kin. And the only way to load a portlet
into a different sandbox is to host it in a different web domain or subdomain.
• Assigning a different sandbox means a totally different tree of application domains.
To sum up, there are only four 
loaderContext
combinations that you can arrange either
programmatically or via hosting the portlet on the different subdomain:
• Different Sandbox Different Domain (DSDD)
• Same Sandbox Different (sibling) Domain (SSDD)
• Same Sandbox Child Domain (SSCD)
• Same Sandbox Same Domain (SSSD)
Table 7-1 illustrates how you can achieve a particular combination—DSDD, SSDD,
SSCD, and SSSD (in this order)—provided that the portal and the portlet are hosted
by the different web domains. You can explicitly use the 
loaderContext
property or you
can manipulate 
loadForCompatibility
and 
trustContent
.
Sibling Domains and Multiversioning g | 363
Table 7-1. Loading portlets across web domains
loaderContext syntax
SWFLoader syntax
swfLoader.loaderContext=new
LoaderContext( false,
new ApplicationDomain(null),
null
);
<mx:SWFLoader
id="swfLoader"
/>
swfLoader.loaderContext=new
LoaderContext( false,
new ApplicationDomain(null),
SecurityDomain.currentDomain
);
<mx:SWFLoader
id="swfLoader"
loadForCompatibility="true"
trustContent="true"
/>
swfLoader.loaderContext=new
LoaderContext( false,
new ApplicationDomain(
ApplicationDomain.currentDomain
),
SecurityDomain.currentDomain
);
<mx:SWFLoader
id="swfLoader"
trustContent="true"
/>
swfLoader.loaderContext=new
LoaderContext( false,
ApplicationDomain.applicationDomain,
SecurityDomain.currentDomain
);
Not applicable
Table 7-2 illustrates how the combination SSDD, SSCD, and SSSD can be achieved,
provided that the portal and the portlet are located on the same web domain.
Table 7-2. Loading portlets from the same web domain
loaderContext syntax
SWFLoader syntax
swfLoader.loaderContext=new
LoaderContext( false,
new ApplicationDomain(null)
);
<mx:SWFLoader
id="swfLoader"
loadForCompatibility="true"
/>
swfLoader.loaderContext=new
LoaderContext( false,
new ApplicationDomain(
ApplicationDomain.currentDomain
)
);
<mx:SWFLoader
id="swfLoader"
/>
swfLoader.loaderContext=new
LoaderContext( false,
ApplicationDomain.currentDomain
);
Not applicable
Some of these scenarios make more sense than the others. In particular, the Same
Sandbox Same Domain scenario is the one most prone to class name clashing. To
reiterate: duplicate loading of a class in the tree of application domains is not possible.
At the same time, sub’s code can easily and perhaps inadvertently modify static variables
of the classes hosted by the parent application. This relates to classes, such as
364 | | Chapter 7: Modules, Libraries, Applications, and Portals
mx.core.Application
and 
mx.messaging.config.ServerConfig
, for instance, and their
properties 
application
and 
xml
, respectively.
On the opposite end is the Different Sandbox Different Domain scenario. Here you
have the ultimate class isolation, which supports multiversioning plus ultimate security
(more on this a bit later), at the price of a not-so-seamless user experience. For instance,
the pop ups and alerts of the portlet will appear centered and clipped relative to the
portlet rather than the entire portal, as shown in Figure 7-13.
Figure 7-13. DifferentSandboxDifferentDomainDemo; pop up is centered relatively to the loaded
portlet
The remaining two scenarios are Same Sandbox Child Domain and Same Sandbox
Different Domain. The latter should be considered the top choice for enterprise portals,
as it supports multiversioning and delivers a seamless user experience. The simpler
scenario, Same Sandbox Child Domain, is the one you’ll examine next. After that, you’ll
investigate scenarios that provide multiversioning support.
Sibling Domains and Multiversioning g | 365
Default Portlet Loading: Same Sandbox Child Domain
Same Sandbox Child Domain is the default scenario when the application and the
subapplication are located in a single web domain. Unless you tell 
SWFLoader
otherwise,
portlet classes get loaded into the child application domain. To see how this works,
start with a sample portlet, such as RegularApplication.mxml, in Example 7-34.
Example 7-34. RegularApplication.mxml—sample portlet
<?xml version="1.0"?>
<!-- RegularApplication.mxml-->
backgroundColor="0xffeeff"   xmlns:local="*"
creationComplete="onCreationComplete()">
<mx:Script>
<![CDATA[
import mx.events.DynamicEvent;
import mx.controls.Alert;
import events.RemoteEvent;
[Bindable] private var command:String="";
[Bindable]  public var greeting:String = "";
public function setGreeting(value:String):void {
greeting = value;
}
public function getGreeting():String {
return greeting;
}
private function onCreationComplete():void {
Alert.show("Loaded application talks back...");
//   systemManager.loaderInfo.sharedEvents will work always
// Subscribe to command from the application
swfBridge.addEventListener("command", onCommand,false,0,true );
// Notify the application that creation has completed
var evt:RemoteEvent = new RemoteEvent("creationComplete");
evt.data = ". Loaded application reported createComplete!";
swfBridge.dispatchEvent(evt);
}
private function onCommand(event:Event):void {
command = event["data"] as String;
}
]]>
</mx:Script>
width="90%" height="90%">
<local:GoogleNews width="100%" height="100%"/>
366 | | Chapter 7: Modules, Libraries, Applications, and Portals
Documents you may be interested
Documents you may be interested