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.
Files changed (175) hide show
  1. data/Rakefile +67 -56
  2. data/Readme.txt +42 -39
  3. data/example_task.rb +172 -0
  4. data/examples/check_interface_names.rb +44 -0
  5. data/examples/corpus.rb +19 -0
  6. data/examples/count_classes_in_modules.rb +38 -0
  7. data/examples/cumulative_dependencies.rb +39 -0
  8. data/examples/find_all_imported_types.rb +44 -0
  9. data/examples/find_referenced_modules.rb +53 -0
  10. data/examples/find_unreferenced_classes.rb +65 -0
  11. data/examples/generate_class_lists.rb +67 -43
  12. data/examples/profiler_scratchpad.rb +33 -0
  13. data/examples/simple_usage.rb +42 -0
  14. data/history.txt +29 -7
  15. data/javaclass.gemspec +31 -0
  16. data/lib/javaclass/adder_tree.rb +92 -0
  17. data/lib/javaclass/analyse/dependencies.rb +52 -0
  18. data/lib/javaclass/{metric/metrics.txt → analyse/ideas.txt} +2 -2
  19. data/lib/javaclass/analyse/transitive_dependencies.rb +52 -0
  20. data/lib/javaclass/classfile/access_flag_constants.rb +24 -0
  21. data/lib/javaclass/classfile/access_flags.rb +49 -26
  22. data/lib/javaclass/classfile/class_format_error.rb +37 -0
  23. data/lib/javaclass/classfile/class_magic.rb +16 -8
  24. data/lib/javaclass/classfile/class_version.rb +19 -25
  25. data/lib/javaclass/classfile/constant_pool.rb +110 -45
  26. data/lib/javaclass/classfile/constants/base.rb +33 -12
  27. data/lib/javaclass/classfile/constants/double_reference.rb +55 -41
  28. data/lib/javaclass/classfile/constants/single_reference.rb +29 -21
  29. data/lib/javaclass/classfile/constants/value.rb +43 -33
  30. data/lib/javaclass/classfile/java_class_header.rb +72 -46
  31. data/lib/javaclass/classfile/java_class_header_as_java_name.rb +33 -0
  32. data/lib/javaclass/classfile/java_class_header_shortcuts.rb +19 -0
  33. data/lib/javaclass/classfile/references.rb +21 -19
  34. data/lib/javaclass/classlist/class_entry.rb +26 -27
  35. data/lib/javaclass/classlist/jar_searcher.rb +34 -25
  36. data/lib/javaclass/classlist/list.rb +31 -31
  37. data/lib/javaclass/classlist/package_entry.rb +25 -24
  38. data/lib/javaclass/classpath/any_classpath.rb +48 -0
  39. data/lib/javaclass/classpath/class_not_found_error.rb +20 -0
  40. data/lib/javaclass/classpath/classpaths.txt +2 -2
  41. data/lib/javaclass/classpath/composite_classpath.rb +56 -54
  42. data/lib/javaclass/classpath/convention_classpath.rb +38 -0
  43. data/lib/javaclass/classpath/eclipse_classpath.rb +74 -0
  44. data/lib/javaclass/classpath/factory.rb +65 -0
  45. data/lib/javaclass/classpath/file_classpath.rb +47 -0
  46. data/lib/javaclass/classpath/folder_classpath.rb +42 -44
  47. data/lib/javaclass/classpath/jar_classpath.rb +91 -52
  48. data/lib/javaclass/classpath/java_home_classpath.rb +24 -13
  49. data/lib/javaclass/classpath/maven_classpath.rb +44 -0
  50. data/lib/javaclass/classpath/temporary_unpacker.rb +111 -0
  51. data/lib/javaclass/classpath/tracking_classpath.rb +144 -0
  52. data/lib/javaclass/classscanner/ideas.txt +3 -0
  53. data/lib/javaclass/classscanner/imported_types.rb +29 -0
  54. data/lib/javaclass/classscanner/scanners.rb +29 -0
  55. data/lib/javaclass/delegate_directive.rb +15 -0
  56. data/lib/javaclass/dsl/caching_classpath.rb +38 -0
  57. data/lib/javaclass/dsl/classpath_analysers.rb +27 -0
  58. data/lib/javaclass/dsl/java_name_factory.rb +79 -0
  59. data/lib/javaclass/dsl/loader.rb +42 -0
  60. data/lib/javaclass/dsl/loading_classpath.rb +53 -0
  61. data/lib/javaclass/dsl/mixin.rb +54 -0
  62. data/lib/javaclass/gems/zip_file.rb +154 -0
  63. data/lib/javaclass/java_language.rb +50 -0
  64. data/lib/javaclass/java_name.rb +329 -55
  65. data/lib/javaclass/java_name_scanner.rb +95 -0
  66. data/lib/javaclass/resources/iso_3166_countries.txt +240 -0
  67. data/lib/javaclass/resources/jdk0_packages.txt +6 -0
  68. data/lib/javaclass/resources/jdk1_packages.txt +6 -0
  69. data/lib/javaclass/resources/jdk2_packages.txt +4 -0
  70. data/lib/javaclass/resources/jdk3_packages.txt +6 -0
  71. data/lib/javaclass/resources/jdk4_packages.txt +22 -0
  72. data/lib/javaclass/resources/jdk5_packages.txt +5 -0
  73. data/lib/javaclass/resources/jdk6_packages.txt +7 -0
  74. data/lib/javaclass/resources/jdk7_packages.txt +0 -0
  75. data/lib/javaclass/resources/jdk_packages.txt +53 -0
  76. data/lib/javaclass/resources/reserved_words.txt +50 -0
  77. data/lib/javaclass/string_hexdump.rb +76 -0
  78. data/lib/javaclass/string_ux.rb +21 -10
  79. data/lib/javaclass.rb +16 -41
  80. data/license.txt +28 -0
  81. data/planned.txt +13 -0
  82. data/test/data/Object_102.class +0 -0
  83. data/test/data/Runnable_102.class +0 -0
  84. data/test/data/access_flags/AccessFlagsTestAnnotation.class +0 -0
  85. data/test/data/access_flags/AccessFlagsTestAnnotation.java +3 -0
  86. data/test/data/access_flags/AccessFlagsTestEnum$1.class +0 -0
  87. data/test/data/access_flags/AccessFlagsTestEnum.class +0 -0
  88. data/test/data/access_flags/AccessFlagsTestEnum.java +6 -0
  89. data/test/data/access_flags/AccessFlagsTestInner$1.class +0 -0
  90. data/test/data/access_flags/AccessFlagsTestInner$2.class +0 -0
  91. data/test/data/access_flags/AccessFlagsTestInner.class +0 -0
  92. data/test/data/access_flags/AccessFlagsTestInner.java +13 -0
  93. data/test/data/access_flags/AccessFlagsTestPackage.class +0 -0
  94. data/test/data/access_flags/AccessFlagsTestPackage.java +1 -1
  95. data/test/data/api/packagename/AccessFlagsTestPublic.class +0 -0
  96. data/test/data/class_version/ClassVersionTest17.class +0 -0
  97. data/test/data/class_version/make.bat +6 -2
  98. data/test/data/eclipse_classpath/classes/ClassVersionTest12.class +0 -0
  99. data/test/data/eclipse_classpath/lib/JarClasspathTest.jar +0 -0
  100. data/test/data/eclipse_classpath/test-classes/ClassVersionTest13.class +0 -0
  101. data/test/data/folder_classpath/{JarClasspathTestFolder → classes}/ClassVersionTest10.class +0 -0
  102. data/test/data/folder_classpath/{JarClasspathTestFolder → classes}/package/ClassVersionTest11.class +0 -0
  103. data/test/data/jar_classpath/JarClasspathTest.jar +0 -0
  104. data/test/data/jar_classpath/JarClasspathTest.zip +0 -0
  105. data/test/data/jar_classpath/JarClasspathTestManifest.jar +0 -0
  106. data/test/data/jar_classpath/JarClasspathTestMultiManifest.jar +0 -0
  107. data/test/data/jar_classpath/make.bat +6 -2
  108. data/test/data/jar_searcher/BrokenRunnable_102.class +0 -0
  109. data/test/data/java_home_classpath/jdk118/lib/classes.zip +0 -0
  110. data/test/data/java_name_scanner/META-INF/MANIFEST.MF +12 -0
  111. data/test/data/java_name_scanner/plugin.xml +18 -0
  112. data/test/data/maven_classpath/module/pom.xml +8 -0
  113. data/test/data/maven_classpath/module/target/classes/ClassVersionTest12.class +0 -0
  114. data/test/data/maven_classpath/pom.xml +8 -0
  115. data/test/data/maven_classpath/target/classes/ClassVersionTest10.class +0 -0
  116. data/test/data/maven_classpath/target/test-classes/ClassVersionTest11.class +0 -0
  117. data/test/data/transitive_dependencies/A.class +0 -0
  118. data/test/data/transitive_dependencies/A.java +5 -0
  119. data/test/data/transitive_dependencies/B.class +0 -0
  120. data/test/data/transitive_dependencies/B.java +3 -0
  121. data/test/data/transitive_dependencies/C.class +0 -0
  122. data/test/data/transitive_dependencies/C.java +3 -0
  123. data/test/data/transitive_dependencies/Start.class +0 -0
  124. data/test/data/transitive_dependencies/Start.java +4 -0
  125. data/test/data/transitive_dependencies/make.bat +3 -0
  126. data/test/data/zip_file/commons-math-2.2-broken.zip +0 -0
  127. data/test/data/zip_file/regenerated-with-7zip.zip +0 -0
  128. data/test/data/zip_file/regenerated-with-jar.zip +0 -0
  129. data/test/dot_classpath.rb +33 -0
  130. data/test/logging_folder_classpath.rb +19 -0
  131. data/test/setup.rb +1 -1
  132. data/test/test_access_flags.rb +58 -32
  133. data/test/test_adder_tree.rb +78 -0
  134. data/test/test_any_classpath.rb +39 -0
  135. data/test/test_base.rb +9 -7
  136. data/test/test_caching_classpath.rb +41 -0
  137. data/test/test_class_entry.rb +60 -60
  138. data/test/test_class_magic.rb +31 -0
  139. data/test/test_class_version.rb +25 -25
  140. data/test/test_composite_classpath.rb +22 -23
  141. data/test/test_constant_pool.rb +37 -13
  142. data/test/test_convention_classpath.rb +39 -0
  143. data/test/test_eclipse_classpath.rb +73 -0
  144. data/test/test_factory.rb +61 -0
  145. data/test/test_folder_classpath.rb +26 -10
  146. data/test/test_imported_types.rb +34 -0
  147. data/test/test_jar_classpath.rb +29 -14
  148. data/test/test_jar_searcher.rb +27 -14
  149. data/test/test_java_class_header.rb +22 -10
  150. data/test/test_java_class_header_as_java_name.rb +41 -0
  151. data/test/test_java_home_classpath.rb +17 -11
  152. data/test/test_java_name.rb +204 -64
  153. data/test/test_java_name_factory.rb +52 -0
  154. data/test/test_java_name_scanner.rb +24 -0
  155. data/test/test_javaclass_api.rb +43 -0
  156. data/test/test_list.rb +58 -44
  157. data/test/test_load_directive.rb +34 -0
  158. data/test/test_maven_classpath.rb +46 -0
  159. data/test/test_package_entry.rb +27 -22
  160. data/test/test_references.rb +14 -14
  161. data/test/test_string_hexdump.rb +24 -0
  162. data/test/test_string_ux.rb +18 -106
  163. data/test/test_tracking_classpath.rb +112 -0
  164. data/test/test_transitive_dependencies.rb +31 -0
  165. data/test/test_unpacking_jar_classpath.rb +43 -0
  166. data/test/test_zip_file.rb +33 -0
  167. data/test/ts_all_tests.rb +80 -18
  168. data/thanks.txt +2 -0
  169. metadata +151 -22
  170. data/lib/javaclass/classpath/port_ClassPathEntry.java +0 -202
  171. data/lib/javaclass/classpath/port_ClassPathEntryFactory.java +0 -311
  172. data/lib/javaclass/classpath/port_DirectoryRepository.java +0 -24
  173. data/lib/javaclass/metric/ccd.rb +0 -68
  174. data/lib/javaclass/metric/class_usage.rb +0 -41
  175. 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