This document summarizes a presentation about developing a MVP application using GWT, Spring Roo, and deploying it to CloudFoundry. The presentation covers MVP pattern in GWT, using activities and places for navigation, using Spring Roo for rapid development, and deploying the application to CloudFoundry. It provides code examples for implementing MVP using views, presenters, activities and places. It also outlines the steps to deploy an application to CloudFoundry including installing the vmc CLI and pushing the application.
2. MVP GWT application with Spring
Roo and CloudFoundry
Ali Parmaksız @parmaksiza
ali.parmaksiz@eu.sony.com
Jan 19, 2013
http://aliparmaksiz.blogspot.com/
10. MVP Pattern(View)
• View
public class ContactsView extends Composite implements ContactsPresenter.Display {
private final Button addButton;
private final Button deleteButton;
private FlexTable contactsTable;
private final FlexTable contentTable;
public ContactsView() {
DecoratorPanel contentTableDecorator = new DecoratorPanel();
initWidget(contentTableDecorator);
contentTableDecorator.setWidth("100%");
contentTableDecorator.setWidth("18em");
************************
public void setData(List<String> data) {
contactsTable.removeAllRows();
for (int i = 0; i < data.size(); ++i) {
contactsTable.setWidget(i, 0, new CheckBox());
contactsTable.setText(i, 1, data.get(i));
}
}
11. MVP Pattern(Presenter)
public class ContactsPresenter implements Presenter {
private List<ContactDetails> contactDetails;
public interface Display {
HasClickHandlers getAddButton();
HasClickHandlers getDeleteButton();
HasClickHandlers getList();
void setData(List<String> data);
int getClickedRow(ClickEvent event);
List<Integer> getSelectedRows(); Widget asWidget();
}
private final ContactsServiceAsync rpcService;
private final HandlerManager eventBus;
private final Display display;
12. MVP Pattern(Presenter)
private void fetchContactDetails() {
rpcService.getContactDetails(new AsyncCallback<ArrayList<ContactDetails>>() {
public void onSuccess(ArrayList<ContactDetails> result) {
contactDetails = result;
sortContactDetails();
List<String> data = new ArrayList<String>();
for (int i = 0; i < result.size(); ++i) {
data.add(contactDetails.get(i).getDisplayName()); }
display.setData(data); }
public void onFailure(Throwable caught) {
Window.alert("Error fetching contact details");
}
});
13.
14. Activities & Places
• Browser History Management
• Create bookmarkable URLs
• Browser's back button and bookmarks to work as
users expect
• MVP ?
• GWT recommends this pattern as best practice
• http://www.google.com/events/io/2011/sessions/high-
performance-gwt-best-practices-for-writing-smaller-faster-
apps.html
15. Activity
• Represents something the user is doing
• no Widgets or UI code
• Restore state ("wake up")
• Perform initialization ("set up")
• Load a corresponding UI ("show up")
• Call service
16. @Override
Activity
public void start(AcceptsOneWidget containerWidget, EventBus eventBus) {
HelloView helloView = clientFactory.getHelloView();
helloView.setName(name);
helloView.setPresenter(this);
containerWidget.setWidget(helloView.asWidget());
}
/**
* Ask user before stopping this activity
*/
@Override
public String mayStop() {
return "Please hold on. This activity is stopping.";
}
/**
* Navigate to a new Place in the browser
*/
public void goTo(Place place) {
clientFactory.getPlaceController().goTo(place);
}
/**
* Also some Service calls can made here
*/
17. Activity
public class EditContactActivity extends AbstractActivity {
public interface IEditDisplay {
HasClickHandlers getSaveButton();
HasClickHandlers getCancelButton();
HasValue<String> getFirstName();
}
private Contact contact;
private final ContactsServiceAsync rpcService;
private final EventBus eventBus;
private final IEditDisplay display;
private final PlaceController placeController;
public EditContactActivity(NewContactPlace place, ClientFactory clientFactory) {
this.rpcService = clientFactory.getContactServiceRPC();
this.eventBus = clientFactory.getEventBus();
this.contact = new Contact();
this.display = clientFactory.getEditContactView();
this.placeController = clientFactory.getPlaceController();
bind();
}
18. Place
• Java object representing a particular state of
the UI
• A Place can be converted to and from a URL
history token
• PlaceController makes back
button/bookmarks work like user expect
• PlaceTokenizers map to / from String tokens
on URL
19. Place
import com.google.gwt.place.shared.Prefix;
public class EditContactPlace extends Place {
private String placeName;
public EditContactPlace(String token) {
this.placeName = token;
}
public String getPlaceName() {
return placeName;
}
@Prefix("edit")
public static class Tokenizer implements PlaceTokenizer<EditContactPlace> {
@Override
public String getToken(EditContactPlace place) {
return place.getPlaceName();
}
@Override
public EditContactPlace getPlace(String token) {
return new EditContactPlace(token);
}
}
27. To Be Honest: It’s too Hard to
Get Started on the JVM
• Modern enterprise Java is way better than 5 years ago
• But…it’s still too hard to…
– Start a new Java project
– Obtain and integrate all the necessary software
• Too much of our time is spent doing things that add
too little value
• We have great building blocks, but we need
to improve the experience
(Thanks to Rod Johnson :P )
32. Spring Roo
• Easy to use productivity tool
• Code generator – Spring based
enterprise applications.
• Development time only.
• No negative performance impact
• No memory overhead
33. Spring Roo
• Entity support
• Field management
• Persistence
• JUnit testing
• Spring MVC controller
• Spring Security
• GWT
• Flex
• ……………………
34.
35.
36. CloudFoundry-The Industry's Open
Platform as a Service
• Services
- Caldecott – tunnel into your services, explore with
standard client tools
- PostgreSQL, RabbitMQ
• Frameworks, Runtimes, and Tools
- Java and Ruby Auto-Reconfiguration
- Scala, node.JS 0.6.*, Erlang, JRuby, PHP, Python, .NET,
Spring 3.1, Grails 2.0
- Multi-Node Chef based deployment tools
- Maven Plugin, Eclipse Integration
- VMC manifests, Java Debugging, Rails Console
• Micro Cloud Foundry
44. Deploying an Application to
CloudFoundry (2)
• Installing vmc is easy once you have
installed Ruby and RubyGems on your
computer.
• prompt$ sudo gem install vmc (linux&mac)
• prompt> gem install vmc (windows)