resty-generators 0.5.3 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/features/generators.feature +67 -0
  2. data/features/step_definitions/simple_steps.rb +1 -0
  3. data/lib/generators/resty/base.rb +15 -3
  4. data/lib/generators/resty/model/model_generator.rb +33 -3
  5. data/lib/generators/resty/scaffold/scaffold_generator.rb +30 -15
  6. data/lib/generators/resty/setup/setup_generator.rb +2 -2
  7. data/lib/generators/resty/setup/setup_generator.rb~ +31 -0
  8. data/lib/generators/resty/setup/templates/ActivityFactory.java~ +7 -0
  9. data/lib/generators/resty/setup/templates/ActivityPlace.java +5 -0
  10. data/lib/generators/resty/setup/templates/ActivityPlace.java~ +8 -0
  11. data/lib/generators/resty/setup/templates/BreadCrumbsPanel.java +3 -2
  12. data/lib/generators/resty/setup/templates/BreadCrumbsPanel.java~ +79 -0
  13. data/lib/generators/resty/setup/templates/GinModule.java~ +7 -0
  14. data/lib/generators/resty/setup/templates/LoginActivity.java~ +58 -0
  15. data/lib/generators/resty/setup/templates/LoginPlace.java~ +20 -0
  16. data/lib/generators/resty/setup/templates/LoginViewImpl.java~ +21 -0
  17. data/lib/generators/resty/setup/templates/Mavenfile +5 -5
  18. data/lib/generators/resty/setup/templates/Mavenfile~ +15 -0
  19. data/lib/generators/resty/setup/templates/MenuPanel.java~ +12 -0
  20. data/lib/generators/resty/setup/templates/PLaceHistoryMapper.java~ +7 -0
  21. data/lib/generators/resty/setup/templates/RestfulPlace.java~ +22 -0
  22. data/lib/generators/resty/setup/templates/SessionActivityPlaceActivityMapper.java~ +71 -0
  23. data/lib/generators/resty/setup/templates/SessionRestService.java~ +23 -0
  24. data/lib/generators/resty/setup/templates/User.java +34 -4
  25. data/lib/generators/resty/setup/templates/authentication.rb +2 -1
  26. data/lib/generators/resty/setup/templates/authentication.rb~ +4 -0
  27. data/lib/generators/resty/setup/templates/empty.css~ +1 -0
  28. data/lib/generators/resty/setup/templates/gwt.css +45 -0
  29. data/lib/generators/resty/setup/templates/initializer.rb~ +1 -0
  30. data/lib/generators/resty/setup/templates/monkey_patch.rb~ +27 -0
  31. data/lib/generators/resty/setup/templates/page.html~ +0 -0
  32. data/lib/generators/resty/setup/templates/session.rb +18 -36
  33. data/lib/generators/resty/setup/templates/session.rb~ +45 -0
  34. data/lib/generators/resty/setup/templates/sessions_controller.rb +27 -8
  35. data/lib/generators/resty/setup/templates/sessions_controller.rb~ +27 -0
  36. data/lib/generators/resty/setup/templates/user.rb +38 -6
  37. data/lib/generators/resty/setup/templates/user.rb~ +27 -0
  38. data/lib/generators/resty/templates/Activity.java +78 -39
  39. data/lib/generators/resty/templates/Activity.java~ +67 -0
  40. data/lib/generators/resty/templates/ActivityPlace.java~ +11 -0
  41. data/lib/generators/resty/templates/ColumnDefinitionsImpl.java~ +24 -0
  42. data/lib/generators/resty/templates/ColumnDefintionsImpl.java~ +34 -0
  43. data/lib/generators/resty/templates/Controller.java~ +49 -0
  44. data/lib/generators/resty/templates/Editor.java +123 -0
  45. data/lib/generators/resty/templates/Editor.java~ +84 -0
  46. data/lib/generators/resty/templates/Editor.ui.xml +41 -0
  47. data/lib/generators/resty/templates/Editor.ui.xml~ +37 -0
  48. data/lib/generators/resty/templates/Event.java +30 -0
  49. data/lib/generators/resty/templates/Event.java~ +31 -0
  50. data/lib/generators/resty/templates/EventHandler.java +8 -0
  51. data/lib/generators/resty/templates/EventHandler.java~ +30 -0
  52. data/lib/generators/resty/templates/Model.java +144 -15
  53. data/lib/generators/resty/templates/Model.java~ +23 -0
  54. data/lib/generators/resty/templates/Place.java +1 -1
  55. data/lib/generators/resty/templates/Place.java~ +21 -0
  56. data/lib/generators/resty/templates/PlaceTokenizer.java +1 -1
  57. data/lib/generators/resty/templates/PlaceTokenizer.java~ +19 -0
  58. data/lib/generators/resty/templates/RestService.java~ +51 -0
  59. data/lib/generators/resty/templates/View.java +15 -4
  60. data/lib/generators/resty/templates/View.java~ +23 -0
  61. data/lib/generators/resty/templates/View.ui.xml +22 -38
  62. data/lib/generators/resty/templates/View.ui.xml~ +17 -0
  63. data/lib/generators/resty/templates/ViewImpl.java +88 -103
  64. data/lib/generators/resty/templates/ViewImpl.java~ +153 -0
  65. data/lib/resty/abstract_session.rb~ +59 -0
  66. data/lib/resty/child_path.rb~ +18 -0
  67. data/lib/resty/session.rb~ +6 -0
  68. metadata +56 -11
