resty-generators 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/lib/generators/resty/base.rb +33 -5
  2. data/lib/generators/resty/controller/controller_generator.rb +2 -2
  3. data/lib/generators/resty/model/model_generator.rb +1 -1
  4. data/lib/generators/resty/scaffold/scaffold_generator.rb +76 -4
  5. data/lib/generators/resty/setup/setup_generator.rb +141 -4
  6. data/lib/generators/resty/setup/templates/ActivityFactory.java +12 -0
  7. data/lib/generators/resty/setup/templates/ActivityPlace.java +25 -0
  8. data/lib/generators/resty/setup/templates/ActivityPlaceActivityMapper.java +30 -0
  9. data/lib/generators/resty/setup/templates/BreadCrumbsPanel.java +80 -0
  10. data/lib/generators/resty/setup/templates/EntryPoint.java +75 -4
  11. data/lib/generators/resty/setup/templates/GinModule.java +40 -0
  12. data/lib/generators/resty/setup/templates/LoginActivity.java +59 -0
  13. data/lib/generators/resty/setup/templates/LoginPlace.java +20 -0
  14. data/lib/generators/resty/setup/templates/LoginView.ui.xml +18 -0
  15. data/lib/generators/resty/setup/templates/LoginViewImpl.java +21 -0
  16. data/lib/generators/resty/setup/templates/Mavenfile +7 -4
  17. data/lib/generators/resty/setup/templates/PlaceHistoryMapper.java +8 -0
  18. data/lib/generators/resty/setup/templates/RestfulPlace.java +24 -0
  19. data/lib/generators/resty/setup/templates/SessionActivityPlaceActivityMapper.java +71 -0
  20. data/lib/generators/resty/setup/templates/SessionRestService.java +23 -0
  21. data/lib/generators/resty/setup/templates/User.java +8 -0
  22. data/lib/generators/resty/setup/templates/authentication.rb +3 -0
  23. data/lib/generators/resty/setup/templates/empty.css +17 -0
  24. data/lib/generators/resty/setup/templates/gitignore +3 -0
  25. data/lib/generators/resty/setup/templates/group.rb +14 -0
  26. data/lib/generators/resty/setup/templates/gwt.css +17 -0
  27. data/lib/generators/resty/setup/templates/module.gwt.xml +9 -2
  28. data/lib/generators/resty/setup/templates/page.html +1 -1
  29. data/lib/generators/resty/setup/templates/session.rb +45 -0
  30. data/lib/generators/resty/setup/templates/sessions_controller.rb +29 -0
  31. data/lib/generators/resty/setup/templates/user.rb +28 -0
  32. data/lib/generators/resty/setup/templates/web.xml +50 -0
  33. data/lib/generators/resty/templates/Activity.java +140 -0
  34. data/lib/generators/resty/templates/ColumnDefinitionsImpl.java +24 -0
  35. data/lib/generators/resty/templates/Model.java +13 -7
  36. data/lib/generators/resty/templates/Place.java +27 -0
  37. data/lib/generators/resty/templates/PlaceTokenizer.java +25 -0
  38. data/lib/generators/resty/templates/{Controller.java → RestService.java} +16 -12
  39. data/lib/generators/resty/templates/View.java +35 -0
  40. data/lib/generators/resty/templates/View.ui.xml +47 -0
  41. data/lib/generators/resty/templates/ViewImpl.java +196 -0
  42. data/lib/resty-generators.rb +1 -0
  43. data/lib/resty/child_path.rb +17 -4
  44. data/lib/resty/resty_railtie.rb +4 -5
  45. metadata +70 -60
@@ -0,0 +1,25 @@
1
+ package <%= places_package %>;
2
+
3
+ import com.google.gwt.place.shared.PlaceTokenizer;
4
+ import com.google.gwt.place.shared.Prefix;
5
+
6
+ import <%= gwt_rails_package %>.RestfulPlaceTokenizer;
7
+
8
+ @Prefix("<% if options[:singleton] -%><%= singular_table_name %><% else -%><%= table_name %><% end -%>")
9
+ public class <%= class_name %>PlaceTokenizer extends RestfulPlaceTokenizer<<%= class_name %>Place>
10
+ implements PlaceTokenizer<<%= class_name %>Place> {
11
+
12
+ public <%= class_name %>Place getPlace(String token) {
13
+ <% if options[:singleton] -%>
14
+ return new <%= class_name %>Place(toSingletonToken(token).action);
15
+ <% else -%>
16
+ Token t = toToken(token);
17
+ if(t.identifier == null){
18
+ return new <%= class_name %>Place(t.action);
19
+ }
20
+ else {
21
+ return new <%= class_name %>Place(t.identifier, t.action);
22
+ }
23
+ <% end -%>
24
+ }
25
+ }
@@ -1,5 +1,6 @@
1
- package <%= controllers_base_package %>;
1
+ package <%= restservices_package %>;
2
2
 
3
+ import <%= gwt_rails_package %>.RestfulDispatcherSingleton;
3
4
  <% if action_map.values.member? :get_all -%>
4
5
  import java.util.List;
5
6
  <% end -%>
@@ -7,43 +8,46 @@ import java.util.List;
7
8
  import javax.ws.rs.*;
8
9
 
9
10
  import org.fusesource.restygwt.client.*;
11
+ import org.fusesource.restygwt.client.dispatcher.DefaultDispatcher;
10
12
 
11
13
  <% if name -%>
12
- import <%= models_base_package %>.*;
14
+ import <%= models_package %>.*;
13
15
  <% end -%>
14
16
 
