guff 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (36) hide show
  1. data/History.txt +4 -0
  2. data/License.txt +20 -0
  3. data/Manifest.txt +37 -21
  4. data/README.txt +1 -3
  5. data/Rakefile +3 -53
  6. data/config/hoe.rb +71 -0
  7. data/config/requirements.rb +17 -0
  8. data/lib/guff.rb +8 -2
  9. data/lib/guff/java_source.rb +167 -35
  10. data/lib/guff/version.rb +9 -9
  11. data/script/destroy +14 -0
  12. data/script/generate +14 -0
  13. data/script/txt2html +74 -0
  14. data/setup.rb +1585 -1585
  15. data/tasks/deployment.rake +34 -0
  16. data/tasks/environment.rake +7 -0
  17. data/tasks/website.rake +17 -0
  18. data/test/java_source/files/ClassWithConstructors.java +22 -0
  19. data/test/java_source/files/ClassWithFields.java +4 -0
  20. data/test/java_source/files/ClassWithImports.java +8 -0
  21. data/test/java_source/files/ClassWithMethods.java +5 -1
  22. data/test/java_source/files/GenericClass.java +3 -0
  23. data/test/java_source/{annotation_declaration_test.rb → test_annotation_declaration.rb} +0 -0
  24. data/test/java_source/{class_declaration_test.rb → test_class_declaration.rb} +20 -0
  25. data/test/java_source/{field_declaration_test.rb → test_field_declaration.rb} +1 -1
  26. data/test/java_source/test_helper.rb +0 -2
  27. data/test/java_source/test_import_declaration.rb +14 -0
  28. data/test/java_source/{method_declaration_test.rb → test_method_declaration.rb} +4 -2
  29. data/test/test_helper.rb +2 -1
  30. data/website/index.html +326 -0
  31. data/website/index.txt +240 -0
  32. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  33. data/website/stylesheets/screen.css +138 -0
  34. data/website/template.rhtml +48 -0
  35. metadata +82 -50
  36. data/CHANGELOG.txt +0 -0
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,22 @@
1
+ package guff.test;
2
+
3
+ public class ClassWithConstructors{
4
+ private int anIntField;
5
+ private String aStringField;
6
+
7
+ public ClassWithConstructors(int ignored) throws SomeWeirdException{
8
+ }
9
+
10
+ public ClassWithConstructors(java.util.Date ignored,boolean active){
11
+ super();
12
+ }
13
+
14
+ public ClassWithConstructors(int anIntField){
15
+ this.anIntField=anIntField;
16
+ }
17
+
18
+ public ClassWithConstructors(int anIntField,String aStringField){
19
+ this.anIntField=anIntField;
20
+ this.aStringField=aStringField;
21
+ }
22
+ }
@@ -4,6 +4,10 @@ public class ClassWithFields{
4
4
  private static final String name = "Fred";
5
5
  private long id = 0;
6
6
  private some.other.pkg.User user = new some.other.pkg.User(0,2);
7
+ /**
8
+ * This field has one line of javadoc
9
+ * And another line of javadoc too!
10
+ */
7
11
  int otherId;
8
12
  protected char c;
9
13
  public boolean flag = false;
@@ -0,0 +1,8 @@
1
+ package guff.test;
2
+
3
+ import java.util.List;
4
+ import static java.util.Collection.WHATEVER;
5
+ import some.pkg.SomeClass;
6
+
7
+ public class ClassWithImports{
8
+ }
@@ -2,10 +2,14 @@ package guff.test;
2
2
 
3
3
  public class ClassWithMethods{
4
4
 
5
- private static final String getName(){
5
+ private static final String getName() throws NullPointerException, java.lang.RuntimeException{
6
6
  return "Fred";
7
7
  }
8
8
 
9
+ /**
10
+ * This is some javadoc
11
+ * This is some more javadoc
12
+ */
9
13
  protected boolean isHappy(String name,pkg.Person p,pkg.Friend f){
10
14
  if(f.hasMoney()){
11
15
  if(p.hasHealth()){
@@ -1,4 +1,7 @@
1
1
  package guff.test;
2
2
 
3
+ /**
4
+ * This class has a line of javadoc. With a little follow on.
5
+ */
3
6
  public class GenericClass<T extends SomethingElse>{
4
7
  }
@@ -43,11 +43,31 @@ class ClassDeclarationTest < Test::Unit::TestCase
43
43
  source = new_source_file.package('guff.test')
44
44
  source.begin_class('GenericClass') {|c|
45
45
  c.genericized_using('<T extends SomethingElse>')
46
+ c.add_javadoc("This class has a line of javadoc. With a little follow on.")
46
47
  }
47
48
 
48
49
  assert_source_file_equals(source,prepared_file_for_tests('GenericClass'))
49
50
  end
50
51
 
52
+ def test_can_generate_a_class_with_constructors
53
+ source = new_source_file.package('guff.test')
54
+
55
+ source.begin_class('ClassWithConstructors') {|c|
56
+ c.add_field("anIntField",:int)
57
+ c.add_field("aStringField",:String)
58
+
59
+ c.add_constructor.taking("ignored","int").throws("SomeWeirdException").body {|body|
60
+ }
61
+ c.add_constructor.taking("ignored","java.util.Date").taking("active","boolean").body {|body|
62
+ body.line("super();")
63
+ }
64
+ c.add_constructor.for_field("anIntField")
65
+ c.add_constructor.for_fields("anIntField","aStringField")
66
+ }
67
+
68
+ assert_source_file_equals(source,prepared_file_for_tests('ClassWithConstructors'))
69
+ end
70
+
51
71
 
52
72
  def prepared_empty_class
53
73
  prepared_file_for_tests('EmptyClass')
@@ -9,7 +9,7 @@ class FieldDeclarationTest < Test::Unit::TestCase
9
9
  c.add_field('name',:String).static.final.initial('"Fred"')
10
10
  c.add_field('id',:long).initial('0')
11
11
  c.add_field('user','some.other.pkg.User').initial('new some.other.pkg.User(0,2)')
12
- c.add_field('otherId',:int).package_local
12
+ c.add_field('otherId',:int).package_local.add_javadoc('This field has one line of javadoc').add_javadoc('And another line of javadoc too!')
13
13
  c.add_field('c',:char).protected
14
14
  c.add_field('flag',:boolean).public.initial('false')
15
15
  }
@@ -76,5 +76,3 @@ module JavaSourceTestHelper
76
76
  end
77
77
  end
78
78
 
79
- require File.dirname(__FILE__) + '/../test_helper.rb'
80
- require File.dirname(__FILE__) + '/../../lib/guff/java_source.rb'
@@ -0,0 +1,14 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class ImportDeclarationTest < Test::Unit::TestCase
4
+ include JavaSourceTestHelper
5
+
6
+ def test_can_generate_an_empty_class
7
+ source = new_source_file.package('guff.test').import('java.util.List').import('static java.util.Collection.WHATEVER')
8
+ source.begin_class('ClassWithImports') { |c|
9
+ c.import('some.pkg.SomeClass').import('some.pkg.SomeClass')
10
+ }
11
+
12
+ assert_source_file_equals(source, prepared_file_for_tests('ClassWithImports'))
13
+ end
14
+ end
@@ -6,11 +6,13 @@ class MethodDeclarationTest < Test::Unit::TestCase
6
6
  def test_can_declare_methods
7
7
  source = new_source_file.package('guff.test')
8
8
  source.begin_class('ClassWithMethods') {|c|
9
- c.add_method("getName").private.static.final.returns(:String).body { |body|
9
+ c.add_method("getName").private.static.final.returns(:String).throws('NullPointerException').throws('java.lang.RuntimeException').body { |body|
10
10
  body.line('return "Fred";')
11
11
  }
12
12
 
13
- c.add_method('isHappy').protected.takes('name', :String).takes('p', 'pkg.Person').takes('f', 'pkg.Friend').returns(:boolean).body { |body|
13
+ method_builder = c.add_method('isHappy')
14
+ method_builder.add_javadoc("This is some javadoc").add_javadoc("This is some more javadoc")
15
+ method_builder.protected.takes('name', :String).takes('p', 'pkg.Person').takes('f', 'pkg.Friend').returns(:boolean).body { |body|
14
16
  body.append('if(f.hasMoney())').body { |nested|
15
17
  nested.append('if(p.hasHealth())').body { |nested2|
16
18
  nested2.line('return true;')
data/test/test_helper.rb CHANGED
@@ -1 +1,2 @@
1
- require 'test/unit'
1
+ require 'test/unit'
2
+ require File.dirname(__FILE__) + '/../lib/guff'
@@ -0,0 +1,326 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ Java Source Code Generator
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>Java Source Code Generator</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/guff"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/guff" class="numbers">0.0.4</a>
37
+ </div>
38
+ <h1>&#x2192; &#8216;guff&#8217;</h1>
39
+
40
+
41
+ <h2>What</h2>
42
+
43
+
44
+ <code>guff</code> is a ruby gem containing classes that let you produce nicely formatted Java code. Its intended to be used
45
+ by code generation scripts that eliminate a lot of the &#8216;guff&#8217; that often ends up being written on Java projects. One
46
+ example of this is the <a href="http://rubyforge.org/projects/jbuilder-guff">java_testing_guff</a> project, which generates java classes
47
+ that provide fluent interfaces to configure mock objects.
48
+
49
+ <h2>Installing</h2>
50
+
51
+
52
+ <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">guff</span></pre></p>
53
+
54
+
55
+ <h2>The basics</h2>
56
+
57
+
58
+ <code>guff</code> consists of classes that model a Java source file: SourceFile, Class, Constructor, Method, Field, Annotation etc.
59
+ You begin by constructing a SourceFile. Then, in a series of nested method calls, you can add the class, fields, method etc.
60
+ Finally you can tell the source file to save itself. All these classes live in the <code>Guff::JavaSource</code> module.
61
+
62
+ <h2>Generating a Java source file</h2>
63
+
64
+
65
+ <p>You begin by creating a new source file in a particular package:</p>
66
+
67
+
68
+ <p><pre class='syntax'>
69
+ <span class="ident">source</span><span class="punct">=</span><span class="constant">Guff</span><span class="punct">::</span><span class="constant">JavaSource</span><span class="punct">::</span><span class="constant">SourceFile</span><span class="punct">.</span><span class="ident">new</span><span class="punct">.</span><span class="ident">package</span><span class="punct">('</span><span class="string">guff.test</span><span class="punct">')</span>
70
+ </pre></p>
71
+
72
+
73
+ <p>You may add some import statements if you need. Import statements can be added later in your code generation script
74
+ if you do not know all your imports at this stage. Its common to learn that you need to import a particular class only
75
+ deep down in the guts of your code generation script. But, if you do know you need an import or two:</p>
76
+
77
+
78
+ <p><pre class='syntax'>
79
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">import</span><span class="punct">(&quot;</span><span class="string">java.util.Collections</span><span class="punct">&quot;).</span><span class="ident">import</span><span class="punct">(&quot;</span><span class="string">some.other.Thing.*</span><span class="punct">&quot;)</span>
80
+ </pre></p>
81
+
82
+
83
+ <p>These imported classes are just strings as far as <code>guff</code> is concerned. It makes no attempt to do anything
84
+ smart with them like checking for their existence on the classpath or what have you. It will make sure that any given
85
+ class is imported only once though.</p>
86
+
87
+
88
+ <h3>Adding a new class</h3>
89
+
90
+
91
+ <p>Now that you have a source file, you can add a class to it:</p>
92
+
93
+
94
+ <p><pre class='syntax'>
95
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">begin_class</span><span class="punct">('</span><span class="string">GenericClass</span><span class="punct">')</span> <span class="punct">{|</span><span class="ident">c</span><span class="punct">|</span>
96
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">genericized_using</span><span class="punct">('</span><span class="string">&lt;T extends SomethingElse&gt;</span><span class="punct">')</span>
97
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">extends</span><span class="punct">('</span><span class="string">guff.test.SuperClass</span><span class="punct">')</span>
98
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">implements</span><span class="punct">('</span><span class="string">guff.test.Interface</span><span class="punct">',</span> <span class="punct">'</span><span class="string">java.io.Serializable</span><span class="punct">')</span>
99
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_javadoc</span><span class="punct">(&quot;</span><span class="string">This class has a line of javadoc.</span><span class="punct">&quot;).</span><span class="ident">add_javadoc</span><span class="punct">(&quot;</span><span class="string">With a little follow on.</span><span class="punct">&quot;)</span>
100
+ <span class="punct">}</span>
101
+ </pre></p>
102
+
103
+
104
+ <h3>Adding fields to the class</h3>
105
+
106
+
107
+ <p>You can add fields to a class like this:</p>
108
+
109
+
110
+ <p><pre class='syntax'>
111
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">begin_class</span><span class="punct">('</span><span class="string">SomeClass</span><span class="punct">')</span> <span class="punct">{|</span><span class="ident">c</span><span class="punct">|</span>
112
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_field</span><span class="punct">('</span><span class="string">name</span><span class="punct">',</span><span class="symbol">:String</span><span class="punct">).</span><span class="ident">static</span><span class="punct">.</span><span class="ident">final</span><span class="punct">.</span><span class="ident">initial</span><span class="punct">('</span><span class="string">&quot;Fred&quot;</span><span class="punct">')</span>
113
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_field</span><span class="punct">('</span><span class="string">id</span><span class="punct">',</span><span class="symbol">:long</span><span class="punct">).</span><span class="ident">initial</span><span class="punct">('</span><span class="string">0</span><span class="punct">')</span>
114
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_field</span><span class="punct">('</span><span class="string">user</span><span class="punct">','</span><span class="string">some.other.pkg.User</span><span class="punct">').</span><span class="ident">initial</span><span class="punct">('</span><span class="string">new some.other.pkg.User(0,2)</span><span class="punct">')</span>
115
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_field</span><span class="punct">('</span><span class="string">otherId</span><span class="punct">',</span><span class="symbol">:int</span><span class="punct">).</span><span class="ident">package_local</span>
116
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_field</span><span class="punct">('</span><span class="string">c</span><span class="punct">',</span><span class="symbol">:char</span><span class="punct">).</span><span class="ident">protected</span><span class="punct">.</span><span class="ident">add_javadoc</span><span class="punct">('</span><span class="string">javadoc</span><span class="punct">').</span><span class="ident">add_javadoc</span><span class="punct">('</span><span class="string">More javadoc!</span><span class="punct">')</span>
117
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_field</span><span class="punct">('</span><span class="string">flag</span><span class="punct">',</span><span class="symbol">:boolean</span><span class="punct">).</span><span class="ident">public</span><span class="punct">.</span><span class="ident">initial</span><span class="punct">('</span><span class="string">false</span><span class="punct">')</span>
118
+ <span class="punct">}</span>
119
+ </pre></p>
120
+
121
+
122
+ <p>By default fields are <code>private</code>.</p>
123
+
124
+
125
+ <h3>Adding a constructor</h3>
126
+
127
+
128
+ <p>You can add constructors to a class like this:</p>
129
+
130
+
131
+ <p><pre class='syntax'>
132
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">begin_class</span><span class="punct">('</span><span class="string">SomeClass</span><span class="punct">')</span> <span class="punct">{|</span><span class="ident">c</span><span class="punct">|</span>
133
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_constructor</span><span class="punct">.</span><span class="ident">taking</span><span class="punct">(&quot;</span><span class="string">date</span><span class="punct">&quot;,&quot;</span><span class="string">java.util.Date</span><span class="punct">&quot;).</span><span class="ident">taking</span><span class="punct">(&quot;</span><span class="string">active</span><span class="punct">&quot;,&quot;</span><span class="string">boolean</span><span class="punct">&quot;).</span><span class="ident">body</span> <span class="punct">{|</span><span class="ident">body</span><span class="punct">|</span>
134
+ <span class="ident">body</span><span class="punct">.</span><span class="ident">line</span><span class="punct">(&quot;</span><span class="string">super();</span><span class="punct">&quot;)</span>
135
+ <span class="punct">}</span>
136
+ <span class="punct">}</span>
137
+ </pre></p>
138
+
139
+
140
+ <p>You can string together as many <code>taking</code> clauses as you need (<code>taking</code> and <code>takes</code>
141
+ are aliases by the way).</p>
142
+
143
+
144
+ <h3>Defining the body of the constructor</h3>
145
+
146
+
147
+ <p>When you want to define the body of a constructor (or method), you call the <code>body</code> method on the constructor
148
+ and use a single argument block to define the contents of the body. The body instance that is passed to this block supports
149
+ the following methods:</p>
150
+
151
+
152
+ <p><pre class='syntax'>
153
+ <span class="comment"># an entire line of java code including new line</span>
154
+ <span class="ident">body</span><span class="punct">.</span><span class="ident">line</span><span class="punct">(&quot;</span><span class="string">super();</span><span class="punct">&quot;)</span>
155
+
156
+ <span class="comment"># append the supplied text to the current line</span>
157
+ <span class="ident">body</span><span class="punct">.</span><span class="ident">append</span><span class="punct">(&quot;</span><span class="string">this.</span><span class="punct">&quot;).</span><span class="ident">append</span><span class="punct">(&quot;</span><span class="string">execute()</span><span class="punct">&quot;)</span>
158
+
159
+ <span class="comment"># a nested block - call body again</span>
160
+ <span class="ident">body</span><span class="punct">.</span><span class="ident">body</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">nested_body</span><span class="punct">|</span>
161
+ <span class="ident">nested_body</span><span class="punct">.</span><span class="ident">line</span><span class="punct">('</span><span class="string">System.out.println(&quot;Nested&quot;);</span><span class="punct">');</span>
162
+ <span class="punct">}</span>
163
+ </pre></p>
164
+
165
+
166
+ <h3>Adding a method</h3>
167
+
168
+
169
+ <p>You can add methods to a class like this:</p>
170
+
171
+
172
+ <p><pre class='syntax'>
173
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">begin_class</span><span class="punct">('</span><span class="string">SomeClass</span><span class="punct">')</span> <span class="punct">{|</span><span class="ident">c</span><span class="punct">|</span>
174
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_method</span><span class="punct">.</span><span class="ident">taking</span><span class="punct">(&quot;</span><span class="string">active</span><span class="punct">&quot;,&quot;</span><span class="string">boolean</span><span class="punct">&quot;).</span><span class="ident">returns</span><span class="punct">(&quot;</span><span class="string">java.util.Date</span><span class="punct">&quot;).</span><span class="ident">body</span> <span class="punct">{|</span><span class="ident">body</span><span class="punct">|</span>
175
+ <span class="ident">body</span><span class="punct">.</span><span class="ident">line</span><span class="punct">(&quot;</span><span class="string">super();</span><span class="punct">&quot;)</span>
176
+ <span class="punct">}</span>
177
+ <span class="punct">}</span>
178
+ </pre></p>
179
+
180
+
181
+ <p>Which is the same as adding a constructor, except for the <code>returns</code> clause.
182
+ By default methods are <code>public</code> and return <code>void</code>.
183
+ The body of a method is defined in the same way as the body of a constructor (above).</p>
184
+
185
+
186
+ <h3>Adding a throws clause</h3>
187
+
188
+
189
+ <p>You can add as many throws clauses as you need to methods and constructors like this:</p>
190
+
191
+
192
+ <p><pre class='syntax'>
193
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">begin_class</span><span class="punct">('</span><span class="string">SomeClass</span><span class="punct">')</span> <span class="punct">{|</span><span class="ident">c</span><span class="punct">|</span>
194
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_method</span><span class="punct">.</span><span class="ident">throws</span><span class="punct">(&quot;</span><span class="string">guff.SomeWeirdException</span><span class="punct">&quot;).</span><span class="ident">throws</span><span class="punct">(&quot;</span><span class="string">guff.SomeOtherException</span><span class="punct">&quot;).</span><span class="ident">body</span> <span class="punct">{|</span><span class="ident">body</span><span class="punct">|</span>
195
+ <span class="ident">body</span><span class="punct">.</span><span class="ident">line</span><span class="punct">(&quot;</span><span class="string">super();</span><span class="punct">&quot;)</span>
196
+ <span class="punct">}</span>
197
+ <span class="punct">}</span>
198
+ </pre></p>
199
+
200
+
201
+ <h3>Adding annotations</h3>
202
+
203
+
204
+ <p>You can add as many annotations as you need to classes, fields, methods and constructors like this:</p>
205
+
206
+
207
+ <p><pre class='syntax'>
208
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">begin_class</span><span class="punct">('</span><span class="string">ClassWithAnnotatedMethods</span><span class="punct">')</span> <span class="punct">{|</span><span class="ident">c</span><span class="punct">|</span>
209
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_annotation</span><span class="punct">(&quot;</span><span class="string">javax.persistence.Entity</span><span class="punct">&quot;)</span>
210
+
211
+ <span class="ident">m</span> <span class="punct">=</span> <span class="ident">c</span><span class="punct">.</span><span class="ident">add_method</span><span class="punct">(&quot;</span><span class="string">getAddressID</span><span class="punct">&quot;).</span><span class="ident">returns</span><span class="punct">(</span><span class="symbol">:String</span><span class="punct">)</span>
212
+ <span class="ident">m</span><span class="punct">.</span><span class="ident">add_annotation</span><span class="punct">(&quot;</span><span class="string">javax.persistence.Column</span><span class="punct">&quot;)</span> <span class="punct">{|</span><span class="ident">a</span><span class="punct">|</span>
213
+ <span class="ident">a</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">name</span><span class="punct">&quot;,</span> <span class="punct">'</span><span class="string">&quot;addressID&quot;</span><span class="punct">')</span>
214
+ <span class="ident">a</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">table</span><span class="punct">&quot;,</span> <span class="punct">'</span><span class="string">&quot;EMP_DETAIL&quot;</span><span class="punct">')</span>
215
+ <span class="punct">}</span>
216
+ <span class="ident">m</span><span class="punct">.</span><span class="ident">add_annotation</span><span class="punct">(&quot;</span><span class="string">SuppressWarnings</span><span class="punct">&quot;,'</span><span class="string">&quot;unchecked&quot;</span><span class="punct">')</span>
217
+ <span class="ident">m</span><span class="punct">.</span><span class="ident">body</span> <span class="punct">{|</span><span class="ident">body</span><span class="punct">|</span>
218
+ <span class="ident">body</span><span class="punct">.</span><span class="ident">line</span><span class="punct">('</span><span class="string">return &quot;0&quot;;</span><span class="punct">')</span>
219
+ <span class="punct">}</span>
220
+ </pre></p>
221
+
222
+
223
+ <p>And you can generate complex annotations like this:</p>
224
+
225
+
226
+ <p><pre class='syntax'>
227
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">begin_class</span><span class="punct">('</span><span class="string">ClassWithAnnotatedMethods</span><span class="punct">')</span> <span class="punct">{|</span><span class="ident">c</span><span class="punct">|</span>
228
+ <span class="ident">c</span><span class="punct">.</span><span class="ident">add_annotation</span><span class="punct">(&quot;</span><span class="string">javax.persistence.Entity</span><span class="punct">&quot;)</span>
229
+
230
+ <span class="ident">m</span> <span class="punct">=</span> <span class="ident">c</span><span class="punct">.</span><span class="ident">add_method</span><span class="punct">(&quot;</span><span class="string">getAddressID</span><span class="punct">&quot;).</span><span class="ident">returns</span><span class="punct">(</span><span class="symbol">:String</span><span class="punct">)</span>
231
+ <span class="ident">m</span><span class="punct">.</span><span class="ident">add_annotation</span><span class="punct">(&quot;</span><span class="string">JoinTable</span><span class="punct">&quot;)</span> <span class="punct">{|</span><span class="ident">a</span><span class="punct">|</span>
232
+ <span class="ident">a</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">name</span><span class="punct">&quot;,</span> <span class="punct">'</span><span class="string">&quot;CUSTOMERBEANSUBSCRIPTIONBEAN&quot;</span><span class="punct">')</span>
233
+ <span class="ident">a</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">joinColumns</span><span class="punct">&quot;,</span> <span class="ident">annotation</span><span class="punct">(&quot;</span><span class="string">JoinColumn</span><span class="punct">&quot;){|</span><span class="ident">aa</span><span class="punct">|</span>
234
+ <span class="ident">aa</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">name</span><span class="punct">&quot;,</span> <span class="punct">'</span><span class="string">&quot;CUSTOMERBEAN_CUSTOMERID96&quot;</span><span class="punct">')</span>
235
+ <span class="ident">aa</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">referencedColumnName</span><span class="punct">&quot;,</span> <span class="punct">'</span><span class="string">&quot;customerid&quot;</span><span class="punct">')</span>
236
+ <span class="punct">})</span>
237
+ <span class="ident">a</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">inverseJoinColumns</span><span class="punct">&quot;,</span> <span class="ident">annotation</span><span class="punct">(&quot;</span><span class="string">JoinColumn</span><span class="punct">&quot;){|</span><span class="ident">aa</span><span class="punct">|</span>
238
+ <span class="ident">aa</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">name</span><span class="punct">&quot;,</span> <span class="punct">'</span><span class="string">&quot;SUBSCRIPTION_TITLE&quot;</span><span class="punct">')</span>
239
+ <span class="ident">aa</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">(&quot;</span><span class="string">referencedColumnName</span><span class="punct">&quot;,</span> <span class="punct">'</span><span class="string">&quot;TITLE&quot;</span><span class="punct">')</span>
240
+ <span class="punct">})</span>
241
+ <span class="punct">}</span>
242
+ </pre></p>
243
+
244
+
245
+ <h3>Scope and modifiers</h3>
246
+
247
+
248
+ <p>Classes, fields and methods support scoping and addition of modifiers as follows:</p>
249
+
250
+
251
+ <p><pre class='syntax'>
252
+ <span class="ident">method</span><span class="punct">.</span><span class="ident">public</span><span class="punct">.</span><span class="ident">abstract</span>
253
+ <span class="ident">field</span><span class="punct">.</span><span class="ident">private</span><span class="punct">.</span><span class="ident">final</span>
254
+ <span class="ident">clazz</span><span class="punct">.</span><span class="ident">package_local</span><span class="punct">.</span><span class="ident">abstract</span>
255
+ </pre></p>
256
+
257
+
258
+ <p>The supported scopes are <code>public</code>, <code>protected</code>, <code>package_local</code> and <code>private</code>.
259
+ The supported modifiers are <code>abstract</code>, <code>final</code> and <code>static</code></p>
260
+
261
+
262
+ <h3>Adding javadoc</h3>
263
+
264
+
265
+ <p>Classes, constructors, methods and fields support javadoc as follows:</p>
266
+
267
+
268
+ <p><pre class='syntax'>
269
+ <span class="ident">method</span><span class="punct">.</span><span class="ident">add_javadoc</span><span class="punct">(&quot;</span><span class="string">Line of javadoc</span><span class="punct">&quot;).</span><span class="ident">add_javadoc</span><span class="punct">(&quot;</span><span class="string">Nudder line of javadoc</span><span class="punct">&quot;)</span>
270
+ </pre></p>
271
+
272
+
273
+ <h3>Adding imports</h3>
274
+
275
+
276
+ <p>Source files, classes, fields, constructors and methods all support the <code>import</code> statement, but all imports will be written
277
+ out in the right place when the file is saved (i.e. between the package statement and the class declaration). If you
278
+ import a given class more than once, it will be imported only once in the generated java source file.</p>
279
+
280
+
281
+ <h3>Saving the generated code</h3>
282
+
283
+
284
+ <p>Once you have all your fields, constructors and methods added you can save your source file as follows:</p>
285
+
286
+
287
+ <p><pre class='syntax'>
288
+ <span class="ident">source</span><span class="punct">.</span><span class="ident">save_in</span><span class="punct">(&quot;</span><span class="string">../src/generated</span><span class="punct">&quot;)</span>
289
+ </pre></p>
290
+
291
+
292
+ <h2>Forum</h2>
293
+
294
+
295
+ <p><a href="http://groups.google.com/group/guff">http://groups.google.com/group/guff</a></p>
296
+
297
+
298
+ <h2>How to submit patches</h2>
299
+
300
+
301
+ <p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
302
+
303
+
304
+ <p>The project is hosted <a href="http://rubyforge.org/projects/jbuilder-guff/">here</a> and you can find details of how to get anonymous svn access there.</p>
305
+
306
+
307
+ <h2>License</h2>
308
+
309
+
310
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
311
+
312
+
313
+ <h2>Contact</h2>
314
+
315
+
316
+ <p>Comments are welcome. Send an email to the <a href="http://groups.google.com/group/guff">forum</a></p>
317
+ <p class="coda">
318
+ <a href="mailto:me@mikehogan.net">Mike Hogan</a>, 7th February 2008<br>
319
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
320
+ </p>
321
+ </div>
322
+
323
+ <!-- insert site tracking codes here, like Google Urchin -->
324
+
325
+ </body>
326
+ </html>