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,34 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class FolderType < CmisServer::Type
|
3
|
+
|
4
|
+
def adapter_class
|
5
|
+
FolderAdapter
|
6
|
+
end
|
7
|
+
|
8
|
+
def self.base
|
9
|
+
@base||=new(id: 'cmis:folder',
|
10
|
+
parent_type: nil,
|
11
|
+
description: "A CMIS folder",
|
12
|
+
display_name: 'Folder',
|
13
|
+
creatable: true,
|
14
|
+
fileable: true,
|
15
|
+
queryable: true,
|
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:secondaryObjectTypeIds'.freeze, type: CmisServer::Id, required: false, updatability: :readonly, cardinality: :multi}),
|
23
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:createdBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
24
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:creationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
25
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModifiedBy'.freeze, type: String, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
26
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:lastModificationDate'.freeze, type: DateTime, required: false, updatability: :readonly, queryable: true, orderable: true}),
|
27
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:changeToken'.freeze, type: String, required: false, updatability: :readonly}),
|
28
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:parentId'.freeze, type: CmisServer::Id, required: false, updatability: :readonly}),
|
29
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:path'.freeze, type: CmisServer::Id, required: false, updatability: :readonly}),
|
30
|
+
CmisServer::PropertyDefinition.register_property_definition({id: 'cmis:allowedChildObjectTypeIds'.freeze, type: CmisServer::Id, required: false, updatability: :readonly, cardinality: :multi}),
|
31
|
+
])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class ItemAdapter < ObjectAdapter
|
3
|
+
class_attribute :model_class, :model_klass, :model_klass_name
|
4
|
+
|
5
|
+
class ClassAdapter < ObjectAdapter::ClassAdapter
|
6
|
+
def initialize(attrs)
|
7
|
+
super
|
8
|
+
@adapter_class = ItemAdapter
|
9
|
+
end
|
10
|
+
|
11
|
+
def find(id)
|
12
|
+
model=ItemObject.find(id)
|
13
|
+
@adapter_class.new(model, context: @context)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize(model=nil, attrs={})
|
18
|
+
super
|
19
|
+
@model ||= ItemObject.new
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.class_adapter(attrs={})
|
23
|
+
ClassAdapter.new(attrs)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class ItemObject < CmisObject
|
3
|
+
def self.base_type
|
4
|
+
CmisServer::ITEM_TYPE
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.base_id
|
8
|
+
'cmis:item'
|
9
|
+
end
|
10
|
+
|
11
|
+
def ==(other)
|
12
|
+
other.is_a?(ItemObject) && self.cmis_object_id == other.cmis_object_id
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class ObjectAdapter
|
3
|
+
|
4
|
+
class ObjectPersistenceError < StandardError;
|
5
|
+
end
|
6
|
+
|
7
|
+
class ClassAdapter
|
8
|
+
|
9
|
+
attr_reader :context
|
10
|
+
|
11
|
+
def initialize(context:)
|
12
|
+
@context= context
|
13
|
+
end
|
14
|
+
|
15
|
+
def where(conditions)
|
16
|
+
raise NotImplementedError
|
17
|
+
end
|
18
|
+
|
19
|
+
def find_by(conditions)
|
20
|
+
where(conditions).first
|
21
|
+
end
|
22
|
+
|
23
|
+
def find(id)
|
24
|
+
find_by(cmis_object_id: id)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.class_adapter(context:)
|
29
|
+
(self.to_s+"::ClassAdapter").constantize.new(context: context)
|
30
|
+
end
|
31
|
+
|
32
|
+
def class_adapter
|
33
|
+
(self.to_s+"::ClassAdapter").constantize.new(context: context)
|
34
|
+
end
|
35
|
+
|
36
|
+
attr_reader :object, :context
|
37
|
+
|
38
|
+
def initialize(object, context:)
|
39
|
+
@object =object
|
40
|
+
@context=context
|
41
|
+
end
|
42
|
+
|
43
|
+
def save!
|
44
|
+
raise ObjectPersistenceError unless save
|
45
|
+
end
|
46
|
+
|
47
|
+
def save
|
48
|
+
raise NotImplementedError
|
49
|
+
end
|
50
|
+
|
51
|
+
def reload!
|
52
|
+
object.copy_properties_values_of(self.class.find(object.cmis_object_id))
|
53
|
+
end
|
54
|
+
|
55
|
+
def add_secondary_type(secondary_type_id)
|
56
|
+
secondary_type_ids = @object.properties["cmis:secondaryObjectTypeIds"]&.value || []
|
57
|
+
return false if secondary_type_ids.include?(secondary_type_id)
|
58
|
+
|
59
|
+
secondary_type_ids << secondary_type_id
|
60
|
+
@object.properties["cmis:secondaryObjectTypeIds"].value = secondary_type_ids
|
61
|
+
save
|
62
|
+
end
|
63
|
+
|
64
|
+
def remove_secondary_type(secondary_type_id)
|
65
|
+
secondary_type_ids = @object.properties["cmis:secondaryObjectTypeIds"]&.value || []
|
66
|
+
return false unless secondary_type_ids.include?(secondary_type_id)
|
67
|
+
|
68
|
+
secondary_type_ids.delete(secondary_type_id)
|
69
|
+
@object.properties["cmis:secondaryObjectTypeIds"].value = secondary_type_ids
|
70
|
+
save
|
71
|
+
end
|
72
|
+
|
73
|
+
def secondary_types
|
74
|
+
secondary_type_ids = @object.properties["cmis:secondaryObjectTypeIds"]&.value || []
|
75
|
+
secondary_type_ids.map { |id| CmisServer::TypeRegistry.find_type(id) }
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class Property
|
3
|
+
|
4
|
+
attr_reader :property_definition
|
5
|
+
|
6
|
+
def value=(v)
|
7
|
+
if self.property_definition.value
|
8
|
+
nil
|
9
|
+
else
|
10
|
+
@value=v
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def value
|
15
|
+
self.property_definition.value ? self.property_definition.value_for(@object) : @value
|
16
|
+
end
|
17
|
+
|
18
|
+
def set_default
|
19
|
+
@value||=@property_definition.default_value.dup
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(property_definition, value=nil, object=nil)
|
23
|
+
@object =object
|
24
|
+
@property_definition=property_definition
|
25
|
+
@value =value
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
module CmisServer
|
2
|
+
class PropertyDefinition
|
3
|
+
|
4
|
+
class << self
|
5
|
+
|
6
|
+
def property_defintions
|
7
|
+
@property_defintions
|
8
|
+
end
|
9
|
+
|
10
|
+
def register_property_definition(attrs)
|
11
|
+
@property_defintions ||={}
|
12
|
+
p =PropertyDefinition.new(attrs)
|
13
|
+
@property_defintions[p.id]=p
|
14
|
+
#ToDo Check definition conflicts
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
#Todo add attributes constraints
|
20
|
+
attr_reader :id,
|
21
|
+
:local_name,
|
22
|
+
:local_namespace,
|
23
|
+
:query_name,
|
24
|
+
:display_name,
|
25
|
+
:description,
|
26
|
+
:cardinality,
|
27
|
+
:updatability,
|
28
|
+
:required,
|
29
|
+
:queryable,
|
30
|
+
:orderable,
|
31
|
+
:choices,
|
32
|
+
:open_choice,
|
33
|
+
:default_value,
|
34
|
+
:type,
|
35
|
+
:value
|
36
|
+
|
37
|
+
protected
|
38
|
+
# Property definition are read-only for the rest of the world
|
39
|
+
attr_writer :id,
|
40
|
+
:local_name,
|
41
|
+
:local_namespace,
|
42
|
+
:query_name,
|
43
|
+
:display_name,
|
44
|
+
:description,
|
45
|
+
:property_type,
|
46
|
+
:cardinality,
|
47
|
+
:updatability,
|
48
|
+
:required,
|
49
|
+
:queryable,
|
50
|
+
:orderable,
|
51
|
+
:choices,
|
52
|
+
:open_choice,
|
53
|
+
:default_value,
|
54
|
+
:type,
|
55
|
+
:value
|
56
|
+
|
57
|
+
public
|
58
|
+
|
59
|
+
|
60
|
+
def initialize(attrs={})
|
61
|
+
self.id = CmisServer::Id.new(attrs.fetch(:id).to_s)
|
62
|
+
self.local_name = attrs.fetch(:local_name, id)
|
63
|
+
self.local_namespace = attrs.fetch(:local_namespace, 'local')
|
64
|
+
self.query_name = attrs.fetch(:query_name, id)
|
65
|
+
self.display_name = attrs.fetch(:display_name, id)
|
66
|
+
self.description = attrs.fetch(:description, "No description provided")
|
67
|
+
self.property_type = attrs.fetch(:property_type, nil)
|
68
|
+
self.cardinality = attrs.fetch(:cardinality, :single)
|
69
|
+
self.updatability = attrs.fetch(:updatability, :readonly)
|
70
|
+
self.required = attrs.fetch(:required, false)
|
71
|
+
self.queryable = attrs.fetch(:queryable, false)
|
72
|
+
self.orderable = attrs.fetch(:orderable, false)
|
73
|
+
self.choices = attrs.fetch(:choices, nil)
|
74
|
+
self.open_choice = attrs.fetch(:open_choice, false)
|
75
|
+
self.default_value = attrs.fetch(:default_value, nil)
|
76
|
+
self.value = attrs.fetch(:value, nil)
|
77
|
+
self.type = attrs.fetch(:type, nil)
|
78
|
+
end
|
79
|
+
|
80
|
+
def inherited
|
81
|
+
false
|
82
|
+
end
|
83
|
+
|
84
|
+
def property_type
|
85
|
+
type.name.demodulize.downcase
|
86
|
+
end
|
87
|
+
|
88
|
+
def getter_method_name
|
89
|
+
self.id.to_method_name.to_sym
|
90
|
+
end
|
91
|
+
|
92
|
+
def setter_method_name
|
93
|
+
(self.id.to_method_name+'=').to_sym
|
94
|
+
end
|
95
|
+
|
96
|
+
def property_method_name
|
97
|
+
(self.id.to_method_name+'_property').to_sym
|
98
|
+
end
|
99
|
+
|
100
|
+
def value_for(object)
|
101
|
+
case self.value
|
102
|
+
when Proc
|
103
|
+
self.value.call(object)
|
104
|
+
else
|
105
|
+
self.value
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
end
|
110
|
+
|
111
|
+
class InheritedDecorator < SimpleDelegator
|
112
|
+
|
113
|
+
def inherited
|
114
|
+
true
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
end
|