SlideShare a Scribd company logo
1 of 39
Download to read offline
Models To Go
                          Peter Friese, itemis
                         Heiko Behrens, itemis

                   @peterfriese | @HBehrens
                        @itemismobile
                    http://mobile.itemis.de

                           (c) 2010 Heiko Behrens & Peter Friese
More info: http://www.heikobehrens.net / http://www.peterfriese.de / http://mobile.itemis.com
mobile is sexy
mobile is challenging
diversity of platforms
94 App Stores
two categories
countless devices
How can we address
  this diversity?
You can write amazing web apps
that look exactly and behave
exactly like apps on the iPhone
                  Steve Jobs, WWDC 2007
MOBILE WEB
server-side web                             client-side web


                                                Web Browser
                  Web Server
               executes application
                      logic
                                                 JavaScript
                                           executes application logic
Web Browser




              Files             Database
                                             Files         Database




  Device              Backend                        Device             Backend
hybrid app

Native App

         Interpreter



    Request
   Interceptor


         JavaScript Bridge

          Browser
     executes JavaScript




             Device                Backend
interpreted app

Native App

         interpreter




                  Database
  Application
    Script
                       Files




             Device             Backend
generated app

    Generator




 Generator Input       Native App

                               Logic     Logic
      Model
describes logic and
                             Database   Database
 complete system

                                Files    Files
Files     Database

                              Device    Backend
gain speed
    through restrictions
Lists   Details   Custom
analyzing the problem




http://www.flickr.com/photos/minifig/3174009125/
Anatomy
of these apps
View




      Speaker
  Name
  Image

        Session
  Title
  Location                        Cells




Entity
                                  Navigation
                  Data Provider
demo
getting real
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }

	   button {
	   	 title= "Wednesday"
	   	 icon= "calendar.png"
	   	 view= SessionList( SessionsByDay("1") )
	   }
	
	   button {
	   	 title= "Thursday"
	   	 icon= "calendar.png"
	   	 view= SessionList( SessionsByDay("2") )
	   }
	
	   button {
	   	 title= "Speakers"
	   	 icon= "person.png"
	   	 view= SpeakersList( AllSpeakers() )
	   }
}
tabbarApplication itemisApp {
	 button {
	 	 title= "Tuesday"
	 	 icon= "calendar.png"
	 	 view= SessionList( SessionsByDay("0") )
	 }

	   button {
	   	 title= "Wednesday"
	   	 icon= "calendar.png"
	   	 view= SessionList( SessionsByDay("1") )
	   }
	
	   button {
	   	 title= "Thursday"
	   	 icon= "calendar.png"
	   	 view= SessionList( SessionsByDay("2") )
	   }
	
	   button {
	   	 title= "Speakers"
	   	 icon= "person.png"
	   	 view= SpeakersList( AllSpeakers() )
	   }
}
-(UIViewController*)createController {
!    itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease];
!    UITabBarController *result = [[UITabBarController alloc] init];
!    NSMutableArray *controllers = [NSMutableArray array];
!
!    UIViewController<IPUIView> *controller;
!    UINavigationController *navController;
!    IPContentProvider *contentProvider;

!   // controller for @"Tuesday"
!   contentProvider = [providers providerForSessionsByDay: @"0"];
!
!   controller = [[SessionListViewController alloc] init];
!   [controller setContentProvider: contentProvider];
!   controller.tabBarItem.title = @"Tuesday";
!   controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
!   navController = [[UINavigationController alloc] initWithRootViewController:controller];
!   [controllers addObject: navController];
!   [controller release];
!   [navController release];

!
!   // controller for @"Wednesday"
!   contentProvider = [providers providerForSessionsByDay: @"1"];
!
!   controller = [[SessionListViewController alloc] init];
!   [controller setContentProvider: contentProvider];
!   controller.tabBarItem.title = @"Wednesday";
!   controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
!   navController = [[UINavigationController alloc] initWithRootViewController:controller];
!   [controllers addObject: navController];
!   [controller release];
!   [navController release];

!
!   // controller for @"Thursday"
!   contentProvider = [providers providerForSessionsByDay: @"2"];
!
!   controller = [[SessionListViewController alloc] init];
!   [controller setContentProvider: contentProvider];
!   controller.tabBarItem.title = @"Thursday";
!   controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
!   navController = [[UINavigationController alloc] initWithRootViewController:controller];
!   [controllers addObject: navController];
!   [controller release];
!   [navController release];

