unageanu-javaclass 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,33 @@
1
+
2
+ require "zip/zip"
3
+
4
+ # ZipInputStreamにはgetcが実装されていないので、追加する。
5
+ module Zip
6
+ class ZipInputStream
7
+ def getc
8
+ read(1)[0]
9
+ end
10
+ end
11
+ end
12
+
13
+ module JavaClass
14
+
15
+ #=== Zipユーティリティ
16
+ module ZipUtils
17
+ module_function
18
+
19
+ # Zipエントリ内のクラス一覧を列挙して解析する。
20
+ #*zip_file:: zipファイル
21
+ #*&block:: クラスごとに呼び出されるブロック。引数でJavaClass::Classが渡される。
22
+ def each_class ( zip_file, &block )
23
+ Zip::ZipFile.foreach(zip_file) {|entry|
24
+ next unless entry.file?
25
+ next unless entry.name =~ /.*\.class$/
26
+ entry.get_input_stream {|io|
27
+ jc = JavaClass.from io
28
+ block.call( jc ) if block_given?
29
+ }
30
+ }
31
+ end
32
+ end
33
+ end
data/lib/javaclass.rb CHANGED
@@ -1,8 +1,14 @@
1
1
 
2
+ begin
3
+ require "rubygems"
4
+ rescue LoadError
5
+ end
6
+
2
7
  require "javaclass/base"
3
8
  require "javaclass/accessflag"
4
9
  require "javaclass/attribute"
5
10
  require "javaclass/class"
6
11
  require "javaclass/constant"
7
12
  require "javaclass/member"
8
- require "javaclass/reader"
13
+ require "javaclass/reader"
14
+ require "javaclass/ziputils"
@@ -1,69 +1,104 @@
1
+ #!/usr/bin/ruby
1
2
 
3
+ # jar内のクラスファイルのassertEquals()を生成する。
4
+ #
5
+ # ./create_assert.rb <jarファイル> [<対象クラスを示す正規表現>]
6
+ #
2
7
 
3
- $: << "../lib"
4
-
8
+ require 'rubygems'
5
9
  require "javaclass"
10
+ require "zip/zip"
6
11
  require "kconv"
7
12
  require "erb"
8
13
 
9
14
 
10
- PATH = 'aaa'
11
-
12
- def create( file )
13
- erb = ERB.new(IO.read("./assert.erb"), nil, "%" )
14
- open( PATH + "/" + file, "r+b" ) {|io|
15
- jc = JavaClass.from io
16
- puts erb.result(binding).tosjis
17
- }
18
- end
19
-
20
- Dir.foreach( PATH.gsub(/\\/, "/") ) {|f|
21
- create( f ) if f =~ /\.class$/ && !( f =~ /\$[0-9]+\.class$/ )
22
- }
23
-
24
- =begin
25
- % name = jc.this_class.name
15
+ TEMPLATE = <<-ERB
16
+ % name = jc.name
26
17
  /**
27
- * {@link <%= name.gsub(/\$/, ".") %>} が同一であることを評価する。
18
+ * {@link <%= name.gsub(/\\$/, ".") %>} が同一であることを評価する。
28
19
  *
29
20
  * @param expected 期待値
30
21
  * @param actual 実際の値
31
22
  */