15
- @Path("/<%= table_name %><%= options[:singleton] ? '.json' : '' %>")
16
- public interface <%= controller_class_name %>Controller extends RestService {
17
+ <% if options[:singleton] -%>@Path("/<%= singular_table_name %>")<% end %>
18
+ @Options(dispatcher = RestfulDispatcherSingleton.class)
19
+ public interface <%= controller_class_name %>RestService extends RestService {
17
20
 
18
21
  <% actions.each do |action|
19
22
  case action_map[action]
20
23
  when :get_all -%>
21
- @GET @Path("/<%= table_name %>.json")
24
+ @GET @Path("/<%= table_name %>")
25
+ @Options(dispatcher = DefaultDispatcher.class)
22
26
  void <%= action %>(MethodCallback<List<<%= class_name %>>> callback);
23
27
 
24
- // @GET @Path("/<%= table_name %>.json")
28
+ // @GET @Path("/<%= table_name %>")
25
29
  // void <%= action %>(MethodCallback<List<<%= class_name %>>> callback, @QueryParam("limit") int limit, @QueryParam("offset") int offset);
26
30
  //
27
31
  <% when :get_single -%>
28
- @GET<% unless options[:singleton] -%> @Path("/<%= table_name %>/{id}.json")<% end %>
32
+ @GET<% unless options[:singleton] -%> @Path("/<%= table_name %>/{id}")<% end %>
29
33
  void <%= action %>(<% unless options[:singleton] -%>@PathParam("id") int id, <% end -%>MethodCallback<<%= class_name %>> callback);
30
34
 
31
35
  <% when :post -%>
32
- @POST @Path("/<%= table_name %>.json")
36
+ @POST @Path("/<%= table_name %>")
33
37
  void <%= action %>(<%= class_name %> value, MethodCallback<<%= class_name %>> callback);
34
38
 
35
39
  <% when :put -%>
36
- @PUT<% unless options[:singleton] -%> @Path("/<%= table_name %>/{id}.json")<% end %>
40
+ @PUT<% unless options[:singleton] -%> @Path("/<%= table_name %>/{id}")<% end %>
37
41
  void <%= action %>(<% unless options[:singleton] -%>@PathParam("id") @Attribute("id") <% end -%><%= class_name %> value, MethodCallback<<%= class_name %>> callback);
38
42
 
39
43
  <% when :delete -%>
40
- @DELETE @Path("/<%= table_name %>/{id}.json")
44
+ @DELETE @Path("/<%= table_name %>/{id}")
41
45
  void <%= action %>(@PathParam("id") @Attribute("id") <%= class_name %> value, MethodCallback<Void> callback);
42
46
 
43
47
  <% else -%>
44
- @GET @Path("/<%= table_name %>/<%= action %>.json")
48
+ @GET @Path("/<%= table_name %>/<%= action %>")
45
49
  void <%= action %>(MethodCallback<Void> callback);
46
50
 
47
51
  <% end
48
52
  end -%>
49
- }
53
+ }
@@ -0,0 +1,35 @@
1
+ package <%= views_package %>;
2
+
3
+ import java.util.List;
4
+
5
+ import <%= models_package %>.<%= class_name %>;
6
+
7
+ import com.google.gwt.place.shared.Place;
8
+ import com.google.gwt.user.client.ui.IsWidget;
9
+ import com.google.inject.ImplementedBy;
10
+
11
+ import <%= gwt_rails_package %>.RestfulAction;
12
+
13
+ @ImplementedBy(<%= class_name %>ViewImpl.class)
14
+ public interface <%= class_name %>View extends IsWidget {
15
+
16
+ public interface Presenter {
17
+ <% unless options[:singleton] -%>
18
+ void create();
19
+ <% end -%>
20
+ void save();
21
+ <% unless options[:singleton] -%>
22
+ void delete();
23
+ <% end -%>
24
+ void goTo(Place place);
25
+ }
26
+ void setPresenter(Presenter presenter);
27
+
28
+ void reset(<%= class_name %> model);
29
+
30
+ void reset(RestfulAction action);
31
+
32
+ void setEnabled(boolean enabled);
33
+
34
+ <%= class_name %> retrieve<%= class_name %>();
35
+ }
@@ -0,0 +1,47 @@
1
+ <!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
2
+ <ui:UiBinder
3
+ xmlns:ui="urn:ui:com.google.gwt.uibinder"
4
+ xmlns:g="urn:import:com.google.gwt.user.client.ui">
5
+
6
+ <ui:style>
7
+ .buttons {}
8
+ .signatur { float: left; }
9
+ .signatur * { display: inline; margin-right: 1em; font-size: 0.8em;}
10
+ .fields { clear: both;}
11
+ .field { }
12
+ </ui:style>
13
+
14
+ <g:FlowPanel>
15
+ <g:FlowPanel styleName="{style.buttons}">
16
+ <% unless options[:singleton] -%>
17
+ <g:Button ui:field="newButton">New</g:Button>
18
+ <g:Button ui:field="createButton">Create</g:Button>
19
+ <% end -%>
20
+ <g:Button ui:field="editButton">Edit</g:Button>
21
+ <g:Button ui:field="saveButton">Save</g:Button>
22
+ <% unless options[:singleton] -%>
23
+ <g:Button ui:field="deleteButton">Delete</g:Button>
24
+ <% end -%>
25
+ </g:FlowPanel>
26
+ <g:FlowPanel styleName="{style.signatur}">
27
+ <% unless options[:singleton] -%>
28
+ <g:Label ui:field="id" />
29
+ <% end -%>
30
+ <% if options[:timestamps] %>
31
+ <g:Label ui:field="createdAt" />
32
+ <g:Label ui:field="updatedAt" />
33
+ <% end -%>
34
+ </g:FlowPanel>
35
+ <g:FlowPanel styleName="{style.fields}">
36
+ <% for attribute in attributes -%>
37
+ <% if attribute.type != :has_one && attribute.type != :has_many -%>
38
+ <% name = attribute.name.classify.sub(/^(.)/){ $1.downcase } -%>
39
+ <g:FlowPanel styleName="{style.field}">
40
+ <g:HTML><label name="<%= name %>"><%= name.humanize %></label></g:HTML>
41
+ <g:TextBox ui:field="<%= name %>" name="<%= name %>"/>
42
+ </g:FlowPanel>
43
+ <% end -%>
44
+ <% end -%>
45
+ </g:FlowPanel>
46
+ </g:FlowPanel>
47
+ </ui:UiBinder>
@@ -0,0 +1,196 @@
1
+ package <%= views_package %>;
2
+
3
+ <% if options[:timestamps] %>
4
+ import java.util.Date;
5
+ <% end -%>
6
+
7
+ import <%= gwt_rails_package %>.RestfulAction;
8
+ import <%= gwt_rails_package %>.RestfulActionEnum;
9
+
10
+ import <%= models_package %>.<%= class_name %>;
11
+ import <%= places_package %>.<%= class_name %>Place;
12
+
13
+ import com.google.gwt.core.client.GWT;
14
+ import com.google.gwt.event.dom.client.ClickEvent;
15
+ <% if options[:timestamps] %>
16
+ import com.google.gwt.i18n.client.DateTimeFormat;
17
+ import com.google.gwt.i18n.client.DateTimeFormat.PredefinedFormat;
18
+ <% end -%>
19
+ import com.google.gwt.uibinder.client.UiBinder;
20
+ import com.google.gwt.uibinder.client.UiField;
21
+ import com.google.gwt.uibinder.client.UiHandler;
22
+ import com.google.gwt.uibinder.client.UiTemplate;
23
+ import com.google.gwt.user.client.ui.*;
24
+ import com.google.inject.Singleton;
25
+
26
+ @Singleton
27
+ public class <%= class_name %>ViewImpl extends Composite
28
+ implements <%= class_name %>View {
29
+
30
+ @UiTemplate("<%= class_name %>View.ui.xml")
31
+ interface <%= class_name %>ViewUiBinder extends UiBinder<Widget, <%= class_name %>ViewImpl> {}
32
+
33
+ private static <%= class_name %>ViewUiBinder uiBinder = GWT.create(<%= class_name %>ViewUiBinder.class);
34
+
35
+ <% unless options[:singleton] -%>
36
+ @UiField
37
+ Button newButton;
38
+
39
+ @UiField
40
+ Button createButton;
41
+ <% end -%>
42
+ @UiField
43
+ Button editButton;
44
+
45
+ @UiField
46
+ Button saveButton;
47
+ <% unless options[:singleton] -%>
48
+ @UiField
49
+ Button deleteButton;
50
+
51
+ @UiField
52
+ Label id;
53
+
54
+ <% end -%>
55
+ <% if options[:timestamps] %>
56
+ @UiField
57
+ Label createdAt;
58
+
59
+ @UiField
60
+ Label updatedAt;
61
+
62
+ <% end -%>
63
+ <% for attribute in attributes -%>
64
+ <% if attribute.type == :has_one -%>
65
+ // TODO <%= attribute.name.classify %> <%= attribute.name %>;
66
+ <% elsif attribute.type == :has_many -%>
67
+ // TODO public java.util.List<<%= attribute.name.classify %>> <%= attribute.name %>;
68
+ <% else -%>
69
+ @UiField
70
+ TextBox <%= attribute.name.classify.sub(/^(.)/){ $1.downcase } %>;
71
+ <% end -%>
72
+
73
+ <% end -%>
74
+
75
+ private Presenter presenter;
76
+
77
+ <% unless options[:singleton] -%>
78
+ private int idCache;
79
+
80
+ <% end -%>
81
+ <% if options[:timestamps] %>
82
+ private Date createdAtCache;
83
+ private Date updatedAtCache;
84
+
85
+ <% end -%>
86
+ public <%= class_name %>ViewImpl() {
87
+ initWidget(uiBinder.createAndBindUi(this));
88
+ }
89
+ <% unless options[:singleton] -%>
90
+ @UiHandler("newButton")
91
+ void onClickNew(ClickEvent e) {
92
+ presenter.goTo(new <%= class_name %>Place(RestfulActionEnum.NEW));
93
+ }
94
+
95
+ @UiHandler("createButton")
96
+ void onClickCreate(ClickEvent e) {
97
+ presenter.create();
98
+ }
99
+ <% end -%>
100
+ @UiHandler("editButton")
101
+ void onClickEdit(ClickEvent e) {
102
+ presenter.goTo(new <%= class_name %>Place(<% unless options[:singleton] -%>idCache, <% end -%>RestfulActionEnum.EDIT));
103
+ }
104
+
105
+ @UiHandler("saveButton")
106
+ void onClickSave(ClickEvent e) {
107
+ presenter.save();
108
+ }
109
+ <% unless options[:singleton] -%>
110
+ @UiHandler("deleteButton")
111
+ void onClickDelete(ClickEvent e) {
112
+ presenter.delete();
113
+ }
114
+ <% end -%>
115
+ public void setPresenter(Presenter presenter) {
116
+ this.presenter = presenter;
117
+ }
118
+
119
+ public void reset(<%= class_name %> model) {
120
+ <% if options[:singleton] -%>
121
+ //TODO singleton support
122
+ <% else -%>
123
+ if(model.id > 0){
124
+ id.setText("id: " + model.id);
125
+ <% if options[:timestamps] %>
126
+ createdAt.setText("created at: "
127
+ + DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_MEDIUM).format(model.created_at));
128
+ updatedAt.setText("updated at: "
129
+ + DateTimeFormat.getFormat(PredefinedFormat.DATE_TIME_MEDIUM).format(model.updated_at));
130
+ <% end -%>
131
+ }
132
+ else {
133
+ id.setText(null);
134
+ <% if options[:timestamps] %>
135
+ createdAt.setText(null);
136
+ updatedAt.setText(null);
137
+ <% end -%>
138
+ }
139
+ this.idCache = model.id;
140
+ <% if options[:timestamps] %>
141
+ this.createdAtCache = model.created_at;
142
+ this.updatedAtCache = model.updated_at;
143
+ <% end -%>
144
+ <% end -%>
145
+ <% for attribute in attributes -%>
146
+ <% if attribute.type != :has_one && attribute.type != :has_many -%>
147
+ <% name = attribute.name.classify.sub(/^(.)/){ $1.downcase } -%>
148
+ <% field_name = attribute.name.classify.underscore.sub(/^(.)/){ $1.downcase } -%>
149
+ <%= name %>.setText(model.<%= field_name %><% if type_conversion_map[attribute.type] -%> + ""<% end -%>);
150
+ <% end -%>
151
+ <% end -%>
152
+ }
153
+
154
+ public void reset(RestfulAction action) {
155
+ GWT.log(action.name() + " <%= class_name %>"<% unless options[:singleton] -%> + (idCache > 0 ? "(" + id + ")" : "")<% end -%>);
156
+ <% unless options[:singleton] -%>
157
+ newButton.setVisible(!action.name().equals(RestfulActionEnum.NEW.name()));
158
+ createButton.setVisible(action.name().equals(RestfulActionEnum.NEW.name()));
159
+ <% end -%>
160
+ editButton.setVisible(action.name().equals(RestfulActionEnum.SHOW.name()));
161
+ saveButton.setVisible(action.name().equals(RestfulActionEnum.EDIT.name()));
162
+ <% unless options[:singleton] -%>
163
+ deleteButton.setVisible(!action.name().equals(RestfulActionEnum.NEW.name()));
164
+ <% end -%>
165
+ setEnabled(!action.viewOnly());
166
+ }
167
+
168
+ public <%= class_name %> retrieve<%= class_name %>() {
169
+ <%= class_name %> model = new <%= class_name %>();
170
+ <% unless options[:singleton] -%>
171
+ model.id = idCache;
172
+ <% end -%>
173
+ <% if options[:timestamps] %>
174
+ model.created_at = createdAtCache;
175
+ model.updated_at = updatedAtCache;
176
+ <% end -%>
177
+
178
+ <% for attribute in attributes -%>
179
+ <% if attribute.type != :has_one && attribute.type != :has_many -%>
180
+ <% name = attribute.name.classify.sub(/^(.)/){ $1.downcase } -%>
181
+ model.<%= attribute.name.classify.underscore.sub(/^(.)/){ $1.downcase } %> = <% if (conv = type_conversion_map[attribute.type]).nil? -%><%= name %>.getText()<% else -%><%= conv %>(<%= name %>.getText())<% end -%>;
182
+ <% end -%>
183
+
184
+ <% end -%>
185
+ return model;
186
+ }
187
+
188
+ public void setEnabled(boolean enabled) {
189
+ <% for attribute in attributes -%>
190
+ <% if attribute.type != :has_one && attribute.type != :has_many -%>
191
+ <% name = attribute.name.classify.sub(/^(.)/){ $1.downcase } -%>
192
+ <%= name %>.setEnabled(enabled);
193
+ <% end -%>
194
+ <% end -%>
195
+ }
196
+ }
@@ -1,3 +1,4 @@
1
1
  if defined?(Rails)
