package org.prevayler; import org.prevayler.implementation.snapshot.GenericSnapshotManager; import org.prevayler.implementation.snapshot.NullSnapshotManager; public class PrevaylerFactory { private boolean _transientMode; private NullSnapshotManager _nullSnapshotManager; /** * Determines whether the Prevayler created by this factory should be * transient (transientMode = true) or persistent (transientMode = false). * Default is persistent. A transient Prevayler will execute its * Transactions WITHOUT writing them to disk. This is useful for stand-alone * applications which have a "Save" button, for example, or for running * automated tests MUCH faster than with a persistent Prevayler. */ public void configureTransientMode( boolean transientMode){ _transientMode=transientMode; } private void configureNullSnapshotManager( NullSnapshotManager snapshotManager){ _nullSnapshotManager=snapshotManager; } public void configureSnapshotSerializer( JavaSerializer serializer){ configureSnapshotSerializer("snapshot",serializer); } public void configureSnapshotSerializer( XStreamSerializer serializer){ configureSnapshotSerializer("xstreamsnapshot",serializer); } public void configureSnapshotSerializer( SkaringaSerializer serializer){ configureSnapshotSerializer("skaringasnapshot",serializer); } /** * Configure a serialization strategy for snapshots. This may be called any * number of times with different suffixes to configure different strategies * for reading existing snapshots. The first call to this method establishes * the <i>primary</i> strategy, which will be used for writing snapshots as * well as for deep-copying the prevalent system whenever necessary. */ public void configureSnapshotSerializer( String suffix, Serializer serializer){ PrevaylerDirectory.checkValidSnapshotSuffix(suffix); _snapshotSerializers.put(suffix,serializer); if (_primarySnapshotSuffix == null) { _primarySnapshotSuffix=suffix; } } private TransactionPublisher publisher( GenericSnapshotManager snapshotManager) throws IOException { try { if (_remoteServerIpAddress != null) throw new ReturnObject(new ClientPublisher(network(),_remoteServerIpAddress,_remoteServerPort)); if (true) throw new ReturnObject(new CentralPublisher(clock(),censor(snapshotManager),journal())); else throw new ReturnObject(new CentralPublisher(clock(),journal())); throw ReturnHack.returnObject; } catch ( ReturnObject r) { return (TransactionPublisher)r.value; } } private GenericSnapshotManager snapshotManager() throws ClassNotFoundException, IOException { if (_nullSnapshotManager != null) return _nullSnapshotManager; PrevaylerDirectory directory=new PrevaylerDirectory(prevalenceDirectory()); if (!_snapshotSerializers.isEmpty()) return new GenericSnapshotManager(_snapshotSerializers,_primarySnapshotSuffix,prevalentSystem(),directory,journalSerializer()); String snapshotSuffix="snapshot"; JavaSerializer snapshotSerializer=new JavaSerializer(); return new GenericSnapshotManager(Collections.singletonMap(snapshotSuffix,snapshotSerializer),snapshotSuffix,prevalentSystem(),directory,journalSerializer()); } protected static void hook69( Serializable newPrevalentSystem, PrevaylerFactory factory){ factory.configureNullSnapshotManager(new NullSnapshotManager(newPrevalentSystem,"Transient Prevaylers are unable to take snapshots.")); factory.configureTransientMode(true); original(newPrevalentSystem,factory); } protected static void hook70( PrevaylerFactory factory){ factory.configureTransientMode(true); original(factory); } @MethodObject static class PrevaylerFactory_create { protected void hook71() throws IOException, ClassNotFoundException { if (true) throw new ReturnObject(new PrevaylerImpl(snapshotManager,publisher,_this.journalSerializer())); else throw new ReturnObject(new PrevaylerImpl(publisher,_this.journalSerializer())); original(); } protected void hook72() throws IOException, ClassNotFoundException { if (true) publisher=_this.publisher(snapshotManager); else publisher=_this.publisher(); original(); } protected void hook73() throws IOException, ClassNotFoundException { snapshotManager=_this.snapshotManager(); original(); } } @MethodObject static class PrevaylerFactory_journal { protected void hook74() throws IOException { if (_this._transientMode) { original(); } else { directory=new PrevaylerDirectory(_this.prevalenceDirectory()); if (true) throw new ReturnObject(new PersistentJournal(directory,_this._journalSizeThreshold,_this._journalAgeThreshold,_this.journalSuffix(),_this.monitor())); else throw new ReturnObject(new PersistentJournal(directory,_this._journalSizeThreshold,_this._journalAgeThreshold,_this.journalSuffix())); } } } }