@@ -0,0 +1,67 @@
1
+ Feature: Generators for Resty
2
+
3
+ Scenario: Create a rails application and adding 'resty-generators' gem will provide the resty generators
4
+ Given I create new rails application with template "simple.template"
5
+ And I execute "rails generate"
6
+ Then the output should contain "resty:controller" and "resty:model" and "resty:scaffold" and "resty:setup"
7
+
8
+ Given me an existing rails application "simple"
9
+ And I execute "rails generate resty:setup"
10
+ Then the output should contain "GWT_MODULE_NAME"
11
+
12
+ Given me an existing rails application "simple"
13
+ And I execute "rails generate resty:setup com.example"
14
+ Then the output should contain "src/main/java/com/example/Simple.gwt.xml" and "Mavenfile" and "src/main/java/com/example/client/SimpleEntryPoint.java" and "public/Simple.html" and "public/stylesheets/simple.css"
15
+
16
+ Given me an existing rails application "simple"
17
+ And I execute "compile gwt:compile"
18
+ Then the output should contain "Compilation succeeded"
19
+
20
+ Given me an existing rails application "simple"
21
+ And I execute "rails generate scaffold user name:string"
22
+ Then the output should contain "src/main/java/com/example/client/models/User.java" and "src/main/java/com/example/client/restservices/UsersRestService.java"
23
+
24
+ Given me an existing rails application "simple"
25
+ And I execute "compile gwt:compile"
26
+ Then the output should contain "Compilation succeeded"
27
+
28
+ Given me an existing rails application "simple"
29
+ And I execute "rake db:migrate test"
30
+ Then the output should contain "1 tests, 1 assertions, 0 failures, 0 errors" and "7 tests, 10 assertions, 0 failures, 0 errors"
31
+
32
+ Given me an existing rails application "simple"
33
+ And I execute "rails generate scaffold project name:string children:number cars:fixnum age:integer weight:float activated:boolean expires_at:date fire_up_at:datetime --skip-timestamps"
34
+ And I execute "compile gwt:compile"
35
+ Then the output should contain "Compilation succeeded"
36
+
37
+ Given me an existing rails application "simple"
38
+ And I execute "rails generate scaffold accounts name:string --timestamps --optimistic"
39
+ And I execute "compile gwt:compile"
40
+ Then the output should contain "Compilation succeeded"
41
+
42
+ Given me an existing rails application "simple"
43
+ And I execute "rails generate model cars name:string"
44
+ And I execute "compile gwt:compile"
45
+ Then the output should contain "Compilation succeeded"
46
+
47
+
48
+
49
+ Scenario: Create a gwt rails application with session and menu
50
+ Given I create new rails application with template "complete.template" and "complete" tests
51
+ And I execute "rails generate resty:setup com.example --session --menu"
52
+ Then the output should contain "src/main/java/com/example/client/SessionActivityPlaceActivityMapper.java" and "src/main/java/com/example/client/managed/CompleteMenuPanel.java" and "src/main/java/com/example/client/activities/LoginActivity.java"
53
+
54
+ Given me an existing rails application "complete"
55
+ And I execute "compile gwt:compile"
56
+ Then the output should contain "Compilation succeeded"
57
+
58
+ Given me an existing rails application "complete"
59
+ And I execute "rails generate scaffold accounts name:string"
60
+ And I execute "compile gwt:compile"
61
+ Then the output should contain "Compilation succeeded"
62
+
63
+ Given me an existing rails application "complete"
64
+ And I execute "rake db:migrate test"
65
+ Then the output should contain "1 tests, 1 assertions, 0 failures, 0 errors" and "7 tests, 10 assertions, 0 failures, 0 errors"
66
+
67
+
@@ -0,0 +1 @@
1
+ require 'maven/cucumber_steps'
@@ -38,6 +38,14 @@ module Resty
38
38
  @places_package ||= base_package + ".places"
