package org.prevayler.implementation; import org.prevayler.Clock; import org.prevayler.Prevayler; import org.prevayler.Query; import org.prevayler.SureTransactionWithQuery; import org.prevayler.Transaction; import org.prevayler.TransactionWithQuery; import org.prevayler.foundation.serialization.Serializer; import org.prevayler.implementation.publishing.TransactionPublisher; import java.io.IOException; public class PrevaylerImpl implements Prevayler { private final Clock _clock; private final TransactionPublisher _publisher; private final Serializer _journalSerializer; public PrevaylerImpl( TransactionPublisher transactionPublisher, Serializer journalSerializer) throws IOException, ClassNotFoundException { _publisher=transactionPublisher; _clock=_publisher.clock(); _journalSerializer=journalSerializer; } public Clock clock(){ return _clock; } public void execute( Transaction transaction){ publish(new TransactionCapsule(transaction,_journalSerializer)); } private void publish( Capsule capsule){ _publisher.publish(capsule); } public Object execute( TransactionWithQuery transactionWithQuery) throws Exception { TransactionWithQueryCapsule capsule=new TransactionWithQueryCapsule(transactionWithQuery,_journalSerializer); publish(capsule); return capsule.result(); } public Object execute( SureTransactionWithQuery sureTransactionWithQuery){ try { return execute((TransactionWithQuery)sureTransactionWithQuery); } catch ( RuntimeException runtime) { throw runtime; } catch ( Exception checked) { throw new RuntimeException("Unexpected Exception thrown.",checked); } } public void close() throws IOException { _publisher.close(); } }