blob: a78c5e4e4a3eda3b600fbc11e19d8b8cc877273d [file] [log] [blame]
<!DOCTYPE html>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="author" content="Apache Chemistry">
<link rel="shortcut icon" href="../../img/favicon.ico">
<title>Working with Content - Apache Chemistry Samples</title>
<link href="../../css/bootstrap-custom.min.css" rel="stylesheet">
<link href="//maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css" rel="stylesheet">
<link href="../../css/base.css" rel="stylesheet">
<link href="../../css/cinder.css" rel="stylesheet">
<link rel="stylesheet" href="../../css/highlight.css">
<link href="../../css/chemistry.css" rel="stylesheet">
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<!-- Collapsed navigation -->
<div class="navbar-header">
<!-- Expander button -->
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<!-- Main title -->
<a class="navbar-brand" href="../../index.html">Apache Chemistry Samples</a>
</div>
<!-- Expanded navigation -->
<div class="navbar-collapse collapse">
<!-- Main navigation -->
<ul class="nav navbar-nav">
<li >
<a href="../../index.html">Home</a>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Repository <b class="caret"></b></a>
<ul class="dropdown-menu">
<li >
<a href="../create-session/index.html">Creating a Session</a>
</li>
<li >
<a href="../capabilities/index.html">Getting Repository Capabilities</a>
</li>
<li >
<a href="../types/index.html">Working with Types</a>
</li>
<li >
<a href="../exceptions/index.html">CMIS Exceptions</a>
</li>
</ul>
</li>
<li class="dropdown active">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">CRUD <b class="caret"></b></a>
<ul class="dropdown-menu">
<li >
<a href="../retrieve-objects/index.html">Retrieving Objects</a>
</li>
<li >
<a href="../create-objects/index.html">Creating Objects</a>
</li>
<li >
<a href="../update-objects/index.html">Updating Objects</a>
</li>
<li >
<a href="../move-objects/index.html">Moving Object</a>
</li>
<li >
<a href="../delete-objects/index.html">Deleting Objects</a>
</li>
<li class="active">
<a href="index.html">Working with Content</a>
</li>
<li >
<a href="../versions/index.html">Working with Versions</a>
</li>
<li >
<a href="../properties/index.html">Working with Properties and Secondary Types</a>
</li>
<li >
<a href="../operation-context/index.html">Understanding the Operation Context</a>
</li>
<li >
<a href="../lists/index.html">Working with Lists, Paging and Skipping</a>
</li>
<li >
<a href="../extensions/index.html">Getting Extensions</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Query <b class="caret"></b></a>
<ul class="dropdown-menu">
<li >
<a href="../queries/index.html">Executing Queries</a>
</li>
<li >
<a href="../query-examples/index.html">Query Examples</a>
</li>
<li >
<a href="../changelog/index.html">Retrieving the Change Log</a>
</li>
</ul>
</li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Access Control <b class="caret"></b></a>
<ul class="dropdown-menu">
<li >
<a href="../allowable-actions/index.html">Checking Allowable Actions</a>
</li>
<li >
<a href="../access-control/index.html">Managing Access Control</a>
</li>
<li >
<a href="../retention/index.html">Retention and Holds</a>
</li>
</ul>
</li>
<li >
<a href="../../about/index.html">About</a>
</li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li>
<a href="#" data-toggle="modal" data-target="#mkdocs_search_modal">
<i class="fa fa-search" aria-hidden="true"></i> Search
</a>
</li>
<li >
<a rel="next" href="../delete-objects/index.html">
<i class="fa fa-arrow-left" aria-hidden="true"></i> Previous
</a>
</li>
<li >
<a rel="prev" href="../versions/index.html">
Next <i class="fa fa-arrow-right" aria-hidden="true"></i>
</a>
</li>
<li>
<a href="https://www.apache.org" style="padding: 2px;">
<img src="../../img/feather.png">
</a>
</li>
</ul>
</div>
</div>
</div>
<div class="container">
<div class="col-md-3"><div class="bs-sidebar hidden-print affix well" role="complementary">
<ul class="nav bs-sidenav">
<li class="first-level active"><a href="#working-with-content">Working with Content</a></li>
<li class="second-level"><a href="#content-streams">Content Streams</a></li>
<li class="second-level"><a href="#mime-types">MIME Types</a></li>
<li class="second-level"><a href="#getting-content">Getting Content</a></li>
<li class="third-level"><a href="#getting-partial-content">Getting Partial Content</a></li>
<li class="third-level"><a href="#getting-a-content-url">Getting a Content URL</a></li>
<li class="second-level"><a href="#updating-content">Updating Content</a></li>
<li class="third-level"><a href="#overwriting-content">Overwriting Content</a></li>
<li class="third-level"><a href="#deleting-content">Deleting Content</a></li>
<li class="third-level"><a href="#appending-content">Appending Content</a></li>
<li class="second-level"><a href="#working-with-renditions">Working with Renditions</a></li>
<li class="third-level"><a href="#getting-the-list-of-renditions">Getting the List of Renditions</a></li>
<li class="third-level"><a href="#getting-rendition-content">Getting Rendition Content</a></li>
</ul>
</div></div>
<div class="col-md-9" role="main">
<h1 id="working-with-content">Working with Content</h1>
<p><span class="cmis">CMIS 1.0</span>
<span class="cmis">CMIS 1.1</span>
<span class="spec">Spec 2.1.4.2</span></p>
<h2 id="content-streams">Content Streams</h2>
<p>Content Stream objects are used to send and fetch content. They contain a file name, a <a href="#mime-types">MIME type</a>, the stream length, and the stream.</p>
<p>In some cases, the stream length is unknown (<code>null</code>). OpenCMIS and PortCMIS don’t rely on it and your application shouldn&rsquo;t either. </p>
<p>You can create content stream objects manually or implement the interface yourself, but OpenCMIS and PortCMIS provide some convenience methods for this.</p>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">// create a simple ContentStream object
ContentStream cs1 = session.getObjectFactory().createContentStream(filename, length, mimeType, stream);
// create a ContentStream object from a byte array
ContentStream cs2 = ContentStreamUtils.createByteArrayContentStream(filename, bytes, mimeType);
// create a ContentStream object from a string
ContentStream cs3 = ContentStreamUtils.createTextContentStream(filename, content);
// create a ContentStream object from file
ContentStream cs4 = ContentStreamUtils.createFileContentStream(file);
</code></pre>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">// create a simple IContentStream object
IContentStream cs1 = Session.ObjectFactory.CreateContentStream(filename, length, mimeType, stream);
// create a IContentStream object from a byte array
IContentStream cs2 = ContentStreamUtils.CreateByteArrayContentStream(filename, bytes, mimeType);
// create a IContentStream object from a string
IContentStream cs3 = ContentStreamUtils.CreateTextContentStream(filename, content);
</code></pre>
<h2 id="mime-types">MIME Types</h2>
<p>When you create a new document or update the content of a document, you have to provide a MIME type.
If you don&rsquo;t know the MIME type, use <code>application/octet-stream</code>.</p>
<p>OpenCMIS can guess the MIME type based on the file extension.
If you need a more thorough MIME type detection, have a look at <a href="https://tika.apache.org/">Apache Tika</a>.</p>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">String mimeType = MimeTypes.getMIMEType(&quot;txt&quot;); // MIME type for a .txt file
</code></pre>
<p>For .Net 4.5+ you can use <a href="https://msdn.microsoft.com/en-us/library/system.web.mimemapping.getmimemapping.aspx">System.Web.MimeMapping.GetMimeMapping</a>.</p>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">string mimeType = MimeMapping.GetMimeMapping(&quot;text.txt&quot;);
</code></pre>
<h2 id="getting-content">Getting Content</h2>
<p><span class="cmis">CMIS 1.0</span>
<span class="cmis">CMIS 1.1</span></p>
<p>The code snippets below show how to get the content of document.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>CMIS differentiates between documents with no content and documents with a content of 0 bytes.<br />
If a document has no content, <code>getContentStream()</code> returns <code>null</code>. If a document has a 0 byte content, <code>getContentStream()</code> returns a content stream object with an empty stream.</p>
</div>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">Document document = ...
ContentStream contentStream = document.getContentStream();
InputStream stream = contentStream.getStream();
</code></pre>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">IDocument document = ...
IContentStream contentStream = document.GetContentStream();
Stream stream = contentStream.Stream;
</code></pre>
<h3 id="getting-partial-content">Getting Partial Content</h3>
<p><span class="cmis">CMIS 1.0</span>
<span class="cmis">CMIS 1.1</span></p>
<p>It&rsquo;s also possible to get only a part of the content.</p>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">Document document = ...
// skip the first 100 bytes
// use null to start from the beginning
BigInteger offset = BigInteger.valueOf(100);
// only read 200 bytes
// use null to read to the end of the stream
BigInteger length = BigInteger.valueOf(200);
ContentStream contentStream = document.getContentStream(offset, length);
InputStream stream = contentStream.getStream();
</code></pre>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">IDocument document = ...
// skip the first 100 bytes
// use null to start from the beginning
long? offset = 100;
// only read 200 bytes
// use null to read to the end of the stream
long? length = 200;
IContentStream contentStream = document.GetContentStream(offset, length);
Stream stream = contentStream.Stream;
</code></pre>
<h3 id="getting-a-content-url">Getting a Content URL</h3>
<p>The AtomPub Binding and the Browser Binding can provide a URL to the content of a document. Depending on the repository and the binding, the server might not return the content but an error message because this URL does not include authentication data. A user may have to re-authenticate to get the content.</p>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">Document document = ...
String link = document.getContentUrl();
</code></pre>
<h2 id="updating-content">Updating Content</h2>
<h3 id="overwriting-content">Overwriting Content</h3>
<p><span class="cmis">CMIS 1.0</span>
<span class="cmis">CMIS 1.1</span></p>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">Document document = ...
ContentStream contentStream = ...
document.setContentStream(contentStream, true);
</code></pre>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">IDocument document = ...
IContentStream contentStream = ...
document.SetContentStream(contentStream, true);
</code></pre>
<h3 id="deleting-content">Deleting Content</h3>
<p><span class="cmis">CMIS 1.0</span>
<span class="cmis">CMIS 1.1</span></p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Some repositories don&rsquo;t support documents without content. Check the <a href="../capabilities/index.html">repository capabilities</a> if that&rsquo;s the case or check the
<a href="../allowable-actions/index.html">Allowable Actions</a> of the document.</p>
</div>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">Document document = ...
document.deleteContentStream();
</code></pre>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">IDocument document = ...
document.DeleteContentStream();
</code></pre>
<h3 id="appending-content">Appending Content</h3>
<p><span class="cmis">CMIS 1.1</span></p>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>Not all repositories support appending content. It is not possible to discover wheter a repository supports it or not.
If you append content be prepared to catch a <a href="../exceptions/index.html">notSupported</a> exception. </p>
</div>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">Document document = ...
ContentStream contentStream = ...
boolean isLastChunk = true; // indicates that this is the last part of the content
document.appendContentStream(contentStream, isLastChunk);
</code></pre>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">IDocument document = ...
IContentStream contentStream = ...
bool isLastChunk = true; // indicates that this is the last part of the content
document.AppendContentStream(contentStream, isLastChunk);
</code></pre>
<h2 id="working-with-renditions">Working with Renditions</h2>
<p><span class="cmis">CMIS 1.0</span>
<span class="cmis">CMIS 1.1</span>
<span class="spec">Spec 2.1.4.2</span></p>
<p>Renditions are alternative versions of a document. For example, a rendition could be a PDF of an Office document. Thumbnails are a special kind of renditions and could also exist for non-document objects.<br />
CMIS only supports server managed renditions. A CMIS client cannot upload, modify, or delete a rendition.</p>
<h3 id="getting-the-list-of-renditions">Getting the List of Renditions</h3>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>The list of renditions is only available if it has been requested with an <a href="../operation-context/index.html#rendition-filter">Operation Context</a>.</p>
</div>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">Document document = ...
for (Rendition rendition: document.getRenditions()) {
System.out.println(rendition.getTitle() + &quot;: &quot; + rendition.getStreamId());
}
</code></pre>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">IDocument document = ...
foreach (IRendition rendition in folder.Renditions) {
Console.WriteLine(rendition.Title + &quot;: &quot; + rendition.StreamId);
}
</code></pre>
<h3 id="getting-rendition-content">Getting Rendition Content</h3>
<p>The rendition content can be retrieved either for an Rendition object (see above) or directly from the document with a stream ID.</p>
<p class="opencmis">OpenCMIS (Java)</p>
<pre><code class="java">Document document = ...
Rendition rendition = ...
ContentStream cs1 = document.getContentStream(rendition.getStreamId());
ContentStream cs2 = rendition.getContentStream();
</code></pre>
<p class="portcmis">PortCMIS (C#)</p>
<pre><code class="csharp">IDocument document = ...
IRendition rendition = ...
IContentStream cs1 = document.GetContentStream(rendition.StreamId);
IContentStream cs2 = rendition.GetContentStream();
</code></pre></div>
</div>
<footer class="col-md-12 text-center">
<hr>
<p>
</footer>
<script src="../../js/jquery-1.10.2.min.js"></script>
<script src="../../js/bootstrap-3.0.3.min.js"></script>
<script src="../../js/highlight.pack.js"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script>
var base_url = '../..';
</script>
<script data-main="../../mkdocs/js/search.js" src="../../mkdocs/js/require.js"></script>
<script src="../../js/base.js"></script>
<div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="Search Modal" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">
<span aria-hidden="true">&times;</span>
<span class="sr-only">Close</span>
</button>
<h4 class="modal-title" id="exampleModalLabel">Search</h4>
</div>
<div class="modal-body">
<p>
From here you can search these documents. Enter your search terms below.
</p>
<form role="form">
<div class="form-group">
<input type="text" class="form-control" placeholder="Search..." id="mkdocs-search-query">
</div>
</form>
<div id="mkdocs-search-results"></div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
<script type="text/javascript" src="../../js/retina.min.js"></script>
</body>
</html>
<!-- last update: 2017-07-31 12:45:42 -->