You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by ba...@apache.org on 2002/03/24 10:12:33 UTC
cvs commit: jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl JDBMStorage.java
baliuka 02/03/24 01:12:33
Added: simplestore/src/java/org/apache/commons/simplestore/persistence/impl
JDBMStorage.java
Log:
added JDBM storage
Revision Changes Path
1.1 jakarta-commons-sandbox/simplestore/src/java/org/apache/commons/simplestore/persistence/impl/JDBMStorage.java
Index: JDBMStorage.java
===================================================================
/*
* The Apache Software License, Version 1.1
*
*
* Copyright (c) 2001 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 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 end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache Cocoon" and "Apache Software Foundation" must
* not be used to endorse or promote products derived from this
* software without prior written permission. For written
* permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* nor may "Apache" appear in their name, without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``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 THE APACHE SOFTWARE FOUNDATION OR
* ITS 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.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.simplestore.persistence.impl;
import org.apache.commons.simplestore.cache.Cache;
import org.apache.commons.simplestore.persistence.InternalTransaction;
import org.apache.commons.simplestore.persistence.MetaObject;
import org.apache.commons.simplestore.persistence.MetaClass;
import org.apache.commons.simplestore.persistence.ObjectNotFound;
import org.apache.commons.simplestore.persistence.Persistent;
import org.apache.commons.simplestore.persistence.StorageException;
import org.apache.commons.simplestore.persistence.Context;
import org.apache.commons.simplestore.persistence.IllegalTransactionStateException;
import jdbm.JDBMEnumeration;
import jdbm.JDBMHashtable;
import jdbm.recman.RecordManager;
import java.io.IOException;
import jdbm.helper.Tuple;
import jdbm.helper.TupleBrowser;
import jdbm.helper.MRU;
import jdbm.helper.ObjectCache;
import jdbm.helper.StringComparator;
import jdbm.recman.RecordManager;
import jdbm.btree.BTree;
import jdbm.helper.LongComparator;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.ResourceBundle;
import java.util.Set;
/**
*@author Juozas Baliuka <a href="mailto:baliuka@mwm.lt">
* baliuka@mwm.lt</a>
*@version $Id: JDBMStorage.java,v 1.1 2002/03/24 09:12:33 baliuka Exp $
*/
public class JDBMStorage extends AbstractStorage implements org.apache.commons.simplestore.tools.Constants {
Context context;
RecordManager recman;
java.util.Map openTables = new java.util.Hashtable();
ObjectCache cache;
jdbm.helper.Comparator comparator;
/** Creates a new instance of JDBMStorageManager */
public JDBMStorage(RecordManager recman, ObjectCache cache, jdbm.helper.Comparator comparator) {
this.recman = recman;
this.cache = cache;
this.comparator = comparator;
}
private void clear(){
Thread thred = Thread.currentThread();
openTables.remove(thred);
}
public void close() throws StorageException {
try{
recman.close();
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
BTree getTree(String name)throws StorageException{
try{
Thread thred = Thread.currentThread();
Map table = (Map)openTables.get(thred);
if( table == null ){
table = new java.util.HashMap();
openTables.put(thred,table);
}
BTree tree = (BTree)table.get(name);
if(tree != null)
return tree;
long recid = recman.getNamedObject( name );
if ( recid != 0 ) {
tree = BTree.load( recman, cache, recid );
} else {
tree = new BTree( recman, cache, comparator );
recman.setNamedObject( name, tree.getRecid() );
}
table.put(name,tree);
return tree;
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
protected void createObject(MetaObject properties) throws StorageException {
try{
BTree hashtable = getTree(
properties.getPersistentClass().getName()
);
hashtable.insert(properties.getOID(),properties.getProperties(),false);
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
protected void internalBegin() throws StorageException {
clear();
}
protected void internalCommit() throws StorageException {
try{
recman.commit();
clear();
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
protected void internalRollback() throws StorageException {
try{
recman.rollback();
clear();
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
protected void removeObject(MetaObject properties) throws StorageException {
try{
BTree hashtable = getTree(
properties.getPersistentClass().getName()
);
hashtable.remove(properties.getOID());
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
public java.util.Collection retrieve(Class clasz, int index, Object value) throws StorageException {
try{
BTree tree = getTree(
clasz.getName()
);
Set objects = new HashSet();
MetaClass mClass = context.getMetaClass(clasz);
java.util.Collection tObjects = context.getTransactionManager().getTransaction().getTransactionalObjects();
for( java.util.Iterator i = tObjects.iterator(); i.hasNext(); ){
MetaObject mo = (MetaObject)i.next();
if( mo.getPersistentClass().equals(clasz) ){
if( (value == null) && (mo.getProperty(index) == null) ){
objects.add( mo.getObject() );
continue;
}
if( value != null && value.equals(mo.getProperty(index)) ){
objects.add( mo.getObject() );
}
}
}
Tuple tuple = new Tuple();
TupleBrowser browser = tree.browse();
while ( browser.getNext( tuple ) ) {
Object id = tuple.getKey();
Persistent pc = (Persistent)retrieveObject(clasz,id);
MetaObject mo = pc.getMetaObject();
if( (value == null) && (mo.getProperty(index) == null) ){
objects.add( mo.getObject() );
continue;
}
if( value != null && value.equals(mo.getProperty(index)) ){
objects.add( mo.getObject() );
}
}
return objects;
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
public Set retrieveAll(Class clasz) throws StorageException {
try{
BTree tree = getTree(
clasz.getName()
);
MetaClass mClass = context.getMetaClass(clasz);
Set objects = new HashSet();
java.util.Collection tObjects = context.getTransactionManager().getTransaction().getTransactionalObjects();
for( java.util.Iterator i = tObjects.iterator(); i.hasNext(); ){
MetaObject mo = (MetaObject)i.next();
if( mo.getPersistentClass().equals(clasz) ){
objects.add( mo.getObject() );
}
}
Tuple tuple = new Tuple();
TupleBrowser browser = tree.browse();
while ( browser.getNext( tuple ) ) {
Object id = tuple.getKey();
Persistent pc = (Persistent)retrieveObject(clasz,id);
objects.add( pc );
}
return objects;
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
public Object retrieveObject(Class clasz, Object id) throws StorageException {
try{
Persistent result = (Persistent) context.getCache().get(id);
if (result != null) {
return result;
}
BTree tree = getTree(clasz.getName());
Object obj = tree.find(id);
if( obj == null ){
throw new ObjectNotFound();
}
MetaClass mClass = context.getMetaClass(clasz);
result = (Persistent) mClass.newInstance( id );
MetaObject pc = result.getMetaObject();
Object props[] = pc.getProperties();
System.arraycopy(obj,0,props,0,props.length);
context.getCache().put(id,result);
return result;
}catch(java.io.IOException ioe){
throw new StorageException(ioe.getMessage(),ioe);
}
}
public void setContext(Context context) {
this.context = context;
}
public void storeObject(MetaObject properties) throws StorageException {
createObject(properties);
}
}
--
To unsubscribe, e-mail: <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>