yaccl 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,13 @@
1
+ module YACCL
2
+ module Model
3
+ class Server
4
+ def self.repositories
5
+ Services.get_repositories.values.map { |r| Repository.create(r) }
6
+ end
7
+
8
+ def self.repository(repository_id)
9
+ Repository.create(Services.get_repository_info(repository_id).values.first)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,88 @@
1
+ module YACCL
2
+ module Model
3
+ class Type
4
+ attr_accessor :id
5
+ attr_accessor :local_name
6
+ attr_accessor :local_namespace
7
+ attr_accessor :query_name
8
+ attr_accessor :display_name
9
+ attr_accessor :base_id
10
+ attr_accessor :parent_id
11
+ attr_accessor :description
12
+ attr_accessor :creatable
13
+ attr_accessor :fileable
14
+ attr_accessor :queryable
15
+ attr_accessor :controllable_policy
16
+ attr_accessor :controllable_acl
17
+ attr_accessor :fulltext_indexed
18
+ attr_accessor :included_in_supertype_query
19
+ attr_accessor :property_definitions
20
+ # document type
21
+ attr_accessor :versionable
22
+ attr_accessor :content_stream_allowed
23
+ # relationship type
24
+ attr_accessor :allowed_source_types
25
+ attr_accessor :allowed_target_types
26
+
27
+ def self.create(raw)
28
+ Type.new(raw)
29
+ end
30
+
31
+ def initialize(hash={})
32
+ @id = hash[:id]
33
+ @local_name = hash[:localName]
34
+ @local_namespace = hash[:localNamespace]
35
+ @query_name = hash[:queryName]
36
+ @display_name = hash[:displayName]
37
+ @base_id = hash[:baseId]
38
+ @parent_id = hash[:parentId]
39
+ @description = hash[:description]
40
+ @creatable = hash[:creatable]
41
+ @fileable = hash[:fileable]
42
+ @queryable = hash[:queryable]
43
+ @controllable_policy = hash[:controllablePolicy]
44
+ @controllable_acl = hash[:controllableACL]
45
+ @fulltext_indexed = hash[:fulltextIndexed]
46
+ @included_in_supertype_query = hash[:includedInSupertype_query]
47
+ @property_definitions = hash[:propertyDefinitions] || {}
48
+ # document type
49
+ @versionable = hash[:versionable]
50
+ @content_stream_allowed = hash[:contentStreamAllowed]
51
+ # relationship type
52
+ @allowed_source_types = hash[:allowedSourceTypes]
53
+ @allowed_target_types = hash[:allowedTargetTypes]
54
+ end
55
+
56
+ def add_property_definition(property)
57
+ @property_definitions[property[:id]] = property
58
+ end
59
+
60
+ def to_hash
61
+ hash = {}
62
+ hash[:id] = id
63
+ hash[:localName] = local_name
64
+ hash[:localNamespace] = local_namespace
65
+ hash[:queryName]= query_name
66
+ hash[:displayName]= display_name
67
+ hash[:baseId]= base_id
68
+ hash[:parentId]= parent_id
69
+ hash[:description]= description
70
+ hash[:creatable]= creatable
71
+ hash[:fileable]= fileable
72
+ hash[:queryable]= queryable
73
+ hash[:controllablePolicy]= controllable_policy
74
+ hash[:controllableACL]= controllable_acl
75
+ hash[:fulltextIndexed]= fulltext_indexed
76
+ hash[:includedInSupertypeQuery]= included_in_supertype_query
77
+ hash[:propertyDefinitions]= property_definitions
78
+ # document type
79
+ hash[:versionable] = versionable unless versionable.nil?
80
+ hash[:contentStreamAllowed] = content_stream_allowed unless content_stream_allowed.nil?
81
+ # relationship type
82
+ hash[:allowedSourceTypes] = allowed_source_types unless allowed_source_types.nil?
83
+ hash[:allowedTargetTypes] = allowed_target_types unless allowed_target_types.nil?
84
+ hash
85
+ end
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,31 @@
1
+ require 'yaccl/services/internal/browser_binding_service'
2
+ require 'yaccl/services/repository_services'
3
+ require 'yaccl/services/navigation_services'
4
+ require 'yaccl/services/object_services'
5
+ require 'yaccl/services/multi_filing_services'
6
+ require 'yaccl/services/discovery_services'
7
+ require 'yaccl/services/versioning_services'
8
+ require 'yaccl/services/relationship_services'
9
+ require 'yaccl/services/policy_services'
10
+ require 'yaccl/services/acl_services'
11
+
12
+ module YACCL
13
+ module Services
14
+ class << self
15
+ def perform_request(*params)
16
+ service = Internal::BrowserBindingService.new(YACCL::SERVICE_URL)
17
+ service.perform_request(*params)
18
+ end
19
+
20
+ include RepositoryServices
21
+ include NavigationServices
22
+ include ObjectServices
23
+ include MultiFilingServices
24
+ include DiscoveryServices
25
+ include VersioningServices
26
+ include RelationshipServices
27
+ include PolicyServices
28
+ include ACLServices
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,21 @@
1
+ module YACCL
2
+ module ACLServices
3
+ def get_acl(repository_id, object_id, only_basic_permissions, extension={})
4
+ required = {cmisselector: 'acl',
5
+ repositoryId: repository_id,
6
+ objectId: object_id}
7
+ optional = {onlyBasicPermissions: only_basic_permissions}
8
+ perform_request(required, optional)
9
+ end
10
+
11
+ def apply_acl(repository_id, object_id, add_aces, remove_aces, acl_propagation, extension={})
12
+ required = {cmisaction: 'applyACL',
13
+ repositoryId: repository_id,
14
+ objectId: object_id}
15
+ optional = {addACEs: add_aces,
16
+ removeACEs: remove_aces,
17
+ ACLPropagation: acl_propagation}
18
+ perform_request(required, optional)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ module YACCL
2
+ module DiscoveryServices
3
+ def query(repository_id, statement, search_all_versions, include_relationships, rendition_filter, include_allowable_actions, max_items, skip_count, extension={})
4
+ required = {cmisselector: 'query',
5
+ repositoryId: repository_id,
6
+ q: statement}
7
+ optional = {searchAllVersions: search_all_versions,
8
+ includeRelationships: include_relationships,
9
+ renditionFilter: rendition_filter,
10
+ includeAllowableActions: include_allowable_actions,
11
+ maxItems: max_items,
12
+ skipCount: skip_count}
13
+ perform_request(required, optional)
14
+ end
15
+
16
+ def get_content_changes(repository_id, change_log_token, include_properties, include_policy_ids, include_acl, max_items, extension={})
17
+ required = {cmisselector: 'contentChanges',
18
+ repositoryId: repository_id}
19
+ optional = {changeLogToken: change_log_token,
20
+ includeProperties: include_properties,
21
+ includePolicyIds: include_policy_ids,
22
+ includeAcl: include_acl,
23
+ maxItems: max_items}
24
+ perform_request(required, optional)
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,99 @@
1
+ require 'httparty'
2
+ require 'net/http/post/multipart'
3
+ require 'multi_json'
4
+
5
+ module YACCL
6
+ module Services
7
+ class CMISRequestError < RuntimeError; end
8
+
9
+ module Internal
10
+ class BrowserBindingService
11
+ def initialize(service_url)
12
+ @service_url = service_url
13
+ end
14
+
15
+ def perform_request(required_params={}, optional_params={})
16
+ url = get_url(required_params.delete(:repositoryId), required_params[:objectId])
17
+
18
+ optional_params.reject! { |_, v| v.nil? }
19
+ params = transform_hash(required_params.merge(optional_params))
20
+
21
+ check(params)
22
+
23
+ response = if params.has_key?(:cmisaction)
24
+ if params.has_key?(:content)
25
+ Basement.multipart_post(url, params)
26
+ else
27
+ Basement.post(url, body: params)
28
+ end
29
+ else
30
+ Basement.get(url, query: params)
31
+ end
32
+
33
+ result = response.body
34
+ if response.content_type == 'application/json'
35
+ result = MultiJson.load(result, symbolize_keys: true)
36
+ if result.is_a?(Hash) && result.has_key?(:exception)
37
+ raise CMISRequestError, "#{result[:exception]} -- #{result[:message]}"
38
+ end
39
+ end
40
+ result
41
+ end
42
+
43
+ private
44
+
45
+ def get_url(repository_id, object_id)
46
+ if repository_id.nil?
47
+ @service_url
48
+ else
49
+ repository_info = Basement.get(@service_url)[repository_id]
50
+ repository_info[object_id.nil? ? 'repositoryUrl' : 'rootFolderUrl']
51
+ end
52
+ end
53
+
54
+ def check(hash)
55
+ check_in(hash, :includeRelationships, [:none, :source, :target, :both])
56
+ end
57
+
58
+ def check_in(hash, key, arr)
59
+ value = hash[key]
60
+ unless value.nil?
61
+ unless arr.include?(value)
62
+ raise ArgumentError, "#{key} must be one of #{arr}."
63
+ end
64
+ end
65
+ end
66
+
67
+ def transform_hash(hash)
68
+ if hash.has_key?(:content)
69
+ content = hash.delete(:content)
70
+ hash[:content] = UploadIO.new(content[:stream],
71
+ content[:mime_type],
72
+ content[:filename])
73
+ end
74
+ if hash.has_key?(:properties)
75
+ props = hash.delete(:properties)
76
+ if props.is_a?(Hash)
77
+ props.each_with_index do |(id, value), index|
78
+ hash.merge!("propertyId[#{index}]" => id,
79
+ "propertyValue[#{index}]" => value)
80
+ end
81
+ end
82
+ end
83
+ hash
84
+ end
85
+
86
+ class Basement
87
+ include HTTParty
88
+
89
+ def self.multipart_post(url, options)
90
+ url = URI.parse(url)
91
+ Net::HTTP.start(url.host, url.port) do |http|
92
+ http.request(Net::HTTP::Post::Multipart.new(url.path, options))
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,20 @@
1
+ module YACCL
2
+ module MultiFilingServices
3
+ def add_object_to_folder(repository_id, object_id, folder_id, all_versions, extension={})
4
+ required = {cmisaction: 'addObjectToFolder',
5
+ repositoryId: repository_id,
6
+ objectId: object_id,
7
+ folderId: folder_id}
8
+ optional = {allVersions: all_versions}
9
+ perform_request(required, optional)
10
+ end
11
+
12
+ def remove_object_from_folder(repository_id, object_id, folder_id, extension={})
13
+ required = {repositoryId: repository_id,
14
+ cmisaction: 'removeObjectFromFolder',
15
+ objectId: object_id}
16
+ optional = {folderId: folder_id}
17
+ perform_request(required, optional)
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,78 @@
1
+ module YACCL
2
+ module NavigationServices
3
+ def get_children(repository_id, folder_id, filter, order_by, include_allowable_actions, include_relationships, rendition_filter, include_path_segment, max_items, skip_count, extension={})
4
+ required = {cmisselector: 'children',
5
+ repositoryId: repository_id,
6
+ objectId: folder_id}
7
+ optional = {filter: filter,
8
+ orderBy: order_by,
9
+ includeAllowableActions: include_allowable_actions,
10
+ includeRelationships: include_relationships,
11
+ renditionFilter: rendition_filter,
12
+ includePathSegment: include_path_segment,
13
+ maxItems: max_items,
14
+ skipCount: skip_count}
15
+ perform_request(required, optional)
16
+ end
17
+
18
+ def get_descendants(repository_id, folder_id, depth, filter, include_allowable_actions, include_relationships, rendition_filter, include_path_segment, extension={})
19
+ required = {cmisselector: 'descendants',
20
+ repositoryId: repository_id,
21
+ objectId: folder_id}
22
+ optional = {depth: depth,
23
+ filter: filter,
24
+ includeAllowableActions: include_allowable_actions,
25
+ includeRelationships: include_relationships,
26
+ renditionFilter: rendition_filter,
27
+ includePathSegment: include_path_segment}
28
+ perform_request(required, optional)
29
+ end
30
+
31
+ def get_folder_tree(repository_id, folder_id, depth, filter, include_allowable_actions, include_relationships, rendition_filter, include_path_segment, extension={})
32
+ required = {cmisselector: 'folderTree',
33
+ repositoryId: repository_id,
34
+ objectId: folder_id}
35
+ optional = {depth: depth,
36
+ filter: filter,
37
+ includeAllowableActions: include_allowable_actions,
38
+ includeRelationships: include_relationships,
39
+ renditionFilter: rendition_filter,
40
+ includePathSegment: include_path_segment}
41
+ perform_request(required, optional)
42
+ end
43
+
44
+ def get_folder_parent(repository_id, folder_id, filter, extension={})
45
+ required = {cmisselector: 'parent',
46
+ repositoryId: repository_id,
47
+ objectId: folder_id}
48
+ optional = {filter:filter}
49
+ perform_request(required, optional)
50
+ end
51
+
52
+ def get_object_parents(repository_id, object_id, filter, include_allowable_actions, include_relationships, rendition_filter, include_relative_path_segment, extension={})
53
+ required = {cmisselector: 'parents',
54
+ repositoryId: repository_id,
55
+ objectId: object_id}
56
+ optional = {filter: filter,
57
+ includeAllowableActions: include_allowable_actions,
58
+ includeRelationships: include_relationships,
59
+ renditionFilter: rendition_filter,
60
+ includePathSegment: include_path_segment}
61
+ perform_request(required, optional)
62
+ end
63
+
64
+ def get_checked_out_docs(repository_id, folder_id, filter, order_by, include_allowable_actions, include_relationships, rendition_filter, max_items, skip_count, extension={})
65
+ required = {cmisselector: 'checkedout',
66
+ repositoryId: repository_id}
67
+ optional = {objectId: folder_id,
68
+ filter: filter,
69
+ orderBy: order_by,
70
+ includeAllowableActions: include_allowable_actions,
71
+ includeRelationships: include_relationships,
72
+ renditionFilter: rendition_filter,
73
+ maxItems: max_items,
74
+ skipCount: skip_count}
75
+ perform_request(required, optional)
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,192 @@
1
+ module YACCL
2
+ module ObjectServices
3
+ def get_object(repository_id, object_id, filter, include_allowable_actions, include_relationships, rendition_filter, include_policy_ids, include_acl, extension={})
4
+ required = {cmisselector: 'object',
5
+ repositoryId: repository_id,
6
+ objectId: object_id}
7
+ optional = {filter: filter,
8
+ includeAllowableActions: include_allowable_actions,
9
+ includeRelationships: include_relationships,
10
+ renditionFilter: rendition_filter,
11
+ includePolicyIds: include_policy_ids,
12
+ includeAcl: include_acl}
13
+ perform_request(required, optional)
14
+ end
15
+
16
+ def get_properties(repository_id, object_id, filter, extension={})
17
+ required = {cmisselector: 'properties',
18
+ repositoryId: repository_id,
19
+ objectId: object_id}
20
+ optional = {filter: filter}
21
+ perform_request(required, optional)
22
+ end
23
+
24
+ def create_document(repository_id, properties, folder_id, content, versioning_state, policies, add_aces, remove_aces, extension={})
25
+ required = {cmisaction: 'createDocument',
26
+ repositoryId: repository_id,
27
+ properties: properties}
28
+ optional = {objectId: folder_id,
29
+ content: content,
30
+ versioningState: versioning_state,
31
+ policies: policies,
32
+ addACEs: add_aces,
33
+ removeACEs: remove_aces}
34
+ perform_request(required, optional)
35
+ end
36
+
37
+ def create_document_from_source(repository_id, source_id, properties, folder_id, versioning_state, policies, add_aces, remove_aces, extension={})
38
+ required = {cmisaction: 'createDocument',
39
+ repositoryId: repository_id,
40
+ sourceId: source_id}
41
+ optional = {properties: properties,
42
+ objectId: folder_id,
43
+ versioningState: versioning_state,
44
+ policies: policies,
45
+ addACEs: add_aces,
46
+ removeACEs: remove_aces}
47
+ perform_request(required, optional)
48
+ end
49
+
50
+ def create_folder(repository_id, properties, folder_id, policies, add_aces, remove_aces, extension={})
51
+ required = {cmisaction: 'createFolder',
52
+ repositoryId: repository_id,
53
+ properties: properties,
54
+ objectId: folder_id}
55
+ optional = {policies: policies,
56
+ addACEs: add_aces,
57
+ removeACEs: remove_aces}
58
+ perform_request(required, optional)
59
+ end
60
+
61
+ def create_relationship(repository_id, properties, policies, add_aces, remove_aces, extension={})
62
+ required = {cmisaction: 'createRelationship',
63
+ repositoryId: repository_id,
64
+ properties: properties}
65
+ optional = {policies: policies,
66
+ addACEs: add_aces,
67
+ removeACEs: remove_aces}
68
+ perform_request(required, optional)
69
+ end
70
+
71
+ def create_policy(repository_id, properties, folder_id, policies, add_aces, remove_aces, extension={})
72
+ required = {cmisaction: 'createPolicy',
73
+ repositoryId: repository_id,
74
+ properties: properties}
75
+ optional = {objectId: folder_id,
76
+ policies: policies,
77
+ addACEs: add_aces,
78
+ removeACEs: remove_aces}
79
+ perform_request(required, optional)
80
+ end
81
+
82
+ def create_item(repository_id, properties, folder_id, policies, add_aces, remove_aces, extension={})
83
+ required = {cmisaction: 'createItem',
84
+ repositoryId: repository_id,
85
+ properties: properties}
86
+ optional = {objectId: folder_id,
87
+ policies: policies,
88
+ addACEs: add_aces,
89
+ removeACEs: remove_aces}
90
+ perform_request(required, optional)
91
+ end
92
+
93
+ def get_allowable_actions(repository_id, object_id, extension={})
94
+ required = {cmisselector: 'allowableActions',
95
+ repositoryId: repository_id,
96
+ objectId: object_id}
97
+ perform_request(required)
98
+ end
99
+
100
+ def get_renditions(repository_id, object_id, rendition_filter, max_items, skip_count, extension={})
101
+ required = {cmisselector: 'renditions',
102
+ repositoryId: repository_id,
103
+ objectId: object_id}
104
+ optional = {renditionFilter: rendition_filter,
105
+ maxItems: max_items,
106
+ skipCount: skip_count}
107
+ perform_request(required, optional)
108
+ end
109
+
110
+ def get_object_by_path(repository_id, path, filter, include_allowable_actions, include_relationships, rendition_filter, include_policy_ids, include_acl, extension={})
111
+ raise 'Not supported.'
112
+ end
113
+
114
+ def get_content_stream(repository_id, object_id, stream_id, offset, length, extension={})
115
+ required = {cmisselector: 'content',
116
+ repositoryId: repository_id,
117
+ objectId: object_id}
118
+ optional = {streamId: stream_id,
119
+ offset: offset,
120
+ length: length}
121
+ perform_request(required, optional)
122
+ end
123
+
124
+ def update_properties(repository_id, object_id, change_token, properties, extension={})
125
+ required = {cmisaction: 'update',
126
+ repositoryId: repository_id,
127
+ objectId: object_id,
128
+ properties: properties}
129
+ optional = {changeToken: change_token}
130
+ perform_request(required, optional)
131
+ end
132
+
133
+ def bulk_update_properties(repository_id, object_ids_and_change_tokens, properties, add_secondary_type_ids, remove_secondary_type_ids, extension={})
134
+ # TODO
135
+ end
136
+
137
+ def move_object(repository_id, object_id, target_folder_id, source_folder_id, extension={})
138
+ required = {cmisaction: 'move',
139
+ repositoryId: repository_id,
140
+ objectId: object_id,
141
+ targetFolderId: target_folder_id,
142
+ sourceFolderId: source_folder_id}
143
+ perform_request(required)
144
+ end
145
+
146
+ def delete_object(repository_id, object_id, all_versions, extension={})
147
+ required = {cmisaction: 'delete',
148
+ repositoryId: repository_id,
149
+ objectId: object_id}
150
+ optional = {allVersions: all_versions}
151
+ perform_request(required, optional)
152
+ end
153
+
154
+ def delete_tree(repository_id, folder_id, all_versions, unfile_objects, continue_on_failure, extension={})
155
+ required = {cmisaction: 'deleteTree',
156
+ repositoryId: repository_id,
157
+ objectId: folder_id}
158
+ optional = {allVersions: all_versions,
159
+ unfileObjects: unfile_objects,
160
+ continueOnFailure: continue_on_failure}
161
+ perform_request(required, optional)
162
+ end
163
+
164
+ def set_content_stream(repository_id, object_id, overwrite_flag, change_token, content, extension={})
165
+ required = {cmisaction: 'setContent',
166
+ repositoryId: repository_id,
167
+ objectId: object_id,
168
+ content: content}
169
+ optional = {overwriteFlag: overwrite_flag,
170
+ changeToken:change_token}
171
+ perform_request(required, optional)
172
+ end
173
+
174
+ def delete_content_stream(repository_id, object_id, change_token, extension={})
175
+ required = {cmisaction: 'deleteContent',
176
+ repositoryId: repository_id,
177
+ objectId: object_id}
178
+ optional = {changeToken: change_token}
179
+ perform_request(required, optional)
180
+ end
181
+
182
+ def append_content_stream(repository_id, object_id, change_token, content, is_last_chunk, extension={})
183
+ required = {cmisaction: 'appendContent',
184
+ repositoryId: repository_id,
185
+ objectId: object_id,
186
+ content: content}
187
+ optional = {isLastChunk: is_last_chunk,
188
+ changeToken: change_token}
189
+ perform_request(required, optional)
190
+ end
191
+ end
192
+ end