39
39
  end
40
40
 
41
+ def events_package
42
+ @events_package ||= base_package + ".events"
43
+ end
44
+
45
+ def editors_package
46
+ @editors_package ||= base_package + ".editors"
47
+ end
48
+
41
49
  def activities_package
42
50
  @activities_package ||= base_package + ".activities"
43
51
  end
@@ -59,11 +67,15 @@ module Resty
59
67
  end
60
68
 
61
69
  def type_map
62
- @type_map ||= {:integer => 'int', :boolean => 'bool', :string => 'String', :float => 'double', :date => 'java.util.Date', :datetime => 'java.util.Date', :number => 'long', :fixnum => 'long'}
70
+ @type_map ||= {:integer => 'int', :boolean => 'boolean', :string => 'String', :float => 'double', :date => 'java.util.Date', :datetime => 'java.util.Date', :number => 'long', :fixnum => 'long', :text => 'String', :password => 'String'}
71
+ end
72
+
73
+ def type_widget_map
74
+ @type_widget_map ||= {:integer => 'r:IntegerBox', :boolean => 'g:CheckBox', :float => 'r:DoubleBox', :date => 'd:DateBox', :datetime => 'd:DateBox', :number => 'r:LongBox', :fixnum => 'r:LongBox', :text => 'g:TextArea', :string => 'g:TextBox', :password => 'g:PasswordTextBox', :float => 'r:DoubleBox'}
63
75
  end
64
76
 
65
- def type_conversion_map
66
- @type_conversion_map ||= {:integer => 'Integer.parseInt', :boolean => 'Boolean.parseBoolean', :float => 'Double.parseDouble', :date => 'TODO', :datetime => 'TODO', :number => 'Long.parseLong', :fixnum => 'Long.parseLong'}
77
+ def type_widget_prefix_map
78
+ @type_widget_prefix_map ||= {:integer => 'r', :boolean => 'g', :float => 'r', :date => 'd', :datetime => 'd', :number => 'r', :fixnum => 'r', :text => 'g', :string => 'g', :passord => 'g', :float => 'r'}
67
79
  end
68
80
 
69
81
  def find_gwt_xml(basedir)
@@ -8,16 +8,46 @@ module Resty
8
8
 
9
9
  argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
10
10
 
11
- if defined? ::Ixtlan::ModifiedBy
12
- class_option :modified_by, :type => :boolean
13
- end
14
11
  class_option :timestamps, :type => :boolean, :default => true
12
+ class_option :read_only, :type => :boolean, :default => false
13
+ class_option :modified_by, :type => :boolean, :default => false
14
+ class_option :singleton, :type => :boolean, :default => false
15
15
  class_option :parent, :type => :string, :desc => "The parent class for the generated model"
16
16
 
17
17
  def create_model_file
18
18
  template 'Model.java', File.join(java_root, models_package.gsub(/\./, "/"), class_path, "#{class_name}.java")
19
19
  end
20
20
 
