/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.jackrabbit.core.persistence.util; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import org.apache.jackrabbit.core.data.DataStore; import org.apache.jackrabbit.core.id.NodeId; import org.apache.jackrabbit.core.util.StringIndex; /** * This Class implements efficient serialization methods for item states. */ public class BundleBinding { static final int BINARY_IN_BLOB_STORE = -1; static final int BINARY_IN_DATA_STORE = -2; /** * A special UUID used to mark the <code>null</code> parent identifier * of the root node. This is a proper type 1 UUID to prevent collisions * with other identifiers, even special non-random ones like * <code>00000000-0000-0000-0000-000000000000</code>. */ static final NodeId NULL_PARENT_ID = new NodeId("bb4e9d10-d857-11df-937b-0800200c9a66"); /** * serialization version 1 */ static final int VERSION_1 = 1; /** * serialization version 2 */ static final int VERSION_2 = 2; /** * serialization version 3 */ static final int VERSION_3 = 3; /** * current version */ static final int VERSION_CURRENT = VERSION_3; /** * the namespace index */ protected final StringIndex nsIndex; /** * the name index */ protected final StringIndex nameIndex; /** * the blob store */ protected final BLOBStore blobStore; /** * minimum size of binaries to store in blob store */ protected long minBlobSize = 0x4000; // 16k /** * the error handling */ protected final ErrorHandling errorHandling; /** * Data store for binary properties. */ protected final DataStore dataStore; /** * Creates a new bundle binding * * @param errorHandling the error handling * @param blobStore the blobstore for retrieving blobs * @param nsIndex the namespace index * @param nameIndex the name index * @param dataStore the data store */ public BundleBinding( ErrorHandling errorHandling, BLOBStore blobStore, StringIndex nsIndex, StringIndex nameIndex, DataStore dataStore) { this.errorHandling = errorHandling; this.nsIndex = nsIndex; this.nameIndex = nameIndex; this.blobStore = blobStore; this.dataStore = dataStore; } /** * Returns the minimum blob size * @see #setMinBlobSize(long) for details. * @return the minimum blob size */ public long getMinBlobSize() { return minBlobSize; } /** * Sets the minimum blob size. Binary values that are shorted than this given * size will be inlined in the serialization stream, binary value that are * longer, will be stored in the blob store. default is 4k. * * @param minBlobSize the minimum blob size. */ public void setMinBlobSize(long minBlobSize) { this.minBlobSize = minBlobSize; } /** * Returns the blob store that is associated with this binding. * @return the blob store */ public BLOBStore getBlobStore() { return blobStore; } /** * Deserializes a <code>NodePropBundle</code> from a data input stream. * * @param in the input stream * @param id the node id for the new bundle * @return the bundle * @throws IOException if an I/O error occurs. */ public NodePropBundle readBundle(InputStream in, NodeId id) throws IOException { return new BundleReader(this, in).readBundle(id); } /** * Serializes a <code>NodePropBundle</code> to a data output stream * * @param out the output stream * @param bundle the bundle to serialize * @throws IOException if an I/O error occurs. */ public void writeBundle(OutputStream out, NodePropBundle bundle) throws IOException { new BundleWriter(this, out).writeBundle(bundle); } }