All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.openejb.core.managed.RAFPassivater Maven / Gradle / Ivy

There is a newer version: 4.7.5
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.openejb.core.managed;

import org.apache.openejb.spi.Serializer;

import java.io.File;
import java.io.RandomAccessFile;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Properties;
import java.util.Map;
import java.util.Iterator;

// optimization: replace HashTable with HashMap (vc no debug hashmap)

public class RAFPassivater implements PassivationStrategy {

    int fileID = 0;
    Hashtable masterTable = new Hashtable();

    static class Pointer {
        int fileid;
        long filepointer;
        int bytesize;

        public Pointer(int file, long pointer, int bytecount) {
            fileid = file;
            filepointer = pointer;
            bytesize = bytecount;
        }
    }

    public void init(Properties props) throws org.apache.openejb.SystemException {
    }

    public synchronized void passivate(Map stateTable)
            throws org.apache.openejb.SystemException {
        try {
            fileID++;

            RandomAccessFile ras = new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + fileID + ".ser", "rw");
            Iterator iterator = stateTable.keySet().iterator();
            Pointer lastPointer = null;
            while (iterator.hasNext()) {
                Object id = iterator.next();
                Object obj = stateTable.get(id);
                byte [] bytes = Serializer.serialize(obj);
                long filepointer = ras.getFilePointer();

                if (lastPointer == null) lastPointer = new Pointer(fileID, filepointer, (int) (filepointer));
                else
                    lastPointer = new Pointer(fileID, filepointer, (int) (filepointer - lastPointer.filepointer));

                masterTable.put(id, lastPointer);
                ras.write(bytes);
            }
            ras.close();
        } catch (Exception e) {
            throw new org.apache.openejb.SystemException(e);
        }
    }

    public synchronized Object activate(Object primaryKey)
            throws org.apache.openejb.SystemException {

        Pointer pointer = (Pointer) masterTable.get(primaryKey);
        if (pointer == null)
            return null;

        try {
            RandomAccessFile ras = new RandomAccessFile(System.getProperty("java.io.tmpdir", File.separator + "tmp") + File.separator + "passivation" + pointer.fileid + ".ser", "r");
            byte [] bytes = new byte[(int) pointer.bytesize];
            ras.seek(pointer.filepointer);
            ras.readFully(bytes);
            ras.close();
            return Serializer.deserialize(bytes);
        } catch (Exception e) {
            throw new org.apache.openejb.SystemException(e);
        }

    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy