+ Bucket soneBucket = fetchResult.asBucket();
+ InputStream soneInputStream = null;
+ try {
+ soneInputStream = soneBucket.getInputStream();
+ Sone parsedSone = parseSone(originalSone, soneInputStream);
+ if (parsedSone != null) {
+ parsedSone.setRequestUri(requestUri.setMetaString(new String[0]));
+ }
+ return parsedSone;
+ } catch (IOException ioe1) {
+ logger.log(Level.WARNING, "Could not parse Sone from " + requestUri + "!", ioe1);
+ } finally {
+ Closer.close(soneInputStream);
+ soneBucket.free();
+ }
+ return null;
+ }
+
+ /**
+ * Parses a Sone from the given input stream.
+ *
+ * @param soneInputStream
+ * The input stream to parse the Sone from
+ * @return The parsed Sone
+ */
+ public Sone parseSone(InputStream soneInputStream) {
+ return parseSone(null, soneInputStream);
+ }
+
+ /**
+ * Parses a Sone from the given input stream and updates the given Sone, or
+ * creates a new Sone.
+ *
+ * @param originalSone
+ * The Sone to update (may be {@code null})
+ * @param soneInputStream
+ * The input stream to parse the Sone from
+ * @return The parsed Sone
+ */
+ public Sone parseSone(Sone originalSone, InputStream soneInputStream) {