soar_sr 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,172 @@
1
+ require 'jsender'
2
+ require 'soap4juddi'
3
+ require 'persistent-cache'
4
+
5
+ module SoarSr
6
+ class JUDDIProvider
7
+ def initialize(urns, broker, cache_freshness)
8
+ @urns = urns
9
+ @broker = broker
10
+ @cache = Persistent::Cache.new("uddi-broker", cache_freshness, Persistent::Cache::STORAGE_RAM)
11
+ end
12
+
13
+ def broker
14
+ @broker
15
+ end
16
+
17
+ def assign_service_to_business(name, business_key = @urns['company'])
18
+ @broker.authorize
19
+ result = get_service(name)
20
+ service = result['data']
21
+ @broker.save_service_element(service['name'], service['description'], service['definition'], @urns['services'], business_key)
22
+ end
23
+
24
+ def assign_service_component_to_business(name, business_key = @urns['company'])
25
+ @broker.authorize
26
+ result = get_service_component(name)
27
+ service = result['data']
28
+ @broker.save_service_element(service['name'], service['description'], service['definition'], @urns['service-components'], business_key)
29
+ end
30
+
31
+ def get_service(name)
32
+ cached = @cache["get_service:#{name}"]; return cached if cached
33
+ value = @broker.get_service_element(name, @urns['services'])
34
+ @cache["get_service:#{name}"] = value
35
+ value
36
+ end
37
+
38
+ def save_service(name, description = nil, definition = nil)
39
+ @broker.authorize
40
+ @broker.save_service_element(name, description.is_a?(Array) ? description : [description], definition, @urns['services'], @urns['company'])
41
+ end
42
+
43
+ def delete_service(name)
44
+ @broker.authorize
45
+ @broker.delete_service_element(name, @urns['services'])
46
+ end
47
+
48
+ def find_services(pattern = nil)
49
+ pattern = pattern.nil? ? '%' : "%#{pattern}%"
50
+
51
+ cached = @cache["find_services:#{pattern}"]; return cached if cached
52
+ value = @broker.find_services(pattern)
53
+ @cache["find_services:#{pattern}"] = value
54
+ value
55
+ end
56
+
57
+ def add_service_uri(service, uri)
58
+ result = remove_service_uri(service, uri)
59
+ result = save_service_uri(service, uri) if result['status'] == 'success'
60
+ result
61
+ end
62
+
63
+ def remove_service_uri(service, uri)
64
+ @broker.authorize
65
+ result = service_uris(service)
66
+ existing_id = has_existing_binding?(result['data']['bindings'], uri) if has_bindings?(result)
67
+ result = @broker.delete_binding(existing_id) if existing_id
68
+ result
69
+ end
70
+
71
+ def service_uris(service)
72
+ cached = @cache["service_uris:#{service}"]; return cached if cached
73
+ value = @broker.find_element_bindings(service, @urns['services'])
74
+ @cache["service_uris:#{service}"] = value
75
+ value
76
+ end
77
+
78
+ def get_service_component(name)
79
+ cached = @cache["get_service_component:#{name}"]; return cached if cached
80
+ value = @broker.get_service_element(name, @urns['service-components'])
81
+ @cache["get_service_component:#{name}"] = value
82
+ value
83
+ end
84
+
85
+ def save_service_component(name, description = nil, definition = nil)
86
+ @broker.authorize
87
+ @broker.save_service_element(name, description.is_a?(Array) ? description : [description], definition, @urns['service-components'], @urns['company'])
88
+ end
89
+
90
+ def delete_service_component(name)
91
+ @broker.authorize
92
+ @broker.delete_service_element(name, @urns['service-components'])
93
+ end
94
+
95
+ def find_service_components(pattern = nil)
96
+ pattern = pattern.nil? ? '%' : "%#{pattern}%"
97
+ cached = @cache["find_service_components:#{pattern}"]; return cached if cached
98
+
99
+ value = @broker.find_service_components(pattern)
100
+ @cache["find_service_components:#{pattern}"] = value
101
+ value
102
+ end
103
+
104
+ def save_service_component_uri(service_component, uri)
105
+ @broker.authorize
106
+ result = @broker.find_element_bindings(service_component, @urns['service-components'])
107
+ # only one binding for service components
108
+ delete_existing_bindings(result['data']['bindings']) if has_bindings?(result)
109
+ @broker.save_element_bindings(service_component, [uri], @urns['service-components'], "service component")
110
+ end
111
+
112
+ def delete_existing_bindings(bindings)
113
+ bindings.each do |binding, detail|
114
+ @broker.delete_binding(binding)
115
+ end
116
+ end
117
+
118
+ def find_service_component_uri(service_component)
119
+ cached = @cache["find_service_component_uri:#{service_component}"]; return cached if cached
120
+ value = @broker.find_element_bindings(service_component, @urns['service-components'])
121
+ @cache["find_service_component_uri:#{service_component}"] = value
122
+ value
123
+ end
124
+
125
+ def save_business(key, name, description = nil, contacts = nil)
126
+ @broker.authorize
127
+ @broker.save_business(key, name, description, contacts)
128
+ end
129
+
130
+ def get_business(key)
131
+ cached = @cache["get_business:#{key}"]; return cached if cached
132
+ value = @broker.get_business(key)
133
+ @cache["get_business:#{key}"] = value
134
+ value
135
+ end
136
+
137
+ def find_businesses(pattern = nil)
138
+ pattern = pattern.nil? ? '%' : "%#{pattern}%"
139
+ cached = @cache["find_businesses:#{pattern}"]; return cached if cached
140
+ value = @broker.find_business(pattern)
141
+ @cache["find_businesses:#{pattern}"] = value
142
+ value
143
+ end
144
+
145
+ def delete_business(key)
146
+ @broker.authorize
147
+ @broker.delete_business(key)
148
+ end
149
+
150
+ def business_eq?(business, comparison)
151
+ business == "#{@urns['domains']}#{comparison}"
152
+ end
153
+
154
+ private
155
+
156
+ def has_bindings?(result)
157
+ result and result['data'] and result['data']['bindings'] and (result['data']['bindings'].size > 0)
158
+ end
159
+
160
+ def has_existing_binding?(bindings, uri)
161
+ bindings.each do |binding, detail|
162
+ return binding if detail['access_point'] == uri
163
+ end
164
+ nil
165
+ end
166
+
167
+ def save_service_uri(service, uri)
168
+ @broker.authorize
169
+ @broker.save_element_bindings(service, [uri], @urns['services'], "service uri")
170
+ end
171
+ end
172
+ end
@@ -0,0 +1,104 @@
1
+ require 'jsender'
2
+ require 'soap4juddi'
3
+
4
+ module SoarSr
5
+ class Search < SoarSr::Handler
6
+ include Jsender
7
+
8
+ def query_service_by_pattern(pattern)_{
9
+ provided?(pattern, 'pattern')
10
+ result = @uddi.find_services
11
+ list = {}
12
+ if has_data?(result, 'services')
13
+ result['data']['services'].each do |service, name|
14
+ detail = @uddi.get_service(service)
15
+ if has_data?(detail, 'description')
16
+ found = false
17
+ dss = nil
18
+ detail['data']['description'].each do |description|
19
+ found = true if (description and description.include?(pattern))
20
+ dss = description.gsub("dss:", "").strip if (description and description.include?('dss:'))
21
+ end
22
+ list[service] = detail if ((dss and (@dss and check_dss(service))) or (not dss)) and found
23
+ end
24
+ end
25
+ end
26
+
27
+ success_data({ 'services' => list })
28
+ }end
29
+
30
+ def search_for_service_by_name(name)
31
+ search_for_service(name, false, false)
32
+ end
33
+
34
+ def search_for_service(pattern, include_service_components = true, full_text = true)_{
35
+ provided?(pattern, 'pattern') and length_at_least?(pattern, 4, 'pattern')
36
+
37
+ services = {}
38
+ service_components = {}
39
+ services_list = @uddi.find_services(pattern)['data']['services'] if not include_service_components
40
+ services_list, service_components_list = @registry.services.find_services_and_service_components(nil) if include_service_components
41
+ services_list.each do |service, detail|
42
+ service_name = extract_domain_name('services', service)
43
+ if full_text
44
+ data = @uddi.get_service(service)['data'] if full_text
45
+ if search_for_pattern_in_hash_values(data, pattern)
46
+ services[service_name] = data
47
+ services[service_name]['uris'] = @registry.services.service_uris(service_name)['data']['bindings']
48
+ end
49
+ else
50
+ if service_name == service
51
+ services[service_name] = detail
52
+ services[service_name]['uris'] = @registry.services.service_uris(service_name)['data']['bindings']
53
+ end
54
+ end
55
+ end
56
+ if (include_service_components)
57
+ service_components_list.each do |service_component, detail|
58
+ service_name = extract_domain_name('services-components', service_component)
59
+ if full_text
60
+ data = @uddi.get_service_component(service_component)['data']
61
+ service_components[service_name] = data if search_for_pattern_in_hash_values(data, pattern)
62
+ else
63
+ service_components[service_name] = detail if service_name == service_component
64
+ end
65
+ end
66
+ end
67
+ found = services.merge!(service_components)
68
+
69
+ success_data({'services' => found})
70
+ }end
71
+
72
+ def search_domain_perspective(domain_perspective, pattern)_{
73
+ provided?(domain_perspective, 'domain perspective') and registered?(domain_perspective, 'domain perspective')
74
+
75
+ found = {}
76
+ data = @registry.associations.domain_perspective_associations(domain_perspective)['data']['associations']
77
+ services = {}
78
+ service_components = {}
79
+ services_list = data['services']
80
+ service_components_list = data['service_components']
81
+ services_list.each do |service, detail|
82
+ data = @uddi.get_service(service)['data']
83
+ services[extract_domain_name('services', service)] = data if search_for_pattern_in_hash_values(data, pattern)
84
+ end
85
+ service_components_list.each do |service_component, detail|
86
+ data = @uddi.get_service_component(service_component)['data']
87
+ service_components[extract_domain_name('services-components', service_component)] = data if search_for_pattern_in_hash_values(data, pattern)
88
+ end
89
+ found = services.merge!(service_components)
90
+ success_data({'services' => found})
91
+ }end
92
+
93
+ private
94
+
95
+ def search_for_pattern_in_hash_values(data, pattern)
96
+ data.keys.each do |key|
97
+ value = data[key]
98
+ return true if (not value.is_a?(Hash)) and (value.to_s.include?(pattern))
99
+ return true if (value.is_a?(Hash)) and (search_for_pattern_in_hash_values(value, pattern))
100
+ end
101
+ return false
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,92 @@
1
+ require 'jsender'
2
+ require 'soap4juddi'
3
+
4
+ module SoarSr
5
+ class ServiceComponents < SoarSr::Handler
6
+ include Jsender
7
+
8
+ def delete_all_service_components()_{
9
+ authorize
10
+ result = list_service_components
11
+ if has_data?(result, 'service_components')
12
+ result['data']['service_components'].each do |name, detail|
13
+ @uddi.delete_service_component(name)
14
+ end
15
+ end
16
+ }end
17
+
18
+ def list_service_components(domain_perspective = nil)_{
19
+ return fail('unknown domain perspective provided') if domain_perspective and (not is_registered?(@registry.domain_perspectives.domain_perspective_registered?(domain_perspective)))
20
+
21
+ result = @uddi.find_service_components
22
+ service_components = has_data?(result, 'services') ? result['data']['services'] : {}
23
+ found = []
24
+
25
+ if not domain_perspective.nil?
26
+ associations = @registry.associations.domain_perspective_associations(domain_perspective)['data']['associations']['service_components']
27
+ return success_data({'service_components' => []}) if associations.count == 0
28
+
29
+ associations.each do |id, associated|
30
+ if associated
31
+ service_components.each do |sid, service_component|
32
+ found << sid if compile_domain_id('service-components', sid) == id
33
+ end
34
+ end
35
+ end
36
+ else
37
+ service_components.each do |sid, service_component|
38
+ found << sid
39
+ end
40
+ end
41
+
42
+ success_data('service_components' => found)
43
+ }end
44
+
45
+ def service_component_registered?(service_component)_{
46
+ result = @uddi.find_service_components(service_component)
47
+ registered = false
48
+ if has_data?(result, 'services')
49
+ result['data']['services'].each do |service_key, description|
50
+ registered = (service_component.downcase == service_key.downcase)
51
+ end
52
+ end
53
+ success_data({'registered' => registered})
54
+ }end
55
+
56
+ def register_service_component(service_component)_{
57
+ authorize
58
+ provided?(service_component, 'service component') and not_registered?(service_component, 'service component')
59
+
60
+ result = @uddi.save_service_component(service_component)
61
+ authorized?(result) and identifier?(result, 'service component')
62
+ success('service component registered')
63
+ }end
64
+
65
+ def deregister_service_component(service_component)_{
66
+ # byebug
67
+ authorize
68
+ provided?(service_component, 'service component') and registered?(service_component, 'service component')
69
+ raise ValidationError, 'service component has domain perspective associations' if @registry.associations.service_component_has_domain_perspective_associations?(service_component)
70
+ result = @uddi.delete_service_component(service_component)
71
+ authorized?(result) and identifier?(result, 'service component')
72
+ success('service component deregistered')
73
+ }end
74
+
75
+ def configure_service_component_uri(service_component, uri)_{
76
+ authorize
77
+ provided?(service_component, 'service component') and provided?(uri, 'URI') and uri?(uri) and registered?(service_component, 'service component')
78
+ result = @uddi.save_service_component_uri(service_component, uri)
79
+ authorized?(result) and identifier?(result, 'service component')
80
+ success
81
+ }end
82
+
83
+ def service_component_uri(service_component)_{
84
+ provided?(service_component, 'service component') and registered?(service_component, 'service component')
85
+ result = @uddi.find_service_component_uri(service_component)
86
+ identifier?(result, 'service component')
87
+ uri = (has_data?(result, 'bindings') and (result['data']['bindings'].size > 0)) ? result['data']['bindings'].first[1]['access_point'] : nil
88
+ result['data']['uri'] = uri
89
+ success_data(result['data'])
90
+ }end
91
+ end
92
+ end
@@ -0,0 +1,39 @@
1
+ require 'jsender'
2
+ require 'soap4juddi'
3
+
4
+ module SoarSr
5
+ class ServiceDefinitions < SoarSr::Handler
6
+ include Jsender
7
+
8
+ def register_service_definition(service, definition)_{
9
+ authorize
10
+ provided?(service, 'service') and registered?(service, 'service') and provided?(definition, 'service definition') and wadl?(definition)
11
+ result = @uddi.get_service(service)
12
+ service = result['data']
13
+ service['definition'] = definition
14
+ result = @uddi.save_service(service['name'], service['description'], service['definition'])
15
+ authorized?(result) and identifier?(result, 'service')
16
+ success('service definition registered')
17
+ }end
18
+
19
+ def service_definition_for_service(service)_{
20
+ # byebug
21
+ provided?(service, 'service') and registered?(service, 'service')
22
+ result = @uddi.get_service(service)['data']
23
+ identifier?(result, 'service')
24
+ return fail('service has no definition') if (result['definition'].nil?) or (result['definition'] == "")
25
+ success_data({'definition' => result['definition']})
26
+ }end
27
+
28
+ def deregister_service_definition(service)_{
29
+ authorize
30
+ provided?(service, 'service') and registered?(service, 'service')
31
+ result = @uddi.get_service(service)
32
+ service = result['data']
33
+ service['definition'] = ""
34
+ result = @uddi.save_service(service['name'], service['description'], service['definition'])
35
+ authorized?(result) and identifier?(result, 'service')
36
+ success('service definition deregistered')
37
+ }end
38
+ end
39
+ end
@@ -0,0 +1,71 @@
1
+ require 'jsender'
2
+ require 'soap4juddi'
3
+
4
+ module SoarSr
5
+ class ServiceRegistry
6
+ attr_reader :services
7
+ attr_reader :service_definitions
8
+ attr_reader :service_components
9
+ attr_reader :domain_perspectives
10
+ attr_reader :teams
11
+ attr_reader :associations
12
+ attr_reader :search
13
+ attr_reader :broker
14
+ attr_reader :contacts
15
+
16
+ def initialize(uri, company, company_name, credentials, cache_freshness = 60)
17
+ @urns = initialize_urns(company, company_name)
18
+ @uddi = initialize_uddi_provider(uri, @urns, credentials, cache_freshness)
19
+ initialize_handlers(@urns, @uddi, credentials)
20
+ end
21
+
22
+ def check_dss(name)
23
+ end
24
+
25
+ private
26
+
27
+ def initialize_urns(fqdn, company_name)
28
+ base = "uddi:#{fqdn}"
29
+ @urns = { 'base' => base,
30
+ 'company' => "#{base}:#{company_name}",
31
+ 'domains' => "#{base}:domains-",
32
+ 'teams' => "#{base}:teams-",
33
+ 'services' => "#{base}:services:",
34
+ 'service-components' => "#{base}:service-components:" }
35
+ @urns
36
+ end
37
+
38
+ def initialize_uddi_provider(uri, urns, credentials, cache_freshness)
39
+ @broker = ::Soap4juddi::Broker.new(urns)
40
+ @broker.set_uri(uri)
41
+ @uddi = ::SoarSr::JUDDIProvider.new(urns, @broker, cache_freshness)
42
+ end
43
+
44
+ def initialize_handlers(urns, uddi, credentials)
45
+ initialize_service_handlers(urns, uddi, credentials)
46
+ initialize_domain_handlers(urns, uddi, credentials)
47
+ initialize_associations_and_search(urns, uddi, credentials)
48
+ initialize_contacts(urns, uddi, credentials)
49
+ end
50
+
51
+ def initialize_service_handlers(urns, uddi, credentials)
52
+ @services = SoarSr::Services.new(urns, uddi, credentials, self)
53
+ @service_definitions = SoarSr::ServiceDefinitions.new(urns, uddi, credentials, self)
54
+ @service_components = SoarSr::ServiceComponents.new(urns, uddi, credentials, self)
55
+ end
56
+
57
+ def initialize_domain_handlers(urns, uddi, credentials)
58
+ @domain_perspectives = SoarSr::DomainPerspectives.new(urns, uddi, credentials, self)
59
+ @teams = SoarSr::Teams.new(urns, uddi, credentials, self)
60
+ end
61
+
62
+ def initialize_associations_and_search(urns, uddi, credentials)
63
+ @associations = SoarSr::Associations.new(urns, uddi, credentials, self)
64
+ @search = SoarSr::Search.new(urns, uddi, credentials, self)
65
+ end
66
+
67
+ def initialize_contacts(urns, uddi, credentials)
68
+ @contacts = SoarSr::Contacts.new(urns, uddi, credentials, self)
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,157 @@
1
+ require 'jsender'
2
+ require 'soap4juddi'
3
+ require 'json'
4
+ require 'byebug'
5
+
6
+ module SoarSr
7
+ class Services < SoarSr::Handler
8
+ include Jsender
9
+
10
+ def register_service(service, description = nil)_{
11
+ authorize
12
+ key_provided?(service, 'name', 'service') and not_registered?(service['name'], 'service')
13
+ result = @uddi.save_service(service['name'], extract_description_and_meta(service, description), service['definition'])
14
+ authorized?(result) and identifier?(result, 'service')
15
+ success('service registered')
16
+ }end
17
+
18
+ def deregister_service(service)_{
19
+ authorize
20
+ provided?(service, 'service') and registered?(service, 'service')
21
+ result = @uddi.delete_service(service)
22
+ authorized?(result) and identifier?(result, 'service')
23
+ success('service deregistered')
24
+ }end
25
+
26
+ def service_registered?(service)_{
27
+ registered = false
28
+ if present?(service)
29
+ result = @uddi.find_services(service)
30
+ registered = find_matching_service(service, result) if has_data?(result, 'services')
31
+ end
32
+ success_data({'registered' => (registered ||= false)})
33
+ }end
34
+
35
+ def add_service_uri(service, uri)_{
36
+ authorize
37
+ provided?(service, 'service') and provided?(uri, 'URI') and uri?(uri) and registered?(service, 'service')
38
+ result = @uddi.add_service_uri(service, uri)
39
+ authorized?(result) and identifier?(result, 'service')
40
+ success
41
+ }end
42
+
43
+ def service_uris(service)_{
44
+ authorize
45
+ provided?(service, 'service') and registered?(service, 'service')
46
+ result = @uddi.service_uris(service)
47
+ authorized?(result) and identifier?(result, 'service')
48
+ success_data(result['data'])
49
+ }end
50
+
51
+ def remove_uri_from_service(service, uri)_{
52
+ authorize
53
+ provided?(service, 'service') and provided?(uri, 'URI') and uri?(uri) and registered?(service, 'service')
54
+ result = @uddi.remove_service_uri(service, uri)
55
+ authorized?(result) and identifier?(result, 'service')
56
+ success
57
+ }end
58
+
59
+ def configure_meta_for_service(service, meta)_{
60
+ authorize
61
+ provided?(service, 'service') and provided?(meta, 'meta') and meta?(meta) and registered?(service, 'service')
62
+
63
+ descriptions = merge_meta_with_service_descriptions(service, meta)
64
+ result = update_service_descriptions(service, descriptions)
65
+
66
+ authorized?(result) and identifier?(result, 'meta')
67
+ success('meta updated', result['data'])
68
+ }end
69
+
70
+ def meta_for_service(service)
71
+ provided?(service, "service") and registered?(service, 'service')
72
+ detail = @uddi.get_service(service)['data']
73
+ if detail['description']
74
+ detail['description'].each do |desc|
75
+ return JSON.parse(CGI.unescape(desc)) if (description_is_meta?(desc))
76
+ end
77
+ end
78
+ {}
79
+ end
80
+
81
+ def service_by_name(name)_{
82
+ provided?(name, "service")
83
+ services = search_for_service(name)
84
+ return extract_service_by_name_from_services_list(services, name) if has_data?(services, 'services')
85
+ raise FailureErrorError, 'failure finding service by name'
86
+ }end
87
+
88
+ def find_services_and_service_components(pattern)
89
+ services = @uddi.find_services(pattern)['data']['services']
90
+ service_components = @uddi.find_service_components(pattern)['data']['services']
91
+ services ||= {}
92
+ service_components ||= {}
93
+ return services, service_components
94
+ end
95
+
96
+ private
97
+
98
+ def update_service_descriptions(service, descriptions)
99
+ detail = @uddi.get_service(service)['data']
100
+ detail['description'] = descriptions
101
+ @uddi.save_service(detail['name'], detail['description'], detail['definition'])
102
+ end
103
+
104
+ def merge_meta_with_service_descriptions(service, meta)
105
+ descriptions = []
106
+ detail = @uddi.get_service(service)['data']
107
+ detail['description'] ||= {}
108
+ detail['description'].each do |desc|
109
+ descriptions << desc if not description_is_meta?(desc)
110
+ end
111
+ descriptions << CGI.escape(meta.to_json)
112
+ descriptions
113
+ end
114
+
115
+ def find_matching_service(service, result)
116
+ registered = false
117
+ result['data']['services'].each do |service_key, description|
118
+ registered = (service.downcase == service_key.downcase)
119
+ end
120
+ registered
121
+ end
122
+
123
+ def extract_description_and_meta(service, description = nil)
124
+ result = []
125
+ result << service['description'] if service['description'] and description.nil?
126
+ result << description if not description.nil?
127
+ result << service['meta'] if service['meta']
128
+ result
129
+ end
130
+
131
+ def search_for_service(pattern)
132
+ provided?(pattern, "pattern") and length_at_least?(pattern, 4, "pattern")
133
+
134
+ services, service_components = find_services_and_service_components(pattern)
135
+ services = map_service_uris(services)
136
+ found = services.merge!(service_components)
137
+
138
+ success_data({'services' => found})
139
+ end
140
+
141
+ def map_service_uris(services)
142
+ services_detailed = {}
143
+ services.each do |id, service|
144
+ service['uris'] = service_uris(service['name'])['data']['bindings']
145
+ end
146
+ end
147
+
148
+ def extract_service_by_name_from_services_list(result, name)
149
+ result['data']['services'].each do |sname, service|
150
+ compare_service = "#{@urns['services']}#{name}" == sname
151
+ compare_service_component = "#{@urns['service-components']}#{name}" == sname
152
+ return success_data({ 'services' => { sname => service }}) if compare_service or compare_service_component or (name == sname)
153
+ end
154
+ success_data({ 'services' => {}})
155
+ end
156
+ end
157
+ end
@@ -0,0 +1,20 @@
1
+ require 'jsender'
2
+ require 'soap4juddi'
3
+
4
+ module SoarSr
5
+ class Teams < SoarSr::DomainPerspectives
6
+ include Jsender
7
+
8
+ def team_registered?(domain_perspective)_{
9
+ domain_registered?('teams', domain_perspective)
10
+ }end
11
+
12
+ def register_team(domain_perspective)_{
13
+ register_domain('teams', domain_perspective)
14
+ }end
15
+
16
+ def deregister_team(domain_perspective)_{
17
+ deregister_domain('teams', domain_perspective)
18
+ }end
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ module SoarSr
2
+ class ValidationError < StandardError
3
+ end
4
+ end