1 / 55

DEV-6: Architecting Your Application in OpenEdge 10

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.

nigel-horn
Download Presentation

DEV-6: Architecting Your Application in OpenEdge 10

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DEV-6: Architecting Your Application in OpenEdge 10 Joe Genovese Solutions Engineer

  2. 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

  3. 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 + " " +…

  4. So what happens when the UI requirements change? Update CarBrand CarModel CarStyle CarColor CarFuel CarEngine CarVIN WITH FRAME UpdFrame. • Extracting and changing UI references • Identifying what elements were displayed, created or updated and in what order • Extracting implicit business logic

  5. 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 + " " +…

  6. What happens as your logic grows? CASE CarBrand: WHEN "Hinda" THEN FIND Dealer WHERE Dealer.DealerName MATCHES "*#1*". • 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

  7. 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 + " " +…

  8. How does your database schema affect your application code? FIND BaseCode WHERE Category = "style“ AND Description = CarStyle. Car.BaseCodeStyleID = BaseCode.BaseCodeID. • Schema complexities • Many places in the code • Schema changes Relational keys

  9. 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 + " " +…

  10. What happens to business logic variants? IF Dealer.DealerName MATCHES "*#1*" THEN Car.CarDescription = cCarColor + " " +… ELSE IF Dealer.DealerName MATCHES "*#2*" THEN Car.CarDescription = cCarBrand + " " +… • Duplicating and extending the logic • When the code gets out of control • Maintaining each variant

  11. 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

  12. Enterprise Services Presentation Business Components Common Infrastructure Data Access Data Sources OpenEdge Reference Architecture Update CarBrand IF DealerName MATCHES … CREATE CAR… FIND DEALER WHERE…

  13. Enterprise Services Presentation Business Components Common Infrastructure Data Access Data Sources OpenEdge Reference Architecture RUN Inventory_Service AUDIT-CONTROL… IF CAN-DO…

  14. Business Components Common Infrastructure 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!

  15. 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

  16. Continuing the split • Sharing definitions • Identifying the user • What data for the UI • What data for the business logic Data Definitions User Interface Client-Side Logic Client Authentication Business Logic Database Access Schema Defs Server

  17. Enterprise Services Presentation Business Components Common Infrastructure Data Access Data Sources Completing the split Data Definitions User Interface Client-Side Logic Authentication Business Logic Database Access Schema Defs

  18. 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

  19. ProDataSet Presentation Master Detail Detail Detail Business Components 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

  20. ProDataSet Master Detail Detail Detail Business Components Data Access 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

  21. Data Access 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.

  22. Presentation Business Components 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

  23. 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

  24. 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 ProDataSet Master Detail Detail Detail Enterprise Services Presentation Business Components Common Infrastructure Data Access Data Sources In short: ProDataSets and Your Application Architecture

  25. 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

  26. 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

  27. .NET DataSet ProDataSet Master Detail Detail Detail Master Detail Detail Detail Presentation Business Components Sharing data with a .NET application… .NET Presentation Layer • OpenEdge preserves all the data, • All the relationships, • All the changes to data, • All transparently for you

  28. ProDataSet Java SDO Master Detail Detail Detail Master Detail Detail Detail Presentation Business Components Sharing data with a Java application… Java Presentation Layer • OpenEdge preserves all the data, • All the relationships, • All the changes to data, • All transparently for you

  29. Enterprise Services Exposing your service as a Web service

  30. 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

  31. 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

  32. ProDataSet Master Detail Detail Detail Business Components Integrating Web services into your Business Components RUN SomebodysService on hWebService (INPUT DATASET dsCarInfo, OUTPUT DATASET dsResultSet). XML Somebody’s Web service

  33. CASE CarBrand: WHEN "Hinda" THEN FIND Dealer WHERE Dealer.DealerName MATCHES "*#1*". 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.

  34. Integrating your services into Sonic processes Content-Based Routing

  35. 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

  36. The OpenEdge Architect editor integrated into Sonic Workbench @openapi.openedge.export FILE (type="ESB", esboeFilename="%FILENAME%", useReturnValue="false", writeDataSetBeforeImage="false", executionMode="external").

  37. 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 ProDataSet Master Detail Detail Detail Enterprise Services Presentation .NET or Java Business Components In short: OpenEdge supports you in opening your services to the world

  38. 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

  39. Bus. Comp. Super Class Business Components Car Class Dealer Class 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

  40. Inheritance in classes CLASS Car: /* Source file Car.cls */ METHOD PUBLIC LOGICAL ReserveCar (INPUT pcCarId AS CHARACTER). /* Do reserve work for all cars. */ END METHOD. END CLASS. • 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.

  41. Instance of Car Class Instance of Dealer Class 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

  42. Strong typing in classes MyProc.p SomeProc: ? DEFINE VARIABLE hProc AS HANDLE. RUN MyProc.p PERSISTENT SET hProc. RUN SomeProc IN hProc(INPUT 5). • 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! MyProc.p SomeFunc: DEFINE VARIABLE rCar AS CLASS Car. rCar = NEW Car(). rCar:SomeMethod(INPUT 5). Car.cls SomeMethod:

  43. D I S C L A I M E R 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.

  44. 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

  45. 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

  46. 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

  47. Other Areas of Support • Auditing • Authentication • Structured error handling • Don’t just think about the feature! • Think about how it contributes to architecture

  48. 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

  49. ? Questions

  50. Thank You

More Related