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.
Files changed (133) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +51 -0
  5. data/app/assets/javascripts/cmis_server/application.js +13 -0
  6. data/app/assets/stylesheets/cmis_server/application.css +15 -0
  7. data/app/controllers/cmis_server/application_controller.rb +19 -0
  8. data/app/controllers/cmis_server/atom_pub/base_controller.rb +23 -0
  9. data/app/controllers/cmis_server/atom_pub/bulk_controller.rb +302 -0
  10. data/app/controllers/cmis_server/atom_pub/content_controller.rb +178 -0
  11. data/app/controllers/cmis_server/atom_pub/entries_controller.rb +41 -0
  12. data/app/controllers/cmis_server/atom_pub/folder_collection_controller.rb +70 -0
  13. data/app/controllers/cmis_server/atom_pub/query_controller.rb +138 -0
  14. data/app/controllers/cmis_server/atom_pub/repository_controller.rb +75 -0
  15. data/app/controllers/cmis_server/atom_pub/secondary_types_controller.rb +149 -0
  16. data/app/controllers/cmis_server/atom_pub/service_documents_controller.rb +34 -0
  17. data/app/controllers/cmis_server/atom_pub/types_controller.rb +229 -0
  18. data/app/controllers/cmis_server/atom_pub/uri_templates_controller.rb +58 -0
  19. data/app/controllers/concerns/cmis_server/atom_pub/repository_scopable.rb +18 -0
  20. data/app/helpers/cmis_server/application_helper.rb +31 -0
  21. data/app/models/cmis_server/application_record.rb +5 -0
  22. data/app/services/cmis_server/bulk_update_service.rb +69 -0
  23. data/app/services/cmis_server/content_stream_service.rb +75 -0
  24. data/app/services/cmis_server/discovery_service.rb +31 -0
  25. data/app/services/cmis_server/navigation_service.rb +43 -0
  26. data/app/services/cmis_server/object_service.rb +176 -0
  27. data/app/services/cmis_server/repository_service.rb +40 -0
  28. data/app/services/cmis_server/secondary_type_service.rb +120 -0
  29. data/app/services/cmis_server/type_management_service.rb +117 -0
  30. data/app/views/cmis_server/atom_pub/bulk_update_feed.atom.builder +47 -0
  31. data/app/views/cmis_server/atom_pub/entries/_cmis_document_links.atom_entry.builder +0 -0
  32. data/app/views/cmis_server/atom_pub/entries/_cmis_folder_links.atom_entry.builder +3 -0
  33. data/app/views/cmis_server/atom_pub/entries/_object_entry.atom_entry.builder +64 -0
  34. data/app/views/cmis_server/atom_pub/entries/_property.atom_entry.builder +8 -0
  35. data/app/views/cmis_server/atom_pub/entries/object_entry.atom_entry.builder +1 -0
  36. data/app/views/cmis_server/atom_pub/entries/type_entry.atom_entry.builder +59 -0
  37. data/app/views/cmis_server/atom_pub/feeds/_feed_entry.atom_feed.builder +1 -0
  38. data/app/views/cmis_server/atom_pub/feeds/feed.atom_feed.builder +30 -0
  39. data/app/views/cmis_server/atom_pub/service_documents/_uri_template.atom_service.builder +5 -0
  40. data/app/views/cmis_server/atom_pub/service_documents/_workspace.atom_service.builder +89 -0
  41. data/app/views/cmis_server/atom_pub/service_documents/service_document.atom_service.builder +1 -0
  42. data/app/views/cmis_server/atom_pub/shared/_collection.xml.builder +7 -0
  43. data/app/views/cmis_server/atom_pub/shared/atom_entry_layout.atom_entry.builder +0 -0
  44. data/app/views/cmis_server/atom_pub/type_entry.atom.builder +69 -0
  45. data/app/views/cmis_server/atom_pub/types_feed.atom.builder +91 -0
  46. data/app/views/layouts/cmis_server/application.atom_entry.builder +2 -0
  47. data/app/views/layouts/cmis_server/application.atom_feed.builder +3 -0
  48. data/app/views/layouts/cmis_server/application.atom_service.builder +10 -0
  49. data/app/views/layouts/cmis_server/application.html.erb +14 -0
  50. data/config/routes.rb +49 -0
  51. data/lib/cmis_server/atom_pub/entry_parser.rb +72 -0
  52. data/lib/cmis_server/base_objects/base_type.rb +128 -0
  53. data/lib/cmis_server/base_objects/document.rb +68 -0
  54. data/lib/cmis_server/base_objects/folder.rb +104 -0
  55. data/lib/cmis_server/base_objects/item.rb +25 -0
  56. data/lib/cmis_server/base_types.rb +123 -0
  57. data/lib/cmis_server/cmis_object.rb +190 -0
  58. data/lib/cmis_server/configuration.rb +43 -0
  59. data/lib/cmis_server/constants.rb +8 -0
  60. data/lib/cmis_server/content_stream.rb +52 -0
  61. data/lib/cmis_server/context.rb +11 -0
  62. data/lib/cmis_server/document_object.rb +12 -0
  63. data/lib/cmis_server/document_type.rb +67 -0
  64. data/lib/cmis_server/engine.rb +60 -0
  65. data/lib/cmis_server/exceptions.rb +185 -0
  66. data/lib/cmis_server/folder_object.rb +18 -0
  67. data/lib/cmis_server/folder_type.rb +34 -0
  68. data/lib/cmis_server/id.rb +18 -0
  69. data/lib/cmis_server/item_adapter.rb +26 -0
  70. data/lib/cmis_server/item_object.rb +15 -0
  71. data/lib/cmis_server/item_type.rb +7 -0
  72. data/lib/cmis_server/object_adapter.rb +79 -0
  73. data/lib/cmis_server/property.rb +29 -0
  74. data/lib/cmis_server/property_definition.rb +118 -0
  75. data/lib/cmis_server/query/parser.output +2250 -0
  76. data/lib/cmis_server/query/parser.racc +222 -0
  77. data/lib/cmis_server/query/parser.racc.rb +1039 -0
  78. data/lib/cmis_server/query/parser.rex +114 -0
  79. data/lib/cmis_server/query/parser.rex.rb +238 -0
  80. data/lib/cmis_server/query/statement.rb +395 -0
  81. data/lib/cmis_server/query.rb +2 -0
  82. data/lib/cmis_server/renderable_collection.rb +45 -0
  83. data/lib/cmis_server/renderable_object.rb +49 -0
  84. data/lib/cmis_server/repository.rb +91 -0
  85. data/lib/cmis_server/secondary_type.rb +11 -0
  86. data/lib/cmis_server/type.rb +62 -0
  87. data/lib/cmis_server/type_registry.rb +115 -0
  88. data/lib/cmis_server/version.rb +4 -0
  89. data/lib/cmis_server.rb +22 -0
  90. data/lib/tasks/cmis_server_tasks.rake +4 -0
  91. data/test/cmis_server_test.rb +7 -0
  92. data/test/dummy/README.rdoc +28 -0
  93. data/test/dummy/Rakefile +6 -0
  94. data/test/dummy/app/assets/javascripts/application.js +13 -0
  95. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  96. data/test/dummy/app/controllers/application_controller.rb +5 -0
  97. data/test/dummy/app/helpers/application_helper.rb +2 -0
  98. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  99. data/test/dummy/bin/bundle +3 -0
  100. data/test/dummy/bin/rails +4 -0
  101. data/test/dummy/bin/rake +4 -0
  102. data/test/dummy/bin/setup +29 -0
  103. data/test/dummy/config/application.rb +26 -0
  104. data/test/dummy/config/boot.rb +5 -0
  105. data/test/dummy/config/database.yml +25 -0
  106. data/test/dummy/config/environment.rb +5 -0
  107. data/test/dummy/config/environments/development.rb +41 -0
  108. data/test/dummy/config/environments/production.rb +79 -0
  109. data/test/dummy/config/environments/test.rb +42 -0
  110. data/test/dummy/config/initializers/assets.rb +11 -0
  111. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  112. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  113. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  114. data/test/dummy/config/initializers/inflections.rb +16 -0
  115. data/test/dummy/config/initializers/mime_types.rb +4 -0
  116. data/test/dummy/config/initializers/session_store.rb +3 -0
  117. data/test/dummy/config/initializers/to_time_preserves_timezone.rb +10 -0
  118. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  119. data/test/dummy/config/locales/en.yml +23 -0
  120. data/test/dummy/config/routes.rb +4 -0
  121. data/test/dummy/config/secrets.yml +22 -0
  122. data/test/dummy/config.ru +4 -0
  123. data/test/dummy/public/404.html +67 -0
  124. data/test/dummy/public/422.html +67 -0
  125. data/test/dummy/public/500.html +66 -0
  126. data/test/dummy/public/favicon.ico +0 -0
  127. data/test/integration/navigation_test.rb +8 -0
  128. data/test/services/bulk_update_service_test.rb +121 -0
  129. data/test/services/content_stream_service_test.rb +176 -0
  130. data/test/services/secondary_type_service_test.rb +174 -0
  131. data/test/services/type_management_service_test.rb +146 -0
  132. data/test/test_helper.rb +16 -0
  133. 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
+