bobs breakable objects
play

BoBs: Breakable Objects Building blocks for flexible application - PowerPoint PPT Presentation

BoBs: Breakable Objects Building blocks for flexible application architectures Ph.D. Viva-Voce July 23 rd 2007 Vikram Jamwal Advisor: Prof. Sridhar Iyer IIT Bombay, Mumbai Contents Problem and Motivations Breakable Object (BoB)


  1. BoBs: Breakable Objects Building blocks for flexible application architectures Ph.D. Viva-Voce July 23 rd 2007 Vikram Jamwal Advisor: Prof. Sridhar Iyer IIT Bombay, Mumbai

  2. Contents  Problem and Motivations  Breakable Object (BoB) basics  BoB for application partitioning  BoB as elements of reuse  Related work comparisons  Discussion and conclusions

  3. Contents  Problem and Motivations  BoB basics  BoBs for application partitioning  BoBs as elements of reuse  Related work comparisons  Discussion and conclusions

  4. Given  Computing devices with various capabilities  Netw orks which are diverse  Applications need to adapt  to different deployment scenarios

  5. Furthermore…  Applications need to evolve  Change in user requirements  Different sets of user requirements  Restructuring for • better maintenance • better performance

  6. Application adaptation Adapt A A / Adapt Refactor A σ Redesign

  7. Broader Problem  Design and implement an application  Such that  Given the software for one scenario, we can generate a version of application for a new scenario  Through refactoring ( and / or ) adaptation  Easily  Automatically ? Scenario specific Transformations ? Scenario B Scenario A

  8. Problems: Environmental Heterogeneity 1. Distribution of Components 2. Functionality Partitioning 3. (1) and (2) active areas of research, many  solutions exist (3) still requires adequate attention 

  9. Motivating Example  E-mail Application  Different devices  PC, Web-Client, Mobile Device  Different Modes / Scenarios  On-line  Disconnected  Off-line

  10. Functionality Partitioning  Apportioning application functionality into deployment specific component sub-sets  Difficult to achieve in practice because we cannot draw clean lines of separation  Some functionality may span across multiple classes  A single class may contain multiple functionality

  11. E-mail Internals(jwma)

  12. E-mail-design Login  Different E-mail Client GUI Preferences Folder-2 AddressBook partitioning for Folder-Impl different versions javax.mail  Store class on << abstract >> IMAP Folder Folder Service server Message-Impl #folder  Folder class << abstract >> Sore #store << abstract >> partitioned between Message MimeMessage user and server <<interface>> Multipart BodyPart Part

  13. More specific problem:  Design and implement an OO application such that  functionality of constituent objects is factorable  The part-units  are of desired granularity  can be easily extracted  are reusable  How?

  14. Jwma Classes <<interface>> JwmaStoreInfo <<interface>> JwmaFolder JwmaStoreImpl #m_Store <<interface>> <<interface>> <<interface>> JwmaInboxInfo JwmaTrashInfo JwmaMessagePart -m_ActualFolder -m_MessageParts[] -m_Folders #m_ActualMessage <<interface>> JwmaFolderList JwmaFolderImpl JwmaMessage JwmaMessagePartImpl #m_Subfolder <<interface>> JwmaMessageInfo m_messageInfoList JwmaDisplayMessage m_Folders List(from util) JwmaMessageInfoListImpl ComposeMessage -m_RepliedMessage m_MessageInfos JwmaMessageInfoImpl MessageSorting(from util) MessageInfoListImpl is used to keep handy information about mssages in a folder for sorting etc.

  15. Jwma Folder <<interface>> JwmaFolder <<interface>> JwmaInboxInfo <<interface>> JwmaStoreInfo <<interface>> JwmaTrashInfo JwmaFolderImpl JwmaStoreImpl -log: Logger = Logger.getLogger(JwmaFolderImpl.class) #m_Name: String #m_Store #m_Path: String javax.mail.Folder #m_Type: int #m_OnlineCounting: boolean #m_DraftProfile: FetchProfile #m_Folder <<create>>-JwmaFolderImpl(f: Folder) -m_TrashFolder <<create>>-JwmaFolderImpl(f: Folder, store: JwmaStoreImpl) +getName(): String -setName(name: String) -m_InboxFolder +getPath(): String -setPath(path: String) +getType(): int -m_JwmaRootFolder -setType(type: int) +isType(type: int): boolean -m_ActualFolder +isSubscribed(): boolean +setSubscribed(b: boolean) +getFolder(): Folder +isOnlineCounting(): boolean +setOnlineCounting(b: boolean) +addIfSubfolder(folder: JwmaFolderImpl) +removeIfSubfolder(path: String) +removeIfSubfolder(folders: String) +isSubfolder(folder: String, possiblesubfolder: String): boolean +listSubfolders(type: int): JwmaFolder -m_Folders +listSubfolders(): JwmaFolder +listSubfolders(type: int, subscribed: boolean): JwmaFolder +hasSubfolders(): boolean #m_ActualMessage JwmaFolderList +hasMessages(): boolean +getNewMessageCount(): int #m_SubFolders JwmaMessage +hasNewMessages(): boolean +getUnreadMessageCount(): int +hasUnreadMessages(): boolean +getMessageCount(): int +isEmpty(): boolean +getActualMessage(): JwmaMessage -getMessage(num: int): Message #m_MessageInfoList +getReadMessages(): int +getNextMessageNumber(): int +getPreviousMessageNumber(): int +checkMessageExistence(number: int): boolean JwmaMessageInfoListImpl +getJwmaMessage(num: int): JwmaMessage +getDraftMessage(num: int): JwmaMessage +listMessageInfos(): JwmaMessageInfo +getMessageInfoList(): JwmaMessageInfoListImpl +deleteActualMessage(): int +deleteMessage(number: int) +deleteAllMessages() +deleteMessages(numbers: int) +moveActualMessage(destfolder: String): int +moveMessage(number: int, destfolder: String) +moveMessages(numbers: int, destfolder: String) +writeMessagePart(part: Part, out: OutputStream) +equals(o: Object): boolean +prepare() +update(store: JwmaStoreImpl) +createJwmaFolderImpl(store: JwmaStoreImpl, f: Folder): JwmaFolderImpl +createJwmaFolderImpl(store: JwmaStoreImpl, fullname: String): JwmaFolderImpl +createLight(folder: Folder): JwmaFolderImpl

  16. Our solution:  Reformulate basic component of the application so that it can be readily partitioned into sub- components  Hence Breakable Objects (BoBs)  Main Advantage :  Designing and implementing applications using BoBs makes them more flexible; specifically, more amenable to partitioning . ฀

  17. Other issues: Account Account +Id +Id +Debit() +Credit() +Debit() +getBalance() +Credit() +getBalance() Shared Single +usersNameList +userName Savings Checking Savings Checking SingleSaving SharedSaving ATM ATM SharedATM SingleATM LifeLine Senior/StudentChecking MoneyMarket LifeLine Senior/StudentChecking MoneyMarket

  18. Problems with inheritance and composibility  Decomposition  Duplicated Features  Inappropriate hierarchies  Duplicated wrappers  Composition  Conflicting Features  Fragile Hierarchies

  19. Other issues:  Inheritance based composition mechanisms  Problem of software contraction  Large software sizes  Heavier and more complex versions

  20. Javax Record Store <<interface>> RecordStoreException RecordEnumeration <<interface>> +numRecords(): int RecordListener +nextRecord(): byte +nextRecordId(): int +recordAdded(recordStore: RecordStore, recordId: int) +previousRecord(): byte +recordChanged(recordStore: RecordStore, recordId: int) +previousRecordId(): int RecordStoreNotFoundException +recordDeleted(recordStore: RecordStore, recordId: int) InvalidRecordIDException +hasNextElement(): boolean +hasPreviousElement(): boolean +reset() +rebuild() +keepUpdated(keepUpdated: boolean) +isKeptUpdated(): boolean RecordStoreNotOpenException RecordStoreFullException +destroy() RecordStore +AUTHMODE_PRIVATE: int +AUTHMODE_ANY: int +deleteRecordStore(recordStoreName: String) RecordEnumerationImpl +openRecordStore(recordStoreName: String, createIfNecessary: boolean): RecordStore +openRecordStore(recordStoreName: String, createIfNecessary: boolean, authmode: int, writable: bool ean): RecordStore +numRecords(): int +openRecordStore(recordStoreName: String, vendorName: String, suiteName: String): RecordStore +nextRecord(): byte +setMode(authmode: int, writable: boolean) +nextRecordId(): int +closeRecordStore() +previousRecord(): byte +listRecordStores(): String +previousRecordId(): int +getName(): String +hasNextElement(): boolean +getVersion(): int +hasPreviousElement(): boolean +getNumRecords(): int +reset() +getSize(): int +rebuild() +getSizeAvailable(): int +keepUpdated(keepUpdated: boolean) +getLastModified(): long +isKeptUpdated(): boolean +addRecordListener(listener: RecordListener) +recordAdded(recordStore: RecordStore, recordId: int) +removeRecordListener(listener: RecordListener) +recordChanged(recordStore: RecordStore, recordId: int) +getNextRecordID(): int +recordDeleted(recordStore: RecordStore, recordId: int) +addRecord(data: byte, offset: int, numBytes: int): int +destroy() +deleteRecord(recordId: int) +getRecordSize(recordId: int): int +getRecord(recordId: int, buffer: byte, offset: int): int +getRecord(recordId: int): byte +setRecord(recordId: int, newData: byte, offset: int, numBytes: int) <<interface>> <<interface>> RecordFilter RecordComparator +enumerateRecords(filter: RecordFilter, comparator: RecordComparator, keepUpdated: boolean): Record Enumeration +matches(candidate: byte): boolean +compare(rec1: byte, rec2: byte): int

Recommend


More recommend