21
+ def create_event_files
22
+ template 'Event.java', File.join(java_root, events_package.gsub(/\./, "/"), class_path, "#{class_name}Event.java")
23
+ template 'EventHandler.java', File.join(java_root, events_package.gsub(/\./, "/"), class_path, "#{class_name}EventHandler.java")
24
+ end
25
+
26
+ def create_rest_service_file
27
+ template 'RestService.java', File.join(java_root, restservices_package.gsub(/\./, "/"), class_path, "#{controller_class_name}RestService.java")
28
+ end
29
+
30
+ def controller_class_name
31
+ @controller_class_name ||= class_name
32
+ end
33
+
34
+ def actions
35
+ @actions ||=
36
+ begin
37
+ keys = action_map.keys
38
+ if options[:singleton]
39
+ keys.delete('index')
40
+ keys.delete('create')
41
+ keys.delete('destroy')
42
+ end
43
+ if options[:read_only]
44
+ keys.delete('update')
45
+ keys.delete('create')
46
+ keys.delete('destroy')
47
+ end
48
+ keys
49
+ end
50
+ end
21
51
  end
22
52
  end
23
53
  end
@@ -9,17 +9,21 @@ module Resty
9
9
 
10
10
  argument :attributes, :type => :array, :default => [], :banner => "field:type field:type"
11
11
 
12
- if defined? ::Ixtlan::ModifiedBy
13
- class_option :modified_by, :type => :boolean
14
- end
15
- class_option :timestamps, :type => :boolean, :default => true
16
- class_option :parent, :type => :string, :desc => "The parent class for the generated model"
17
- class_option :singleton, :type => :boolean
12
+ class_option :timestamps, :type => :boolean, :default => true
13
+ class_option :read_only, :type => :boolean, :default => false
14
+ class_option :modified_by, :type => :boolean, :default => false
15
+ class_option :singleton, :type => :boolean, :default => false
16
+ class_option :parent, :type => :string, :desc => "The parent class for the generated model"
18
17
 
19
18
  def create_model_file
20
19
  template 'Model.java', File.join(java_root, models_package.gsub(/\./, "/"), class_path, "#{class_name}.java")
21
20
  end
22
21
 
22
+ def create_event_files
23
+ template 'Event.java', File.join(java_root, events_package.gsub(/\./, "/"), class_path, "#{class_name}Event.java")
24
+ template 'EventHandler.java', File.join(java_root, events_package.gsub(/\./, "/"), class_path, "#{class_name}EventHandler.java")
25
+ end
26
+
23
27
  def create_rest_service_file
24
28
  template 'RestService.java', File.join(java_root, restservices_package.gsub(/\./, "/"), class_path, "#{controller_class_name}RestService.java")
25
29
  end
@@ -30,6 +34,11 @@ module Resty
30
34
  template 'ViewImpl.java', File.join(java_root, views_package.gsub(/\./, "/"), class_path, "#{class_name}ViewImpl.java")
31
35
  end
32
36
 
37
+ def create_editor_files
38
+ template 'Editor.java', File.join(java_root, editors_package.gsub(/\./, "/"), class_path, "#{class_name}Editor.java")
39
+ template 'Editor.ui.xml', File.join(java_root, editors_package.gsub(/\./, "/"), class_path, "#{class_name}Editor.ui.xml")
40
+ end
41
+
33
42
  def create_place_files
34
43
  template 'Place.java', File.join(java_root, places_package.gsub(/\./, "/"), class_path, "#{class_name}Place.java")
35
44
  template 'PlaceTokenizer.java', File.join(java_root, places_package.gsub(/\./, "/"), class_path, "#{class_name}PlaceTokenizer.java")
@@ -115,15 +124,21 @@ EOF
115
124
  end
116
125
 
117
126
  def actions
118
- if options[:singleton]
119
- keys = action_map.keys
120
- keys.delete('index')
121
- keys.delete('create')
122
- keys.delete('destroy')
123
- keys
124
- else
125
- action_map.keys
126
- end
127
+ @actions ||=
128
+ begin
129
+ keys = action_map.keys
130
+ if options[:singleton]
131
+ keys.delete('index')
132
+ keys.delete('create')
133
+ keys.delete('destroy')
134
+ end
135
+ if options[:read_only]
136
+ keys.delete('update')
137
+ keys.delete('create')
138
+ keys.delete('destroy')
139
+ end
140
+ keys
141
+ end
127
142
  end
128
143
  end
129
144
  end
@@ -179,8 +179,8 @@ resource :session do
179
179
  ROUTE
180
180
  gem 'ixtlan-session-timeout'
181
181
  gem 'ixtlan-guard'
182
- # TODO until rmvn uses the right openssl gem
183
- #gem "jruby-openssl", "~> 0.7.4", :platforms => :jruby
182
+ # needs to be in Gemfile to have jruby find the gem
183
+ gem "jruby-openssl", "~> 0.7.4", :platforms => :jruby
184
184
  end
