You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jackrabbit.apache.org by ju...@apache.org on 2010/10/04 15:54:47 UTC
svn commit: r1004239 - in /jackrabbit/trunk/jackrabbit-core/src:
main/java/org/apache/jackrabbit/core/persistence/bundle/
main/java/org/apache/jackrabbit/core/persistence/pool/
main/java/org/apache/jackrabbit/core/persistence/util/
test/java/org/apache...
Author: jukka
Date: Mon Oct 4 13:54:47 2010
New Revision: 1004239
URL: http://svn.apache.org/viewvc?rev=1004239&view=rev
Log:
JCR-2762: Optimize bundle serialization
Remove duplicate code by merging the checkBundle() and readBundle() functionality
Modified:
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/PostgreSQLPersistenceManager.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/BundleDbPersistenceManager.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/PostgreSQLPersistenceManager.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java
jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java
jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java?rev=1004239&r1=1004238&r2=1004239&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java Mon Oct 4 13:54:47 2010
@@ -32,6 +32,7 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@@ -746,7 +747,7 @@ public class BundleDbPersistenceManager
try {
// analyze child node bundles
- NodePropBundle child = loadBundle(entry.getId(), true);
+ NodePropBundle child = loadBundle(entry.getId());
if (child == null) {
log.error(
"NodeState '" + id + "' references inexistent child"
@@ -846,20 +847,14 @@ public class BundleDbPersistenceManager
closeResultSet(bRs);
}
-
try {
// parse and check bundle
- // checkBundle will log any problems itself
- if (binding.checkBundle(
- new ByteArrayInputStream(data))) {
- NodePropBundle bundle = binding.readBundle(
- new ByteArrayInputStream(data), id);
- checkBundleConsistency(id, bundle, fix, modifications);
- } else {
- log.error("invalid bundle '" + id + "', see previous BundleBinding error log entry");
- }
- } catch (Exception e) {
- log.error("Error in bundle " + id + ": " + e);
+ NodePropBundle bundle = binding.readBundle(
+ new ByteArrayInputStream(data), id);
+ checkBundleConsistency(id, bundle, fix, modifications);
+ } catch (IOException e) {
+ log.error("Unable to parse bundle " + id
+ + ": " + Arrays.toString(data), e);
}
count++;
if (count % 1000 == 0) {
@@ -896,7 +891,7 @@ public class BundleDbPersistenceManager
NodeId id = idList.get(i);
try {
// load the node from the database
- NodePropBundle bundle = loadBundle(id, true);
+ NodePropBundle bundle = loadBundle(id);
if (bundle == null) {
log.error("No bundle found for uuid '" + id + "'");
@@ -1098,7 +1093,32 @@ public class BundleDbPersistenceManager
*/
protected synchronized NodePropBundle loadBundle(NodeId id)
throws ItemStateException {
- return loadBundle(id, false);
+ ResultSet rs = null;
+ try {
+ Statement stmt = connectionManager.executeStmt(bundleSelectSQL, getKey(id));
+ rs = stmt.getResultSet();
+ if (!rs.next()) {
+ return null;
+ }
+ byte[] bytes = getBytes(rs.getBlob(1));
+
+ try {
+ NodePropBundle bundle =
+ binding.readBundle(new ByteArrayInputStream(bytes), id);
+ bundle.setSize(bytes.length);
+ return bundle;
+ } catch (IOException e) {
+ log.error("Unable to parse serialization of bundle " + id
+ + ": " + Arrays.toString(bytes), e);
+ throw e;
+ }
+ } catch (Exception e) {
+ String msg = "failed to read bundle: " + id + ": " + e;
+ log.error(msg);
+ throw new ItemStateException(msg, e);
+ } finally {
+ closeResultSet(rs);
+ }
}
/**
@@ -1126,49 +1146,6 @@ public class BundleDbPersistenceManager
}
/**
- * Loads a bundle from the underlying system and optionally performs
- * a check on the bundle first.
- *
- * @param id the node id of the bundle
- * @param checkBeforeLoading check the bundle before loading it and log
- * detailed information about it (slower)
- * @return the loaded bundle or <code>null</code> if the bundle does not
- * exist.
- * @throws ItemStateException if an error while loading occurs.
- */
- protected synchronized NodePropBundle loadBundle(NodeId id, boolean checkBeforeLoading)
- throws ItemStateException {
- ResultSet rs = null;
- try {
- Statement stmt = connectionManager.executeStmt(bundleSelectSQL, getKey(id));
- rs = stmt.getResultSet();
- if (!rs.next()) {
- return null;
- }
- Blob b = rs.getBlob(1);
- byte[] bytes = getBytes(b);
-
- if (checkBeforeLoading) {
- if (!binding.checkBundle(new ByteArrayInputStream(bytes))) {
- // gets wrapped as proper ItemStateException below
- throw new Exception("invalid bundle, see previous BundleBinding error log entry");
- }
- }
-
- NodePropBundle bundle =
- binding.readBundle(new ByteArrayInputStream(bytes), id);
- bundle.setSize(bytes.length);
- return bundle;
- } catch (Exception e) {
- String msg = "failed to read bundle: " + id + ": " + e;
- log.error(msg);
- throw new ItemStateException(msg, e);
- } finally {
- closeResultSet(rs);
- }
- }
-
- /**
* {@inheritDoc}
*/
protected synchronized void storeBundle(NodePropBundle bundle) throws ItemStateException {
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/PostgreSQLPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/PostgreSQLPersistenceManager.java?rev=1004239&r1=1004238&r2=1004239&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/PostgreSQLPersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/bundle/PostgreSQLPersistenceManager.java Mon Oct 4 13:54:47 2010
@@ -85,6 +85,7 @@ public class PostgreSQLPersistenceManage
return SM_LONGLONG_KEYS;
}
+ @Override
protected synchronized NodePropBundle loadBundle(NodeId id)
throws ItemStateException {
try {
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/BundleDbPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/BundleDbPersistenceManager.java?rev=1004239&r1=1004238&r2=1004239&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/BundleDbPersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/BundleDbPersistenceManager.java Mon Oct 4 13:54:47 2010
@@ -26,6 +26,7 @@ import java.sql.Blob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.List;
@@ -713,7 +714,7 @@ public class BundleDbPersistenceManager
try {
// analyze child node bundles
- NodePropBundle child = loadBundle(entry.getId(), true);
+ NodePropBundle child = loadBundle(entry.getId());
if (child == null) {
log.error(
"NodeState '" + id + "' references inexistent child"
@@ -805,19 +806,14 @@ public class BundleDbPersistenceManager
DbUtility.close(bRs);
}
-
try {
// parse and check bundle
- // checkBundle will log any problems itself
- if (binding.checkBundle(new ByteArrayInputStream(data))) {
- NodePropBundle bundle = binding.readBundle(
- new ByteArrayInputStream(data), id);
- checkBundleConsistency(id, bundle, fix, modifications);
- } else {
- log.error("invalid bundle '" + id + "', see previous BundleBinding error log entry");
- }
- } catch (Exception e) {
- log.error("Error in bundle " + id + ": " + e);
+ NodePropBundle bundle = binding.readBundle(
+ new ByteArrayInputStream(data), id);
+ checkBundleConsistency(id, bundle, fix, modifications);
+ } catch (IOException e) {
+ log.error("Unable to parse bundle " + id
+ + ": " + Arrays.toString(data), e);
}
count++;
if (count % 1000 == 0) {
@@ -854,7 +850,7 @@ public class BundleDbPersistenceManager
NodeId id = idList.get(i);
try {
// load the node from the database
- NodePropBundle bundle = loadBundle(id, true);
+ NodePropBundle bundle = loadBundle(id);
if (bundle == null) {
log.error("No bundle found for uuid '" + id + "'");
@@ -1024,7 +1020,31 @@ public class BundleDbPersistenceManager
* {@inheritDoc}
*/
protected NodePropBundle loadBundle(NodeId id) throws ItemStateException {
- return loadBundle(id, false);
+ ResultSet rs = null;
+ try {
+ rs = conHelper.exec(bundleSelectSQL, getKey(id), false, 0);
+ if (!rs.next()) {
+ return null;
+ }
+ byte[] bytes = getBytes(rs.getBlob(1));
+
+ try {
+ NodePropBundle bundle =
+ binding.readBundle(new ByteArrayInputStream(bytes), id);
+ bundle.setSize(bytes.length);
+ return bundle;
+ } catch (IOException e) {
+ log.error("Unable to parse serialization of bundle " + id
+ + ": " + Arrays.toString(bytes), e);
+ throw e;
+ }
+ } catch (Exception e) {
+ String msg = "failed to read bundle: " + id + ": " + e;
+ log.error(msg);
+ throw new ItemStateException(msg, e);
+ } finally {
+ DbUtility.close(rs);
+ }
}
/**
@@ -1052,49 +1072,6 @@ public class BundleDbPersistenceManager
}
/**
- * Loads a bundle from the underlying system and optionally performs
- * a check on the bundle first.
- *
- * @param id the node id of the bundle
- * @param checkBeforeLoading check the bundle before loading it and log
- * detailed information about it (slower)
- * @return the loaded bundle or <code>null</code> if the bundle does not
- * exist.
- * @throws ItemStateException if an error while loading occurs.
- */
- protected NodePropBundle loadBundle(NodeId id, boolean checkBeforeLoading)
- throws ItemStateException {
- ResultSet rs = null;
-
- try {
- rs = conHelper.exec(bundleSelectSQL, getKey(id), false, 0);
- if (!rs.next()) {
- return null;
- }
- Blob b = rs.getBlob(1);
- byte[] bytes = getBytes(b);
-
- if (checkBeforeLoading) {
- if (!binding.checkBundle(new ByteArrayInputStream(bytes))) {
- // gets wrapped as proper ItemStateException below
- throw new Exception("invalid bundle, see previous BundleBinding error log entry");
- }
- }
-
- NodePropBundle bundle =
- binding.readBundle(new ByteArrayInputStream(bytes), id);
- bundle.setSize(bytes.length);
- return bundle;
- } catch (Exception e) {
- String msg = "failed to read bundle: " + id + ": " + e;
- log.error(msg);
- throw new ItemStateException(msg, e);
- } finally {
- DbUtility.close(rs);
- }
- }
-
- /**
* {@inheritDoc}
*/
protected synchronized void storeBundle(NodePropBundle bundle) throws ItemStateException {
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/PostgreSQLPersistenceManager.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/PostgreSQLPersistenceManager.java?rev=1004239&r1=1004238&r2=1004239&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/PostgreSQLPersistenceManager.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/pool/PostgreSQLPersistenceManager.java Mon Oct 4 13:54:47 2010
@@ -91,6 +91,7 @@ public class PostgreSQLPersistenceManage
*
* {@inheritDoc}
*/
+ @Override
protected NodePropBundle loadBundle(NodeId id) throws ItemStateException {
ResultSet rs = null;
try {
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java?rev=1004239&r1=1004238&r2=1004239&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleBinding.java Mon Oct 4 13:54:47 2010
@@ -139,17 +139,6 @@ public class BundleBinding {
}
/**
- * Checks a <code>NodePropBundle</code> from a data input stream.
- *
- * @param in the input stream
- * @return <code>true</code> if the data is valid;
- * <code>false</code> otherwise.
- */
- public boolean checkBundle(InputStream in) {
- return new BundleReader(this, in).checkBundle();
- }
-
- /**
* Serializes a <code>NodePropBundle</code> to a data output stream
*
* @param out the output stream
Modified: jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java?rev=1004239&r1=1004238&r2=1004239&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/main/java/org/apache/jackrabbit/core/persistence/util/BundleReader.java Mon Oct 4 13:54:47 2010
@@ -145,101 +145,6 @@ class BundleReader {
}
/**
- * Checks a <code>NodePropBundle</code> from a data input stream.
- *
- * @return <code>true</code> if the data is valid;
- * <code>false</code> otherwise.
- */
- public boolean checkBundle() {
- int version;
- // primaryType & version
- try {
- // read version and primary type...special handling
- int index = in.readInt();
-
- // get version
- version = (index >> 24) & 0xff;
- index &= 0x00ffffff;
- String uri = binding.nsIndex.indexToString(index);
- String local = binding.nameIndex.indexToString(in.readInt());
- Name nodeTypeName = NameFactoryImpl.getInstance().create(uri, local);
-
- log.debug("Serialzation Version: " + version);
- log.debug("NodeTypeName: " + nodeTypeName);
- } catch (IOException e) {
- log.error("Error while reading NodeTypeName: " + e);
- return false;
- }
- try {
- NodeId parentId = readNodeId();
- log.debug("ParentUUID: " + parentId);
- } catch (IOException e) {
- log.error("Error while reading ParentUUID: " + e);
- return false;
- }
- try {
- String definitionId = in.readUTF();
- log.debug("DefinitionId: " + definitionId);
- } catch (IOException e) {
- log.error("Error while reading DefinitionId: " + e);
- return false;
- }
- try {
- Name mixinName = readIndexedQName();
- while (mixinName != null) {
- log.debug("MixinTypeName: " + mixinName);
- mixinName = readIndexedQName();
- }
- } catch (IOException e) {
- log.error("Error while reading MixinTypes: " + e);
- return false;
- }
- try {
- Name propName = readIndexedQName();
- while (propName != null) {
- log.debug("PropertyName: " + propName);
- if (!checkPropertyState()) {
- return false;
- }
- propName = readIndexedQName();
- }
- } catch (IOException e) {
- log.error("Error while reading property names: " + e);
- return false;
- }
- try {
- boolean hasUUID = in.readBoolean();
- log.debug("hasUUID: " + hasUUID);
- } catch (IOException e) {
- log.error("Error while reading 'hasUUID': " + e);
- return false;
- }
- try {
- NodeId cneId = readNodeId();
- while (cneId != null) {
- Name cneName = readQName();
- log.debug("ChildNodentry: " + cneId + ":" + cneName);
- cneId = readNodeId();
- }
- } catch (IOException e) {
- log.error("Error while reading child node entry: " + e);
- return false;
- }
-
- if (version >= BundleBinding.VERSION_1) {
- try {
- short modCount = readModCount();
- log.debug("modCount: " + modCount);
- } catch (IOException e) {
- log.error("Error while reading mod cout: " + e);
- return false;
- }
- }
-
- return true;
- }
-
- /**
* Deserializes a <code>PropertyState</code> from the data input stream.
*
* @param id the property id for the new property entry
@@ -334,174 +239,6 @@ class BundleReader {
}
/**
- * Checks a <code>PropertyState</code> from the data input stream.
- *
- * @return <code>true</code> if the data is valid;
- * <code>false</code> otherwise.
- */
- private boolean checkPropertyState() {
- int type;
- try {
- type = in.readInt();
- short modCount = (short) ((type >> 16) | 0xffff);
- type &= 0xffff;
- log.debug(" PropertyType: " + PropertyType.nameFromValue(type));
- log.debug(" ModCount: " + modCount);
- } catch (IOException e) {
- log.error("Error while reading property type: " + e);
- return false;
- }
- try {
- boolean isMV = in.readBoolean();
- log.debug(" MultiValued: " + isMV);
- } catch (IOException e) {
- log.error("Error while reading multivalued: " + e);
- return false;
- }
- try {
- String defintionId = in.readUTF();
- log.debug(" DefinitionId: " + defintionId);
- } catch (IOException e) {
- log.error("Error while reading definition id: " + e);
- return false;
- }
-
- int count;
- try {
- count = in.readInt();
- log.debug(" num values: " + count);
- } catch (IOException e) {
- log.error("Error while reading number of values: " + e);
- return false;
- }
- for (int i = 0; i < count; i++) {
- switch (type) {
- case PropertyType.BINARY:
- int size;
- try {
- size = in.readInt();
- log.debug(" binary size: " + size);
- } catch (IOException e) {
- log.error("Error while reading size of binary: " + e);
- return false;
- }
- if (size == BundleBinding.BINARY_IN_DATA_STORE) {
- try {
- String s = in.readUTF();
- // truncate log output
- if (s.length() > 80) {
- s = s.substring(80) + "...";
- }
- log.debug(" global data store id: " + s);
- } catch (IOException e) {
- log.error("Error while reading blob id: " + e);
- return false;
- }
- } else if (size == BundleBinding.BINARY_IN_BLOB_STORE) {
- try {
- String s = in.readUTF();
- log.debug(" blobid: " + s);
- } catch (IOException e) {
- log.error("Error while reading blob id: " + e);
- return false;
- }
- } else {
- // short values into memory
- byte[] data = new byte[size];
- try {
- in.readFully(data);
- log.debug(" binary: " + data.length + " bytes");
- } catch (IOException e) {
- log.error("Error while reading inlined binary: " + e);
- return false;
- }
- }
- break;
- case PropertyType.DOUBLE:
- try {
- double d = in.readDouble();
- log.debug(" double: " + d);
- } catch (IOException e) {
- log.error("Error while reading double value: " + e);
- return false;
- }
- break;
- case PropertyType.DECIMAL:
- try {
- BigDecimal d = readDecimal();
- log.debug(" decimal: " + d);
- } catch (IOException e) {
- log.error("Error while reading decimal value: " + e);
- return false;
- }
- break;
- case PropertyType.LONG:
- try {
- double l = in.readLong();
- log.debug(" long: " + l);
- } catch (IOException e) {
- log.error("Error while reading long value: " + e);
- return false;
- }
- break;
- case PropertyType.BOOLEAN:
- try {
- boolean b = in.readBoolean();
- log.debug(" boolean: " + b);
- } catch (IOException e) {
- log.error("Error while reading boolean value: " + e);
- return false;
- }
- break;
- case PropertyType.NAME:
- try {
- Name name = readQName();
- log.debug(" name: " + name);
- } catch (IOException e) {
- log.error("Error while reading name value: " + e);
- return false;
- }
- break;
- case PropertyType.WEAKREFERENCE:
- case PropertyType.REFERENCE:
- try {
- NodeId id = readNodeId();
- log.debug(" reference: " + id);
- } catch (IOException e) {
- log.error("Error while reading reference value: " + e);
- return false;
- }
- break;
- default:
- // because writeUTF(String) has a size limit of 64k,
- // Strings are serialized as <length><byte[]>
- int len;
- try {
- len = in.readInt();
- log.debug(" size of string value: " + len);
- } catch (IOException e) {
- log.error("Error while reading size of string value: " + e);
- return false;
- }
- try {
- byte[] bytes = new byte[len];
- in.readFully(bytes);
- String s = new String(bytes, "UTF-8");
- // truncate log output
- if (s.length() > 80) {
- s = s.substring(80) + "...";
- }
- log.debug(" string: " + s);
- } catch (IOException e) {
- log.error("Error while reading string value: " + e);
- return false;
- }
- }
- }
- return true;
- }
-
- /**
* Deserializes a node identifier
*
* @return the node id
Modified: jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java
URL: http://svn.apache.org/viewvc/jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java?rev=1004239&r1=1004238&r2=1004239&view=diff
==============================================================================
--- jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java (original)
+++ jackrabbit/trunk/jackrabbit-core/src/test/java/org/apache/jackrabbit/core/persistence/util/BundleBindingTest.java Mon Oct 4 13:54:47 2010
@@ -116,16 +116,12 @@ public class BundleBindingTest extends T
binding.writeBundle(buffer, bundle);
byte[] bytes = buffer.toByteArray();
- assertTrue(binding.checkBundle(new ByteArrayInputStream(bytes)));
-
assertEquals(bundle, binding.readBundle(
new ByteArrayInputStream(bytes), bundle.getId()));
}
private void assertBundleSerialization(NodePropBundle bundle, byte[] data)
throws Exception {
- assertTrue(binding.checkBundle(new ByteArrayInputStream(data)));
-
assertEquals(bundle, binding.readBundle(
new ByteArrayInputStream(data), bundle.getId()));
}