Class: Universa::RemoteAdapter

Inherits:
Delegator
  • Object
show all
Defined in:
lib/universa/service.rb

Overview

The basic class to write remote class adapters (extensions). Delegates contained Ref instance therefore behaves like remote interface with some extensions.

Key feature of RemoteAdapter class is the cross-call persistence. It means once created instances of the RemoteAdapter descendants are cached just like (in fact, instead of) Ref instances, so when the remote party returns the reference to the object once wrapped by this instance, the instance will be returned unless it is already garbage collected. instance will be returned, what means sort of cross-platform calls persistence.

Extending this class normally should not implement the constructor, By defaul the constructor is passed to the remote to create remote instance.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ RemoteAdapter

Instantiate new proxy object passing arguments to the remote constructor. The UMI host will try to find overloaded constructor that matches the arguments.

Parameters:

  • args (*Any)

    any arguments that remote constructor may accept.



113
114
115
116
117
118
119
120
121
122
# File 'lib/universa/service.rb', line 113

def initialize(*args)
  if args.length == 1 && args[0].is_a?(ReferenceCreationData)
    @remote = args[0].ref
  else
    # User called constructor
    remote_class_name = self.class.remote_class_name
    remote_class_name&.length or raise Error, "provide remote_class_name"
    @remote = Service.umi.instantiate remote_class_name, *args, adapter: self
  end
end

Class Method Details

.invoke_static(method_name, *args) ⇒ Object



167
168
169
# File 'lib/universa/service.rb', line 167

def self.invoke_static(method_name, *args)
  Service.umi.invoke_static @remote_class_name, method_name, *args
end

.remote_class(name) ⇒ Object

Registers remote class name to be used with this adapted. Call it early in descendant class declaration.



152
153
154
# File 'lib/universa/service.rb', line 152

def self.remote_class name
  @remote_class_name = name
end

.remote_class_nameString

Returns remote class name. There is no need to override it, when inheriting it use remote_class helper:

class MyKeyAddress < ObjectProxy
   remote_class 'com.icodici.crypto.KeyAddress'

   #...
end

Notice: remote_class will do all necessary work for you.

Returns:

  • (String)

    remote class name



146
147
148
# File 'lib/universa/service.rb', line 146

def self.remote_class_name
  @remote_class_name or raise Error, "provide remote class name"
end

.remote_field(*names) ⇒ Object



171
172
173
174
175
176
177
178
179
180
181
182
# File 'lib/universa/service.rb', line 171

def self.remote_field *names
  names.each {|name|
    class_eval <<-End
      def #{name}
        Service.umi.get_field(self,"#{name}")
      end
      def #{name}=(value)
        Service.umi.set_field(self,"#{name}", value)
      end
      End
  }
end

.static_method(name) ⇒ Object



184
185
186
187
188
189
190
# File 'lib/universa/service.rb', line 184

def self.static_method name
  class_eval <<-End
    def self.#{name} *args
      invoke_static "#{name.to_s}", *args
    end
  End
end

Instance Method Details

#__getobj__Ref

Delegated object

Returns:

  • (Ref)

    the wrapped instance whose methpds are delegated by this



126
127
128
# File 'lib/universa/service.rb', line 126

def __getobj__
  @remote
end

#__setobj__Object

Updating proxied object is not allowed. Raises error.



131
132
133
# File 'lib/universa/service.rb', line 131

def __setobj__
  raise "ObjectProxy does not support changing referenced object"
end

#inspectObject

debugging label



157
158
159
# File 'lib/universa/service.rb', line 157

def inspect
  "<#{self.class.name}:#{__id__}:#{@remote._remote_class_name}:#{@remote._remote_id}>"
end

#to_sString

call the remote toString(). Does not cache it.

Returns:

  • (String)


163
164
165
# File 'lib/universa/service.rb', line 163

def to_s
  toString()
end