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,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,18 @@
1
+ module CmisServer
2
+ class Id < String
3
+
4
+ def path_sanitize
5
+ self.gsub(/[^a-z0-9_-]/i, '_')
6
+ end
7
+
8
+ def to_method_name
9
+ self.gsub(/[^0-9a-z]/i, '_').underscore
10
+ end
11
+
12
+ end
13
+
14
+ class Boolean
15
+
16
+ end
17
+
18
+ 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,7 @@
1
+ module CmisServer
2
+ class ItemType < Type
3
+ def base_id
4
+ 'cmis:item'
5
+ end
6
+ end
7
+ 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