!
!   // controller for @"Speakers"
!   contentProvider = [providers providerForAllSpeakers];
!
!   controller = [[SpeakersListViewController alloc] init];
!   [controller setContentProvider: contentProvider];
!   controller.tabBarItem.title = @"Speakers";
!   controller.tabBarItem.image = [UIImage imageNamed:@"person.png"];
!   navController = [[UINavigationController alloc] initWithRootViewController:controller];
!   [controllers addObject: navController];
!   [controller release];
!   [navController release];


!   result.viewControllers = controllers;
!   return result;
}
-(UIViewController*)createController {
!    itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease];
!    UITabBarController *result = [[UITabBarController alloc] init];
!    NSMutableArray *controllers = [NSMutableArray array];
!
!    UIViewController<IPUIView> *controller;
!    UINavigationController *navController;
!    IPContentProvider *contentProvider;

!   // controller for @"Tuesday"
!   contentProvider = [providers providerForSessionsByDay: @"0"];
!
!   controller = [[SessionListViewController alloc] init];
!   [controller setContentProvider: contentProvider];
!   controller.tabBarItem.title = @"Tuesday";
!   controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
!   navController = [[UINavigationController alloc] initWithRootViewController:controller];
!   [controllers addObject: navController];
!   [controller release];
!   [navController release];

!
!   // controller for @"Wednesday"
!   contentProvider = [providers providerForSessionsByDay: @"1"];
!
!   controller = [[SessionListViewController alloc] init];
!   [controller setContentProvider: contentProvider];
!   controller.tabBarItem.title = @"Wednesday";
!   controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
!   navController = [[UINavigationController alloc] initWithRootViewController:controller];
!   [controllers addObject: navController];
!   [controller release];
!   [navController release];

!
!   // controller for @"Thursday"
!   contentProvider = [providers providerForSessionsByDay: @"2"];
!
!   controller = [[SessionListViewController alloc] init];
!   [controller setContentProvider: contentProvider];
!   controller.tabBarItem.title = @"Thursday";
!   controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"];
!   navController = [[UINavigationController alloc] initWithRootViewController:controller];
!   [controllers addObject: navController];
!   [controller release];
!   [navController release];

!
!   // controller for @"Speakers"
!   contentProvider = [providers providerForAllSpeakers];
!
!   controller = [[SpeakersListViewController alloc] init];
!   [controller setContentProvider: contentProvider];
!   controller.tabBarItem.title = @"Speakers";
!   controller.tabBarItem.image = [UIImage imageNamed:@"person.png"];
!   navController = [[UINavigationController alloc] initWithRootViewController:controller];
!   [controllers addObject: navController];
!   [controller release];
!   [navController release];


!   result.viewControllers = controllers;
!   return result;
}
«Xpand»
«DEFINE moduleFile FOR Application»
«FILE filenameApplicationDelegateModule()»
#import "«filenameApplicationDelegateHeader()»"
#import "IPUIView.h"
#import "«filenameCentralProvidersHeader()»"

«EXPAND importStatements-»

@implementation «applicationDelegateClassname()»

@synthesize window, rootController;

-(UIViewController*)createController {
	    «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease];
	    UITabBarController *result = [[UITabBarController alloc] init];
	    NSMutableArray *controllers = [NSMutableArray array];
	
	    UIViewController<IPUIView> *controller;
	    UINavigationController *navController;
	    IPContentProvider *contentProvider;

«EXPAND barControllerInstance FOREACH buttons»

	   result.viewControllers = controllers;
	   return result;
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {
	    self.rootController = [self createController];
	    [window addSubview: [self.rootController view]];
    [window makeKeyAndVisible];
}

- (void)dealloc {
	    self.rootController = nil;
    [window release];
    [super dealloc];
}



@end
«ENDFILE»
«ENDDEFINE»
«DEFINE moduleFile FOR Application»
«FILE filenameApplicationDelegateModule()»
#import "«filenameApplicationDelegateHeader()»"
#import "IPUIView.h"
#import "«filenameCentralProvidersHeader()»"

«EXPAND importStatements-»

@implementation «applicationDelegateClassname()»

@synthesize window, rootController;

-(UIViewController*)createController {
	    «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease];
	    UITabBarController *result = [[UITabBarController alloc] init];
	    NSMutableArray *controllers = [NSMutableArray array];
	
	    UIViewController<IPUIView> *controller;
	    UINavigationController *navController;
	    IPContentProvider *contentProvider;

«EXPAND barControllerInstance FOREACH buttons»

	   result.viewControllers = controllers;
	   return result;
}

- (void)applicationDidFinishLaunching:(UIApplication *)application {
	    self.rootController = [self createController];
	    [window addSubview: [self.rootController view]];
    [window makeKeyAndVisible];
}

- (void)dealloc {
	    self.rootController = nil;
    [window release];
    [super dealloc];
}



@end
«ENDFILE»
«ENDDEFINE»
«DEFINE barControllerInstance FOR TabbarButton»
	 «IF view.provider != null»
	 // controller for «this.title.expression('', '')»
	 contentProvider = «view.provider.contentProvider('providers', '', '')»;
	 «ENDIF»
	 controller = [[«view.view.className()» alloc] init];
	 [controller setContentProvider: contentProvider];
	 controller.tabBarItem.title = «title.expression('', '')»;
	 controller.tabBarItem.image = [UIImage imageNamed:«this.icon.expression('','')»];
	 navController = [[UINavigationController alloc] initWithRootViewController:controller];
	 [controllers addObject: navController];
	 [controller release];
	 [navController release];
«ENDDEFINE»
tool integration
demo 2
developer’s point of view

                                      Simulator


                        Objective-C


                                       Device



        DSL
describes application




                                      Simulator


                           Java


                                        Device
toolsmith’s point of view

                           «Xpand»
                 Parser
                              Templates   Templates
                                iPhone     Android
   Grammar
                 Editor
 describes DSL

                          EMF MM
APPlause
                                     applause

                                                                                            Simulator



                           «Xpand»
                                                                              Objective-C


                                                                                             Device
                 Parser
                              Templates   Templates
                                iPhone     Android
  Grammar
                 Editor                                       DSL
describes DSL                                         describes application

                          EMF MM


                                                                                            Simulator


                                                                                 Java


                                                                                              Device




                http://code.google.com/p/applause/
http://mobile.itemis.de

@peterfriese | http://peterfriese.de
@hbehrens |!http://heikobehrens.net

More Related Content

More from Peter Friese

Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsPeter Friese
 
Firebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesFirebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesPeter Friese
 
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift LeedsPeter Friese
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in SwiftPeter Friese
 
Firebase for Apple Developers
Firebase for Apple DevelopersFirebase for Apple Developers
Firebase for Apple DevelopersPeter Friese
 
Building Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebaseBuilding Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebasePeter Friese
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebasePeter Friese
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebasePeter Friese
 
6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase AuthPeter Friese
 
Five Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthFive Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthPeter Friese
 
Building High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantBuilding High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantPeter Friese
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Peter Friese
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GoogleBuilding Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GooglePeter Friese
 
What's new in Android Wear 2.0
What's new in Android Wear 2.0What's new in Android Wear 2.0
What's new in Android Wear 2.0Peter Friese
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinPeter Friese
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android WearPeter Friese
 
Google Play Services Rock
Google Play Services RockGoogle Play Services Rock
Google Play Services RockPeter Friese
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android WearPeter Friese
 
Google+ for Mobile Apps on iOS and Android
Google+ for Mobile Apps on iOS and AndroidGoogle+ for Mobile Apps on iOS and Android
Google+ for Mobile Apps on iOS and AndroidPeter Friese
 
Cross-Platform Authentication with Google+ Sign-In
Cross-Platform Authentication with Google+ Sign-InCross-Platform Authentication with Google+ Sign-In
Cross-Platform Authentication with Google+ Sign-InPeter Friese
 

More from Peter Friese (20)

Building Reusable SwiftUI Components
Building Reusable SwiftUI ComponentsBuilding Reusable SwiftUI Components
Building Reusable SwiftUI Components
 
Firebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroesFirebase for Apple Developers - SwiftHeroes
Firebase for Apple Developers - SwiftHeroes
 
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 +  = ❤️ (Firebase for Apple Developers) at Swift Leeds
 
async/await in Swift
async/await in Swiftasync/await in Swift
async/await in Swift
 
Firebase for Apple Developers
Firebase for Apple DevelopersFirebase for Apple Developers
Firebase for Apple Developers
 
Building Apps with SwiftUI and Firebase
Building Apps with SwiftUI and FirebaseBuilding Apps with SwiftUI and Firebase
Building Apps with SwiftUI and Firebase
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
Rapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and FirebaseRapid Application Development with SwiftUI and Firebase
Rapid Application Development with SwiftUI and Firebase
 
6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth6 Things You Didn't Know About Firebase Auth
6 Things You Didn't Know About Firebase Auth
 
Five Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase AuthFive Things You Didn't Know About Firebase Auth
Five Things You Didn't Know About Firebase Auth
 
Building High-Quality Apps for Google Assistant
Building High-Quality Apps for Google AssistantBuilding High-Quality Apps for Google Assistant
Building High-Quality Apps for Google Assistant
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
 
Building Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on GoogleBuilding Conversational Experiences with Actions on Google
Building Conversational Experiences with Actions on Google
 
What's new in Android Wear 2.0
What's new in Android Wear 2.0What's new in Android Wear 2.0
What's new in Android Wear 2.0
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & XamarinGoogle Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 
Google Play Services Rock
Google Play Services RockGoogle Play Services Rock
Google Play Services Rock
 
Introduction to Android Wear
Introduction to Android WearIntroduction to Android Wear
Introduction to Android Wear
 
Google+ for Mobile Apps on iOS and Android
Google+ for Mobile Apps on iOS and AndroidGoogle+ for Mobile Apps on iOS and Android
Google+ for Mobile Apps on iOS and Android
 
Cross-Platform Authentication with Google+ Sign-In
Cross-Platform Authentication with Google+ Sign-InCross-Platform Authentication with Google+ Sign-In
Cross-Platform Authentication with Google+ Sign-In
 

Recently uploaded

