cmis_server 1.0.3
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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +51 -0
- data/app/assets/javascripts/cmis_server/application.js +13 -0
- data/app/assets/stylesheets/cmis_server/application.css +15 -0
- data/app/controllers/cmis_server/application_controller.rb +19 -0
- data/app/controllers/cmis_server/atom_pub/base_controller.rb +23 -0
- data/app/controllers/cmis_server/atom_pub/bulk_controller.rb +302 -0
- data/app/controllers/cmis_server/atom_pub/content_controller.rb +178 -0
- data/app/controllers/cmis_server/atom_pub/entries_controller.rb +41 -0
- data/app/controllers/cmis_server/atom_pub/folder_collection_controller.rb +70 -0
- data/app/controllers/cmis_server/atom_pub/query_controller.rb +138 -0
- data/app/controllers/cmis_server/atom_pub/repository_controller.rb +75 -0
- data/app/controllers/cmis_server/atom_pub/secondary_types_controller.rb +149 -0
- data/app/controllers/cmis_server/atom_pub/service_documents_controller.rb +34 -0
- data/app/controllers/cmis_server/atom_pub/types_controller.rb +229 -0
- data/app/controllers/cmis_server/atom_pub/uri_templates_controller.rb +58 -0
- data/app/controllers/concerns/cmis_server/atom_pub/repository_scopable.rb +18 -0
- data/app/helpers/cmis_server/application_helper.rb +31 -0
- data/app/models/cmis_server/application_record.rb +5 -0
- data/app/services/cmis_server/bulk_update_service.rb +69 -0
- data/app/services/cmis_server/content_stream_service.rb +75 -0
- data/app/services/cmis_server/discovery_service.rb +31 -0
- data/app/services/cmis_server/navigation_service.rb +43 -0
- data/app/services/cmis_server/object_service.rb +176 -0
- data/app/services/cmis_server/repository_service.rb +40 -0
- data/app/services/cmis_server/secondary_type_service.rb +120 -0
- data/app/services/cmis_server/type_management_service.rb +117 -0
- data/app/views/cmis_server/atom_pub/bulk_update_feed.atom.builder +47 -0
- data/app/views/cmis_server/atom_pub/entries/_cmis_document_links.atom_entry.builder +0 -0
- data/app/views/cmis_server/atom_pub/entries/_cmis_folder_links.atom_entry.builder +3 -0
- data/app/views/cmis_server/atom_pub/entries/_object_entry.atom_entry.builder +64 -0
- data/app/views/cmis_server/atom_pub/entries/_property.atom_entry.builder +8 -0
- data/app/views/cmis_server/atom_pub/entries/object_entry.atom_entry.builder +1 -0
- data/app/views/cmis_server/atom_pub/entries/type_entry.atom_entry.builder +59 -0
- data/app/views/cmis_server/atom_pub/feeds/_feed_entry.atom_feed.builder +1 -0
- data/app/views/cmis_server/atom_pub/feeds/feed.atom_feed.builder +30 -0
- data/app/views/cmis_server/atom_pub/service_documents/_uri_template.atom_service.builder +5 -0
- data/app/views/cmis_server/atom_pub/service_documents/_workspace.atom_service.builder +89 -0
- data/app/views/cmis_server/atom_pub/service_documents/service_document.atom_service.builder +1 -0
- data/app/views/cmis_server/atom_pub/shared/_collection.xml.builder +7 -0
- data/app/views/cmis_server/atom_pub/shared/atom_entry_layout.atom_entry.builder +0 -0
- data/app/views/cmis_server/atom_pub/type_entry.atom.builder +69 -0
- data/app/views/cmis_server/atom_pub/types_feed.atom.builder +91 -0
- data/app/views/layouts/cmis_server/application.atom_entry.builder +2 -0
- data/app/views/layouts/cmis_server/application.atom_feed.builder +3 -0
- data/app/views/layouts/cmis_server/application.atom_service.builder +10 -0
- data/app/views/layouts/cmis_server/application.html.erb +14 -0
- data/config/routes.rb +49 -0
- data/lib/cmis_server/atom_pub/entry_parser.rb +72 -0
- data/lib/cmis_server/base_objects/base_type.rb +128 -0
- data/lib/cmis_server/base_objects/document.rb +68 -0
- data/lib/cmis_server/base_objects/folder.rb +104 -0
- data/lib/cmis_server/base_objects/item.rb +25 -0
- data/lib/cmis_server/base_types.rb +123 -0
- data/lib/cmis_server/cmis_object.rb +190 -0
- data/lib/cmis_server/configuration.rb +43 -0
- data/lib/cmis_server/constants.rb +8 -0
- data/lib/cmis_server/content_stream.rb +52 -0
- data/lib/cmis_server/context.rb +11 -0
- data/lib/cmis_server/document_object.rb +12 -0
- data/lib/cmis_server/document_type.rb +67 -0
- data/lib/cmis_server/engine.rb +60 -0
- data/lib/cmis_server/exceptions.rb +185 -0
- data/lib/cmis_server/folder_object.rb +18 -0
- data/lib/cmis_server/folder_type.rb +34 -0
- data/lib/cmis_server/id.rb +18 -0
- data/lib/cmis_server/item_adapter.rb +26 -0
- data/lib/cmis_server/item_object.rb +15 -0
- data/lib/cmis_server/item_type.rb +7 -0
- data/lib/cmis_server/object_adapter.rb +79 -0
- data/lib/cmis_server/property.rb +29 -0
- data/lib/cmis_server/property_definition.rb +118 -0
- data/lib/cmis_server/query/parser.output +2250 -0
- data/lib/cmis_server/query/parser.racc +222 -0
- data/lib/cmis_server/query/parser.racc.rb +1039 -0
- data/lib/cmis_server/query/parser.rex +114 -0
- data/lib/cmis_server/query/parser.rex.rb +238 -0
- data/lib/cmis_server/query/statement.rb +395 -0
- data/lib/cmis_server/query.rb +2 -0
- data/lib/cmis_server/renderable_collection.rb +45 -0
- data/lib/cmis_server/renderable_object.rb +49 -0
- data/lib/cmis_server/repository.rb +91 -0
- data/lib/cmis_server/secondary_type.rb +11 -0
- data/lib/cmis_server/type.rb +62 -0
- data/lib/cmis_server/type_registry.rb +115 -0
- data/lib/cmis_server/version.rb +4 -0
- data/lib/cmis_server.rb +22 -0
- data/lib/tasks/cmis_server_tasks.rake +4 -0
- data/test/cmis_server_test.rb +7 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/Rakefile +6 -0
- data/test/dummy/app/assets/javascripts/application.js +13 -0
- data/test/dummy/app/assets/stylesheets/application.css +15 -0
- data/test/dummy/app/controllers/application_controller.rb +5 -0
- data/test/dummy/app/helpers/application_helper.rb +2 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/bin/bundle +3 -0
- data/test/dummy/bin/rails +4 -0
- data/test/dummy/bin/rake +4 -0
- data/test/dummy/bin/setup +29 -0
- data/test/dummy/config/application.rb +26 -0
- data/test/dummy/config/boot.rb +5 -0
- data/test/dummy/config/database.yml +25 -0
- data/test/dummy/config/environment.rb +5 -0
- data/test/dummy/config/environments/development.rb +41 -0
- data/test/dummy/config/environments/production.rb +79 -0
- data/test/dummy/config/environments/test.rb +42 -0
- data/test/dummy/config/initializers/assets.rb +11 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
- data/test/dummy/config/initializers/inflections.rb +16 -0
- data/test/dummy/config/initializers/mime_types.rb +4 -0
- data/test/dummy/config/initializers/session_store.rb +3 -0
- data/test/dummy/config/initializers/to_time_preserves_timezone.rb +10 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/test/dummy/config/locales/en.yml +23 -0
- data/test/dummy/config/routes.rb +4 -0
- data/test/dummy/config/secrets.yml +22 -0
- data/test/dummy/config.ru +4 -0
- data/test/dummy/public/404.html +67 -0
- data/test/dummy/public/422.html +67 -0
- data/test/dummy/public/500.html +66 -0
- data/test/dummy/public/favicon.ico +0 -0
- data/test/integration/navigation_test.rb +8 -0
- data/test/services/bulk_update_service_test.rb +121 -0
- data/test/services/content_stream_service_test.rb +176 -0
- data/test/services/secondary_type_service_test.rb +174 -0
- data/test/services/type_management_service_test.rb +146 -0
- data/test/test_helper.rb +16 -0
- metadata +326 -0
@@ -0,0 +1,14 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>CmisServer</title>
|
5
|
+
<%= stylesheet_link_tag "cmis_server/application", media: "all" %>
|
6
|
+
<%= javascript_include_tag "cmis_server/application" %>
|
7
|
+
<%= csrf_meta_tags %>
|
8
|
+
</head>
|
9
|
+
<body>
|
10
|
+
|
11
|
+
<%= yield %>
|
12
|
+
|
13
|
+
</body>
|
14
|
+
</html>
|
data/config/routes.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
CmisServer::Engine.routes.draw do
|
2
|
+
namespace :atom_pub do
|
3
|
+
get "/" => "service_documents#service_document"
|
4
|
+
|
5
|
+
scope ":repository_id" do
|
6
|
+
# CMIS 1.1: Routes pour les informations du repository
|
7
|
+
get "capabilities" => "repository#capabilities", as: :repository_capabilities
|
8
|
+
get "extensions" => "repository#extensions", as: :repository_extensions
|
9
|
+
get "info" => "repository#info", as: :repository_info
|
10
|
+
|
11
|
+
get "content/:id" => "content#show", as: :content
|
12
|
+
# CMIS 1.1: Ajouter la route pour appendContentStream
|
13
|
+
post "content/:id/append" => "content#append", as: :append_content
|
14
|
+
# CMIS 1.1: Ajouter les routes pour les opérations de content stream étendues
|
15
|
+
put "content/:id" => "content#set_content_stream", as: :set_content_stream
|
16
|
+
delete "content/:id" => "content#delete_content_stream", as: :delete_content_stream
|
17
|
+
|
18
|
+
resource :entry, only:[:show,:update,:destroy]
|
19
|
+
|
20
|
+
# CMIS 1.1: Ajouter les routes pour la gestion des types
|
21
|
+
resources :types, only: [:index, :show, :create, :update, :destroy]
|
22
|
+
|
23
|
+
# CMIS 1.1: Ajouter la route pour bulkUpdateProperties
|
24
|
+
post "bulk" => "bulk#update_properties", as: :bulk_update
|
25
|
+
|
26
|
+
# CMIS 1.1: Nouvelles routes pour les opérations bulk étendues
|
27
|
+
post "bulk/delete" => "bulk#delete_properties", as: :bulk_delete
|
28
|
+
post "bulk/move" => "bulk#move_objects", as: :bulk_move
|
29
|
+
|
30
|
+
# CMIS 1.1: Ajouter les routes pour la gestion des types secondaires
|
31
|
+
get "objects/:id/types" => "secondary_types#index", as: :list_secondary_types
|
32
|
+
post "objects/:id/types" => "secondary_types#add_secondary_type", as: :add_secondary_type
|
33
|
+
delete "objects/:id/types/:typeId" => "secondary_types#remove_secondary_type", as: :remove_secondary_type
|
34
|
+
|
35
|
+
get "path" => "uri_templates#object_by_path", as: :object_by_path
|
36
|
+
get "id" => "uri_templates#object_by_id", as: :object_by_id
|
37
|
+
get "type" => "uri_templates#type_by_id", as: :type_by_id
|
38
|
+
|
39
|
+
# CMIS 1.1: Routes pour les requêtes avancées
|
40
|
+
post "query" => "query#query", as: :query
|
41
|
+
get "query/types" => "query#queryable_types", as: :queryable_types
|
42
|
+
post "query/validate" => "query#validate_query", as: :validate_query
|
43
|
+
|
44
|
+
get "folder_collection/:id" => "folder_collection#get_children", as: :folder_collection
|
45
|
+
post "folder_collection/:id" => "folder_collection#create_children"
|
46
|
+
delete "folder_collection/:id" => "folder_collection#destroy"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class EntryParser
|
3
|
+
attr_reader :raw_body
|
4
|
+
|
5
|
+
def initialize(raw_body)
|
6
|
+
@raw_body=raw_body
|
7
|
+
end
|
8
|
+
|
9
|
+
def parse
|
10
|
+
object_type.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def content_stream
|
14
|
+
if content_element
|
15
|
+
unless @stream
|
16
|
+
base64=content_element.get_elements('cmisra:base64').first&.text
|
17
|
+
media_type=content_element.get_elements('cmisra:mediatype').first&.text
|
18
|
+
@stream=CmisServer::ContentStream.new(base64: base64, media_type: media_type)
|
19
|
+
end
|
20
|
+
@stream
|
21
|
+
else
|
22
|
+
nil
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def object_type
|
27
|
+
TypeAdapter.find!(object_properties["cmis:objectTypeId"])
|
28
|
+
end
|
29
|
+
|
30
|
+
def cmis_object_id
|
31
|
+
#ToDo
|
32
|
+
nil
|
33
|
+
end
|
34
|
+
|
35
|
+
def atom_entry
|
36
|
+
@atom_entry||=Atom::Entry.parse(raw_body)
|
37
|
+
end
|
38
|
+
|
39
|
+
def content_element
|
40
|
+
atom_entry.extensions.find{|e| e.namespace==CMIS_REST_ATOM_NAMESPACE&&e.local_name=='content'}
|
41
|
+
end
|
42
|
+
|
43
|
+
def object_element
|
44
|
+
atom_entry.extensions.find{|e| e.namespace==CMIS_REST_ATOM_NAMESPACE&&e.local_name=='object'}
|
45
|
+
end
|
46
|
+
|
47
|
+
def object_properties
|
48
|
+
unless @properties
|
49
|
+
properties_element=object_element.get_elements("#{cmis_namespace_name}:properties").first
|
50
|
+
@properties=properties_element.elements.each_with_object(Hash.new){|p,h| h.merge!(parse_property(p))}
|
51
|
+
end
|
52
|
+
@properties
|
53
|
+
end
|
54
|
+
|
55
|
+
def cmis_namespace_name
|
56
|
+
object_element.namespaces.find{|_k,v|v==CMIS_NAMESPACE}[0]
|
57
|
+
end
|
58
|
+
|
59
|
+
def cmis_rest_atom_namespace_name
|
60
|
+
object_element.namespaces.find{|_k,v|v==CMIS_REST_ATOM_NAMESPACE}[0]
|
61
|
+
end
|
62
|
+
|
63
|
+
def parse_property(property_element)
|
64
|
+
{
|
65
|
+
property_element.attributes['propertyDefinitionId'] => property_element.get_elements("#{cmis_namespace_name}:value").first&.text
|
66
|
+
}
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class BaseType
|
3
|
+
class<<self
|
4
|
+
|
5
|
+
attr_reader :id,
|
6
|
+
:local_name,
|
7
|
+
:local_namespace,
|
8
|
+
:query_name,
|
9
|
+
:display_name,
|
10
|
+
:base_id,
|
11
|
+
:parent_type,
|
12
|
+
:description,
|
13
|
+
:creatable,
|
14
|
+
:fileable,
|
15
|
+
:queryable,
|
16
|
+
:controllable_policy,
|
17
|
+
:controllable_acl,
|
18
|
+
:fulltext_indexed,
|
19
|
+
:included_in_supertype_query
|
20
|
+
|
21
|
+
attr_reader :self_property_definitions
|
22
|
+
|
23
|
+
def type_definition(opts={})
|
24
|
+
|
25
|
+
@id = CmisServer::Id.new(opts.fetch(:id).to_s)
|
26
|
+
CmisServer::TypeRegistry.register_type(self.id, self)
|
27
|
+
|
28
|
+
@parent_type = opts.fetch(:parent_type)
|
29
|
+
@local_name = opts.fetch(:local_name,id)
|
30
|
+
@local_namespace = opts.fetch(:local_namespace,'local')
|
31
|
+
@query_name = opts.fetch(:query_name,id)
|
32
|
+
@display_name = opts.fetch(:display_name,id)
|
33
|
+
@description = opts.fetch(:description,'No description provided')
|
34
|
+
@creatable = opts.fetch(:creatable ,false)
|
35
|
+
@fileable = opts.fetch(:fileable ,false)
|
36
|
+
@queryable = opts.fetch(:queryable ,false)
|
37
|
+
@controllable_policy = opts.fetch(:controllable_policy ,false)
|
38
|
+
@controllable_acl = opts.fetch(:controllable_acl ,false)
|
39
|
+
@fulltext_indexed = opts.fetch(:fulltext_indexed ,false)
|
40
|
+
@included_in_supertype_query = opts.fetch(:included_in_supertype_query,false)
|
41
|
+
|
42
|
+
define_properties_methods(parent_property_definitions)
|
43
|
+
end
|
44
|
+
|
45
|
+
def base_type
|
46
|
+
self.parent_type ? self.parent_type.base_type : self
|
47
|
+
end
|
48
|
+
|
49
|
+
def parent_id
|
50
|
+
self.parent_type&.id
|
51
|
+
end
|
52
|
+
|
53
|
+
#Should be overwrited by base types
|
54
|
+
def base_id
|
55
|
+
self.parent_type.base_id
|
56
|
+
end
|
57
|
+
|
58
|
+
def property_definitions
|
59
|
+
@self_property_definitions.to_a+parent_property_definitions
|
60
|
+
end
|
61
|
+
|
62
|
+
def parent_property_definitions
|
63
|
+
self.parent_type&.property_definitions.to_a
|
64
|
+
end
|
65
|
+
|
66
|
+
def property(id,opts)
|
67
|
+
pd=CmisServer::PropertyDefinition.register_property_definition({id:id.freeze}.merge(opts))
|
68
|
+
@self_property_definitions||=[]
|
69
|
+
@self_property_definitions<<pd
|
70
|
+
define_properties_methods(pd)
|
71
|
+
end
|
72
|
+
|
73
|
+
def adapter_class
|
74
|
+
"#{self.to_s}Adapter".constantize
|
75
|
+
end
|
76
|
+
|
77
|
+
protected
|
78
|
+
|
79
|
+
def define_properties_methods(property_definitions)
|
80
|
+
[*property_definitions].each do |pd|
|
81
|
+
define_method(pd.getter_method_name){@properties[pd.id].value}
|
82
|
+
define_method(pd.setter_method_name){|v|@properties[pd.id].value=v}
|
83
|
+
define_method(pd.property_method_name){@properties[pd.id]}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
attr_reader :properties
|
89
|
+
attr_accessor :id, :local_name, :local_namespace, :query_name, :display_name, :base_id, :parent_type, :description, :creatable, :fileable, :queryable, :controllable_policy, :controllable_acl, :fulltext_indexed, :included_in_supertype_query, :property_definitions
|
90
|
+
|
91
|
+
def initialize(attrs={})
|
92
|
+
initialize_properties
|
93
|
+
|
94
|
+
attrs.to_h.each do |property,value|
|
95
|
+
self.send(property.to_s.gsub(/[^0-9a-z]/i, '_').underscore+"=",value)
|
96
|
+
end
|
97
|
+
|
98
|
+
end
|
99
|
+
|
100
|
+
def adapter_class
|
101
|
+
self.class.adapter_class
|
102
|
+
end
|
103
|
+
|
104
|
+
def adapter(context:)
|
105
|
+
adapter_class.new(self, context: context)
|
106
|
+
end
|
107
|
+
|
108
|
+
def ==(other)
|
109
|
+
self.cmis_object_id == other.cmis_object_id
|
110
|
+
end
|
111
|
+
|
112
|
+
def copy_properties_values_of object
|
113
|
+
self.properties.each{|_k,property| property.value=object.send(property.property_definition.getter_method_name)}
|
114
|
+
end
|
115
|
+
|
116
|
+
def initialize_properties
|
117
|
+
all_prop_defs = (self.class.property_definitions.to_a + (@property_definitions.to_a || []))
|
118
|
+
@properties = all_prop_defs.map do |pd|
|
119
|
+
[pd.id, Property.new(pd, pd.value, self)]
|
120
|
+
end.to_h
|
121
|
+
end
|
122
|
+
|
123
|
+
def to_renderable_object
|
124
|
+
CmisServer::RenderableObject.new(base_object: self)
|
125
|
+
end
|
126
|
+
|
127
|
+
end
|
128
|
+
end
|
@@ -0,0 +1,68 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class Document < BaseType
|
3
|
+
class<<self
|
4
|
+
attr_reader :versionable
|
5
|
+
attr_reader :content_stream_allowed
|
6
|
+
|
7
|
+
def type_definition(opts={})
|
8
|
+
super(opts)
|
9
|
+
@versionable = opts.fetch(:versionable,false)
|
10
|
+
@content_stream_allowed = opts.fetch(:content_stream_allowed,:notallowed) #may be in [:notallowed,:allowed, :required]
|
11
|
+
end
|
12
|
+
|
13
|
+
def base_id
|
14
|
+
id
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
type_definition( id: 'cmis:document',
|
19
|
+
parent_type: nil,
|
20
|
+
description: "A plugandwork document",
|
21
|
+
display_name: 'Document',
|
22
|
+
fileable: true,
|
23
|
+
queryable: true,
|
24
|
+
)
|
25
|
+
|
26
|
+
property 'cmis:name', type: String, required: true, updatability: :readwrite
|
27
|
+
property 'cmis:description', type: String, required: false, updatability: :readwrite
|
28
|
+
property 'cmis:objectId', type: CmisServer::Id, required: true, updatability: :readonly
|
29
|
+
property 'cmis:baseTypeId', type: CmisServer::Id, required: true, updatability: :readonly, value: base_id
|
30
|
+
property 'cmis:objectTypeId', type: CmisServer::Id, required: true, updatability: :oncreate, value: ->(obj){obj.class.id}
|
31
|
+
property 'cmis:createdBy', type: String, required: false, updatability: :readonly, queryable: true, orderable: true
|
32
|
+
property 'cmis:creationDate', type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true
|
33
|
+
property 'cmis:lastModifiedBy', type: String, required: false, updatability: :readonly, queryable: true, orderable: true
|
34
|
+
property 'cmis:lastModificationDate', type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true
|
35
|
+
property 'cmis:changeToken', type: String, required: false, updatability: :readonly
|
36
|
+
property 'cmis:isImmutable', type: Boolean, required: false, updatability: :readonly, default: false
|
37
|
+
|
38
|
+
# Versionning properties
|
39
|
+
property 'cmis:isLatestVersion', type: Boolean, required: false, updatability: :readonly
|
40
|
+
property 'cmis:isMajorVersion', type: Boolean, required: false, updatability: :readonly
|
41
|
+
property 'cmis:isLatestMajorVersion', type: Boolean, required: false, updatability: :readonly
|
42
|
+
property 'cmis:isPrivateWorkingCopy', type: Boolean, required: false, updatability: :readonly
|
43
|
+
property 'cmis:versionLabel', type: String,required: false, cardinality: :single, updatability: :readonly
|
44
|
+
property 'cmis:versionSeriesId', type: CmisServer::Id,required: false, cardinality: :single, updatability: :readonly
|
45
|
+
property 'cmis:isVersionSeriesCheckedOut', type: Boolean,required: false, cardinality: :single, updatability: :readonly
|
46
|
+
property 'cmis:versionSeriesCheckedOutBy', type: String,required: false, cardinality: :single, updatability: :readonly
|
47
|
+
property 'cmis:versionSeriesCheckedOutId', type: Id,required: false, cardinality: :single, updatability: :readonly
|
48
|
+
property 'cmis:checkinComment', type: String,required: false, cardinality: :single, updatability: :readonly
|
49
|
+
|
50
|
+
# ContentStream properties
|
51
|
+
property 'cmis:contentStreamLength', type: Integer,required: false, cardinality: :single, updatability: :readonly, value: ->(obj){obj.content_stream&.length}
|
52
|
+
property 'cmis:contentStreamMimeType', type: String,required: false, cardinality: :single, updatability: :readonly, value: ->(obj){obj.content_stream&.media_type}
|
53
|
+
property 'cmis:contentStreamFileName', type: String,required: false, cardinality: :single, updatability: :readonly, value: ->(obj){obj.content_stream&.filename}
|
54
|
+
property 'cmis:contentStreamId', type: String,required: false, cardinality: :single, updatability: :readonly, value: ->(obj){obj.content_stream&.id}
|
55
|
+
|
56
|
+
property 'plugandwork:metadata', type: String,required: false, cardinality: :single, updatability: :readwrite, description: 'Document metadata serialized as XML'
|
57
|
+
|
58
|
+
|
59
|
+
attr_accessor :content_stream
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
|
64
|
+
|
65
|
+
|
66
|
+
|
67
|
+
end
|
68
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class Folder < BaseType
|
3
|
+
|
4
|
+
def self.root_folder
|
5
|
+
unless @root
|
6
|
+
@root=CmisServer::Folder.new(CmisServer.configuration.arguments_for_root_folder)
|
7
|
+
@root.define_singleton_method :is_root?, lambda { true }
|
8
|
+
end
|
9
|
+
@root
|
10
|
+
end
|
11
|
+
|
12
|
+
class<<self
|
13
|
+
|
14
|
+
def base_id
|
15
|
+
id
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
type_definition( id: 'cmis:folder'.freeze,
|
20
|
+
parent_type: nil,
|
21
|
+
description: "A document organizer, can represent a Space or a Block in Plugandwork",
|
22
|
+
display_name: 'Folder',
|
23
|
+
fileable: true,
|
24
|
+
queryable: true,
|
25
|
+
)
|
26
|
+
|
27
|
+
property 'cmis:name', type: String, required: true
|
28
|
+
property 'cmis:description', type: String, required: false
|
29
|
+
property 'cmis:objectId', type: CmisServer::Id, required: true, updatability: :readonly
|
30
|
+
property 'cmis:baseTypeId', type: CmisServer::Id, required: true, updatability: :readonly, value: base_id
|
31
|
+
property 'cmis:objectTypeId', type: CmisServer::Id, required: true, updatability: :oncreate, value: ->(obj){obj.class.id}
|
32
|
+
property 'cmis:secondaryObjectTypeIds', type: CmisServer::Id, required: false, updatability: :readonly, cardinality: :multi
|
33
|
+
property 'cmis:createdBy', type: String, required: false, updatability: :readonly, queryable: true, orderable: true
|
34
|
+
property 'cmis:creationDate', type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true
|
35
|
+
property 'cmis:lastModifiedBy', type: String, required: false, updatability: :readonly, queryable: true, orderable: true
|
36
|
+
property 'cmis:lastModificationDate', type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true
|
37
|
+
property 'cmis:changeToken', type: String, required: false, updatability: :readonly
|
38
|
+
property 'cmis:parentId', type: CmisServer::Id, required: false, updatability: :readonly
|
39
|
+
property 'cmis:path', type: CmisServer::Id, required: false, updatability: :readonly
|
40
|
+
property 'cmis:allowedChildObjectTypeIds', type: CmisServer::Id, required: false, updatability: :readonly, cardinality: :multi
|
41
|
+
|
42
|
+
def parent
|
43
|
+
self.class.find(cmis_parent_id)
|
44
|
+
end
|
45
|
+
|
46
|
+
#Return False
|
47
|
+
#Is overwrited only for root_folder singleton instance
|
48
|
+
def is_root?
|
49
|
+
false
|
50
|
+
end
|
51
|
+
|
52
|
+
def path_slug
|
53
|
+
self.is_root? ? '' : self.cmis_object_id
|
54
|
+
end
|
55
|
+
|
56
|
+
|
57
|
+
def path
|
58
|
+
if cmis_parent_id && !cmis_parent_id=self.class.root_folder.cmis_object_id
|
59
|
+
"#{parent.path}/#{path_slug}"
|
60
|
+
else
|
61
|
+
'/'+path_slug
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
# def self.from(object)
|
66
|
+
# case object
|
67
|
+
# when Tagset
|
68
|
+
# self.new(cmis_name: object.title,
|
69
|
+
# cmis_object_id: object.id.to_s,
|
70
|
+
# cmis_created_by: 'unknown',
|
71
|
+
# cmis_creation_date: DateTime.now,
|
72
|
+
# cmis_last_modification_date:DateTime.now,
|
73
|
+
# cmis_parent_id: root_folder.cmis_object_id
|
74
|
+
# )
|
75
|
+
# when Category
|
76
|
+
# self.new(cmis_name: object.name,
|
77
|
+
# cmis_object_id: object.id.to_s,
|
78
|
+
# cmis_created_by: 'unknown',
|
79
|
+
# cmis_creation_date: DateTime.now,
|
80
|
+
# cmis_last_modification_date:DateTime.now,
|
81
|
+
# cmis_parent_id: CmisServer::Folder.from(object.tagset).cmis_object_id
|
82
|
+
# )
|
83
|
+
# else
|
84
|
+
# raise
|
85
|
+
# end
|
86
|
+
# end
|
87
|
+
|
88
|
+
# def self.find(id)
|
89
|
+
# source=Tagset.find_by(id:id)||Category.find_by(id: id)
|
90
|
+
# source&&from(source)
|
91
|
+
# end
|
92
|
+
|
93
|
+
# def find_slug_in_children(slug)
|
94
|
+
# self.class.find(slug)||CmisServer::DocumentAdapter::ClassAdapter.new(context: {current_user: }).find(slug)
|
95
|
+
# end
|
96
|
+
|
97
|
+
def to_plugandwork_object
|
98
|
+
Tagset.find_by(id:self.cmis_object_id)||Category.find_by(id: self.cmis_object_id)
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
end
|
104
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module CmisServer
|
2
|
+
module BaseObjects
|
3
|
+
class Item < CmisServer::BaseType
|
4
|
+
type_definition id: 'cmis:item',
|
5
|
+
parent_type: nil,
|
6
|
+
description: "A CMIS item",
|
7
|
+
display_name: 'Item',
|
8
|
+
creatable: true,
|
9
|
+
fileable: true,
|
10
|
+
queryable: true
|
11
|
+
|
12
|
+
property 'cmis:name', type: String, required: true, updatability: :readwrite
|
13
|
+
property 'cmis:description', type: String, required: false, updatability: :readwrite
|
14
|
+
property 'cmis:objectId', type: CmisServer::Id, required: true, updatability: :readonly
|
15
|
+
property 'cmis:baseTypeId', type: CmisServer::Id, required: true, updatability: :readonly, value: ->(obj) { obj.type.base_id }
|
16
|
+
property 'cmis:objectTypeId', type: CmisServer::Id, required: true, updatability: :oncreate, value: ->(obj) { obj.type.id }
|
17
|
+
property 'cmis:secondaryObjectTypeIds', type: CmisServer::Id, required: false, updatability: :readwrite, cardinality: :multi
|
18
|
+
property 'cmis:createdBy', type: String, required: false, updatability: :readonly, queryable: true, orderable: true
|
19
|
+
property 'cmis:creationDate', type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true
|
20
|
+
property 'cmis:lastModifiedBy', type: String, required: false, updatability: :readonly, queryable: true, orderable: true
|
21
|
+
property 'cmis:lastModificationDate', type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true
|
22
|
+
property 'cmis:changeToken', type: String, required: false, updatability: :readonly
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class BaseTypeDefinition < Type
|
3
|
+
|
4
|
+
end
|
5
|
+
|
6
|
+
# Secondary Type Definition - déplacé ici pour éviter les dépendances circulaires
|
7
|
+
SECONDARY_TYPE=CmisServer::BaseTypeDefinition.new(id: 'cmis:secondary',
|
8
|
+
parent_type: nil,
|
9
|
+
description: "A CMIS secondary type",
|
10
|
+
display_name: 'Secondary',
|
11
|
+
creatable: false,
|
12
|
+
fileable: false,
|
13
|
+
queryable: true,
|
14
|
+
controllable_policy: false,
|
15
|
+
controllable_acl: false,
|
16
|
+
property_definitions: [
|
17
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:name'.freeze, type: String, required: true}),
|
18
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:description'.freeze, type: String, required: false}),
|
19
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:objectId'.freeze, type: CmisServer::Id, required: true, updatability: :readonly}),
|
20
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:baseTypeId'.freeze, type: CmisServer::Id, required: true, updatability: :readonly, value: ->(obj) { obj.type.base_id }}),
|
21
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:objectTypeId'.freeze, type: CmisServer::Id, required: true, updatability: :oncreate, value: ->(obj) { obj.type.id }}),
|
22
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:createdBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
23
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:creationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
24
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModifiedBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
25
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModificationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
26
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:changeToken'.freeze, type: String, required: false, updatability: :readonly}),
|
27
|
+
]
|
28
|
+
)
|
29
|
+
|
30
|
+
# Item Type Definition - déplacé ici pour éviter les dépendances circulaires
|
31
|
+
ITEM_TYPE=CmisServer::BaseTypeDefinition.new(id: 'cmis:item',
|
32
|
+
parent_type: nil,
|
33
|
+
description: "A CMIS item",
|
34
|
+
display_name: 'Item',
|
35
|
+
creatable: true,
|
36
|
+
fileable: true,
|
37
|
+
queryable: true,
|
38
|
+
property_definitions: [
|
39
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:name'.freeze, type: String, required: true}),
|
40
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:description'.freeze, type: String, required: false}),
|
41
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:objectId'.freeze, type: CmisServer::Id, required: true, updatability: :readonly}),
|
42
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:baseTypeId'.freeze, type: CmisServer::Id, required: true, updatability: :readonly, value: ->(obj) { obj.type.base_id }}),
|
43
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:objectTypeId'.freeze, type: CmisServer::Id, required: true, updatability: :oncreate, value: ->(obj) { obj.type.id }}),
|
44
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:secondaryObjectTypeIds'.freeze, type: CmisServer::Id, required: false, updatability: :readwrite, cardinality: :multi}),
|
45
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:createdBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
46
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:creationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
47
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModifiedBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
48
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModificationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
49
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:changeToken'.freeze, type: String, required: false, updatability: :readonly}),
|
50
|
+
]
|
51
|
+
)
|
52
|
+
|
53
|
+
DOCUMENT_TYPE=CmisServer::BaseTypeDefinition.new(id: 'cmis:document',
|
54
|
+
parent_type: nil,
|
55
|
+
description: "A CMIS document",
|
56
|
+
display_name: 'Document',
|
57
|
+
creatable: true,
|
58
|
+
fileable: true,
|
59
|
+
queryable: true,
|
60
|
+
property_definitions: [
|
61
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:name'.freeze, type: String, required: true, updatability: :readwrite}),
|
62
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:description'.freeze, type: String, required: false, updatability: :readwrite}),
|
63
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:objectId'.freeze, type: CmisServer::Id, required: true, updatability: :readonly}),
|
64
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:baseTypeId'.freeze, type: CmisServer::Id, required: true, updatability: :readonly, value: ->(obj) { obj.type.base_id }}),
|
65
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:objectTypeId'.freeze, type: CmisServer::Id, required: true, updatability: :oncreate, value: ->(obj) { obj.type.id }}),
|
66
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:secondaryObjectTypeIds'.freeze, type: CmisServer::Id, required: false, updatability: :readwrite, cardinality: :multi}),
|
67
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:createdBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
68
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:creationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
69
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModifiedBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
70
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModificationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
71
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:changeToken'.freeze, type: String, required: false, updatability: :readonly}),
|
72
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:isImmutable'.freeze, type: Boolean, required: false, updatability: :readonly, default: false}),
|
73
|
+
|
74
|
+
# Versionning properties
|
75
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:isLatestVersion'.freeze, type: Boolean, required: false, updatability: :readonly}),
|
76
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:isMajorVersion'.freeze, type: Boolean, required: false, updatability: :readonly}),
|
77
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:isLatestMajorVersion'.freeze, type: Boolean, required: false, updatability: :readonly}),
|
78
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:isPrivateWorkingCopy'.freeze, type: Boolean, required: false, updatability: :readonly}),
|
79
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:versionLabel'.freeze, type: String, required: false, cardinality: :single, updatability: :readonly}),
|
80
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:versionSeriesId'.freeze, type: CmisServer::Id, required: false, cardinality: :single, updatability: :readonly}),
|
81
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:isVersionSeriesCheckedOut'.freeze, type: Boolean, required: false, cardinality: :single, updatability: :readonly}),
|
82
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:versionSeriesCheckedOutBy'.freeze, type: String, required: false, cardinality: :single, updatability: :readonly}),
|
83
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:versionSeriesCheckedOutId'.freeze, type: Id, required: false, cardinality: :single, updatability: :readonly}),
|
84
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:checkinComment'.freeze, type: String, required: false, cardinality: :single, updatability: :readonly}),
|
85
|
+
|
86
|
+
# ContentStream properties
|
87
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:contentStreamLength'.freeze, type: Integer, required: false, cardinality: :single, updatability: :readonly, value: ->(obj) { obj.content_stream&.length }}),
|
88
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:contentStreamMimeType'.freeze, type: String, required: false, cardinality: :single, updatability: :readonly, value: ->(obj) { obj.content_stream&.media_type }}),
|
89
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:contentStreamFileName'.freeze, type: String, required: false, cardinality: :single, updatability: :readonly, value: ->(obj) { obj.content_stream&.filename }}),
|
90
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:contentStreamId'.freeze, type: String, required: false, cardinality: :single, updatability: :readonly, value: ->(obj) { obj.content_stream&.id }}),
|
91
|
+
]
|
92
|
+
)
|
93
|
+
|
94
|
+
FOLDER_TYPE=CmisServer::BaseTypeDefinition.new(id: 'cmis:folder',
|
95
|
+
parent_type: nil,
|
96
|
+
description: "A CMIS folder",
|
97
|
+
display_name: 'Folder',
|
98
|
+
creatable: true,
|
99
|
+
fileable: true,
|
100
|
+
queryable: true,
|
101
|
+
property_definitions: [
|
102
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:name'.freeze, type: String, required: true}),
|
103
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:description'.freeze, type: String, required: false}),
|
104
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:objectId'.freeze, type: CmisServer::Id, required: true, updatability: :readonly}),
|
105
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:baseTypeId'.freeze, type: CmisServer::Id, required: true, updatability: :readonly, value: ->(obj) { obj.type.base_id }}),
|
106
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:objectTypeId'.freeze, type: CmisServer::Id, required: true, updatability: :oncreate, value: ->(obj) { obj.type.id }}),
|
107
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:secondaryObjectTypeIds'.freeze, type: CmisServer::Id, required: false, updatability: :readonly, cardinality: :multi}),
|
108
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:createdBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
109
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:creationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
110
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModifiedBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
111
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModificationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
112
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:changeToken'.freeze, type: String, required: false, updatability: :readonly}),
|
113
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:parentId'.freeze, type: CmisServer::Id, required: false, updatability: :readonly}),
|
114
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:path'.freeze, type: CmisServer::Id, required: false, updatability: :readonly}),
|
115
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:allowedChildObjectTypeIds'.freeze, type: CmisServer::Id, required: false, updatability: :readonly, cardinality: :multi}),
|
116
|
+
]
|
117
|
+
)
|
118
|
+
|
119
|
+
BASE_TYPES=[DOCUMENT_TYPE, FOLDER_TYPE, SECONDARY_TYPE, ITEM_TYPE]
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
|