vraptor-scaffold 1.2.3 → 1.3.0.rc

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. data/CHANGELOG.rdoc +7 -0
  2. data/Gemfile.lock +1 -1
  3. data/README.textile +1 -0
  4. data/lib/vraptor-scaffold/execution.rb +9 -8
  5. data/lib/vraptor-scaffold/generators/app/app_generator.rb +51 -9
  6. data/lib/vraptor-scaffold/generators/app/dependency_manager.rb +38 -9
  7. data/lib/vraptor-scaffold/generators/app/templates/build.xml +146 -146
  8. data/lib/vraptor-scaffold/generators/app/templates/eclipse/classpath-gae.erb +15 -0
  9. data/lib/vraptor-scaffold/generators/app/templates/eclipse/project-gae.erb +47 -0
  10. data/lib/vraptor-scaffold/generators/app/templates/eclipse/settings-gae/com.google.gdt.eclipse.core.prefs +5 -0
  11. data/lib/vraptor-scaffold/generators/app/templates/eclipse/settings-gae/org.eclipse.jdt.core.prefs +8 -0
  12. data/lib/vraptor-scaffold/generators/app/templates/eclipse/settings-gae/org.eclipse.wst.common.component.tt +10 -0
  13. data/lib/vraptor-scaffold/generators/app/templates/eclipse/settings-gae/org.eclipse.wst.common.project.facet.core.xml +9 -0
  14. data/lib/vraptor-scaffold/generators/app/templates/eclipse/settings-gae/org.eclipse.wst.jsdt.ui.superType.container +1 -0
  15. data/lib/vraptor-scaffold/generators/app/templates/eclipse/settings-gae/org.eclipse.wst.jsdt.ui.superType.name +1 -0
  16. data/lib/vraptor-scaffold/generators/app/templates/gae/ObjectifyFactory.java.tt +30 -0
  17. data/lib/vraptor-scaffold/generators/app/templates/gae/appengine-web.xml.tt +13 -0
  18. data/lib/vraptor-scaffold/generators/app/templates/gae/ivysettings.xml +10 -0
  19. data/lib/vraptor-scaffold/generators/app/templates/gae/logging.properties +28 -0
  20. data/lib/vraptor-scaffold/generators/app/templates/orm/Repository-objectify.java.tt +41 -0
  21. data/lib/vraptor-scaffold/generators/app/templates/vraptor-scaffold.erb +1 -1
  22. data/lib/vraptor-scaffold/generators/app/templates/webapp/WEB-INF/web.xml.tt +2 -2
  23. data/lib/vraptor-scaffold/generators/scaffold/attribute.rb +1 -1
  24. data/lib/vraptor-scaffold/generators/scaffold/base_scaffold.rb +7 -1
  25. data/lib/vraptor-scaffold/generators/scaffold/controller_generator/controller_generator.rb +10 -5
  26. data/lib/vraptor-scaffold/generators/scaffold/model_generator/model_generator.rb +10 -4
  27. data/lib/vraptor-scaffold/generators/scaffold/model_generator/objectify_model_generator.rb +20 -0
  28. data/lib/vraptor-scaffold/generators/scaffold/model_generator/templates/objectify_model.erb +33 -0
  29. data/lib/vraptor-scaffold/generators/scaffold/repository_generator/objectify_repository_generator.rb +25 -0
  30. data/lib/vraptor-scaffold/generators/scaffold/repository_generator/repository_generator.rb +9 -4
  31. data/lib/vraptor-scaffold/generators/scaffold/repository_generator/templates/objectify_repository.erb +22 -0
  32. data/lib/vraptor-scaffold/generators/scaffold/repository_generator/templates/objectify_repository_impl.erb +16 -0
  33. data/lib/vraptor-scaffold/generators/scaffold/scaffold_generator.rb +10 -3
  34. data/lib/vraptor-scaffold/generators/scaffold/template_engine_generator/freemarker_generator/freemarker_generator.rb +5 -4
  35. data/lib/vraptor-scaffold/generators/scaffold/template_engine_generator/jsp_generator/jsp_generator.rb +5 -4
  36. data/lib/vraptor-scaffold/generators/scaffold/template_engine_generator/template_engine_generator.rb +7 -1
  37. data/lib/vraptor-scaffold/load_paths.rb +3 -1
  38. data/lib/vraptor-scaffold/runner.rb +1 -0
  39. data/lib/vraptor-scaffold/runner/start.rb +29 -0
  40. data/lib/vraptor-scaffold/version.rb +1 -1
  41. data/maven/repo/br/com/caelum/vraptor-gae/1.0/vraptor-gae-1.0.jar +0 -0
  42. data/spec/resources/vraptor-scaffold-objectify.properties +7 -0
  43. data/spec/spec_helper.rb +5 -0
  44. data/spec/vraptor-scaffold/configuration_spec.rb +3 -0
  45. data/spec/vraptor-scaffold/execution_spec.rb +5 -1
  46. data/spec/vraptor-scaffold/generators/app/app_generator_spec.rb +77 -2
  47. data/spec/vraptor-scaffold/generators/app/dependency_manager_spec.rb +18 -3
  48. data/spec/vraptor-scaffold/generators/app/templates/ObjectifyFactory.java +30 -0
  49. data/spec/vraptor-scaffold/generators/app/templates/{Repository.java → RepositoryJPA.java} +0 -0
  50. data/spec/vraptor-scaffold/generators/app/templates/RepositoryObjectify.java +41 -0
  51. data/spec/vraptor-scaffold/generators/app/templates/build.gradle +1 -1
  52. data/spec/vraptor-scaffold/generators/app/templates/build.xml +146 -0
  53. data/spec/vraptor-scaffold/generators/app/templates/classpath-gae +18 -0
  54. data/spec/vraptor-scaffold/generators/app/templates/freemarker-web.xml +1 -1
  55. data/spec/vraptor-scaffold/generators/app/templates/gae-jsp-web.xml +45 -0
  56. data/spec/vraptor-scaffold/generators/app/templates/ivy-gae.xml +45 -0
  57. data/spec/vraptor-scaffold/generators/app/templates/ivy.xml +1 -1
  58. data/spec/vraptor-scaffold/generators/app/templates/jsp-web.xml +1 -1
  59. data/spec/vraptor-scaffold/generators/app/templates/pom-heroku.xml +5 -5
  60. data/spec/vraptor-scaffold/generators/app/templates/pom.xml +5 -5
  61. data/spec/vraptor-scaffold/generators/app/templates/project-gae +47 -0
  62. data/spec/vraptor-scaffold/generators/plugin/expected_configs/build.gradle +1 -1
  63. data/spec/vraptor-scaffold/generators/plugin/expected_configs/default_org_build.gradle +1 -1
  64. data/spec/vraptor-scaffold/generators/plugin/expected_configs/default_org_ivy.xml +1 -1
  65. data/spec/vraptor-scaffold/generators/plugin/expected_configs/default_org_pom.xml +5 -5
  66. data/spec/vraptor-scaffold/generators/plugin/expected_configs/ivy.xml +1 -1
  67. data/spec/vraptor-scaffold/generators/plugin/expected_configs/pom.xml +5 -5
  68. data/spec/vraptor-scaffold/generators/scaffold/attribute_spec.rb +5 -1
  69. data/spec/vraptor-scaffold/generators/scaffold/controller_generator/controller_generator_spec.rb +6 -2
  70. data/spec/vraptor-scaffold/generators/scaffold/freemarker_generator/freemarker_generator_spec.rb +4 -0
  71. data/spec/vraptor-scaffold/generators/scaffold/jsp_generator/jsp_generator_spec.rb +4 -0
  72. data/spec/vraptor-scaffold/generators/scaffold/model_generator/model_generator_spec.rb +4 -0
  73. data/spec/vraptor-scaffold/generators/scaffold/model_generator/objectify_model_generator_spec.rb +40 -0
  74. data/spec/vraptor-scaffold/generators/scaffold/model_generator/templates/ObjectifyFactory.java +33 -0
  75. data/spec/vraptor-scaffold/generators/scaffold/model_generator/templates/Objectify_Product.java +38 -0
  76. data/spec/vraptor-scaffold/generators/scaffold/repository_generator/objectify_repository_generator_spec.rb +33 -0
  77. data/spec/vraptor-scaffold/generators/scaffold/repository_generator/repository_generator_spec.rb +12 -4
  78. data/spec/vraptor-scaffold/generators/scaffold/repository_generator/templates/Objectify_ProductRepository.java +22 -0
  79. data/spec/vraptor-scaffold/generators/scaffold/repository_generator/templates/Objectify_ProductRepositoryImpl.java +16 -0
  80. data/spec/vraptor-scaffold/generators/scaffold/scaffold_generator_spec.rb +14 -1
  81. data/spec/vraptor-scaffold/runner/scaffold_spec.rb +5 -5
  82. data/spec/vraptor-scaffold/runner/start_spec.rb +51 -0
  83. metadata +54 -19
@@ -0,0 +1,22 @@
1
+ package <%= Configuration.package %>.<%= Configuration.repositories_package %>;
2
+
3
+ import java.util.List;
4
+
5
+ import <%= Configuration.full_models_package %>.<%= class_name %>;
6
+
7
+ public interface <%= repository_interface_name %> {
8
+ /*
9
+ * Delete the methods you don't want to expose
10
+ */
11
+
12
+ void create(<%= class_name %> entity);
13
+
14
+ void update(<%= class_name %> entity);
15
+
16
+ void destroy(<%= class_name %> entity);
17
+
18
+ <%= class_name %> find(Long id);
19
+
20
+ List<<%= class_name %>> findAll();
21
+
22
+ }
@@ -0,0 +1,16 @@
1
+ package <%= Configuration.package %>.<%= Configuration.repositories_package %>;
2
+
3
+ import <%= orm_import %>;
4
+
5
+ import br.com.caelum.vraptor.ioc.Component;
6
+ import <%= Configuration.full_models_package %>.<%= class_name %>;
7
+
8
+ @Component
9
+ public class <%= repository_impl_name %>
10
+ extends Repository<<%= class_name %>>
11
+ implements <%= repository_interface_name %> {
12
+
13
+ <%= repository_impl_name %>(<%= orm_class %> <%= orm_parameter_name %>) {
14
+ super(<%= orm_parameter_name %>);
15
+ }
16
+ }
@@ -2,7 +2,8 @@ class ScaffoldGenerator < VraptorScaffold::Base
2
2
 
