Class: DeepConnect::Reference

Inherits:
Object
  • Object
show all
Defined in:
lib/deep-connect/reference.rb

Defined Under Namespace

Classes: UndefinedClass

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(deep_space, csid, peer_id) ⇒ Reference

Returns a new instance of Reference.



147
148
149
150
151
# File 'lib/deep-connect/reference.rb', line 147

def initialize(deep_space, csid, peer_id)
  @deep_space = deep_space
  @csid = csid
  @peer_id = peer_id
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object

TO_METHODS = [:to_ary, :to_str, :to_int, :to_regexp]

TO_METHODS = [:to_ary, :to_str, :to_int, :to_regexp, :to_splat]


169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/deep-connect/reference.rb', line 169

def method_missing(method, *args, &block)
  puts "SEND MESSAGE: #{self.inspect} #{method.id2name}" if Conf.DISPLAY_MESSAGE_TRACE

#       if TO_METHODS.include?(method)
# 	return self.dc_dup.send(method)
#       end
  begin
	if iterator?
	  @deep_space.session.send_to(self, method, args, &block)
	else
	  @deep_space.session.send_to(self, method, args)
	end
#      rescue NoMethodError
#	p $@
#	p $!
#	super
  end
end

Instance Attribute Details

#csidObject (readonly)

Returns the value of attribute csid.



155
156
157
# File 'lib/deep-connect/reference.rb', line 155

def csid
  @csid
end

#deep_spaceObject (readonly) Also known as: deepspace

Returns the value of attribute deep_space.



153
154
155
# File 'lib/deep-connect/reference.rb', line 153

def deep_space
  @deep_space
end

#peer_idObject (readonly)

Returns the value of attribute peer_id.



156
157
158
# File 'lib/deep-connect/reference.rb', line 156

def peer_id
  @peer_id
end

Class Method Details

.materialize(deep_space, type, csid, object_id, uuid = nil) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# File 'lib/deep-connect/reference.rb', line 102

def Reference.materialize(deep_space, type, csid, object_id, uuid=nil)
  if type == Reference
	if uuid
	  if uuid == :PEER_OBJECT
 deep_space.root(object_id)
	  else
 if uuid[0] == :SAME_UUIDADDR
   uuid[0] = deep_space.peer_uuid[0].dup
 end
 peer_deep_space = deep_space.organizer.deep_space(uuid)
 peer_deep_space.register_root_to_peer(object_id)
 type.new(peer_deep_space, csid, object_id)
	  end
	else
 type.new(deep_space, csid, object_id)
	end
  else
	if type == :VAL
	  materialize_val(deep_space, type, 
 csid, object_id[0], object_id[1])
	else
	  # 即値
	  object_id
	end
  end
end

.materialize_val(deep_space, type, csid, klass, value) ⇒ Object



129
130
131
# File 'lib/deep-connect/reference.rb', line 129

def Reference.materialize_val(deep_space, type, csid, klass, value)
  klass.deep_connect_materialize_val(deep_space, value)
end

.new(deep_space, csid, peer_id) ⇒ Object

def Reference.register(deep_space, o)

  deep_space.peer.set_root(o)
  Reference.new(session, o.id)
end


138
139
140
141
142
143
144
145
# File 'lib/deep-connect/reference.rb', line 138

def Reference.new(deep_space, csid, peer_id)
  if r = deep_space.import_reference(peer_id)
	return r
  end
  r = super
  deep_space.register_import_reference(r)
  r
end

.serialize(deep_space, value, spec = nil) ⇒ Object

session ローカルなプロキシを生成

クラス名, 値
クラス名, ローカルSESSION, 値


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/deep-connect/reference.rb', line 30

