javaclass 0.0.3 → 0.0.4
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/Rakefile +67 -56
- data/Readme.txt +42 -39
- data/example_task.rb +172 -0
- data/examples/check_interface_names.rb +44 -0
- data/examples/corpus.rb +19 -0
- data/examples/count_classes_in_modules.rb +38 -0
- data/examples/cumulative_dependencies.rb +39 -0
- data/examples/find_all_imported_types.rb +44 -0
- data/examples/find_referenced_modules.rb +53 -0
- data/examples/find_unreferenced_classes.rb +65 -0
- data/examples/generate_class_lists.rb +67 -43
- data/examples/profiler_scratchpad.rb +33 -0
- data/examples/simple_usage.rb +42 -0
- data/history.txt +29 -7
- data/javaclass.gemspec +31 -0
- data/lib/javaclass/adder_tree.rb +92 -0
- data/lib/javaclass/analyse/dependencies.rb +52 -0
- data/lib/javaclass/{metric/metrics.txt → analyse/ideas.txt} +2 -2
- data/lib/javaclass/analyse/transitive_dependencies.rb +52 -0
- data/lib/javaclass/classfile/access_flag_constants.rb +24 -0
- data/lib/javaclass/classfile/access_flags.rb +49 -26
- data/lib/javaclass/classfile/class_format_error.rb +37 -0
- data/lib/javaclass/classfile/class_magic.rb +16 -8
- data/lib/javaclass/classfile/class_version.rb +19 -25
- data/lib/javaclass/classfile/constant_pool.rb +110 -45
- data/lib/javaclass/classfile/constants/base.rb +33 -12
- data/lib/javaclass/classfile/constants/double_reference.rb +55 -41
- data/lib/javaclass/classfile/constants/single_reference.rb +29 -21
- data/lib/javaclass/classfile/constants/value.rb +43 -33
- data/lib/javaclass/classfile/java_class_header.rb +72 -46
- data/lib/javaclass/classfile/java_class_header_as_java_name.rb +33 -0
- data/lib/javaclass/classfile/java_class_header_shortcuts.rb +19 -0
- data/lib/javaclass/classfile/references.rb +21 -19
- data/lib/javaclass/classlist/class_entry.rb +26 -27
- data/lib/javaclass/classlist/jar_searcher.rb +34 -25
- data/lib/javaclass/classlist/list.rb +31 -31
- data/lib/javaclass/classlist/package_entry.rb +25 -24
- data/lib/javaclass/classpath/any_classpath.rb +48 -0
- data/lib/javaclass/classpath/class_not_found_error.rb +20 -0
- data/lib/javaclass/classpath/classpaths.txt +2 -2
- data/lib/javaclass/classpath/composite_classpath.rb +56 -54
- data/lib/javaclass/classpath/convention_classpath.rb +38 -0
- data/lib/javaclass/classpath/eclipse_classpath.rb +74 -0
- data/lib/javaclass/classpath/factory.rb +65 -0
- data/lib/javaclass/classpath/file_classpath.rb +47 -0
- data/lib/javaclass/classpath/folder_classpath.rb +42 -44
- data/lib/javaclass/classpath/jar_classpath.rb +91 -52
- data/lib/javaclass/classpath/java_home_classpath.rb +24 -13
- data/lib/javaclass/classpath/maven_classpath.rb +44 -0
- data/lib/javaclass/classpath/temporary_unpacker.rb +111 -0
- data/lib/javaclass/classpath/tracking_classpath.rb +144 -0
- data/lib/javaclass/classscanner/ideas.txt +3 -0
- data/lib/javaclass/classscanner/imported_types.rb +29 -0
- data/lib/javaclass/classscanner/scanners.rb +29 -0
- data/lib/javaclass/delegate_directive.rb +15 -0
- data/lib/javaclass/dsl/caching_classpath.rb +38 -0
- data/lib/javaclass/dsl/classpath_analysers.rb +27 -0
- data/lib/javaclass/dsl/java_name_factory.rb +79 -0
- data/lib/javaclass/dsl/loader.rb +42 -0
- data/lib/javaclass/dsl/loading_classpath.rb +53 -0
- data/lib/javaclass/dsl/mixin.rb +54 -0
- data/lib/javaclass/gems/zip_file.rb +154 -0
- data/lib/javaclass/java_language.rb +50 -0
- data/lib/javaclass/java_name.rb +329 -55
- data/lib/javaclass/java_name_scanner.rb +95 -0
- data/lib/javaclass/resources/iso_3166_countries.txt +240 -0
- data/lib/javaclass/resources/jdk0_packages.txt +6 -0
- data/lib/javaclass/resources/jdk1_packages.txt +6 -0
- data/lib/javaclass/resources/jdk2_packages.txt +4 -0
- data/lib/javaclass/resources/jdk3_packages.txt +6 -0
- data/lib/javaclass/resources/jdk4_packages.txt +22 -0
- data/lib/javaclass/resources/jdk5_packages.txt +5 -0
- data/lib/javaclass/resources/jdk6_packages.txt +7 -0
- data/lib/javaclass/resources/jdk7_packages.txt +0 -0
- data/lib/javaclass/resources/jdk_packages.txt +53 -0
- data/lib/javaclass/resources/reserved_words.txt +50 -0
- data/lib/javaclass/string_hexdump.rb +76 -0
- data/lib/javaclass/string_ux.rb +21 -10
- data/lib/javaclass.rb +16 -41
- data/license.txt +28 -0
- data/planned.txt +13 -0
- data/test/data/Object_102.class +0 -0
- data/test/data/Runnable_102.class +0 -0
- data/test/data/access_flags/AccessFlagsTestAnnotation.class +0 -0
- data/test/data/access_flags/AccessFlagsTestAnnotation.java +3 -0
- data/test/data/access_flags/AccessFlagsTestEnum$1.class +0 -0
- data/test/data/access_flags/AccessFlagsTestEnum.class +0 -0
- data/test/data/access_flags/AccessFlagsTestEnum.java +6 -0
- data/test/data/access_flags/AccessFlagsTestInner$1.class +0 -0
- data/test/data/access_flags/AccessFlagsTestInner$2.class +0 -0
- data/test/data/access_flags/AccessFlagsTestInner.class +0 -0
- data/test/data/access_flags/AccessFlagsTestInner.java +13 -0
- data/test/data/access_flags/AccessFlagsTestPackage.class +0 -0
- data/test/data/access_flags/AccessFlagsTestPackage.java +1 -1
- data/test/data/api/packagename/AccessFlagsTestPublic.class +0 -0
- data/test/data/class_version/ClassVersionTest17.class +0 -0
- data/test/data/class_version/make.bat +6 -2
- data/test/data/eclipse_classpath/classes/ClassVersionTest12.class +0 -0
- data/test/data/eclipse_classpath/lib/JarClasspathTest.jar +0 -0
- data/test/data/eclipse_classpath/test-classes/ClassVersionTest13.class +0 -0
- data/test/data/folder_classpath/{JarClasspathTestFolder → classes}/ClassVersionTest10.class +0 -0
- data/test/data/folder_classpath/{JarClasspathTestFolder → classes}/package/ClassVersionTest11.class +0 -0
- data/test/data/jar_classpath/JarClasspathTest.jar +0 -0
- data/test/data/jar_classpath/JarClasspathTest.zip +0 -0
- data/test/data/jar_classpath/JarClasspathTestManifest.jar +0 -0
- data/test/data/jar_classpath/JarClasspathTestMultiManifest.jar +0 -0
- data/test/data/jar_classpath/make.bat +6 -2
- data/test/data/jar_searcher/BrokenRunnable_102.class +0 -0
- data/test/data/java_home_classpath/jdk118/lib/classes.zip +0 -0
- data/test/data/java_name_scanner/META-INF/MANIFEST.MF +12 -0
- data/test/data/java_name_scanner/plugin.xml +18 -0
- data/test/data/maven_classpath/module/pom.xml +8 -0
- data/test/data/maven_classpath/module/target/classes/ClassVersionTest12.class +0 -0
- data/test/data/maven_classpath/pom.xml +8 -0
- data/test/data/maven_classpath/target/classes/ClassVersionTest10.class +0 -0
- data/test/data/maven_classpath/target/test-classes/ClassVersionTest11.class +0 -0
- data/test/data/transitive_dependencies/A.class +0 -0
- data/test/data/transitive_dependencies/A.java +5 -0
- data/test/data/transitive_dependencies/B.class +0 -0
- data/test/data/transitive_dependencies/B.java +3 -0
- data/test/data/transitive_dependencies/C.class +0 -0
- data/test/data/transitive_dependencies/C.java +3 -0
- data/test/data/transitive_dependencies/Start.class +0 -0
- data/test/data/transitive_dependencies/Start.java +4 -0
- data/test/data/transitive_dependencies/make.bat +3 -0
- data/test/data/zip_file/commons-math-2.2-broken.zip +0 -0
- data/test/data/zip_file/regenerated-with-7zip.zip +0 -0
- data/test/data/zip_file/regenerated-with-jar.zip +0 -0
- data/test/dot_classpath.rb +33 -0
- data/test/logging_folder_classpath.rb +19 -0
- data/test/setup.rb +1 -1
- data/test/test_access_flags.rb +58 -32
- data/test/test_adder_tree.rb +78 -0
- data/test/test_any_classpath.rb +39 -0
- data/test/test_base.rb +9 -7
- data/test/test_caching_classpath.rb +41 -0
- data/test/test_class_entry.rb +60 -60
- data/test/test_class_magic.rb +31 -0
- data/test/test_class_version.rb +25 -25
- data/test/test_composite_classpath.rb +22 -23
- data/test/test_constant_pool.rb +37 -13
- data/test/test_convention_classpath.rb +39 -0
- data/test/test_eclipse_classpath.rb +73 -0
- data/test/test_factory.rb +61 -0
- data/test/test_folder_classpath.rb +26 -10
- data/test/test_imported_types.rb +34 -0
- data/test/test_jar_classpath.rb +29 -14
- data/test/test_jar_searcher.rb +27 -14
- data/test/test_java_class_header.rb +22 -10
- data/test/test_java_class_header_as_java_name.rb +41 -0
- data/test/test_java_home_classpath.rb +17 -11
- data/test/test_java_name.rb +204 -64
- data/test/test_java_name_factory.rb +52 -0
- data/test/test_java_name_scanner.rb +24 -0
- data/test/test_javaclass_api.rb +43 -0
- data/test/test_list.rb +58 -44
- data/test/test_load_directive.rb +34 -0
- data/test/test_maven_classpath.rb +46 -0
- data/test/test_package_entry.rb +27 -22
- data/test/test_references.rb +14 -14
- data/test/test_string_hexdump.rb +24 -0
- data/test/test_string_ux.rb +18 -106
- data/test/test_tracking_classpath.rb +112 -0
- data/test/test_transitive_dependencies.rb +31 -0
- data/test/test_unpacking_jar_classpath.rb +43 -0
- data/test/test_zip_file.rb +33 -0
- data/test/ts_all_tests.rb +80 -18
- data/thanks.txt +2 -0
- metadata +151 -22
- data/lib/javaclass/classpath/port_ClassPathEntry.java +0 -202
- data/lib/javaclass/classpath/port_ClassPathEntryFactory.java +0 -311
- data/lib/javaclass/classpath/port_DirectoryRepository.java +0 -24
- data/lib/javaclass/metric/ccd.rb +0 -68
- data/lib/javaclass/metric/class_usage.rb +0 -41
- data/test/test_javaclass.rb +0 -22
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'javaclass/dsl/loading_classpath'
|
2
|
+
require 'javaclass/dsl/caching_classpath'
|
3
|
+
require 'javaclass/analyse/dependencies'
|
4
|
+
require 'javaclass/analyse/transitive_dependencies'
|
5
|
+
|
6
|
+
module JavaClass
|
7
|
+
module Dsl
|
8
|
+
|
9
|
+
# A mixin for all class path analyser functions that need to be mixed into LoadingClasspath.
|
10
|
+
# Author:: Peter Kofler
|
11
|
+
module ClasspathAnalysers
|
12
|
+
# add dependency analysis to LoadingClasspath
|
13
|
+
include Analyse::Dependencies
|
14
|
+
# add transitive dependency analysis to LoadingClasspath
|
15
|
+
include Analyse::TransitiveDependencies
|
16
|
+
end
|
17
|
+
|
18
|
+
class LoadingClasspath
|
19
|
+
include ClasspathAnalysers
|
20
|
+
end
|
21
|
+
|
22
|
+
class CachingClasspath
|
23
|
+
include ClasspathAnalysers
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'javaclass/java_language'
|
2
|
+
require 'javaclass/java_name'
|
3
|
+
|
4
|
+
module JavaClass
|
5
|
+
module Dsl
|
6
|
+
|
7
|
+
# Module to mixin to recognize full qualified Java classnames in Ruby code.
|
8
|
+
# Packages have to be suffixed with ".*" to be recognized.
|
9
|
+
# This is a bit dangerous, as wrong method or variable names with are a valid
|
10
|
+
# country code are not recognized as invalid.
|
11
|
+
# Author:: Peter Kofler
|
12
|
+
#
|
13
|
+
# === Usage
|
14
|
+
#
|
15
|
+
# require 'javaclass/dsl/java_name_factory'
|
16
|
+
# include JavaNameFactory
|
17
|
+
#
|
18
|
+
# java.lang.String # => "java.lang.String"
|
19
|
+
# java.lang.* # => "java.lang"
|
20
|
+
#
|
21
|
+
module JavaNameFactory
|
22
|
+
|
23
|
+
alias :__top_level_method_missing__ :method_missing # :nodoc:
|
24
|
+
|
25
|
+
# Convert the beginning of a full qualified Java classname starting with 'java' to a JavaQualifiedName instance.
|
26
|
+
def java
|
27
|
+
TemporaryJavaNamePart.new('java') { __top_level_method_missing__(:java) }
|
28
|
+
end
|
29
|
+
|
30
|
+
# Convert the beginning of a full qualified Java classname to a JavaQualifiedName instance.
|
31
|
+
def method_missing(method_id, *args)
|
32
|
+
str = method_id.id2name
|
33
|
+
if JavaLanguage::ALLOWED_PACKAGE_PREFIX.include?(str)
|
34
|
+
TemporaryJavaNamePart.new(str) { __top_level_method_missing__(method_id, args) }
|
35
|
+
else
|
36
|
+
__top_level_method_missing__(method_id, args)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# # Overwrite the _id_ method. It's deprecated anyway.
|
41
|
+
# def id
|
42
|
+
# TemporaryJavaNamePart.new('id')
|
43
|
+
# end
|
44
|
+
|
45
|
+
# Private temporary result to continue collecting qualified name parts.
|
46
|
+
# Author:: Peter Kofler
|
47
|
+
class TemporaryJavaNamePart # :nodoc:
|
48
|
+
|
49
|
+
# Create a part with _history_ package name so far that started in _context_ instance.
|
50
|
+
def initialize(history, &fail)
|
51
|
+
@history = history
|
52
|
+
@context = fail
|
53
|
+
end
|
54
|
+
|
55
|
+
alias :__unused_method_missing__ :method_missing
|
56
|
+
|
57
|
+
def method_missing(method_id, *args)
|
58
|
+
str = method_id.id2name
|
59
|
+
if JavaLanguage::RESERVED_WORDS.include?(str)
|
60
|
+
@context.call
|
61
|
+
elsif str =~ /^#{JavaLanguage::TYPE_REGEX}$/
|
62
|
+
# starts with an uppercase letter, this is a class
|
63
|
+
JavaQualifiedName.new("#{@history}#{JavaLanguage::SEPARATOR}#{str}", &@context)
|
64
|
+
elsif str == '*'
|
65
|
+
# special syntax, ending with *, this is a package
|
66
|
+
JavaPackageName.new("#{@history}")
|
67
|
+
elsif str =~ JavaLanguage::PACKAGE_REGEX
|
68
|
+
# starts with a lowercase letter, this is a package
|
69
|
+
TemporaryJavaNamePart.new("#{@history}#{JavaLanguage::SEPARATOR}#{str}", &@context)
|
70
|
+
else
|
71
|
+
@context.call
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'javaclass/classfile/java_class_header'
|
2
|
+
require 'javaclass/classfile/java_class_header_as_java_name'
|
3
|
+
require 'javaclass/classfile/java_class_header_shortcuts'
|
4
|
+
|
5
|
+
module JavaClass
|
6
|
+
module Dsl
|
7
|
+
|
8
|
+
# Load the classfiles and create the JavaClassHeader. This module ties together all ClassFile and Classpath modules.
|
9
|
+
# Author:: Peter Kofler
|
10
|
+
module Loader
|
11
|
+
|
12
|
+
# Read and disassemble the given class from _filename_ (full file name).
|
13
|
+
def load_fs(filename)
|
14
|
+
begin
|
15
|
+
disassemble(File.open(filename, 'rb') { |io| io.read.freeze } )
|
16
|
+
rescue ClassFile::ClassFormatError => ex
|
17
|
+
ex.add_classname(filename)
|
18
|
+
raise ex
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
# Read and disassemble the given class _classname_ from _classpath_ .
|
23
|
+
def load_cp(classname, classpath)
|
24
|
+
begin
|
25
|
+
disassemble(classpath.load_binary(classname))
|
26
|
+
rescue ClassFile::ClassFormatError => ex
|
27
|
+
ex.add_classname(classname, classpath.to_s)
|
28
|
+
raise ex
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Read and disassemble the given class inside _data_ (byte data). Might throw a
|
33
|
+
# ClassFile::ClassFormatError if the classfile is not valid.
|
34
|
+
# This creates a +ClassFile::JavaClassHeader+ .
|
35
|
+
def disassemble(data)
|
36
|
+
ClassFile::JavaClassHeader.new(data)
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'delegate'
|
2
|
+
require 'javaclass/classscanner/scanners'
|
3
|
+
require 'javaclass/dsl/loader'
|
4
|
+
|
5
|
+
module JavaClass
|
6
|
+
module Dsl
|
7
|
+
|
8
|
+
# A delegator Classpath that loads and parses classes.
|
9
|
+
# Author:: Peter Kofler
|
10
|
+
class LoadingClasspath < SimpleDelegator
|
11
|
+
|
12
|
+
# Create a lading instance of the _classpath_ .
|
13
|
+
def initialize(classpath)
|
14
|
+
unless classpath.respond_to? :load_binary
|
15
|
+
raise ArgumentError, "wrong type of delegatee #{classpath.class}"
|
16
|
+
end
|
17
|
+
super(classpath)
|
18
|
+
end
|
19
|
+
|
20
|
+
# Read and disassemble the given class _classname_ .
|
21
|
+
def load(classname)
|
22
|
+
analyse(load_cp(classname, self))
|
23
|
+
end
|
24
|
+
|
25
|
+
# Load _listed_ or all classes and return the list of them. An additional block is used as _filter_ on class names.
|
26
|
+
def values(listed=nil, &filter)
|
27
|
+
listed ||= names(&filter)
|
28
|
+
listed.collect { |name| load(name) }
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
# add loader so binary data from classpath can be parsed
|
34
|
+
include Loader
|
35
|
+
# add scanners so loaded class headers can be scanned
|
36
|
+
include ClassScanner::Scanners
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
# A special directive which wraps a method with a LoadingClasspath.
|
41
|
+
# Author:: Peter Kofler
|
42
|
+
module LoadDirective # :nodoc:
|
43
|
+
|
44
|
+
# Wrap the method with _method_name_ in a LoadingClasspath.
|
45
|
+
def wrap_classpath(method_name)
|
46
|
+
self.module_eval("alias :__pure_#{method_name}__ #{method_name.to_s}")
|
47
|
+
self.module_eval("def #{method_name}(*obj) LoadingClasspath.new(__pure_#{method_name}__(*obj)) end")
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'javaclass/classpath/factory'
|
2
|
+
require 'javaclass/classscanner/scanners'
|
3
|
+
require 'javaclass/dsl/loader'
|
4
|
+
require 'javaclass/dsl/loading_classpath'
|
5
|
+
require 'javaclass/dsl/classpath_analysers'
|
6
|
+
require 'javaclass/java_name_scanner'
|
7
|
+
|
8
|
+
module JavaClass
|
9
|
+
|
10
|
+
# The module DSL contains shortcuts to make loading and analysing classes
|
11
|
+
# easier. This is the high-level API with usage/DSL features.
|
12
|
+
# Author:: Peter Kofler
|
13
|
+
module Dsl
|
14
|
+
|
15
|
+
class EclipseClasspathDelegator # :nodoc:
|
16
|
+
def add_variable(name, value)
|
17
|
+
Classpath::EclipseClasspath::add_variable(name, value)
|
18
|
+
end
|
19
|
+
def skip_lib
|
20
|
+
Classpath::EclipseClasspath::skip_lib
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
# Methods to be mixed into Object.
|
25
|
+
# Author:: Peter Kofler
|
26
|
+
module Mixin
|
27
|
+
# add the Java language constants
|
28
|
+
include JavaLanguage
|
29
|
+
# add classpath factory methods
|
30
|
+
include Classpath::Factory
|
31
|
+
# add class header loading
|
32
|
+
include Loader
|
33
|
+
# decorate classpath with loading
|
34
|
+
extend LoadDirective
|
35
|
+
wrap_classpath :classpath
|
36
|
+
wrap_classpath :environment_classpath
|
37
|
+
wrap_classpath :full_classpath
|
38
|
+
wrap_classpath :workspace
|
39
|
+
# add scanner factory methods for direct use by user
|
40
|
+
include ClassScanner::Scanners
|
41
|
+
# add hard coded class name finder
|
42
|
+
include JavaNameScanner
|
43
|
+
|
44
|
+
# Delegate shortcut to Classpath::EclipseClasspath
|
45
|
+
Eclipse = EclipseClasspathDelegator.new
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
class Object # :nodoc:
|
53
|
+
include JavaClass::Dsl::Mixin
|
54
|
+
end
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'zip/zipfilesystem'
|
2
|
+
|
3
|
+
# Patch the zip for invalid Linux file system flags found in some JARs.
|
4
|
+
module Zip # :nodoc:all
|
5
|
+
class ZipEntry
|
6
|
+
|
7
|
+
# uncomment next method to avoid swallowing errors, else we get +nil+ entries later.
|
8
|
+
# def ZipEntry.read_c_dir_entry(io)
|
9
|
+
# entry = new(io.path)
|
10
|
+
# entry.read_c_dir_entry(io)
|
11
|
+
# return entry
|
12
|
+
# end
|
13
|
+
|
14
|
+
alias :strict_read_c_dir_entry read_c_dir_entry
|
15
|
+
|
16
|
+
def read_c_dir_entry(io)
|
17
|
+
staticSizedFieldsBuf = io.read(CDIR_ENTRY_STATIC_HEADER_LENGTH)
|
18
|
+
unless (staticSizedFieldsBuf.size == CDIR_ENTRY_STATIC_HEADER_LENGTH)
|
19
|
+
raise ZipError, "Premature end of file. Not enough data for zip cdir entry header"
|
20
|
+
end
|
21
|
+
|
22
|
+
@header_signature ,
|
23
|
+
@version , # version of encoding software
|
24
|
+
@fstype , # filesystem type
|
25
|
+
@versionNeededToExtract,
|
26
|
+
@gp_flags ,
|
27
|
+
@compression_method ,
|
28
|
+
lastModTime ,
|
29
|
+
lastModDate ,
|
30
|
+
@crc ,
|
31
|
+
@compressed_size ,
|
32
|
+
@size ,
|
33
|
+
nameLength ,
|
34
|
+
extraLength ,
|
35
|
+
commentLength ,
|
36
|
+
diskNumberStart ,
|
37
|
+
@internalFileAttributes,
|
38
|
+
@externalFileAttributes,
|
39
|
+
@localHeaderOffset ,
|
40
|
+
@name ,
|
41
|
+
@extra ,
|
42
|
+
@comment = staticSizedFieldsBuf.unpack('VCCvvvvvVVVvvvvvVV')
|
43
|
+
|
44
|
+
unless @header_signature == CENTRAL_DIRECTORY_ENTRY_SIGNATURE
|
45
|
+
raise ZipError, "Zip local header magic not found at location '#{localHeaderOffset}'"
|
46
|
+
end
|
47
|
+
set_time(lastModDate, lastModTime)
|
48
|
+
|
49
|
+
@name = io.read(nameLength)
|
50
|
+
if ZipExtraField === @extra
|
51
|
+
@extra.merge(io.read(extraLength))
|
52
|
+
else
|
53
|
+
@extra = ZipExtraField.new(io.read(extraLength))
|
54
|
+
end
|
55
|
+
@comment = io.read(commentLength)
|
56
|
+
unless (@comment && @comment.length == commentLength)
|
57
|
+
raise ZipError, "Truncated cdir zip entry header"
|
58
|
+
end
|
59
|
+
|
60
|
+
case @fstype
|
61
|
+
when FSTYPE_UNIX
|
62
|
+
@unix_perms = (@externalFileAttributes >> 16) & 07777
|
63
|
+
|
64
|
+
case (@externalFileAttributes >> 28)
|
65
|
+
when 04
|
66
|
+
@ftype = :directory
|
67
|
+
when 010
|
68
|
+
@ftype = :file
|
69
|
+
when 012
|
70
|
+
@ftype = :link
|
71
|
+
else
|
72
|
+
# raise ZipInternalError, "unknown file type #{'0%o' % (@externalFileAttributes >> 28)}"
|
73
|
+
|
74
|
+
# PKZIP format see http://www.pkware.com/documents/APPNOTE/APPNOTE-6.3.0.TXT
|
75
|
+
# external file attributes: (4 bytes)
|
76
|
+
# The mapping of the external attributes is host-system dependent (see 'version made by').
|
77
|
+
# For MS-DOS, the low order byte is the MS-DOS directory attribute byte. If input came
|
78
|
+
# from standard input, this field is set to zero.
|
79
|
+
# for the meaning of these flags see http://unix.stackexchange.com/questions/14705/the-zip-formats-external-file-attribute
|
80
|
+
|
81
|
+
# unknown flag, fall back to name detection
|
82
|
+
if name_is_directory?
|
83
|
+
@ftype = :directory
|
84
|
+
else
|
85
|
+
@ftype = :file
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
else
|
91
|
+
if name_is_directory?
|
92
|
+
@ftype = :directory
|
93
|
+
else
|
94
|
+
@ftype = :file
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
module JavaClass
|
103
|
+
|
104
|
+
# Module for wrappers around used gems to avoid direct dependencies to gems.
|
105
|
+
# Author:: Peter Kofler
|
106
|
+
module Gems
|
107
|
+
|
108
|
+
# Abstraction of a Zip archive. Wraps around
|
109
|
+
# Zip::ZipFile of {rubyzip}[http://rubyzip.sourceforge.net/]
|
110
|
+
# Author:: Peter Kofler
|
111
|
+
class ZipFile
|
112
|
+
def initialize(file)
|
113
|
+
@archive = file
|
114
|
+
end
|
115
|
+
|
116
|
+
# Read the _file_ from archive.
|
117
|
+
def read(file)
|
118
|
+
begin
|
119
|
+
Zip::ZipFile.open(@archive) { |zipfile| zipfile.file.read(file) }
|
120
|
+
rescue
|
121
|
+
nil
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
# List the entries of this zip for the block given.
|
126
|
+
def entries(&block)
|
127
|
+
Zip::ZipFile.foreach(@archive) do |entry|
|
128
|
+
block.call(ZipEntry.new(entry))
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
# Abstraction of an entry in a Zip archive. Wraps around
|
135
|
+
# Zip::ZipEntry of {rubyzip}[http://rubyzip.sourceforge.net/]
|
136
|
+
# Author:: Peter Kofler
|
137
|
+
class ZipEntry
|
138
|
+
|
139
|
+
def initialize(entry)
|
140
|
+
@entry = entry
|
141
|
+
end
|
142
|
+
|
143
|
+
def name
|
144
|
+
@entry.name
|
145
|
+
end
|
146
|
+
|
147
|
+
def file?
|
148
|
+
@entry.file?
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module JavaClass
|
2
|
+
|
3
|
+
# All kind of constant information related to Java and the Java language.
|
4
|
+
# Author:: Peter Kofler
|
5
|
+
module JavaLanguage
|
6
|
+
|
7
|
+
SOURCE = '.java'
|
8
|
+
SOURCE_REGEX = /#{Regexp.escape(SOURCE)}$/
|
9
|
+
CLASS = '.class'
|
10
|
+
CLASS_REGEX = /#{Regexp.escape(CLASS)}$/
|
11
|
+
|
12
|
+
# A general Java identifier from Java spec.
|
13
|
+
IDENTIFIER_REGEX = /[a-zA-Z_$][a-zA-Z_$0-9]*/
|
14
|
+
LOWER_IDENTIFIER_REGEX = /[a-z_$][a-z_$0-9]*/
|
15
|
+
|
16
|
+
# A proper package name part. This is more strict than IDENTIFIER_REGEX because it's all lowercase letters.
|
17
|
+
PACKAGE_REGEX = /^#{LOWER_IDENTIFIER_REGEX}$/
|
18
|
+
|
19
|
+
# A proper type (class) name. This is more strict than IDENTIFIER_REGEX because it starts with uppercase letters.
|
20
|
+
TYPE_REGEX = /[A-Z][a-zA-Z_$0-9]*/
|
21
|
+
|
22
|
+
# A proper member (field or method) name. This is more strict than IDENTIFIER_REGEX because it starts with lowercase letters.
|
23
|
+
MEMBER_REGEX = /^[a-z][a-zA-Z_$0-9]*$/
|
24
|
+
|
25
|
+
# Separator between qualified name parts.
|
26
|
+
SEPARATOR = '.'
|
27
|
+
SEPARATOR_REGEX = Regexp::escape(SEPARATOR)
|
28
|
+
|
29
|
+
RESOURCE_FOLDER = File.join(File.dirname(__FILE__), 'resources')
|
30
|
+
|
31
|
+
# Reserved words of the Java language.
|
32
|
+
RESERVED_WORDS = IO.readlines(File.join(RESOURCE_FOLDER, 'reserved_words.txt')).map { |l| l.chomp }
|
33
|
+
|
34
|
+
# List of ISO 3166 two letter country names. Used to recognize valid domain suffix/Java package names.
|
35
|
+
# See:: http://www.iso.org/iso/list-en1-semic-3.txt
|
36
|
+
ISO_COUNTRIES = IO.readlines(File.join(RESOURCE_FOLDER, 'iso_3166_countries.txt')).map { |l| l.chomp }
|
37
|
+
|
38
|
+
# List of non ISO 3166 U.S. domain suffix.
|
39
|
+
US_DOMAINS = %w| com net biz org |
|
40
|
+
|
41
|
+
# List of all (usual) allowed Java package prefixes.
|
42
|
+
ALLOWED_PACKAGE_PREFIX = %w| java javax | + US_DOMAINS + ISO_COUNTRIES
|
43
|
+
|
44
|
+
# List of all package prefixes found in the JDK (up to 1.6).
|
45
|
+
JDK_PACKAGES = IO.readlines(File.join(RESOURCE_FOLDER, 'jdk_packages.txt')).map { |l| l.chomp }
|
46
|
+
JDK_PACKAGES_REGEX = JDK_PACKAGES.collect { |pkg| /^#{pkg}\./ }
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|