3
3
  attr_accessor :generated_attributes
4
4
  argument :model
5
- argument :attributes, :type => :hash, :default => {}, :banner => "field:type field:type"
5
+ argument :attributes, :type => :hash, :default => {}, :banner => "field:type field:type"
6
+
6
7
 
7
8
  def self.banner
8
9
  "vraptor scaffold #{self.arguments.map(&:usage).join(' ')}"
@@ -21,11 +22,17 @@ class ScaffoldGenerator < VraptorScaffold::Base
21
22
  end
22
23
 
23
24
  def model_generator
24
- ModelGenerator.new(model, @generated_attributes).build
25
+ models_generator_available = {"jpa" => ModelGenerator,
26
+ "hibernate" => ModelGenerator,
27
+ "objectify" => ObjectifyModelGenerator }
28
+ models_generator_available.fetch(Configuration.orm).new(model, @generated_attributes).build
25
29
  end
26
30
 
27
31
  def repository_generator
28
- RepositoryGenerator.new(model, @generated_attributes).build
32
+ repository_generators_available = {"jpa" => RepositoryGenerator,
33
+ "hibernate" => RepositoryGenerator,
34
+ "objectify" => ObjectifyRepositoryGenerator }
35
+ repository_generators_available.fetch(Configuration.orm).new(model, @generated_attributes).build
29
36
  end
