KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > openejb > core > stateful > RAFPassivater


1 /**
2  * Redistribution and use of this software and associated documentation
3  * ("Software"), with or without modification, are permitted provided
4  * that the following conditions are met:
5  *
6  * 1. Redistributions of source code must retain copyright
7  * statements and notices. Redistributions must also contain a
8  * copy of this document.
9  *
10  * 2. Redistributions in binary form must reproduce the
11  * above copyright notice, this list of conditions and the
12  * following disclaimer in the documentation and/or other
13  * materials provided with the distribution.
14  *
15  * 3. The name "Exolab" must not be used to endorse or promote
16  * products derived from this Software without prior written
17  * permission of Exoffice Technologies. For written permission,
18  * please contact info@exolab.org.
19  *
20  * 4. Products derived from this Software may not be called "Exolab"
21  * nor may "Exolab" appear in their names without prior written
22  * permission of Exoffice Technologies. Exolab is a registered
23  * trademark of Exoffice Technologies.
24  *
25  * 5. Due credit should be given to the Exolab Project
26  * (http://www.exolab.org/).
27  *
28  * THIS SOFTWARE IS PROVIDED BY EXOFFICE TECHNOLOGIES AND CONTRIBUTORS
29  * ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
30  * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
31  * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
32  * EXOFFICE TECHNOLOGIES OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
33  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
34  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
36  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
37  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
38  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
39  * OF THE POSSIBILITY OF SUCH DAMAGE.
40  *
41  * Copyright 1999 (C) Exoffice Technologies Inc. All Rights Reserved.
42  *
43  * $Id: RAFPassivater.java 2487 2006-02-22 22:05:03Z dblevins $
44  */

45
46
47 package org.openejb.core.stateful;
48
49
50 import java.io.RandomAccessFile JavaDoc;
51 import java.io.File JavaDoc;
52 import java.util.Enumeration JavaDoc;
53 import java.util.Hashtable JavaDoc;
54 import java.util.Properties JavaDoc;
55
56 import org.openejb.spi.Serializer;
57
58
59 // optimization: replace HashTable with HashMap (vc no debug hashmap)
60
public class RAFPassivater implements PassivationStrategy{
61
62     int fileID = 0;
63     Hashtable JavaDoc masterTable = new Hashtable JavaDoc();
64
65     static class Pointer {
66         int fileid;
67         long filepointer;
68         int bytesize;
69         public Pointer(int file, long pointer, int bytecount){
70             fileid = file;
71             filepointer = pointer;
72             bytesize = bytecount;
73         }
74     }
75
76     public void init(Properties JavaDoc props) throws org.openejb.SystemException {}
77
78
79     public synchronized void passivate(Hashtable JavaDoc stateTable)
80     throws org.openejb.SystemException{
81         try{
82             fileID++;
83
84             RandomAccessFile JavaDoc ras = new RandomAccessFile JavaDoc(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation"+fileID+".ser","rw");
85             Enumeration JavaDoc enumeration = stateTable.keys();
86             Pointer lastPointer = null;
87             while(enumeration.hasMoreElements()){
88                 Object JavaDoc id = enumeration.nextElement();
89                 Object JavaDoc obj = stateTable.get(id);
90                 byte [] bytes = Serializer.serialize(obj);
91                 long filepointer = ras.getFilePointer();
92
93                 if( lastPointer == null ) lastPointer = new Pointer(fileID, filepointer, (int)(filepointer));
94                 else lastPointer = new Pointer(fileID, filepointer, (int)(filepointer-lastPointer.filepointer));
95
96                 masterTable.put(id,lastPointer);
97                 ras.write(bytes);
98             }
99             ras.close( );
100         }catch(Exception JavaDoc e){
101             throw new org.openejb.SystemException(e);
102         }
103     }
104
105     public synchronized Object JavaDoc activate(Object JavaDoc primaryKey)
106     throws org.openejb.SystemException{
107
108         Pointer pointer = (Pointer)masterTable.get(primaryKey);
109         if(pointer == null)
110             return null;
111
112         try{
113             RandomAccessFile JavaDoc ras = new RandomAccessFile JavaDoc(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation"+pointer.fileid+".ser","r");
114             byte [] bytes = new byte[(int)pointer.bytesize];
115             ras.seek(pointer.filepointer);
116             ras.readFully(bytes);
117             ras.close();
118             return Serializer.deserialize(bytes);
119         }catch(Exception JavaDoc e){
120             throw new org.openejb.SystemException(e);
121         }
122
123     }
124
125 }
Popular Tags