unageanu-javaclass 0.1.1 → 0.2.0
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/lib/javaclass/ziputils.rb +33 -0
- data/lib/javaclass.rb +7 -1
- data/sample/create_assert.rb +83 -48
- data/sample/sample.rb +1 -1
- metadata +14 -9
- data/sample/class_list.rb +0 -52
- data/sample/java_class/com/example/Kitten.class +0 -0
- data/test/all-tests.rb +0 -32
@@ -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"
|
data/sample/create_assert.rb
CHANGED
@@ -1,69 +1,104 @@
|
|
1
|
+
#!/usr/bin/ruby
|
1
2
|
|
3
|
+
# jar内のクラスファイルのassertEquals()を生成する。
|
4
|
+
#
|
5
|
+
# ./create_assert.rb <jarファイル> [<対象クラスを示す正規表現>]
|
6
|
+
#
|
2
7
|
|
3
|
-
|
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
|
-
|
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(
|
34
|
-
<%= name.gsub(
|
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.
|
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
|
-
%
|
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
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
<%=
|
49
|
-
|
50
|
-
|
51
|
-
<%=
|
52
|
-
|
53
|
-
<%=
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
<%=
|
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
|
-
|
62
|
+
assertEquals( expected.<%= m.name %>(), actual.<%= m.name %>() );
|
65
63
|
% end
|
66
64
|
% end
|
67
65
|
% }
|
68
66
|
}
|
69
|
-
|
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
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.
|
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-
|
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
|
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
|
Binary file
|
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
|