def Reference.serialize(deep_space, value, spec = nil)
  if spec
	return Reference.serialize_with_spec(deep_space, value, spec)
  end

  if value.__deep_connect_reference?
	if deep_space == value.deep_space
	  [value.__deep_connect_real_class, value.csid, value.peer_id, :PEER_OBJECT]
	else
	  uuid = value.deep_space.peer_uuid.dup
	  if uuid[0] == "127.0.0.1" || uuid[0] == "::ffff:127.0.0.1"
 uuid[0] = :SAME_UUIDADDR
	  end
 
	  [value.__deep_connect_real_class, value.csid, value.peer_id, uuid]
	end
  else
	case value
	when *Organizer::immutable_classes
	  [value.__deep_connect_real_class, value.__deep_connect_real_class.name, value]
	else
	  object_id = deep_space.set_root(value)
	  csid = deep_space.my_csid_of(value)
	  [Reference,  csid, object_id]
	end
  end
end

.serialize_val(deep_space, value, spec) ⇒ Object



92
93
94
95
96
97
98
99
100
# File 'lib/deep-connect/reference.rb', line 92

def Reference.serialize_val(deep_space, value, spec)
  case value
  when *Organizer::immutable_classes
	[value.__deep_connect_real_class, value.__deep_connect_real_class.name, value]
  else 
	[:VAL, value.__deep_connect_real_class.name, 
	  [value.__deep_connect_real_class, value.deep_connect_serialize_val(deep_space)]]
  end
end

.serialize_with_spec(deep_space, value, spec) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
# File 'lib/deep-connect/reference.rb', line 58

def Reference.serialize_with_spec(deep_space, value, spec)
  if value.__deep_connect_reference?
	if deep_space == value.deep_space
	  [value.__deep_connect_real_class, value.csid, value.peer_id, :PEER_OBJECT]
	else
	  uuid = value.deep_space.peer_uuid.dup
	  if uuid[0] == "127.0.0.1" || uuid[0] == "::ffff:127.0.0.1"
 uuid[0] = :SAME_UUIDADDR
	  end
 
	  [value.__deep_connect_real_class, value.csid, value.peer_id, uuid]
	end
  elsif Organizer::absolute_immutable_classes.include?(value.class)
	[value.__deep_connect_real_class, value.__deep_connect_real_class.name, value]
  else 
	case spec
	when MethodSpec::DefaultParamSpec
	  Reference.serialize(deep_space, value)
	when MethodSpec::RefParamSpec
	  object_id = deep_space.set_root(value)
	  csid = deep_space.my_csid_of(value)
	  [Reference,  csid, object_id]
	when MethodSpec::ValParamSpec
	  serialize_val(deep_space, value, spec)
	when MethodSpec::DValParamSpec
	  # 第2引数意味なし
	  [value.__deep_connect_real_class, value.__deep_connect_real_class.name, value]
	else
	  raise ArgumentError,
 "argument is only specified(#{MethodSpec::ARG_SPEC.join(', ')})(#{spec})"
	end
  end
end

Instance Method Details

#==(obj) ⇒ Object Also known as: eql?

def ==(obj)

  return true if obj.equal?(self)

  self.deep_connect_copy == obj
  false
end


268
269
270
271
272
# File 'lib/deep-connect/reference.rb', line 268

def ==(obj)
  obj.__deep_connect_reference? &&
	@deep_space == obj.deep_space && 
	@peer_id == obj.peer_id
end

#__deep_connect_real_classObject



236
237
238
# File 'lib/deep-connect/reference.rb', line 236

def __deep_connect_real_class
  Reference
end

#__deep_connect_reference?Boolean Also known as: dc_reference?

def coerce(other)

  return  other, peer
end

Returns:

  • (Boolean)


231
232
233
# File 'lib/deep-connect/reference.rb', line 231

def __deep_connect_reference?
  true
end

#asynchronus_send_with_callback(method, *args, &callback) ⇒ Object Also known as: asynchronus_send



188
189
190
# File 'lib/deep-connect/reference.rb', line 188

def asynchronus_send_with_callback(method, *args, &callback)
  @deep_space.session.asyncronus_send_to(self, method, args, callback)
end

#deep_connect_deep_copyObject Also known as: dc_deep_copy



396
397
398
# File 'lib/deep-connect/reference.rb', line 396

def deep_connect_deep_copy
  @deep_space.session.send_to(self, :deep_connect_deep_copy)