185
185
  end
186
186
 
@@ -0,0 +1,31 @@
1
+ require 'generators/resty/base'
2
+ module Resty
3
+ module Generators
4
+ class SetupGenerator < Base
5
+
6
+ arguments.clear # clear name argument from NamedBase
7
+
8
+ argument :gwt_module_name, :type => :string, :required => true
9
+
10
+ def name
11
+ gwt_module_name
12
+ end
13
+
14
+ def create_module_file
15
+ template 'module.gwt.xml', File.join(java_root, name.gsub(/\./, "/"), "#{application_name.underscore}.gwt.xml")
16
+ end
17
+
18
+ def create_maven_file
19
+ template 'Mavenfile', File.join("Mavenfile")
20
+ end
21
+
22
+ def create_entry_point_file
23
+ template 'EntryPoint.java', File.join(java_root, base_package.gsub(/\./, "/"), "#{application_name}.java")
24
+ end
25
+
26
+ def base_package
27
+ name + ".client"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ package <%= base_package %>.managed;
2
+
3
+ import com.google.gwt.activity.shared.Activity;
4
+ import com.google.inject.name.Named;
5
+
6
+ public interface ActivityFactory {
7
+ }
@@ -25,5 +25,10 @@ public abstract class ActivityPlace<T> extends RestfulPlace<T> {
25
25
  super(id, restfulAction, name);
26
26
  }
27
27
 
28
+ protected ActivityPlace(int id, T model, RestfulAction restfulAction,
29
+ String name) {
30
+ super(id, model, restfulAction, name);
31
+ }
32
+
28
33
  public abstract Activity create(ActivityFactory factory);
29
34
  }
@@ -0,0 +1,8 @@
1
+ package de.mkristian.gwt.rails;
2
+
3
+ import org.dhamma.schedules.client.managed.ActivityFactory;
4
+
5
+ public abstract class ActivityPlace extends Place {
6
+
7
+ public abstract Activity create(ActivityFactory factory);
8
+ }
@@ -1,3 +1,4 @@
1
+
1
2
  package <%= base_package %>;
2
3
 
3
4
  import javax.inject.Inject;
