Storing objects w/ jdbm

martijn@cruiser.vo.com writes:
 > Hi,
 > 
 > This isn't really a jigsaw related question, but since jdbm is included
 > with the jigsaw package i'm asking it here anyway.
 > In the original gdbm package in C, it's possible storing/retrieving any
 > datatype. Storing a big structure and retrieving it by casting back to the
 > original datatype is possible. Very handy feature.
 > Would it be possible doing this with jdbm as well? Would there be an easy
 > way to store an object that is an instance of a dataholder class?
 > Right now i see a way to store a String object because the String class
 > defines methods to get a byte array copy of its value and giving it a
 > value using a byte array copy of the desired value. How would i clone a
 > random object to a byte-array so that i can store it using jdbm? And how
 > would i create an instance back from the byte-array to the object?
 > 
 > If anyone already did this, please let me know,

I did: just use the resources base classes along with the
jdbmResourceStore, it does exactly this.

I have attached below an example of such a class...
Anselm.
-----

package w3c.jigsaw.filters;

import java.io.*;
import java.util.*;

import w3c.jigsaw.auth.AuthFilter;
import w3c.jigsaw.http.*;
import w3c.www.http.*;
import w3c.jigsaw.resources.*;

/**
 * We want free pickling, hence the super class.
 */

public class PutedEntry extends AttributeHolder {
    protected static int ATTR_AUTHOR   = -1;
    protected static int ATTR_URL      = -1;
    protected static int ATTR_FILENAME = -1;
    protected static int ATTR_TIME     = -1;

    static {
	Class c = null;
	Attribute a = null;
    
	try {
	    c = Class.forName("w3c.jigsaw.filters.PutedEntry");
	} catch (Exception ex) {
	    ex.printStackTrace();
	    System.exit(1);
	}
	// The author of change:
	a = new StringAttribute("author"
				, null
				, Attribute.EDITABLE);
	ATTR_AUTHOR = AttributeRegistry.registerAttribute(c, a);
	// The mandatory url:
	a = new StringAttribute("url"
				, null
				, Attribute.EDITABLE);
	ATTR_URL = AttributeRegistry.registerAttribute(c, a);
	// The optional absolute file name:
	a = new StringAttribute("filename"
				, null
				, Attribute.EDITABLE);
	ATTR_FILENAME = AttributeRegistry.registerAttribute(c, a);
	// The time of modification:
	a = new LongAttribute("time"
			      , null
			      , Attribute.EDITABLE);
	ATTR_TIME = AttributeRegistry.registerAttribute(c, a);
    }

    final String getAuthor() {
	return getString(ATTR_AUTHOR, null);
    }

    final String getURL() {
	return getString(ATTR_URL, null);
    }

    final String getFilename() {
	return getString(ATTR_FILENAME, null);
    }

    final long getTime() {
	return getLong(ATTR_TIME, -1);
    }

    final String getKey() {
	String key = getFilename();
	if ( key == null )
	    return getURL();
	return key;
    }

    synchronized void update(Request request) {
	String author = (String) request.getState(AuthFilter.STATE_AUTHUSER);
	long   time   = System.currentTimeMillis();
	setValue(ATTR_AUTHOR, author);
	setValue(ATTR_TIME, new Long(time));
    }

    static PutedEntry makeEntry(Request request) {
	HTTPResource r = (HTTPResource) request.getTargetResource();
	if ( r != null ) {
	    // Build an entry:
	    PutedEntry e = new PutedEntry();
	    e.setValue(ATTR_URL, request.getURL().toExternalForm());
	    if ( r instanceof FileResource )
		e.setValue(ATTR_FILENAME
			   , ((FileResource) r).getFile().getAbsolutePath());
	    // Update other infos:
	    e.update(request);
	    return e;
	}
	return null;
    }

}

Received on Monday, 4 November 1996 12:50:14 UTC