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

net.fwbrasil.activate.storage.prevalent.PrevalentStorage.scala Maven / Gradle / Ivy

The newest version!
package net.fwbrasil.activate.storage.prevalent

import java.io.File

import net.fwbrasil.activate.ActivateContext
import net.fwbrasil.activate.entity.BaseEntity
import net.fwbrasil.activate.serialization.Serializer
import net.fwbrasil.activate.storage.Storage
import net.fwbrasil.activate.storage.StorageFactory
import net.fwbrasil.activate.storage.marshalling.StorageValue
import net.fwbrasil.activate.storage.memory.BasePrevalentStorage
import net.fwbrasil.activate.storage.memory.BasePrevalentStorageSystem
import net.fwbrasil.activate.storage.memory.BasePrevalentTransaction
import net.fwbrasil.activate.serialization.javaSerializer

class PrevalentStorage(
    val directory: String,
    val serializer: Serializer = javaSerializer,
    val fileSize: Int = 10 * 1000 * 1000,
    val bufferPoolSize: Int = Runtime.getRuntime.availableProcessors)(implicit val context: ActivateContext)
        extends BasePrevalentStorage[BasePrevalentStorageSystem, BasePrevalentStorageSystem] {

    private var journal: PrevalentJournal = _

    def directAccess = system

    override protected def snapshot(system: BasePrevalentStorageSystem) =
        journal.takeSnapshot(system)

    override protected def recover = {
        if (journal == null) {
            val directoryFile = new File(directory)
            directoryFile.mkdir
            journal = new PrevalentJournal(directoryFile, serializer, fileSize, bufferPoolSize)
        }
        journal.recover
    }

    override protected def logTransaction(
        insertList: Array[((BaseEntity#ID, Class[BaseEntity]), Map[String, StorageValue])],
        updateList: Array[((BaseEntity#ID, Class[BaseEntity]), Map[String, StorageValue])],
        deleteList: Array[(BaseEntity#ID, Class[BaseEntity])]) = {
        val transaction = new BasePrevalentTransaction(context, insertList, updateList, deleteList)
        journal.add(transaction)
    }

}

object PrevalentStorageFactory extends StorageFactory {
    override def buildStorage(getProperty: String => Option[String])(implicit context: ActivateContext): Storage[_] =
        new PrevalentStorage(getProperty("directory").get)
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy