dev-6: architecting your application in openedge 10
DESCRIPTION
DEV-6: Architecting Your Application in OpenEdge 10. Joe Genovese. Solutions Engineer. Agenda. What’s Your Starting Point? Using the OERA to Help You Adapt ProDataSets and Your Architecture Opening Your Application to the World Using Classes in Your Application Other Areas of Support. - PowerPoint PPT PresentationTRANSCRIPT
DEV-6: Architecting Your Application in OpenEdge 10
Joe GenoveseSolutions Engineer
© 2008 Progress Software Corporation2
Agenda
What’s Your Starting Point? Using the OERA to Help You Adapt ProDataSets and Your Architecture Opening Your Application to the World Using Classes in Your Application Other Areas of Support
© 2008 Progress Software Corporation3
One procedure to do everything
DEFINE VARIABLE cCarBrand AS CHARACTER NO-UNDO.DEFINE VARIABLE cCarModel AS CHARACTER NO-UNDO.CREATE Car.Update CarBrand CarModel CarStyle CarColor CarFuel CarEngine CarVIN WITH FRAME UpdFrame. Car.CarID = GUID(GENERATE-UUID).CASE CarBrand: WHEN "Hinda" THEN FIND Dealer WHERE Dealer.DealerName MATCHES "*#1*".…FIND BaseCode WHERE Category = "style“ AND Description = CarStyle.Car.BaseCodeStyleID = BaseCode.BaseCodeID.IF Dealer.DealerName MATCHES "*#1*" THEN Car.CarDescription = cCarColor + " " +…ELSE IF Dealer.DealerName MATCHES "*#2*" THEN Car.CarDescription = cCarBrand + " " +…
© 2008 Progress Software Corporation4
So what happens when the UI requirements change?
Extracting and changing UI references Identifying what elements were displayed,
created or updated and in what order Extracting implicit business logic
Update CarBrand CarModel CarStyle CarColor CarFuel CarEngine CarVIN WITH FRAME UpdFrame.
© 2008 Progress Software Corporation5
One procedure to do everything
DEFINE VARIABLE cCarBrand AS CHARACTER NO-UNDO.DEFINE VARIABLE cCarModel AS CHARACTER NO-UNDO.CREATE Car.Update CarBrand CarModel CarStyle CarColor CarFuel CarEngine CarVIN WITH FRAME UpdFrame. Car.CarID = GUID(GENERATE-UUID).CASE CarBrand: WHEN "Hinda" THEN FIND Dealer WHERE Dealer.DealerName MATCHES "*#1*".…FIND BaseCode WHERE Category = "style“ AND Description = CarStyle.Car.BaseCodeStyleID = BaseCode.BaseCodeID.IF Dealer.DealerName MATCHES "*#1*" THEN Car.CarDescription = cCarColor + " " +…ELSE IF Dealer.DealerName MATCHES "*#2*" THEN Car.CarDescription = cCarBrand + " " +…
© 2008 Progress Software Corporation6
What happens as your logic grows?
Adding a brand or a dealership Many places in the code to change Finding them all Being sure they all work the same way Effects of this on testing
CASE CarBrand: WHEN "Hinda" THEN FIND Dealer WHERE Dealer.DealerName MATCHES "*#1*".
© 2008 Progress Software Corporation7
One procedure to do everything
DEFINE VARIABLE cCarBrand AS CHARACTER NO-UNDO.DEFINE VARIABLE cCarModel AS CHARACTER NO-UNDO.CREATE Car.Update CarBrand CarModel CarStyle CarColor CarFuel CarEngine CarVIN WITH FRAME UpdFrame. Car.CarID = GUID(GENERATE-UUID).CASE CarBrand: WHEN "Hinda" THEN FIND Dealer WHERE Dealer.DealerName MATCHES "*#1*".…FIND BaseCode WHERE Category = "style“ AND Description = CarStyle.Car.BaseCodeStyleID = BaseCode.BaseCodeID.IF Dealer.DealerName MATCHES "*#1*" THEN Car.CarDescription = cCarColor + " " +…ELSE IF Dealer.DealerName MATCHES "*#2*" THEN Car.CarDescription = cCarBrand + " " +…
© 2008 Progress Software Corporation8
How does your database schema affect your application code?
Schema complexities Many places in the
code Schema changes
FIND BaseCode WHERE Category = "style“ AND Description = CarStyle.Car.BaseCodeStyleID = BaseCode.BaseCodeID.
Relational keys
© 2008 Progress Software Corporation9
One procedure to do everything
DEFINE VARIABLE cCarBrand AS CHARACTER NO-UNDO.DEFINE VARIABLE cCarModel AS CHARACTER NO-UNDO.CREATE Car.Update CarBrand CarModel CarStyle CarColor CarFuel CarEngine CarVIN WITH FRAME UpdFrame. Car.CarID = GUID(GENERATE-UUID).CASE CarBrand: WHEN "Hinda" THEN FIND Dealer WHERE Dealer.DealerName MATCHES "*#1*".…FIND BaseCode WHERE Category = "style“ AND Description = CarStyle.Car.BaseCodeStyleID = BaseCode.BaseCodeID.IF Dealer.DealerName MATCHES "*#1*" THEN Car.CarDescription = CarColor + " " +…ELSE IF Dealer.DealerName MATCHES "*#2*" THEN Car.CarDescription = cCarBrand + " " +…
© 2008 Progress Software Corporation10
What happens to business logic variants?
Duplicating and extending the logic When the code gets out of control Maintaining each variant
IF Dealer.DealerName MATCHES "*#1*" THEN Car.CarDescription = cCarColor + " " +…ELSE IF Dealer.DealerName MATCHES "*#2*" THEN Car.CarDescription = cCarBrand + " " +…
© 2008 Progress Software Corporation11
Agenda
What’s Your Starting Point? Using the OERA to Help You Adapt ProDataSets and Your Architecture Opening Your Application to the World Using Classes in Your Application Other Areas of Support
© 2008 Progress Software Corporation12
OpenEdge Reference Architecture
PresentationPresentation
Business ComponentsBusiness Components
Data AccessData Access
Data SourcesData Sources
Co
mm
on
Infrastru
cture
Co
mm
on
Infrastru
cture
Enterprise ServicesEnterprise ServicesUpdate CarBrand
IF DealerName MATCHES …
CREATE CAR…FIND DEALER WHERE…
© 2008 Progress Software Corporation13
OpenEdge Reference Architecture
PresentationPresentation
Business ComponentsBusiness Components
Data AccessData Access
Data SourcesData Sources
Co
mm
on
Infrastru
cture
Co
mm
on
Infrastru
cture
Enterprise ServicesEnterprise Services
RUN Inventory_Service
AUDIT-CONTROL…
IF CAN-DO…
© 2008 Progress Software Corporation14
Basic principles for agility and reuse
Do each job once and only once!
Let each component do only one job and one type of job!
Tackle one part of the problem at a time!
Business ComponentsBusiness Components Co
mm
on
Infrastru
cture
Co
mm
on
Infrastru
cture
© 2008 Progress Software Corporation15
Starting the split
User Interface and Business Logic Or Client and Server
Data Definitions
User Interface
Client-Side Logic
Authentication
Business Logic
Database Access
Schema Defs
Client
Server
© 2008 Progress Software Corporation16
Continuing the split
Data Definitions
User Interface
Client-Side Logic
Client
Server
Authentication
Business Logic
Database Access
Schema Defs
Sharing definitions Identifying the user What data for the UI What data for the
business logic
© 2008 Progress Software Corporation17
Completing the split
Data Definitions
User Interface
Client-Side Logic
Authentication
Business Logic
Database Access
PresentationPresentation
Business ComponentsBusiness Components
Data AccessData Access
Data SourcesData Sources
Co
mm
on
Infrastru
cture
Co
mm
on
Infrastru
cture
Enterprise ServicesEnterprise Services
Schema Defs
© 2008 Progress Software Corporation18
Agenda
What’s Your Starting Point? Using the OERA to Help You Adapt ProDataSets and Your Architecture Opening Your Application to the World Using Classes in Your Application Other Areas of Support
© 2008 Progress Software Corporation19
ProDataSet™ bridges the gap from client to server
Holds any relational data instance• Data relationships
• Before-and-after versions of changes
• Input and output data elements
• Authentication and other data, too
• Transports all this as a single data object
• A Document Message in enterprise terms
PresentationPresentation
Business ComponentsBusiness Components
MasterDetailDetailDetail
ProDataSet
© 2008 Progress Software Corporation20
ProDataSet holds the logical data definition
Lets you separate the logical from the physical data definitions• Eliminate schema complexities from logic
• Shield logic from schema changes
• Hold calculated fields and other values
Business ComponentsBusiness ComponentsMasterDetailDetailDetail
ProDataSet
Data AccessData Access
© 2008 Progress Software Corporation21
Remember that complex schema definition?
Keep this in the Data Access object
FIND CarBrand WHERE CarBrandName = cCarBrand.FIND CarModel WHERE CarModel.CarModelName = cCarModel.FIND BaseCode WHERE Category = "style" AND BaseCodeDescription = cCarStyle.cBaseCodeStyleID = BaseCode.BaseCodeID.FIND BaseCode WHERE Category = "color" AND BaseCodeDescription = cCarColor.cBaseCodeColorID = BaseCode.BaseCodeID.FIND BaseCode WHERE Category = "fuel" AND BaseCodeDescription = cCarFuel.cBaseCodeFuelID = BaseCode.BaseCodeID.FIND BaseCode WHERE BaseCode.BaseCodeCategory = "engine" AND BaseCodeDescription = cCarEngine.cBaseCodeEngineID = BaseCode.BaseCodeID.
Data AccessData Access
© 2008 Progress Software Corporation22
Logical data definition is in temp-tables and ProDataSets
DEFINE TEMP-TABLE ttCarInfo FIELD CarBrand AS CHARACTER FIELD CarModel AS CHARACTER FIELD CarStyle AS CHARACTER FIELD CarColor AS CHARACTER FIELD CarFuel AS CHARACTER FIELD CarEngine AS CHARACTER FIELD CarVIN AS CHARACTER FIELD CarDesc AS CHARACTER FIELD CarDealer AS CHARACTER FIELD CarIsAvail AS LOGICAL FIELD CarAdded AS DATE.
DEFINE DATASET dsCarInfo FOR ttCarInfo.
Usable business data winds up here
Including calculated fields
And fields dependent on specific business logic
Business ComponentsBusiness Components
PresentationPresentation
© 2008 Progress Software Corporation23
Wrap your code and data as a service
How much code?• Big enough for one request
• Small enough to promote reuse
How much data?• Enough to get the job done…
• Not so much as to take over somebody else’s business logic!
• Can be expressed as a ProDataSet
© 2008 Progress Software Corporation24
In short: ProDataSets and Your Application Architecture Document Messages between parts of your application Organize the data a component uses Define the scope of a service
Data your user interface uses
Logical schema versus physical data
Data shared with another application
PresentationPresentation
Business ComponentsBusiness Components
Data AccessData Access
Data SourcesData Sources
Co
mm
on
Infrastru
cture
Co
mm
on
Infrastru
cture
Enterprise ServicesEnterprise Services
MasterDetailDetailDetail
ProDataSet
© 2008 Progress Software Corporation25
Agenda
What’s Your Starting Point? Using the OERA to Help You Adapt ProDataSets and Your Architecture Opening Your Application to the World Using Classes in Your Application Other Areas of Support
© 2008 Progress Software Corporation26
How else can you use a business service?
As a component to call from .NET™
As a component to call from Java™
As a component to expose as a Web service As a step in a Sonic™ ESB process
© 2008 Progress Software Corporation27
Business ComponentsBusiness Components
Sharing data with a .NET application…
OpenEdge preserves all the data, • All the relationships,
• All the changes to data,
• All transparently for you
MasterDetailDetailDetail
ProDataSet
PresentationPresentation .NET Presentation LayerMasterDetailDetailDetail
.NET DataSet
© 2008 Progress Software Corporation28
Business ComponentsBusiness Components
Sharing data with a Java application…
OpenEdge preserves all the data, • All the relationships,
• All the changes to data,
• All transparently for you
MasterDetailDetailDetail
ProDataSet
PresentationPresentation Java Presentation LayerMasterDetailDetailDetail
Java SDO
© 2008 Progress Software Corporation29
Exposing your service as a Web service
Enterprise ServicesEnterprise Services
© 2008 Progress Software Corporation30
Running Web services from your application
Run Web services as if they were ABL procedures
OpenEdge utility generates syntax to paste into your application
Parameters converted
© 2008 Progress Software Corporation31
ProDataSets as Web service parameters
Convert a ProDataSet (or temp-table) to XML in a single WRITE-XML method• Also WRITE-XMLSCHEMA• Pass a ProDataSet as a parameter directly to
a Web service Converts XML to a ProDataSet (or temp-
table) with or without schema• READ-XML and READ-XMLSCHEMA• Likewise, receive a parameter directly from a
Web service
© 2008 Progress Software Corporation32
Integrating Web services into your Business Components
Business ComponentsBusiness ComponentsMasterDetailDetailDetail
ProDataSetXMLXML
Somebody’sWeb service
RUN SomebodysService on hWebService(INPUT DATASET dsCarInfo, OUTPUT DATASET dsResultSet).
© 2008 Progress Software Corporation33
Breaking up your services into maintainable, reusable units
Two business logic variants in one procedure
Separate that into two distinct services
/* ManageAmericanCars.p */
ASSIGN ttCarInfo.CarDealer = "#2" ttCarInfo.CarDesc = ttCarInfo.CarBrand + " " + ttCarInfo.CarModel + " " + … ttCarInfo.CarIsAvail = YES ttCarInfo.CarAdded = TODAY.
/* ManageForeignCars.p */
ASSIGN ttCarInfo.CarDealer = "#1" ttCarInfo.CarDesc = ttCarInfo.CarColor + " " + ttCarInfo.CarBrand + " " + … ttCarInfo.CarIsAvail = NO ttCarInfo.CarAdded = TODAY.
CASE CarBrand: WHEN "Hinda" THEN FIND Dealer WHERE Dealer.DealerName MATCHES "*#1*".
© 2008 Progress Software Corporation34
Integrating your services into Sonic processes
Content-Based Routing
© 2008 Progress Software Corporation35
Running ABL procedures from Sonic
ABL annotations describe the procedure and its parameters
OpenEdge Architect or ProxyGen can generate the annotations for you
Also creates the special-format descriptor file
© 2008 Progress Software Corporation36
The OpenEdge Architect editor integrated into Sonic Workbench
@openapi.openedge.export FILE(type="ESB", esboeFilename="%FILENAME%", useReturnValue="false", writeDataSetBeforeImage="false", executionMode="external").
© 2008 Progress Software Corporation37
In short: OpenEdge supports you in opening your services to the world ProDataSets as Document Messages
• As parameters to .NET or Java applications Run Web services from your application Expose your ABL procedures as Web services Make your services part of Sonic ESB processes
Business ComponentsBusiness Components
Enterprise ServicesEnterprise Services
MasterDetailDetailDetail
ProDataSet
PresentationPresentation
.NET or Java
© 2008 Progress Software Corporation38
Agenda
What’s Your Starting Point? Using the OERA to Help You Adapt ProDataSets and Your Architecture Opening Your Application to the World Using Classes in Your Application Common Infrastructure Support
© 2008 Progress Software Corporation39
Support for classes in ABL: Inheritance
Architecture is about isolating common behavior and eliminating redundancy
Classes provide inheritance• Common business object behavior
• Common infrastructure support
• Common support of all kinds
Business ComponentsBusiness ComponentsBus. Comp. Super ClassBus. Comp. Super Class
Car ClassCar Class Dealer ClassDealer Class
© 2008 Progress Software Corporation40
Inheritance in classes
You can define a class with data and methods
Then you can define a subclass that inherits, overrides, and extends the standard behavior.CLASS AmericanCar INHERITS Car: /* Source file AmericanCar.cls */ METHOD PUBLIC OVERRIDE LOGICAL ReserveCar (INPUT pcCarId AS CHARACTER). SUPER:ReserveCar(INPUT pcCarId). /* Do reserve work for American cars. */ END METHOD.
END CLASS.
CLASS Car: /* Source file Car.cls */
METHOD PUBLIC LOGICAL ReserveCar (INPUT pcCarId AS CHARACTER). /* Do reserve work for all cars. */ END METHOD.
END CLASS.
© 2008 Progress Software Corporation41
Support for classes: strong typing
Enforcing consistency and correctness Classes provide strong object typing to assist
• A variable holds a reference to a specific class
• The compiler verifies that all references are correct
• …even cross-checking many classes
• Interface files also represent programming contracts to enforce
Instance of Car Class
Instance of Car Class
Instance ofDealer ClassInstance of
Dealer Class
© 2008 Progress Software Corporation42
Strong typing in classes
Here’s some procedural code:
Will it work at runtime?• Who knows?
Here’s some class-based code:
Will it work at runtime?• The compiler makes sure it will!
DEFINE VARIABLE hProc AS HANDLE.RUN MyProc.p PERSISTENT SET hProc.RUN SomeProc IN hProc(INPUT 5).
DEFINE VARIABLE rCar AS CLASS Car.rCar = NEW Car().rCar:SomeMethod(INPUT 5).
MyProc.p
SomeProc:
Car.cls
SomeMethod:
MyProc.p
SomeFunc:
?
© 2008 Progress Software Corporation43
D I S C L A I M E R
Under Development
This talk includes information about potential future products and/or product enhancements.
What I am going to say reflects our current thinking, but the information contained herein is preliminary and subject to change. Any future products we ultimately deliver may be materially different from what is described here.
D I S C L A I M E R
© 2008 Progress Software Corporation44
Classes for the Advanced UI in OE 10.2
Use .NET controls (both Microsoft and third party) as if they were native to ABL
Controls are expressed as objects Use ABL classes to build a UI with them
• Visual Designer in OpenEdge Architect
Integrate these new classes with other ABL classes or procedures
© 2008 Progress Software Corporation45
In short: Using Classes in Your Architecture
Consider the practical benefits of using classes• Definitional inheritance
• Strong type checking
• More compiler support for finding errors
• Using and extending Advanced UI controls
© 2008 Progress Software Corporation46
Agenda
What’s Your Starting Point? Using the OERA to Help You Adapt ProDataSets and Your Architecture Opening Your Application to the World Using Classes in Your Application Other Areas of Support
© 2008 Progress Software Corporation47
Other Areas of Support
Auditing Authentication Structured error handling Don’t just think about the feature!
• Think about how it contributes to architecture
© 2008 Progress Software Corporation48
In Summary
Consider the OpenEdge Reference Architecture as a set of practical guidelines
Make sure you are aware of key OpenEdge 10 features
Map features to their benefit in designing (changes to) your application
© 2008 Progress Software Corporation49
Questions?
© 2008 Progress Software Corporation50
Thank You
© 2008 Progress Software Corporation51
© 2008 Progress Software Corporation52
OERA component slide
PresentationPresentation
Business ComponentsBusiness Components
Data AccessData Access
Data SourcesData Sources
Co
mm
on
Infrastru
cture
Co
mm
on
Infrastru
cture
Enterprise ServicesEnterprise Services
© 2008 Progress Software Corporation53
Questions?
© 2008 Progress Software Corporation54
Thank You
© 2008 Progress Software Corporation55