end

#deep_connect_dupObject Also known as: dc_dup



391
392
393
# File 'lib/deep-connect/reference.rb', line 391

def deep_connect_dup
  @deep_space.session.send_to(self, :deep_connect_dup)
end

#equal?(obj) ⇒ Boolean

Returns:

  • (Boolean)


276
277
278
# File 'lib/deep-connect/reference.rb', line 276

def equal?(obj)
  self.object_id == obj.object_id
end

#hashObject



280
281
282
# File 'lib/deep-connect/reference.rb', line 280

def hash
  @deep_space.object_id ^ @peer_id
end

#inspect(force = false) ⇒ Object



354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
# File 'lib/deep-connect/reference.rb', line 354

def inspect(force = false)
  if !force && /deep-connect/ =~ caller(1).first
	unless /deep-connect\/test/ =~ caller(1).first
	  return sprintf("<DC::Ref: deep_space=%s csid=%s id=%x>", 
		@deep_space.to_s, 
		@csid, 
		@peer_id)
	end
  end

  if Conf.DEBUG_REFERENCE
	sprintf("<DC::Ref[deep_space=%s csid=%s id=%x]: %s>", 
		@deep_space.to_s, 
		@csid, 
		@peer_id,
		to_s) 
  else
	sprintf("<DC::Ref: %s>", to_s(true)) 
  end
end

#kind_of?(klass) ⇒ Boolean

Returns:

  • (Boolean)


284
285
286
287
288
289
290
# File 'lib/deep-connect/reference.rb', line 284

def kind_of?(klass)
  if klass.__deep_connect_reference?
	@deep_space.session.send_to(self, :kind_of?, klass)
  else
	self.peer_class <= klass
  end
end

#my_inspectObject



387
388
389
# File 'lib/deep-connect/reference.rb', line 387

def my_inspect
  __deep_connect_org_inspect
end

#nil?Boolean

Returns:

  • (Boolean)


292
293
294
# File 'lib/deep-connect/reference.rb', line 292

def nil?
  false
end

#peerObject



158
159
160
# File 'lib/deep-connect/reference.rb', line 158

def peer
  @deep_space.root(@peer_id)
end

#peer_classObject



242
243
244
245
246
247
248
249
250
# File 'lib/deep-connect/reference.rb', line 242

def peer_class
  return @peer_class if @peer_class
  begin
	@peer_class = self.class.dc_deep_copy
  rescue
	@peer_class = UndefinedClass
  end
  @peer_class
end

#peer_inspectObject



375
376
377
378
379
380
381
382
383
384
385
# File 'lib/deep-connect/reference.rb', line 375

def peer_inspect
  begin
	@deep_space.session.send_to(self, :inspect)
  rescue SessionServiceStopped
	sprintf("<DC::Ref[deep_space=%s csid=%s id=%x]: %s>", 
		@deep_space.to_s, 
		@csid, 
		@peer_id,
		"(service stoped)") 
  end
end

#releaseObject



162
163
164
# File 'lib/deep-connect/reference.rb', line 162

def release
  @deep_space.deregister_import_reference_id(self)
end

#respond_to?(m, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


252
253
254
255
256
257
258
259
# File 'lib/deep-connect/reference.rb', line 252

def respond_to?(m, include_private = false)
#       m = m.intern
#       if m != :to_ary && super
#  	return true
#       end
  return true if super
  return @deep_space.session.send_to(self, :respond_to?, [m, include_private])
end

#to_s(force = false) ⇒ Object

def to_a

  self.dc_dup.to_a
end


340
341
342
343
344
345
346
347
348
349
350
351
352
# File 'lib/deep-connect/reference.rb', line 340

def to_s(force = false)
  if !force && /deep-connect/ =~ caller(1).first
	unless /deep-connect\/test/ =~ caller(1).first
	  return __deep_connect_org_to_s
	end
  end

  if @deep_space.status == :SERVICING
	@deep_space.session.send_to(self, :to_s)
  else
	"(no service)"
  end
end