Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (revision 542914) +++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/AbstractBundlePersistenceManager.java (working copy) @@ -364,7 +364,7 @@ */ protected abstract void destroyBundle(NodePropBundle bundle) throws ItemStateException; - + /** * {@inheritDoc} */ @@ -388,6 +388,15 @@ */ protected abstract void store(NodeReferences refs) throws ItemStateException; + + + /** + * Destroy a property state. Subclass responsibility. + * + * @param state property state to destroy + * @throws ItemStateException if an error occurs + */ + protected abstract void destroy(PropertyState state) throws ItemStateException; //-------------------------------------------------< PersistenceManager >--- @@ -526,6 +535,9 @@ deleteBundle(bundle); deleted.add(state.getId()); } + else { + destroy((PropertyState)state); + } } // gather added node states HashMap modified = new HashMap(); Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java (revision 542914) +++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleDbPersistenceManager.java (working copy) @@ -16,32 +16,6 @@ */ package org.apache.jackrabbit.core.persistence.bundle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.apache.jackrabbit.util.Text; -import org.apache.jackrabbit.core.state.ChangeLog; -import org.apache.jackrabbit.core.state.ItemStateException; -import org.apache.jackrabbit.core.state.NoSuchItemStateException; -import org.apache.jackrabbit.core.state.NodeReferencesId; -import org.apache.jackrabbit.core.state.NodeReferences; -import org.apache.jackrabbit.core.persistence.PMContext; -import org.apache.jackrabbit.core.persistence.AbstractPersistenceManager; -import org.apache.jackrabbit.core.persistence.bundle.util.TrackingInputStream; -import org.apache.jackrabbit.core.persistence.bundle.util.DbNameIndex; -import org.apache.jackrabbit.core.persistence.bundle.util.NodePropBundle; -import org.apache.jackrabbit.core.persistence.bundle.util.BundleBinding; -import org.apache.jackrabbit.core.persistence.bundle.util.ErrorHandling; -import org.apache.jackrabbit.core.persistence.bundle.util.StringIndex; -import org.apache.jackrabbit.core.persistence.util.Serializer; -import org.apache.jackrabbit.core.persistence.util.BLOBStore; -import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore; -import org.apache.jackrabbit.core.fs.FileSystemResource; -import org.apache.jackrabbit.core.fs.FileSystem; -import org.apache.jackrabbit.core.fs.local.LocalFileSystem; -import org.apache.jackrabbit.core.NodeId; -import org.apache.jackrabbit.core.PropertyId; -import org.apache.jackrabbit.uuid.UUID; - import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -55,18 +29,48 @@ import java.sql.Blob; import java.sql.Connection; import java.sql.DatabaseMetaData; +import java.sql.Driver; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; -import java.sql.Driver; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; -import java.util.Collection; -import java.util.ArrayList; +import javax.jcr.PropertyType; import javax.jcr.RepositoryException; +import javax.naming.InitialContext; +import javax.sql.DataSource; +import org.apache.jackrabbit.core.NodeId; +import org.apache.jackrabbit.core.PropertyId; +import org.apache.jackrabbit.core.fs.FileSystem; +import org.apache.jackrabbit.core.fs.FileSystemResource; +import org.apache.jackrabbit.core.fs.local.LocalFileSystem; +import org.apache.jackrabbit.core.persistence.AbstractPersistenceManager; +import org.apache.jackrabbit.core.persistence.PMContext; +import org.apache.jackrabbit.core.persistence.bundle.util.BundleBinding; +import org.apache.jackrabbit.core.persistence.bundle.util.DbNameIndex; +import org.apache.jackrabbit.core.persistence.bundle.util.ErrorHandling; +import org.apache.jackrabbit.core.persistence.bundle.util.NodePropBundle; +import org.apache.jackrabbit.core.persistence.bundle.util.StringIndex; +import org.apache.jackrabbit.core.persistence.bundle.util.TrackingInputStream; +import org.apache.jackrabbit.core.persistence.util.BLOBStore; +import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore; +import org.apache.jackrabbit.core.persistence.util.Serializer; +import org.apache.jackrabbit.core.state.ChangeLog; +import org.apache.jackrabbit.core.state.ItemStateException; +import org.apache.jackrabbit.core.state.NoSuchItemStateException; +import org.apache.jackrabbit.core.state.NodeReferences; +import org.apache.jackrabbit.core.state.NodeReferencesId; +import org.apache.jackrabbit.core.state.PropertyState; +import org.apache.jackrabbit.util.Text; +import org.apache.jackrabbit.uuid.UUID; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * This is a generic persistence manager that stores the {@link NodePropBundle}s * in a database. @@ -107,7 +111,7 @@ /** flag indicating if this manager was initialized */ protected boolean initialized = false; - + /** the jdbc driver name */ protected String driver; @@ -180,8 +184,7 @@ * the name of this persistence manager */ private String name = super.toString(); - - + /** * Returns the configured JDBC connection url. * @return the configured JDBC connection url. @@ -523,14 +526,14 @@ this.name = context.getHomeDir().getName(); - // setup jdbc connection + // setup jdbc connection // Note: Explicit creation of new instance of the driver is required // in order to re-register the driver in the DriverManager after a // repository shutdown. Driver drv = (Driver) Class.forName(driver).newInstance(); - log.info("JDBC driver created: {}", drv); - con = DriverManager.getConnection(url, user, password); - con.setAutoCommit(true); + log.info("JDBC driver created: {}", drv); + con = DriverManager.getConnection(url, user, password); + con.setAutoCommit(true); // make sure schemaObjectPrefix consists of legal name characters only prepareSchemaObjectPrefix(); @@ -1341,4 +1344,22 @@ } } + /** + * {@inheritDoc} + */ + protected void destroy(PropertyState propertyState) throws ItemStateException { + // ensure blobs are removed from BLOBstore + if (propertyState.getType() == PropertyType.BINARY) { + int size = propertyState.isMultiValued() ? propertyState.getValues().length : 1; + for (int i = 0; i < size; i++) { + String blobId = blobStore.createId(propertyState.getPropertyId(), i); + try { + log.debug("removing from BLOBStore :" + blobId); + blobStore.remove(blobId); + } catch (Exception e) { + log.warn("failed to remove from BLOBStore: " + blobId, e); + } + } + } + } } Index: src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java (revision 542914) +++ src/main/java/org/apache/jackrabbit/core/persistence/bundle/BundleFsPersistenceManager.java (working copy) @@ -16,34 +16,35 @@ */ package org.apache.jackrabbit.core.persistence.bundle; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.sql.SQLException; + +import org.apache.jackrabbit.core.NodeId; +import org.apache.jackrabbit.core.PropertyId; +import org.apache.jackrabbit.core.fs.BasedFileSystem; import org.apache.jackrabbit.core.fs.FileSystem; -import org.apache.jackrabbit.core.fs.BasedFileSystem; import org.apache.jackrabbit.core.fs.local.LocalFileSystem; import org.apache.jackrabbit.core.persistence.PMContext; +import org.apache.jackrabbit.core.persistence.bundle.util.BundleBinding; +import org.apache.jackrabbit.core.persistence.bundle.util.ErrorHandling; import org.apache.jackrabbit.core.persistence.bundle.util.NodePropBundle; -import org.apache.jackrabbit.core.persistence.bundle.util.ErrorHandling; -import org.apache.jackrabbit.core.persistence.bundle.util.BundleBinding; import org.apache.jackrabbit.core.persistence.bundle.util.TrackingInputStream; -import org.apache.jackrabbit.core.persistence.util.Serializer; import org.apache.jackrabbit.core.persistence.util.BLOBStore; import org.apache.jackrabbit.core.persistence.util.FileSystemBLOBStore; -import org.apache.jackrabbit.core.NodeId; -import org.apache.jackrabbit.core.PropertyId; +import org.apache.jackrabbit.core.persistence.util.Serializer; import org.apache.jackrabbit.core.state.ItemStateException; -import org.apache.jackrabbit.core.state.NodeReferencesId; import org.apache.jackrabbit.core.state.NoSuchItemStateException; import org.apache.jackrabbit.core.state.NodeReferences; +import org.apache.jackrabbit.core.state.NodeReferencesId; +import org.apache.jackrabbit.core.state.PropertyState; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.io.DataInputStream; -import java.io.DataOutputStream; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.sql.SQLException; - /** * This is a generic persistence manager that stores the {@link NodePropBundle}s * in a filesystem. @@ -677,4 +678,7 @@ } } + protected void destroy(PropertyState state) throws ItemStateException { + // TODO check if something needs to be done here + } } \ No newline at end of file