Class JavaClass::Classpath::JarClasspath
In: lib/javaclass/classpath/jar_classpath.rb
Parent: FileClasspath

Abstraction of a ZIP or JAR on the CLASSPATH. May return additional classpath elements for referenced libs. This is a leaf in the classpath tree.

Author:Peter Kofler

Methods

Public Class methods

Create a classpath with this jarfile .

[Source]

# File lib/javaclass/classpath/jar_classpath.rb, line 33
      def initialize(jarfile)
        super(jarfile)
        unless JarClasspath::valid_location?(jarfile)
          raise IOError, "jarfile #{jarfile} not found/no file"
        end
        @jarfile = jarfile
        init_classes
        @manifest = JavaClass::Gems::ZipFile.new(@jarfile).read('META-INF/MANIFEST.MF')
        setup_cache if JavaClass.unpack_jars?
      end

Check if the file is a valid location for a jar classpath.

[Source]

# File lib/javaclass/classpath/jar_classpath.rb, line 28
      def self.valid_location?(file)
        FileTest.exist?(file) && FileTest.file?(file) && FileTest.size(file) > 0 && file =~ /\.jar$|\.zip$/
      end

Public Instance methods

Return list of additional classpath elements defined in the manifest of this jarfile.

[Source]

# File lib/javaclass/classpath/jar_classpath.rb, line 50
      def additional_classpath
        if @manifest
          cp = @manifest.gsub(/\s{4,}/, ' ').scan(/^(.*): (.*)\s*$/).find { |p| p[0] == 'Class-Path' }
          if cp
            cp[1].strip.split.collect { |jar| File.join(File.dirname(@jarfile), jar) }
          else
            []
          end
        else
          []
        end
      end

Return the number of classes in this jar.

[Source]

# File lib/javaclass/classpath/jar_classpath.rb, line 91
      def count
        @class_names.size
      end

Return if classname is included in this jar.

[Source]

# File lib/javaclass/classpath/jar_classpath.rb, line 73
      def includes?(classname)
        @class_lookup[to_key(classname).file_name]
      end

Return true as this classpath element is a jar. Zip files return false as well.

[Source]

# File lib/javaclass/classpath/jar_classpath.rb, line 45
      def jar?
        @manifest != nil
      end

Load the binary data of the file name or class name classname from this jar.

[Source]

# File lib/javaclass/classpath/jar_classpath.rb, line 78
      def load_binary(classname)
        key = to_key(classname)
        if JavaClass.unpack_jars?
          @delegate.load_binary(key)
        else
          unless includes?(key)
            raise ClassNotFoundError.new(key, @jarfile)
          end
          JavaClass::Gems::ZipFile.new(@jarfile).read(key).freeze
        end
      end

Return the list of class names found in this jar. An additional block is used as filter on class names.

[Source]

# File lib/javaclass/classpath/jar_classpath.rb, line 64
      def names(&filter)
        if block_given?
          @class_names.find_all { |n| filter.call(n) }
        else
          @class_names.dup
        end
      end

[Validate]