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.
- 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
|