@@ -27,7 +28,7 @@ public class BreadCrumbsPanel extends FlowPanel {
27
28
  @Inject
28
29
  public BreadCrumbsPanel(final SessionManager<User> sessionManager, final SessionRestService service,
29
30
  final Notice notice){
30
- setStyleName("rails-breadcrumbs");
31
+ setStyleName("gwt-rails-breadcrumbs");
31
32
  setVisible(false);
32
33
  sessionManager.addSessionHandler(new SessionHandler<User>() {
33
34
 
@@ -47,7 +48,7 @@ public class BreadCrumbsPanel extends FlowPanel {
47
48
  }
48
49
 
49
50
  public void login(User user) {
50
- setName(user.name);
51
+ setName(user.getName());
51
52
  }
52
53
 
53
54
  public void accessDenied() {
@@ -0,0 +1,79 @@
1
+ package org.dhamma.schedules.client;
2
+
3
+ import javax.inject.Inject;
4
+ import javax.inject.Singleton;
5
+
6
+ import org.dhamma.schedules.client.models.User;
7
+ import org.dhamma.schedules.client.restservices.SessionRestService;
8
+ import org.fusesource.restygwt.client.Method;
9
+ import org.fusesource.restygwt.client.MethodCallback;
10
+
11
+ import com.google.gwt.event.dom.client.ClickEvent;
12
+ import com.google.gwt.event.dom.client.ClickHandler;
13
+ import com.google.gwt.user.client.History;
14
+ import com.google.gwt.user.client.ui.Button;
15
+ import com.google.gwt.user.client.ui.FlowPanel;
16
+ import com.google.gwt.user.client.ui.Label;
17
+
18
+ import de.mkristian.gwt.rails.Notice;
19
+ import de.mkristian.gwt.rails.session.SessionHandler;
20
+ import de.mkristian.gwt.rails.session.SessionManager;
21
+
22
+ @Singleton
23
+ public class BreadCrumbsPanel extends FlowPanel {
24
+
25
+ private final Button logout;
26
+
27
+ @Inject
28
+ public BreadCrumbsPanel(final SessionManager<User> sessionManager, final SessionRestService service,
29
+ final Notice notice){
30
+ setVisible(false);
31
+ sessionManager.addSessionHandler(new SessionHandler<User>() {
32
+
33
+ public void timeout() {
34
+ notice.setText("timeout");
35
+ setName(null);
36
+ History.fireCurrentHistoryState();
37
+ }
38
+
39
+ public void logout() {
40
+ service.destroy(new MethodCallback<Void>() {
41
+ public void onSuccess(Method method, Void response) {
42
+ }
43
+ public void onFailure(Method method, Throwable exception) {
44
+ }
45
+ });
46
+ setName(null);
47
+ History.fireCurrentHistoryState();
48
+ }
49
+
50
+ public void login(User user) {
51
+ setName(user.name);
52
+ History.fireCurrentHistoryState();
53
+ }
54
+
55
+ public void accessDenied() {
56
+ notice.setText("access denied");
57
+ }
58
+ });
59
+ logout = new Button("logout");
60
+ logout.addClickHandler(new ClickHandler() {
61
+
62
+ public void onClick(ClickEvent event) {
63
+ sessionManager.logout();
64
+ }
65
+ });
66
+ }
67
+
68
+ private void setName(String name){
69
+ clear();
70
+ if(name != null){
71
+ add(new Label("Welcome " + name));
72
+ add(logout);
73
+ setVisible(true);
74
+ }
75
+ else {
76
+ setVisible(false);
77
+ }
78
+ }
79
+ }
@@ -0,0 +1,7 @@
1
+ package <%= base_package %>.managed;
2
+
3
+ import com.google.gwt.activity.shared.Activity;
4
+ import com.google.inject.name.Named;
5
+
6
+ public interface ActivityFactory {
7
+ }
@@ -0,0 +1,58 @@
1
+ package org.dhamma.schedules.client.activities;
2
+
3
+ import javax.inject.Inject;
4
+
5
+ import org.dhamma.schedules.client.models.User;
6
+ import org.dhamma.schedules.client.places.LoginPlace;
7
+ import org.dhamma.schedules.client.restservices.SessionRestService;
8
+ import org.fusesource.restygwt.client.Method;
9
+ import org.fusesource.restygwt.client.MethodCallback;
10
+
11
+ import com.google.gwt.activity.shared.AbstractActivity;
12
+ import com.google.gwt.core.client.GWT;
13
+ import com.google.gwt.event.shared.EventBus;
14
+ import com.google.gwt.user.client.ui.AcceptsOneWidget;
15
+ import com.google.inject.assistedinject.Assisted;
16
+
17
+ import de.mkristian.gwt.rails.session.Authentication;
18
+ import de.mkristian.gwt.rails.session.LoginView;
19
+ import de.mkristian.gwt.rails.session.Session;
20
+ import de.mkristian.gwt.rails.session.SessionManager;
21
+
22
+ public class LoginActivity extends AbstractActivity implements LoginView.Presenter{
23
+
24
+ private final SessionRestService service;
25
+ private final LoginView view;
26
+ private final SessionManager<User> sessionManager;
27
+
28
+ @Inject
29
+ public LoginActivity(@Assisted LoginPlace place,
30
+ LoginView view,
31
+ SessionRestService service,
32
+ SessionManager<User> sessionManager) {
33
+ this.view = view;
34
+ this.service = service;
35
+ this.sessionManager = sessionManager;
36
+ }
37
+
38
+ public void start(AcceptsOneWidget display, EventBus eventBus) {
39
+ display.setWidget(view.asWidget());
40
+ view.setPresenter(this);
41
+ }
42
+
43
+ public void login(final String login, String password) {
44
+ Authentication authentication = new Authentication(login, password);
45
+ service.create(authentication, new MethodCallback<Session<User>>() {
46
+
47
+ public void onSuccess(Method method, Session<User> session) {
48
+ GWT.log("logged in: " + login);
49
+ sessionManager.login(session);
50
+ }
51
+
52
+ public void onFailure(Method method, Throwable exception) {
53
+ GWT.log("login failed: " + exception.getMessage(), exception);
54
+ sessionManager.accessDenied();
55
+ }
56
+ });
57
+ }
58
+ }