class Stormpath::Resource::Base

Constants

DEFAULT_SERVER_HOST
HREF_PROP_NAME

Attributes

client[R]
dirty_properties[R]
properties[R]

Public Class Methods

new(properties_or_url, client = nil, query = nil) click to toggle source
   # File lib/stormpath-sdk/resource/base.rb
64 def initialize(properties_or_url, client = nil, query = nil)
65   properties = case properties_or_url
66                when String
67                  { HREF_PROP_NAME => properties_or_url }
68                when Hash
69                  properties_or_url
70                else
71                  {}
72                end
73 
74   @client = client
75   @query = query
76   @read_lock = Mutex.new
77   @write_lock = Mutex.new
78   @properties = {}
79   @dirty_properties = {}
80   @deleted_properties = []
81   set_properties properties
82 end
non_printable_properties() click to toggle source
   # File lib/stormpath-sdk/resource/base.rb
58 def non_printable_properties
59   @non_printable_properties ||= []
60   Array.new(@non_printable_properties)
61 end
prop_accessor(*args) click to toggle source
   # File lib/stormpath-sdk/resource/base.rb
43 def prop_accessor(*args)
44   args.each do |name|
45     prop_reader name
46     prop_writer name
47   end
48 end
prop_non_printable(*args) click to toggle source
   # File lib/stormpath-sdk/resource/base.rb
50 def prop_non_printable(*args)
51   @non_printable_properties ||= []
52   args.each do |name|
53     property_name = name.to_s.camelize :lower
54     @non_printable_properties << property_name
55   end
56 end
prop_reader(*args) click to toggle source
   # File lib/stormpath-sdk/resource/base.rb
27 def prop_reader(*args)
28   args.each do |name|
29     define_method(name) do
30       get_property name
31     end
32   end
33 end
prop_writer(*args) click to toggle source
   # File lib/stormpath-sdk/resource/base.rb
35 def prop_writer(*args)
36   args.each do |name|
37     define_method("#{name}=") do |value|
38       set_property name, value
39     end
40   end
41 end

Public Instance Methods

==(other) click to toggle source
Calls superclass method
    # File lib/stormpath-sdk/resource/base.rb
192 def ==(other)
193   if other.is_a?(self.class)
194     href == other.href
195   else
196     super
197   end
198 end
get_dirty_property_names() click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
108 def get_dirty_property_names
109   @read_lock.lock
110 
111   begin
112     @dirty_properties.keys
113   ensure
114     @read_lock.unlock
115   end
116 end
get_property(name, options = {}) click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
142 def get_property(name, options = {})
143   property_name = name.to_s
144 
145   unless options[:ignore_camelcasing] == true
146     property_name = property_name.camelize(:lower)
147   end
148 
149   if HREF_PROP_NAME != property_name
150     # not the href/id, must be a property that requires materialization:
151     unless new? || materialized?
152 
153       # only materialize if the property hasn't been set previously (no need to execute a server
154       # request since we have the most recent value already):
155       present = false
156 
157       @read_lock.lock
158       begin
159         present = @dirty_properties.key? property_name
160       ensure
161         @read_lock.unlock
162       end
163 
164       unless present
165         # exhausted present properties - we require a server call:
166         materialize
167       end
168     end
169   end
170 
171   read_property property_name
172 end
get_property_names() click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
 98 def get_property_names
 99   @read_lock.lock
100 
101   begin
102     @properties.keys
103   ensure
104     @read_lock.unlock
105   end
106 end
href() click to toggle source
   # File lib/stormpath-sdk/resource/base.rb
94 def href
95   get_property HREF_PROP_NAME
96 end
new?() click to toggle source
   # File lib/stormpath-sdk/resource/base.rb
84 def new?
85   prop = read_property HREF_PROP_NAME
86 
87   if prop.nil?
88     true
89   else
90     prop.respond_to?('empty') && prop.empty?
91   end
92 end
set_properties(properties) click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
118 def set_properties(properties)
119   @write_lock.lock
120 
121   begin
122     @properties.clear
123     @dirty_properties.clear
124     @dirty = false
125 
126     if properties
127       @properties = deep_sanitize properties
128       @dirty_properties = @properties if new?
129       # Don't consider this resource materialized if it is only a reference.  A reference is any object that
130       # has only one 'href' property.
131       href_only = ((@properties.size == 1) && @properties.key?(HREF_PROP_NAME))
132       @materialized = !href_only
133     else
134       @materialized = false
135     end
136 
137   ensure
138     @write_lock.unlock
139   end
140 end
set_property(name, value, options = {}) click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
174 def set_property(name, value, options = {})
175   property_name = name.to_s
176 
177   unless options[:ignore_camelcasing] == true
178     property_name = property_name.camelize(:lower)
179   end
180 
181   @write_lock.lock
182 
183   begin
184     @properties.store property_name, value
185     @dirty_properties.store property_name, value
186     @dirty = true
187   ensure
188     @write_lock.unlock
189   end
190 end

Private Instance Methods

data_store() click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
202 def data_store
203   client.data_store
204 end
deep_sanitize(hash_or_resource) click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
260 def deep_sanitize(hash_or_resource)
261   case hash_or_resource
262   when Stormpath::Resource::Base
263     deep_sanitize hash_or_resource.properties
264   when Hash
265     sanitize hash_or_resource
266   end
267 end
get_href_from_hash(props) click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
232 def get_href_from_hash(props)
233   props[HREF_PROP_NAME] if props && props.is_a?(Hash)
234 end
materialize() click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
210 def materialize
211   clazz = self.class
212 
213   @write_lock.lock
214 
215   begin
216     resource = data_store.get_resource href, clazz, @query
217     @properties.replace resource.properties
218 
219     # retain dirty properties:
220     @properties.merge! @dirty_properties
221 
222     @materialized = true
223   ensure
224     @write_lock.unlock
225   end
226 end
materialized?() click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
206 def materialized?
207   @materialized
208 end
printable_property?(property_name) click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
228 def printable_property?(property_name)
229   !self.class.non_printable_properties.include? property_name
230 end
read_property(name) click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
236 def read_property(name)
237   @read_lock.lock
238 
239   begin
240     @properties[name]
241   ensure
242     @read_lock.unlock
243   end
244 end
sanitize(properties) click to toggle source
    # File lib/stormpath-sdk/resource/base.rb
246 def sanitize(properties)
247   {}.tap do |sanitized_properties|
248     properties.map do |key, value|
249       property_name = key.to_s.camelize :lower
250       sanitized_properties[property_name] =
251         if (value.is_a?(Hash) || value.is_a?(Stormpath::Resource::Base)) && (property_name != 'customData')
252           deep_sanitize value
253         else
254           value
255         end
256     end
257   end
258 end