open source alternaves to lcds: clear...
TRANSCRIPT
OpenSourceAlterna/vestoLCDS:ClearToolkit
byYakovFaina.k.a.@yfain
(c)FarataSystems
FarataSystemsisalwayshappytosharealltechnicalknowledgewe’reblessedwith.
Foralousy$34.95youcangetthisAmazonbestsellerassoonasyougetonline.
Threeofyouwillgetitforfreetoday.
InthispresoeverythingiseitheralreadyopensourcedorgeGngthere
1. BriefoverviewofClearToolkit3.2components
2. DataSynchronizaMonwithDataCollecMonandChangeObject
3. CRUDgeneraMonwithClearDataBuilder
4. AntgeneraMonwithFx2Ant
5. AcMonScriptDTOgeneraMonwithDTO2FX
6. NewDataFormcomponentforFlex4
7. ReliablemessagingwithBlazeDS
It’sanopensourcetoolkit,thatincludesasetofFlexBuilderpluginsandextendedFlexcomponents.
ClearToolkitincreasesproducMvityoftheenterpriseFlexdevelopers.
Clear.swclibraryincludesanumberofenhancedFlexcomponentslikeDatagrid,ComboBoxetal.SupportsPDFgeneraMonontheclient.
ClearDataBuilder3.2.1isanEclipsepluginthatallowstogenerateCRUDapplicaMonsforBlazeDSbasedonaJavaDataTransferObjectsoranSQLstatement.
DTO2Fx‐automaMcgeneraMonofAcMonScriptclassesfromtheirJavapeers.
Log4Fxisanadvancedlogger(Eclipseplugin)thatisbuiltontopofFlexloggingAPI.Itautomatesandmaketheloggingprocessmoreflexibleanduserfriendly.
Fx2AntisageneratorofopMmizedANTbuildscriptsforyourFlexBuilderprojects.
AIR/BlazeDSsynchronizaMonsoluMonforoccasionallyconnectedapplicaMons
PDFgeneraMonontheclient(describedindetailinChapter11ofthebook)
ClearToolkit3.2.1includes:
IlikefreeopensourcesoluMons,butI’msickandMredofworkingwithnotdocumentedso_ware.IsthereanythingtoreadaboutyourgreatClearToolkitthingy?
DataForm:thisFlex4compaMblecomponentfeatures:
Newformlayouts:VerMcalFormLayoutandHorizontalFormLayoutSupportofDTO‐baseddataProvider
FormandFormItemlevelvaidaMons
ReliableMessagingwithBlazeDS
• IdenMfyinglostpackagesontheAMFprotocollevel• AutomaMcresendsoflostpackages
• Dealingwithout‐of‐sequencemessages
Newaddi/onsinClearToolkit4(Beta):
DataSynchronizaMonwithBlazeDS/usingDataCollecMon
• hgp://livedocs.adobe.com/livecycle/es/sdkHelp/programmer/lcdsjavadoc/flex/data/ChangeObject.html:
• getNewVersion(),getPrevVersion()• isUpdate(),isCreate(),isDelete()• getChangedPropertyNames()
• setNewVersion()
• AllchangesarecommunicatedaslistofChangeObjects:• Changesfromclienttoserver
• Changesfromservertoclient
• Responsetochangessentbythisclient(echo)• ProliferaMonofchangessentbyotherclients(push)
• Onlyoriginaldatasetissentascompletelistofrecords–once!
CornerstoneofDataManagement–ChangeObjectInterfaceChangeObject–TheCornerstoneofDataManagement
• ApplicaMonmaycallcommit()methodtoshipallchangesinoneshot.
• Default–autocommit.
• CustomJavaobjectsbackingDataManagementServicesusuallyprovide amethodreturningthecollecMon,akafillmethod
amethodprocessingthelistofchangessentfromtheclient,akasyncmethod
JavaBackingofAdobeDataManagementService
CustomDMSAssembler
fill()
sync()
TheJavasideofAdobeDataManagementService
Clear Toolkit Data Management
• ClearToolkithgps://sourceforge.net/projects/cleartoolkit/supportsdatasynchronizaMonoverRemoteObjectandConsumer(BlazeDSisenough)
• Supportsdatapullandserverpush(changes)
• Enablesclient‐sidemanagedtransacMons:– transacMonalcommitfromseveralarraycollecMons
– transacMonalbatchingofanynumberofremoMngoperaMons– supportshierarchicalnesMngofcollecMons
• Majorobjects:– DataCollecMon– BatchService
<?xmlversion="1.0"encoding="uo‐8"?>
<mx:ApplicaMonxmlns:mx="hgp://www.adobe.com/2006/mxml"
xmlns:fx="hgp://www.faratasystems.com/2008/components"layout="verMcal"creaMonComplete=“sandwiches.fill()">
<fx:DataCollecMonid="sandwiches"desMnaMon="sandwichDAO"method="getSandwiches"/>
<mx:DataGriddataProvider="{sandwiches}"editable="true">
<mx:columns>
<mx:DataGridColumndataField="sandwichName"headerText="Name"/><mx:DataGridColumndataField="bread"headerText="Bread"/>
<mx:DataGridColumndataField="meat"headerText="Meat"/>
<mx:DataGridColumndataField="spread"headerText="Spread"/>
</mx:columns>
</mx:DataGrid>
</mx:ApplicaMon>
ClearToolkitDataCollecMonSoluMon
What’s DataCollection? • com.farata.collec3ons.DataCollec3on–partoftheclear.swc
componentlibrary.
• DataCollecMonisanextensionofstandardArrayCollecMon
• Features:– des/na/onaware‐itknowswheretofillitselffrom(ontheJava
RemoMngside)
– changetracking‐itrecordsallinteracMveandprogrammaMcchanges
– sync‐able–itknowstheJavaRemoMngmethodtosubmitallaccumulatedchangestotheserver
– push‐ready–hasinternalConsumerobjecttoconsumeserver‐pushedchanges,ifany
DataCollection-inspired derivatives
• com.farata.remo3ng.BatchService–allowsbatchingofchangestomulMpleDataCollecMonstobesenttotheserverforatomicprocessing
• CDBplugin: CRUDcodegeneraMonforJavaandFlexwithtwo
starMngpoints: a)SQL–allJavawillbecodegeneratedforyou
or b)JavaDAOandDTO
DataCollection Use Case
How to Program a Client-Managed Transaction
• Haveafillmethod(getEmployee)returningacollecMonofDTOs
• Have_sync()methodforsimplesynchronizaMon;
• Have_deleteItems()/_updateItems()/_insertItems()forbatchingofchangesinamaster‐detailscenario
EmployeeDao
getEmployee()
getEmployee_sync()
getEmployee_deleteItems()
getEmployee_insertItems()
getEmployee_updateItems()
BatchService / Batch Gateway Tandem
• com.farata.remo3ng.BatchServiceisapartofFarataclear.swc– AllowstogrouptogetherchangesaccumulatedbymulMpleDataCollecMons: batchService.registerCollecMon(orders,0);//level0‐master batchService.registerCollecMon(orderItems,1);//level1‐details– AllowstosendthebatchofchangestobeexecutedassingleJTAtransacMonby
theserver: varbatch:Array=batchService.batchRegisteredCollecMons(); batchService.sendBatch(batch)
• com.farata.remo3ng.BatchGatewayisapartofFaratadaoflex‐runMme.jar,pre‐installeduponconfiguringaCDBproject– ServespreconfigureddesMnaMonthatBatchServicesendshisbatchesto.ExecutesthebatchsequenMally(bydefault–assingleJTAtransacMon)
publicclassOrderController{ publicfuncMonOrderController(){ orders=newDataCollec/on(); orders.desMnaMon="Order"; orders.method="getOrders"; orderItems=newDataCollec/on(); orderItems.desMnaMon="Order";orderItems.method="getOrderItems"; .... } publicfuncMonfillOrders():void{ orders.fill(); } publicfuncMonfillOrderItems(orderId:String):void{ orderItems.fill(orderId); } }
PreparingaBatchontheClient
publicclassOrderController{ publicfuncMonOrderController(){ .... batchService=newBatchService(); batchService.registerCollecMon(orders,0);//master batchService.registerCollecMon(orderItems,1);//details,orders } publicfuncMoncommit():void{ varbatch:Array= batchService.batchRegisteredCollecMons(); batchService.sendBatch(batch);//transacMon,bydefault }}
SendingaBatchtotheServer
Executing a Batch on the Server • Pre‐builtclasscom.farata.remo3ng.BatchGateway
• AllowstocallmulMpleremoteJavamethodsinasequenceaccordingtothelistofBatchMember’spreparedinAcMonScript.
• AllowstowrapsJTAtransacMonaroundthissequence
• BatchMember:(“desMnaMon”,“method”,[arguments])• Usecases:batchupdates,batchretrieves
<destination id=“BatchGateway”>
BatchGateway
Methods:executeBatch()
Flex Remoting ActionScript /MXML
BatchService
Methods:send(batch)Events:RESULTFAULT
<mx:Applica=on/>
UnravellingAutoSync
MessageBroker msgBroker = MessageBroker.getMessageBroker(null); AsyncMessage msg = new AsyncMessage(); msg.setDestination("feed"); // target destination msg.setClientId(UUIDUtils.createUUID(false)); msg.setMessageId(UUIDUtils.createUUID(false)); msg.setTimestamp(System.currentTimeMillis()); msg.setBody(“Pushed Message" ); // arbitrary message msgBroker.routeMessageToService(msg, null);
JavaServerPushtoaFlexmessagingdesMnaMon:
UnravelingAutoSync
Clear Toolkit 3.2 includes CDB
• ClearDataBuilder(CDB):
hgp://sourceforge.net/projects/cleartoolkit(Downloads,documentaMon,license)
• Togetthesourcecode,configureEclipseCVS:– Host:cleartoolkit.cvs.sourceforge.net– Repository:/cvsroot/cleartoolkit– Protocol:pserver– User:anonymous
• TogettheFlex4compaMbleversionofCDB,getthenightlybuildatSourceforge:hgp://farata.dynalias.org:9080/cruisecontrol/arMfacts/ClearToolkit.nightly/
CDB SQL Branch: Complete Automation
Written by developer
AbstractJavaclass:methodsignaturesannotatedwithSQL
JavaImplementaMon
classes
MXML,AcMonScript
classes
Generated by CDB
Pre-built + custom CDB
Templates Assembler
Deployed by CDB JARwith
abstractclasses
JARwithimplementaMon
classes
DAO
ConfigfilesTestMXML
JavaDTOCDB
CDB SQL Mode
• CodegeneraMonsoluMonthatcompletelyautomatesmanualJavacodingforCRUD(create,retrieve,update,delete)tasks
• IntegrateswithEclipseorworksstandaloneasAnttask
• GoesallthewayfromsimpleannotatedJavaclasstodeployedJARsintheWEB‐INF/lib
• GeneratesallrequiredJava,AcMonScript,MXML,XML
packagecom.theriabook.datasource;
/***@daoflex:webservice
*pool=jdbc/theriabook*/
publicabstractclassEmployee{/***@daoflex:sql
*sql=select*fromemployeewherestart_date<:startDate*transferType=EmployeeDTO[]
*keyColumns=emp_id*/publicabstractListgetEmployees(DatestartDate);}
• >
CDB Java Mode: Partial Automation
Written by developer
AnnotatedJavaDTO+JavaDAOimplemenMngfill()andsync()methods
MXML,AcMonScriptclasses
Generated by CDB
Pre-built + custom CDB
Templates
Assembler
Deployed by CDB JARwith
abstractclasses
JARwithimplementaMon
classes
TestMXMLCDB
Configfiles
DemoofClearDataBuilderpackagecom.farata.datasource;importjava.uMl.List;/***@daoflex:webservice*pool=jdbc/test*/publicabstractclassEmployee{ /** *@daoflex:sql *pool=jdbc/test *sql=::select*fromemployee *:: *transferType=EmployeeDTO[] *keyColumns=emp_id *updateTable=employee */ publicabstractListgetEmployees(); /** *@daoflex:sql *sql=::select*fromdepartment *:: *transferType=DepartmentDTO[] */ publicabstractListgetDepartments();}
Farata DTO2Fx Plugin http://sourceforge.net/projects/cleartoolkit/files/ read the doc: DTO2Fx.pdf
• >
packagecom.farata.test;
importcom.farata.dto2fx.annota/ons.FXClass;importcom.farata.dto2fx.annota/ons.FXIgnore;
@FXClass
publicclassEmployeeDTO{ publicfirstName; privateStringsex;
... privateStringuid;
publiclonggetSex(){ returnsex;
} publicvoidsetSex(Stringsex){
this.sex=sex; }
@FXIgnore publicStringgetUid(){
returnuid; } @FXIgnore
publicvoidsetUid(Stringuid){ this.uid=uid;
}}
packagecom.farata.test{
publicclass_EmployeeDTOextendsflash.events.EventDispatcherimplementsmx.core.IPropertyChangeNo/fier,mx.core.IUID{
@FXClasspublicclassEmployeeDTO{
privatevar_firstName:String; privatevar_sex:String; ...
privatevaruid:String;[Bindable(event="propertyChange")]publicfunc/ongetfirstName():String{return_firstName;}publicfunc/onsetfirstName(value:String):void{constoldValue:String=this._firstName;if(oldValue!=value){this._firstName=value;dispatchUpdateEvent(“firstName",oldValue,value);}}[Bindable(event="propertyChange")]publicfunc/ongetsex():String{return_sex;}publicfunc/onsetsex(value:String):void{constoldValue:String=this._sex;if(oldValue!=value){this._sex=value;dispatchUpdateEvent("sex",oldValue,value);}}
Creating ANT scripts with FX2Ant Plugin http://sourceforge.net/projects/cleartoolkit/files/ read the doc: Fx2Ant.pdf
AmodularizedFlexapplicaMonconsistsofseveralFlashBuilderprojects.Right‐clickattheFlexprojectandFX2AntgeneratestheANTscript.
Eachoftheindividualprojectsshouldcontainafilebuild.xmltoperformbuildanddeploymentofthisproject.
Oneextrabuildfileisrequiredtorunindividualprojects’buildsinanappropriateorderandtodeploytheenMreapplicaMoninsomepredefineddir,i.e.c:\serverroot
LoggingwithLog4Fximportmx.logging.Log;importmx.logging.ILogger;privatevarlogger:ILogger=Log.getLogger(”MyStockPoroolio”);
Say,youareconsideringaddingthistracestatementinthefuncMongetPriceQuotes():if(Log.isDebug())logger.debug(”GeGngpricequoteforIBM");
ThismessagewillbesenttothespecifieddesMnaMonselectedwiththeLoggingManager.IfausercallsproducMonsupportcomplainingaboutsomeunexpectedbehavior,askhertopressCtrl+ShiC+Backspace–theloggingmanagerwillpop‐up:
LoggingwithLog4Fx–sampleoutput
YoucansettheoutputdesMnaMonasRemoteLoggingtowatchtheloginfofromanycomputerconnectedtotheInternet
ClearToolkit4addiMons
• ReliableBlazeDSMessaging
• Newspark‐basedcomponents,i.e.DataForm
ClearToolkit4:DataForm
• IntroducesVer/calFormLayoutandHorizontalFormLayoutforautowidthadjustmentofeachDataFormItemelementanditslabel.
• MulMlinelabelsaresupported
• SupportsDataTransferObjectasdataProvider
• FeaturesadvancedformvalidaMon:validateForm()andresetValida/on()
• Offersaform‐levelisValidproperty..
DemoofDataForm
UnreliableMessaging• YouaredevelopingandtesMngFlex/BlazeDSinaLANenvironment.
• ItshouldworkinWANtoo
Yeah,right!Whatifthere’sathunderstorminthearea?Willtheclientreceiveallnetworkpackages?
WhatiftheAshholevolcanoeruptsagain?
UnreliableMessagingandCommonWANProblems
Problem Probability(typicalforUSconsumermarket)
Lostpackagesgoingtoserver High(<.2%)
Lostpackagesgoingtoclient Medium(<.02%)
Messagesoutoforder Low
Messagesduplicated Low
Messageerror(corruptedbits) Verylow
TesMngonalocal/reliablenetworkdoesnotexhibitanyWANproblems
NetworkProblemsSimulaMon
• So_wareonly–ShunraDesktop
• Dedicatedhardwareappliance–Maxwellmini
• ACustomenvironment–usuallyaLinuxboxwithmulMplenetworkportsconfiguredasbridgeusingnetem(aNetworkEmulaMonfuncMonalityforemulaMngtheproperMesofWAN)
ClearToolkit4willincludethetestclientallowingtoemulateproblems(willdemotoday)
HowweimplementedReliableMessaging
• WeareimplemenMngreliablemessagingontheAMFprotocollevel
• ThemessagesarebeingheldbothonclientandserverMllthey’reconfirmed
• MessagesaresequenMallynumberedtoprocessout‐of‐ordermessages
• StandardBlazeDSchannel/endpointaresubclassedwithReliableAMFChannelandReliableAMFEndpoint
DemoofReliableMessaging
Contactinfoandusefullinks
ClearToolkitFramework:hgp://sourceforge.net/projects/cleartoolkit/
O’ReillyBook“EnterpriseDevelopmentwithFlex”:hgp://bit.ly/bDg7IR
Email:[email protected]
Website:hgp://www.faratasystems.com
FlexBlog:hgp://flexblog.faratasystems.com