From 2eaecc49136be3dc46b4d8da3982b2f1645e41b3 Mon Sep 17 00:00:00 2001 From: Eberhard Graether Date: Thu, 10 Jul 2014 11:31:24 +0200 Subject: [PATCH] logic: moved Storage into Project Moved Storage instantiation into the Project. Storage access is still handled via the GraphAccess and LocationAccess interfaces, but the ComponentFactory now only serves proxy implementations of these access classes. Project is responsible for setting the subject of the proxies to the current Storage instance. --- src/lib/Application.cpp | 17 ++-- src/lib/Application.h | 6 +- src/lib/CMakeLists.txt | 4 + src/lib/Project.cpp | 26 ++++--- src/lib/Project.h | 12 ++- src/lib/component/ComponentFactory.cpp | 9 +-- src/lib/component/ComponentFactory.h | 10 +-- src/lib/component/ComponentManager.cpp | 9 +-- src/lib/component/ComponentManager.h | 6 +- .../component/controller/CodeController.cpp | 2 +- src/lib/component/controller/CodeController.h | 4 +- .../component/controller/GraphController.cpp | 2 +- .../component/controller/GraphController.h | 4 +- .../component/controller/SearchController.cpp | 2 +- .../component/controller/SearchController.h | 4 +- src/lib/data/access/GraphAccessProxy.cpp | 78 +++++++++++++++++++ src/lib/data/access/GraphAccessProxy.h | 26 +++++++ src/lib/data/access/LocationAccessProxy.cpp | 53 +++++++++++++ src/lib/data/access/LocationAccessProxy.h | 25 ++++++ 19 files changed, 244 insertions(+), 55 deletions(-) create mode 100644 src/lib/data/access/GraphAccessProxy.cpp create mode 100644 src/lib/data/access/GraphAccessProxy.h create mode 100644 src/lib/data/access/LocationAccessProxy.cpp create mode 100644 src/lib/data/access/LocationAccessProxy.h diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 15840318..e5396965 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -2,7 +2,8 @@ #include "ApplicationSettings.h" #include "component/view/MainView.h" -#include "data/Storage.h" +#include "data/access/GraphAccessProxy.h" +#include "data/access/LocationAccessProxy.h" #include "gui/GuiFactory.h" #include "utility/logging/ConsoleLogger.h" #include "utility/logging/LogManager.h" @@ -17,11 +18,13 @@ std::shared_ptr Application::create(GuiFactory* guiFactory) ApplicationSettings::getInstance()->load("data/ApplicationSettings.xml"); std::shared_ptr ptr(new Application()); - ptr->m_storage = std::make_shared(); + + ptr->m_graphAccessProxy = std::make_shared(); + ptr->m_locationAccessProxy = std::make_shared(); ptr->m_mainView = guiFactory->createMainView(); - ptr->m_componentManager = - ComponentManager::create(guiFactory, ptr->m_mainView.get(), ptr->m_storage, ptr->m_storage); + ptr->m_componentManager = ComponentManager::create( + guiFactory, ptr->m_mainView.get(), ptr->m_graphAccessProxy.get(), ptr->m_locationAccessProxy.get()); ptr->m_componentManager->setup(); @@ -40,8 +43,7 @@ Application::~Application() void Application::loadProject(const std::string& projectSettingsFilePath) { - m_storage->clear(); - m_project = Project::create(m_storage); + m_project = Project::create(m_graphAccessProxy.get(), m_locationAccessProxy.get()); m_project->loadProjectSettings(projectSettingsFilePath); m_project->parseCode(); @@ -52,8 +54,7 @@ void Application::loadProject(const std::string& projectSettingsFilePath) void Application::loadSource(const std::string& sourceDirectoryPath) { - m_storage->clear(); - m_project = Project::create(m_storage); + m_project = Project::create(m_graphAccessProxy.get(), m_locationAccessProxy.get()); m_project->clearProjectSettings(); m_project->setSourceDirectoryPath(sourceDirectoryPath); diff --git a/src/lib/Application.h b/src/lib/Application.h index aaffaa9d..75fa5175 100644 --- a/src/lib/Application.h +++ b/src/lib/Application.h @@ -11,7 +11,8 @@ class GuiFactory; class MainView; -class Storage; +class GraphAccessProxy; +class LocationAccessProxy; class Application : public MessageListener @@ -32,7 +33,8 @@ private: virtual void handleMessage(MessageLoadSource* message); std::shared_ptr m_project; - std::shared_ptr m_storage; + std::shared_ptr m_graphAccessProxy; + std::shared_ptr m_locationAccessProxy; std::shared_ptr m_mainView; std::shared_ptr m_componentManager; diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 8ad62f54..19cd94d3 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -56,8 +56,12 @@ add_files( data/access/LocationAccess.cpp data/access/LocationAccess.h + data/access/LocationAccessProxy.cpp + data/access/LocationAccessProxy.h data/access/GraphAccess.cpp data/access/GraphAccess.h + data/access/GraphAccessProxy.cpp + data/access/GraphAccessProxy.h data/graph/Edge.cpp data/graph/Edge.h diff --git a/src/lib/Project.cpp b/src/lib/Project.cpp index cce5619f..7499f8d4 100644 --- a/src/lib/Project.cpp +++ b/src/lib/Project.cpp @@ -3,24 +3,24 @@ #include #include +#include "data/access/GraphAccessProxy.h" +#include "data/access/LocationAccessProxy.h" #include "data/parser/cxx/CxxParser.h" #include "utility/FileSystem.h" -#include "utility/messaging/type/MessageFinishedParsing.h" #include "utility/logging/logging.h" +#include "utility/messaging/type/MessageFinishedParsing.h" -std::shared_ptr Project::create( - std::shared_ptr storage -) +std::shared_ptr Project::create(GraphAccessProxy* graphAccessProxy, LocationAccessProxy* locationAccessProxy) { - std::shared_ptr ptr(new Project()); - ptr->m_storage = storage; + std::shared_ptr ptr(new Project(graphAccessProxy, locationAccessProxy)); + ptr->m_storage = std::make_shared(); + + graphAccessProxy->setSubject(ptr->m_storage.get()); + locationAccessProxy->setSubject(ptr->m_storage.get()); + return ptr; } -Project::Project() -{ -} - Project::~Project() { } @@ -60,3 +60,9 @@ void Project::parseCode() message.dispatch(); } } + +Project::Project(GraphAccessProxy* graphAccessProxy, LocationAccessProxy* locationAccessProxy) + : m_graphAccessProxy(graphAccessProxy) + , m_locationAccessProxy(locationAccessProxy) +{ +} diff --git a/src/lib/Project.h b/src/lib/Project.h index 37f6643f..c764afc5 100644 --- a/src/lib/Project.h +++ b/src/lib/Project.h @@ -6,12 +6,13 @@ #include "data/Storage.h" #include "ProjectSettings.h" +class GraphAccessProxy; +class LocationAccessProxy; + class Project { public: - static std::shared_ptr create( - std::shared_ptr storage - ); + static std::shared_ptr create(GraphAccessProxy* graphAccessProxy, LocationAccessProxy* locationAccessProxy); ~Project(); @@ -23,10 +24,13 @@ public: void parseCode(); private: - Project(); + Project(GraphAccessProxy* graphAccessProxy, LocationAccessProxy* locationAccessProxy); Project(const Project&); Project operator=(const Project&); + GraphAccessProxy* const m_graphAccessProxy; + LocationAccessProxy* const m_locationAccessProxy; + std::shared_ptr m_storage; }; diff --git a/src/lib/component/ComponentFactory.cpp b/src/lib/component/ComponentFactory.cpp index 2d6f1150..a3c4a1ea 100644 --- a/src/lib/component/ComponentFactory.cpp +++ b/src/lib/component/ComponentFactory.cpp @@ -11,16 +11,13 @@ #include "gui/GuiFactory.h" std::shared_ptr ComponentFactory::create( - GuiFactory* guiFactory, - ViewLayout* viewLayout, - std::shared_ptr locationAccess, - std::shared_ptr graphAccess) -{ + GuiFactory* guiFactory, ViewLayout* viewLayout, GraphAccess* graphAccess, LocationAccess* locationAccess +){ std::shared_ptr ptr(new ComponentFactory()); ptr->m_guiFactory = guiFactory; ptr->m_viewLayout = viewLayout; - ptr->m_locationAccess = locationAccess; ptr->m_graphAccess = graphAccess; + ptr->m_locationAccess = locationAccess; return ptr; } diff --git a/src/lib/component/ComponentFactory.h b/src/lib/component/ComponentFactory.h index a60b9d75..f9de3798 100644 --- a/src/lib/component/ComponentFactory.h +++ b/src/lib/component/ComponentFactory.h @@ -14,10 +14,8 @@ class ComponentFactory { public: static std::shared_ptr create( - GuiFactory* guiFactory, - ViewLayout* viewLayout, - std::shared_ptr locationAccess, - std::shared_ptr graphAccess); + GuiFactory* guiFactory, ViewLayout* viewLayout, GraphAccess* graphAccess, LocationAccess* locationAccess + ); ~ComponentFactory(); @@ -32,8 +30,8 @@ private: GuiFactory* m_guiFactory; ViewLayout* m_viewLayout; - std::shared_ptr m_locationAccess; - std::shared_ptr m_graphAccess; + GraphAccess* m_graphAccess; + LocationAccess* m_locationAccess; }; diff --git a/src/lib/component/ComponentManager.cpp b/src/lib/component/ComponentManager.cpp index 2996a3a1..3f5c7b8a 100644 --- a/src/lib/component/ComponentManager.cpp +++ b/src/lib/component/ComponentManager.cpp @@ -7,13 +7,10 @@ #include "data/location/TokenLocationFile.h" std::shared_ptr ComponentManager::create( - GuiFactory* guiFactory, - ViewLayout* viewLayout, - std::shared_ptr locationAccess, - std::shared_ptr graphAccess) -{ + GuiFactory* guiFactory, ViewLayout* viewLayout, GraphAccess* graphAccess, LocationAccess* locationAccess +){ std::shared_ptr ptr(new ComponentManager()); - ptr->m_componentFactory = ComponentFactory::create(guiFactory, viewLayout, locationAccess, graphAccess); + ptr->m_componentFactory = ComponentFactory::create(guiFactory, viewLayout, graphAccess, locationAccess); return ptr; } diff --git a/src/lib/component/ComponentManager.h b/src/lib/component/ComponentManager.h index 3305b90c..6a38566d 100644 --- a/src/lib/component/ComponentManager.h +++ b/src/lib/component/ComponentManager.h @@ -16,10 +16,8 @@ class ComponentManager { public: static std::shared_ptr create( - GuiFactory* guiFactory, - ViewLayout* viewLayout, - std::shared_ptr locationAccess, - std::shared_ptr graphAccess); + GuiFactory* guiFactory, ViewLayout* viewLayout, GraphAccess* graphAccess, LocationAccess* locationAccess + ); ~ComponentManager(); diff --git a/src/lib/component/controller/CodeController.cpp b/src/lib/component/controller/CodeController.cpp index 93e82367..5b389f40 100644 --- a/src/lib/component/controller/CodeController.cpp +++ b/src/lib/component/controller/CodeController.cpp @@ -10,7 +10,7 @@ #include "utility/logging/logging.h" -CodeController::CodeController(std::shared_ptr locationAccess) +CodeController::CodeController(LocationAccess* locationAccess) : m_locationAccess(locationAccess) { } diff --git a/src/lib/component/controller/CodeController.h b/src/lib/component/controller/CodeController.h index 305c2588..017271be 100644 --- a/src/lib/component/controller/CodeController.h +++ b/src/lib/component/controller/CodeController.h @@ -22,7 +22,7 @@ class CodeController , public MessageListener { public: - CodeController(std::shared_ptr locationAccess); + CodeController(LocationAccess* locationAccess); ~CodeController(); void setActiveTokenId(Id id); @@ -31,7 +31,7 @@ private: virtual void handleMessage(MessageActivateToken* message); CodeView* getView(); - std::shared_ptr m_locationAccess; + LocationAccess* m_locationAccess; }; diff --git a/src/lib/component/controller/GraphController.cpp b/src/lib/component/controller/GraphController.cpp index ee11bbeb..829a59dc 100644 --- a/src/lib/component/controller/GraphController.cpp +++ b/src/lib/component/controller/GraphController.cpp @@ -7,7 +7,7 @@ #include "utility/logging/logging.h" -GraphController::GraphController(std::shared_ptr graphAccess) +GraphController::GraphController(GraphAccess* graphAccess) : m_graphAccess(graphAccess) { } diff --git a/src/lib/component/controller/GraphController.h b/src/lib/component/controller/GraphController.h index a0c17644..a0a01a01 100644 --- a/src/lib/component/controller/GraphController.h +++ b/src/lib/component/controller/GraphController.h @@ -14,14 +14,14 @@ class GraphController: public MessageListener { public: - GraphController(std::shared_ptr graphAccess); + GraphController(GraphAccess* graphAccess); ~GraphController(); private: virtual void handleMessage(MessageActivateToken* message); GraphView* getView(); - std::shared_ptr m_graphAccess; + GraphAccess* m_graphAccess; }; diff --git a/src/lib/component/controller/SearchController.cpp b/src/lib/component/controller/SearchController.cpp index 1eeba057..0125caa3 100644 --- a/src/lib/component/controller/SearchController.cpp +++ b/src/lib/component/controller/SearchController.cpp @@ -3,7 +3,7 @@ #include "component/view/SearchView.h" #include "data/access/GraphAccess.h" -SearchController::SearchController(std::shared_ptr graphAccess) +SearchController::SearchController(GraphAccess* graphAccess) : m_graphAccess(graphAccess) { } diff --git a/src/lib/component/controller/SearchController.h b/src/lib/component/controller/SearchController.h index 2cb37cfa..6a47aa2b 100644 --- a/src/lib/component/controller/SearchController.h +++ b/src/lib/component/controller/SearchController.h @@ -17,7 +17,7 @@ class SearchController , public MessageListener { public: - SearchController(std::shared_ptr graphAccess); + SearchController(GraphAccess* graphAccess); ~SearchController(); void search(const std::string& s); @@ -28,7 +28,7 @@ private: virtual void handleMessage(MessageFinishedParsing* message); SearchView* getView(); - std::shared_ptr m_graphAccess; + GraphAccess* m_graphAccess; }; #endif // SEARCH_CONTROLLER_H diff --git a/src/lib/data/access/GraphAccessProxy.cpp b/src/lib/data/access/GraphAccessProxy.cpp new file mode 100644 index 00000000..a1271744 --- /dev/null +++ b/src/lib/data/access/GraphAccessProxy.cpp @@ -0,0 +1,78 @@ +#include "data/access/GraphAccessProxy.h" + +#include "utility/logging/logging.h" + +GraphAccessProxy::GraphAccessProxy() + : m_subject(nullptr) +{ +} + +GraphAccessProxy::~GraphAccessProxy() +{ +} + +bool GraphAccessProxy::hasSubject() const +{ + if (m_subject) + { + return true; + } + + LOG_ERROR("GraphAccessProxy has no subject."); + return false; +} + +void GraphAccessProxy::setSubject(GraphAccess* subject) +{ + m_subject = subject; +} + +Id GraphAccessProxy::getIdForNodeWithName(const std::string& name) const +{ + if (hasSubject()) + { + return m_subject->getIdForNodeWithName(name); + } + + return 0; +} + +std::string GraphAccessProxy::getNameForNodeWithId(Id id) const +{ + if (hasSubject()) + { + return m_subject->getNameForNodeWithId(id); + } + + return ""; +} + +std::vector GraphAccessProxy::getNamesForNodesWithNamePrefix(const std::string& prefix) const +{ + if (hasSubject()) + { + return m_subject->getNamesForNodesWithNamePrefix(prefix); + } + + return std::vector(); +} + +std::vector GraphAccessProxy::getIdsOfNeighbours(const Id id) const +{ + if (hasSubject()) + { + return m_subject->getIdsOfNeighbours(id); + } + + return std::vector(); +} + +std::vector> GraphAccessProxy::getConnectedEdges(const Id id) const +{ + if (hasSubject()) + { + return m_subject->getConnectedEdges(id); + } + + return std::vector>(); +} diff --git a/src/lib/data/access/GraphAccessProxy.h b/src/lib/data/access/GraphAccessProxy.h new file mode 100644 index 00000000..c376161a --- /dev/null +++ b/src/lib/data/access/GraphAccessProxy.h @@ -0,0 +1,26 @@ +#ifndef GRAPH_ACCESS_PROXY_H +#define GRAPH_ACCESS_PROXY_H + +#include "data/access/GraphAccess.h" + +class GraphAccessProxy: public GraphAccess +{ +public: + GraphAccessProxy(); + virtual ~GraphAccessProxy(); + + bool hasSubject() const; + void setSubject(GraphAccess* subject); + + // GraphAccess implementation + virtual Id getIdForNodeWithName(const std::string& name) const; + virtual std::string getNameForNodeWithId(Id id) const; + virtual std::vector getNamesForNodesWithNamePrefix(const std::string& prefix) const; + virtual std::vector getIdsOfNeighbours(const Id id) const; + virtual std::vector> getConnectedEdges(const Id id) const; + +private: + GraphAccess* m_subject; +}; + +#endif // GRAPH_ACCESS_PROXY_H diff --git a/src/lib/data/access/LocationAccessProxy.cpp b/src/lib/data/access/LocationAccessProxy.cpp new file mode 100644 index 00000000..33c7f51a --- /dev/null +++ b/src/lib/data/access/LocationAccessProxy.cpp @@ -0,0 +1,53 @@ +#include "data/access/LocationAccessProxy.h" + +#include "data/location/TokenLocationCollection.h" +#include "data/location/TokenLocationFile.h" +#include "utility/logging/logging.h" + +LocationAccessProxy::LocationAccessProxy() + : m_subject(nullptr) +{ +} + +LocationAccessProxy::~LocationAccessProxy() +{ +} + +bool LocationAccessProxy::hasSubject() const +{ + if (m_subject) + { + return true; + } + + LOG_ERROR("LocationAccessProxy has no subject."); + return false; +} + +void LocationAccessProxy::setSubject(LocationAccess* subject) +{ + m_subject = subject; +} + +TokenLocationCollection LocationAccessProxy::getTokenLocationsForTokenId(Id id) const +{ + if (hasSubject()) + { + return m_subject->getTokenLocationsForTokenId(id); + } + + return TokenLocationCollection(); +} + + +TokenLocationFile LocationAccessProxy::getTokenLocationsForLinesInFile( + const std::string& fileName, unsigned int firstLineNumber, unsigned int lastLineNumber +) const +{ + if (hasSubject()) + { + return m_subject->getTokenLocationsForLinesInFile(fileName, firstLineNumber, lastLineNumber); + } + + return TokenLocationFile(""); +} diff --git a/src/lib/data/access/LocationAccessProxy.h b/src/lib/data/access/LocationAccessProxy.h new file mode 100644 index 00000000..098b4f15 --- /dev/null +++ b/src/lib/data/access/LocationAccessProxy.h @@ -0,0 +1,25 @@ +#ifndef LOCATION_ACCESS_PROXY_H +#define LOCATION_ACCESS_PROXY_H + +#include "data/access/LocationAccess.h" + +class LocationAccessProxy: public LocationAccess +{ +public: + LocationAccessProxy(); + virtual ~LocationAccessProxy(); + + bool hasSubject() const; + void setSubject(LocationAccess* subject); + + // LocationAccess implementation + virtual TokenLocationCollection getTokenLocationsForTokenId(Id id) const; + virtual TokenLocationFile getTokenLocationsForLinesInFile( + const std::string& fileName, unsigned int firstLineNumber, unsigned int lastLineNumber + ) const; + +private: + LocationAccess* m_subject; +}; + +#endif // LOCATION_ACCESS_PROXY_H