30
37
 
31
38
  def template_engine_generator
@@ -1,9 +1,5 @@
1
1
  class FreemarkerGenerator < TemplateEngineGenerator
2
2
 
3
- def self.source_root
4
- File.dirname(__FILE__)
5
- end
6
-
7
3
  def view_folder
8
4
  "views"
9
5
  end
@@ -15,4 +11,9 @@ class FreemarkerGenerator < TemplateEngineGenerator
15
11
  def path
16
12
  "${base}/#{base_path}"
17
13
  end
14
+
15
+ def source_root
16
+ File.join File.dirname(__FILE__), "templates"
17
+ end
18
+
18
19
  end
@@ -1,9 +1,5 @@
1
1
  class JspGenerator < TemplateEngineGenerator
2
2
 
3
- def self.source_root
4
- File.dirname(__FILE__)
5
- end
6
-
7
3
  def view_folder
8
4
  "jsp"
9
5
  end
@@ -15,4 +11,9 @@ class JspGenerator < TemplateEngineGenerator
15
11
  def path url=""
16
12
  %Q{${pageContext.request.contextPath}/#{base_path}#{url}}
17
13
  end
14
+
15
+ def source_root
16
+ File.join File.dirname(__FILE__), "templates"
17
+ end
18
+
18
19
  end
@@ -1,6 +1,7 @@
1
1
  class TemplateEngineGenerator < BaseScaffold
2
2
 
3
3
  def build
4
+ define_source_paths
4
5
  create_view("index")
5
6
  create_view("show")
6
7
  create_view("form")
@@ -9,12 +10,17 @@ class TemplateEngineGenerator < BaseScaffold
9
10
  end
10
11
 
11
12
  def create_view(template_name, file_name=template_name)
12
- template("templates/#{template_name}.erb", "#{views_path}/#{file_name}.#{extension}")
13
+ template("#{template_name}.erb", "#{views_path}/#{file_name}.#{extension}")
13
14
  end
14
15
 
15
16
  def views_path
16
17
  File.join Configuration::WEB_INF, view_folder, model_parameter_name
17
18
  end
19
+
20
+ def template_path
21
+ "src/templates/views"
22
+ end
23
+
18
24
  end
19
25
 
20
26
  require File.dirname(__FILE__) + "/jsp_generator/jsp_generator"
@@ -9,6 +9,8 @@ require File.dirname(__FILE__) + '/generators/scaffold/attribute'
9
9
  require File.dirname(__FILE__) + '/generators/scaffold/scaffold_generator'
10
10
  require File.dirname(__FILE__) + '/generators/scaffold/base_scaffold'
11
11
  require File.dirname(__FILE__) + '/generators/scaffold/model_generator/model_generator'
12
+ require File.dirname(__FILE__) + '/generators/scaffold/model_generator/objectify_model_generator'
12
13
  require File.dirname(__FILE__) + '/generators/scaffold/repository_generator/repository_generator'
14
+ require File.dirname(__FILE__) + '/generators/scaffold/repository_generator/objectify_repository_generator'
13
15
  require File.dirname(__FILE__) + '/generators/scaffold/controller_generator/controller_generator'
14
- require File.dirname(__FILE__) + '/generators/scaffold/template_engine_generator/template_engine_generator'
16
+ require File.dirname(__FILE__) + '/generators/scaffold/template_engine_generator/template_engine_generator'
@@ -9,3 +9,4 @@ require 'vraptor-scaffold/runner/generator'
9
9
  require 'vraptor-scaffold/runner/commands_help'
10
10
  require 'vraptor-scaffold/runner/plugin'
11
11
  require 'vraptor-scaffold/runner/configure'
12
+ require 'vraptor-scaffold/runner/start'
@@ -0,0 +1,29 @@
1
+ module VraptorScaffold
2
+ module Runner
3
+
4
+ class Start
5
+ def run(args)
6
+ validate
7
+ Kernel.system("ant compile")
8
+ Kernel.system("sh $APPENGINE_SDK_HOME/bin/dev_appserver.sh #{Configuration::WEB_APP}")
9
+ end
10
+
11
+ private
12
+
13
+ def validate
14
+ unless File.exist?("src")
15
+ Kernel.puts "To run vraptor start please go to the project root folder."
16
+ Kernel::exit
17
+ end
18
+ unless Configuration.orm == "objectify"
19
+ Kernel.puts "vraptor start command is available only for gae apps."
20
+ Kernel::exit
21
+ end
22
+ unless ENV['APPENGINE_SDK_HOME']
23
+ Kernel.puts "To run vraptor start, configure environment variable APPENGINE_SDK_HOME."
24
+ Kernel::exit
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,3 +1,3 @@
1
1
  module VraptorScaffold
2
- VERSION = "1.2.3"
2
+ VERSION = "1.3.0.rc"
3
3
  end
@@ -0,0 +1,7 @@
1
+ build_tool: mvn
2
+ package: app
3
+ template_engine: jsp
4
+ orm: objectify
5
+ models_package: model
6
+ controllers_package: controller
7
+ repositories_package: repository
data/spec/spec_helper.rb CHANGED
@@ -14,6 +14,11 @@ def mock_config_file
14
14
  Configuration.stub!(:config).and_return(file)
15
15
  end
16
16
 
17
+ def mock_objectify_config_file
18
+ file = YAML.load_file File.join( File.dirname(__FILE__), "resources", "vraptor-scaffold-objectify.properties")
19
+ Configuration.stub!(:config).and_return(file)
20
+ end
21
+
17
22
  def exists_and_identical?(source, created)
18
23
  c = File.open(created).read.gsub( /\r/m, "" )
19
24
  c2 = File.open(source).read.gsub( /\r/m, "" )
@@ -81,11 +81,13 @@ describe Configuration do
81
81
  Configuration.test_class_path("models", "Product.java").should == "src/test/java/br/com/caelum/models/Product.java"
82
82
  end
83
83
  end
84
+
84
85
  context "hibernate" do
85
86
  before(:each) do
86
87
  config = {"template_engine" => "jsp", "package" => "br.com.caelum", "orm" => "hibernate"}
87
88
  YAML.stub!(:load_file).with(Configuration::FILENAME).and_return(config)
88
89
  end
90
+
89
91
  it "should know orm" do
90
92
  Configuration.orm.should == "hibernate"
91
93
  end
@@ -94,6 +96,7 @@ describe Configuration do
94
96
  Configuration.hibernate?.should be_true
95
97
  end
96
98
  end
99
+
97
100
  context "properties without default configs" do
98
101
  before(:each) do
99
102
  config = {}
@@ -31,6 +31,10 @@ describe VraptorScaffold::Execution do
31
31
  @execution.runner_for("plugin").should == VraptorScaffold::Runner::Plugin
32
32
  end
33
33
 
34
+ it "should be start application when start action" do
35
+ @execution.runner_for("start").should == VraptorScaffold::Runner::Start
36
+ end
37
+
34
38
  it "should be commands help when scaffold when unknown action" do
35
39
  @execution.runner_for("xpto").should == VraptorScaffold::Runner::CommandsHelp
36
40
  end
@@ -44,4 +48,4 @@ describe VraptorScaffold::Execution do
44
48
  @execution.run(['new', 'app'])
45
49
  end
46
50
 
47
- end
51
+ end
@@ -74,7 +74,7 @@ describe AppGenerator do
74
74
  end
75
75
 
76
76
  it "should create generic repository" do
77
- source = File.join File.dirname(__FILE__), "templates", "Repository.java"
77
+ source = File.join File.dirname(__FILE__), "templates", "RepositoryJPA.java"
78
78
  destination = "#{@app}/repository/Repository.java"
79
79
  exists_and_identical?(source, destination)
80
80
  end
@@ -290,7 +290,7 @@ describe AppGenerator do
290
290
  end
291
291
 
292
292
  it "should create build.xml" do
293
- source = File.join AppGenerator.source_root, "build.xml"
293
+ source = File.join File.dirname(__FILE__), "templates", "build.xml"
294
294
  destination = "#{@project_path}/build.xml"
295
295
  exists_and_identical?(source, destination)
296
296
  end
@@ -441,6 +441,11 @@ describe AppGenerator do
441
441
  Kernel.should_receive(:exit)
442
442
  AppGenerator.new(@project_path, ["-j=1.x"])
443
443
  end
444
+
445
+ it "should be invalid when gae and heroku are selected" do
446
+ Kernel.should_receive(:exit)
447
+ AppGenerator.new(@project_path, ["-g", "-h"])
448
+ end
444
449
  end
445
450
 
446
451
  context "heroku app" do
@@ -468,4 +473,74 @@ describe AppGenerator do
468
473
  end
469
474
  end
470
475
 
476
+ context "gae app" do
477
+ before(:all) do
478
+ @project_path = "gae"
479
+ AppGenerator.new(@project_path, ["--gae"]).invoke_all
480
+ @main_java = "#{@project_path}/#{Configuration::MAIN_SRC}"
481
+ @app = "#{@main_java}/app"
482
+ end
483
+
484
+ after(:all) do
485
+ FileUtils.remove_dir(@project_path)
486
+ end
487
+
488
+ it "should create ivy.xml" do
489
+ source = File.join File.dirname(__FILE__), "templates", "ivy-gae.xml"
490
+ destination = "#{@project_path}/ivy.xml"
491
+ exists_and_identical?(source, destination)
492
+ end
493
+
494
+ it "should create ivysettings.xml" do
495
+ File.exist?("#{@project_path}/ivysettings.xml").should be_true
496
+ end
497
+
498
+ it "should not create generic entity" do
499
+ File.exist?("#{@app}/model/Entity.java").should be_false
500
+ end
501
+
502
+ it "should create appengine-web xml to run gae apps" do
503
+ File.exist?("#{@project_path}/#{Configuration::WEB_INF}/appengine-web.xml").should be_true
504
+ end
505
+
506
+ it "should create logging properties for gae apps" do
507
+ File.exist?("#{@project_path}/#{Configuration::WEB_INF}/logging.properties").should be_true
508
+ end
509
+
510
+ it "should create web.xml" do
511
+ source = File.join File.dirname(__FILE__), "templates", "gae-jsp-web.xml"
512
+ destination = "#{@project_path}/#{Configuration::WEB_INF}/web.xml"
513
+ exists_and_identical?(source, destination)
514
+ end
515
+
516
+ it "should generate a objectify repository" do
517
+ source = File.join File.dirname(__FILE__), "templates", "RepositoryObjectify.java"
518
+ destination = "#{@project_path}/#{Configuration::MAIN_SRC}/app/repositories/Repository.java"
519
+ exists_and_identical?(source, destination)
520
+ end
521
+
522
+ it "should generate a objectify resource factory" do
523
+ source = File.join File.dirname(__FILE__), "templates", "ObjectifyFactory.java"
524
+ destination = "#{@project_path}/#{Configuration::MAIN_SRC}/app/infra/ObjectifyFactory.java"
525
+ exists_and_identical?(source, destination)
526
+ end
527
+
528
+ it "should create a specific .classpath for gae" do
529
+ source = File.join File.dirname(__FILE__), "templates", "classpath-gae"
530
+ destination = "#{@project_path}/.classpath"
531
+ exists_and_identical?(source, destination)
532
+ end
533
+
534
+ it "should create a specific .project for gae" do
535
+ source = File.join File.dirname(__FILE__), "templates", "project-gae"
536
+ destination = "#{@project_path}/.project"
537
+ exists_and_identical?(source, destination)
538
+ end
539
+
540
+ it "should create .settings" do
541
+ settings = File.join @project_path, ".settings"
542
+ File.exist?(settings).should be_true
543
+ end
544
+ end
545
+
471
546
  end
@@ -1,19 +1,34 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + "/../../../spec_helper")
2
2
 