32
23
  public static final void assertEquals(
33
- <%= name.gsub(/\$/, ".") %> expected,
34
- <%= name.gsub(/\$/, ".") %> actual ) {
24
+ <%= name.gsub(/\\$/, ".") %> expected,
25
+ <%= name.gsub(/\\$/, ".") %> actual ) {
26
+ % if jc.super_class != nil && jc.super_class != "java.lang.Object"
27
+ % super_class = jc.super_class.gsub(/\\$/, ".")
28
+ assertEquals( (<%= super_class %>) expected, (<%= super_class %>) actual );
29
+ % end
35
30
  % jc.methods.each { |m|
36
- % if m.name =~ /^get([A-Z][0-9a-zA-Z\_]+)/ || m.name =~ /^is([A-Z][0-9a-zA-Z\_])+/
31
+ % next if m.deprecated?
32
+ % next if m.access_flag.on? JavaClass::MethodAccessFlag::ACC_STATIC
33
+ % next if m.access_flag.on? JavaClass::MethodAccessFlag::ACC_PRIVATE
34
+ % if m.name =~ /^get(\\S+)/ || m.name =~ /^is(\\S)+/
37
35
  % sname = $1
38
- % prefix = m.attributes.key?('Deprecated') ? "//" : ""
39
- % d = m.convert_method_descriptor( m.descriptor )
36
+ % d = JavaClass::Converters.convert_method_descriptor( m.descriptor )
40
37
  % next if d[:args].length > 0
41
- % if d[:return] =~ /List/
42
- <%= prefix %> <%= d[:return] %> actual<%= sname%> = actual.<%= m.name %>();
43
- <%= prefix %> <%= d[:return] %> expected<%= sname%> = expected.<%= m.name %>();
44
- <%= prefix %> if ( expected<%= sname%> != null ) {
45
- <%= prefix %> assertEquals( actual<%= sname%>.size(), expected<%= sname%>.size() );
46
- <%= prefix %> for ( int i = 0; i < expected<%= sname%>.size(); i++ ) {
47
- <%= prefix %> assertEquals( expected<%= sname%>.get(i), actual<%= sname%>.get(i) );
48
- <%= prefix %> }
49
- <%= prefix %> } else {
50
- <%= prefix %> assertEquals( actual<%= sname%>, expected<%= sname%> );
51
- <%= prefix %> }
52
- % elsif d[:return] =~ /.*\[\]/
53
- <%= prefix %> <%= d[:return] %> actual<%= sname%> = actual.<%= m.name %>();
54
- <%= prefix %> <%= d[:return] %> expected<%= sname%> = expected.<%= m.name %>();
55
- <%= prefix %> if ( expected<%= sname%> != null ) {
56
- <%= prefix %> assertEquals( actual<%= sname%>.length, expected<%= sname%>.length );
57
- <%= prefix %> for ( int i = 0; i < expected<%= sname%>.length; i++ ) {
58
- <%= prefix %> assertEquals( expected<%= sname%>[i], actual<%= sname%>[i] );
59
- <%= prefix %> }
60
- <%= prefix %> } else {
61
- <%= prefix %> assertEquals( actual<%= sname%>, expected<%= sname%> );
62
- <%= prefix %> }
38
+ % if d[:return] =~ /List$/ || d[:return] =~ /.*\\[\\]/ || d[:return] =~ /Map$/
39
+ <%= d[:return] %> expected<%= sname%> = expected.<%= m.name %>();
40
+ <%= d[:return] %> actual<%= sname%> = actual.<%= m.name %>();
41
+ if ( expected<%= sname%> != null ) {
42
+ % if d[:return] =~ /List$/
43
+ assertEquals( expected<%= sname%>.size(), actual<%= sname%>.size() );
44
+ for ( int i = 0; i < expected<%= sname%>.size(); i++ ) {
45
+ assertEquals( expected<%= sname%>.get(i), actual<%= sname%>.get(i) );
46
+ }
47
+ % elsif d[:return] =~ /.*\\[\\]/
48
+ assertEquals( expected<%= sname%>.length, actual<%= sname%>.length );
49
+ for ( int i = 0; i < expected<%= sname%>.length; i++ ) {
50
+ assertEquals( expected<%= sname%>[i], actual<%= sname%>[i] );
51
+ }
52
+ % else
53
+ assertEquals( expected<%= sname%>.size(), actual<%= sname%>.size() );
54
+ for ( Object key : expected<%= sname%>.keySet() ) {
55
+ assertEquals( expected<%= sname%>.get(key), actual<%= sname%>.get(key) );
56
+ }
57
+ % end
58
+ } else {
59
+ assertEquals( expected<%= sname%>, actual<%= sname%> );
60
+ }
63
61
  % else
64
- <%= prefix %> assertEquals( expected.<%= m.name %>(), actual.<%= m.name %>() );
62
+ assertEquals( expected.<%= m.name %>(), actual.<%= m.name %>() );
65
63
  % end
66
64
  % end
67
65
  % }
68
66
  }
69
- =end
67
+ ERB
68
+
69
+ # ZipInputStreamにはgetcが実装されていないので、追加する。
70
+ module Zip
71
+ class ZipInputStream
72
+ def getc
73
+ read(1)[0]
74
+ end
75
+ end
76
+ end
77
+
78
+ # Zipエントリ内のクラス一覧を列挙して解析する。
79
+ def each_class ( zip_file, &block )
80
+ Zip::ZipFile.foreach(zip_file) {|entry|
81
+ next unless entry.file?
82
+ next unless entry.name =~ /.*\.class$/
83
+ entry.get_input_stream {|io|
84
+ jc = JavaClass.from io
85
+ block.call( jc ) if block_given?
86
+ }
87
+ }
88
+ end
89
+
90
+ erb = ERB.new(TEMPLATE, nil, "%" )
91
+ r = Regexp.compile(ARGV[1]) if ( ARGV.length > 1 )
92
+
93
+ each_class( ARGV[0] ) {|jc|
94
+
95
+ next if r != nil && !r.match(jc.name)
96
+
97
+ # enum, annotationは除外
98
+ next if jc.access_flag.on? JavaClass::ClassAccessFlag::ACC_ENUM
99
+ next if jc.access_flag.on? JavaClass::ClassAccessFlag::ACC_ANNOTATION
100
+
101
+ # deprecatedなクラスも除外
102
+ next if jc.deprecated?
103
+ puts erb.result(binding).tosjis
104
+ }
data/sample/sample.rb CHANGED
@@ -1,5 +1,5 @@
1
1
 
2
- #require "rubygems"
2
+ require "rubygems"
3
3
  require "javaclass"
4
4
  require "kconv"
5
5
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: unageanu-javaclass
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masaya Yamauchi
@@ -9,10 +9,18 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-06-13 00:00:00 -07:00
12
+ date: 2008-06-25 00:00:00 -07:00
13
13
  default_executable:
