Class: MPXJ::Reader

Inherits:
Object
  • Object
show all
Defined in:
lib/mpxj/reader.rb

Overview

Used to read a project plan from a file

Constant Summary collapse

@@max_memory_size =
nil

Class Method Summary collapse

Class Method Details

.jvm_argsObject



50
51
52
53
54
55
# File 'lib/mpxj/reader.rb', line 50

def self.jvm_args
  args = []
  args << "-Dlog4j2.loggerContextFactory=org.apache.logging.log4j.simple.SimpleLoggerContextFactory"
  args << "-Xmx#{@@max_memory_size}" if @@max_memory_size.present?
  args.join(' ')
end

.max_memory_size=(value) ⇒ Object

Allows the caller to set the maximum memory size used by the JVM when processing a schedule. This is useful when handling large schedules which cause out of memory failures if the JVM’s default maximum memory size is used. The value is either a plain integer number of bytes, or an integer followed by K, M, or G, e.g. ‘MPXJ::Reader.max_memory_size=“500M”`

Parameters:

  • value

    new maximum memory size



45
46
47
# File 'lib/mpxj/reader.rb', line 45

def self.max_memory_size=(value)
  @@max_memory_size = value
end

.read(file_name, zone = nil, time_units = :seconds) ⇒ Project

Reads a project plan from a file, and returns a Project instance which provides access to the structure and attributes of the project data. Note that an optional timezone can be supplied to ensue that all date-time values returned are in the specified timezone.

Parameters:

  • file_name (String)

    the name of the file to read

  • zone (ActiveSupport::TimeZone) (defaults to: nil)

    an optional timezone

  • time_units (Symbol) (defaults to: :seconds)

    optional, specify the units for expressing durations. By default durations are in seconds, can pass :minutes, :hours, :days: weeks:, :months or :years

Returns:

  • (Project)

    new Project instance



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/mpxj/reader.rb', line 20

def self.read(file_name, zone = nil, time_units = :seconds)
  project = nil
  json_file = Tempfile.new([File.basename(file_name, ".*"), '.json'])
  tz = zone || Time.zone || ActiveSupport::TimeZone["UTC"]

  begin
    classpath = "#{File.dirname(__FILE__)}/*"
    java_output = `java -cp \"#{classpath}\" #{jvm_args} net.sf.mpxj.ruby.GenerateJson \"#{file_name}\" \"#{json_file.path}\" \"#{time_units}\"`
    if $?.exitstatus != 0
      report_error(java_output)
    end
    project = Project.new(json_file, tz)
  ensure
    json_file.close
    json_file.unlink
  end
  project
end

.report_error(java_output) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/mpxj/reader.rb', line 58

def self.report_error(java_output)
  if java_output.include?('Conversion Error: ')
    message = java_output.split('Conversion Error: ')[1]
    if message.include?('Unsupported file type')
      raise MPXJ::ArgumentError, message
    elsif message.include?('password protected')
      raise MPXJ::PasswordProtected, message
    else
      raise MPXJ::RuntimeError, message
    end
  else
    raise MPXJ::UnknownError, "Failed to read file: #{java_output}"
  end
end