3
3
  describe DependencyManager do
4
-
4
+
5
5
  before(:each) do
6
6
  others_dependency = mock(Dependency)
7
7
  others_dependency.stub!(:exclusions).and_return([])
8
8
  Dependency.stub!(:new).and_return(others_dependency)
9
9
  @dependency = mock(Dependency)
10
10
  end
11
-
11
+
12
12
  context "compile scope" do
13
13
  it "should include freemarker dependency when template is freemarker" do
14
14
  options = {:template_engine => "ftl"}
15
15
  Dependency.stub!(:new).with("org.freemarker", "freemarker", "2.3.18").and_return(@dependency)
16
16
  DependencyManager.new(options).compile_scope.include?(@dependency).should be_true
17
17
  end
18
+
19
+ context "dependencies for a gae app" do
20
+ it "should include gae dependencies when gae project option is selected" do
21
+ options = {:gae => true}
22
+ Dependency.stub!(:new).with("com.googlecode.objectify", "objectify", "3.1").and_return(@dependency)
23
+ DependencyManager.new(options).compile_scope.include?(@dependency).should be_true
24
+ end
25
+
26
+ it "should not have hibernate persistence dependencies when gae project option is selected" do
27
+ options = {:gae => true}
28
+ Dependency.stub!(:new).with("org.hibernate", "hibernate-entitymanager", "3.6.7.Final").and_return(@dependency)
29
+ DependencyManager.new(options).compile_scope.include?(@dependency).should be_false
30
+ end
31
+ end
18
32
  end
