using concurrent::AtomicBoolusing concurrent::AtomicRefusing afConcurrent::AtomicListusing afIoc::Registryusing afIoc::RegistryBuilderusing wisp::MemWispSessionStoreusing wisp::WispSessionStoreusing afBedSheet::BedSheetModuleusing afBedSheet::BedSheetWebModusing afButter::Butterusing afButter::HttpTerminator** Initialises a Bed App without the overhead of starting the 'wisp' web server. ** ** 'BedServer' is a 'const' class so it may be used in multiple threads. Do this to create 'BedClients' in different** threads to make concurrent calls - handy for load testing.constclass BedServer {privateconststatic Log log := Utils.getLog(BedServer#)privateconst AtomicRef reg := AtomicRef()privateconst AtomicBool started := AtomicBool()privateconst AtomicRef moduleName := AtomicRef()privateconst AtomicList modules := AtomicList()** The 'afIoc' registry - read only. Registry registry { get { checkHasStarted; return reg.val }private set { reg.val = it}}** Create a instance of 'BedSheet' with the given qname of either a Pod or a Type. new makeWithName(Str qname){this.moduleName.val = qname}** Create a instance of 'BedSheet' with the given IoC module (usually your web app).new makeWithModule(Type iocModule){this.moduleName.val = iocModule.qname}** Create a instance of 'BedSheet' with the given pod (usually your web app).new makeWithPod(Pod webApp){this.moduleName.val = webApp.name}** Adds an extra (test) module, should you wish to override service behaviour. BedServer addModule(Type iocModule){ checkHasNotStartedthis.modules.add(iocModule)returnthis}** Startup 'afBedSheet' BedServer startup(){ checkHasNotStarted bob := BedSheetWebMod.createBob(moduleName.val, 0) bob.addModules(modules.list) bob.options["bannerText"] = "Alien-Factory BedServer v${typeof.pod.version}, IoC v${Registry#.pod.version}" bob.options["appName"] = "BedServer" registry = bob.build.startup started.val = truereturnthis}** Shutdown 'afBedSheet' BedServer shutdown(){if(started.val) registry.shutdown reg.val = null started.val = false modules.clearreturnthis}** Creates a pack of 'Butter' whose middleware ends with a BedTerminator which makes requests to the Bed app. BedClient makeClient(){ checkHasStartedreturn BedClient(Butter.churnOut( Butter.defaultStack .exclude {it.typeof == HttpTerminator# } .add(BedTerminator(this)) .insert(0, SizzleMiddleware())))}// ---- Registry Methods ----** Helper method - tap into BedSheet's afIoc registry Obj serviceById(Str serviceId){ checkHasStartedreturn registry.serviceById(serviceId)}** Helper method - tap into BedSheet's afIoc registry Obj dependencyByType(Type dependencyType){ checkHasStartedreturn registry.dependencyByType(dependencyType)}** Helper method - tap into BedSheet's afIoc registry Obj autobuild(Type type, Obj?[] ctorArgs := Obj#.emptyList){ checkHasStartedreturn registry.autobuild(type, ctorArgs)}** Helper method - tap into BedSheet's afIoc registry Obj injectIntoFields(Obj service){ checkHasStartedreturn registry.injectIntoFields(service)}// ---- helper methods ----** as called by BedClients - if no reg then we must have been shutdowninternal Void checkHasNotShutdown(){if(reg.val == null)throw Err("${BedServer#.name} has been shutdown!")}private Void checkHasStarted(){if(!started.val)throw Err("${BedServer#.name} has not yet started!")}private Void checkHasNotStarted(){if(started.val)throw Err("${BedServer#.name} has not already been started!")}}