2
2
  require 'resty/resty_railtie'
3
+ require 'ixtlan-core'
3
4
  end
@@ -6,13 +6,26 @@ module Resty
6
6
  end
7
7
 
8
8
  def call(env)
9
+ is_json = (env['CONTENT_TYPE'] || env['HTTP_ACCEPT']) =~ /^application\/json/
10
+ is_child = false
9
11
  ['REQUEST_PATH','PATH_INFO','REQUEST_URI','SCRIPT_NAME'].each do |key|
10
- if(env[key] =~ /\.json([?].*)?$/)
11
- env[key].gsub!(/^\/#{@rootpath}\//, "/")
12
+ if(is_json || env[key] =~ /\.json([?].*)?$/)
13
+ is_json = true
14
+ value = env[key]
15
+ if value
16
+ is_child = is_child || value =~ /^\/#{@rootpath}\//
17
+ value.gsub!(/^\/#{@rootpath}\//, "/")
18
+ end
12
19
  end
13
20
  end
14
- @app.call(env)
21
+ status, headers, response = @app.call(env)
22
+ if is_child && headers['Location']
23
+ uri = URI(headers['Location'])
24
+ uri.path.gsub!(/^\//, "/#{@rootpath}/")
25
+ headers['Location'] = uri.to_s
26
+ end
27
+ headers['Content-Type'] = 'application/json' if is_json
28
+ [status, headers, response]
15
29
  end
16
-
17
30
  end
18
31
  end
@@ -10,7 +10,6 @@ module Resty
10
10
  Rails::Generators::ControllerGenerator.hook_for :resty, :type => :boolean, :default => true do |controller|
11
11
  invoke controller, [ class_name, actions ]
12
12
  end
13
- #Erb::Generators::ScaffoldGenerator.source_paths.insert(0, File.expand_path('../../generators/ixtlan/templates', __FILE__))
14
13
  end
15
14
 
16
15
  config.after_initialize do
@@ -21,22 +20,22 @@ module Resty
21
20
  # get the time/date format right ;-) and match it with resty
22
21
  class DateTime
23
22
  def as_json(options = nil)
24
- strftime('%Y-%m-%dT%H:%M:%S.%s%z')
23
+ strftime('%Y-%m-%dT%H:%M:%S.%N%z')
25
24
  end
26
25
  end
27
26
  class ActiveSupport::TimeWithZone
28
27
  def as_json(options = nil)
29
- strftime('%Y-%m-%dT%H:%M:%S.%s%z')
28
+ strftime('%Y-%m-%dT%H:%M:%S.%N%z')
30
29
  end
31
30
  end
32
31
  class Date
33
32
  def as_json(options = nil)
34
- strftime('%Y-%m-%dT%H:%M:%S.%s%z')
33
+ strftime('%Y-%m-%dT%H:%M:%S.%N%z')
35
34
  end
36
35
  end
37
36
  class Time
38
37
  def as_json(options = nil)
39
- strftime('%Y-%m-%dT%H:%M:%S.%s%z')
38
+ strftime('%Y-%m-%dT%H:%M:%S.%N%z')
40
39
  end
41
40
  end
42
41
  end