19
- end
33
+
34
+ end
@@ -0,0 +1,30 @@
1
+ package app.infra;
2
+
3
+ import javax.annotation.PostConstruct;
4
+
5
+ import br.com.caelum.vraptor.ioc.Component;
6
+ import br.com.caelum.vraptor.ioc.ComponentFactory;
7
+ import br.com.caelum.vraptor.ioc.RequestScoped;
8
+
9
+ import com.googlecode.objectify.Objectify;
10
+ import com.googlecode.objectify.ObjectifyService;
11
+
12
+ @Component
13
+ @RequestScoped
14
+ public class ObjectifyFactory implements ComponentFactory<Objectify> {
15
+
16
+ private Objectify session;
17
+
18
+ static {
19
+ }
20
+
21
+ @PostConstruct
22
+ public void abreSession() {
23
+ session = ObjectifyService.begin();
24
+ }
25
+
26
+ @Override
27
+ public Objectify getInstance() {
28
+ return session;
29
+ }
30
+ }
@@ -0,0 +1,41 @@
1
+ package app.repositories;
2
+
3
+ import java.lang.reflect.ParameterizedType;
4
+ import java.util.List;
5
+
6
+ import com.googlecode.objectify.Objectify;
7
+
8
+ class Repository<T> {
9
+
10
+ protected final Objectify objectify;
11
+
12
+ public Repository(Objectify objectify) {
13
+ this.objectify = objectify;
14
+ }
15
+
16
+ public void create(T entity) {
17
+ objectify.put(entity);
18
+ }
19
+
20
+ public void update(T entity) {
21
+ objectify.put(entity);
22
+ }
23
+
24
+ public void destroy(T entity) {
25
+ objectify.delete(entity);
26
+ }
27
+
28
+ public T find(Long id) {
29
+ return objectify.get(getParameterizedClass(), id);
30
+ }
31
+
32
+ public List<T> findAll() {
33
+ return objectify.query(getParameterizedClass()).list();
34
+ }
35
+
36
+ @SuppressWarnings("unchecked")
37
+ private Class<T> getParameterizedClass() {
38
+ ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
39
+ return (Class<T>) parameterizedType.getActualTypeArguments()[0];
40
+ }
41
+ }