EFinanceFactory Andriy Kurhanevych, development group manager.

Post on 14-Jan-2016

215 views 1 download

Tags:

transcript

eFinanceFactory

Andriy Kurhanevych, development group manager

Refactoring project

Old implementation No scalabelity Poor extensibility,

changeability and reuseablity

Antipatterns almost not at all OO no interfaces no basic pattern responsibilities in the

classes are difficult to determine

code duplication ...

Customer needed Scalability Better extensibility,

changeability, reuseability High decoupling between

business logic and user interface

Project goals

Scalability Maintainability Extensibility Internationalization Additional business rules

New Architecture

eFinanceFactory

Additional features

Project profile and phases

Requirements

Architecture basis

Prototype

Full migration of the DCB web site

Migration of all other Web-Applications

eFF1.1

eFF 1.2

eFF 2

Internationalization

eFinanceFactory

Size > 5 PY

Length 54 weeks

Begin December 2001

End January 2003

Distributed development

Customer (DCB)

ULYBIN (2) New Ground (2)

Continental Software (3)

Maximal Solution (2)

- Management - Analysis- Design- Implementation- Testing

- Implementation- Testing

- Implementation- Testing

- Management - Analysis- Testing- Deployment

Phase development process Tasks and problems management Web Tool

MS-Project plan

Software Architecture Document

Requirements Specification

Rational Rose UML model

Release Notes

Test cases

Technical Acceptance Document

Requirements management

Design

Management

Automated Deployment Procedure (based on Jakarta Ant)

Deployment

Customer (DCB)

Code Review

Web Repository (IIS + FrontPage Server Extension)

Implementation

Keystone

define and assign tasks

Continental Software (3)

ULYBIN (2)

Technical Acceptance

Automated Unit Tests (JUnit)

Rational Robot JTesting

(based on DCB standards and IEEE templates)

Web-based development

Tasks and defects management Web Tool (Keystone) Tracking tasks and problems Priorities management Automated e-mail notification

Documents and sources Web repository (IIS 5.0 + FrontPage extension) Versions management Checkin/checkout per Internet

Development platform Technologies:

J2EE: JDK1.2.2,, EJB 1.1, JSP 1.1 Web technologies: Java Script, XML, XSLT

Application and Web servers: IBM WebSphere Advanced Server 3.5.3 (target) Jboss 2.4.3, Tomcat 3.2.3 (for quick development only)

Database: Oracle 8.2

Tools: MS Project 2000 MS Visual Studio 6.0 IIS 5.0 + FrontPage extension Rational Rose 2000 Rational Robot J 2000 Keystone Jakarta Ant 1.4

Example of iteration plan

Task names contain numbers of the corresponding tasks in the Keystone

Save calculation Send calculation per emailPrint calculation

Calculate via direct access

External Application

Pass calculation on

CalculationType

productClassID : intcustomerTypeID : int

(from calculationdata)

User

(from Use Case View)...)

Choose calculation type

+edit

Input parameters

<<include>>

Display action info

CalculationResult

installment : floatisActionApplied : booleanactionIdentity : FPActionIdentity

(from calculationdata)

Display Vehicle Image and links

<<include>>

Calculation data operation

CalculationInput

vehiclePrice : floatdeposit : floatvehicleIdentifier : VehicleIdentifiercurrencyID : StringcontractTerm : intisDepositMethodPercent : booleanresultCurrencyValuesFractionPrecisionresultPercentageValuesFractionPrecision

(from calculationdata)

+input/edit

Input desired installment

Abstract Calculation

+Chooses implementation

<<include>>

Display calculation data <<extend>>

<<include>>

+display

<<include>> <<extend>>

+display

Calculate by installment <<include>>

<<include>>Calculate

<<include>>

<<include>>

<<extend>>

Find Finance Product

<<include>>

Example of Use Case Diagram Calculation functionality common for all calculation types (determined by customer type and product class)

Set of input/output parameters and calculation logic depend on the calculation type

Example of Use Cases analysis Calculation types hierarchy and common parts

Abstract Calculation

(from AbstractCalculation)

Financing

PrivateLeasing

AbstractFinancing

Plus3Financing

AbstractLeasing

<<include>>

Leasing

<<include>>

PrivateFinancingPrivateAbstract Financing

<<include>>

PrivatePlus3Financing

<<include>>

BusinessFinancing BusinessPlus3 Financing

BusinessAbstract Financing

<<include>>

<<include>>

BusinessCalculation

<<include>>

BusinessLeasing

<<include>>

Example of input page

Example of output page

J2EE platform architecture

Internet explorer WebSphere cluster Oracle

Middle tier architecture

com.dcb.eff.gci.ui

financefactory

JSP

com.dcb.eff.gci

...gci.facade

...gci.sessionfacade...entities

Business Delegate EJB pattern:- hides all EJB implementation details- minimizes coupling between presentation-tier and business services

Session Facade EJB pattern:- hides persistence implementation details (entity beans)- reduces number of remote method invocations between client and server

Generate XML, XSLT

... ... ...

Example of EJB patterns use

CalculatorFacadeServiceLocator

<<static>> getCalculatorServiceHome()<<static>> getCalculatorBusinessDataServiceHome()<<static>> getInitialContext()

(from ...gci.sessionfacade)

CalculationInput

vehiclePrice : floatdeposit : floatvehicleIdentifier : VehicleIdentifiercurrencyID : StringcontractTerm : intisDepositMethodPercent : booleanresultCurrencyValuesFractionPrecisionresultPercentageValuesFractionPrecision

(from calculationdata)

CalculatorInputRelatedBusinessData Interface

getProductClassName()getCustomerTypeName()

getCurrencyName()getVehicleInfo()

getVehicleURLs()getVehicleMakeName()

getVehicleMainGroupName()getVehicleModelName()

getTermRange()getVehicleMakeIdentities()

getVehicleMainGroupIdentities()getVehicleModelIdentities()getVehicleTypeIdentities()

CalculationType

productClassID : intcustomerTypeID : int

(from calculationdata)

CalculatorInterface

setCalculationType()getCalculationType()

setCalculationInputAndType()setDefaultDepositPctByCalculationTypeChange()

setDefaultVehicleForMainGroup()setDefaultVehicleForMake()setDefaultVehicleForModel()

getCalculatorInputRelatedBusinessDataInterface()load()save()

S

CalculatorService

<<HomeMethod>> create()<<HomeMethod>> create()

(from ...gci.sessionfacade)...)

CalculatorBeancalculatorService : CalculatorServicecalculationType : CalculationTypecalculationInput : CalculationInputcalculationResult : CalculationResultruleBrokenException : CalculatorRuleBrokenException

CalculatorBean()getCalculatorRuleBrokenException()isDefaultDepositPctByCalculationTypeChange()

<<EJB-reference>>

<<obtain>> 1

<<use>>

S

FinanceFactoryStateful Calculator

setDimension()calculateDimension()getRuleViolations()

getDimension()getViolatingRuleDimensionNames()

getFloatDimensionRange()<<HomeMethod>> create()

(from services)

FinanceCore(from financefactory)

FinanceProductPK

productName : StringproductVersion : String

(from businessdata)

CalculationInterface

setCalculationInput(calculationInput : CalculationInput) : voidgetCalculationInput() : CalculationInput

setDefaultDepositPctByVehicleChange(value : boolean)calculate() : void

calculateByInstallment(installment : float) : voidisCalculated() : boolean

getCalculationResult() : CalculationResult

CalculationResult

installment : floatisActionApplied : booleanactionIdentity : FPActionIdentity

(from calculationdata)

FPActionIdentity

actionName : StringactionNumber : String

(from businessdata)

FPActionInfo

actionDescription : StringvalidFrom : TimestampvalidTo : TimestampvalidForNew : booleanvalidForVorfuehr : booleanvalidForUsed : boolean

(from businessdata)

FinanceProductValue

isAction : booleanusage : byteleasfin : bytebaseProduct : Stringintext : byteproduct : Stringsort : intproductVersionElu : StringvalidForJahresWagen : booleanvalidForAVRueckLaeufer : booleankulanzSplitting : int

(from ...entities)

E

FinanceProduct

getData()getActionIdentity()

getActionInfo()<<HomeMethod>> findActionsByCalculationTypeAndTerm()

<<HomeMethod>> findByCalculationTypeAndVehicleTypeAndTerm()

(from ...entities)

Business Delegate

Service Locator

Session Facade

Value Object

<<use>>

<<use>>

Example of GoF design patterns use

AbstractFinancingCalculator

FinancingCalculator

PrivateLeasingCalculatorPrivateFinancingCalculatorPrivateAbstractFinancingCalculation PrivatePlus3FinancingCalculator

BusinessFinancingCalculatorBusinessAbstractFinancingCalculation BusinessPlus3FinancingCalculator BusinessLeasingCalculator

BusinessCalculation

Plus3FinancingCalculator LeasingCalculator

AbstractLeasingCalculation

CalculationInterface

setCalculationInput()getCalculationInput()

setDefaultDepositPctByVehicleChange()calculate()

calculateByInstallment()isCalculated()

getCalculationResult()

(from ...gci.facade)

InclCalculation

CalculationDataHandlingStrategy

setFFCalculatorInput()getFFCalculatorOutput()

handleBrokenRules()

CalculatorPrimitiveOperations

getFinanceProducts()getCheapestCalculationComparator()

getCalculationResultClass()calculateDeposit()

CalculatorTemplateMethods

calcPrimitiveOperations : CalculatorPrimitiveOperationscheapestFinanceProduct : FinanceProduct

calculate()calculateForFP()getUsedFinanceProduct()calculateForFPByInstallment()

AbstractCalculator

calculationInput : CalculationInputcalculationResult : CalculationResultisCalculated : boolean

getProductClassID()getCustomerTypeID()getCalculationInputClass()getDefaultDepositPercentage()

CalculatorServiceBean

calculationType : CalculationType

<<EJBSessionBeanImpl>>

StrategyTemplate Method

Example of Sequence Diagram

: User : edit_calculation_input.jsp : CalculatorBean

The class of the CalculationInput is changed. If vehicle is not allowed for the new calculation type then it is changed to default allowed value.

All entered parameters are passedredirect = "edit_calculation_input.jsp"

Form changes: - new set of fields (according to class of CalculationInput)- new product class or customer type- possibly new vehicle model and type lists, vehicle, terms list and term

change product class or customer type

: edit_calculation_input_ctrl.jsp

request

fillCalculationTypeFromRequest(CalculationType)

include sequence 'GetCalculationInputFromRequest'

setCalculationInputAndType(CalculationInput, CalculationType)

redirect

include sequence 'DisplayCalculationData'

getCalculationType( )

Automated unit testing

Testing class for each business case and each significant parameter set

Near 100 testing classes in the project Automatic script running all test cases and

informing on errors Daily cross-testing between developers

teams

Testing automation with Rational Robot J

Automated black-box testing of user interface Separate tests of all business cases and all

parameter sets Automatic script running all tests nightly

Quality assurance

Tasks and defects management system (Keystone) Tracking tasks and defects Priorities management

Version management system (sources web repository)

Analysis and design UML model Many EJB and GoF design patterns

Code review and refactoring Automated testing

Automated unit testing (JUnit) Automated testing of user interface (Rational Robot J)