Modified: jclouds/site-content/releasenotes/beta7.html URL: http://svn.apache.org/viewvc/jclouds/site-content/releasenotes/beta7.html?rev=1923693&r1=1923692&r2=1923693&view=diff ============================================================================== --- jclouds/site-content/releasenotes/beta7.html (original) +++ jclouds/site-content/releasenotes/beta7.html Mon Feb 10 07:25:53 2025 @@ -150,72 +150,67 @@ <h1>Release Notes - Beta 7</h1> </div> - <p>There is 4 months solid effort in jclouds 1.0-beta-7 release. <a href="http://code.google.com/p/jclouds/issues/list?can=1&q=label%3AMilestone-1.0-beta-7">65 issues</a> -were addressed.<br/> + <p>There is 4 months solid effort in jclouds 1.0-beta-7 release. <a href="http://code.google.com/p/jclouds/issues/list?can=1&q=label%3AMilestone-1.0-beta-7">65 issues</a> +were addressed.<br /> Our !ComputeService provisioning api is much stronger, with a mock provider and new Hardware and !OperatingSystem models, - not to mention the new vCloud 1.0 api. We've also updated BlobStore with much sought after filesystem and blob signing support.</p> + not to mention the new vCloud 1.0 api. Weâve also updated BlobStore with much sought after filesystem and blob signing support.</p> <p>Below is more information on these enhancements.</p> -<h2>New Features</h2> +<h2 id="new-features">New Features</h2> <ul> -<li>We now have an <a href="http://code.google.com/p/jclouds/wiki/ComputeGuide#Operating_System">OperatingSystem</a> type to help you be more specific + <li>We now have an <a href="http://code.google.com/p/jclouds/wiki/ComputeGuide#Operating_System">OperatingSystem</a> type to help you be more specific in provisioning and operations commands.</li> -<li>Our new <a href="http://code.google.com/p/jclouds/wiki/ComputeGuide#Hardware">Hardware</a> type exposes lots of details + <li>Our new <a href="http://code.google.com/p/jclouds/wiki/ComputeGuide#Hardware">Hardware</a> type exposes lots of details including number of cores and speed per processor, as well mounted volume information including Amazon EBS and vCloud.</li> -<li>We've enhanced testability by adding a <a href="http://code.google.com/p/jclouds/wiki/ComputeGuide#Stub_Provider">stub</a> ComputeService provider. + <li>Weâve enhanced testability by adding a <a href="http://code.google.com/p/jclouds/wiki/ComputeGuide#Stub_Provider">stub</a> ComputeService provider. With this you can write test provisioning code without launching servers.</li> -<li>Our [vCloud vCloud] support is completely revamped to support the new 1.0 api implemented by <a href="http://www.vmware.com/products/vcloud-director/">vCloud Director</a> -with many thanks to VMware and <a href="http://www.bluelock.com/bluelock-cloud-hosting/virtual-cloud-enterprise/">BlueLock</a>.<br/> -Moreover, we've revamped <a href="/documentation/quickstart/terremark-vcloud-express">Terremark</a> vCloud Express and started on their eCloud offering.</li> -<li><a href="http://www.rainbowbreeze.it">Alfredo Morresi</a> contributed a <a href="/documentation/userguide/blobstore-guide">filesystem blobstore</a>, + <li>Our [vCloud vCloud] support is completely revamped to support the new 1.0 api implemented by <a href="http://www.vmware.com/products/vcloud-director/">vCloud Director</a> +with many thanks to VMware and <a href="http://www.bluelock.com/bluelock-cloud-hosting/virtual-cloud-enterprise/">BlueLock</a>.<br /> +Moreover, weâve revamped <a href="/documentation/quickstart/terremark-vcloud-express">Terremark</a> vCloud Express and started on their eCloud offering.</li> + <li><a href="http://www.rainbowbreeze.it">Alfredo Morresi</a> contributed a <a href="/documentation/userguide/blobstore-guide">filesystem blobstore</a>, which allows you to to use the same api persisting to disk, memory, or a blobstore like Amazon S3.</li> -<li>With our <a href="/documentation/userguide/blobstore-guide">blobstore portable request signer</a>, + <li>With our <a href="/documentation/userguide/blobstore-guide">blobstore portable request signer</a>, you can pass blobstore commands to non-java environments to execute. Be creative!</li> -<li>Our core is stronger, now using <a href="http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/urlfetch/URLFetchService.html#fetchAsync%28com.google.appengine.api.urlfetch.HTTPRequest%29">Asynchronous URLFetch</a> + <li>Our core is stronger, now using <a href="http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/urlfetch/URLFetchService.html#fetchAsync%28com.google.appengine.api.urlfetch.HTTPRequest%29">Asynchronous URLFetch</a> in Google Appengine and jaxrs processing via <a href="https://jersey.dev.java.net/">Jersey</a>.</li> </ul> - -<h2>API Breaking Changes</h2> +<h2 id="api-breaking-changes">API Breaking Changes</h2> <ul> -<li>Blob now uses our new Payload class; blob's data needs to be accessed via <code>getPayload()</code> not <code>getContent()</code></li> -<li>We've completely dropped the <code>Size</code> object for <code>Hardware</code>, look for corresponding method names.</li> -<li>The <code>Architecture</code> enum has been replaced with a free form field due to it being too coupled to EC2 concepts. -Generally, <code>os64bit(true)</code> replaces its functionality.</li> -<li>ContentMetadata is now its own type; use <code>md.getContentMetadata().getContentType()</code> as opposed to <code>md.getContentType()</code></li> -<li>Encryption utilities are now functions; use<code>Payloads.calculateMD5(blob)</code>, not <code>blob.generateMD5()</code></li> -<li>vCloud offerings have been significantly changed to address vCloud 1.0 and a prior modeling gap.</li> -<li>Look for enum of <code>UNRECOGNIZED</code> which allows jclouds to operate even when an API clone provides bad data.</li> + <li>Blob now uses our new Payload class; blobâs data needs to be accessed via <code class="language-plaintext highlighter-rouge">getPayload()</code> not <code class="language-plaintext highlighter-rouge">getContent()</code></li> + <li>Weâve completely dropped the <code class="language-plaintext highlighter-rouge">Size</code> object for <code class="language-plaintext highlighter-rouge">Hardware</code>, look for corresponding method names.</li> + <li>The <code class="language-plaintext highlighter-rouge">Architecture</code> enum has been replaced with a free form field due to it being too coupled to EC2 concepts. +Generally, <code class="language-plaintext highlighter-rouge">os64bit(true)</code> replaces its functionality.</li> + <li>ContentMetadata is now its own type; use <code class="language-plaintext highlighter-rouge">md.getContentMetadata().getContentType()</code> as opposed to <code class="language-plaintext highlighter-rouge">md.getContentType()</code></li> + <li>Encryption utilities are now functions; use<code class="language-plaintext highlighter-rouge"> Payloads.calculateMD5(blob)</code>, not <code class="language-plaintext highlighter-rouge">blob.generateMD5()</code></li> + <li>vCloud offerings have been significantly changed to address vCloud 1.0 and a prior modeling gap.</li> + <li>Look for enum of <code class="language-plaintext highlighter-rouge">UNRECOGNIZED</code> which allows jclouds to operate even when an API clone provides bad data.</li> </ul> - -<h2>Known Issues</h2> +<h2 id="known-issues">Known Issues</h2> <ul> -<li>trmk-vcloudexpress is unstable when using <code>runScriptOnNodesMatching</code></li> -<li>eucalyptus tests skipped due to no resources on the test cloud</li> -<li>the following providers are unstable - -<ul> -<li>trmk-ecloud</li> -<li>rimuhosting</li> -<li>ibmdev (sandbox)</li> + <li>trmk-vcloudexpress is unstable when using <code class="language-plaintext highlighter-rouge">runScriptOnNodesMatching</code></li> + <li>eucalyptus tests skipped due to no resources on the test cloud</li> + <li>the following providers are unstable + <ul> + <li>trmk-ecloud</li> + <li>rimuhosting</li> + <li>ibmdev (sandbox)</li> + </ul> + </li> + <li>the following are known limitations of filesystem provider + <ul> + <li>Provider is not tested on windows</li> + <li>Blobstore list method lists all the file inside the container in a recursive way. Other options of the method arenât manager yes</li> + <li>There are issues when compiling the class under Windows. Need to be fixed</li> + <li>No blob metadata are stored in this current implementation. Only the name and the content of the source payload is stored.</li> + </ul> + </li> </ul> -</li> -<li>the following are known limitations of filesystem provider - -<ul> -<li>Provider is not tested on windows</li> -<li>Blobstore list method lists all the file inside the container in a recursive way. Other options of the method aren't manager yes</li> -<li>There are issues when compiling the class under Windows. Need to be fixed</li> -<li>No blob metadata are stored in this current implementation. Only the name and the content of the source payload is stored.</li> -</ul> -</li> -</ul> - <div class="row clearfix"> <div id="footer" class="col-md-12 column">
Modified: jclouds/site-content/releasenotes/beta8.html URL: http://svn.apache.org/viewvc/jclouds/site-content/releasenotes/beta8.html?rev=1923693&r1=1923692&r2=1923693&view=diff ============================================================================== --- jclouds/site-content/releasenotes/beta8.html (original) +++ jclouds/site-content/releasenotes/beta8.html Mon Feb 10 07:25:53 2025 @@ -150,62 +150,52 @@ <h1>Release Notes Beta 8</h1> </div> - <h2>Introduction</h2> + <h2 id="introduction">Introduction</h2> <p>We resolved <a href="http://code.google.com/p/jclouds/issues/list?can=1&q=label%3AMilestone-1.0-beta-8">23 issues</a> in our jclouds 1.0-beta-8 release. While mostly a bugfix release we have a few notable features to discuss.</p> -<h2>New Features</h2> - -<ul> -<li>Tested support for a <a href="http://www.peer1.com/hosting/cloudone-storage.php">peer1-storage</a></li> -<li>jclouds can now persist credentials of started nodes across contexts, which allows you -to run scripts without ever knowing the login credentials of nodes.</li> -<li>Integration tests are stronger including os version match tests and running web services on launched nodes</li> -<li>Stabalized terremark ecloud support</li> -</ul> - - -<h2>API Breaking Changes</h2> - -<ul> -<li><code>EC2Hardware object</code> has been removed in favor of the base <code>Hardware</code> class.</li> -<li><code>ScriptBuilder.build</code> is now <code>ScriptBuilder.render</code> so that it can implement the <code>Statement</code> interface.</li> -</ul> - - -<h2>Known Issues</h2> - -<ul> -<li>trmk-ecloud - -<ul> -<li>only the centos template work in ComputeService</li> -</ul> -</li> -<li>slicehost - -<ul> -<li>note that soft followed by hard reboot ends often throws a server error saying wait.</li> -</ul> -</li> -<li>bluelock-vcdirector/vcloud - -<ul> -<li>you have to copy vAppTemplates into your catalog from the public one before they can be used.</li> -<li>ComputeService has no hooks for changing the hardware yet</li> -</ul> -</li> -<li>eucalyptus tests skipped due to no resources on the test cloud</li> -<li>the following providers are unstable - +<h2 id="new-features">New Features</h2> <ul> -<li>rimuhosting</li> -</ul> -</li> + <li>Tested support for a <a href="http://www.peer1.com/hosting/cloudone-storage.php">peer1-storage</a></li> + <li>jclouds can now persist credentials of started nodes across contexts, which allows you + to run scripts without ever knowing the login credentials of nodes.</li> + <li>Integration tests are stronger including os version match tests and running web services on launched nodes</li> + <li>Stabalized terremark ecloud support</li> +</ul> + +<h2 id="api-breaking-changes">API Breaking Changes</h2> +<ul> + <li><code class="language-plaintext highlighter-rouge">EC2Hardware object</code> has been removed in favor of the base <code class="language-plaintext highlighter-rouge">Hardware</code> class.</li> + <li><code class="language-plaintext highlighter-rouge">ScriptBuilder.build</code> is now <code class="language-plaintext highlighter-rouge">ScriptBuilder.render</code> so that it can implement the <code class="language-plaintext highlighter-rouge">Statement</code> interface.</li> +</ul> + +<h2 id="known-issues">Known Issues</h2> +<ul> + <li>trmk-ecloud + <ul> + <li>only the centos template work in ComputeService</li> + </ul> + </li> + <li>slicehost + <ul> + <li>note that soft followed by hard reboot ends often throws a server error saying wait.</li> + </ul> + </li> + <li>bluelock-vcdirector/vcloud + <ul> + <li>you have to copy vAppTemplates into your catalog from the public one before they can be used.</li> + <li>ComputeService has no hooks for changing the hardware yet</li> + </ul> + </li> + <li>eucalyptus tests skipped due to no resources on the test cloud</li> + <li>the following providers are unstable + <ul> + <li>rimuhosting</li> + </ul> + </li> </ul> - <div class="row clearfix"> <div id="footer" class="col-md-12 column"> <div id="footer"> Modified: jclouds/site-content/releasenotes/index.html URL: http://svn.apache.org/viewvc/jclouds/site-content/releasenotes/index.html?rev=1923693&r1=1923692&r2=1923693&view=diff ============================================================================== --- jclouds/site-content/releasenotes/index.html (original) +++ jclouds/site-content/releasenotes/index.html Mon Feb 10 07:25:53 2025 @@ -152,65 +152,495 @@ <p>The Release Notes and Javadocs for every major release of Apache jclouds are listed chronologically below.</p> <ul> -<li><a href="/releasenotes/2.5.0">2.5.0</a> | <a href="/reference/javadoc/2.5.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.4.0">2.4.0</a> | <a href="/reference/javadoc/2.4.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.3.0">2.3.0</a> | <a href="/reference/javadoc/2.3.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.2.1">2.2.1</a> | <a href="/reference/javadoc/2.2.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.2.0">2.2.0</a> | <a href="/reference/javadoc/2.2.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.1.3">2.1.3</a> | <a href="/reference/javadoc/2.1.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.1.2">2.1.2</a> | <a href="/reference/javadoc/2.1.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.1.1">2.1.1</a> | <a href="/reference/javadoc/2.1.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.1.0">2.1.0</a> | <a href="/reference/javadoc/2.1.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.0.3">2.0.3</a> | <a href="/reference/javadoc/2.0.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.0.2">2.0.2</a> | <a href="/reference/javadoc/2.0.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.0.1">2.0.1</a> | <a href="/reference/javadoc/2.0.x/">Javadoc</a></li> -<li><a href="/releasenotes/2.0.0">2.0.0</a> | <a href="/reference/javadoc/2.0.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.9.3">1.9.3</a> | <a href="/reference/javadoc/1.9.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.9.2">1.9.2</a> | <a href="/reference/javadoc/1.9.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.9.1">1.9.1</a> | <a href="/reference/javadoc/1.9.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.9.0">1.9.0</a> | <a href="/reference/javadoc/1.9.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.8.1">1.8.1</a> | <a href="/reference/javadoc/1.8.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.8.0">1.8.0</a> | <a href="/reference/javadoc/1.8.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.7.3">1.7.3</a> | <a href="/reference/javadoc/1.7.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.7.2">1.7.2</a> | <a href="/reference/javadoc/1.7.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.7.1">1.7.1</a> | <a href="/reference/javadoc/1.7.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.7.0">1.7.0</a> | <a href="/reference/javadoc/1.7.x/">Javadoc</a></li> -<li><a href="/releasenotes/1.6.3">1.6.3</a> | <a href="http://demobox.github.io/jclouds-maven-site-1.6.3/1.6.3/jclouds/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.6.2">1.6.2</a> | <a href="http://demobox.github.io/jclouds-maven-site-1.6.2/1.6.2-incubating/jclouds/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.6.1">1.6.1</a> | <a href="http://demobox.github.io/jclouds-maven-site-1.6.1/1.6.1-incubating/jclouds/apidocs/">Javadoc</a></li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.5.0">2.5.0</a></td> + <td><a href="/reference/javadoc/2.5.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.4.0">2.4.0</a></td> + <td><a href="/reference/javadoc/2.4.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.3.0">2.3.0</a></td> + <td><a href="/reference/javadoc/2.3.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.2.1">2.2.1</a></td> + <td><a href="/reference/javadoc/2.2.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.2.0">2.2.0</a></td> + <td><a href="/reference/javadoc/2.2.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.1.3">2.1.3</a></td> + <td><a href="/reference/javadoc/2.1.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.1.2">2.1.2</a></td> + <td><a href="/reference/javadoc/2.1.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.1.1">2.1.1</a></td> + <td><a href="/reference/javadoc/2.1.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.1.0">2.1.0</a></td> + <td><a href="/reference/javadoc/2.1.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.0.3">2.0.3</a></td> + <td><a href="/reference/javadoc/2.0.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.0.2">2.0.2</a></td> + <td><a href="/reference/javadoc/2.0.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.0.1">2.0.1</a></td> + <td><a href="/reference/javadoc/2.0.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/2.0.0">2.0.0</a></td> + <td><a href="/reference/javadoc/2.0.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.9.3">1.9.3</a></td> + <td><a href="/reference/javadoc/1.9.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.9.2">1.9.2</a></td> + <td><a href="/reference/javadoc/1.9.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.9.1">1.9.1</a></td> + <td><a href="/reference/javadoc/1.9.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.9.0">1.9.0</a></td> + <td><a href="/reference/javadoc/1.9.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.8.1">1.8.1</a></td> + <td><a href="/reference/javadoc/1.8.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.8.0">1.8.0</a></td> + <td><a href="/reference/javadoc/1.8.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.7.3">1.7.3</a></td> + <td><a href="/reference/javadoc/1.7.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.7.2">1.7.2</a></td> + <td><a href="/reference/javadoc/1.7.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.7.1">1.7.1</a></td> + <td><a href="/reference/javadoc/1.7.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.7.0">1.7.0</a></td> + <td><a href="/reference/javadoc/1.7.x/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.6.3">1.6.3</a></td> + <td><a href="http://demobox.github.io/jclouds-maven-site-1.6.3/1.6.3/jclouds/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.6.2">1.6.2</a></td> + <td><a href="http://demobox.github.io/jclouds-maven-site-1.6.2/1.6.2-incubating/jclouds/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.6.1">1.6.1</a></td> + <td><a href="http://demobox.github.io/jclouds-maven-site-1.6.1/1.6.1-incubating/jclouds/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> </ul> - -<h2>Historical Release Notes Archive</h2> +<h2 id="historical-release-notes-archive">Historical Release Notes Archive</h2> <p>The Release Notes for all jclouds versions released before joining the ASF are listed chronologically below.</p> <ul> -<li><a href="/releasenotes/1.6">1.6.0</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.6.0/1.6.0/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.10</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.10/1.5.10/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.9</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.9/1.5.9/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.8</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.8/1.5.8/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.7</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.7/1.5.7/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.6</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.6/1.5.6/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.5</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.5/1.5.5/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.4</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.4/1.5.4/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.3</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.3/1.5.3/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.2</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.2/1.5.2/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.1</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.1/1.5.1/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.5">1.5.0</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.5.0/1.5.0/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.4">1.4.1</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.4.1/1.4.1/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.4">1.4.0</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.4.0/1.4.0/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.3">1.3.2</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.3.2/1.3.2/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.3">1.3.1</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.3.1/1.3.1/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.3">1.3.0</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.3.0/1.3.0/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.2.2">1.2.2</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.2.2/1.2.2/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.2/">1.2.1</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.2.1/1.2.1/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.2/">1.2.0</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.2.0/1.2.0/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.1.1">1.1.1</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.1.1/1.1.1/jclouds-multi/apidocs/">Javadoc</a></li> -<li><a href="/releasenotes/1.1.0">1.1.0</a> | <a href="http://demobox.github.com/jclouds-maven-site-1.1.0/1.1.0/jclouds-multi/apidocs/">Javadoc</a></li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.6">1.6.0</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.6.0/1.6.0/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.10</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.10/1.5.10/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.9</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.9/1.5.9/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.8</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.8/1.5.8/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.7</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.7/1.5.7/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.6</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.6/1.5.6/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.5</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.5/1.5.5/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.4</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.4/1.5.4/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.3</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.3/1.5.3/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.2</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.2/1.5.2/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.1</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.1/1.5.1/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.5">1.5.0</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.5.0/1.5.0/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.4">1.4.1</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.4.1/1.4.1/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.4">1.4.0</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.4.0/1.4.0/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.3">1.3.2</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.3.2/1.3.2/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.3">1.3.1</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.3.1/1.3.1/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.3">1.3.0</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.3.0/1.3.0/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.2.2">1.2.2</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.2.2/1.2.2/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.2/">1.2.1</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.2.1/1.2.1/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.2/">1.2.0</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.2.0/1.2.0/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.1.1">1.1.1</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.1.1/1.1.1/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> + <li> + <table> + <tbody> + <tr> + <td><a href="/releasenotes/1.1.0">1.1.0</a></td> + <td><a href="http://demobox.github.com/jclouds-maven-site-1.1.0/1.1.0/jclouds-multi/apidocs/">Javadoc</a></td> + </tr> + </tbody> + </table> + </li> </ul> - <p>If you do not see the Release Notes or Javadocs that you are looking for or would like to request other documentation regarding jclouds releases, please <a href="/documentation/community/">let us know</a>.</p> Modified: jclouds/site-content/start/blobstore/index.html URL: http://svn.apache.org/viewvc/jclouds/site-content/start/blobstore/index.html?rev=1923693&r1=1923692&r2=1923693&view=diff ============================================================================== --- jclouds/site-content/start/blobstore/index.html (original) +++ jclouds/site-content/start/blobstore/index.html Mon Feb 10 07:25:53 2025 @@ -158,44 +158,39 @@ perform most work in a portable manner.< <p>Like other components in jclouds, you always have means to gain access to the provider-specific interface if you need functionality that is not available in our abstraction.</p> -<h2>Features</h2> - +<h2 id="features">Features</h2> <hr /> -<h3>Location Aware</h3> +<h3 id="location-aware">Location Aware</h3> -<p>Our location API helps you to portably identify a container within context, such as "Americas" or "Europe".</p> +<p>Our location API helps you to portably identify a container within context, such as âAmericasâ or âEuropeâ.</p> <p>We use the same model across the <a href="/start/compute/">ComputeGuide</a> which allows you to facilitate collocation of processing and data.</p> -<h3>Integration with non-Java Clients</h3> +<h3 id="integration-with-non-java-clients">Integration with non-Java Clients</h3> -<p>Using our <code>BlobRequestSigner</code>, you can portably generate HTTP requests that can be passed to +<p>Using our <code class="language-plaintext highlighter-rouge">BlobRequestSigner</code>, you can portably generate HTTP requests that can be passed to external systems for execution or processing. Use cases include JavaScript client-side loading, and curl based processing on the bash prompt. Be creative!</p> -<h3>Transient Provider</h3> +<h3 id="transient-provider">Transient Provider</h3> <p>Our <strong><em>in-memory</em></strong> provider allows you to test your storage code without credentials or a credit card!</p> -<h3>Filesystem Provider</h3> +<h3 id="filesystem-provider">Filesystem Provider</h3> <p>Our <strong><em>filesystem</em></strong> provider allows you to use the same API when persisting to disk, memory, or a -remote <code>BlobStore</code>.</p> - -<h2>Supported Providers</h2> +remote <code class="language-plaintext highlighter-rouge">BlobStore</code>.</p> +<h2 id="supported-providers">Supported Providers</h2> <hr /> - -<p>jclouds supports a wide range of blobstore providers that can be used equally in any <code>BlobStore</code>.</p> +<p>jclouds supports a wide range of blobstore providers that can be used equally in any <code class="language-plaintext highlighter-rouge">BlobStore</code>.</p> <p>Please refer to the <a href="/reference/providers/#blobstore-providers">Supported BlobStore Providers</a> page for more information.</p> -<h2>Concepts</h2> - +<h2 id="concepts">Concepts</h2> <hr /> - <p>A <strong><em>blobstore</em></strong> is a key-value storage service, such as Amazon S3, where your account exists, and where you can create containers and blobs. A <strong><em>container</em></strong> is a namespace for your data, and you can have many of them. Inside your container, you store data as a <strong><em>blob</em></strong> referenced by a name. In all @@ -204,16 +199,15 @@ blobstores, the combination of your acco <p>Here are some key points about blobstores:</p> <ul> -<li>Globally addressable</li> -<li>Key/value data storage with metadata</li> -<li>Accessed via HTTP</li> -<li>Provisioned on demand through an API</li> -<li>Unlimited scaling</li> -<li>Most are billed on a usage basis</li> + <li>Globally addressable</li> + <li>Key/value data storage with metadata</li> + <li>Accessed via HTTP</li> + <li>Provisioned on demand through an API</li> + <li>Unlimited scaling</li> + <li>Most are billed on a usage basis</li> </ul> - -<h3>Container</h3> +<h3 id="container">Container</h3> <p>A <strong><em>container</em></strong> is a namespace for your objects.</p> @@ -224,15 +218,15 @@ that no-one else in the world conflicts. <p>Everything in a BlobStore is stored in a <strong><em>container</em></strong>, which is an HTTP accessible location (similar to a website) referenced by a URL.</p> -<p>For example, using Amazon S3, creating a container named <code>jclouds</code> would be referenced as -<code>https://jclouds.s3.amazonaws.com</code>. Storing a photo with the key <code>mymug.jpg</code>, will be accessible -through <code>https://jclouds.s3.amazonaws.com/mymug.jpg</code></p> +<p>For example, using Amazon S3, creating a container named <code class="language-plaintext highlighter-rouge">jclouds</code> would be referenced as +<code class="language-plaintext highlighter-rouge">https://jclouds.s3.amazonaws.com</code>. Storing a photo with the key <code class="language-plaintext highlighter-rouge">mymug.jpg</code>, will be accessible +through <code class="language-plaintext highlighter-rouge">https://jclouds.s3.amazonaws.com/mymug.jpg</code></p> <p>In other blobstores, the naming convention of the container is less strict. All blobstores allow you to list your containers and also the contents within them. These contents can either be <strong><em>blobs</em></strong>, <strong><em>folders</em></strong>, or a <strong><em>virtual path</em></strong>.</p> -<h3>Blob</h3> +<h3 id="blob">Blob</h3> <p>A <strong><em>blob</em></strong> is unstructured data that is stored in a container.</p> @@ -245,89 +239,82 @@ restricting at all.</p> data. When a blob is container in a folder, its name is either relative to that folder, or its full path.</p> -<h3>Folder</h3> +<h3 id="folder">Folder</h3> <p>A <strong><em>folder</em></strong> is a subcontainer and can contain blobs or other folders.</p> -<p>The names of items in a folder are <code>basenames</code>. Blob names incorporate folders via a path separator -<code>"/"</code> and is similar to accessing a file in a typical filesystem.</p> +<p>The names of items in a folder are <code class="language-plaintext highlighter-rouge">basenames</code>. Blob names incorporate folders via a path separator +<code class="language-plaintext highlighter-rouge">"/"</code> and is similar to accessing a file in a typical filesystem.</p> -<h3>Virtual Path</h3> +<h3 id="virtual-path">Virtual Path</h3> <p>A <strong><em>virtual path</em></strong> can either be a marker file or a prefix.</p> <p>In either case, they are purely used to give the appearance of a hierarchical structure in a flat blobstore. When you perform a list at a virtual path, the blob names returned are absolute paths.</p> -<h3>Access Control</h3> +<h3 id="access-control">Access Control</h3> <p>By default, every item you put into a container is <em>private</em>, if you are interested in giving access to others, you will have to explicitly configure that. Exposing public containers is provider-specific.</p> -<h3>Limitations</h3> +<h3 id="limitations">Limitations</h3> -<p>Each blobstore has its own limitations. Please see the provider guides for blobstore-specific +<p>Each blobstore has its own limitations. Please see the provider guides for blobstore-specific limitations and tips.</p> -<h2>Usage</h2> - +<h2 id="usage">Usage</h2> <hr /> -<h3>Connecting to a BlobStore</h3> +<h3 id="connecting-to-a-blobstore">Connecting to a BlobStore</h3> -<p>A connection to a <code>BlobStore</code> in jclouds is called a <code>BlobStoreContext</code>. It is thread-safe and +<p>A connection to a <code class="language-plaintext highlighter-rouge">BlobStore</code> in jclouds is called a <code class="language-plaintext highlighter-rouge">BlobStoreContext</code>. It is thread-safe and should be reused for multiple requests to the service.</p> -<p>A <code>BlobStoreContext</code> associates an identity for a provider to a set of network connections.</p> +<p>A <code class="language-plaintext highlighter-rouge">BlobStoreContext</code> associates an identity for a provider to a set of network connections.</p> -<p>At a minimum, you need to specify an <em>identity</em> and <em>credential</em> when creating a <code>BlobStoreContext</code>. +<p>At a minimum, you need to specify an <em>identity</em> and <em>credential</em> when creating a <code class="language-plaintext highlighter-rouge">BlobStoreContext</code>. In the case of Amazon S3, your identity is the <strong>Access Key ID</strong> and credential is the <strong>Secret Access Key</strong>.</p> -<p>Once you have this information, connecting to your <code>BlobStore</code> service is easy:</p> +<p>Once you have this information, connecting to your <code class="language-plaintext highlighter-rouge">BlobStore</code> service is easy:</p> -<div class="highlight"><pre><code class="java"><span class="n">BlobStoreContext</span> <span class="n">context</span> <span class="o">=</span> <span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"aws-s3"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">BlobStoreContext</span> <span class="n">context</span> <span class="o">=</span> <span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"aws-s3"</span><span class="o">)</span> <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="n">identity</span><span class="o">,</span> <span class="n">credential</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="n">BlobStoreContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> -</code></pre></div> - + <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="nc">BlobStoreContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span></code></pre></figure> <p>This will give you a connection to the blobstore, and if it is remote, it will be SSL unless unsupported by the provider. Everything you access from this context will use the same credentials.</p> -<h3>Disconnecting</h3> - -<p>When you are finished with a <code>BlobStoreContext</code>, you should close it accordingly:</p> +<h3 id="disconnecting">Disconnecting</h3> -<div class="highlight"><pre><code class="java"><span class="n">context</span><span class="o">.</span><span class="na">close</span><span class="o">();</span> -</code></pre></div> +<p>When you are finished with a <code class="language-plaintext highlighter-rouge">BlobStoreContext</code>, you should close it accordingly:</p> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="n">context</span><span class="o">.</span><span class="na">close</span><span class="o">();</span></code></pre></figure> -<p>There are many options available for creating a <code>Context</code>. Please see the +<p>There are many options available for creating a <code class="language-plaintext highlighter-rouge">Context</code>. Please see the <a href="http://jclouds-javadocs.elasticbeanstalk.com/org/jclouds/ContextBuilder.html">ContextBuilder</a> Javadocs for a detailed description.</p> -<h3>BlobStore API</h3> - +<h3 id="blobstore-api">BlobStore API</h3> <!-- TODO The difference between BlobStore/Introduction --> +<p>Here is an example of the synchronous <code class="language-plaintext highlighter-rouge">BlobStore</code> interface:</p> -<p>Here is an example of the synchronous <code>BlobStore</code> interface:</p> - -<div class="highlight"><pre><code class="java"><span class="c1">// Initialize the BlobStoreContext</span> -<span class="n">context</span> <span class="o">=</span> <span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"aws-s3"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="c1">// Initialize the BlobStoreContext</span> +<span class="n">context</span> <span class="o">=</span> <span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"aws-s3"</span><span class="o">)</span> <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="n">accesskeyid</span><span class="o">,</span> <span class="n">secretaccesskey</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="n">BlobStoreContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> + <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="nc">BlobStoreContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="c1">// Access the BlobStore</span> <span class="n">blobStore</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getBlobStore</span><span class="o">();</span> <span class="c1">// Create a Container</span> -<span class="n">blobStore</span><span class="o">.</span><span class="na">createContainerInLocation</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="s">"mycontainer"</span><span class="o">);</span> +<span class="n">blobStore</span><span class="o">.</span><span class="na">createContainerInLocation</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="s">"mycontainer"</span><span class="o">);</span> <span class="c1">// Create a Blob</span> -<span class="n">ByteSource</span> <span class="n">payload</span> <span class="o">=</span> <span class="n">ByteSource</span><span class="o">.</span><span class="na">wrap</span><span class="o">(</span><span class="s">"blob-content"</span><span class="o">.</span><span class="na">getBytes</span><span class="o">(</span><span class="n">Charsets</span><span class="o">.</span><span class="na">UTF_8</span><span class="o">));</span> -<span class="n">blob</span> <span class="o">=</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">blobBuilder</span><span class="o">(</span><span class="s">"test"</span><span class="o">)</span> <span class="c1">// you can use folders via blobBuilder(folderName + "/sushi.jpg")</span> +<span class="nc">ByteSource</span> <span class="n">payload</span> <span class="o">=</span> <span class="nc">ByteSource</span><span class="o">.</span><span class="na">wrap</span><span class="o">(</span><span class="s">"blob-content"</span><span class="o">.</span><span class="na">getBytes</span><span class="o">(</span><span class="nc">Charsets</span><span class="o">.</span><span class="na">UTF_8</span><span class="o">));</span> +<span class="n">blob</span> <span class="o">=</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">blobBuilder</span><span class="o">(</span><span class="s">"test"</span><span class="o">)</span> <span class="c1">// you can use folders via blobBuilder(folderName + "/sushi.jpg")</span> <span class="o">.</span><span class="na">payload</span><span class="o">(</span><span class="n">payload</span><span class="o">)</span> <span class="o">.</span><span class="na">contentLength</span><span class="o">(</span><span class="n">payload</span><span class="o">.</span><span class="na">size</span><span class="o">())</span> <span class="o">.</span><span class="na">build</span><span class="o">();</span> @@ -335,157 +322,132 @@ a detailed description.</p> <span class="c1">// Upload the Blob</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">putBlob</span><span class="o">(</span><span class="n">containerName</span><span class="o">,</span> <span class="n">blob</span><span class="o">);</span> -<span class="c1">// Don't forget to close the context when you're done!</span> -<span class="n">context</span><span class="o">.</span><span class="na">close</span><span class="o">()</span> -</code></pre></div> - - -<h4>Creating a Container</h4> +<span class="c1">// Don't forget to close the context when you're done!</span> +<span class="n">context</span><span class="o">.</span><span class="na">close</span><span class="o">()</span></code></pre></figure> -<p>If you don't already have a container, you will need to create one.</p> +<h4 id="creating-a-container">Creating a Container</h4> +<p>If you donât already have a container, you will need to create one.</p> -<p>First, get a <code>BlobStore</code> from your context:</p> - -<div class="highlight"><pre><code class="java"><span class="n">BlobStore</span> <span class="n">blobstore</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getBlobStore</span><span class="o">();</span> -</code></pre></div> +<p>First, get a <code class="language-plaintext highlighter-rouge">BlobStore</code> from your context:</p> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">BlobStore</span> <span class="n">blobstore</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getBlobStore</span><span class="o">();</span></code></pre></figure> <p>Location is a region, provider, or another scope in which a container can be created to ensure data -locality. If you don't have a location concern, pass <code>null</code> to accept the default.</p> +locality. If you donât have a location concern, pass <code class="language-plaintext highlighter-rouge">null</code> to accept the default.</p> -<div class="highlight"><pre><code class="java"><span class="kt">boolean</span> <span class="n">created</span> <span class="o">=</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">createContainerInLocation</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="n">container</span><span class="o">);</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kt">boolean</span> <span class="n">created</span> <span class="o">=</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">createContainerInLocation</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="n">container</span><span class="o">);</span> <span class="k">if</span> <span class="o">(</span><span class="n">created</span><span class="o">)</span> <span class="o">{</span> - <span class="c1">// the container didn't exist, but does now</span> + <span class="c1">// the container didn't exist, but does now</span> <span class="o">}</span> <span class="k">else</span> <span class="o">{</span> <span class="c1">// the container already existed</span> -<span class="o">}</span> -</code></pre></div> - +<span class="o">}</span></code></pre></figure> -<h3>Multipart Upload</h3> +<h3 id="multipart-upload">Multipart Upload</h3> -<p>Providers may implement multipart upload for large or very large files. Here's an example of multipart -upload, using <code>aws-s3</code> provider, which allows <a href="https://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?qfacts.html">uploading files as large as +<p>Providers may implement multipart upload for large or very large files. Hereâs an example of multipart +upload, using <code class="language-plaintext highlighter-rouge">aws-s3</code> provider, which allows <a href="https://docs.amazonwebservices.com/AmazonS3/latest/dev/index.html?qfacts.html">uploading files as large as 5TB</a>.</p> -<div class="highlight"><pre><code class="java"><span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">jclouds</span><span class="o">.</span><span class="na">blobstore</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">PutOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">multipart</span><span class="o">;</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="kn">import</span> <span class="nn">static</span> <span class="n">org</span><span class="o">.</span><span class="na">jclouds</span><span class="o">.</span><span class="na">blobstore</span><span class="o">.</span><span class="na">options</span><span class="o">.</span><span class="na">PutOptions</span><span class="o">.</span><span class="na">Builder</span><span class="o">.</span><span class="na">multipart</span><span class="o">;</span> <span class="c1">// Initialize the BlobStoreContext</span> -<span class="n">context</span> <span class="o">=</span> <span class="n">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"aws-s3"</span><span class="o">)</span> +<span class="n">context</span> <span class="o">=</span> <span class="nc">ContextBuilder</span><span class="o">.</span><span class="na">newBuilder</span><span class="o">(</span><span class="s">"aws-s3"</span><span class="o">)</span> <span class="o">.</span><span class="na">credentials</span><span class="o">(</span><span class="n">accesskeyid</span><span class="o">,</span> <span class="n">secretaccesskey</span><span class="o">)</span> - <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="n">BlobStoreContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> + <span class="o">.</span><span class="na">buildView</span><span class="o">(</span><span class="nc">BlobStoreContext</span><span class="o">.</span><span class="na">class</span><span class="o">);</span> <span class="c1">// Access the BlobStore</span> -<span class="n">BlobStore</span> <span class="n">blobStore</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getBlobStore</span><span class="o">();</span> +<span class="nc">BlobStore</span> <span class="n">blobStore</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getBlobStore</span><span class="o">();</span> <span class="c1">// Create a Container</span> -<span class="n">blobStore</span><span class="o">.</span><span class="na">createContainerInLocation</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="s">"mycontainer"</span><span class="o">);</span> +<span class="n">blobStore</span><span class="o">.</span><span class="na">createContainerInLocation</span><span class="o">(</span><span class="kc">null</span><span class="o">,</span> <span class="s">"mycontainer"</span><span class="o">);</span> <span class="c1">// Create a Blob</span> -<span class="n">ByteSource</span> <span class="n">payload</span> <span class="o">=</span> <span class="n">Files</span><span class="o">.</span><span class="na">asByteSource</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="n">fileName</span><span class="o">));</span> -<span class="n">Blob</span> <span class="n">blob</span> <span class="o">=</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">blobBuilder</span><span class="o">(</span><span class="n">objectName</span><span class="o">)</span> +<span class="nc">ByteSource</span> <span class="n">payload</span> <span class="o">=</span> <span class="nc">Files</span><span class="o">.</span><span class="na">asByteSource</span><span class="o">(</span><span class="k">new</span> <span class="nc">File</span><span class="o">(</span><span class="n">fileName</span><span class="o">));</span> +<span class="nc">Blob</span> <span class="n">blob</span> <span class="o">=</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">blobBuilder</span><span class="o">(</span><span class="n">objectName</span><span class="o">)</span> <span class="o">.</span><span class="na">payload</span><span class="o">(</span><span class="n">payload</span><span class="o">)</span> <span class="o">.</span><span class="na">contentDisposition</span><span class="o">(</span><span class="n">objectName</span><span class="o">)</span> <span class="o">.</span><span class="na">contentLength</span><span class="o">(</span><span class="n">payload</span><span class="o">.</span><span class="na">size</span><span class="o">())</span> - <span class="o">.</span><span class="na">contentType</span><span class="o">(</span><span class="n">MediaType</span><span class="o">.</span><span class="na">OCTET_STREAM</span><span class="o">.</span><span class="na">toString</span><span class="o">())</span> + <span class="o">.</span><span class="na">contentType</span><span class="o">(</span><span class="nc">MediaType</span><span class="o">.</span><span class="na">OCTET_STREAM</span><span class="o">.</span><span class="na">toString</span><span class="o">())</span> <span class="o">.</span><span class="na">build</span><span class="o">();</span> <span class="c1">// Upload the Blob </span> -<span class="n">String</span> <span class="n">eTag</span> <span class="o">=</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">putBlob</span><span class="o">(</span><span class="n">containerName</span><span class="o">,</span> <span class="n">blob</span><span class="o">,</span> <span class="n">multipart</span><span class="o">());</span> +<span class="nc">String</span> <span class="n">eTag</span> <span class="o">=</span> <span class="n">blobStore</span><span class="o">.</span><span class="na">putBlob</span><span class="o">(</span><span class="n">containerName</span><span class="o">,</span> <span class="n">blob</span><span class="o">,</span> <span class="n">multipart</span><span class="o">());</span> -<span class="c1">// Don't forget to close the context when you're done!</span> -<span class="n">context</span><span class="o">.</span><span class="na">close</span><span class="o">()</span> -</code></pre></div> +<span class="c1">// Don't forget to close the context when you're done!</span> +<span class="n">context</span><span class="o">.</span><span class="na">close</span><span class="o">()</span></code></pre></figure> - -<h3>Logging</h3> +<h3 id="logging">Logging</h3> <p>Please refer to the <a href="https://jclouds.apache.org/reference/logging/">logging</a> page for more information on how to configure logging in jclouds.</p> -<h1>Clojure</h1> - +<h1 id="clojure">Clojure</h1> <hr /> <!-- TODO: update this to latest clojure --> +<p>The above examples show how to use the <code class="language-plaintext highlighter-rouge">BlobStore</code> API in Java. The same API can be used from Clojure!</p> - -<p>The above examples show how to use the <code>BlobStore</code> API in Java. The same API can be used from Clojure!</p> - -<h2>Setup</h2> - +<h2 id="setup">Setup</h2> <ul> -<li>Install <a href="https://leiningen.org/">leiningen</a></li> -<li>Execute <code>lein new mygroup/myproject</code></li> + <li>Install <a href="https://leiningen.org/">leiningen</a></li> + <li>Execute <code class="language-plaintext highlighter-rouge">lein new mygroup/myproject</code></li> </ul> +<p>In the <code class="language-plaintext highlighter-rouge">myproject</code> directory, edit the <code class="language-plaintext highlighter-rouge">project.clj</code> to include the following:</p> -<p>In the <code>myproject</code> directory, edit the <code>project.clj</code> to include the following:</p> - -<div class="highlight"><pre><code class="clojure"><span class="p">(</span><span class="kd">defproject </span><span class="nv">mygroup/myproject</span> <span class="s">"1.0.0"</span> - <span class="ss">:description</span> <span class="s">"FIXME: write description"</span> - <span class="ss">:dependencies</span> <span class="p">[[</span><span class="nv">org.clojure/clojure</span> <span class="s">"1.3.0"</span><span class="p">]</span> - <span class="p">[</span><span class="nv">org.clojure/core.incubator</span> <span class="s">"0.1.0"</span><span class="p">]</span> - <span class="p">[</span><span class="nv">org.clojure/tools.logging</span> <span class="s">"0.2.3"</span><span class="p">]</span> - <span class="p">[</span><span class="nv">org.apache.jclouds/jclouds-allcompute</span> <span class="s">"1.7.1"</span><span class="p">]]</span> - <span class="ss">:repositories</span> <span class="p">{</span><span class="s">"apache-snapshots"</span> <span class="s">"https://repository.apache.org/content/repositories/snapshots"</span><span class="p">})</span> -</code></pre></div> +<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="p">(</span><span class="nf">defproject</span><span class="w"> </span><span class="n">mygroup/myproject</span><span class="w"> </span><span class="s">"1.0.0"</span><span class="w"> + </span><span class="no">:description</span><span class="w"> </span><span class="s">"FIXME: write description"</span><span class="w"> + </span><span class="no">:dependencies</span><span class="w"> </span><span class="p">[[</span><span class="n">org.clojure/clojure</span><span class="w"> </span><span class="s">"1.3.0"</span><span class="p">]</span><span class="w"> + </span><span class="p">[</span><span class="n">org.clojure/core.incubator</span><span class="w"> </span><span class="s">"0.1.0"</span><span class="p">]</span><span class="w"> + </span><span class="p">[</span><span class="n">org.clojure/tools.logging</span><span class="w"> </span><span class="s">"0.2.3"</span><span class="p">]</span><span class="w"> + </span><span class="p">[</span><span class="n">org.apache.jclouds/jclouds-allcompute</span><span class="w"> </span><span class="s">"1.7.1"</span><span class="p">]]</span><span class="w"> + </span><span class="no">:repositories</span><span class="w"> </span><span class="p">{</span><span class="s">"apache-snapshots"</span><span class="w"> </span><span class="s">"https://repository.apache.org/content/repositories/snapshots"</span><span class="p">})</span></code></pre></figure> +<p>Execute <code class="language-plaintext highlighter-rouge">lein deps</code> to download the specified dependencies.</p> -<p>Execute <code>lein deps</code> to download the specified dependencies.</p> +<h2 id="usage-1">Usage</h2> -<h2>Usage</h2> - -<p>Execute <code>lein repl</code> to get a repl, then paste the following or write your own code. Clearly, you +<p>Execute <code class="language-plaintext highlighter-rouge">lein repl</code> to get a repl, then paste the following or write your own code. Clearly, you need to substitute your accounts and keys below.</p> -<div class="highlight"><pre><code class="clojure"><span class="p">(</span><span class="nf">use</span> <span class="ss">'org.jclouds.blobstore2</span><span class="p">)</span> - -<span class="p">(</span><span class="k">def </span><span class="nv">*blobstore*</span> <span class="p">(</span><span class="nf">blobstore</span> <span class="s">"azureblob"</span> <span class="nv">account</span> <span class="nv">encodedkey</span><span class="p">))</span> -<span class="p">(</span><span class="nf">create-container</span> <span class="nv">*blobstore*</span> <span class="s">"mycontainer"</span><span class="p">)</span> -<span class="p">(</span><span class="nf">put-blob</span> <span class="nv">*blobstore*</span> <span class="s">"mycontainer"</span> <span class="p">(</span><span class="nf">blob</span> <span class="s">"test"</span> <span class="ss">:payload</span> <span class="s">"testdata"</span><span class="p">))</span> -</code></pre></div> +<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="p">(</span><span class="nf">use</span><span class="w"> </span><span class="ss">'org.jclouds.blobstore2</span><span class="p">)</span><span class="w"> +</span><span class="p">(</span><span class="k">def</span><span class="w"> </span><span class="n">*blobstore*</span><span class="w"> </span><span class="p">(</span><span class="nf">blobstore</span><span class="w"> </span><span class="s">"azureblob"</span><span class="w"> </span><span class="n">account</span><span class="w"> </span><span class="n">encodedkey</span><span class="p">))</span><span class="w"> +</span><span class="p">(</span><span class="nf">create-container</span><span class="w"> </span><span class="n">*blobstore*</span><span class="w"> </span><span class="s">"mycontainer"</span><span class="p">)</span><span class="w"> +</span><span class="p">(</span><span class="nf">put-blob</span><span class="w"> </span><span class="n">*blobstore*</span><span class="w"> </span><span class="s">"mycontainer"</span><span class="w"> </span><span class="p">(</span><span class="nf">blob</span><span class="w"> </span><span class="s">"test"</span><span class="w"> </span><span class="no">:payload</span><span class="w"> </span><span class="s">"testdata"</span><span class="p">))</span></code></pre></figure> -<h1>Advanced Concepts</h1> - +<h1 id="advanced-concepts">Advanced Concepts</h1> <hr /> <p>This section covers advanced topics typically needed by developers of clouds.</p> -<h2>Signing Requests</h2> - -<h3>Java Example</h3> +<h2 id="signing-requests">Signing Requests</h2> -<div class="highlight"><pre><code class="java"><span class="n">HttpRequest</span> <span class="n">request</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getSigner</span><span class="o">().</span><span class="na">signGetBlob</span><span class="o">(</span><span class="s">"adriansmovies"</span><span class="o">,</span> <span class="s">"sushi.avi"</span><span class="o">);</span> -</code></pre></div> +<h3 id="java-example">Java Example</h3> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">HttpRequest</span> <span class="n">request</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getSigner</span><span class="o">().</span><span class="na">signGetBlob</span><span class="o">(</span><span class="s">"adriansmovies"</span><span class="o">,</span> <span class="s">"sushi.avi"</span><span class="o">);</span></code></pre></figure> -<h3>Clojure Example</h3> +<h3 id="clojure-example">Clojure Example</h3> -<div class="highlight"><pre><code class="clojure"><span class="p">(</span><span class="k">let </span><span class="p">[</span><span class="nv">request</span> <span class="p">(</span><span class="nf">sign-blob-request</span> <span class="s">"adriansmovies"</span> <span class="s">"sushi.avi"</span> <span class="p">{</span><span class="ss">:method</span> <span class="ss">:get</span><span class="p">})])</span> -</code></pre></div> +<figure class="highlight"><pre><code class="language-clojure" data-lang="clojure"><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">[</span><span class="n">request</span><span class="w"> </span><span class="p">(</span><span class="nf">sign-blob-request</span><span class="w"> </span><span class="s">"adriansmovies"</span><span class="w"> </span><span class="s">"sushi.avi"</span><span class="w"> </span><span class="p">{</span><span class="no">:method</span><span class="w"> </span><span class="no">:get</span><span class="p">})])</span></code></pre></figure> - -<h2>Multipart Upload Strategies</h2> +<h2 id="multipart-upload-strategies">Multipart Upload Strategies</h2> <p>There are two multipart upload implementations of that jclouds employs for uploading objects to a BlobStore service. Amazon S3 and OpenStack Swift both support these strategies.</p> -<h3><em>ParallelMultipartUploadStrategy</em></h3> - -<p>By default, jclouds uses a parallel upload strategy that will split an object up in to individual +<p>###<em>ParallelMultipartUploadStrategy</em> +By default, jclouds uses a parallel upload strategy that will split an object up in to individual parts and upload them in parallel to the BlobStore. There are two configurable properties for this strategy:</p> -<p> <code>jclouds.mpu.parallel.degree</code> the number of threads (default is 4) - <code>jclouds.mpu.parts.size</code> the size of a part (default is 32MB)</p> +<p><code class="language-plaintext highlighter-rouge">jclouds.mpu.parallel.degree</code> the number of threads (default is 4) + <code class="language-plaintext highlighter-rouge">jclouds.mpu.parts.size</code> the size of a part (default is 32MB)</p> -<h3><em>SequentialMultipartUploadStrategy</em></h3> - -<p>Similar to the parallel strategy, the sequential strategy will split an object up into parts and upload +<p>###<em>SequentialMultipartUploadStrategy</em> +Similar to the parallel strategy, the sequential strategy will split an object up into parts and upload them to the BlobStore sequentially.</p> -<h2>Large Lists</h2> +<h2 id="large-lists">Large Lists</h2> <p>A listing is a set of metadata about items in a <em>container</em>. It is normally associated with a single GET request against your container.</p> @@ -494,82 +456,77 @@ single GET request against your containe and Swift, this is 1000, 5000, and 10000 respectively. Upon hitting this threshold, you need to continue the list in another HTTP request.</p> -<p>For continued iteration of large lists, the BlobStore <code>list()</code> API returns a <code>PageSet</code> that allows -to access the next marker identifier. The <code>getNextMarker()</code> method will either return the next -marker, or <code>null</code> if the page size is less than the maximum.</p> +<p>For continued iteration of large lists, the BlobStore <code class="language-plaintext highlighter-rouge">list()</code> API returns a <code class="language-plaintext highlighter-rouge">PageSet</code> that allows +to access the next marker identifier. The <code class="language-plaintext highlighter-rouge">getNextMarker()</code> method will either return the next +marker, or <code class="language-plaintext highlighter-rouge">null</code> if the page size is less than the maximum.</p> -<p>The marker object can then be used as input to <code>afterMarker</code> in the <code>ListContainerOptions</code> class.</p> +<p>The marker object can then be used as input to <code class="language-plaintext highlighter-rouge">afterMarker</code> in the <code class="language-plaintext highlighter-rouge">ListContainerOptions</code> class.</p> -<h3>Marker Files</h3> +<h3 id="marker-files">Marker Files</h3> <p>Marker files allow you to establish presence of directories in a flat key-value store. Azure, S3, and OpenStack Swift all use pseudo-directories, but in a different ways. For example, some tools -look for a content type of <code>application/directory</code>, while others look for naming patterns such as a -trailing slash <code>/</code> or the suffix <code>_$folder$</code>.</p> +look for a content type of <code class="language-plaintext highlighter-rouge">application/directory</code>, while others look for naming patterns such as a +trailing slash <code class="language-plaintext highlighter-rouge">/</code> or the suffix <code class="language-plaintext highlighter-rouge">_$folder$</code>.</p> <p>In jclouds, we attempt to detect whether a blob is pretending to be a directory, and if so, type it -as <code>StorageType.RELATIVE_PATH</code>. Then, in a <code>list()</code> command, it will appear as a normal directory. -The two strategies responsible for this are <code>IfDirectoryReturnNameStrategy</code> and <code>MkdirStrategy</code>.</p> +as <code class="language-plaintext highlighter-rouge">StorageType.RELATIVE_PATH</code>. Then, in a <code class="language-plaintext highlighter-rouge">list()</code> command, it will appear as a normal directory. +The two strategies responsible for this are <code class="language-plaintext highlighter-rouge">IfDirectoryReturnNameStrategy</code> and <code class="language-plaintext highlighter-rouge">MkdirStrategy</code>.</p> <p>The challenge with this approach is that there are multiple ways to suggest presence of a -directory. For example, it is entirely possible that <em>both</em> the trailing slash <code>/</code> and <code>_$folder$</code> -suffixes exist. For this reason, a simple remove, or <code>rmdir</code> will not work, as it may be the case that +directory. For example, it is entirely possible that <em>both</em> the trailing slash <code class="language-plaintext highlighter-rouge">/</code> and <code class="language-plaintext highlighter-rouge">_$folder$</code> +suffixes exist. For this reason, a simple remove, or <code class="language-plaintext highlighter-rouge">rmdir</code> will not work, as it may be the case that there are multiple tokens relating to the same directory.</p> -<p>For this reason, we have a <code>DeleteDirectoryStrategy</code> strategy. The default version of this used for +<p>For this reason, we have a <code class="language-plaintext highlighter-rouge">DeleteDirectoryStrategy</code> strategy. The default version of this used for flat trees removes all known types of directory markers.</p> -<h2>Content Disposition</h2> +<h2 id="content-disposition">Content Disposition</h2> <p>You may be using jclouds to upload some photos to the cloud, show thumbnails of them to the user via a website, and allow to download the original image.</p> <p>When the user clicks on the thumbnail, a download dialog appears. To control the name of the file in -the "Save As" dialog, you must set <a href="https://www.iana.org/assignments/cont-disp/cont-disp.xhtml">Content -Disposition</a>. Here's how you can do it with +the âSave Asâ dialog, you must set <a href="https://www.iana.org/assignments/cont-disp/cont-disp.xhtml">Content +Disposition</a>. Hereâs how you can do it with the BlobStore API:</p> -<div class="highlight"><pre><code class="java"><span class="n">ByteSource</span> <span class="n">payload</span> <span class="o">=</span> <span class="n">Files</span><span class="o">.</span><span class="na">asByteSource</span><span class="o">(</span><span class="k">new</span> <span class="n">File</span><span class="o">(</span><span class="s">"sushi.jpg"</span><span class="o">));</span> -<span class="n">Blob</span> <span class="n">blob</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getBlobStore</span><span class="o">().</span><span class="na">blobBuilder</span><span class="o">(</span><span class="s">"sushi.jpg"</span><span class="o">)</span> +<figure class="highlight"><pre><code class="language-java" data-lang="java"><span class="nc">ByteSource</span> <span class="n">payload</span> <span class="o">=</span> <span class="nc">Files</span><span class="o">.</span><span class="na">asByteSource</span><span class="o">(</span><span class="k">new</span> <span class="nc">File</span><span class="o">(</span><span class="s">"sushi.jpg"</span><span class="o">));</span> +<span class="nc">Blob</span> <span class="n">blob</span> <span class="o">=</span> <span class="n">context</span><span class="o">.</span><span class="na">getBlobStore</span><span class="o">().</span><span class="na">blobBuilder</span><span class="o">(</span><span class="s">"sushi.jpg"</span><span class="o">)</span> <span class="o">.</span><span class="na">payload</span><span class="o">(</span><span class="n">payload</span><span class="o">)</span> <span class="c1">// or InputStream</span> - <span class="o">.</span><span class="na">contentDisposition</span><span class="o">(</span><span class="s">"attachment; filename=sushi.jpg"</span><span class="o">)</span> - <span class="o">.</span><span class="na">contentMD5</span><span class="o">(</span><span class="n">payload</span><span class="o">.</span><span class="na">hash</span><span class="o">(</span><span class="n">Hashing</span><span class="o">.</span><span class="na">md5</span><span class="o">()).</span><span class="na">asBytes</span><span class="o">())</span> + <span class="o">.</span><span class="na">contentDisposition</span><span class="o">(</span><span class="s">"attachment; filename=sushi.jpg"</span><span class="o">)</span> + <span class="o">.</span><span class="na">contentMD5</span><span class="o">(</span><span class="n">payload</span><span class="o">.</span><span class="na">hash</span><span class="o">(</span><span class="nc">Hashing</span><span class="o">.</span><span class="na">md5</span><span class="o">()).</span><span class="na">asBytes</span><span class="o">())</span> <span class="o">.</span><span class="na">contentLength</span><span class="o">(</span><span class="n">payload</span><span class="o">.</span><span class="na">size</span><span class="o">())</span> - <span class="o">.</span><span class="na">contentType</span><span class="o">(</span><span class="n">MediaType</span><span class="o">.</span><span class="na">JPEG</span><span class="o">.</span><span class="na">toString</span><span class="o">())</span> - <span class="o">.</span><span class="na">build</span><span class="o">();</span> -</code></pre></div> + <span class="o">.</span><span class="na">contentType</span><span class="o">(</span><span class="nc">MediaType</span><span class="o">.</span><span class="na">JPEG</span><span class="o">.</span><span class="na">toString</span><span class="o">())</span> + <span class="o">.</span><span class="na">build</span><span class="o">();</span></code></pre></figure> - -<h2>Return Null on Not Found</h2> +<h2 id="return-null-on-not-found">Return Null on Not Found</h2> <p>All APIs, provider-specific or abstraction, must return null when an object is requested, but not found. Throwing exceptions is only appropriate when there is a state problem. For example, requesting an object from a container that does not exist is a state problem, and should throw an exception.</p> -<h2>Large File Support</h2> - +<h2 id="large-file-support">Large File Support</h2> <!--update to use ByteSource --> - -<h3>Uploading</h3> - -<p>As long as you use either <code>ByteSource</code> or <code>File</code> as the payload for your blob, you should -be fine. Note that in S3, you must calculate the length ahead of time, since it doesn't support +<h3 id="uploading">Uploading</h3> +<p>As long as you use either <code class="language-plaintext highlighter-rouge">ByteSource</code> or <code class="language-plaintext highlighter-rouge">File</code> as the payload for your blob, you should +be fine. Note that in S3, you must calculate the length ahead of time, since it doesnât support chunked encoding.</p> -<p>It is usually better to use a repeatable payload like <code>ByteSource</code> instead of <code>InputStream</code>, +<p>It is usually better to use a repeatable payload like <code class="language-plaintext highlighter-rouge">ByteSource</code> instead of <code class="language-plaintext highlighter-rouge">InputStream</code>, since this allows parallel uploads and retrying on errors.</p> -<p>Our integration tests ensure that we don't rebuffer in memory on upload: +<p>Our integration tests ensure that we donât rebuffer in memory on upload: <a href="https://github.com/apache/jclouds/blob/master/core/src/test/java/org/jclouds/http/BaseHttpCommandExecutorServiceIntegrationTest.java">testUploadBigFile</a>.</p> -<p>This is verified against all of our HTTP clients, conceding that it isn't going to help limited +<p>This is verified against all of our HTTP clients, conceding that it isnât going to help limited environments such as Google App Engine.</p> -<h3>Downloading</h3> +<h3 id="downloading">Downloading</h3> -<p>A blob you've downloaded via <code>blobstore.getBlob()</code> can be accessed via -<code>blob.getPayload().openStream()</code>. Since this is streaming, you shouldn't have a problem +<p>A blob youâve downloaded via <code class="language-plaintext highlighter-rouge">blobstore.getBlob()</code> can be accessed via +<code class="language-plaintext highlighter-rouge">blob.getPayload().openStream()</code>. Since this is streaming, you shouldnât have a problem with memory unless you rebuffer the payload.</p> <div class="row clearfix">
