guff 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +4 -0
- data/License.txt +20 -0
- data/Manifest.txt +37 -21
- data/README.txt +1 -3
- data/Rakefile +3 -53
- data/config/hoe.rb +71 -0
- data/config/requirements.rb +17 -0
- data/lib/guff.rb +8 -2
- data/lib/guff/java_source.rb +167 -35
- data/lib/guff/version.rb +9 -9
- data/script/destroy +14 -0
- data/script/generate +14 -0
- data/script/txt2html +74 -0
- data/setup.rb +1585 -1585
- data/tasks/deployment.rake +34 -0
- data/tasks/environment.rake +7 -0
- data/tasks/website.rake +17 -0
- data/test/java_source/files/ClassWithConstructors.java +22 -0
- data/test/java_source/files/ClassWithFields.java +4 -0
- data/test/java_source/files/ClassWithImports.java +8 -0
- data/test/java_source/files/ClassWithMethods.java +5 -1
- data/test/java_source/files/GenericClass.java +3 -0
- data/test/java_source/{annotation_declaration_test.rb → test_annotation_declaration.rb} +0 -0
- data/test/java_source/{class_declaration_test.rb → test_class_declaration.rb} +20 -0
- data/test/java_source/{field_declaration_test.rb → test_field_declaration.rb} +1 -1
- data/test/java_source/test_helper.rb +0 -2
- data/test/java_source/test_import_declaration.rb +14 -0
- data/test/java_source/{method_declaration_test.rb → test_method_declaration.rb} +4 -2
- data/test/test_helper.rb +2 -1
- data/website/index.html +326 -0
- data/website/index.txt +240 -0
- data/website/javascripts/rounded_corners_lite.inc.js +285 -0
- data/website/stylesheets/screen.css +138 -0
- data/website/template.rhtml +48 -0
- metadata +82 -50
- 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
|
data/tasks/website.rake
ADDED
@@ -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;
|
@@ -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()){
|
File without changes
|
@@ -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
|
}
|
@@ -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')
|
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'
|
data/website/index.html
ADDED
@@ -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>→ ‘guff’</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 ‘guff’ 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">("</span><span class="string">java.util.Collections</span><span class="punct">").</span><span class="ident">import</span><span class="punct">("</span><span class="string">some.other.Thing.*</span><span class="punct">")</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"><T extends SomethingElse></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">("</span><span class="string">This class has a line of javadoc.</span><span class="punct">").</span><span class="ident">add_javadoc</span><span class="punct">("</span><span class="string">With a little follow on.</span><span class="punct">")</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">"Fred"</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">("</span><span class="string">date</span><span class="punct">","</span><span class="string">java.util.Date</span><span class="punct">").</span><span class="ident">taking</span><span class="punct">("</span><span class="string">active</span><span class="punct">","</span><span class="string">boolean</span><span class="punct">").</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">("</span><span class="string">super();</span><span class="punct">")</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">("</span><span class="string">super();</span><span class="punct">")</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">("</span><span class="string">this.</span><span class="punct">").</span><span class="ident">append</span><span class="punct">("</span><span class="string">execute()</span><span class="punct">")</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("Nested");</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">("</span><span class="string">active</span><span class="punct">","</span><span class="string">boolean</span><span class="punct">").</span><span class="ident">returns</span><span class="punct">("</span><span class="string">java.util.Date</span><span class="punct">").</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">("</span><span class="string">super();</span><span class="punct">")</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">("</span><span class="string">guff.SomeWeirdException</span><span class="punct">").</span><span class="ident">throws</span><span class="punct">("</span><span class="string">guff.SomeOtherException</span><span class="punct">").</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">("</span><span class="string">super();</span><span class="punct">")</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">("</span><span class="string">javax.persistence.Entity</span><span class="punct">")</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">("</span><span class="string">getAddressID</span><span class="punct">").</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">("</span><span class="string">javax.persistence.Column</span><span class="punct">")</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">("</span><span class="string">name</span><span class="punct">",</span> <span class="punct">'</span><span class="string">"addressID"</span><span class="punct">')</span>
|
214
|
+
<span class="ident">a</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">("</span><span class="string">table</span><span class="punct">",</span> <span class="punct">'</span><span class="string">"EMP_DETAIL"</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">("</span><span class="string">SuppressWarnings</span><span class="punct">",'</span><span class="string">"unchecked"</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 "0";</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">("</span><span class="string">javax.persistence.Entity</span><span class="punct">")</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">("</span><span class="string">getAddressID</span><span class="punct">").</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">("</span><span class="string">JoinTable</span><span class="punct">")</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">("</span><span class="string">name</span><span class="punct">",</span> <span class="punct">'</span><span class="string">"CUSTOMERBEANSUBSCRIPTIONBEAN"</span><span class="punct">')</span>
|
233
|
+
<span class="ident">a</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">("</span><span class="string">joinColumns</span><span class="punct">",</span> <span class="ident">annotation</span><span class="punct">("</span><span class="string">JoinColumn</span><span class="punct">"){|</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">("</span><span class="string">name</span><span class="punct">",</span> <span class="punct">'</span><span class="string">"CUSTOMERBEAN_CUSTOMERID96"</span><span class="punct">')</span>
|
235
|
+
<span class="ident">aa</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">("</span><span class="string">referencedColumnName</span><span class="punct">",</span> <span class="punct">'</span><span class="string">"customerid"</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">("</span><span class="string">inverseJoinColumns</span><span class="punct">",</span> <span class="ident">annotation</span><span class="punct">("</span><span class="string">JoinColumn</span><span class="punct">"){|</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">("</span><span class="string">name</span><span class="punct">",</span> <span class="punct">'</span><span class="string">"SUBSCRIPTION_TITLE"</span><span class="punct">')</span>
|
239
|
+
<span class="ident">aa</span><span class="punct">.</span><span class="ident">add_property</span><span class="punct">("</span><span class="string">referencedColumnName</span><span class="punct">",</span> <span class="punct">'</span><span class="string">"TITLE"</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">("</span><span class="string">Line of javadoc</span><span class="punct">").</span><span class="ident">add_javadoc</span><span class="punct">("</span><span class="string">Nudder line of javadoc</span><span class="punct">")</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">("</span><span class="string">../src/generated</span><span class="punct">")</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’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>
|