From 9e86c4c23b228fe1b46bbad97dd7cdc1704eba3e Mon Sep 17 00:00:00 2001 From: Anton Tarasenko Date: Fri, 15 Jul 2022 03:45:21 +0700 Subject: [PATCH] Add `AcediaAdapter` class `AcediaAdapter` is meant to be a data storage about which classes to use as API for client- and server-globals. --- sources/ClientRealm/ClientGlobal.uc | 1 - .../API/SideEffects/SideEffectAPI.uc | 56 ++------------ .../API/SideEffects/SideEffectAPIBase.uc | 76 +++++++++++++++++++ sources/CoreRealm/AcediaAdapter.uc | 30 ++++++++ sources/CoreRealm/CoreGlobal.uc | 41 +++++++++- sources/ServerRealm/ServerGlobal.uc | 1 - 6 files changed, 153 insertions(+), 52 deletions(-) create mode 100644 sources/CoreRealm/API/SideEffects/SideEffectAPIBase.uc create mode 100644 sources/CoreRealm/AcediaAdapter.uc diff --git a/sources/ClientRealm/ClientGlobal.uc b/sources/ClientRealm/ClientGlobal.uc index 84236bd..c5e57e3 100644 --- a/sources/ClientRealm/ClientGlobal.uc +++ b/sources/ClientRealm/ClientGlobal.uc @@ -21,7 +21,6 @@ */ class ClientGlobal extends CoreGlobal; -var protected bool initialized; // `Global` is expected to behave like a singleton and will store it's // main instance in this variable's default value. var protected ClientGlobal myself; diff --git a/sources/CoreRealm/API/SideEffects/SideEffectAPI.uc b/sources/CoreRealm/API/SideEffects/SideEffectAPI.uc index 614bde1..540ff12 100644 --- a/sources/CoreRealm/API/SideEffects/SideEffectAPI.uc +++ b/sources/CoreRealm/API/SideEffects/SideEffectAPI.uc @@ -1,6 +1,6 @@ /** - * Simple API for managing a list of `SideEffect` info objects: can add, - * remove, return all and by package. + * Standard implementation for simple API for managing a list of + * `SideEffect` info objects: can add, remove, return all and by package. * Copyright 2022 Anton Tarasenko *------------------------------------------------------------------------------ * This file is part of Acedia. @@ -18,16 +18,11 @@ * You should have received a copy of the GNU General Public License * along with Acedia. If not, see . */ -class SideEffectAPI extends AcediaObject; +class SideEffectAPI extends SideEffectAPIBase; var private array activeSideEffects; -/** - * Returns all so far registered `SideEffect`s. - * - * @return Array of all registered `SideEffect`s. - */ -public final function array GetAll() +public function array GetAll() { local int i; @@ -37,17 +32,7 @@ public final function array GetAll() return activeSideEffects; } -/** - * Returns active `SideEffect` instance of the specified class - * `sideEffectClass`. - * - * @param sideEffectClass Class of side effect to return active instance of. - * @return Active `SideEffect` instance of the specified class - * `sideEffectClass`. - * `none` if either `sideEffectClass` is `none` or side effect of such - * class is not currently active. - */ -public final function SideEffect GetClass(class sideEffectClass) +public function SideEffect GetClass(class sideEffectClass) { local int i; @@ -65,16 +50,7 @@ public final function SideEffect GetClass(class sideEffectClass) return none; } -/** - * Returns all so far registered `SideEffect`s from a package `packageName` - * (case insensitive). - * - * @param packageName Name opf the package, in `SideEffect`s from which we are - * interested. Must be not `none`. - * @return Array of all registered `SideEffect`s from a package `packageName`. - * If `none`, returns an empty array. - */ -public final function array GetFromPackage(BaseText packageName) +public function array GetFromPackage(BaseText packageName) { local int i; local Text nextPackage; @@ -96,14 +72,7 @@ public final function array GetFromPackage(BaseText packageName) return result; } -/** - * Registers a new `SideEffect` object as active. - * - * @param newSideEffect Instance of some `SideEffect` class to register as - * active side effect. Must not be `none`. - * @return `true` if new side effect was added and `false` otherwise. - */ -public final function bool Add(SideEffect newSideEffect) +public function bool Add(SideEffect newSideEffect) { local int i; @@ -121,16 +90,7 @@ public final function bool Add(SideEffect newSideEffect) return true; } -/** - * Removes `SideEffect` of the specified sub-class from the list of active - * side effects. - * - * @param sideEffectClass Class of the side effect to remove. - * @return `true` if some side effect was removed as a result of this operation - * and `false` otherise (even if there was no side effect of specified - * class to begin with). - */ -public final function bool RemoveClass( +public function bool RemoveClass( class sideEffectClass) { local int i; diff --git a/sources/CoreRealm/API/SideEffects/SideEffectAPIBase.uc b/sources/CoreRealm/API/SideEffects/SideEffectAPIBase.uc new file mode 100644 index 0000000..14718ea --- /dev/null +++ b/sources/CoreRealm/API/SideEffects/SideEffectAPIBase.uc @@ -0,0 +1,76 @@ +/** + * Base class for simple API for managing a list of `SideEffect` info + * objects: can add, remove, return all and by package. + * Copyright 2022 Anton Tarasenko + *------------------------------------------------------------------------------ + * This file is part of Acedia. + * + * Acedia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, or + * (at your option) any later version. + * + * Acedia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Acedia. If not, see . + */ +class SideEffectAPIBase extends AcediaObject + abstract; + +/** + * Returns all so far registered `SideEffect`s. + * + * @return Array of all registered `SideEffect`s. + */ +public function array GetAll(); + +/** + * Returns active `SideEffect` instance of the specified class + * `sideEffectClass`. + * + * @param sideEffectClass Class of side effect to return active instance of. + * @return Active `SideEffect` instance of the specified class + * `sideEffectClass`. + * `none` if either `sideEffectClass` is `none` or side effect of such + * class is not currently active. + */ +public function SideEffect GetClass(class sideEffectClass); + +/** + * Returns all so far registered `SideEffect`s from a package `packageName` + * (case insensitive). + * + * @param packageName Name of the package, in `SideEffect`s from which we are + * interested. Must be not `none`. + * @return Array of all registered `SideEffect`s from a package `packageName`. + * If `none`, returns an empty array. + */ +public function array GetFromPackage(BaseText packageName); + +/** + * Registers a new `SideEffect` object as active. + * + * @param newSideEffect Instance of some `SideEffect` class to register as + * active side effect. Must not be `none`. + * @return `true` if new side effect was added and `false` otherwise. + */ +public function bool Add(SideEffect newSideEffect); + +/** + * Removes `SideEffect` of the specified sub-class from the list of active + * side effects. + * + * @param sideEffectClass Class of the side effect to remove. + * @return `true` if some side effect was removed as a result of this operation + * and `false` otherwise (even if there was no side effect of specified + * class to begin with). + */ +public function bool RemoveClass(class sideEffectClass); + +defaultproperties +{ +} \ No newline at end of file diff --git a/sources/CoreRealm/AcediaAdapter.uc b/sources/CoreRealm/AcediaAdapter.uc new file mode 100644 index 0000000..683210b --- /dev/null +++ b/sources/CoreRealm/AcediaAdapter.uc @@ -0,0 +1,30 @@ +/** + * Base class for objects that will provide an access to a Acedia's client- and + * server-specific functionality by giving a reference to this object to all + * Acedia's objects and actors, emulating a global API namespace. + * Copyright 2022 Anton Tarasenko + *------------------------------------------------------------------------------ + * This file is part of Acedia. + * + * Acedia is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, version 3 of the License, or + * (at your option) any later version. + * + * Acedia is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Acedia. If not, see . + */ +class AcediaAdapter extends AcediaObject + abstract; + +var public const class sideEffectAPIClass; + +defaultproperties +{ + SideEffectAPIClass = class'SideEffectAPI' +} \ No newline at end of file diff --git a/sources/CoreRealm/CoreGlobal.uc b/sources/CoreRealm/CoreGlobal.uc index ffc8709..577aa40 100644 --- a/sources/CoreRealm/CoreGlobal.uc +++ b/sources/CoreRealm/CoreGlobal.uc @@ -21,16 +21,53 @@ */ class CoreGlobal extends Object; -var public SideEffectAPI sideEffects; +var protected bool initialized; +var protected class adapterClass; +var public SideEffectAPIBase sideEffects; + +var private LoggerAPI.Definition fatNoAdapterClass; + +/** + * This method must perform initialization of the caller `...Global` instance. + * + * It must only be executed once (execution should be marked using + * `initialized` flag). + */ protected function Initialize() { local MemoryAPI api; + if (initialized) { + return; + } + initialized = true; + if (adapterClass == none) + { + class'Global'.static.GetInstance().logger + .Auto(fatNoAdapterClass) + .ArgClass(self.class); + return; + } api = class'Global'.static.GetInstance().memory; - sideEffects = SideEffectAPI(api.Allocate(class'SideEffectAPI')); + sideEffects = + SideEffectAPI(api.Allocate(adapterClass.default.sideEffectAPIClass)); } +/** + * Changes adapter class for the caller `...Global` instance. + * + * Must not do anything when caller `...Global` instance was already + * initialized or when passed adapter class is `none`. + * + * @param newAdapter New adapter class to use in the caller `...Global` + * instance. + * @return `true` if new adapter was set and `false` otherwise. + */ +public function bool SetAdapter(class newAdapter); + defaultproperties { + adapterClass = class'AcediaAdapter' + fatNoAdapterClass = (l=LOG_Fatal,m="`none` specified as an adapter for `%1` level core class. This should not have happened. AcediaCore cannot properly function.") } \ No newline at end of file diff --git a/sources/ServerRealm/ServerGlobal.uc b/sources/ServerRealm/ServerGlobal.uc index 545db19..646be25 100644 --- a/sources/ServerRealm/ServerGlobal.uc +++ b/sources/ServerRealm/ServerGlobal.uc @@ -21,7 +21,6 @@ */ class ServerGlobal extends CoreGlobal; -var protected bool initialized; // `Global` is expected to behave like a singleton and will store it's // main instance in this variable's default value. var protected ServerGlobal myself;