Class: T2Server::PortValue

Inherits:
Object
  • Object
show all
Defined in:
lib/t2-server/port.rb

Overview

A class to represent an output port data value.

Constant Summary collapse

ERROR_TYPE =

The mime-type we use for an error value.

"application/x-error"
EMPTY_TYPE =

The mime-type we use for an empty value. Note that an empty value is not simply an empty string. It is the complete absence of a value.

"application/x-empty"
@@to_s =

Used within #inspect, below to help override the built in version.

Kernel.instance_method(:to_s)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(port, ref, error, size, type = "") ⇒ PortValue

:stopdoc:



429
430
431
432
433
434
435
# File 'lib/t2-server/port.rb', line 429

def initialize(port, ref, error, size, type = "")
  @port = port
  @reference = URI.parse(ref)
  @type = (error ? ERROR_TYPE : type)
  @size = size
  @error = error
end

Instance Attribute Details

#referenceObject (readonly)

The URI reference of this port value as a String.



413
414
415
# File 'lib/t2-server/port.rb', line 413

def reference
  @reference
end

#sizeObject (readonly)

The size (in bytes) of the port value.



419
420
421
# File 'lib/t2-server/port.rb', line 419

def size
  @size
end

#typeObject (readonly)

The mime type of this port value as a String.



416
417
418
# File 'lib/t2-server/port.rb', line 416

def type
  @type
end

Instance Method Details

#empty?Boolean

:call-seq:

empty? -> true or false

Is this port value empty?

Returns:

  • (Boolean)


531
532
533
# File 'lib/t2-server/port.rb', line 531

def empty?
  @type == EMPTY_TYPE
end

#error?Boolean

:call-seq:

error? -> true or false

Does this port represent an error?

Returns:

  • (Boolean)


523
524
525
# File 'lib/t2-server/port.rb', line 523

def error?
  @error
end

#inspectObject

:call-seq:

inspect -> string

Return a printable representation of this port value for debugging purposes.



543
544
545
546
547
# File 'lib/t2-server/port.rb', line 543

def inspect
  @@to_s.bind(self).call.sub!(/>\z/) { " @value=#{value.inspect}, " +
    "@type=#{type.inspect}, @size=#{size.inspect}>"
  }
end

#stream_value(stream, range = nil) ⇒ Object

:call-seq:

stream_value(stream) -> fixnum
stream_value(stream, range) -> fixnum

Stream this port value directly into another stream. The stream passed in may be anything that provides a write method; instances of IO and File, for example. No data is cached by this method.

The number of bytes written to the stream is returned.

Raises:

  • (ArgumentError)


492
493
494
495
496
497
498
499
500
501
502
503
504
# File 'lib/t2-server/port.rb', line 492

def stream_value(stream, range = nil)
  raise ArgumentError,
    "Stream passed in must provide a write method" unless
      stream.respond_to? :write

  bytes = 0

  value(range) do |chunk|
    bytes += stream.write(chunk)
  end

  bytes
end

#value(range = nil, &block) ⇒ Object

:call-seq:

value -> binary blob
value(range) -> binary blob
value {|chunk| ...}
value(range) {|chunk| ...}

Get the value of this port from the server.

If no parameters are supplied then this method will simply download and return all the data.

Passing in a block will allow access to the underlying data stream so the data is not stored in memory:

run.output_port("port") do |chunk|
  print chunk
end

In both cases supplying a Range will download and return the data in that range.

This method does not cache any data.

If this port is an error then this value will be the error message.



461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
# File 'lib/t2-server/port.rb', line 461

def value(range = nil, &block)
  # The following block is a workaround for Taverna Server versions prior
  # to 2.4.1 and can be removed when support for those versions is no
  # longer required.
  if error? && @size == 0
    value = @port.download(@reference)
    @size = value.size
    range = 0...@size if range.nil? || range.min.nil?
    return value[range]
  end

  return "" if @type == EMPTY_TYPE

  # Check that the range provided is sensible
  unless range.nil?
    range = 0..range.max if range.min < 0
    range = range.min...@size if range.max >= @size
  end

  @port.download(@reference, range, &block)
end

#write_value_to_file(filename, range = nil) ⇒ Object

:call-seq:

write_value_to_file(filename) -> fixnum
write_value_to_file(filename, range) -> fixnum

Stream this port value directly to a file. If a range is supplied then just that range of data is downloaded from the server. No data is cached by this method.



513
514
515
516
517
# File 'lib/t2-server/port.rb', line 513

def write_value_to_file(filename, range = nil)
  File.open(filename, "wb") do |file|
    stream_value(file, range)
  end
end