root/lang/ruby/scaflute/scaflute.rb @ 30165

Revision 29889, 4.2 kB (checked in by drry, 4 years ago)
  • fixed the regex.
Line 
1require 'rexml/document'
2require 'erb'
3
4# DBFlute が生成したスキーマ情報を元に、
5# Teeda 用の CRUD ページを生成する scaffold スクリプト(予定)。
6
7module Main
8  def self.run()
9    tables = Schema.read_xml('templates/project-schema-sample.xml')
10    tables.each() do |table|
11      $table = table
12      $table.javaPackage = 'com.sample'
13      ERB.exec_file('templates/dxo.erb', "result/java/#{table.javaClass}Dxo.java")
14      ERB.exec_file('templates/page.erb', "result/java/Abstract#{table.javaClass}Page.java")
15      ERB.exec_file('templates/list.erb', "result/html/#{table.javaProperty}List.html")
16      ERB.exec_file('templates/list_page.erb', "result/java/#{table.javaClass}ListPage.java")
17      ERB.exec_file('templates/edit.erb', "result/html/#{table.javaProperty}Edit.html")
18      ERB.exec_file('templates/edit_page.erb', "result/java/#{table.javaClass}EditPage.java")
19      ERB.exec_file('templates/confirm.erb', "result/html/#{table.javaProperty}Confirm.html")
20      ERB.exec_file('templates/confirm_page.erb', "result/java/#{table.javaClass}ConfirmPage.java")
21    end
22  end
23end
24
25class BsTable
26  attr_accessor :name,
27                :schema,
28                :type,
29                :columns
30end
31
32class BsColumn
33  attr_accessor :autoIncrement,
34                :comment,
35                :dbType,
36                :default,
37                :javaType,
38                :name,
39                :size,
40                :primaryKey,
41                :required,
42                :type
43end
44
45class Table < BsTable
46  attr_accessor :javaClass,
47                :javaProperty,
48                :javaPackage
49end
50
51class Column < BsColumn
52  attr_accessor :javaProperty,
53                :htmlMaxLength
54end
55
56class ERB
57  def self.exec_file(file_name, output = nil)
58    File.open(file_name, 'r') do |f|
59      str = f.read()
60      erb = ERB.new(str, nil, '-')
61      if output.nil?
62        erb.run()
63      else
64        File.open(output, 'w+') do |f|
65          f.puts(erb.result)
66        end
67      end
68    end
69  end
70end
71
72class String
73  # 文字列を CamelCase に変換
74  # FOO_BAR -> fooBar
75  def camelize()
76    str = self.downcase()
77    str = str.gsub(/_+([a-z]?)/) do
78      $1.upcase()
79    end
80    return str
81  end
82
83  # 最初の文字を大文字に変換
84  # fooBar -> FooBar
85  def upcase_first()
86    str = String.new(self)
87    str[0] = str[0].chr().upcase()
88    return str
89  end
90end
91
92module Schema
93  def self.read_xml(file_name)
94    result = []
95    read_document(file_name).root.elements.each() do |element|
96      result << read_table(element)
97    end
98    return result
99  end
100
101private
102
103  def self.read_document(file_name)
104    doc = nil
105    File.open(file_name, 'r') do |f|
106      doc = REXML::Document.new(f)
107    end
108    return doc
109  end
110
111  def self.read_table(element)
112    table = Table.new()
113    table.name = element.attributes['name']
114    table.schema = element.attributes['schema']
115    table.type = element.attributes['type']
116    table.columns = []
117    table.javaProperty = table.name.camelize()
118    table.javaClass = table.javaProperty.upcase_first()
119
120    element.elements.each() do |element|
121      next unless element.name == 'column'
122      table.columns << read_column(element)
123    end
124    return table
125  end
126
127  def self.read_column(element)
128    column = Column.new()
129    column.autoIncrement = element.attributes['autoIncrement']
130    column.comment = element.attributes['comment']
131    column.dbType = element.attributes['dbType']
132    column.default = element.attributes['default']
133    column.javaType = element.attributes['javaType']
134    column.name = element.attributes['name']
135    column.size = element.attributes['size']
136    column.primaryKey = element.attributes['primaryKey']
137    column.required = element.attributes['required']
138    column.type = element.attributes['type']
139    column.javaProperty = column.name.camelize()
140    column.htmlMaxLength = read_maxlength(column)
141    return column
142  end
143
144  def self.read_maxlength(column)
145    case column.javaType
146    when 'java.util.Date'
147      return '10'
148    when 'java.math.BigDecimal'
149      if column.size =~ /(\d+), (\d+)/
150        return ($1.to_i() + $2.to_i()).to_s()
151      end
152    when 'Long'
153      return '19'
154    when 'Integer'
155      return '10'
156    end
157    return column.size
158  end
159end
160
161Main.run()
Note: See TracBrowser for help on using the browser.