Class: Processing::LibraryLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby-processing/library_loader.rb

Overview

Encapsulate library loader functionality as a class

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLibraryLoader


10
11
12
13
# File 'lib/ruby-processing/library_loader.rb', line 10

def initialize
  @sketchbook_library_path = File.join(find_sketchbook_path, 'libraries')
  @loaded_libraries = Hash.new(false)
end

Instance Attribute Details

#sketchbook_library_pathObject (readonly)

Returns the value of attribute sketchbook_library_path


8
9
10
# File 'lib/ruby-processing/library_loader.rb', line 8

def sketchbook_library_path
  @sketchbook_library_path
end

Instance Method Details

#get_library_paths(library_name, extension = nil) ⇒ Object


101
102
103
104
# File 'lib/ruby-processing/library_loader.rb', line 101

def get_library_paths(library_name, extension = nil)
  dir = get_library_directory_path(library_name, extension)
  Dir.glob("#{dir}/*.{rb,jar}")
end

#get_platform_specific_library_paths(basename) ⇒ Object


89
90
91
92
93
94
95
96
97
98
99
# File 'lib/ruby-processing/library_loader.rb', line 89

def get_platform_specific_library_paths(basename)
  bits = 'universal'  # for MacOSX, but does this even work, or does Mac return '64'?
  if java.lang.System.getProperty('sun.arch.data.model') == '32' ||
    java.lang.System.getProperty('java.vm.name').index('32')
    bits = '32'
  elsif java.lang.System.getProperty('sun.arch.data.model') == '64' ||
    java.lang.System.getProperty('java.vm.name').index('64')
    bits = '64' unless platform =~ /macosx/
  end
  [platform, platform + bits].map { |p| File.join(basename, p) }
end

#library_loaded?(library_name) ⇒ Boolean

Detect if a library has been loaded (for conditional loading)


16
17
18
# File 'lib/ruby-processing/library_loader.rb', line 16

def library_loaded?(library_name)
  @loaded_libraries[library_name.to_sym]
end

#load_java_library(library_name) ⇒ Object

HACK: For pure java libraries, such as the ones that are available on this page: processing.org/reference/libraries/index.html that include native code, we mess with the 'Java ClassLoader', so that you don't have to futz with your PATH. But it's probably bad juju.


56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# File 'lib/ruby-processing/library_loader.rb', line 56

def load_java_library(library_name)
  library_name = library_name.to_sym
  return true if @loaded_libraries.include?(library_name)
  jpath = get_library_directory_path(library_name, 'jar')
  jars = get_library_paths(library_name, 'jar')
  return false if jars.empty?
  jars.each { |jar| require jar }
  platform_specific_library_paths = get_platform_specific_library_paths(jpath)
  platform_specific_library_paths = platform_specific_library_paths.select do |ppath|
    FileTest.directory?(ppath) && !Dir.glob(File.join(ppath, '*.{so,dll,jnilib}')).empty?
  end
  unless platform_specific_library_paths.empty?
    platform_specific_library_paths << java.lang.System.getProperty('java.library.path')
    new_library_path = platform_specific_library_paths.join(java.io.File.pathSeparator)
    java.lang.System.setProperty('java.library.path', new_library_path)
    field = java.lang.Class.for_name('java.lang.ClassLoader').get_declared_field('sys_paths')
    if field
      field.accessible = true
      field.set(java.lang.Class.for_name('java.lang.System').get_class_loader, nil)
    end
  end
  @loaded_libraries[library_name] = true
end

#load_libraries(*args) ⇒ Object Also known as: load_library

Load a list of Ruby or Java libraries (in that order) Usage: load_libraries :opengl, :boids

If a library is put into a 'library' folder next to the sketch it will be used instead of the library that ships with Ruby-Processing.


25
26
27
28
29
30
31
# File 'lib/ruby-processing/library_loader.rb', line 25

def load_libraries(*args)
  message = 'no such file to load -- %s'
  args.each do |lib|
    loaded = load_ruby_library(lib) || load_java_library(lib)
    fail(LoadError.new, format(message, lib)) unless loaded
  end
end

#load_ruby_library(library_name) ⇒ Object

For pure ruby libraries. The library should have an initialization ruby file of the same name as the library folder.


37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/ruby-processing/library_loader.rb', line 37

def load_ruby_library(library_name)
  library_name = library_name.to_sym
  return true if @loaded_libraries.include?(library_name)
  if ENV['EXPORTED'].eql?('true')
    begin
      return @loaded_libraries[library_name] = (require_relative "../library/#{library_name}")
    rescue LoadError
      return false
    end
  end
  path = get_library_paths(library_name, 'rb').first
  return false unless path
  @loaded_libraries[library_name] = (require path)
end

#platformObject


80
81
82
83
84
85
86
87
# File 'lib/ruby-processing/library_loader.rb', line 80

def platform
  match = %w(mac linux windows).find do |os|
    java.lang.System.getProperty('os.name').downcase.index(os)
  end
  return 'other' unless match
  return match unless match =~ /mac/
  'macosx'
end