14
- dependencies: []
15
-
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: rubyzip
17
+ version_requirement:
18
+ version_requirements: !ruby/object:Gem::Requirement
19
+ requirements:
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 0.9.1
23
+ version:
16
24
  description:
17
25
  email: y-masaya@red.hot.co.jp
18
26
  executables: []
@@ -39,7 +47,6 @@ files:
39
47
  - test/test_class.rb
40
48
  - test/test_attribute.rb
41
49
  - test/test_constant.rb
42
- - test/all-tests.rb
43
50
  - lib/javaclass.rb
44
51
  - lib/javaclass
45
52
  - lib/javaclass/accessflag.rb
@@ -48,6 +55,7 @@ files:
48
55
  - lib/javaclass/base.rb
49
56
  - lib/javaclass/member.rb
50
57
  - lib/javaclass/class.rb
58
+ - lib/javaclass/ziputils.rb
51
59
  - lib/javaclass/reader.rb
52
60
  - sample/sample.rb
53
61
  - sample/java_class
@@ -64,7 +72,6 @@ files:
64
72
  - sample/java_class/com/example/ThrowsException.class
65
73
  - sample/java_class/com/example/Constants.class
66
74
  - sample/java_class/com/example/Deprecated.class
67
- - sample/java_class/com/example/Kitten.class
68
75
  - sample/java_class/com/example/InnerClassImpl$1.class
69
76
  - sample/java_class/com/example/InnerClassImpl$2.class
70
77
  - sample/java_class/com/example/annotation
@@ -85,7 +92,6 @@ files:
85
92
  - sample/java_class/com/example/InnerClassImpl$BasicInnerClass2.class
86
93
  - sample/java_class/HelloWorld.class
87
94
  - sample/type_hierarchy.rb
88
- - sample/class_list.rb
89
95
  - sample/java_src
90
96
  - sample/java_src/com
91
97
  - sample/java_src/com/example
@@ -133,7 +139,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
133
139
  requirements: []
134
140
 
135
141
  rubyforge_project:
136
- rubygems_version: 1.0.1
142
+ rubygems_version: 1.2.0
137
143
  signing_key:
138
144
  specification_version: 2
139
145
  summary: javaclass is a java class file parser for ruby.
@@ -155,4 +161,3 @@ test_files:
155
161
  - test/test_class.rb
156
162
  - test/test_attribute.rb
157
163
  - test/test_constant.rb
158
- - test/all-tests.rb
data/sample/class_list.rb DELETED
@@ -1,52 +0,0 @@
1
-
2
- require "rubygems"
3
- require "javaclass"
4
- require "zip/zip"
5
-
6
- # ZipInputStreamにはgetcが実装されていないので、追加する。
7
- module Zip
8
- class ZipInputStream
9
- def getc
10
- read(1)[0]
11
- end
12
- end
13
- end
14
-
15
- # Zipエントリ内のクラス一覧を列挙して解析する。
16
- def each_class ( zip_file, &block )
17
- Zip::ZipFile.foreach(ARGV[0]) {|entry|
18
- next unless entry.file?
19
- next unless entry.name =~ /.*\.class$/
20
- entry.get_input_stream {|io|
21
- jc = JavaClass.from io
22
- block.call( jc ) if block_given?
23
- }
24
- }
25
- end
26
-
27
- class TypeHierarchy
28
- def initialize
29
- @classes = {}
30
- end
31
- def add( jc )
32
- (jc.interfaces << jc.super_class).each {
33
- if ( super_class != "java.lang.Object" )
34
- @classes[super_class] = Type.new unless @classes.key? super_class
35
-
36
- end
37
- }
38
-
39
- end
40
- def to_s
41
-
42
- end
43
- end
44
-
45
- class Type
46
- def initialize( java_class=nil )
47
- @implementors = []
48
- @java_class = java_class
49
- end
50
- attr :java_class, true
51
- attr :implementors, true
52
- end
data/test/all-tests.rb DELETED
@@ -1,32 +0,0 @@
1
-
2
- $: << "../src"
3
-
4
- require 'test/unit/testsuite'
5
- require 'access-flag-test'
6
- require 'attribute-test'
7
- require 'constant-test'
8
- require 'member-test'
9
-
10
- module JavaClass
11
-
12
- class AllTests
13
- def self.suite
14
- suite = Test::Unit::TestSuite.new( "javaclass all tests." )
15
- suite << AccessFlagTest.suite
16
- suite << AttributeTest.suite
17
- suite << AttributeTest.suite
18
- suite << UTF8ConstantTest
19
- suite << IntegerConstantTest
20
- suite << LongConstantTest.suite
21
- suite << FloatConstantTest.suite
22
- suite << DoubleConstantTest.suite
23
- suite << StringConstantTest.suite
24
- suite << NameAndTypeConstantTest.suite
25
- suite << ClassConstantTest.suite
26
- suite << MemberRefConstantTest.suite
27
- suite << MemberTest.suite
28
- return suite
29
- end
30
- end
31
-
32
- end