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