cmis 0.1.0-java
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.
- data/.gitignore +21 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +212 -0
- data/Rakefile +6 -0
- data/cmis.gemspec +20 -0
- data/lib/cmis/version.rb +3 -0
- data/lib/cmis.rb +115 -0
- data/pom.xml +19 -0
- data/samples.rb +112 -0
- data/spec/cmis_spec.rb +274 -0
- data/spec/fixtures/document.pdf +0 -0
- data/spec/fixtures/text_file.txt +1 -0
- data/spec/fixtures/text_file2.txt +1 -0
- data/spec/spec_helper.rb +31 -0
- data/target/dependency/activation-1.1.jar +0 -0
- data/target/dependency/chemistry-opencmis-client-api-0.8.0.jar +0 -0
- data/target/dependency/chemistry-opencmis-client-bindings-0.8.0.jar +0 -0
- data/target/dependency/chemistry-opencmis-client-impl-0.8.0.jar +0 -0
- data/target/dependency/chemistry-opencmis-commons-api-0.8.0.jar +0 -0
- data/target/dependency/chemistry-opencmis-commons-impl-0.8.0.jar +0 -0
- data/target/dependency/jaxb-api-2.1.jar +0 -0
- data/target/dependency/jaxb-impl-2.1.11.jar +0 -0
- data/target/dependency/jaxws-api-2.1.jar +0 -0
- data/target/dependency/jaxws-rt-2.1.7.jar +0 -0
- data/target/dependency/junit-3.8.jar +0 -0
- data/target/dependency/mimepull-1.3.jar +0 -0
- data/target/dependency/org.osgi.core-1.0.0.jar +0 -0
- data/target/dependency/resolver-20050927.jar +0 -0
- data/target/dependency/saaj-api-1.3.jar +0 -0
- data/target/dependency/saaj-impl-1.3.3.jar +0 -0
- data/target/dependency/slf4j-api-1.6.6.jar +0 -0
- data/target/dependency/stax-api-1.0-2.jar +0 -0
- data/target/dependency/stax-ex-1.2.jar +0 -0
- data/target/dependency/streambuffer-0.9.jar +0 -0
- data/target/dependency/wstx-asl-3.2.3.jar +0 -0
- metadata +107 -0
data/.gitignore
ADDED
data/.rspec
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2013 Richard Nyström
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
# CMIS
|
2
|
+
|
3
|
+
CMIS client for JRuby. This gem uses the Apache Chemistry OpenCMIS Java libraries under the hood.
|
4
|
+
|
5
|
+
More information about Apache Chemistry can be found here: http://chemistry.apache.org/
|
6
|
+
|
7
|
+
## What is CMIS
|
8
|
+
|
9
|
+
Content Management Interoperability Services (CMIS) is an open standard that defines an abstraction layer for controlling diverse document management systems and repositories using web protocols. CMIS defines a domain model plus Web Services and Restful AtomPub (RFC5023) bindings that can be used by applications.
|
10
|
+
|
11
|
+
Here are a few CMIS-compliant content repositories:
|
12
|
+
|
13
|
+
* [Alfresco](http://www.alfresco.com)
|
14
|
+
* [Nuxeo](http://www.nuxeo.com)
|
15
|
+
* [EMC Documentum](http://www.emc.com/domains/documentum/index.htm)
|
16
|
+
* [Sharepoint](http://sharepoint.microsoft.com/en-us/Pages/default.aspx)
|
17
|
+
* [IBM FileNet Content Manager](http://www-01.ibm.com/software/data/content-management/filenet-content-manager/)
|
18
|
+
* [KnowledgeTree](https://www.knowledgetree.com/)
|
19
|
+
|
20
|
+
## Installation
|
21
|
+
|
22
|
+
Add this line to your application's Gemfile:
|
23
|
+
|
24
|
+
gem 'cmis'
|
25
|
+
|
26
|
+
And then execute:
|
27
|
+
|
28
|
+
$ bundle
|
29
|
+
|
30
|
+
Or install it yourself as:
|
31
|
+
|
32
|
+
$ gem install cmis
|
33
|
+
|
34
|
+
## Usage
|
35
|
+
|
36
|
+
This guide is for JRuby developers who want to access CMIS-compliant content repositories from JRuby. The examples has been tested with Alfresco Community Edition 4.2.c which is one of the most feature complete CMIS content repository.
|
37
|
+
|
38
|
+
If you want to run the code snippets below you can download and install Alfresco. You can find the version that fits your platform here: http://wiki.alfresco.com/wiki/Download_and_Install_Alfresco
|
39
|
+
|
40
|
+
You can also run the examples using the Public Alfresco CMIS server. More information can be found here: http://cmis.alfresco.com. The atom url for the public
|
41
|
+
server is http://cmis.alfresco.com/cmisatom.
|
42
|
+
|
43
|
+
Nuxeo also provides a demo server. More information can be found here: http://doc.nuxeo.com/display/NXDOC/CMIS+for+Nuxeo#CMISforNuxeo-Onlinedemo .
|
44
|
+
|
45
|
+
## Connecting to a CMIS repository
|
46
|
+
|
47
|
+
To be able to do anything useful on a CMIS repository, you must first find a repository, and create a session with it:
|
48
|
+
|
49
|
+
```ruby
|
50
|
+
require 'cmis'
|
51
|
+
atom_url = "http://localhost:8080/alfresco/service/cmis"
|
52
|
+
user = "admin"
|
53
|
+
password = "admin"
|
54
|
+
@session = CMIS::create_session(atom_url, user, password)
|
55
|
+
|
56
|
+
```
|
57
|
+
Most CMIS servers only provides one repository by default that you can connect to and the code above automatically connects to the first repository that it finds.
|
58
|
+
If you want to connect to a specific repository you can do it like this:
|
59
|
+
|
60
|
+
```ruby
|
61
|
+
available_repos = CMIS::repositories(atom_url, user, password)
|
62
|
+
puts "Trying to connect to a repository with id #{available_repos[0].id}"
|
63
|
+
@session = CMIS::create_session(atom_url, user, password, available_repos[0].id)
|
64
|
+
|
65
|
+
```
|
66
|
+
|
67
|
+
## Working with folders and documents
|
68
|
+
|
69
|
+
Finding the contents of the root folder:
|
70
|
+
|
71
|
+
```ruby
|
72
|
+
root = @session.root_folder
|
73
|
+
children = root.children
|
74
|
+
|
75
|
+
# Prints out all children objects name found in the root folder
|
76
|
+
children.each do |o|
|
77
|
+
puts o.name
|
78
|
+
end
|
79
|
+
```
|
80
|
+
|
81
|
+
### Creating folders
|
82
|
+
|
83
|
+
Create a folder the simple way. The create_cmis_folder method is a convenient method implemented in the JRuby CMIS library.
|
84
|
+
|
85
|
+
```ruby
|
86
|
+
root.create_cmis_folder("My new folder")
|
87
|
+
```
|
88
|
+
|
89
|
+
Create a folder the hard way:
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
folder_props = { CMIS::PropertyIds::OBJECT_TYPE_ID => "cmis:folder", CMIS::PropertyIds::NAME => "Another folder" }
|
93
|
+
root.create_folder(folder_props)
|
94
|
+
```
|
95
|
+
|
96
|
+
### Creating/Uploading documents
|
97
|
+
|
98
|
+
The create_cmis_document method is a convenient method implemented in the JRuby CMIS Library.
|
99
|
+
This method takes a name and a file path and uploads the file to the repository. The document will be saved as a major version.
|
100
|
+
|
101
|
+
```ruby
|
102
|
+
id = root.create_cmis_document("cmis_logo.png", "/Users/ricn/cmis_logo.png")
|
103
|
+
doc = @session.get_object(id)
|
104
|
+
puts doc.name
|
105
|
+
```
|
106
|
+
|
107
|
+
#### Create a document the hard way (but with more flexibility)
|
108
|
+
|
109
|
+
```ruby
|
110
|
+
content_stream = CMIS::create_content_stream("/Users/ricn/cmis_logo.png", @session)
|
111
|
+
props = { CMIS::PropertyIds::OBJECT_TYPE_ID => "cmis:document", CMIS::PropertyIds::NAME => "cmis_logo.png" }
|
112
|
+
id = root.create_document(props, content_stream, CMIS::VersioningState::MAJOR)
|
113
|
+
doc = @session.get_object(id)
|
114
|
+
```
|
115
|
+
|
116
|
+
#### Download a document to your local disk
|
117
|
+
|
118
|
+
```ruby
|
119
|
+
doc = @session.get_object(id)
|
120
|
+
file = "/Users/ricn/" + doc.name
|
121
|
+
doc.download(file)
|
122
|
+
```
|
123
|
+
|
124
|
+
### Updating a document
|
125
|
+
|
126
|
+
```ruby
|
127
|
+
id = root.create_cmis_document("cmis_logo_original.png", "/Users/ricn/cmis_logo.png")
|
128
|
+
doc = @session.get_object(id)
|
129
|
+
puts "Original name: #{doc.name}"
|
130
|
+
props = { CMIS::PropertyIds::NAME => "cmis_logo_renamed.png"}
|
131
|
+
id = doc.update_properties(props)
|
132
|
+
doc = @session.get_object(id)
|
133
|
+
puts "New name: #{doc.name}"
|
134
|
+
```
|
135
|
+
|
136
|
+
### Deleting a document
|
137
|
+
|
138
|
+
```ruby
|
139
|
+
doc = @session.get_object(id)
|
140
|
+
doc.delete # Yay, that was easy!
|
141
|
+
```
|
142
|
+
|
143
|
+
### Deleting a folder tree
|
144
|
+
|
145
|
+
```ruby
|
146
|
+
# First we need to create a folder tree
|
147
|
+
folder1 = root.create_cmis_folder("folder1")
|
148
|
+
folder11 = folder1.create_cmis_folder("Folder11")
|
149
|
+
folder12 = folder1.create_cmis_folder("Folder12")
|
150
|
+
# Delete it
|
151
|
+
folder1.delete_tree(true, CMIS::UnfileObject::DELETE, true) # parameter explanation: boolean allversions, UnfileObject unfile, boolean continueOnFailure
|
152
|
+
```
|
153
|
+
|
154
|
+
## Working with CMIS Properties
|
155
|
+
|
156
|
+
```ruby
|
157
|
+
### Displaying the properties of an object
|
158
|
+
props = @session.root_folder.properties
|
159
|
+
props.each do |p|
|
160
|
+
display_name = p.definition.display_name
|
161
|
+
value = p.value_as_string
|
162
|
+
if display_name != nil && value != nil
|
163
|
+
puts p.definition.display_name + ": " + p.value_as_string
|
164
|
+
end
|
165
|
+
end
|
166
|
+
```
|
167
|
+
|
168
|
+
### Getting a property explicitly
|
169
|
+
|
170
|
+
Each object type has a known set of properties, and you can retrieve these explicitly. For example, the document type has a set of properties described by the [DocumentProperties](http://chemistry.apache.org/java/0.8.0/maven/apidocs/org/apache/chemistry/opencmis/client/api/DocumentProperties.html) interface, and you can use the methods on this interface to retrieve the value a property.
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
# For root folder
|
174
|
+
puts "Is root folder? " + root.is_root_folder.to_s
|
175
|
+
puts "Path: " + root.path
|
176
|
+
|
177
|
+
# For a document
|
178
|
+
id = root.create_cmis_document("cmis.png", "/Users/ricn/cmis_logo.png")
|
179
|
+
doc = @session.get_object(id)
|
180
|
+
puts "Name: " + doc.name
|
181
|
+
puts "Version label: " + doc.version_label
|
182
|
+
puts "Content stream file name: " + doc.content_stream_file_name
|
183
|
+
puts "Content stream mime type: " + doc.content_stream_mime_type
|
184
|
+
```
|
185
|
+
|
186
|
+
## Working with CMIS Queries
|
187
|
+
|
188
|
+
```ruby
|
189
|
+
query = "SELECT * FROM cmis:document WHERE cmis:name LIKE 'cmis%'"
|
190
|
+
q = @session.query(query, false) # true means search all versions
|
191
|
+
|
192
|
+
q.each do |result|
|
193
|
+
puts result.property_value_by_query_name("cmis:name")
|
194
|
+
end
|
195
|
+
```
|
196
|
+
|
197
|
+
## DOCUMENTION TODO:
|
198
|
+
* Add Multi-filing and Unfiling examples
|
199
|
+
* Add Relationships examples
|
200
|
+
* Add Access control examples
|
201
|
+
* Add OperationContext examples
|
202
|
+
* Add Advanced types usage examples
|
203
|
+
* Add Performance notes
|
204
|
+
* Add Troubleshooting notes
|
205
|
+
|
206
|
+
## Contributing
|
207
|
+
|
208
|
+
1. Fork it
|
209
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
210
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
211
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
212
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/cmis.gemspec
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'cmis/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "cmis"
|
8
|
+
gem.version = Cmis::VERSION
|
9
|
+
gem.authors = ["Richard Nyström"]
|
10
|
+
gem.email = ["ricny046@gmail.com"]
|
11
|
+
gem.description = %q{A thin JRuby wrapper for the Apache Chemistry OpenCMIS client.}
|
12
|
+
gem.summary = %q{A thin JRuby wrapper for the Apache Chemistry OpenCMIS client.}
|
13
|
+
gem.homepage = "https://github.com/ricn/cmis"
|
14
|
+
gem.files = `git ls-files`.split($/)
|
15
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
16
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
17
|
+
gem.require_paths = ["lib"]
|
18
|
+
gem.add_development_dependency "rspec"
|
19
|
+
gem.platform = "java"
|
20
|
+
end
|
data/lib/cmis/version.rb
ADDED
data/lib/cmis.rb
ADDED
@@ -0,0 +1,115 @@
|
|
1
|
+
raise "You need to run JRuby to use CMIS" unless RUBY_PLATFORM =~ /java/
|
2
|
+
|
3
|
+
require "cmis/version"
|
4
|
+
require 'java'
|
5
|
+
|
6
|
+
Dir[File.join(File.dirname(__FILE__), "../target/dependency/*.jar")].each do |jar|
|
7
|
+
require jar
|
8
|
+
end
|
9
|
+
|
10
|
+
module CMIS
|
11
|
+
import org.apache.chemistry.opencmis.client.api.Session
|
12
|
+
import org.apache.chemistry.opencmis.client.api.SessionFactory
|
13
|
+
import org.apache.chemistry.opencmis.client.api.OperationContext
|
14
|
+
import org.apache.chemistry.opencmis.client.util.FileUtils
|
15
|
+
import org.apache.chemistry.opencmis.client.runtime.OperationContextImpl
|
16
|
+
import org.apache.chemistry.opencmis.client.runtime.SessionFactoryImpl
|
17
|
+
import org.apache.chemistry.opencmis.commons.SessionParameter
|
18
|
+
import org.apache.chemistry.opencmis.commons.PropertyIds
|
19
|
+
import org.apache.chemistry.opencmis.commons.impl.MimeTypes
|
20
|
+
|
21
|
+
import org.apache.chemistry.opencmis.commons.enums.Action
|
22
|
+
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId
|
23
|
+
import org.apache.chemistry.opencmis.commons.enums.CapabilityAcl
|
24
|
+
import org.apache.chemistry.opencmis.commons.enums.VersioningState
|
25
|
+
import org.apache.chemistry.opencmis.commons.enums.UnfileObject
|
26
|
+
import org.apache.chemistry.opencmis.commons.enums.BindingType
|
27
|
+
import org.apache.chemistry.opencmis.commons.enums.CapabilityChanges
|
28
|
+
import org.apache.chemistry.opencmis.commons.enums.CapabilityContentStreamUpdates
|
29
|
+
import org.apache.chemistry.opencmis.commons.enums.CapabilityJoin
|
30
|
+
import org.apache.chemistry.opencmis.commons.enums.CapabilityQuery
|
31
|
+
import org.apache.chemistry.opencmis.commons.enums.CapabilityRenditions
|
32
|
+
import org.apache.chemistry.opencmis.commons.enums.Cardinality
|
33
|
+
import org.apache.chemistry.opencmis.commons.enums.ChangeType
|
34
|
+
import org.apache.chemistry.opencmis.commons.enums.ContentStreamAllowed
|
35
|
+
import org.apache.chemistry.opencmis.commons.enums.DateTimeResolution
|
36
|
+
import org.apache.chemistry.opencmis.commons.enums.DecimalPrecision
|
37
|
+
import org.apache.chemistry.opencmis.commons.enums.ExtensionLevel
|
38
|
+
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships
|
39
|
+
import org.apache.chemistry.opencmis.commons.enums.PropertyType
|
40
|
+
import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection
|
41
|
+
import org.apache.chemistry.opencmis.commons.enums.SupportedPermissions
|
42
|
+
import org.apache.chemistry.opencmis.commons.enums.UnfileObject
|
43
|
+
import org.apache.chemistry.opencmis.commons.enums.Updatability
|
44
|
+
|
45
|
+
FolderImpl = org.apache.chemistry.opencmis.client.runtime.FolderImpl
|
46
|
+
DocumentImpl = org.apache.chemistry.opencmis.client.runtime.DocumentImpl
|
47
|
+
|
48
|
+
class DocumentImpl
|
49
|
+
def download(destination_path)
|
50
|
+
FileUtils.download(self, destination_path)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
class FolderImpl
|
55
|
+
def create_cmis_folder(name, props = nil)
|
56
|
+
folder_props = { PropertyIds::OBJECT_TYPE_ID => "cmis:folder", PropertyIds::NAME => name }
|
57
|
+
folder_props.merge!(props) if props != nil && props.is_a?(Hash)
|
58
|
+
self.create_folder(java.util.HashMap.new(folder_props))
|
59
|
+
end
|
60
|
+
|
61
|
+
def create_cmis_document(name, filename, props = nil)
|
62
|
+
if filename != nil && filename.length > 0
|
63
|
+
file = java.io.File.new(filename)
|
64
|
+
stream = java.io.BufferedInputStream.new(java.io.FileInputStream.new(file))
|
65
|
+
content = session.object_factory.create_content_stream(file.name, file.length, CMIS::MimeTypes.getMIMEType(file), stream)
|
66
|
+
doc_props = { CMIS::PropertyIds::OBJECT_TYPE_ID => "cmis:document", CMIS::PropertyIds::NAME => name }
|
67
|
+
doc_props.merge!(props) if props != nil && props.is_a?(Hash)
|
68
|
+
self.create_document(doc_props, content, CMIS::VersioningState::MAJOR)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def create_text_doc(name, content)
|
73
|
+
FileUtils.create_text_document(self.id, name, content, "cmis:document", CMIS::VersioningState::MAJOR, session)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def self.create_session(url, user, password, repo_id = nil)
|
78
|
+
session_factory = SessionFactoryImpl.new_instance
|
79
|
+
repo_id = self.repositories(url, user, password)[0].id if repo_id == nil
|
80
|
+
|
81
|
+
parameters = {
|
82
|
+
SessionParameter::ATOMPUB_URL => url,
|
83
|
+
SessionParameter::BINDING_TYPE => BindingType::ATOMPUB.value,
|
84
|
+
SessionParameter::USER => user,
|
85
|
+
SessionParameter::PASSWORD => password,
|
86
|
+
SessionParameter::REPOSITORY_ID => repo_id
|
87
|
+
}
|
88
|
+
|
89
|
+
session_factory.create_session(parameters)
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.repositories(url, user, password)
|
93
|
+
session_factory = SessionFactoryImpl.new_instance
|
94
|
+
parameters = {
|
95
|
+
SessionParameter::ATOMPUB_URL => url,
|
96
|
+
SessionParameter::BINDING_TYPE => BindingType::ATOMPUB.value,
|
97
|
+
SessionParameter::USER => user,
|
98
|
+
SessionParameter::PASSWORD => password
|
99
|
+
}
|
100
|
+
|
101
|
+
session_factory.get_repositories(parameters)
|
102
|
+
end
|
103
|
+
|
104
|
+
def self.create_content_stream(filename, session)
|
105
|
+
content = nil
|
106
|
+
|
107
|
+
if filename != nil && filename.length > 0
|
108
|
+
file = java.io.File.new(filename)
|
109
|
+
stream = java.io.BufferedInputStream.new(java.io.FileInputStream.new(file))
|
110
|
+
content = session.object_factory.create_content_stream(file.name, file.length, CMIS::MimeTypes.getMIMEType(file), stream)
|
111
|
+
end
|
112
|
+
|
113
|
+
content
|
114
|
+
end
|
115
|
+
end
|
data/pom.xml
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
2
|
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
3
|
+
<modelVersion>4.0.0</modelVersion>
|
4
|
+
|
5
|
+
<name>CMIS</name>
|
6
|
+
|
7
|
+
<groupId>org.cmis</groupId>
|
8
|
+
<artifactId>CMIS</artifactId>
|
9
|
+
<version>1.0-SNAPSHOT</version>
|
10
|
+
<packaging>jar</packaging>
|
11
|
+
|
12
|
+
<dependencies>
|
13
|
+
<dependency>
|
14
|
+
<groupId>org.apache.chemistry.opencmis</groupId>
|
15
|
+
<artifactId>chemistry-opencmis-client-impl</artifactId>
|
16
|
+
<version>0.8.0</version>
|
17
|
+
</dependency>
|
18
|
+
</dependencies>
|
19
|
+
</project>
|
data/samples.rb
ADDED
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'cmis'
|
2
|
+
|
3
|
+
## Connecting to a CMIS repository (the simple way)
|
4
|
+
# To be able to do anything useful on a CMIS repository, you must first find a repository, and create a session with it:
|
5
|
+
|
6
|
+
atom_url = "http://localhost:8181/alfresco/service/cmis"
|
7
|
+
user = "admin"
|
8
|
+
password = "admin"
|
9
|
+
@session = CMIS::create_session(atom_url, user, password)
|
10
|
+
|
11
|
+
# Most CMIS servers only provides one repository by default that you can connect to and the code above automatically connects to the first repository that it finds.
|
12
|
+
# If you want to connect to a specific repository you can do it like this:
|
13
|
+
|
14
|
+
available_repos = CMIS::repositories(atom_url, user, password)
|
15
|
+
puts "Trying to connect to repository with id #{available_repos[0].id}"
|
16
|
+
@session = CMIS::create_session(atom_url, user, password, available_repos[0].id)
|
17
|
+
|
18
|
+
## Working with folders and documents
|
19
|
+
|
20
|
+
### Finding the contents of the root folder
|
21
|
+
|
22
|
+
root = @session.root_folder
|
23
|
+
children = root.children
|
24
|
+
|
25
|
+
children.each do |o|
|
26
|
+
puts o.name # Prints out all children objects found in the root folder
|
27
|
+
end
|
28
|
+
|
29
|
+
### Creating folders
|
30
|
+
|
31
|
+
# Create a folder the simple way. This is a convenient method implemented in the JRuby CMIS library.
|
32
|
+
root.create_cmis_folder("My new folder")
|
33
|
+
|
34
|
+
# Create a folder the hard way:
|
35
|
+
folder_props = { CMIS::PropertyIds::OBJECT_TYPE_ID => "cmis:folder", CMIS::PropertyIds::NAME => "Another folder" }
|
36
|
+
root.create_folder(folder_props)
|
37
|
+
|
38
|
+
## Creating/Uploading documents
|
39
|
+
|
40
|
+
### Create a document object the simple way. This is a convenient method implemented in the JRuby CMIS Library.
|
41
|
+
|
42
|
+
# This method takes a name and a file path and uploads the file to the repository. The document will be saved as a major version.
|
43
|
+
id = root.create_cmis_document("cmis_logo.png", "/Users/ricn/cmis_logo.png")
|
44
|
+
doc = @session.get_object(id)
|
45
|
+
puts doc.name
|
46
|
+
|
47
|
+
### Create a document object the hard way:
|
48
|
+
# TODO
|
49
|
+
|
50
|
+
### Download a document to your local disk:
|
51
|
+
# TODO
|
52
|
+
|
53
|
+
### Updating a document
|
54
|
+
id = root.create_cmis_document("cmis_logo_original.png", "/Users/ricn/cmis_logo.png")
|
55
|
+
doc = @session.get_object(id)
|
56
|
+
puts "Original name: #{doc.name}"
|
57
|
+
props = { CMIS::PropertyIds::NAME => "cmis_logo_renamed.png"}
|
58
|
+
id = doc.update_properties(props)
|
59
|
+
doc = @session.get_object(id)
|
60
|
+
puts "New name: #{doc.name}"
|
61
|
+
|
62
|
+
### Deleting a document
|
63
|
+
doc = @session.get_object(id)
|
64
|
+
doc.delete # Yay, that was easy!
|
65
|
+
|
66
|
+
### Deleting a folder tree
|
67
|
+
|
68
|
+
# First we need to create a folder tree
|
69
|
+
folder1 = root.create_cmis_folder("folder1")
|
70
|
+
folder11 = folder1.create_cmis_folder("Folder11")
|
71
|
+
folder12 = folder1.create_cmis_folder("Folder12")
|
72
|
+
# Delete it
|
73
|
+
folder1.delete_tree(true, CMIS::UnfileObject::DELETE, true) # parameter explanation: boolean allversions, UnfileObject unfile, boolean continueOnFailure
|
74
|
+
|
75
|
+
## CMIS Properties
|
76
|
+
|
77
|
+
### Displaying the properties of an Object
|
78
|
+
props = @session.root_folder.properties
|
79
|
+
props.each do |p|
|
80
|
+
display_name = p.definition.display_name
|
81
|
+
value = p.value_as_string
|
82
|
+
if display_name != nil && value != nil
|
83
|
+
puts p.definition.display_name + ": " + p.value_as_string
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
### Getting a property explicitly
|
88
|
+
# Each object type has a known set of properties, and you can retrieve these explicitly.
|
89
|
+
# For example, the document type has a set of properties described by the DocumentProperties
|
90
|
+
# (http://chemistry.apache.org/java/0.8.0/maven/apidocs/org/apache/chemistry/opencmis/client/api/DocumentProperties.html) interface,
|
91
|
+
# and you can use the methods on this interface to retrieve the value a property
|
92
|
+
|
93
|
+
# For root folder
|
94
|
+
puts "Is root folder? " + root.is_root_folder.to_s
|
95
|
+
puts "Path: " + root.path
|
96
|
+
|
97
|
+
# For a document
|
98
|
+
id = root.create_cmis_document("cmis_logo_original.png", "/Users/ricn/cmis_logo.png")
|
99
|
+
doc = @session.get_object(id)
|
100
|
+
puts "Name: " + doc.name
|
101
|
+
puts "Version label: " + doc.version_label
|
102
|
+
puts "Content stream file name: " + doc.content_stream_file_name
|
103
|
+
puts "Content stream mime type: " + doc.content_stream_mime_type
|
104
|
+
|
105
|
+
## Working with CMIS Queries. NOT WORKING :-(
|
106
|
+
|
107
|
+
query = "SELECT * FROM cmis:document WHERE cmis:name LIKE 'cmis%'"
|
108
|
+
q = @session.query(query, false) # true means search all versions
|
109
|
+
|
110
|
+
q.each do |result|
|
111
|
+
puts result.property_value_by_query_name("cmis:name").inspect
|
112
|
+
end
|
data/spec/cmis_spec.rb
ADDED
@@ -0,0 +1,274 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe "CMIS" do
|
4
|
+
shared_examples_for "a CMIS repository" do |atom_url, user, password|
|
5
|
+
|
6
|
+
before(:all) do
|
7
|
+
@atom_url = atom_url
|
8
|
+
@user = user
|
9
|
+
@password = password
|
10
|
+
@repos = CMIS::repositories(@atom_url, @user, @password)
|
11
|
+
@session = CMIS::create_session(@atom_url, @user, @password, @repos[0].id)
|
12
|
+
@test_folder_name = "JRUBY_CMIS_TEST_" + random_name
|
13
|
+
@test_folder = @session.root_folder.create_cmis_folder(@test_folder_name)
|
14
|
+
end
|
15
|
+
|
16
|
+
after(:all) do
|
17
|
+
@test_folder.delete_tree(true, CMIS::UnfileObject::DELETE, true)
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "Repository functionality" do
|
21
|
+
it "should create a session" do
|
22
|
+
@session.is_a?(Java::OrgApacheChemistryOpencmisClientRuntime::SessionImpl).should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should create a session against the first repository" do
|
26
|
+
@simple_session = CMIS::create_session(@atom_url, @user, @password)
|
27
|
+
@simple_session.is_a?(Java::OrgApacheChemistryOpencmisClientRuntime::SessionImpl).should be_true
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should retrieve all available repositories" do
|
31
|
+
@repos.is_a?(Java::JavaUtil::ArrayList).should be_true
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should have one repository with a name" do
|
35
|
+
repo = @repos[0]
|
36
|
+
repo.name.should_not be_empty
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should be possible to read the repository info" do
|
40
|
+
rep_info = @session.repository_info
|
41
|
+
cap = rep_info.capabilities
|
42
|
+
|
43
|
+
# Just testing a few of them
|
44
|
+
cap.is_get_descendants_supported.should == true
|
45
|
+
cap.is_get_folder_tree_supported.should == true
|
46
|
+
cap.changes_capability.value.should_not be_empty
|
47
|
+
cap.query_capability.value.should_not be_empty
|
48
|
+
cap.join_capability.value.should_not == be_empty
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
describe "Reading objects" do
|
53
|
+
it "should be possible to find the contents of the root folder" do
|
54
|
+
root = @session.root_folder
|
55
|
+
children = root.children
|
56
|
+
children.map(&:name).should include(@test_folder_name)
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should display the properties of an object" do
|
60
|
+
props = @session.root_folder.properties
|
61
|
+
props.each do |p|
|
62
|
+
disp_name = p.definition.display_name
|
63
|
+
p.value_as_string.should == "/" if disp_name == "Path"
|
64
|
+
p.value_as_string.should == "cmis:folder" if disp_name == "Type-Id"
|
65
|
+
p.value_as_string.should_not be_nil if disp_name == "Name"
|
66
|
+
p.value_as_string.should be_nil if disp_name == "Parent Id"
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it "should be possible to get a property explicitly" do
|
71
|
+
# A couple of folder specific props that we can access explicitly
|
72
|
+
root = @session.root_folder
|
73
|
+
root.is_root_folder.should == true
|
74
|
+
root.path.should == "/"
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should retrieve allowable actions for an object" do
|
78
|
+
allowed_actions = @session.root_folder.allowable_actions.allowable_actions # Are you kidding me!!?
|
79
|
+
allowed_actions.to_a.should include(CMIS::Action::CAN_GET_PROPERTIES)
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should be possible to check if a document is versionable" do
|
83
|
+
doc = create_random_doc(@test_folder)
|
84
|
+
doc.type.is_versionable.should == true
|
85
|
+
end
|
86
|
+
|
87
|
+
it "should be possible to access information about renditions" do
|
88
|
+
file = file_path("document.pdf")
|
89
|
+
file_name = random_name + ".pdf"
|
90
|
+
id = @test_folder.create_cmis_document(file_name, file)
|
91
|
+
context = @session.create_operation_context
|
92
|
+
context.rendition_filter_string = "cmis:thumbnail"
|
93
|
+
@session.clear
|
94
|
+
doc = @session.get_object(id, context)
|
95
|
+
|
96
|
+
renditions = doc.renditions
|
97
|
+
# TODO: Fix this test.
|
98
|
+
#renditions.size.should >= 1
|
99
|
+
renditions.each do |r|
|
100
|
+
r.kind.should_not be_empty
|
101
|
+
r.mime_type.should_not be_empty
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
it "should be possible to download document" do
|
106
|
+
doc = create_random_doc(@test_folder)
|
107
|
+
file = Dir.tmpdir + doc.name
|
108
|
+
doc.download(file)
|
109
|
+
File.exists?(file).should == true
|
110
|
+
File.delete(file)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "Writing objects" do
|
115
|
+
it "should create a folder" do
|
116
|
+
name = random_name
|
117
|
+
new_folder_props = { CMIS::PropertyIds::OBJECT_TYPE_ID => "cmis:folder", CMIS::PropertyIds::NAME => name }
|
118
|
+
@test_folder.create_folder(new_folder_props)
|
119
|
+
@test_folder.children.map(&:name).should include(name)
|
120
|
+
end
|
121
|
+
|
122
|
+
it "should create a folder using convenient method" do
|
123
|
+
name = random_name
|
124
|
+
@test_folder.create_cmis_folder(name)
|
125
|
+
@test_folder.children.map(&:name).should include(name)
|
126
|
+
end
|
127
|
+
|
128
|
+
it "should create document" do
|
129
|
+
content_stream = CMIS::create_content_stream(file_path("text_file.txt"), @session)
|
130
|
+
text_file = random_name + ".txt"
|
131
|
+
props = { CMIS::PropertyIds::OBJECT_TYPE_ID => "cmis:document", CMIS::PropertyIds::NAME => text_file }
|
132
|
+
id = @test_folder.create_document(props, content_stream, CMIS::VersioningState::MAJOR)
|
133
|
+
doc = @session.get_object(id)
|
134
|
+
|
135
|
+
doc.properties.each do |p|
|
136
|
+
p.value.should == 16 if p.definition.id == "cmis:contentStreamLength"
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
it "should create document using convenient method" do
|
141
|
+
file = file_path("text_file.txt")
|
142
|
+
file_name = random_name + ".txt"
|
143
|
+
id = @test_folder.create_cmis_document(file_name, file)
|
144
|
+
doc = @session.get_object(id)
|
145
|
+
|
146
|
+
doc.properties.each do |p|
|
147
|
+
p.value.should == 16 if p.definition.id == "cmis:contentStreamLength"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
it "should create document by specifying a string as content" do
|
152
|
+
content = "Please, save me!"
|
153
|
+
file_name = random_name + ".txt"
|
154
|
+
id = @test_folder.create_text_doc(file_name, content)
|
155
|
+
doc = @session.get_object(id)
|
156
|
+
|
157
|
+
doc.properties.each do |p|
|
158
|
+
p.value.should == content.size if p.definition.id == "cmis:contentStreamLength"
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
162
|
+
|
163
|
+
describe "Updating objects" do
|
164
|
+
it "should rename a document" do
|
165
|
+
doc = create_random_doc(@test_folder)
|
166
|
+
renamed_file_name = "renamed_" + doc.name
|
167
|
+
props = { CMIS::PropertyIds::OBJECT_TYPE_ID => "cmis:document",
|
168
|
+
CMIS::PropertyIds::NAME => renamed_file_name }
|
169
|
+
doc.update_properties(props)
|
170
|
+
|
171
|
+
doc.name.should == renamed_file_name
|
172
|
+
end
|
173
|
+
|
174
|
+
it "should update the content of a document (versioning)" do
|
175
|
+
doc = create_random_doc(@test_folder)
|
176
|
+
|
177
|
+
content_stream = CMIS::create_content_stream(file_path("text_file2.txt"), @session)
|
178
|
+
working_copy = @session.get_object(doc.check_out)
|
179
|
+
id = working_copy.check_in(false, nil, content_stream, "minor version")
|
180
|
+
doc = @session.get_object(id)
|
181
|
+
|
182
|
+
doc.properties.each do |p|
|
183
|
+
p.value.should == 17 if p.definition.id == "cmis:contentStreamLength"
|
184
|
+
p.value.should == "1.1" if p.definition.id == "cmis:versionLabel"
|
185
|
+
end
|
186
|
+
|
187
|
+
versions = doc.all_versions
|
188
|
+
versions.size.should == 2
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
describe "Deleting objects" do
|
193
|
+
it "should delete a document" do
|
194
|
+
content_stream = CMIS::create_content_stream(file_path("text_file.txt"), @session)
|
195
|
+
text_file = random_name + ".txt"
|
196
|
+
props = { CMIS::PropertyIds::OBJECT_TYPE_ID => "cmis:document",
|
197
|
+
CMIS::PropertyIds::NAME => text_file }
|
198
|
+
id = @test_folder.create_document(props, content_stream, CMIS::VersioningState::MAJOR)
|
199
|
+
|
200
|
+
doc = @session.get_object(id)
|
201
|
+
|
202
|
+
doc.delete(true)
|
203
|
+
children = @test_folder.children
|
204
|
+
children.map(&:name).should_not include(text_file)
|
205
|
+
end
|
206
|
+
|
207
|
+
it "should delete a folder tree" do
|
208
|
+
root = @test_folder
|
209
|
+
random_folder_name = random_name
|
210
|
+
folder1 = root.create_cmis_folder(random_folder_name)
|
211
|
+
folder11 = folder1.create_cmis_folder("Folder11")
|
212
|
+
folder12 = folder1.create_cmis_folder("Folder12")
|
213
|
+
@test_folder.children.map(&:name).should include(random_folder_name)
|
214
|
+
folder1.delete_tree(true, CMIS::UnfileObject::DELETE, true)
|
215
|
+
@test_folder.children.map(&:name).should_not include(random_folder_name)
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
describe "Querying and navigating objects" do
|
220
|
+
it "should be possible to navigate through a folder tree" do
|
221
|
+
root = @session.root_folder
|
222
|
+
# just making sure it can be executed
|
223
|
+
root.descendants(-1).count.should > 0 # get folders and documents
|
224
|
+
root.folder_tree(-1).count.should > 0 # get folders only
|
225
|
+
end
|
226
|
+
|
227
|
+
it "should be possible to execute a simple query" do
|
228
|
+
query = "SELECT cmis:name FROM cmis:folder WHERE cmis:name = 'Company Home'"
|
229
|
+
q = @session.query(query, false)
|
230
|
+
|
231
|
+
q.each do |result|
|
232
|
+
result.get_property_value_by_query_name("cmis:name").should == "Company Home"
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should be possible to use paging" do
|
237
|
+
@sub_folder = @test_folder.create_cmis_folder("Paging")
|
238
|
+
|
239
|
+
5.times do
|
240
|
+
@sub_folder.create_cmis_folder(random_name)
|
241
|
+
end
|
242
|
+
|
243
|
+
oc = CMIS::OperationContextImpl.new
|
244
|
+
oc.max_items_per_page = 3
|
245
|
+
@sub_folder.children(oc).skip_to(0).page.map(&:name).size.should == 3
|
246
|
+
@sub_folder.children.map(&:name).size.should == 5
|
247
|
+
end
|
248
|
+
end
|
249
|
+
end
|
250
|
+
|
251
|
+
describe "Local Alfresco" do
|
252
|
+
atom_url = "http://localhost:8181/alfresco/service/cmis"
|
253
|
+
user = "admin"
|
254
|
+
password = "admin"
|
255
|
+
|
256
|
+
#it_behaves_like "a CMIS repository", atom_url, user, password
|
257
|
+
end
|
258
|
+
|
259
|
+
describe "Alfresco" do
|
260
|
+
atom_url = "http://cmis.alfresco.com/cmisatom"
|
261
|
+
user = "admin"
|
262
|
+
password = "admin"
|
263
|
+
|
264
|
+
it_behaves_like "a CMIS repository", atom_url, user, password
|
265
|
+
end
|
266
|
+
|
267
|
+
describe "Nuxeo" do
|
268
|
+
atom_url = "http://cmis.demo.nuxeo.org/nuxeo/atom/cmis"
|
269
|
+
user = "Administrator"
|
270
|
+
password = "Administrator"
|
271
|
+
|
272
|
+
it_behaves_like "a CMIS repository", atom_url, user, password
|
273
|
+
end
|
274
|
+
end
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
This is content.
|
@@ -0,0 +1 @@
|
|
1
|
+
This is content!!
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'cmis'
|
2
|
+
require 'tmpdir'
|
3
|
+
def file_path( *paths )
|
4
|
+
File.expand_path(File.join(File.dirname(__FILE__), 'fixtures', *paths))
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
def random_name
|
9
|
+
rand(16**16).to_s(16)
|
10
|
+
end
|
11
|
+
|
12
|
+
def create_random_doc(parent)
|
13
|
+
file = file_path("text_file.txt")
|
14
|
+
file_name = random_name + ".txt"
|
15
|
+
id = parent.create_cmis_document(file_name, file)
|
16
|
+
|
17
|
+
parent.session.get_object(id)
|
18
|
+
end
|
19
|
+
|
20
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
21
|
+
RSpec.configure do |config|
|
22
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
23
|
+
config.run_all_when_everything_filtered = true
|
24
|
+
config.filter_run :focus
|
25
|
+
|
26
|
+
# Run specs in random order to surface order dependencies. If you find an
|
27
|
+
# order dependency and want to debug it, you can fix the order by providing
|
28
|
+
# the seed, which is printed after each run.
|
29
|
+
# --seed 1234
|
30
|
+
config.order = 'random'
|
31
|
+
end
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cmis
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: java
|
7
|
+
authors:
|
8
|
+
- Richard Nyström
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
version_requirements: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - ! '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: !binary |-
|
21
|
+
MA==
|
22
|
+
none: false
|
23
|
+
requirement: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - ! '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: !binary |-
|
28
|
+
MA==
|
29
|
+
none: false
|
30
|
+
prerelease: false
|
31
|
+
type: :development
|
32
|
+
description: A thin JRuby wrapper for the Apache Chemistry OpenCMIS client.
|
33
|
+
email:
|
34
|
+
- ricny046@gmail.com
|
35
|
+
executables: []
|
36
|
+
extensions: []
|
37
|
+
extra_rdoc_files: []
|
38
|
+
files:
|
39
|
+
- .gitignore
|
40
|
+
- .rspec
|
41
|
+
- Gemfile
|
42
|
+
- LICENSE.txt
|
43
|
+
- README.md
|
44
|
+
- Rakefile
|
45
|
+
- cmis.gemspec
|
46
|
+
- lib/cmis.rb
|
47
|
+
- lib/cmis/version.rb
|
48
|
+
- pom.xml
|
49
|
+
- samples.rb
|
50
|
+
- spec/cmis_spec.rb
|
51
|
+
- spec/fixtures/document.pdf
|
52
|
+
- spec/fixtures/text_file.txt
|
53
|
+
- spec/fixtures/text_file2.txt
|
54
|
+
- spec/spec_helper.rb
|
55
|
+
- target/dependency/activation-1.1.jar
|
56
|
+
- target/dependency/chemistry-opencmis-client-api-0.8.0.jar
|
57
|
+
- target/dependency/chemistry-opencmis-client-bindings-0.8.0.jar
|
58
|
+
- target/dependency/chemistry-opencmis-client-impl-0.8.0.jar
|
59
|
+
- target/dependency/chemistry-opencmis-commons-api-0.8.0.jar
|
60
|
+
- target/dependency/chemistry-opencmis-commons-impl-0.8.0.jar
|
61
|
+
- target/dependency/jaxb-api-2.1.jar
|
62
|
+
- target/dependency/jaxb-impl-2.1.11.jar
|
63
|
+
- target/dependency/jaxws-api-2.1.jar
|
64
|
+
- target/dependency/jaxws-rt-2.1.7.jar
|
65
|
+
- target/dependency/junit-3.8.jar
|
66
|
+
- target/dependency/mimepull-1.3.jar
|
67
|
+
- target/dependency/org.osgi.core-1.0.0.jar
|
68
|
+
- target/dependency/resolver-20050927.jar
|
69
|
+
- target/dependency/saaj-api-1.3.jar
|
70
|
+
- target/dependency/saaj-impl-1.3.3.jar
|
71
|
+
- target/dependency/slf4j-api-1.6.6.jar
|
72
|
+
- target/dependency/stax-api-1.0-2.jar
|
73
|
+
- target/dependency/stax-ex-1.2.jar
|
74
|
+
- target/dependency/streambuffer-0.9.jar
|
75
|
+
- target/dependency/wstx-asl-3.2.3.jar
|
76
|
+
homepage: https://github.com/ricn/cmis
|
77
|
+
licenses: []
|
78
|
+
post_install_message:
|
79
|
+
rdoc_options: []
|
80
|
+
require_paths:
|
81
|
+
- lib
|
82
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
83
|
+
requirements:
|
84
|
+
- - ! '>='
|
85
|
+
- !ruby/object:Gem::Version
|
86
|
+
version: !binary |-
|
87
|
+
MA==
|
88
|
+
none: false
|
89
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: !binary |-
|
94
|
+
MA==
|
95
|
+
none: false
|
96
|
+
requirements: []
|
97
|
+
rubyforge_project:
|
98
|
+
rubygems_version: 1.8.24
|
99
|
+
signing_key:
|
100
|
+
specification_version: 3
|
101
|
+
summary: A thin JRuby wrapper for the Apache Chemistry OpenCMIS client.
|
102
|
+
test_files:
|
103
|
+
- spec/cmis_spec.rb
|
104
|
+
- spec/fixtures/document.pdf
|
105
|
+
- spec/fixtures/text_file.txt
|
106
|
+
- spec/fixtures/text_file2.txt
|
107
|
+
- spec/spec_helper.rb
|