Class: Universa::RemoteAdapter
- Inherits:
-
Delegator
- Object
- Delegator
- Universa::RemoteAdapter
- 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.
Direct Known Subclasses
Binder, ChangeOwnerPermission, ChangeRolePermission, Compound, Contract, ContractService, Duration, EscrowHelper, ExtendedSignature, HashId, KeyAddress, KeyInfo, ListRole, ModifyDataPermission, PBKDF2, Parcel, PrivateKey, PublicKey, QuorumVoteRole, Reference, RevokePermission, Role, RoleLink, Safe58, SecureLoanHelper, SimpleRole, SplitJoinPermission, SymmetricKey, TransactionPack, UmiClient, UnsContract
Class Method Summary collapse
- .invoke_static(method_name, *args) ⇒ Object
-
.remote_class(name) ⇒ Object
Registers remote class name to be used with this adapted.
-
.remote_class_name ⇒ String
Returns remote class name.
- .remote_field(*names) ⇒ Object
- .static_method(name) ⇒ Object
Instance Method Summary collapse
-
#__getobj__ ⇒ Ref
Delegated object.
-
#__setobj__ ⇒ Object
Updating proxied object is not allowed.
-
#initialize(*args) ⇒ RemoteAdapter
constructor
Instantiate new proxy object passing arguments to the remote constructor.
-
#inspect ⇒ Object
debugging label.
-
#to_s ⇒ String
call the remote toString().
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.
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_name ⇒ String
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.
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
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 |
#inspect ⇒ Object
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_s ⇒ String
call the remote toString(). Does not cache it.
163 164 165 |
# File 'lib/universa/service.rb', line 163 def to_s toString() end |