[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024The Digital Insurer
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking MenDelhi Call girls
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
 

Recently uploaded (20)

[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024Tata AIG General Insurance Company - Insurer Innovation Award 2024
Tata AIG General Insurance Company - Insurer Innovation Award 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
08448380779 Call Girls In Diplomatic Enclave Women Seeking Men
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
 

Models To Go: How We Built a DSL for Mobile Apps With Tools From the Eclipse Modeling Project

  • 1. Models To Go Peter Friese, itemis Heiko Behrens, itemis @peterfriese | @HBehrens @itemismobile http://mobile.itemis.de (c) 2010 Heiko Behrens & Peter Friese More info: http://www.heikobehrens.net / http://www.peterfriese.de / http://mobile.itemis.com
  • 8. How can we address this diversity?
  • 9. You can write amazing web apps that look exactly and behave exactly like apps on the iPhone Steve Jobs, WWDC 2007
  • 11. server-side web client-side web Web Browser Web Server executes application logic JavaScript executes application logic Web Browser Files Database Files Database Device Backend Device Backend
  • 12. hybrid app Native App Interpreter Request Interceptor JavaScript Bridge Browser executes JavaScript Device Backend
  • 13. interpreted app Native App interpreter Database Application Script Files Device Backend
  • 14. generated app Generator Generator Input Native App Logic Logic Model describes logic and Database Database complete system Files Files Files Database Device Backend
  • 15. gain speed through restrictions
  • 16.
  • 17.
  • 18. Lists Details Custom
  • 21. View Speaker Name Image Session Title Location Cells Entity Navigation Data Provider
  • 22.
  • 23. demo
  • 25. tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } }
  • 26. tabbarApplication itemisApp { button { title= "Tuesday" icon= "calendar.png" view= SessionList( SessionsByDay("0") ) } button { title= "Wednesday" icon= "calendar.png" view= SessionList( SessionsByDay("1") ) } button { title= "Thursday" icon= "calendar.png" view= SessionList( SessionsByDay("2") ) } button { title= "Speakers" icon= "person.png" view= SpeakersList( AllSpeakers() ) } }
  • 27. -(UIViewController*)createController { ! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease]; ! UITabBarController *result = [[UITabBarController alloc] init]; ! NSMutableArray *controllers = [NSMutableArray array]; ! ! UIViewController<IPUIView> *controller; ! UINavigationController *navController; ! IPContentProvider *contentProvider; ! // controller for @"Tuesday" ! contentProvider = [providers providerForSessionsByDay: @"0"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Tuesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Wednesday" ! contentProvider = [providers providerForSessionsByDay: @"1"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Wednesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Thursday" ! contentProvider = [providers providerForSessionsByDay: @"2"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Thursday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Speakers" ! contentProvider = [providers providerForAllSpeakers]; ! ! controller = [[SpeakersListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Speakers"; ! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! result.viewControllers = controllers; ! return result; }
  • 28. -(UIViewController*)createController { ! itemisAppProviders *providers = [[[itemisAppProviders alloc] init] autorelease]; ! UITabBarController *result = [[UITabBarController alloc] init]; ! NSMutableArray *controllers = [NSMutableArray array]; ! ! UIViewController<IPUIView> *controller; ! UINavigationController *navController; ! IPContentProvider *contentProvider; ! // controller for @"Tuesday" ! contentProvider = [providers providerForSessionsByDay: @"0"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Tuesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Wednesday" ! contentProvider = [providers providerForSessionsByDay: @"1"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Wednesday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Thursday" ! contentProvider = [providers providerForSessionsByDay: @"2"]; ! ! controller = [[SessionListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Thursday"; ! controller.tabBarItem.image = [UIImage imageNamed:@"calendar.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! ! // controller for @"Speakers" ! contentProvider = [providers providerForAllSpeakers]; ! ! controller = [[SpeakersListViewController alloc] init]; ! [controller setContentProvider: contentProvider]; ! controller.tabBarItem.title = @"Speakers"; ! controller.tabBarItem.image = [UIImage imageNamed:@"person.png"]; ! navController = [[UINavigationController alloc] initWithRootViewController:controller]; ! [controllers addObject: navController]; ! [controller release]; ! [navController release]; ! result.viewControllers = controllers; ! return result; }
  • 30. «DEFINE moduleFile FOR Application» «FILE filenameApplicationDelegateModule()» #import "«filenameApplicationDelegateHeader()»" #import "IPUIView.h" #import "«filenameCentralProvidersHeader()»" «EXPAND importStatements-» @implementation «applicationDelegateClassname()» @synthesize window, rootController; -(UIViewController*)createController { «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease]; UITabBarController *result = [[UITabBarController alloc] init]; NSMutableArray *controllers = [NSMutableArray array]; UIViewController<IPUIView> *controller; UINavigationController *navController; IPContentProvider *contentProvider; «EXPAND barControllerInstance FOREACH buttons» result.viewControllers = controllers; return result; } - (void)applicationDidFinishLaunching:(UIApplication *)application { self.rootController = [self createController]; [window addSubview: [self.rootController view]]; [window makeKeyAndVisible]; } - (void)dealloc { self.rootController = nil; [window release]; [super dealloc]; } @end «ENDFILE» «ENDDEFINE»
  • 31. «DEFINE moduleFile FOR Application» «FILE filenameApplicationDelegateModule()» #import "«filenameApplicationDelegateHeader()»" #import "IPUIView.h" #import "«filenameCentralProvidersHeader()»" «EXPAND importStatements-» @implementation «applicationDelegateClassname()» @synthesize window, rootController; -(UIViewController*)createController { «centralProvidersClassName()» *providers = [[[«centralProvidersClassName()» alloc] init] autorelease]; UITabBarController *result = [[UITabBarController alloc] init]; NSMutableArray *controllers = [NSMutableArray array]; UIViewController<IPUIView> *controller; UINavigationController *navController; IPContentProvider *contentProvider; «EXPAND barControllerInstance FOREACH buttons» result.viewControllers = controllers; return result; } - (void)applicationDidFinishLaunching:(UIApplication *)application { self.rootController = [self createController]; [window addSubview: [self.rootController view]]; [window makeKeyAndVisible]; } - (void)dealloc { self.rootController = nil; [window release]; [super dealloc]; } @end «ENDFILE» «ENDDEFINE»
  • 32. «DEFINE barControllerInstance FOR TabbarButton» «IF view.provider != null» // controller for «this.title.expression('', '')» contentProvider = «view.provider.contentProvider('providers', '', '')»; «ENDIF» controller = [[«view.view.className()» alloc] init]; [controller setContentProvider: contentProvider]; controller.tabBarItem.title = «title.expression('', '')»; controller.tabBarItem.image = [UIImage imageNamed:«this.icon.expression('','')»]; navController = [[UINavigationController alloc] initWithRootViewController:controller]; [controllers addObject: navController]; [controller release]; [navController release]; «ENDDEFINE»
  • 35. developer’s point of view Simulator Objective-C Device DSL describes application Simulator Java Device
  • 36. toolsmith’s point of view «Xpand» Parser Templates Templates iPhone Android Grammar Editor describes DSL EMF MM
  • 37. APPlause applause Simulator «Xpand» Objective-C Device Parser Templates Templates iPhone Android Grammar Editor DSL describes DSL describes application EMF MM Simulator Java Device http://code.google.com/p/applause/
  • 38.