class JavaClass::Classpath::JarClasspath

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

Public Class Methods

new(jarfile) click to toggle source

Create a classpath with this jarfile .

# 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
valid_location?(file) click to toggle source

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

# 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

additional_classpath() click to toggle source

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

# 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
count() click to toggle source

Return the number of classes in this jar.

# File lib/javaclass/classpath/jar_classpath.rb, line 91
def count
  @class_names.size
end
includes?(classname) click to toggle source

Return if classname is included in this jar.

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

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

# File lib/javaclass/classpath/jar_classpath.rb, line 45
def jar?
  @manifest != nil
end
load_binary(classname) click to toggle source

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

# 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
names(&filter) click to toggle source

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

# 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

Private Instance Methods

init_classes() click to toggle source

Set up the class names.

# File lib/javaclass/classpath/jar_classpath.rb, line 109
def init_classes
  @class_names = list_classes.
    reject { |n| n =~ /package-info\.class$/ }.
    find_all { |n| valid_java_name?(n) }.
    sort.
    collect { |cl| JavaClassFileName.new(cl) } 
  pairs = @class_names.map { |name| [name.file_name, 1] }.flatten
  @class_lookup = Hash[ *pairs ] # file_name (String) => anything
end
list_classes() click to toggle source

Return the list of classnames (in fact file names) found in this jarfile.

# File lib/javaclass/classpath/jar_classpath.rb, line 98
def list_classes
  list = []
  JavaClass::Gems::ZipFile.new(@jarfile).entries do |entry|
    name = entry.name
    next unless entry.file? and name =~ JavaLanguage::CLASS_REGEX # class file
    list << name
  end
  list
end
setup_cache() click to toggle source

Set up the temporary unpacking. This sets the delegate field for future use.

# File lib/javaclass/classpath/jar_classpath.rb, line 129
def setup_cache
  unpacker = TemporaryUnpacker.new(@jarfile)
  unpacker.create_temporary_folder
  unpacker.unpack!
  @delegate = FolderClasspath.new(unpacker.folder)
end
valid_java_name?(name) click to toggle source
# File lib/javaclass/classpath/jar_classpath.rb, line 119
def valid_java_name?(name)
  if JavaClassFileName.valid?(name) 
    true
  else
    warn("skipping invalid class file name #{name} in classpath #{@jarfile}") 
    false
  end
end