Return-Path: Delivered-To: apmail-directory-commits-archive@www.apache.org Received: (qmail 53434 invoked from network); 1 May 2008 00:07:39 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 1 May 2008 00:07:39 -0000 Received: (qmail 12056 invoked by uid 500); 1 May 2008 00:07:41 -0000 Delivered-To: apmail-directory-commits-archive@directory.apache.org Received: (qmail 12006 invoked by uid 500); 1 May 2008 00:07:41 -0000 Mailing-List: contact commits-help@directory.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@directory.apache.org Delivered-To: mailing list commits@directory.apache.org Received: (qmail 11905 invoked by uid 99); 1 May 2008 00:07:40 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 30 Apr 2008 17:07:40 -0700 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 01 May 2008 00:07:02 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 04AF52388A0D; Wed, 30 Apr 2008 17:06:55 -0700 (PDT) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r652410 [6/14] - in /directory: apacheds/branches/bigbang/ apacheds/branches/bigbang/apacheds-jdbm/ apacheds/branches/bigbang/apacheds-jdbm/src/ apacheds/branches/bigbang/apacheds-jdbm/src/etc/ apacheds/branches/bigbang/apacheds-jdbm/src/ex... Date: Thu, 01 May 2008 00:06:46 -0000 To: commits@directory.apache.org From: elecharny@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20080501000655.04AF52388A0D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Added: directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordCache.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordCache.java?rev=652410&view=auto ============================================================================== --- directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordCache.java (added) +++ directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordCache.java Wed Apr 30 17:06:41 2008 @@ -0,0 +1,80 @@ +/** + * JDBM LICENSE v1.00 + * + * Redistribution and use of this software and associated documentation + * ("Software"), with or without modification, are permitted provided + * that the following conditions are met: + * + * 1. Redistributions of source code must retain copyright + * statements and notices. Redistributions must also contain a + * copy of this document. + * + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. The name "JDBM" must not be used to endorse or promote + * products derived from this Software without prior written + * permission of Cees de Groot. For written permission, + * please contact cg@cdegroot.com. + * + * 4. Products derived from this Software may not be called "JDBM" + * nor may "JDBM" appear in their names without prior written + * permission of Cees de Groot. + * + * 5. Due credit should be given to the JDBM Project + * (http://jdbm.sourceforge.net/). + * + * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Copyright 2000 (C) Cees de Groot. All Rights Reserved. + * Contributions are Copyright (C) 2000 by their associated contributors. + * + * $Id: RecordCache.java,v 1.2 2005/06/25 23:12:32 doomdark Exp $ + */ + +package jdbm.recman; + +import java.io.IOException; + +/** + * This interface is used for synchronization. + *

+ * RecordManager ensures that the cache has the up-to-date information + * by way of an invalidation protocol. + */ +public interface RecordCache { + + /** + * Notification to flush content related to a given record. + */ + public void flush(long recid) throws IOException; + + /** + * Notification to flush data all of records. + */ + public void flushAll() throws IOException; + + /** + * Notification to invalidate content related to given record. + */ + public void invalidate(long recid) throws IOException; + + /** + * Notification to invalidate content of all records. + */ + public void invalidateAll() throws IOException; + +} Added: directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordFile.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordFile.java?rev=652410&view=auto ============================================================================== --- directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordFile.java (added) +++ directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordFile.java Wed Apr 30 17:06:41 2008 @@ -0,0 +1,412 @@ +/** + * JDBM LICENSE v1.00 + * + * Redistribution and use of this software and associated documentation + * ("Software"), with or without modification, are permitted provided + * that the following conditions are met: + * + * 1. Redistributions of source code must retain copyright + * statements and notices. Redistributions must also contain a + * copy of this document. + * + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. The name "JDBM" must not be used to endorse or promote + * products derived from this Software without prior written + * permission of Cees de Groot. For written permission, + * please contact cg@cdegroot.com. + * + * 4. Products derived from this Software may not be called "JDBM" + * nor may "JDBM" appear in their names without prior written + * permission of Cees de Groot. + * + * 5. Due credit should be given to the JDBM Project + * (http://jdbm.sourceforge.net/). + * + * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Copyright 2000 (C) Cees de Groot. All Rights Reserved. + * Contributions are Copyright (C) 2000 by their associated contributors. + * + * $Id: RecordFile.java,v 1.6 2005/06/25 23:12:32 doomdark Exp $ + */ + +package jdbm.recman; + +import java.io.*; +import java.util.*; + +/** + * This class represents a random access file as a set of fixed size + * records. Each record has a physical record number, and records are + * cached in order to improve access. + *

+ * The set of dirty records on the in-use list constitutes a transaction. + * Later on, we will send these records to some recovery thingy. + */ +public final class RecordFile { + final TransactionManager txnMgr; + + // Todo: reorganize in hashes and fifos as necessary. + // free -> inUse -> dirty -> inTxn -> free + // free is a cache, thus a FIFO. The rest are hashes. + private final LinkedList free = new LinkedList(); + private final HashMap inUse = new HashMap(); + private final HashMap dirty = new HashMap(); + private final HashMap inTxn = new HashMap(); + + // transactions disabled? + private boolean transactionsDisabled = false; + + /** The length of a single block. */ + public final static int BLOCK_SIZE = 8192;//4096; + + /** The extension of a record file */ + final static String extension = ".db"; + + /** A block of clean data to wipe clean pages. */ + final static byte[] cleanData = new byte[BLOCK_SIZE]; + + private RandomAccessFile file; + private final String fileName; + + /** + * Creates a new object on the indicated filename. The file is + * opened in read/write mode. + * + * @param fileName the name of the file to open or create, without + * an extension. + * @throws IOException whenever the creation of the underlying + * RandomAccessFile throws it. + */ + RecordFile(String fileName) throws IOException { + this.fileName = fileName; + file = new RandomAccessFile(fileName + extension, "rw"); + txnMgr = new TransactionManager(this); + } + + /** + * Returns the file name. + */ + String getFileName() { + return fileName; + } + + /** + * Disables transactions: doesn't sync and doesn't use the + * transaction manager. + */ + void disableTransactions() { + transactionsDisabled = true; + } + + /** + * Gets a block from the file. The returned byte array is + * the in-memory copy of the record, and thus can be written + * (and subsequently released with a dirty flag in order to + * write the block back). + * + * @param blockid The record number to retrieve. + */ + BlockIo get(long blockid) throws IOException { + Long key = new Long(blockid); + + // try in transaction list, dirty list, free list + BlockIo node = (BlockIo) inTxn.get(key); + if (node != null) { + inTxn.remove(key); + inUse.put(key, node); + return node; + } + node = (BlockIo) dirty.get(key); + if (node != null) { + dirty.remove(key); + inUse.put(key, node); + return node; + } + for (Iterator i = free.iterator(); i.hasNext(); ) { + BlockIo cur = (BlockIo) i.next(); + if (cur.getBlockId() == blockid) { + node = cur; + i.remove(); + inUse.put(key, node); + return node; + } + } + + // sanity check: can't be on in use list + if (inUse.get(key) != null) { + throw new Error("double get for block " + blockid); + } + + // get a new node and read it from the file + node = getNewNode(blockid); + long offset = blockid * BLOCK_SIZE; + if (file.length() > 0 && offset <= file.length()) { + read(file, offset, node.getData(), BLOCK_SIZE); + } else { + System.arraycopy(cleanData, 0, node.getData(), 0, BLOCK_SIZE); + } + inUse.put(key, node); + node.setClean(); + return node; + } + + + /** + * Releases a block. + * + * @param blockid The record number to release. + * @param isDirty If true, the block was modified since the get(). + */ + void release(long blockid, boolean isDirty) + throws IOException { + BlockIo node = (BlockIo) inUse.get(new Long(blockid)); + if (node == null) + throw new IOException("bad blockid " + blockid + " on release"); + if (!node.isDirty() && isDirty) + node.setDirty(); + release(node); + } + + /** + * Releases a block. + * + * @param block The block to release. + */ + void release(BlockIo block) { + Long key = new Long(block.getBlockId()); + inUse.remove(key); + if (block.isDirty()) { + // System.out.println( "Dirty: " + key + block ); + dirty.put(key, block); + } else { + if (!transactionsDisabled && block.isInTransaction()) { + inTxn.put(key, block); + } else { + free.add(block); + } + } + } + + /** + * Discards a block (will not write the block even if it's dirty) + * + * @param block The block to discard. + */ + void discard(BlockIo block) { + Long key = new Long(block.getBlockId()); + inUse.remove(key); + + // note: block not added to free list on purpose, because + // it's considered invalid + } + + /** + * Commits the current transaction by flushing all dirty buffers + * to disk. + */ + void commit() throws IOException { + // debugging... + if (!inUse.isEmpty() && inUse.size() > 1) { + showList(inUse.values().iterator()); + throw new Error("in use list not empty at commit time (" + + inUse.size() + ")"); + } + + // System.out.println("committing..."); + + if ( dirty.size() == 0 ) { + // if no dirty blocks, skip commit process + return; + } + + if (!transactionsDisabled) { + txnMgr.start(); + } + + for (Iterator i = dirty.values().iterator(); i.hasNext(); ) { + BlockIo node = (BlockIo) i.next(); + i.remove(); + // System.out.println("node " + node + " map size now " + dirty.size()); + if (transactionsDisabled) { + long offset = node.getBlockId() * BLOCK_SIZE; + file.seek(offset); + file.write(node.getData()); + node.setClean(); + free.add(node); + } + else { + txnMgr.add(node); + inTxn.put(new Long(node.getBlockId()), node); + } + } + if (!transactionsDisabled) { + txnMgr.commit(); + } + } + + /** + * Rollback the current transaction by discarding all dirty buffers + */ + void rollback() throws IOException { + // debugging... + if (!inUse.isEmpty()) { + showList(inUse.values().iterator()); + throw new Error("in use list not empty at rollback time (" + + inUse.size() + ")"); + } + // System.out.println("rollback..."); + dirty.clear(); + + txnMgr.synchronizeLogFromDisk(); + + if (!inTxn.isEmpty()) { + showList(inTxn.values().iterator()); + throw new Error("in txn list not empty at rollback time (" + + inTxn.size() + ")"); + }; + } + + /** + * Commits and closes file. + */ + void close() throws IOException { + if (!dirty.isEmpty()) { + commit(); + } + txnMgr.shutdown(); + + if (!inTxn.isEmpty()) { + showList(inTxn.values().iterator()); + throw new Error("In transaction not empty"); + } + + // these actually ain't that bad in a production release + if (!dirty.isEmpty()) { + System.out.println("ERROR: dirty blocks at close time"); + showList(dirty.values().iterator()); + throw new Error("Dirty blocks at close time"); + } + if (!inUse.isEmpty()) { + System.out.println("ERROR: inUse blocks at close time"); + showList(inUse.values().iterator()); + throw new Error("inUse blocks at close time"); + } + + // debugging stuff to keep an eye on the free list + // System.out.println("Free list size:" + free.size()); + file.close(); + file = null; + } + + + /** + * Force closing the file and underlying transaction manager. + * Used for testing purposed only. + */ + void forceClose() throws IOException { + txnMgr.forceClose(); + file.close(); + } + + /** + * Prints contents of a list + */ + private void showList(Iterator i) { + int cnt = 0; + while (i.hasNext()) { + System.out.println("elem " + cnt + ": " + i.next()); + cnt++; + } + } + + + /** + * Returns a new node. The node is retrieved (and removed) + * from the released list or created new. + */ + private BlockIo getNewNode(long blockid) + throws IOException { + + BlockIo retval = null; + if (!free.isEmpty()) { + retval = (BlockIo) free.removeFirst(); + } + if (retval == null) + retval = new BlockIo(0, new byte[BLOCK_SIZE]); + + retval.setBlockId(blockid); + retval.setView(null); + return retval; + } + + /** + * Synchs a node to disk. This is called by the transaction manager's + * synchronization code. + */ + void synch(BlockIo node) throws IOException { + byte[] data = node.getData(); + if (data != null) { + long offset = node.getBlockId() * BLOCK_SIZE; + file.seek(offset); + file.write(data); + } + } + + /** + * Releases a node from the transaction list, if it was sitting + * there. + * + * @param recycle true if block data can be reused + */ + void releaseFromTransaction(BlockIo node, boolean recycle) + throws IOException { + Long key = new Long(node.getBlockId()); + if ((inTxn.remove(key) != null) && recycle) { + free.add(node); + } + } + + /** + * Synchronizes the file. + */ + void sync() throws IOException { + file.getFD().sync(); + } + + + /** + * Utility method: Read a block from a RandomAccessFile + */ + private static void read(RandomAccessFile file, long offset, + byte[] buffer, int nBytes) throws IOException { + file.seek(offset); + int remaining = nBytes; + int pos = 0; + while (remaining > 0) { + int read = file.read(buffer, pos, remaining); + if (read == -1) { + System.arraycopy(cleanData, 0, buffer, pos, remaining); + break; + } + remaining -= read; + pos += read; + } + } + +} Added: directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordHeader.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordHeader.java?rev=652410&view=auto ============================================================================== --- directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordHeader.java (added) +++ directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/RecordHeader.java Wed Apr 30 17:06:41 2008 @@ -0,0 +1,107 @@ +/** + * JDBM LICENSE v1.00 + * + * Redistribution and use of this software and associated documentation + * ("Software"), with or without modification, are permitted provided + * that the following conditions are met: + * + * 1. Redistributions of source code must retain copyright + * statements and notices. Redistributions must also contain a + * copy of this document. + * + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. The name "JDBM" must not be used to endorse or promote + * products derived from this Software without prior written + * permission of Cees de Groot. For written permission, + * please contact cg@cdegroot.com. + * + * 4. Products derived from this Software may not be called "JDBM" + * nor may "JDBM" appear in their names without prior written + * permission of Cees de Groot. + * + * 5. Due credit should be given to the JDBM Project + * (http://jdbm.sourceforge.net/). + * + * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Copyright 2000 (C) Cees de Groot. All Rights Reserved. + * Contributions are Copyright (C) 2000 by their associated contributors. + * + * $Id: RecordHeader.java,v 1.1 2000/05/06 00:00:31 boisvert Exp $ + */ + +package jdbm.recman; + +/** + * The data that comes at the start of a record of data. It stores + * both the current size and the avaliable size for the record - the latter + * can be bigger than the former, which allows the record to grow without + * needing to be moved and which allows the system to put small records + * in larger free spots. + */ +class RecordHeader { + // offsets + private static final short O_CURRENTSIZE = 0; // int currentSize + private static final short O_AVAILABLESIZE = Magic.SZ_INT; // int availableSize + static final int SIZE = O_AVAILABLESIZE + Magic.SZ_INT; + + // my block and the position within the block + private BlockIo block; + private short pos; + + /** + * Constructs a record header from the indicated data starting at + * the indicated position. + */ + RecordHeader(BlockIo block, short pos) { + this.block = block; + this.pos = pos; + if (pos > (RecordFile.BLOCK_SIZE - SIZE)) + throw new Error("Offset too large for record header (" + + block.getBlockId() + ":" + + pos + ")"); + } + + /** Returns the current size */ + int getCurrentSize() { + return block.readInt(pos + O_CURRENTSIZE); + } + + /** Sets the current size */ + void setCurrentSize(int value) { + block.writeInt(pos + O_CURRENTSIZE, value); + } + + /** Returns the available size */ + int getAvailableSize() { + return block.readInt(pos + O_AVAILABLESIZE); + } + + /** Sets the available size */ + void setAvailableSize(int value) { + block.writeInt(pos + O_AVAILABLESIZE, value); + } + + // overrides java.lang.Object + public String toString() { + return "RH(" + block.getBlockId() + ":" + pos + + ", avl=" + getAvailableSize() + + ", cur=" + getCurrentSize() + + ")"; + } +} Added: directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/TransactionManager.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/TransactionManager.java?rev=652410&view=auto ============================================================================== --- directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/TransactionManager.java (added) +++ directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/TransactionManager.java Wed Apr 30 17:06:41 2008 @@ -0,0 +1,409 @@ +/** + * JDBM LICENSE v1.00 + * + * Redistribution and use of this software and associated documentation + * ("Software"), with or without modification, are permitted provided + * that the following conditions are met: + * + * 1. Redistributions of source code must retain copyright + * statements and notices. Redistributions must also contain a + * copy of this document. + * + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. The name "JDBM" must not be used to endorse or promote + * products derived from this Software without prior written + * permission of Cees de Groot. For written permission, + * please contact cg@cdegroot.com. + * + * 4. Products derived from this Software may not be called "JDBM" + * nor may "JDBM" appear in their names without prior written + * permission of Cees de Groot. + * + * 5. Due credit should be given to the JDBM Project + * (http://jdbm.sourceforge.net/). + * + * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Copyright 2000 (C) Cees de Groot. All Rights Reserved. + * Contributions are Copyright (C) 2000 by their associated contributors. + * + * $Id: TransactionManager.java,v 1.7 2005/06/25 23:12:32 doomdark Exp $ + */ + +package jdbm.recman; + +import java.io.*; +import java.util.*; + +/** + * This class manages the transaction log that belongs to every + * {@link RecordFile}. The transaction log is either clean, or + * in progress. In the latter case, the transaction manager + * takes care of a roll forward. + *

+ * Implementation note: this is a proof-of-concept implementation + * which hasn't been optimized for speed. For instance, all sorts + * of streams are created for every transaction. + */ +// TODO: Handle the case where we are recovering lg9 and lg0, were we +// should start with lg9 instead of lg0! + +public final class TransactionManager { + private RecordFile owner; + + // streams for transaction log. + private FileOutputStream fos; + private ObjectOutputStream oos; + + /** + * By default, we keep 10 transactions in the log file before + * synchronizing it with the main database file. + */ + static final int DEFAULT_TXNS_IN_LOG = 10; + + /** + * Maximum number of transactions before the log file is + * synchronized with the main database file. + */ + private int _maxTxns = DEFAULT_TXNS_IN_LOG; + + /** + * In-core copy of transactions. We could read everything back from + * the log file, but the RecordFile needs to keep the dirty blocks in + * core anyway, so we might as well point to them and spare us a lot + * of hassle. + */ + private ArrayList[] txns = new ArrayList[DEFAULT_TXNS_IN_LOG]; + private int curTxn = -1; + + /** Extension of a log file. */ + static final String extension = ".lg"; + + /** + * Instantiates a transaction manager instance. If recovery + * needs to be performed, it is done. + * + * @param owner the RecordFile instance that owns this transaction mgr. + */ + TransactionManager(RecordFile owner) throws IOException { + this.owner = owner; + recover(); + open(); + } + + + /** + * Synchronize log file data with the main database file. + *

+ * After this call, the main database file is guaranteed to be + * consistent and guaranteed to be the only file needed for + * backup purposes. + */ + public void synchronizeLog() + throws IOException + { + synchronizeLogFromMemory(); + } + + + /** + * Set the maximum number of transactions to record in + * the log (and keep in memory) before the log is + * synchronized with the main database file. + *

+ * This method must be called while there are no + * pending transactions in the log. + */ + public void setMaximumTransactionsInLog( int maxTxns ) + throws IOException + { + if ( maxTxns <= 0 ) { + throw new IllegalArgumentException( + "Argument 'maxTxns' must be greater than 0." ); + } + if ( curTxn != -1 ) { + throw new IllegalStateException( + "Cannot change setting while transactions are pending in the log" ); + } + _maxTxns = maxTxns; + txns = new ArrayList[ maxTxns ]; + } + + + /** Builds logfile name */ + private String makeLogName() { + return owner.getFileName() + extension; + } + + + /** Synchs in-core transactions to data file and opens a fresh log */ + private void synchronizeLogFromMemory() throws IOException { + close(); + + TreeSet blockList = new TreeSet( new BlockIoComparator() ); + + int numBlocks = 0; + int writtenBlocks = 0; + for (int i = 0; i < _maxTxns; i++) { + if (txns[i] == null) + continue; + // Add each block to the blockList, replacing the old copy of this + // block if necessary, thus avoiding writing the same block twice + for (Iterator k = txns[i].iterator(); k.hasNext(); ) { + BlockIo block = (BlockIo)k.next(); + if ( blockList.contains( block ) ) { + block.decrementTransactionCount(); + } + else { + writtenBlocks++; + boolean result = blockList.add( block ); + } + numBlocks++; + } + + txns[i] = null; + } + // Write the blocks from the blockList to disk + synchronizeBlocks(blockList.iterator(), true); + + owner.sync(); + open(); + } + + + /** Opens the log file */ + private void open() throws IOException { + fos = new FileOutputStream(makeLogName()); + oos = new ObjectOutputStream(fos); + oos.writeShort(Magic.LOGFILE_HEADER); + oos.flush(); + curTxn = -1; + } + + /** Startup recovery on all files */ + private void recover() throws IOException { + String logName = makeLogName(); + File logFile = new File(logName); + if (!logFile.exists()) + return; + if (logFile.length() == 0) { + logFile.delete(); + return; + } + + FileInputStream fis = new FileInputStream(logFile); + ObjectInputStream ois = new ObjectInputStream(fis); + + try { + if (ois.readShort() != Magic.LOGFILE_HEADER) + throw new Error("Bad magic on log file"); + } catch (IOException e) { + // corrupted/empty logfile + logFile.delete(); + return; + } + + while (true) { + ArrayList blocks = null; + try { + blocks = (ArrayList) ois.readObject(); + } catch (ClassNotFoundException e) { + throw new Error("Unexcepted exception: " + e); + } catch (IOException e) { + // corrupted logfile, ignore rest of transactions + break; + } + synchronizeBlocks(blocks.iterator(), false); + + // ObjectInputStream must match exactly each + // ObjectOutputStream created during writes + try { + ois = new ObjectInputStream(fis); + } catch (IOException e) { + // corrupted logfile, ignore rest of transactions + break; + } + } + owner.sync(); + logFile.delete(); + } + + /** Synchronizes the indicated blocks with the owner. */ + private void synchronizeBlocks(Iterator blockIterator, boolean fromCore) + throws IOException { + // write block vector elements to the data file. + while ( blockIterator.hasNext() ) { + BlockIo cur = (BlockIo)blockIterator.next(); + owner.synch(cur); + if (fromCore) { + cur.decrementTransactionCount(); + if (!cur.isInTransaction()) { + owner.releaseFromTransaction(cur, true); + } + } + } + } + + + /** Set clean flag on the blocks. */ + private void setClean(ArrayList blocks) + throws IOException { + for (Iterator k = blocks.iterator(); k.hasNext(); ) { + BlockIo cur = (BlockIo) k.next(); + cur.setClean(); + } + } + + /** Discards the indicated blocks and notify the owner. */ + private void discardBlocks(ArrayList blocks) + throws IOException { + for (Iterator k = blocks.iterator(); k.hasNext(); ) { + BlockIo cur = (BlockIo) k.next(); + cur.decrementTransactionCount(); + if (!cur.isInTransaction()) { + owner.releaseFromTransaction(cur, false); + } + } + } + + /** + * Starts a transaction. This can block if all slots have been filled + * with full transactions, waiting for the synchronization thread to + * clean out slots. + */ + void start() throws IOException { + curTxn++; + if (curTxn == _maxTxns) { + synchronizeLogFromMemory(); + curTxn = 0; + } + txns[curTxn] = new ArrayList(); + } + + /** + * Indicates the block is part of the transaction. + */ + void add(BlockIo block) throws IOException { + block.incrementTransactionCount(); + txns[curTxn].add(block); + } + + /** + * Commits the transaction to the log file. + */ + void commit() throws IOException { + oos.writeObject(txns[curTxn]); + sync(); + + // set clean flag to indicate blocks have been written to log + setClean(txns[curTxn]); + + // open a new ObjectOutputStream in order to store + // newer states of BlockIo + oos = new ObjectOutputStream(fos); + } + + /** Flushes and syncs */ + private void sync() throws IOException { + oos.flush(); + fos.flush(); + fos.getFD().sync(); + } + + /** + * Shutdowns the transaction manager. Resynchronizes outstanding + * logs. + */ + void shutdown() throws IOException { + synchronizeLogFromMemory(); + close(); + } + + /** + * Closes open files. + */ + private void close() throws IOException { + sync(); + oos.close(); + fos.close(); + oos = null; + fos = null; + } + + /** + * Force closing the file without synchronizing pending transaction data. + * Used for testing purposes only. + */ + void forceClose() throws IOException { + oos.close(); + fos.close(); + oos = null; + fos = null; + } + + /** + * Use the disk-based transaction log to synchronize the data file. + * Outstanding memory logs are discarded because they are believed + * to be inconsistent. + */ + void synchronizeLogFromDisk() throws IOException { + close(); + + for ( int i=0; i < _maxTxns; i++ ) { + if (txns[i] == null) + continue; + discardBlocks(txns[i]); + txns[i] = null; + } + + recover(); + open(); + } + + + /** INNER CLASS. + * Comparator class for use by the tree set used to store the blocks + * to write for this transaction. The BlockIo objects are ordered by + * their blockIds. + */ + public static class BlockIoComparator + implements Comparator + { + + public int compare( Object o1, Object o2 ) { + BlockIo block1 = (BlockIo)o1; + BlockIo block2 = (BlockIo)o2; + int result = 0; + if ( block1.getBlockId() == block2.getBlockId() ) { + result = 0; + } + else if ( block1.getBlockId() < block2.getBlockId() ) { + result = -1; + } + else { + result = 1; + } + return result; + } + + public boolean equals(Object obj) { + return super.equals(obj); + } + } // class BlockIOComparator + +} Added: directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/TranslationPage.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/TranslationPage.java?rev=652410&view=auto ============================================================================== --- directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/TranslationPage.java (added) +++ directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/TranslationPage.java Wed Apr 30 17:06:41 2008 @@ -0,0 +1,91 @@ +/** + * JDBM LICENSE v1.00 + * + * Redistribution and use of this software and associated documentation + * ("Software"), with or without modification, are permitted provided + * that the following conditions are met: + * + * 1. Redistributions of source code must retain copyright + * statements and notices. Redistributions must also contain a + * copy of this document. + * + * 2. Redistributions in binary form must reproduce the + * above copyright notice, this list of conditions and the + * following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * 3. The name "JDBM" must not be used to endorse or promote + * products derived from this Software without prior written + * permission of Cees de Groot. For written permission, + * please contact cg@cdegroot.com. + * + * 4. Products derived from this Software may not be called "JDBM" + * nor may "JDBM" appear in their names without prior written + * permission of Cees de Groot. + * + * 5. Due credit should be given to the JDBM Project + * (http://jdbm.sourceforge.net/). + * + * THIS SOFTWARE IS PROVIDED BY THE JDBM PROJECT AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT + * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * CEES DE GROOT OR ANY CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Copyright 2000 (C) Cees de Groot. All Rights Reserved. + * Contributions are Copyright (C) 2000 by their associated contributors. + * + * $Id: TranslationPage.java,v 1.1 2000/05/06 00:00:31 boisvert Exp $ + */ + +package jdbm.recman; + +/** + * Class describing a page that holds translations from physical rowids + * to logical rowids. In fact, the page just holds physical rowids - the + * page's block is the block for the logical rowid, the offset serve + * as offset for the rowids. + */ +final class TranslationPage extends PageHeader { + // offsets + static final short O_TRANS = PageHeader.SIZE; // short count + static final short ELEMS_PER_PAGE = + (RecordFile.BLOCK_SIZE - O_TRANS) / PhysicalRowId.SIZE; + + // slots we returned. + final PhysicalRowId[] slots = new PhysicalRowId[ELEMS_PER_PAGE]; + + /** + * Constructs a data page view from the indicated block. + */ + TranslationPage(BlockIo block) { + super(block); + } + + /** + * Factory method to create or return a data page for the + * indicated block. + */ + static TranslationPage getTranslationPageView(BlockIo block) { + BlockView view = block.getView(); + if (view != null && view instanceof TranslationPage) + return (TranslationPage) view; + else + return new TranslationPage(block); + } + + /** Returns the value of the indicated rowid on the page */ + PhysicalRowId get(short offset) { + int slot = (offset - O_TRANS) / PhysicalRowId.SIZE; + if (slots[slot] == null) + slots[slot] = new PhysicalRowId(block, offset); + return slots[slot]; + } +} Added: directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/package.html URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/package.html?rev=652410&view=auto ============================================================================== --- directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/package.html (added) +++ directory/apacheds/branches/bigbang/apacheds-jdbm/src/main/java/jdbm/recman/package.html Wed Apr 30 17:06:41 2008 @@ -0,0 +1,12 @@ + + + +

Core classes for managing persistent objects and processing transactions.

+ +
+
Version:
$Revision: 1.1 $ $Date: 2001/05/19 16:01:33 $
+
Author:
Alex Boisvert
+
+ + + Modified: directory/apacheds/branches/bigbang/bootstrap-plugin/src/main/java/org/apache/directory/server/core/bootstrap/plugin/BootstrapPlugin.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/bootstrap-plugin/src/main/java/org/apache/directory/server/core/bootstrap/plugin/BootstrapPlugin.java?rev=652410&r1=652409&r2=652410&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/bootstrap-plugin/src/main/java/org/apache/directory/server/core/bootstrap/plugin/BootstrapPlugin.java (original) +++ directory/apacheds/branches/bigbang/bootstrap-plugin/src/main/java/org/apache/directory/server/core/bootstrap/plugin/BootstrapPlugin.java Wed Apr 30 17:06:41 2008 @@ -53,7 +53,6 @@ import org.apache.directory.shared.ldap.constants.SchemaConstants; import org.apache.directory.shared.ldap.entry.Modification; import org.apache.directory.shared.ldap.entry.ModificationOperation; -import org.apache.directory.shared.ldap.message.AttributesImpl; import org.apache.directory.shared.ldap.name.LdapDN; import org.apache.directory.shared.ldap.schema.AttributeType; import org.apache.directory.shared.ldap.schema.MatchingRule; @@ -68,7 +67,6 @@ import org.codehaus.plexus.util.FileUtils; import javax.naming.NamingException; -import javax.naming.directory.Attributes; import java.io.File; import java.io.FileWriter; @@ -155,7 +153,7 @@ private String[] indexedAttributes; /** - * Facotry used to create attributes objects from schema entities. + * Factory used to create attributes objects from schema entities. */ private AttributesFactory attributesFactory = new AttributesFactory(); @@ -183,7 +181,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { File packageDirectory = new File( outputDirectory, outputPackage.replace( '.', File.separatorChar ) ); - + if ( !packageDirectory.exists() ) { packageDirectory.mkdirs(); @@ -191,7 +189,7 @@ // delete output directory if it exists File schemaDirectory = new File( packageDirectory, "schema" ); - + if ( schemaDirectory.exists() ) { try @@ -201,20 +199,19 @@ catch ( IOException e ) { throw new MojoFailureException( "Failed to delete old schema partition folder " - + schemaDirectory.getAbsolutePath() + ": " + e.getMessage() ); + + schemaDirectory.getAbsolutePath() + ": " + e.getMessage() ); } } initializeSchemas(); - + try { initializePartition( schemaDirectory ); } catch ( NamingException ne ) { - throw new MojoFailureException( "Failed to initialize the root partition :" + - ne.getMessage() ); + throw new MojoFailureException( "Failed to initialize the root partition :" + ne.getMessage() ); } try @@ -224,7 +221,7 @@ if ( !hasEntry( dn ) ) { - Attributes entry = new AttributesImpl(); + ServerEntry entry = new DefaultServerEntry( registries, dn ); entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC ); entry.get( SchemaConstants.OBJECT_CLASS_AT ).add( SchemaConstants.ORGANIZATIONAL_UNIT_OC ); entry.put( SchemaConstants.OU_AT, "schema" ); @@ -257,12 +254,11 @@ getLog().info( "" ); getLog().info( "------------------------------------------------------------------------" ); } - + createSchemaModificationAttributesEntry(); } catch ( NamingException e ) { - e.printStackTrace(); throw new MojoFailureException( "Failed to add syntaxCheckers to partition: " + e.getMessage() ); } @@ -279,7 +275,6 @@ // Create db file listing and place it into the right package on disk // ------------------------------------------------------------------ - File listingFile = new File( packageDirectory, listingFileName ); PrintWriter out = null; try @@ -306,18 +301,19 @@ } } + private static final String[] OTHER_SCHEMA_DEPENDENCIES = new String[] + { "system", "core", "apache", "apachemeta" }; + - private static final String[] OTHER_SCHEMA_DEPENDENCIES = new String[] { "system", "core", "apache", "apachemeta" }; - private void createSchemasAndContainers() throws NamingException { Map schemaMap = this.registries.getLoadedSchemas(); - - for ( Schema schema:schemaMap.values() ) + + for ( Schema schema : schemaMap.values() ) { createSchemaAndContainers( schema ); } - + Schema other = new Schema() { public String[] getDependencies() @@ -325,96 +321,102 @@ return OTHER_SCHEMA_DEPENDENCIES; } + public String getOwner() { return "uid=admin,ou=system"; } + public String getSchemaName() { return "other"; } + public boolean isDisabled() { return false; } }; - + createSchemaAndContainers( other ); } private void createSchemaAndContainers( Schema schema ) throws NamingException { - LdapDN dn = new LdapDN( SchemaConstants.CN_AT + "=" - + schema.getSchemaName() + "," + SchemaConstants.OU_AT + "=schema" ); + LdapDN dn = new LdapDN( SchemaConstants.CN_AT + "=" + schema.getSchemaName() + "," + SchemaConstants.OU_AT + + "=schema" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); if ( hasEntry( dn ) ) { return; } - - Attributes entry = attributesFactory.getAttributes( schema ); + + ServerEntry entry = attributesFactory.getAttributes( schema, registries ); + entry.setDn( dn ); store.add( dn, entry ); - + + dn = ( LdapDN ) dn.clone(); + dn.add( SchemaConstants.OU_AT + "=comparators" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=normalizers" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=syntaxCheckers" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=syntaxes" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=matchingRules" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=attributeTypes" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=objectClasses" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=nameForms" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=ditStructureRules" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=ditContentRules" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - + dn.remove( dn.size() - 1 ); dn.add( SchemaConstants.OU_AT + "=matchingRuleUse" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); } - + private void addAttributeTypes() throws NamingException { getLog().info( "------------------------------------------------------------------------" ); @@ -423,9 +425,9 @@ getLog().info( "" ); AttributeTypeRegistry attributeTypeRegistry = registries.getAttributeTypeRegistry(); - + Iterator ii = attributeTypeRegistry.iterator(); - + while ( ii.hasNext() ) { AttributeType at = ii.next(); @@ -436,12 +438,13 @@ dn.add( SchemaConstants.OU_AT + "=attributeTypes" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - Attributes entry = attributesFactory.getAttributes( at, schema ); + ServerEntry entry = attributesFactory.getAttributes( at, schema, registries ); dn.add( MetaSchemaConstants.M_OID_AT + "=" + at.getOid() ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); + entry.setDn( dn ); store.add( dn, entry ); } - + getLog().info( "" ); } @@ -455,7 +458,7 @@ ObjectClassRegistry objectClassRegistry = registries.getObjectClassRegistry(); Iterator ii = objectClassRegistry.iterator(); - + while ( ii.hasNext() ) { ObjectClass oc = ii.next(); @@ -466,12 +469,13 @@ dn.add( SchemaConstants.OU_AT + "=objectClasses" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - Attributes entry = attributesFactory.getAttributes( oc, schema ); + ServerEntry entry = attributesFactory.getAttributes( oc, schema, registries ); dn.add( MetaSchemaConstants.M_OID_AT + "=" + oc.getOid() ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); + entry.setDn( dn ); store.add( dn, entry ); } - + getLog().info( "" ); } @@ -485,7 +489,7 @@ MatchingRuleRegistry matchingRuleRegistry = registries.getMatchingRuleRegistry(); Iterator ii = matchingRuleRegistry.iterator(); - + while ( ii.hasNext() ) { MatchingRule mr = ii.next(); @@ -496,12 +500,13 @@ dn.add( SchemaConstants.OU_AT + "=matchingRules" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - Attributes entry = attributesFactory.getAttributes( mr, schema ); + ServerEntry entry = attributesFactory.getAttributes( mr, schema, registries ); dn.add( MetaSchemaConstants.M_OID_AT + "=" + mr.getOid() ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); + entry.setDn( dn ); store.add( dn, entry ); } - + getLog().info( "" ); } @@ -515,7 +520,7 @@ ComparatorRegistry comparatorRegistry = registries.getComparatorRegistry(); Iterator ii = comparatorRegistry.oidIterator(); - + while ( ii.hasNext() ) { String oid = ii.next(); @@ -526,9 +531,11 @@ dn.add( SchemaConstants.OU_AT + "=comparators" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - Attributes entry = attributesFactory.getAttributes( oid, comparatorRegistry.lookup( oid ), schema ); + ServerEntry entry = attributesFactory.getAttributes( oid, comparatorRegistry.lookup( oid ), schema, + registries ); dn.add( MetaSchemaConstants.M_OID_AT + "=" + oid ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); + entry.setDn( dn ); store.add( dn, entry ); } getLog().info( "" ); @@ -544,7 +551,7 @@ NormalizerRegistry normalizerRegistry = registries.getNormalizerRegistry(); Iterator ii = normalizerRegistry.oidIterator(); - + while ( ii.hasNext() ) { String oid = ii.next(); @@ -555,12 +562,14 @@ dn.add( SchemaConstants.OU_AT + "=normalizers" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - Attributes entry = attributesFactory.getAttributes( oid, normalizerRegistry.lookup( oid ), schema ); + ServerEntry entry = attributesFactory.getAttributes( oid, normalizerRegistry.lookup( oid ), schema, + registries ); dn.add( MetaSchemaConstants.M_OID_AT + "=" + oid ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); + entry.setDn( dn ); store.add( dn, entry ); } - + getLog().info( "" ); } @@ -574,7 +583,7 @@ SyntaxRegistry syntaxRegistry = registries.getSyntaxRegistry(); Iterator ii = syntaxRegistry.iterator(); - + while ( ii.hasNext() ) { Syntax syntax = ii.next(); @@ -584,9 +593,10 @@ dn.add( SchemaConstants.OU_AT + "=syntaxes" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - Attributes entry = attributesFactory.getAttributes( syntax, schema ); + ServerEntry entry = attributesFactory.getAttributes( syntax, schema, registries ); dn.add( MetaSchemaConstants.M_OID_AT + "=" + syntax.getOid() ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); + entry.setDn( dn ); store.add( dn, entry ); } getLog().info( "" ); @@ -602,7 +612,7 @@ SyntaxCheckerRegistry syntaxCheckerRegistry = registries.getSyntaxCheckerRegistry(); Iterator ii = syntaxCheckerRegistry.iterator(); - + while ( ii.hasNext() ) { SyntaxChecker syntaxChecker = ii.next(); @@ -613,12 +623,13 @@ dn.add( SchemaConstants.OU_AT + "=syntaxCheckers" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); checkCreateContainer( dn ); - Attributes entry = attributesFactory.getAttributes( syntaxChecker, schema ); + ServerEntry entry = attributesFactory.getAttributes( syntaxChecker, schema, registries ); dn.add( MetaSchemaConstants.M_OID_AT + "=" + syntaxChecker.getSyntaxOid() ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); + entry.setDn( dn ); store.add( dn, entry ); } - + getLog().info( "" ); } @@ -640,28 +651,27 @@ // add the indices Set userIndices = new HashSet(); - - for ( String indexedAttribute:indexedAttributes ) + + for ( String indexedAttribute : indexedAttributes ) { JdbmIndex index = new JdbmIndex(); index.setAttributeId( indexedAttribute ); userIndices.add( index ); } - + store.setUserIndices( userIndices ); ServerEntry rootEntry = new DefaultServerEntry( registries, new LdapDN( ServerDNConstants.OU_SCHEMA_DN ) ); - rootEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.ORGANIZATIONAL_UNIT_OC ); + rootEntry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, SchemaConstants.ORGANIZATIONAL_UNIT_OC ); rootEntry.put( SchemaConstants.OU_AT, "schema" ); store.setContextEntry( rootEntry ); try { - store.init( this.registries.getOidRegistry(), this.registries.getAttributeTypeRegistry() ); + store.init( this.registries ); } catch ( NamingException e ) { - e.printStackTrace(); throw new MojoFailureException( "Failed to initialize parition: " + e.getMessage() ); } } @@ -677,29 +687,28 @@ */ private void createSchemaModificationAttributesEntry() throws NamingException { - Attributes entry = new AttributesImpl( - SchemaConstants.OBJECT_CLASS_AT, - ApacheSchemaConstants.SCHEMA_MODIFICATION_ATTRIBUTES_OC, - true ); - entry.get( SchemaConstants.OBJECT_CLASS_AT ).add( SchemaConstants.TOP_OC ); - + ServerEntry entry = new DefaultServerEntry( registries ); + entry.put( SchemaConstants.OBJECT_CLASS_AT, ApacheSchemaConstants.SCHEMA_MODIFICATION_ATTRIBUTES_OC, + SchemaConstants.TOP_OC ); + entry.put( ApacheSchemaConstants.SCHEMA_MODIFIERS_NAME_AT, ADMIN_NORM_NAME ); entry.put( SchemaConstants.MODIFIERS_NAME_AT, ADMIN_NORM_NAME ); entry.put( SchemaConstants.CREATORS_NAME_AT, ADMIN_NORM_NAME ); - + entry.put( ApacheSchemaConstants.SCHEMA_MODIFY_TIMESTAMP_AT, DateUtils.getGeneralizedTime() ); entry.put( SchemaConstants.MODIFY_TIMESTAMP_AT, DateUtils.getGeneralizedTime() ); entry.put( SchemaConstants.CREATE_TIMESTAMP_AT, DateUtils.getGeneralizedTime() ); - + entry.put( SchemaConstants.CN_AT, "schemaModifications" ); entry.put( ApacheSchemaConstants.SUBSCHEMA_SUBENTRY_NAME_AT, "cn=schema" ); - + LdapDN normName = new LdapDN( "cn=schemaModifications,ou=schema" ); normName.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); + entry.setDn( normName ); store.add( normName, entry ); } - - + + /** * Loads all the bootstrap schemas into the registries in preparation for * loading them into the schema partition. @@ -734,21 +743,22 @@ ClassLoader parent = getClass().getClassLoader(); URL[] urls = new URL[classpathElements.size()]; int i = 0; - - for ( String classpathElement:classpathElements ) + + for ( String classpathElement : classpathElements ) { try { urls[i++] = new File( classpathElement ).toURI().toURL(); - } + } catch ( MalformedURLException e ) { - throw ( MojoFailureException ) new MojoFailureException( "Could not construct classloader: " ).initCause( e ); + throw ( MojoFailureException ) new MojoFailureException( "Could not construct classloader: " ) + .initCause( e ); } } - + ClassLoader cl = new URLClassLoader( urls, parent ); - + for ( int ii = 0; ii < bootstrapSchemaClasses.length; ii++ ) { try @@ -760,32 +770,34 @@ catch ( ClassNotFoundException e ) { getLog().info( "ClassLoader " + getClass().getClassLoader() ); - getLog().info( "ClassLoader URLs: " + Arrays.asList( ( ( URLClassLoader ) getClass().getClassLoader() ).getURLs() ) ); + getLog() + .info( + "ClassLoader URLs: " + + Arrays.asList( ( ( URLClassLoader ) getClass().getClassLoader() ).getURLs() ) ); e.printStackTrace(); - throw new MojoFailureException( "Could not find BootstrapSchema class: " - + bootstrapSchemaClasses[ii] ); + throw new MojoFailureException( "Could not find BootstrapSchema class: " + bootstrapSchemaClasses[ii] ); } catch ( InstantiationException e ) { e.printStackTrace(); throw new MojoFailureException( "Could not instantiate BootstrapSchema class: " - + bootstrapSchemaClasses[ii] ); + + bootstrapSchemaClasses[ii] ); } catch ( IllegalAccessException e ) { e.printStackTrace(); throw new MojoFailureException( "Could not instantiate BootstrapSchema class due to security: " - + bootstrapSchemaClasses[ii] ); + + bootstrapSchemaClasses[ii] ); } getLog().info( "\t" + bootstrapSchemaClasses[ii] ); } - + getLog().info( "" ); BootstrapSchemaLoader loader = new BootstrapSchemaLoader( cl ); registries = new DefaultRegistries( "bootstrap", loader, new DefaultOidRegistry() ); - + try { loader.loadWithDependencies( schemas.values(), registries ); @@ -802,24 +814,24 @@ private void checkCreateContainer( LdapDN dn ) throws NamingException { - if ( hasEntry( dn ) ) + LdapDN clonedDn = ( LdapDN ) dn.clone(); + + if ( hasEntry( clonedDn ) ) { return; } - Attributes entry = new AttributesImpl(); - entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC ); - entry.get( SchemaConstants.OBJECT_CLASS_AT ).add( SchemaConstants.ORGANIZATIONAL_UNIT_OC ); - entry.put( SchemaConstants.OU_AT, dn.getRdn().getValue() ); - store.add( dn, entry ); + ServerEntry entry = new DefaultServerEntry( registries, clonedDn ); + entry.put( SchemaConstants.OBJECT_CLASS_AT, SchemaConstants.TOP_OC, SchemaConstants.ORGANIZATIONAL_UNIT_OC ); + entry.put( SchemaConstants.OU_AT, ( String ) clonedDn.getRdn().getValue() ); + store.add( clonedDn, entry ); } private LdapDN checkCreateSchema( String schemaName ) throws NamingException { Schema schema = schemas.get( schemaName ); - LdapDN dn = new LdapDN( SchemaConstants.CN_AT + "=" - + schemaName + "," + SchemaConstants.OU_AT + "=schema" ); + LdapDN dn = new LdapDN( SchemaConstants.CN_AT + "=" + schemaName + "," + SchemaConstants.OU_AT + "=schema" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); if ( hasEntry( dn ) ) @@ -827,7 +839,8 @@ return dn; } - Attributes entry = attributesFactory.getAttributes( schema ); + ServerEntry entry = attributesFactory.getAttributes( schema, registries ); + entry.setDn( dn ); store.add( dn, entry ); return dn; } @@ -835,16 +848,13 @@ private void disableSchema( String schemaName ) throws NamingException { - LdapDN dn = new LdapDN( SchemaConstants.CN_AT + "=" + schemaName - + "," + SchemaConstants.OU_AT + "=schema" ); + LdapDN dn = new LdapDN( SchemaConstants.CN_AT + "=" + schemaName + "," + SchemaConstants.OU_AT + "=schema" ); dn.normalize( registries.getAttributeTypeRegistry().getNormalizerMapping() ); - - Modification mod = new ServerModification( ModificationOperation.ADD_ATTRIBUTE, - new DefaultServerAttribute( - MetaSchemaConstants.M_DISABLED_AT, - registries.getAttributeTypeRegistry().lookup( MetaSchemaConstants.M_DISABLED_AT ), - "TRUE" ) ); - + + Modification mod = new ServerModification( ModificationOperation.ADD_ATTRIBUTE, new DefaultServerAttribute( + MetaSchemaConstants.M_DISABLED_AT, registries.getAttributeTypeRegistry().lookup( + MetaSchemaConstants.M_DISABLED_AT ), "TRUE" ) ); + List mods = new ArrayList(); mods.add( mod ); store.modify( dn, mods ); @@ -866,7 +876,7 @@ private final boolean hasEntry( LdapDN dn ) throws NamingException { Long id = store.getEntryId( dn.toNormName() ); - + return ( id != null ); } @@ -877,18 +887,18 @@ buf.append( "schema/master.db\n" ); Iterator systemIndices = store.systemIndices(); - + while ( systemIndices.hasNext() ) { - Index index = store.getSystemIndex(systemIndices.next() ); + Index index = store.getSystemIndex( systemIndices.next() ); buf.append( "schema/" ); buf.append( index.getAttribute().getName() ); buf.append( ".db\n" ); } buf.append( "[USER INDICES]\n" ); - - for ( String indexedAttribute:indexedAttributes ) + + for ( String indexedAttribute : indexedAttributes ) { buf.append( "schema/" ); buf.append( indexedAttribute ); @@ -897,4 +907,57 @@ return buf; } + + + /** A main to be able to debug the plugin */ + public static void main( String[] args ) throws Exception + { + BootstrapPlugin bp = new BootstrapPlugin(); + + bp.disabledSchemas = new String[] + { "nis", "krb5kdc", "samba", "autofs", "apachedns", "corba", "dhcp", "mozilla" }; + + bp.indexedAttributes = new String[] + { "objectClass", "ou", "cn", "m-oid", "m-disabled" }; + + bp.bootstrapSchemaClasses = new String[] + { "org.apache.directory.server.schema.bootstrap.ApachednsSchema", + "org.apache.directory.server.schema.bootstrap.AutofsSchema", + "org.apache.directory.server.schema.bootstrap.CollectiveSchema", + "org.apache.directory.server.schema.bootstrap.CorbaSchema", + "org.apache.directory.server.schema.bootstrap.CosineSchema", + "org.apache.directory.server.schema.bootstrap.DhcpSchema", + "org.apache.directory.server.schema.bootstrap.InetorgpersonSchema", + "org.apache.directory.server.schema.bootstrap.JavaSchema", + "org.apache.directory.server.schema.bootstrap.Krb5kdcSchema", + "org.apache.directory.server.schema.bootstrap.MozillaSchema", + "org.apache.directory.server.schema.bootstrap.NisSchema", + "org.apache.directory.server.schema.bootstrap.SambaSchema" }; + + bp.outputDirectory = new File( "/tmp" ); + bp.outputPackage = "org.apache.directory.server.schema.bootstrap.partition"; + bp.listingFileName = "DBFILES"; + bp.classpathElements = Arrays + .asList( new String[] + { + "/home/elecharny/apacheds/bb/apacheds/bootstrap-partition/target/classes", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-jdbm-store/1.5.3-SNAPSHOT/apacheds-jdbm-store-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-jdbm/1.5.3-SNAPSHOT/apacheds-jdbm-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/shared/shared-ldap/0.9.11-SNAPSHOT/shared-ldap-0.9.11-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/commons-lang/commons-lang/2.3/commons-lang-2.3.jar", + "/home/elecharny/.m2/repository/commons-collections/commons-collections/3.2/commons-collections-3.2.jar", + "/home/elecharny/.m2/repository/org/apache/directory/shared/shared-asn1/0.9.11-SNAPSHOT/shared-asn1-0.9.11-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/slf4j/slf4j-api/1.4.3/slf4j-api-1.4.3.jar", + "/home/elecharny/.m2/repository/org/apache/directory/shared/shared-ldap-constants/0.9.11-SNAPSHOT/shared-ldap-constants-0.9.11-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/antlr/antlr/2.7.7/antlr-2.7.7.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-core-constants/1.5.3-SNAPSHOT/apacheds-core-constants-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-core-entry/1.5.3-SNAPSHOT/apacheds-core-entry-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-schema-registries/1.5.3-SNAPSHOT/apacheds-schema-registries-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-core-shared/1.5.3-SNAPSHOT/apacheds-core-shared-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-btree-base/1.5.3-SNAPSHOT/apacheds-btree-base-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-bootstrap-extract/1.5.3-SNAPSHOT/apacheds-bootstrap-extract-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-schema-extras/1.5.3-SNAPSHOT/apacheds-schema-extras-1.5.3-SNAPSHOT.jar", + "/home/elecharny/.m2/repository/org/apache/directory/server/apacheds-schema-bootstrap/1.5.3-SNAPSHOT/apacheds-schema-bootstrap-1.5.3-SNAPSHOT.jar" } ); + bp.execute(); + } } Modified: directory/apacheds/branches/bigbang/btree-base/pom.xml URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/btree-base/pom.xml?rev=652410&r1=652409&r2=652410&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/btree-base/pom.xml (original) +++ directory/apacheds/branches/bigbang/btree-base/pom.xml Wed Apr 30 17:06:41 2008 @@ -41,6 +41,12 @@ apacheds-schema-registries ${pom.version} + + + ${pom.groupId} + apacheds-core-entry + ${pom.version} + Modified: directory/apacheds/branches/bigbang/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/IndexRecord.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/IndexRecord.java?rev=652410&r1=652409&r2=652410&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/IndexRecord.java (original) +++ directory/apacheds/branches/bigbang/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/IndexRecord.java Wed Apr 30 17:06:41 2008 @@ -19,8 +19,7 @@ */ package org.apache.directory.server.core.partition.impl.btree; - -import javax.naming.directory.Attributes; +import org.apache.directory.server.core.entry.ServerEntry; /** @@ -34,8 +33,9 @@ { /** The underlying BTree Tuple */ private final Tuple tuple = new Tuple(); - /** The referenced entry if resusitated */ - private Attributes entry = null; + + /** The referenced entry if ressucitated */ + private ServerEntry entry = null; /** @@ -45,7 +45,7 @@ * @param tuple the tuple for the IndexRecord * @param entry the resusitated entry if any */ - public void setTuple( Tuple tuple, Attributes entry ) + public void setTuple( Tuple tuple, ServerEntry entry ) { this.tuple.setKey( tuple.getKey() ); this.tuple.setValue( tuple.getValue() ); @@ -60,7 +60,7 @@ * @param tuple the tuple for the IndexRecord * @param entry the resusitated entry if any */ - public void setSwapped( Tuple tuple, Attributes entry ) + public void setSwapped( Tuple tuple, ServerEntry entry ) { this.tuple.setKey( tuple.getValue() ); this.tuple.setValue( tuple.getKey() ); @@ -118,14 +118,14 @@ * * @return the entry's attributes */ - public Attributes getAttributes() + public ServerEntry getEntry() { if ( entry == null ) { return null; } - return ( Attributes ) entry.clone(); + return ( ServerEntry ) entry.clone(); } @@ -134,7 +134,7 @@ * * @param entry the entry's attributes */ - public void setAttributes( Attributes entry ) + public void setEntry( ServerEntry entry ) { this.entry = entry; } @@ -159,7 +159,7 @@ */ public void copy( IndexRecord record ) { - entry = record.getAttributes(); + entry = record.getEntry(); tuple.setKey( record.getIndexKey() ); tuple.setValue( record.getEntryId() ); } Modified: directory/apacheds/branches/bigbang/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/MasterTable.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/MasterTable.java?rev=652410&r1=652409&r2=652410&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/MasterTable.java (original) +++ directory/apacheds/branches/bigbang/btree-base/src/main/java/org/apache/directory/server/core/partition/impl/btree/MasterTable.java Wed Apr 30 17:06:41 2008 @@ -21,11 +21,12 @@ import javax.naming.NamingException; -import javax.naming.directory.Attributes; + +import org.apache.directory.server.core.entry.ServerEntry; /** - * The master table used to store the Attributes of entries. + * The master table used to store the ServerEntry of entries. * * @author Apache Directory Project * @version $Rev$ @@ -40,36 +41,36 @@ /** - * Gets the Attributes of an entry from this MasterTable. + * Gets the ServerEntry from this MasterTable. * - * @param id the BigInteger id of the entry to retrieve. - * @return the Attributes of the entry with operational attributes and all. + * @param id the Long id of the entry to retrieve. + * @return the ServerEntry with operational attributes and all. * @throws NamingException if there is a read error on the underlying Db. */ - Attributes get( Object id ) throws NamingException; + ServerEntry get( Object id ) throws NamingException; /** - * Puts the Attributes of an entry into this master table at an index + * Puts the ServerEntry into this master table at an index * specified by id. Used both to create new entries and update existing * ones. * - * @param entry the Attributes of entry w/ operational attributes - * @param id the BigInteger id of the entry to put - * @return the newly created entry's Attributes + * @param entry the ServerEntry w/ operational attributes + * @param id the Long id of the entry to put + * @return the newly created ServerEntry * @throws NamingException if there is a write error on the underlying Db. */ - Attributes put( Attributes entry, Object id ) throws NamingException; + ServerEntry put( ServerEntry entry, Object id ) throws NamingException; /** - * Deletes a entry from the master table at an index specified by id. + * Deletes a ServerEntry from the master table at an index specified by id. * - * @param id the BigInteger id of the entry to delete - * @return the Attributes of the deleted entry + * @param id the Long id of the entry to delete + * @return the deleted ServerEntry * @throws NamingException if there is a write error on the underlying Db */ - Attributes delete( Object id ) throws NamingException; + ServerEntry delete( Object id ) throws NamingException; /** @@ -85,7 +86,7 @@ /** * Get's the next value from this SequenceBDb. This has the side-effect of - * changing the current sequence values perminantly in memory and on disk. + * changing the current sequence values permanently in memory and on disk. * * @return the current value incremented by one. * @throws NamingException if the admin table storing sequences cannot be @@ -95,7 +96,7 @@ /** - * Gets a persistant property stored in the admin table of this MasterTable. + * Gets a persistent property stored in the admin table of this MasterTable. * * @param property the key of the property to get the value of * @return the value of the property @@ -105,7 +106,7 @@ /** - * Sets a persistant property stored in the admin table of this MasterTable. + * Sets a persistent property stored in the admin table of this MasterTable. * * @param property the key of the property to set the value of * @param value the value of the property Modified: directory/apacheds/branches/bigbang/core-entry/pom.xml URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/pom.xml?rev=652410&r1=652409&r2=652410&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core-entry/pom.xml (original) +++ directory/apacheds/branches/bigbang/core-entry/pom.xml Wed Apr 30 17:06:41 2008 @@ -41,18 +41,27 @@ ${pom.version} apacheds-schema-registries + ${pom.groupId} ${pom.version} apacheds-schema-bootstrap test + ${pom.groupId} ${pom.version} apacheds-schema-extras test + + + ${pom.groupId} + ${pom.version} + apacheds-jdbm + + Modified: directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerBinaryValue.java URL: http://svn.apache.org/viewvc/directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerBinaryValue.java?rev=652410&r1=652409&r2=652410&view=diff ============================================================================== --- directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerBinaryValue.java (original) +++ directory/apacheds/branches/bigbang/core-entry/src/main/java/org/apache/directory/server/core/entry/ServerBinaryValue.java Wed Apr 30 17:06:41 2008 @@ -115,10 +115,19 @@ public ServerBinaryValue( AttributeType attributeType ) { super(); - assert checkAttributeType( attributeType) == null : logAssert( checkAttributeType( attributeType ) ); + + if ( attributeType == null ) + { + throw new IllegalArgumentException( "The AttributeType parameter should not be null" ); + } try { + if ( attributeType.getSyntax() == null ) + { + throw new IllegalArgumentException( "There is no Syntax associated with this attributeType" ); + } + if ( attributeType.getSyntax().isHumanReadable() ) { LOG.warn( "Treating a value of a human readible attribute {} as binary: ", attributeType.getName() );