Class: MessagePack::IDL::Lang::JavaGenerator

Inherits:
GeneratorModule
  • Object
show all
Defined in:
lib/msgpack/idl/lang/java.rb

Defined Under Namespace

Classes: Context

Instance Method Summary collapse

Constructor Details

#initialize(ir, outdir) ⇒ JavaGenerator

Returns a new instance of JavaGenerator.



28
29
30
31
# File 'lib/msgpack/idl/lang/java.rb', line 28

def initialize(ir, outdir)
	@ir = ir
	@outdir = outdir
end

Instance Method Details

#format_message(t, name = t.name) ⇒ Object



173
174
175
176
177
178
179
180
181
182
183
# File 'lib/msgpack/idl/lang/java.rb', line 173

def format_message(t, name = t.name)
	ctx = Context.new(self, :message, :super_class, :name)
	ctx.message = t
	if t.super_class
		ctx.super_class = t.super_class.name
	elsif t.is_a?(IR::Exception)
		ctx.super_class = "RemoteError"
	end
	ctx.name = name
	render('message_body.java', ctx)
end

#gen_client_applicationsObject



147
148
149
150
151
152
153
154
155
156
157
# File 'lib/msgpack/idl/lang/java.rb', line 147

def gen_client_applications
	ctx = Context.new(self, :namespace, :name, :scopes, :default_scope)
	ctx.namespace = @ir.namespace

	@ir.applications.each {|app|
		ctx.name = app.name
		ctx.scopes = app.scopes
		ctx.default_scope = app.default_scope
		render_file('client/application.java', ctx, "client/#{ctx.name}")
	}
end

#gen_client_servicesObject



125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
# File 'lib/msgpack/idl/lang/java.rb', line 125

def gen_client_services
	ctx = Context.new(self, :namespace, :service, :version, :functions, :name, :message_class)
	ctx.namespace = @ir.namespace

	@ir.services.each {|s|
		ctx.service = s
		s.versions.each {|v|
			ctx.version = v.version
			ctx.functions = v.functions
			ctx.name = "#{s.name}_#{v.version}"
			ctx.message_class = (@ir.namespace + ["#{s.name}_#{v.version}"]).join('.')
			render_file('client/service_version.java', ctx, "client/#{ctx.name}")
		}
		v = s.versions.last
		ctx.version = nil
		ctx.functions = v.functions
		ctx.name = "#{s.name}"
		ctx.message_class = (@ir.namespace + ["#{s.name}_#{v.version}"]).join('.')
		render_file('client/service_version.java', ctx, "client/#{ctx.name}")
	}
end

#gen_enumsObject



51
52
53
54
55
56
57
58
59
60
61
# File 'lib/msgpack/idl/lang/java.rb', line 51

def gen_enums
	ctx = Context.new(self, :namespace, :enum, :fields, :name)
	ctx.namespace = @ir.namespace

	@ir.enums.each {|t|
		ctx.enum = t
		ctx.name = t.name
		ctx.fields = t.fields
		render_file('enum.java', ctx, "#{ctx.name}")
	}
end

#gen_initObject



44
45
46
47
48
49
# File 'lib/msgpack/idl/lang/java.rb', line 44

def gen_init
	@datadir = File.join(File.dirname(__FILE__), 'java')
	@pkgoutdir = File.join(@outdir, @ir.namespace)

	@engine = Tenjin::Engine.new(:cache => false)
end

#gen_messagesObject



63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/msgpack/idl/lang/java.rb', line 63

def gen_messages
	ctx = Context.new(self, :namespace, :message, :super_class, :name)
	ctx.namespace = @ir.namespace

	@ir.messages.each {|t|
		ctx.message = t
		if t.super_class
			ctx.super_class = t.super_class.name
		end
		ctx.name = t.name
		render_file('message.java', ctx, "#{ctx.name}")
	}
end

#gen_server_applicationsObject



108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/msgpack/idl/lang/java.rb', line 108

def gen_server_applications
	ctx = Context.new(self, :namespace, :name, :scopes, :default_scope)
	ctx.namespace = @ir.namespace

	service_apps = @ir.services.map {|s|
		scopes = [IR::Scope.new("", s, s.versions.last.version, true)]
		IR::Application.new(s.name, scopes)
	}

	(@ir.applications + service_apps).each {|app|
		ctx.name = app.name
		ctx.scopes = app.scopes
		ctx.default_scope = app.default_scope
		render_file('server/application.java', ctx, "server/#{ctx.name}")
	}
end

#gen_server_servicesObject



92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/msgpack/idl/lang/java.rb', line 92

def gen_server_services
	ctx = Context.new(self, :namespace, :service, :version, :functions, :name, :message_class)
	ctx.namespace = @ir.namespace

	@ir.services.each {|s|
		ctx.service = s
		s.versions.each {|v|
			ctx.version  = v.version
			ctx.functions = v.functions
			ctx.name = "#{s.name}_#{v.version}"
			ctx.message_class = (@ir.namespace + ["#{s.name}_#{v.version}"]).join('.')
			render_file('server/service_version.java', ctx, "server/#{ctx.name}")
		}
	}
end

#gen_servicesObject



77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/msgpack/idl/lang/java.rb', line 77

def gen_services
	ctx = Context.new(self, :namespace, :service, :version, :functions, :name)
	ctx.namespace = @ir.namespace

	@ir.services.each {|s|
		ctx.service = s
		s.versions.each {|v|
			ctx.version  = v.version
			ctx.functions = v.functions
			ctx.name = "#{s.name}_#{v.version}"
			render_file('service_version.java', ctx, "#{ctx.name}")
		}
	}
end

#generate!Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/msgpack/idl/lang/java.rb', line 33

def generate!
	gen_init
	gen_enums
	gen_messages
	gen_services
	gen_server_services
	gen_server_applications
	gen_client_services
	gen_client_applications
end

#render(template_fname, ctx) ⇒ Object



159
160
161
162
# File 'lib/msgpack/idl/lang/java.rb', line 159

def render(template_fname, ctx)
	template_path = File.join(@datadir, template_fname)
	@engine.render(template_path, ctx)
end

#render_file(template_fname, ctx, fname) ⇒ Object



164
165
166
167
168
169
170
171
# File 'lib/msgpack/idl/lang/java.rb', line 164

def render_file(template_fname, ctx, fname)
	code = render(template_fname, ctx)
	path = File.join(@pkgoutdir, fname) + '.java'
	FileUtils.mkdir_p(File.dirname(path))
	File.open(path, "w") {|f|
		f.write(code)
	}
end