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