You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by is...@apache.org on 2021/06/01 17:58:50 UTC
[airavata-data-lake] 07/46: metadata service neo4j implementation
This is an automated email from the ASF dual-hosted git repository.
isjarana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/airavata-data-lake.git
commit 2724b9a8e90f7a66150b69b359fe319d9b9dba0e
Author: Isuru Ranawaka <ir...@gmail.com>
AuthorDate: Wed Mar 10 21:44:02 2021 -0500
metadata service neo4j implementation
---
airavata-data-lake.ipr | 112 ++++++
airavata-data-lake.iws | 418 ++++++++++++++++++++
metadata-service/data-builders/data-builders.iml | 16 +
metadata-service/data-builders/pom.xml | 20 +
metadata-service/db-service/db-service.iml | 420 +++++++++++++++++++++
metadata-service/db-service/pom.xml | 49 +++
.../datalake/metadata/db/service/AppConfig.java | 108 ++++++
.../db/service/Neo4JServiceInitializer.java | 14 +
.../metadata/db/service/XmlConfiguration.java | 9 +
.../metadata/db/service/backend/Connector.java | 10 +
.../metadata/db/service/backend/Person.java | 74 ++++
.../db/service/backend/neo4j/Neo4JConnector.java | 53 +++
.../neo4j/curd/operators/GenericService.java | 79 ++++
.../backend/neo4j/curd/operators/GroupService.java | 4 +
.../neo4j/curd/operators/ResourceService.java | 4 +
.../neo4j/curd/operators/SearchOperator.java | 33 ++
.../backend/neo4j/curd/operators/Service.java | 24 ++
.../backend/neo4j/curd/operators/UserService.java | 4 +
.../service/backend/neo4j/model/nodes/Entity.java | 109 ++++++
.../service/backend/neo4j/model/nodes/Group.java | 208 ++++++++++
.../backend/neo4j/model/nodes/Resource.java | 215 +++++++++++
.../db/service/backend/neo4j/model/nodes/Role.java | 37 ++
.../backend/neo4j/model/nodes/ServiceAccount.java | 29 ++
.../service/backend/neo4j/model/nodes/Tenant.java | 125 ++++++
.../db/service/backend/neo4j/model/nodes/User.java | 132 +++++++
.../backend/neo4j/model/relationships/Belongs.java | 9 +
.../neo4j/model/relationships/ConfiguredWith.java | 7 +
.../backend/neo4j/model/relationships/Has.java | 9 +
.../neo4j/model/relationships/HasAccess.java | 23 ++
.../neo4j/model/relationships/HasChildGroup.java | 9 +
.../model/relationships/HasChildResource.java | 8 +
.../neo4j/model/relationships/HasChildUser.java | 19 +
.../neo4j/model/relationships/HasParentGroup.java | 19 +
.../model/relationships/HasParentResource.java | 7 +
.../backend/neo4j/model/relationships/HasRole.java | 8 +
.../neo4j/model/relationships/MemberOf.java | 19 +
.../neo4j/model/relationships/Relationship.java | 81 ++++
.../neo4j/model/relationships/SharedWith.java | 25 ++
.../service/exceptions/DBConnectorException.java | 10 +
.../src/main/resources/application.properties | 23 ++
.../src/main/resources/applicationContext.xml | 12 +
metadata-service/metadata-service.iml | 14 +
metadata-service/pom.xml | 130 +++++++
pom.xml | 77 +++-
44 files changed, 2814 insertions(+), 1 deletion(-)
diff --git a/airavata-data-lake.ipr b/airavata-data-lake.ipr
new file mode 100644
index 0000000..3bec1ac
--- /dev/null
+++ b/airavata-data-lake.ipr
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project version="4" relativePaths="false">
+ <component name="ProjectRootManager" version="2" assert-keyword="true" project-jdk-name="11." jdk-15="true"/>
+ <component name="CodeStyleManager">
+ <option name="USE_DEFAULT_CODE_STYLE_SCHEME" value="true"/>
+ <option name="CODE_STYLE_SCHEME" value=""/>
+ </component>
+ <component name="libraryTable"/>
+ <component name="CompilerConfiguration">
+ <option name="DEFAULT_COMPILER" value="Javac"/>
+ <option name="CLEAR_OUTPUT_DIRECTORY" value="false"/>
+ <!--
+ <wildcardResourcePatterns>
+ <entry name="${wildcardResourcePattern}"/>
+ </wildcardResourcePatterns>
+ -->
+ <wildcardResourcePatterns>
+ <entry name="!?*.java"/>
+ </wildcardResourcePatterns>
+ </component>
+ <component name="JavacSettings">
+ <option name="DEBUGGING_INFO" value="true"/>
+ <option name="GENERATE_NO_WARNINGS" value="false"/>
+ <option name="DEPRECATION" value="true"/>
+ <option name="ADDITIONAL_OPTIONS_STRING" value=""/>
+ <option name="MAXIMUM_HEAP_SIZE" value="128"/>
+ <option name="USE_GENERICS_COMPILER" value="false"/>
+ </component>
+ <component name="JikesSettings">
+ <option name="DEBUGGING_INFO" value="true"/>
+ <option name="DEPRECATION" value="true"/>
+ <option name="GENERATE_NO_WARNINGS" value="false"/>
+ <option name="GENERATE_MAKE_FILE_DEPENDENCIES" value="false"/>
+ <option name="DO_FULL_DEPENDENCE_CHECK" value="false"/>
+ <option name="IS_INCREMENTAL_MODE" value="false"/>
+ <option name="IS_EMACS_ERRORS_MODE" value="true"/>
+ <option name="ADDITIONAL_OPTIONS_STRING" value=""/>
+ <option name="MAXIMUM_HEAP_SIZE" value="128"/>
+ </component>
+ <component name="AntConfiguration">
+ <option name="IS_AUTOSCROLL_TO_SOURCE" value="false"/>
+ <option name="FILTER_TARGETS" value="false"/>
+ </component>
+ <component name="JavadocGenerationManager">
+ <option name="OUTPUT_DIRECTORY"/>
+ <option name="OPTION_SCOPE" value="protected"/>
+ <option name="OPTION_HIERARCHY" value="false"/>
+ <option name="OPTION_NAVIGATOR" value="false"/>
+ <option name="OPTION_INDEX" value="false"/>
+ <option name="OPTION_SEPARATE_INDEX" value="false"/>
+ <option name="OPTION_USE_1_1" value="false"/>
+ <option name="OPTION_DOCUMENT_TAG_USE" value="false"/>
+ <option name="OPTION_DOCUMENT_TAG_AUTHOR" value="false"/>
+ <option name="OPTION_DOCUMENT_TAG_VERSION" value="false"/>
+ <option name="OPTION_DOCUMENT_TAG_DEPRECATED" value="false"/>
+ <option name="OPTION_DEPRECATED_LIST" value="false"/>
+ <option name="OTHER_OPTIONS"/>
+ <option name="HEAP_SIZE"/>
+ <option name="OPEN_IN_BROWSER" value="false"/>
+ </component>
+ <component name="JUnitProjectSettings">
+ <option name="TEST_RUNNER" value="UI"/>
+ </component>
+ <component name="EntryPointsManager">
+ <entry_points/>
+ </component>
+ <component name="DataSourceManager"/>
+ <component name="ExportToHTMLSettings">
+ <option name="PRINT_LINE_NUMBERS" value="false"/>
+ <option name="OPEN_IN_BROWSER" value="false"/>
+ <option name="OUTPUT_DIRECTORY"/>
+ </component>
+ <component name="ImportConfiguration">
+ <option name="VENDOR"/>
+ <option name="RELEASE_TAG"/>
+ <option name="LOG_MESSAGE"/>
+ <option name="CHECKOUT_AFTER_IMPORT" value="true"/>
+ </component>
+ <component name="ProjectModuleManager">
+ <modules>
+ <!-- module filepath="$$PROJECT_DIR$$/${pom.artifactId}.iml"/ -->
+ <module filepath="$PROJECT_DIR$/airavata-data-lake.iml"/>
+ <module filepath="$PROJECT_DIR$/data-orchestrator/data-orchestrator-api/data-orchestrator-api.iml"/>
+ <module filepath="$PROJECT_DIR$/data-orchestrator/data-orchestrator-core/data-orchestrator-core.iml"/>
+ <module filepath="$PROJECT_DIR$/data-orchestrator/data-orchestrator.iml"/>
+ <module filepath="$PROJECT_DIR$/metadata-service/neo4j-service/neo4j-service.iml"/>
+ <module filepath="$PROJECT_DIR$/metadata-service/metadata-service.iml"/>
+ </modules>
+ </component>
+ <UsedPathMacros>
+ <!--<macro name="cargo"></macro>-->
+ </UsedPathMacros>
+</project>
diff --git a/airavata-data-lake.iws b/airavata-data-lake.iws
new file mode 100644
index 0000000..57de9a0
--- /dev/null
+++ b/airavata-data-lake.iws
@@ -0,0 +1,418 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied. See the License for the
+specific language governing permissions and limitations
+under the License.
+-->
+<project version="4" relativePaths="false">
+ <component name="LvcsProjectConfiguration">
+ <option name="ADD_LABEL_ON_PROJECT_OPEN" value="true"/>
+ <option name="ADD_LABEL_ON_PROJECT_COMPILATION" value="true"/>
+ <option name="ADD_LABEL_ON_FILE_PACKAGE_COMPILATION" value="true"/>
+ <option name="ADD_LABEL_ON_PROJECT_MAKE" value="true"/>
+ <option name="ADD_LABEL_ON_RUNNING" value="true"/>
+ <option name="ADD_LABEL_ON_DEBUGGING" value="true"/>
+ <option name="ADD_LABEL_ON_UNIT_TEST_PASSED" value="true"/>
+ <option name="ADD_LABEL_ON_UNIT_TEST_FAILED" value="true"/>
+ </component>
+ <component name="PropertiesComponent">
+ <property name="MemberChooser.copyJavadoc" value="false"/>
+ <property name="GoToClass.includeLibraries" value="false"/>
+ <property name="MemberChooser.showClasses" value="true"/>
+ <property name="MemberChooser.sorted" value="false"/>
+ <property name="GoToFile.includeJavaFiles" value="false"/>
+ <property name="GoToClass.toSaveIncludeLibraries" value="false"/>
+ </component>
+ <component name="ToolWindowManager">
+ <frame x="-4" y="-4" width="1032" height="746" extended-state="6"/>
+ <editor active="false"/>
+ <layout>
+ <window_info id="CVS" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="-1"/>
+ <window_info id="TODO" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="7"/>
+ <window_info id="Project" active="false" anchor="left" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="0"/>
+ <window_info id="Find" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="1"/>
+ <window_info id="Structure" active="false" anchor="left" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="1"/>
+ <window_info id="Messages" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="-1"/>
+ <window_info id="Inspection" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.4" order="6"/>
+ <window_info id="Aspects" active="false" anchor="right" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="-1"/>
+ <window_info id="Ant Build" active="false" anchor="right" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="1"/>
+ <window_info id="Run" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="2"/>
+ <window_info id="Hierarchy" active="false" anchor="right" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="2"/>
+ <window_info id="Debug" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.4" order="4"/>
+ <window_info id="Commander" active="false" anchor="right" auto_hide="false" internal_type="sliding" type="sliding" visible="false" weight="0.4" order="0"/>
+ <window_info id="Web" active="false" anchor="left" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="2"/>
+ <window_info id="Message" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.33" order="0"/>
+ <window_info id="EJB" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="3"/>
+ <window_info id="Cvs" active="false" anchor="bottom" auto_hide="false" internal_type="docked" type="docked" visible="false" weight="0.25" order="5"/>
+ </layout>
+ </component>
+ <component name="ErrorTreeViewConfiguration">
+ <option name="IS_AUTOSCROLL_TO_SOURCE" value="false"/>
+ <option name="HIDE_WARNINGS" value="false"/>
+ </component>
+ <component name="StructureViewFactory">
+ <option name="SORT_MODE" value="0"/>
+ <option name="GROUP_INHERITED" value="true"/>
+ <option name="AUTOSCROLL_MODE" value="true"/>
+ <option name="SHOW_FIELDS" value="true"/>
+ <option name="AUTOSCROLL_FROM_SOURCE" value="false"/>
+ <option name="GROUP_GETTERS_AND_SETTERS" value="true"/>
+ <option name="SHOW_INHERITED" value="false"/>
+ <option name="HIDE_NOT_PUBLIC" value="false"/>
+ </component>
+ <component name="ProjectViewSettings">
+ <navigator currentView="ProjectPane" flattenPackages="false" showMembers="false" showStructure="false" autoscrollToSource="false" splitterProportion="0.5"/>
+ <view id="ProjectPane">
+ <expanded_node type="directory" url="file://$PROJECT_DIR$"/>
+ </view>
+ <view id="SourcepathPane"/>
+ <view id="ClasspathPane"/>
+ </component>
+ <component name="Commander">
+ <leftPanel view="Project"/>
+ <rightPanel view="Project"/>
+ <splitter proportion="0.5"/>
+ </component>
+ <component name="AspectsView"/>
+ <component name="SelectInManager"/>
+ <component name="HierarchyBrowserManager">
+ <option name="SHOW_PACKAGES" value="false"/>
+ <option name="IS_AUTOSCROLL_TO_SOURCE" value="false"/>
+ <option name="SORT_ALPHABETICALLY" value="false"/>
+ </component>
+ <component name="TodoView" selected-index="0">
+ <todo-panel id="selected-file">
+ <are-packages-shown value="false"/>
+ <flatten-packages value="false"/>
+ <is-autoscroll-to-source value="true"/>
+ </todo-panel>
+ <todo-panel id="all">
+ <are-packages-shown value="true"/>
+ <flatten-packages value="false"/>
+ <is-autoscroll-to-source value="true"/>
+ </todo-panel>
+ </component>
+ <component name="editorManager"/>
+ <component name="editorHistoryManager"/>
+ <component name="DaemonCodeAnalyzer">
+ <disable_hints/>
+ </component>
+ <component name="InspectionManager">
+ <option name="AUTOSCROLL_TO_SOURCE" value="false"/>
+ <option name="SPLITTER_PROPORTION" value="0.5"/>
+ <profile name="Default"/>
+ </component>
+ <component name="BookmarkManager"/>
+ <component name="DebuggerManager">
+ <line_breakpoints/>
+ <exception_breakpoints>
+ <breakpoint_any>
+ <option name="NOTIFY_CAUGHT" value="true"/>
+ <option name="NOTIFY_UNCAUGHT" value="true"/>
+ <option name="ENABLED" value="false"/>
+ <option name="SUSPEND_VM" value="true"/>
+ <option name="COUNT_FILTER_ENABLED" value="false"/>
+ <option name="COUNT_FILTER" value="0"/>
+ <option name="CONDITION_ENABLED" value="false"/>
+ <option name="CONDITION"/>
+ <option name="LOG_ENABLED" value="false"/>
+ <option name="LOG_EXPRESSION_ENABLED" value="false"/>
+ <option name="LOG_MESSAGE"/>
+ <option name="CLASS_FILTERS_ENABLED" value="false"/>
+ <option name="INVERSE_CLASS_FILLTERS" value="false"/>
+ <option name="SUSPEND_POLICY" value="SuspendAll"/>
+ </breakpoint_any>
+ </exception_breakpoints>
+ <field_breakpoints/>
+ <method_breakpoints/>
+ </component>
+ <component name="DebuggerSettings">
+ <option name="TRACING_FILTERS_ENABLED" value="true"/>
+ <option name="TOSTRING_CLASSES_ENABLED" value="false"/>
+ <option name="VALUE_LOOKUP_DELAY" value="700"/>
+ <option name="DEBUGGER_TRANSPORT" value="0"/>
+ <option name="FORCE_CLASSIC_VM" value="true"/>
+ <option name="HIDE_DEBUGGER_ON_PROCESS_TERMINATION" value="false"/>
+ <option name="SKIP_SYNTHETIC_METHODS" value="true"/>
+ <option name="SKIP_CONSTRUCTORS" value="false"/>
+ <option name="STEP_THREAD_SUSPEND_POLICY" value="SuspendThread"/>
+ <default_breakpoint_settings>
+ <option name="NOTIFY_CAUGHT" value="true"/>
+ <option name="NOTIFY_UNCAUGHT" value="true"/>
+ <option name="WATCH_MODIFICATION" value="true"/>
+ <option name="WATCH_ACCESS" value="true"/>
+ <option name="WATCH_ENTRY" value="true"/>
+ <option name="WATCH_EXIT" value="true"/>
+ <option name="ENABLED" value="true"/>
+ <option name="SUSPEND_VM" value="true"/>
+ <option name="COUNT_FILTER_ENABLED" value="false"/>
+ <option name="COUNT_FILTER" value="0"/>
+ <option name="CONDITION_ENABLED" value="false"/>
+ <option name="CONDITION"/>
+ <option name="LOG_ENABLED" value="false"/>
+ <option name="LOG_EXPRESSION_ENABLED" value="false"/>
+ <option name="LOG_MESSAGE"/>
+ <option name="CLASS_FILTERS_ENABLED" value="false"/>
+ <option name="INVERSE_CLASS_FILLTERS" value="false"/>
+ <option name="SUSPEND_POLICY" value="SuspendAll"/>
+ </default_breakpoint_settings>
+ <filter>
+ <option name="PATTERN" value="com.sun.*"/>
+ <option name="ENABLED" value="true"/>
+ </filter>
+ <filter>
+ <option name="PATTERN" value="java.*"/>
+ <option name="ENABLED" value="true"/>
+ </filter>
+ <filter>
+ <option name="PATTERN" value="javax.*"/>
+ <option name="ENABLED" value="true"/>
+ </filter>
+ <filter>
+ <option name="PATTERN" value="org.omg.*"/>
+ <option name="ENABLED" value="true"/>
+ </filter>
+ <filter>
+ <option name="PATTERN" value="sun.*"/>
+ <option name="ENABLED" value="true"/>
+ </filter>
+ <filter>
+ <option name="PATTERN" value="junit.*"/>
+ <option name="ENABLED" value="true"/>
+ </filter>
+ </component>
+ <component name="CompilerWorkspaceConfiguration">
+ <option name="COMPILE_IN_BACKGROUND" value="false"/>
+ <option name="AUTO_SHOW_ERRORS_IN_EDITOR" value="true"/>
+ </component>
+ <component name="RunManager">
+ <activeType name="Application"/>
+ <configuration selected="false" default="true" type="Applet" factoryName="Applet">
+ <module name=""/>
+ <option name="MAIN_CLASS_NAME"/>
+ <option name="HTML_FILE_NAME"/>
+ <option name="HTML_USED" value="false"/>
+ <option name="WIDTH" value="400"/>
+ <option name="HEIGHT" value="300"/>
+ <option name="POLICY_FILE" value="$APPLICATION_HOME_DIR$/bin/appletviewer.policy"/>
+ <option name="VM_PARAMETERS"/>
+ </configuration>
+ <configuration selected="false" default="true" type="Remote" factoryName="Remote">
+ <option name="USE_SOCKET_TRANSPORT" value="true"/>
+ <option name="SERVER_MODE" value="false"/>
+ <option name="SHMEM_ADDRESS" value="javadebug"/>
+ <option name="HOST" value="localhost"/>
+ <option name="PORT" value="5005"/>
+ </configuration>
+ <configuration selected="false" default="true" type="Application" factoryName="Application">
+ <option name="MAIN_CLASS_NAME"/>
+ <option name="VM_PARAMETERS"/>
+ <option name="PROGRAM_PARAMETERS"/>
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$"/>
+ <module name=""/>
+ </configuration>
+ <configuration selected="false" default="true" type="JUnit" factoryName="JUnit">
+ <module name=""/>
+ <option name="PACKAGE_NAME"/>
+ <option name="MAIN_CLASS_NAME"/>
+ <option name="METHOD_NAME"/>
+ <option name="TEST_OBJECT" value="class"/>
+ <option name="VM_PARAMETERS"/>
+ <option name="PARAMETERS"/>
+ <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$"/>
+ <option name="ADDITIONAL_CLASS_PATH"/>
+ <option name="TEST_SEARCH_SCOPE">
+ <value defaultName="wholeProject"/>
+ </option>
+ </configuration>
+ </component>
+ <component name="VcsManagerConfiguration">
+ <option name="ACTIVE_VCS_NAME" value="git"/>
+ <option name="STATE" value="0"/>
+ </component>
+ <component name="VssConfiguration">
+ <CheckoutOptions>
+ <option name="COMMENT" value=""/>
+ <option name="DO_NOT_GET_LATEST_VERSION" value="false"/>
+ <option name="REPLACE_WRITABLE" value="false"/>
+ <option name="RECURSIVE" value="false"/>
+ </CheckoutOptions>
+ <CheckinOptions>
+ <option name="COMMENT" value=""/>
+ <option name="KEEP_CHECKED_OUT" value="false"/>
+ <option name="RECURSIVE" value="false"/>
+ </CheckinOptions>
+ <AddOptions>
+ <option name="COMMENT" value=""/>
+ <option name="STORE_ONLY_LATEST_VERSION" value="false"/>
+ <option name="CHECK_OUT_IMMEDIATELY" value="false"/>
+ <option name="FILE_TYPE" value="0"/>
+ </AddOptions>
+ <UndocheckoutOptions>
+ <option name="MAKE_WRITABLE" value="false"/>
+ <option name="REPLACE_LOCAL_COPY" value="0"/>
+ <option name="RECURSIVE" value="false"/>
+ </UndocheckoutOptions>
+ <DiffOptions>
+ <option name="IGNORE_WHITE_SPACE" value="false"/>
+ <option name="IGNORE_CASE" value="false"/>
+ </DiffOptions>
+ <GetOptions>
+ <option name="REPLACE_WRITABLE" value="0"/>
+ <option name="MAKE_WRITABLE" value="false"/>
+ <option name="RECURSIVE" value="false"/>
+ </GetOptions>
+ <option name="CLIENT_PATH" value=""/>
+ <option name="SRCSAFEINI_PATH" value=""/>
+ <option name="USER_NAME" value=""/>
+ <option name="PWD" value=""/>
+ <option name="SHOW_CHECKOUT_OPTIONS" value="true"/>
+ <option name="SHOW_ADD_OPTIONS" value="true"/>
+ <option name="SHOW_UNDOCHECKOUT_OPTIONS" value="true"/>
+ <option name="SHOW_DIFF_OPTIONS" value="true"/>
+ <option name="SHOW_GET_OPTIONS" value="true"/>
+ <option name="USE_EXTERNAL_DIFF" value="false"/>
+ <option name="EXTERNAL_DIFF_PATH" value=""/>
+ <option name="REUSE_LAST_COMMENT" value="false"/>
+ <option name="PUT_FOCUS_INTO_COMMENT" value="false"/>
+ <option name="SHOW_CHECKIN_OPTIONS" value="true"/>
+ <option name="LAST_COMMIT_MESSAGE" value=""/>
+ <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8"/>
+ </component>
+ <component name="CheckinPanelState"/>
+ <component name="WebViewSettings">
+ <webview flattenPackages="false" showMembers="false" autoscrollToSource="false"/>
+ </component>
+ <component name="EjbViewSettings">
+ <EjbView showMembers="false" autoscrollToSource="false"/>
+ </component>
+ <component name="AppServerRunManager"/>
+ <component name="StarteamConfiguration">
+ <option name="SERVER" value=""/>
+ <option name="PORT" value="49201"/>
+ <option name="USER" value=""/>
+ <option name="PASSWORD" value=""/>
+ <option name="PROJECT" value=""/>
+ <option name="VIEW" value=""/>
+ <option name="ALTERNATIVE_WORKING_PATH" value=""/>
+ <option name="PUT_FOCUS_INTO_COMMENT" value="false"/>
+ <option name="SHOW_CHECKIN_OPTIONS" value="true"/>
+ <option name="LAST_COMMIT_MESSAGE" value=""/>
+ <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8"/>
+ </component>
+ <component name="Cvs2Configuration">
+ <option name="ON_FILE_ADDING" value="0"/>
+ <option name="ON_FILE_REMOVING" value="0"/>
+ <option name="PRUNE_EMPTY_DIRECTORIES" value="true"/>
+ <option name="SHOW_UPDATE_OPTIONS" value="true"/>
+ <option name="SHOW_ADD_OPTIONS" value="true"/>
+ <option name="SHOW_REMOVE_OPTIONS" value="true"/>
+ <option name="MERGING_MODE" value="0"/>
+ <option name="MERGE_WITH_BRANCH1_NAME" value="HEAD"/>
+ <option name="MERGE_WITH_BRANCH2_NAME" value="HEAD"/>
+ <option name="RESET_STICKY" value="false"/>
+ <option name="CREATE_NEW_DIRECTORIES" value="true"/>
+ <option name="DEFAULT_TEXT_FILE_SUBSTITUTION" value="kv"/>
+ <option name="PROCESS_UNKNOWN_FILES" value="false"/>
+ <option name="PROCESS_DELETED_FILES" value="false"/>
+ <option name="SHOW_EDIT_DIALOG" value="true"/>
+ <option name="RESERVED_EDIT" value="false"/>
+ <option name="FILE_HISTORY_SPLITTER_PROPORTION" value="0.6"/>
+ <option name="SHOW_CHECKOUT_OPTIONS" value="true"/>
+ <option name="CHECKOUT_DATE_OR_REVISION_SETTINGS">
+ <value>
+ <option name="BRANCH" value=""/>
+ <option name="DATE" value=""/>
+ <option name="USE_BRANCH" value="false"/>
+ <option name="USE_DATE" value="false"/>
+ </value>
+ </option>
+ <option name="UPDATE_DATE_OR_REVISION_SETTINGS">
+ <value>
+ <option name="BRANCH" value=""/>
+ <option name="DATE" value=""/>
+ <option name="USE_BRANCH" value="false"/>
+ <option name="USE_DATE" value="false"/>
+ </value>
+ </option>
+ <option name="SHOW_CHANGES_REVISION_SETTINGS">
+ <value>
+ <option name="BRANCH" value=""/>
+ <option name="DATE" value=""/>
+ <option name="USE_BRANCH" value="false"/>
+ <option name="USE_DATE" value="false"/>
+ </value>
+ </option>
+ <option name="SHOW_OUTPUT" value="false"/>
+ <option name="SHOW_FILE_HISTORY_AS_TREE" value="false"/>
+ <option name="UPDATE_GROUP_BY_PACKAGES" value="false"/>
+ <option name="ADD_WATCH_INDEX" value="0"/>
+ <option name="REMOVE_WATCH_INDEX" value="0"/>
+ <option name="UPDATE_KEYWORD_SUBSTITUTION"/>
+ <option name="MAKE_NEW_FILES_READONLY" value="false"/>
+ <option name="SHOW_CORRUPTED_PROJECT_FILES" value="0"/>
+ <option name="TAG_AFTER_FILE_COMMIT" value="false"/>
+ <option name="TAG_AFTER_FILE_COMMIT_NAME" value=""/>
+ <option name="TAG_AFTER_PROJECT_COMMIT" value="false"/>
+ <option name="TAG_AFTER_PROJECT_COMMIT_NAME" value=""/>
+ <option name="PUT_FOCUS_INTO_COMMENT" value="false"/>
+ <option name="SHOW_CHECKIN_OPTIONS" value="true"/>
+ <option name="FORCE_NON_EMPTY_COMMENT" value="false"/>
+ <option name="LAST_COMMIT_MESSAGE" value=""/>
+ <option name="SAVE_LAST_COMMIT_MESSAGE" value="true"/>
+ <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8"/>
+ <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false"/>
+ <option name="OPTIMIZE_IMPORTS_BEFORE_FILE_COMMIT" value="false"/>
+ <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false"/>
+ <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false"/>
+ <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8"/>
+ <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5"/>
+ </component>
+ <component name="CvsTabbedWindow"/>
+ <component name="SvnConfiguration">
+ <option name="USER" value=""/>
+ <option name="PASSWORD" value=""/>
+ <option name="AUTO_ADD_FILES" value="0"/>
+ <option name="AUTO_DEL_FILES" value="0"/>
+ </component>
+ <component name="PerforceConfiguration">
+ <option name="PORT" value="magic:1666"/>
+ <option name="USER" value=""/>
+ <option name="PASSWORD" value=""/>
+ <option name="CLIENT" value=""/>
+ <option name="TRACE" value="false"/>
+ <option name="PERFORCE_STATUS" value="true"/>
+ <option name="CHANGELIST_OPTION" value="false"/>
+ <option name="SYSTEMROOT" value=""/>
+ <option name="P4_EXECUTABLE" value="p4"/>
+ <option name="SHOW_BRANCH_HISTORY" value="false"/>
+ <option name="GENERATE_COMMENT" value="false"/>
+ <option name="SYNC_OPTION" value="Sync"/>
+ <option name="PUT_FOCUS_INTO_COMMENT" value="false"/>
+ <option name="SHOW_CHECKIN_OPTIONS" value="true"/>
+ <option name="FORCE_NON_EMPTY_COMMENT" value="true"/>
+ <option name="LAST_COMMIT_MESSAGE" value=""/>
+ <option name="SAVE_LAST_COMMIT_MESSAGE" value="true"/>
+ <option name="CHECKIN_DIALOG_SPLITTER_PROPORTION" value="0.8"/>
+ <option name="OPTIMIZE_IMPORTS_BEFORE_PROJECT_COMMIT" value="false"/>
+ <option name="OPTIMIZE_IMPORTS_BEFORE_FILE_COMMIT" value="false"/>
+ <option name="REFORMAT_BEFORE_PROJECT_COMMIT" value="false"/>
+ <option name="REFORMAT_BEFORE_FILE_COMMIT" value="false"/>
+ <option name="FILE_HISTORY_DIALOG_COMMENTS_SPLITTER_PROPORTION" value="0.8"/>
+ <option name="FILE_HISTORY_DIALOG_SPLITTER_PROPORTION" value="0.5"/>
+ </component>
+</project>
diff --git a/metadata-service/data-builders/data-builders.iml b/metadata-service/data-builders/data-builders.iml
new file mode 100644
index 0000000..3d5413d
--- /dev/null
+++ b/metadata-service/data-builders/data-builders.iml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/target/maven-shared-archive-resources" isTestSource="false" />
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
\ No newline at end of file
diff --git a/metadata-service/data-builders/pom.xml b/metadata-service/data-builders/pom.xml
new file mode 100644
index 0000000..1af2131
--- /dev/null
+++ b/metadata-service/data-builders/pom.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>airavata-data-lake</artifactId>
+ <groupId>org.apache.airavata.data.lake</groupId>
+ <version>0.01-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>data-builders</artifactId>
+
+ <properties>
+ <maven.compiler.source>11</maven.compiler.source>
+ <maven.compiler.target>11</maven.compiler.target>
+ </properties>
+
+</project>
\ No newline at end of file
diff --git a/metadata-service/db-service/db-service.iml b/metadata-service/db-service/db-service.iml
new file mode 100644
index 0000000..a137c71
--- /dev/null
+++ b/metadata-service/db-service/db-service.iml
@@ -0,0 +1,420 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+ <component name="FacetManager">
+ <facet type="web" name="Web">
+ <configuration>
+ <webroots />
+ <sourceRoots>
+ <root url="file://$MODULE_DIR$/src/main/java" />
+ <root url="file://$MODULE_DIR$/src/main/resources" />
+ </sourceRoots>
+ </configuration>
+ </facet>
+ <facet type="Spring" name="Spring">
+ <configuration />
+ </facet>
+ </component>
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
+ <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
+ <sourceFolder url="file://$MODULE_DIR$/target/maven-shared-archive-resources" isTestSource="true" />
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/neo4j/neo4j-ogm-bolt-driver/3.2.20/neo4j-ogm-bolt-driver-3.2.20.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/neo4j/neo4j-ogm-api/3.2.20/neo4j-ogm-api-3.2.20.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/core/jackson-databind/2.9.9/jackson-databind-2.9.9.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.9.9/jackson-datatype-jdk8-2.9.9.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.9.9/jackson-datatype-jsr310-2.9.9.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/slf4j/slf4j-api/1.7.25/slf4j-api-1.7.25.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/neo4j/driver/neo4j-java-driver/4.0.2/neo4j-java-driver-4.0.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/neo4j/neo4j-ogm-core/3.2.20/neo4j-ogm-core-3.2.20.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/apache/commons/commons-lang3/3.8/commons-lang3-3.8.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/io/github/classgraph/classgraph/4.8.86/classgraph-4.8.86.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter-web/2.4.2/spring-boot-starter-web-2.4.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter/2.4.2/spring-boot-starter-2.4.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot/2.4.2/spring-boot-2.4.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/spring-core/5.3.3/spring-core-5.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/spring-jcl/5.3.3/spring-jcl-5.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/spring-context/5.3.3/spring-context-5.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/spring-aop/5.3.3/spring-aop-5.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/spring-beans/5.3.3/spring-beans-5.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/spring-expression/5.3.3/spring-expression-5.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-autoconfigure/2.4.2/spring-boot-autoconfigure-2.4.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter-logging/2.4.2/spring-boot-starter-logging-2.4.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/apache/logging/log4j/log4j-to-slf4j/2.13.3/log4j-to-slf4j-2.13.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/apache/logging/log4j/log4j-api/2.13.3/log4j-api-2.13.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/slf4j/jul-to-slf4j/1.7.30/jul-to-slf4j-1.7.30.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/jakarta/annotation/jakarta.annotation-api/1.3.5/jakarta.annotation-api-1.3.5.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/yaml/snakeyaml/1.27/snakeyaml-1.27.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter-json/2.4.2/spring-boot-starter-json-2.4.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/spring-web/5.3.3/spring-web-5.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/com/fasterxml/jackson/module/jackson-module-parameter-names/2.11.4/jackson-module-parameter-names-2.11.4.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/boot/spring-boot-starter-tomcat/2.4.2/spring-boot-starter-tomcat-2.4.2.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/apache/tomcat/embed/tomcat-embed-core/9.0.41/tomcat-embed-core-9.0.41.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/glassfish/jakarta.el/3.0.3/jakarta.el-3.0.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/apache/tomcat/embed/tomcat-embed-websocket/9.0.41/tomcat-embed-websocket-9.0.41.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="module-library">
+ <library>
+ <CLASSES>
+ <root url="jar://$USER_HOME$/.m12/org/springframework/spring-webmvc/5.3.3/spring-webmvc-5.3.3.jar!/" />
+ </CLASSES>
+ <JAVADOC />
+ <SOURCES />
+ </library>
+ </orderEntry>
+ <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.4.2" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.4.2" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.4.2" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.4.2" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.4.2" level="project" />
+ <orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
+ <orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
+ <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
+ <orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
+ <orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
+ <orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-core:5.3.3" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.3.3" level="project" />
+ <orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.27" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.4.2" level="project" />
+ <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.4" level="project" />
+ <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.4" level="project" />
+ <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.4" level="project" />
+ <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4" level="project" />
+ <orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.4" level="project" />
+ <orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.4" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.4.2" level="project" />
+ <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.41" level="project" />
+ <orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
+ <orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.41" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-web:5.3.3" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-beans:5.3.3" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.3.3" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-aop:5.3.3" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-context:5.3.3" level="project" />
+ <orderEntry type="library" name="Maven: org.springframework:spring-expression:5.3.3" level="project" />
+ <orderEntry type="library" name="Maven: org.neo4j:neo4j-ogm-core:3.2.20" level="project" />
+ <orderEntry type="library" name="Maven: org.neo4j:neo4j-ogm-api:3.2.20" level="project" />
+ <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.25" level="project" />
+ <orderEntry type="library" name="Maven: org.apache.commons:commons-lang3:3.8" level="project" />
+ <orderEntry type="library" name="Maven: io.github.classgraph:classgraph:4.8.86" level="project" />
+ <orderEntry type="library" name="Maven: org.neo4j:neo4j-ogm-bolt-driver:3.2.20" level="project" />
+ <orderEntry type="library" name="Maven: org.neo4j.driver:neo4j-java-driver:4.0.2" level="project" />
+ <orderEntry type="library" name="Maven: org.reactivestreams:reactive-streams:1.0.3" level="project" />
+ </component>
+</module>
\ No newline at end of file
diff --git a/metadata-service/db-service/pom.xml b/metadata-service/db-service/pom.xml
new file mode 100644
index 0000000..594f50f
--- /dev/null
+++ b/metadata-service/db-service/pom.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>metadata-service</artifactId>
+ <groupId>org.apache.airavata.data.lake</groupId>
+ <version>0.01-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>db-service</artifactId>
+
+ <properties>
+ <maven.compiler.source>11</maven.compiler.source>
+ <maven.compiler.target>11</maven.compiler.target>
+ </properties>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.data</groupId>-->
+<!-- <artifactId>spring-data-neo4j</artifactId>-->
+<!-- </dependency>-->
+ <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-neo4j -->
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.boot</groupId>-->
+<!-- <artifactId>spring-boot-starter-data-neo4j</artifactId>-->
+<!-- </dependency>-->
+
+ <dependency>
+ <groupId>org.neo4j</groupId>
+ <artifactId>neo4j-ogm-core</artifactId>
+ </dependency>
+
+ <!-- Only add if you're using the Bolt driver -->
+ <dependency>
+ <groupId>org.neo4j</groupId>
+ <artifactId>neo4j-ogm-bolt-driver</artifactId>
+ </dependency>
+
+ </dependencies>
+
+
+</project>
\ No newline at end of file
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/AppConfig.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/AppConfig.java
new file mode 100644
index 0000000..d941b92
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/AppConfig.java
@@ -0,0 +1,108 @@
+package org.apache.airavata.datalake.metadata.db.service;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.Connector;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.Neo4JConnector;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Group;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Resource;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Tenant;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.User;
+import org.neo4j.ogm.cypher.ComparisonOperator;
+import org.neo4j.ogm.cypher.Filter;
+import org.neo4j.ogm.session.Session;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class AppConfig {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(AppConfig.class);
+
+ @Autowired
+ private Connector connector;
+
+
+ @Bean
+ Tenant getTenant() {
+ LOGGER.info("Calling get tenant############");
+ Tenant tenant = new Tenant();
+ tenant.setTenantId("123456789");
+ tenant.setName("Tenant");
+
+ User user = new User();
+ user.setFirstName("UserA");
+ user.setUserName("user_a");
+
+ User user1 = new User();
+ user1.setFirstName("UserB");
+ user1.setUserName("user_b");
+
+ User user2 = new User();
+ user2.setFirstName("UserC");
+ user2.setUserName("user_c");
+
+ Group group = new Group();
+ group.setName("g1");
+
+ Group group2 = new Group();
+ group2.setName("g2");
+
+ Group group3 = new Group();
+ group3.setName("g3");
+
+ group.addChildGroup(group2, 0, 0, null);
+ group2.addChildGroup(group3, 0, 0, null);
+
+
+ Resource resource = new Resource();
+ resource.setName("R1");
+
+ Resource resource1 = new Resource();
+ resource1.setName("R2");
+
+ Resource resource2 = new Resource();
+ resource2.setName("R3");
+
+ Resource resource3 = new Resource();
+ resource3.setName("R4");
+
+
+ group.addChildUser(user, "ADMIN", 0, 0, null);
+ resource.addChildResource(resource1, 0, 0, null);
+ resource.shareWithAUser(user, "READ", 0, 0, null);
+
+
+ group2.addChildUser(user1, "ADMIN", 0, 0, null);
+ group3.addChildUser(user2, "ADMIN", 0, 0, null);
+
+ resource1.shareWithAGroup(group2, "WRITE", 0, 0, null);
+ resource2.shareWithAGroup(group3, "WRITE", 0, 0, null);
+
+ tenant.add(user, 0, 0, null);
+ tenant.add(group, 0, 0, null);
+ tenant.add(resource, 0, 0, null);
+
+ Session session = ((Neo4JConnector) connector).openConnection();
+ session.save(tenant);
+
+ Filter filter = new Filter("name", ComparisonOperator.EQUALS, "R3");
+
+// Collection<Resource> resources = session.loadAll(Resource.class, filter, 1);
+// resources.stream().forEach(t -> {
+// LOGGER.info("Resources " + t.getName());
+// t.addChildResource(resource3, 0, 0, null);
+// Resource resource4 = (Resource) session.load(Resource.class, new Long(13));
+// session.delete(resource4);
+// session.save(t);
+// });
+
+
+ return tenant;
+
+ }
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/Neo4JServiceInitializer.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/Neo4JServiceInitializer.java
new file mode 100644
index 0000000..9a3d9c8
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/Neo4JServiceInitializer.java
@@ -0,0 +1,14 @@
+package org.apache.airavata.datalake.metadata.db.service;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+@ComponentScan(basePackages = {"org.apache.airavata"})
+@SpringBootApplication
+public class Neo4JServiceInitializer {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Neo4JServiceInitializer.class, args);
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/XmlConfiguration.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/XmlConfiguration.java
new file mode 100644
index 0000000..bd8e468
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/XmlConfiguration.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.db.service;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.ImportResource;
+
+@Configuration
+@ImportResource({"classpath*:applicationContext.xml"})
+public class XmlConfiguration {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Connector.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Connector.java
new file mode 100644
index 0000000..c96905f
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Connector.java
@@ -0,0 +1,10 @@
+package org.apache.airavata.datalake.metadata.db.service.backend;
+
+import java.io.Closeable;
+
+public interface Connector extends Closeable {
+
+ public boolean init();
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Person.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Person.java
new file mode 100644
index 0000000..83988ac
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/Person.java
@@ -0,0 +1,74 @@
+package org.apache.airavata.datalake.metadata.db.service.backend;
+
+
+import org.neo4j.ogm.annotation.Properties;
+import org.neo4j.ogm.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+@NodeEntity
+public class Person {
+
+
+ @Id
+ @GeneratedValue
+// //Add this annotation
+// @org.springframework.data.annotation.Id
+// @Property
+ private Long id;
+
+ @Property
+ private String name;
+
+ @Properties(allowCast = true)
+ private Map<String, Object> valueProperties = new HashMap<>();
+
+ private Person() {
+ // Empty constructor required as of Neo4j API 2.0.5
+ }
+
+ ;
+
+ public Person(String name) {
+ this.name = name;
+ }
+
+
+ /**
+ * Neo4j doesn't REALLY have bi-directional relationships. It just means when querying
+ * to ignore the direction of the relationship.
+ * https://dzone.com/articles/modelling-data-neo4j
+ */
+ @Relationship(type = "TEAMMATE")
+ public Set<Person> teammates;
+
+ public void worksWith(Person person) {
+ if (teammates == null) {
+ teammates = new HashSet<>();
+ }
+ teammates.add(person);
+ }
+
+
+ public void addProperty(String key, String value) {
+ this.valueProperties.put(key, value);
+ }
+
+ public String toString() {
+
+ return this.name + "'s teammates => "
+ + Optional.ofNullable(this.teammates).orElse(
+ Collections.emptySet()).stream()
+ .map(Person::getName)
+ .collect(Collectors.toList());
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
\ No newline at end of file
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/Neo4JConnector.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/Neo4JConnector.java
new file mode 100644
index 0000000..befa1cd
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/Neo4JConnector.java
@@ -0,0 +1,53 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.Connector;
+import org.apache.airavata.datalake.metadata.db.service.exceptions.DBConnectorException;
+import org.neo4j.ogm.config.Configuration;
+import org.neo4j.ogm.session.Session;
+import org.neo4j.ogm.session.SessionFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+
+import java.io.IOException;
+
+public class Neo4JConnector implements Connector {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(Neo4JConnector.class);
+
+ private SessionFactory factory;
+
+ @Value("${spring.neo4j.uri}")
+ private String neo4JURI;
+
+
+ @Override
+ public boolean init() {
+ try {
+ LOGGER.info("Initializing Neo4J connector ......");
+ Configuration configuration = new Configuration.Builder()
+ .uri(neo4JURI)
+ .build();
+ factory =
+ new SessionFactory(configuration, "org.apache.airavata.datalake.metadata.db.service");
+ return true;
+ } catch (Exception ex) {
+ String msg = "Neo4J Connection Failure, " + ex.getMessage();
+ LOGGER.error(msg);
+ throw new DBConnectorException(msg, ex);
+ }
+ }
+
+ @Override
+ public void close() throws IOException {
+ if (factory != null) {
+ factory.close();
+ }
+ }
+
+ public Session openConnection() {
+ return factory.openSession();
+ }
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GenericService.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GenericService.java
new file mode 100644
index 0000000..1a24815
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GenericService.java
@@ -0,0 +1,79 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.Connector;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.Neo4JConnector;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Entity;
+import org.neo4j.ogm.cypher.Filter;
+import org.neo4j.ogm.cypher.query.Pagination;
+import org.neo4j.ogm.cypher.query.SortOrder;
+import org.neo4j.ogm.session.Session;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+
+public abstract class GenericService<T> implements Service<T> {
+
+ private static final int DEPTH_LIST = 0;
+ private static final int DEPTH_ENTITY = 1;
+
+ private Connector connector;
+
+ private Session session;
+
+ public GenericService(@Autowired Connector connector) {
+ this.connector = connector;
+ this.session = ((Neo4JConnector) this.connector).openConnection();
+ }
+
+
+ @Override
+ public Iterable<T> findAll() {
+ return session.loadAll(getEntityType(), DEPTH_LIST);
+ }
+
+ @Override
+ public T find(Long id) {
+ return session.load(getEntityType(), id, DEPTH_ENTITY);
+ }
+
+ @Override
+ public void delete(Long id) {
+ session.delete(session.load(getEntityType(), id));
+ }
+
+ @Override
+ public Collection<T> search(List<SearchOperator> searchOperatorList) {
+ AtomicReference<Filter> filter = null;
+ searchOperatorList.forEach(value -> {
+ if (filter.get() == null) {
+ filter.set(new Filter(value.getValue(), value.getComparisonOperator(), value.getValue()));
+ } else {
+ filter.get().and(new Filter(value.getValue(), value.getComparisonOperator(), value.getValue()));
+ }
+
+ });
+ return session.loadAll(getEntityType(), filter.get());
+ }
+
+ @Override
+ public Iterable<T> sort(SortOrder.Direction sortOrder, String property) {
+ return session.loadAll(getEntityType(),new SortOrder().add(sortOrder,property));
+ }
+
+ @Override
+ public Iterable<T> sortAndPaging(SortOrder.Direction sortOrder, int pageNumber,
+ int itemsPerPage, String property) {
+ return session.loadAll(getEntityType(),
+ new SortOrder().add(sortOrder,property), new Pagination(pageNumber,itemsPerPage));
+ }
+
+ @Override
+ public T createOrUpdate(T entity) {
+ session.save(entity, DEPTH_ENTITY);
+ return find(((Entity) entity).getId());
+ }
+
+ abstract Class<T> getEntityType();
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GroupService.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GroupService.java
new file mode 100644
index 0000000..dc83a02
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/GroupService.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+public interface GroupService {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/ResourceService.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/ResourceService.java
new file mode 100644
index 0000000..5cf5a03
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/ResourceService.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+public interface ResourceService {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/SearchOperator.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/SearchOperator.java
new file mode 100644
index 0000000..1717d1a
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/SearchOperator.java
@@ -0,0 +1,33 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+import org.neo4j.ogm.cypher.ComparisonOperator;
+
+public class SearchOperator {
+ private String key;
+ private String value;
+ private ComparisonOperator comparisonOperator;
+
+ public String getKey() {
+ return key;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public ComparisonOperator getComparisonOperator() {
+ return comparisonOperator;
+ }
+
+ public void setComparisonOperator(ComparisonOperator comparisonOperator) {
+ this.comparisonOperator = comparisonOperator;
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/Service.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/Service.java
new file mode 100644
index 0000000..ee73d18
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/Service.java
@@ -0,0 +1,24 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+import org.neo4j.ogm.cypher.query.SortOrder;
+
+import java.util.Collection;
+import java.util.List;
+
+public interface Service<T> {
+
+ Iterable<T> findAll();
+
+ T find(Long id);
+
+ void delete(Long id);
+
+ Collection<T> search(List<SearchOperator> searchOperatorList);
+
+ Iterable<T> sort(SortOrder.Direction sortOrder, String property);
+
+ Iterable<T> sortAndPaging(SortOrder.Direction direction, int pageNumber, int itemsPerPage, String property);
+
+ T createOrUpdate(T Object);
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/UserService.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/UserService.java
new file mode 100644
index 0000000..7669a05
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/curd/operators/UserService.java
@@ -0,0 +1,4 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.curd.operators;
+
+public interface UserService {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Entity.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Entity.java
new file mode 100644
index 0000000..158f94a
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Entity.java
@@ -0,0 +1,109 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.Has;
+import org.neo4j.ogm.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class Entity {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @Properties(prefix = "external_id")
+ private Map<String,String > externalIds = new HashMap<>();
+
+ @Property(name = "created_at")
+ private long createdAt = System.currentTimeMillis();
+
+ @Property(name = "last_modified_at")
+ private long lastModifiedAt = System.currentTimeMillis();
+
+ @Property(name = "source")
+ private String source;
+
+ @Properties(prefix = "custom")
+ private Map<String, String> properties = new HashMap<>();
+
+ @Property(name = "primary_external_key")
+ private String primaryExternalKey;
+
+ @Relationship(type = "HAS", direction = Relationship.INCOMING)
+ private Has tenantInPointer;
+
+ @Property(name = "tenant_id")
+ private String tenantId;
+
+ public Long getId() {
+ return id;
+ }
+
+ public long getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(long createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public long getLastModifiedAt() {
+ return lastModifiedAt;
+ }
+
+ public void setLastModifiedAt(long lastModifiedAt) {
+ this.lastModifiedAt = lastModifiedAt;
+ }
+
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+
+ public void setProperties(Map<String, String> properties) {
+ this.properties = properties;
+ }
+
+ public Map<String, String> getExternalIds() {
+ return externalIds;
+ }
+
+ public void setExternalIds(Map<String, String> externalIds) {
+ this.externalIds = externalIds;
+ }
+
+ public String getSource() {
+ return source;
+ }
+
+ public void setSource(String source) {
+ this.source = source;
+ }
+
+ public String getPrimaryExternalKey() {
+ return primaryExternalKey;
+ }
+
+ public void setPrimaryExternalKey(String primaryExternalKey) {
+ this.primaryExternalKey = primaryExternalKey;
+ }
+
+ public Has getTenantInPointer() {
+ return tenantInPointer;
+ }
+
+ public void setTenantInPointer(Has tenantInPointer) {
+ this.tenantInPointer = tenantInPointer;
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Group.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Group.java
new file mode 100644
index 0000000..3d26d98
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Group.java
@@ -0,0 +1,208 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.*;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@NodeEntity
+public class Group extends Entity {
+
+ @Property(name = "name")
+ private String name;
+
+ @Property(name = "description")
+ private String description;
+
+
+ @Relationship(type = "HAS_CHILD_GROUP")
+ private Set<HasChildGroup> childGroups = new HashSet<>();
+
+ @Relationship(type = "HAS_CHILD_GROUP", direction = Relationship.INCOMING)
+ private HasChildGroup ChildGroupInPointers;
+
+ @Relationship(type = "HAS_CHILD_USER")
+ private Set<HasChildUser> childUsers = new HashSet<>();
+
+ @Relationship(type = "HAS_PARENT_GROUP", direction = Relationship.INCOMING)
+ private Set<HasParentGroup> parentGroupInPointers = new HashSet<>();
+
+ @Relationship(type = "HAS_PARENT_GROUP")
+ private HasParentGroup parent;
+
+ @Relationship(type = "MEMBER_OF", direction = Relationship.INCOMING)
+ private Set<MemberOf> memberUsersInPointers = new HashSet<>();
+
+ @Relationship(type = "SHARED_WITH", direction = Relationship.INCOMING)
+ private Set<SharedWith> sharedResourcesInPointers = new HashSet<>();
+
+ @Relationship(type = "HAS_ACCESS")
+ private Set<HasAccess> accessibleResources = new HashSet<>();
+
+
+ public Group() {
+
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+
+ public Set<HasChildGroup> getChildGroups() {
+ return childGroups;
+ }
+
+ public void addChildGroup(HasChildGroup childGroup) {
+ this.childGroups.add(childGroup);
+ }
+
+ public Set<HasChildUser> getChildUsers() {
+ return childUsers;
+ }
+
+ public void addChildUser(HasChildUser childUser) {
+ this.childUsers.add(childUser);
+ }
+
+
+ public Set<MemberOf> getMemberUsersInPointers() {
+ return memberUsersInPointers;
+ }
+
+ private void addMemberUserInPointer(MemberOf memberUser) {
+ this.memberUsersInPointers.add(memberUser);
+ }
+
+ public Set<SharedWith> getSharedResourcesInPointers() {
+ return sharedResourcesInPointers;
+ }
+
+ public void addSharedResourcesInPointers(SharedWith sharedResourcesInPointer) {
+ this.sharedResourcesInPointers.add(sharedResourcesInPointer);
+ }
+
+ public Set<HasAccess> getAccessibleResources() {
+ return accessibleResources;
+ }
+
+ public void addAccessibleResources(HasAccess accessibleResources) {
+ this.accessibleResources.add(accessibleResources);
+ }
+
+ public void setChildGroups(Set<HasChildGroup> childGroups) {
+ this.childGroups = childGroups;
+ }
+
+ public HasChildGroup getChildGroupInPointers() {
+ return ChildGroupInPointers;
+ }
+
+ public void setChildGroupInPointers(HasChildGroup childGroupInPointers) {
+ this.ChildGroupInPointers = childGroupInPointers;
+ }
+
+ public void setChildUsers(Set<HasChildUser> childUsers) {
+ this.childUsers = childUsers;
+ }
+
+ public Set<HasParentGroup> getParentGroupInPointers() {
+ return parentGroupInPointers;
+ }
+
+ private void addParentGroupInPointer(HasParentGroup parentGroup) {
+ this.parentGroupInPointers.add(parentGroup);
+ }
+
+ public HasParentGroup getParent() {
+ return parent;
+ }
+
+ public void setParent(HasParentGroup parent) {
+ this.parent = parent;
+ }
+
+ public void setMemberUsersInPointers(Set<MemberOf> memberUsersInPointers) {
+ this.memberUsersInPointers = memberUsersInPointers;
+ }
+
+ public void addChildUser(User user, String membership, long relationshipCreatedAt,
+ long relationshipModifiedAt, Map<String, String> relationshipProperties) {
+ MemberOf memberOf = new MemberOf();
+ memberOf.setMembershipType(membership);
+ memberOf.setStartEntity(user);
+ memberOf.setEndEntity(this);
+ user.addMemberGroup(memberOf);
+ this.addMemberUserInPointer(memberOf);
+
+ HasChildUser childUser = new HasChildUser();
+ childUser.setUserType(membership);
+ childUser.setStartEntity(this);
+ childUser.setEndEntity(user);
+ user.addGroup(childUser);
+ this.addChildUser(childUser);
+
+ if (relationshipCreatedAt != 0) {
+ memberOf.setCreatedAt(relationshipCreatedAt);
+ childUser.setCreatedAt(relationshipCreatedAt);
+ }
+ if (relationshipModifiedAt != 0) {
+ memberOf.setLastModifiedAt(relationshipModifiedAt);
+ childUser.setLastModifiedAt(relationshipModifiedAt);
+ }
+ if (relationshipProperties != null) {
+ memberOf.setProperties(relationshipProperties);
+ childUser.setProperties(relationshipProperties);
+ }
+
+ }
+
+
+ public void addChildGroup(Group group, long relationShipCreatedAt,
+ long relationShipModifiedAt, Map<String, String> relationshipProperties) {
+
+ HasChildGroup hasChildGroup = new HasChildGroup();
+ hasChildGroup.setStartEntity(this);
+ hasChildGroup.setEndEntity(group);
+ this.addChildGroup(hasChildGroup);
+ group.setChildGroupInPointers(hasChildGroup);
+
+ HasParentGroup hasParentGroup = new HasParentGroup();
+ hasParentGroup.setStartEntity(group);
+ hasParentGroup.setEndEntity(this);
+ group.setParent(hasParentGroup);
+ this.addParentGroupInPointer(hasParentGroup);
+
+ if (relationShipCreatedAt != 0) {
+ hasParentGroup.setCreatedAt(relationShipCreatedAt);
+ hasChildGroup.setCreatedAt(relationShipCreatedAt);
+ }
+ if (relationShipModifiedAt != 0) {
+ hasParentGroup.setLastModifiedAt(relationShipModifiedAt);
+ hasChildGroup.setLastModifiedAt(relationShipModifiedAt);
+ }
+ if (relationshipProperties != null) {
+ hasParentGroup.setProperties(relationshipProperties);
+ hasChildGroup.setProperties(relationshipProperties);
+ }
+
+ }
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Resource.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Resource.java
new file mode 100644
index 0000000..5df5e77
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Resource.java
@@ -0,0 +1,215 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.*;
+import org.neo4j.ogm.annotation.*;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+@NodeEntity
+public class Resource extends Entity {
+
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @Property(name = "name")
+ private String name;
+
+ @Relationship(type = "HAS", direction = Relationship.INCOMING)
+ private Has tenantPointer;
+
+ @Relationship(type = "HAS_CHILD_RESOURCE")
+ private Set<HasChildResource> childResourceSet = new HashSet<>();
+
+ @Relationship(type = "HAS_CHILD_RESOURCE", direction = Relationship.INCOMING)
+ private HasChildResource parentInPointer;
+
+ @Relationship(type = "HAS_PARENT_RESOURCE", direction = Relationship.INCOMING)
+ private Set<HasParentResource> childInPointers = new HashSet<>();
+
+ @Relationship(type = "HAS_PARENT_RESOURCE")
+ private HasParentResource parent;
+
+ @Relationship(type = "SHARED_WITH")
+ private Set<SharedWith> shares = new HashSet<>();
+
+ @Relationship(type = "HAS_ACCESS", direction = Relationship.INCOMING)
+ private Set<HasAccess> accesses = new HashSet<>();
+
+ public Resource() {
+ }
+
+
+ public Has getTenantPointer() {
+ return tenantPointer;
+ }
+
+ public void setTenantPointer(Has tenantPointer) {
+ this.tenantPointer = tenantPointer;
+ }
+
+ public Set<HasChildResource> getChildResourceSet() {
+ return childResourceSet;
+ }
+
+ public void addChildResource(HasChildResource childResource) {
+ this.childResourceSet.add(childResource);
+ }
+
+ public Set<HasParentResource> getChildInPointers() {
+ return childInPointers;
+ }
+
+ public void addChildInPointers(HasParentResource childInPointers) {
+ this.childInPointers.add(childInPointers);
+ }
+
+ public HasParentResource getParent() {
+ return parent;
+ }
+
+ public void setParent(HasParentResource parent) {
+ this.parent = parent;
+ }
+
+ public HasChildResource getParentInPointer() {
+ return parentInPointer;
+ }
+
+ public void setParentInPointer(HasChildResource parentInPointer) {
+ this.parentInPointer = parentInPointer;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Set<SharedWith> getShares() {
+ return shares;
+ }
+
+ public void addShares(SharedWith share) {
+ this.shares.add(share);
+ }
+
+ public Set<HasAccess> getAccesses() {
+ return accesses;
+ }
+
+ public void addAccess(HasAccess access) {
+ this.accesses.add(access);
+ }
+
+ @Override
+ public Long getId() {
+ return id;
+ }
+
+ @Override
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public void addChildResource(Resource resource, long createdAt, long lastModifiedAt,
+ Map<String, String> properties) {
+ HasChildResource hasChildResource = new HasChildResource();
+ hasChildResource.setStartEntity(this);
+ hasChildResource.setEndEntity(resource);
+ this.addChildResource(hasChildResource);
+ resource.setParentInPointer(hasChildResource);
+
+ HasParentResource hasParentResource = new HasParentResource();
+ hasParentResource.setStartEntity(resource);
+ hasParentResource.setEndEntity(this);
+ resource.setParent(hasParentResource);
+ this.addChildInPointers(hasParentResource);
+
+ if (createdAt != 0) {
+ hasParentResource.setCreatedAt(createdAt);
+ hasChildResource.setCreatedAt(createdAt);
+ }
+ if (lastModifiedAt != 0) {
+ hasParentResource.setLastModifiedAt(lastModifiedAt);
+ hasChildResource.setLastModifiedAt(lastModifiedAt);
+ }
+ if (properties != null) {
+ hasParentResource.setProperties(properties);
+ hasChildResource.setProperties(properties);
+ }
+
+ }
+
+ public void shareWithAUser(User user, String permission, long createdAt, long lastModifiedAt,
+ Map<String, String> properties) {
+
+ SharedWith sharedWith = new SharedWith();
+ sharedWith.setStartEntity(this);
+ sharedWith.setEndEntity(user);
+ sharedWith.setPermissionType(permission);
+ this.addShares(sharedWith);
+ user.addSharedResource(sharedWith);
+
+ HasAccess hasAccess = new HasAccess();
+ hasAccess.setStartEntity(user);
+ hasAccess.setEndEntity(this);
+ hasAccess.setPermissionType(permission);
+ this.addAccess(hasAccess);
+ user.addAccessibleResources(hasAccess);
+
+ if (createdAt != 0) {
+ sharedWith.setCreatedAt(createdAt);
+ hasAccess.setCreatedAt(createdAt);
+ }
+ if (lastModifiedAt != 0) {
+ sharedWith.setLastModifiedAt(lastModifiedAt);
+ hasAccess.setLastModifiedAt(lastModifiedAt);
+ }
+ if (properties != null) {
+ sharedWith.setProperties(properties);
+ hasAccess.setProperties(properties);
+ }
+
+ }
+
+ public void shareWithAGroup(Group group, String permission, long relationshipCreatedAt, long relationshipLastModifiedAt,
+ Map<String, String> relationshipProperties) {
+
+ SharedWith sharedWith = new SharedWith();
+ sharedWith.setStartEntity(this);
+ sharedWith.setEndEntity(group);
+ sharedWith.setPermissionType(permission);
+ this.addShares(sharedWith);
+ group.addSharedResourcesInPointers(sharedWith);
+
+ HasAccess hasAccess = new HasAccess();
+ hasAccess.setStartEntity(group);
+ hasAccess.setEndEntity(this);
+ hasAccess.setPermissionType(permission);
+ this.addAccess(hasAccess);
+ group.addAccessibleResources(hasAccess);
+
+ if (relationshipCreatedAt != 0) {
+ sharedWith.setCreatedAt(relationshipCreatedAt);
+ hasAccess.setCreatedAt(relationshipCreatedAt);
+ }
+ if (relationshipLastModifiedAt != 0) {
+ sharedWith.setLastModifiedAt(relationshipLastModifiedAt);
+ hasAccess.setLastModifiedAt(relationshipLastModifiedAt);
+ }
+ if (relationshipProperties != null) {
+ sharedWith.setProperties(relationshipProperties);
+ hasAccess.setProperties(relationshipProperties);
+ }
+
+
+ }
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Role.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Role.java
new file mode 100644
index 0000000..e70579a
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Role.java
@@ -0,0 +1,37 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.HasRole;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+@NodeEntity
+public class Role extends Entity {
+
+ @Property(name = "scope")
+ private String scope;
+
+
+ @Relationship(type = "HAS_ROLE", direction = Relationship.INCOMING)
+ private HasRole hasRole;
+
+ public Role() {
+ }
+
+ public String getScope() {
+ return scope;
+ }
+
+ public void setScope(String scope) {
+ this.scope = scope;
+ }
+
+
+ public HasRole getHasRole() {
+ return hasRole;
+ }
+
+ public void setHasRole(HasRole hasRole) {
+ this.hasRole = hasRole;
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/ServiceAccount.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/ServiceAccount.java
new file mode 100644
index 0000000..2802c5c
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/ServiceAccount.java
@@ -0,0 +1,29 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.Has;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+@NodeEntity
+public class ServiceAccount extends Entity {
+
+ @Property(name = "status")
+ private String status;
+
+
+ @Relationship(type = "HAS", direction = Relationship.INCOMING)
+ private Has hasRole;
+
+ public ServiceAccount() {
+
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Tenant.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Tenant.java
new file mode 100644
index 0000000..c8f619b
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/Tenant.java
@@ -0,0 +1,125 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.Has;
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.HasRole;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+@NodeEntity
+public class Tenant extends Entity {
+ @Property(name = "tenant_id")
+ private String tenantId;
+ @Property(name = "domain")
+ private String domain;
+ @Property(name = "name")
+ private String name;
+ @Property(name = "requester_email")
+ private String requesterEmail;
+ @Property(name = "scope")
+ private String scope;
+ @Property(name = "redirect_uris")
+ private List<String> redirectURIs;
+
+ @Relationship(type = "HAS_ROLE")
+ private Set<HasRole> roles = new HashSet<>();
+
+ @Relationship(type = "HAS")
+ private Set<Has> entities = new HashSet<>();
+
+
+ public Tenant() {
+ }
+
+ public String getTenantId() {
+ return tenantId;
+ }
+
+ public void setTenantId(String tenantId) {
+ this.tenantId = tenantId;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getRequesterEmail() {
+ return requesterEmail;
+ }
+
+ public void setRequesterEmail(String requesterEmail) {
+ this.requesterEmail = requesterEmail;
+ }
+
+ public String getScope() {
+ return scope;
+ }
+
+ public void setScope(String scope) {
+ this.scope = scope;
+ }
+
+ public List<String> getRedirectURIs() {
+ return redirectURIs;
+ }
+
+ public void setRedirectURIs(List<String> redirectURIs) {
+ this.redirectURIs = redirectURIs;
+ }
+
+ public Set<HasRole> getRoles() {
+ return roles;
+ }
+
+ public void setRoles(Set<HasRole> roles) {
+ this.roles = roles;
+ }
+
+
+ public Set<Has> getEntities() {
+ return entities;
+ }
+
+ public void addEntities(Has entity) {
+ this.entities.add(entity);
+ }
+
+ public void add(Entity entity, long relationShipCreatedAt, long relationShipModifiedAt,
+ Map<String, String> relationshipProperties) {
+
+ Has has = new Has();
+ has.setStartEntity(this);
+ has.setEndEntity(entity);
+ entity.setTenantInPointer(has);
+ this.addEntities(has);
+
+ if (relationShipCreatedAt != 0) {
+ has.setCreatedAt(relationShipCreatedAt);
+ }
+ if (relationShipModifiedAt != 0) {
+ has.setLastModifiedAt(relationShipModifiedAt);
+ }
+ if (relationshipProperties != null) {
+ has.setProperties(relationshipProperties);
+ }
+
+
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/User.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/User.java
new file mode 100644
index 0000000..07b1979
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/nodes/User.java
@@ -0,0 +1,132 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships.*;
+import org.neo4j.ogm.annotation.NodeEntity;
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.Relationship;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@NodeEntity
+public class User extends Entity {
+ @Property(name = "name")
+ private String userName;
+ @Property(name = "first_name")
+ private String firstName;
+ @Property(name = "last_name")
+ private String lastName;
+ @Property(name = "email")
+ private String email;
+ @Property(name = "status")
+ private String status;
+
+ @Relationship(type = "BELONGS")
+ private Belongs belongs;
+
+ @Relationship(type = "HAS", direction = Relationship.INCOMING)
+ private Has hasRole;
+
+ @Relationship(type = "MEMBER_OF")
+ private Set<MemberOf> memberGroups = new HashSet<>();
+
+ @Relationship(type = "HAS_CHILD_USER", direction = Relationship.INCOMING)
+ private Set<HasChildUser> groups = new HashSet<>();
+
+ @Relationship(type = "SHARED_WITH", direction = Relationship.INCOMING)
+ private Set<SharedWith> sharedResources = new HashSet<>();
+
+ @Relationship(type = "HAS_ACCESS")
+ private Set<HasAccess> accessibleResources = new HashSet<>();
+
+ public User() {
+ }
+
+ public String getUserName() {
+ return userName;
+ }
+
+ public void setUserName(String userName) {
+ this.userName = userName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+ public String getStatus() {
+ return status;
+ }
+
+ public void setStatus(String status) {
+ this.status = status;
+ }
+
+ public Belongs getBelongs() {
+ return belongs;
+ }
+
+ public void setBelongs(Belongs belongs) {
+ this.belongs = belongs;
+ }
+
+ public Has getHasRole() {
+ return hasRole;
+ }
+
+ public void setHasRole(Has hasRole) {
+ this.hasRole = hasRole;
+ }
+
+ public Set<MemberOf> getMemberGroups() {
+ return memberGroups;
+ }
+
+ public void addMemberGroup(MemberOf memberGroup) {
+ this.memberGroups.add(memberGroup);
+ }
+
+ public Set<HasChildUser> getGroups() {
+ return groups;
+ }
+
+ public void addGroup(HasChildUser hasChildUser) {
+ this.groups.add(hasChildUser);
+ }
+
+ public Set<SharedWith> getSharedResources() {
+ return sharedResources;
+ }
+
+ public void addSharedResource(SharedWith sharedResource) {
+ this.sharedResources.add(sharedResource);
+ }
+
+ public Set<HasAccess> getAccessibleResources() {
+ return accessibleResources;
+ }
+
+ public void addAccessibleResources(HasAccess accessibleResources) {
+ this.accessibleResources.add(accessibleResources);
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Belongs.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Belongs.java
new file mode 100644
index 0000000..0f0e8ce
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Belongs.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "BELONGS")
+public class Belongs extends Relationship {
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/ConfiguredWith.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/ConfiguredWith.java
new file mode 100644
index 0000000..22cbfcf
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/ConfiguredWith.java
@@ -0,0 +1,7 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "CONFIGURED_WITH")
+public class ConfiguredWith extends Relationship {
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Has.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Has.java
new file mode 100644
index 0000000..c315762
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Has.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS")
+public class Has extends Relationship {
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasAccess.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasAccess.java
new file mode 100644
index 0000000..b76369b
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasAccess.java
@@ -0,0 +1,23 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_ACCESS")
+public class HasAccess extends Relationship {
+
+ public HasAccess() {
+ }
+
+ @Property(name = "permission_type")
+ private String permissionType;
+
+ public String getPermissionType() {
+ return permissionType;
+ }
+
+ public void setPermissionType(String permissionType) {
+ this.permissionType = permissionType;
+ }
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildGroup.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildGroup.java
new file mode 100644
index 0000000..a97bfb8
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildGroup.java
@@ -0,0 +1,9 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_CHILD_GROUP")
+public class HasChildGroup extends Relationship {
+
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildResource.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildResource.java
new file mode 100644
index 0000000..2a29c8d
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildResource.java
@@ -0,0 +1,8 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_CHILD_RESOURCE")
+public class HasChildResource extends Relationship {
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildUser.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildUser.java
new file mode 100644
index 0000000..bc04572
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasChildUser.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_CHILD_USER")
+public class HasChildUser extends Relationship {
+
+ @Property(name = "user_type")
+ private String userType;
+
+ public String getUserType() {
+ return userType;
+ }
+
+ public void setUserType(String userType) {
+ this.userType = userType;
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentGroup.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentGroup.java
new file mode 100644
index 0000000..fe07ddb
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentGroup.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_PARENT_GROUP")
+public class HasParentGroup extends Relationship{
+
+ @Property(name = "membership_type")
+ private String membershipType;
+
+ public String getMembershipType() {
+ return membershipType;
+ }
+
+ public void setMembershipType(String membershipType) {
+ this.membershipType = membershipType;
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentResource.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentResource.java
new file mode 100644
index 0000000..d8a0340
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasParentResource.java
@@ -0,0 +1,7 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_PARENT_RESOURCE")
+public class HasParentResource extends Relationship{
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasRole.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasRole.java
new file mode 100644
index 0000000..5b02f4e
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/HasRole.java
@@ -0,0 +1,8 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "HAS_ROLE")
+public class HasRole extends Relationship{
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/MemberOf.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/MemberOf.java
new file mode 100644
index 0000000..f381f33
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/MemberOf.java
@@ -0,0 +1,19 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "MEMBER_OF")
+public class MemberOf extends Relationship {
+
+ @Property(name = "membership_type")
+ private String membershipType;
+
+ public String getMembershipType() {
+ return membershipType;
+ }
+
+ public void setMembershipType(String membershipType) {
+ this.membershipType = membershipType;
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Relationship.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Relationship.java
new file mode 100644
index 0000000..f7ccdff
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/Relationship.java
@@ -0,0 +1,81 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.nodes.Entity;
+import org.neo4j.ogm.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public abstract class Relationship {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+
+ @Property(name = "created_at")
+ private long createdAt = System.currentTimeMillis();
+
+ @Property(name = "last_modified_at")
+ private long lastModifiedAt = System.currentTimeMillis();
+
+
+ @StartNode
+ private Entity startEntity;
+
+ @EndNode
+ private Entity endEntity;
+
+
+ @Properties(prefix = "custom")
+ private Map<String, String> properties = new HashMap<>();
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public long getCreatedAt() {
+ return createdAt;
+ }
+
+ public void setCreatedAt(long createdAt) {
+ this.createdAt = createdAt;
+ }
+
+ public long getLastModifiedAt() {
+ return lastModifiedAt;
+ }
+
+ public void setLastModifiedAt(long lastModifiedAt) {
+ this.lastModifiedAt = lastModifiedAt;
+ }
+
+
+ public Map<String, String> getProperties() {
+ return properties;
+ }
+
+ public void setProperties(Map<String, String> properties) {
+ this.properties = properties;
+ }
+
+
+ public Entity getStartEntity() {
+ return startEntity;
+ }
+
+ public void setStartEntity(Entity startEntity) {
+ this.startEntity = startEntity;
+ }
+
+ public Entity getEndEntity() {
+ return endEntity;
+ }
+
+ public void setEndEntity(Entity endEntity) {
+ this.endEntity = endEntity;
+ }
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/SharedWith.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/SharedWith.java
new file mode 100644
index 0000000..b3434cb
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/backend/neo4j/model/relationships/SharedWith.java
@@ -0,0 +1,25 @@
+package org.apache.airavata.datalake.metadata.db.service.backend.neo4j.model.relationships;
+
+import org.neo4j.ogm.annotation.Property;
+import org.neo4j.ogm.annotation.RelationshipEntity;
+
+@RelationshipEntity(type = "SHARED_WITH")
+public class SharedWith extends Relationship {
+
+
+ public SharedWith() {
+
+ }
+
+ @Property(name = "permission_type")
+ private String permissionType;
+
+ public String getPermissionType() {
+ return permissionType;
+ }
+
+ public void setPermissionType(String permissionType) {
+ this.permissionType = permissionType;
+ }
+
+}
diff --git a/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/exceptions/DBConnectorException.java b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/exceptions/DBConnectorException.java
new file mode 100644
index 0000000..c4860d8
--- /dev/null
+++ b/metadata-service/db-service/src/main/java/org/apache/airavata/datalake/metadata/db/service/exceptions/DBConnectorException.java
@@ -0,0 +1,10 @@
+package org.apache.airavata.datalake.metadata.db.service.exceptions;
+
+public class DBConnectorException extends RuntimeException{
+ String msg;
+
+ public DBConnectorException(String message, Throwable throwable) {
+ super(message,throwable);
+ this.msg = message;
+ }
+}
diff --git a/metadata-service/db-service/src/main/resources/application.properties b/metadata-service/db-service/src/main/resources/application.properties
new file mode 100644
index 0000000..f0d53ae
--- /dev/null
+++ b/metadata-service/db-service/src/main/resources/application.properties
@@ -0,0 +1,23 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements. See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership. The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied. See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+server.port=9090
+spring.neo4j.uri=bolt://neo4j:blastcovid19@149.165.156.173
+spring.neo4j.authentication.username=username
+spring.neo4j.authentication.password=password
diff --git a/metadata-service/db-service/src/main/resources/applicationContext.xml b/metadata-service/db-service/src/main/resources/applicationContext.xml
new file mode 100644
index 0000000..adeadaf
--- /dev/null
+++ b/metadata-service/db-service/src/main/resources/applicationContext.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans
+ http://www.springframework.org/schema/beans/spring-beans.xsd
+ http://www.springframework.org/schema/context
+ http://www.springframework.org/schema/context/spring-context.xsd">
+
+ <bean id="dbConnector" class="org.apache.airavata.datalake.metadata.db.service.backend.neo4j.Neo4JConnector"
+ init-method="init" destroy-method="close"></bean>
+
+</beans>
\ No newline at end of file
diff --git a/metadata-service/metadata-service.iml b/metadata-service/metadata-service.iml
new file mode 100644
index 0000000..5fa3710
--- /dev/null
+++ b/metadata-service/metadata-service.iml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
+ <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11">
+ <output url="file://$MODULE_DIR$/target/classes" />
+ <output-test url="file://$MODULE_DIR$/target/test-classes" />
+ <content url="file://$MODULE_DIR$">
+ <sourceFolder url="file://$MODULE_DIR$/target/maven-shared-archive-resources" isTestSource="true" />
+ <sourceFolder url="file://$MODULE_DIR$/target/maven-shared-archive-resources" isTestSource="false" />
+ <excludeFolder url="file://$MODULE_DIR$/target" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module>
\ No newline at end of file
diff --git a/metadata-service/pom.xml b/metadata-service/pom.xml
new file mode 100644
index 0000000..7125b8a
--- /dev/null
+++ b/metadata-service/pom.xml
@@ -0,0 +1,130 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>airavata-data-lake</artifactId>
+ <groupId>org.apache.airavata.data.lake</groupId>
+ <version>0.01-SNAPSHOT</version>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+
+ <artifactId>metadata-service</artifactId>
+ <packaging>pom</packaging>
+ <modules>
+ <module>db-service</module>
+ </modules>
+
+ <properties>
+ <maven.compiler.source>11</maven.compiler.source>
+ <maven.compiler.target>11</maven.compiler.target>
+ </properties>
+ <dependencyManagement>
+ <dependencies>
+ <!-- neo4J servide dependencies-->
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.boot</groupId>-->
+<!-- <artifactId>spring-boot-starter-parent</artifactId>-->
+<!-- <version>${spring.boot.version}</version>-->
+<!-- <type>pom</type>-->
+<!-- <scope>import</scope>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.cloud</groupId>-->
+<!-- <artifactId>spring-cloud-dependencies</artifactId>-->
+<!-- <version>${spring.cloud.version}</version>-->
+<!-- <type>pom</type>-->
+<!-- <scope>import</scope>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>io.github.lognet</groupId>-->
+<!-- <artifactId>grpc-spring-boot-starter</artifactId>-->
+<!-- <version>${grpc.spring.boot.version}</version>-->
+<!-- <exclusions>-->
+<!-- <exclusion>-->
+<!-- <groupId>io.grpc</groupId>-->
+<!-- <artifactId>grpc-netty</artifactId>-->
+<!-- </exclusion>-->
+<!-- <exclusion>-->
+<!-- <groupId>org.springframework.boot</groupId>-->
+<!-- <artifactId>spring-boot-starter</artifactId>-->
+<!-- </exclusion>-->
+<!-- </exclusions>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>io.grpc</groupId>-->
+<!-- <artifactId>grpc-stub</artifactId>-->
+<!-- <version>${io.grpc.version}</version>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>io.grpc</groupId>-->
+<!-- <artifactId>grpc-protobuf</artifactId>-->
+<!-- <version>${io.grpc.version}</version>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>io.grpc</groupId>-->
+<!-- <artifactId>grpc-netty</artifactId>-->
+<!-- <version>${io.grpc.version}</version>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>javax.annotation</groupId>-->
+<!-- <artifactId>javax.annotation-api</artifactId>-->
+<!-- <version>${javax.annotation.version}</version>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.cloud</groupId>-->
+<!-- <artifactId>spring-cloud-starter-sleuth</artifactId>-->
+<!-- <version>${spring.cloud.slueth.version}</version>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.cloud</groupId>-->
+<!-- <artifactId>spring-cloud-sleuth-zipkin</artifactId>-->
+<!-- <version>${spring.cloud.slueth.version}</version>-->
+<!-- </dependency>-->
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.cloud</groupId>-->
+<!-- <artifactId>spring-cloud-starter-vault-config</artifactId>-->
+<!-- <version>${spring.boot.version}</version>-->
+<!-- </dependency>-->
+ <!-- <dependency>-->
+ <!-- <groupId>org.springframework.data</groupId>-->
+ <!-- <artifactId>spring-data-neo4j</artifactId>-->
+ <!-- <version>${spring.data.neo4j.version}</version>-->
+ <!-- </dependency>-->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ <version>2.4.2</version>
+ </dependency>
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.data</groupId>-->
+<!-- <artifactId>spring-data-neo4j</artifactId>-->
+<!-- <version>5.2.0</version>-->
+<!-- </dependency>-->
+<!-- <!– https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-neo4j –>-->
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.boot</groupId>-->
+<!-- <artifactId>spring-boot-starter-data-neo4j</artifactId>-->
+<!-- <version>2.4.2</version>-->
+<!-- </dependency>-->
+ <dependency>
+ <groupId>org.neo4j</groupId>
+ <artifactId>neo4j-ogm-core</artifactId>
+ <version>3.2.20</version>
+ </dependency>
+ <dependency>
+ <groupId>org.neo4j</groupId>
+ <artifactId>neo4j-ogm-bolt-driver</artifactId>
+ <version>3.2.20</version>
+ </dependency>
+<!-- <dependency>-->
+<!-- <groupId>org.springframework.data</groupId>-->
+<!-- <artifactId>spring-data-commons</artifactId>-->
+<!-- <version>2.4.2</version>-->
+<!-- </dependency>-->
+
+ </dependencies>
+ </dependencyManagement>
+
+
+</project>
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 48bcf01..c0bb353 100644
--- a/pom.xml
+++ b/pom.xml
@@ -20,7 +20,8 @@
under the License.
-->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
@@ -29,6 +30,7 @@
</prerequisites>
<modules>
<module>data-orchestrator</module>
+ <module>metadata-service</module>
</modules>
<parent>
@@ -65,4 +67,77 @@
</plugins>
</build>
+
+ <properties>
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+ <org.slf4j.version>1.7.25</org.slf4j.version>
+ <log4j.version>1.2.17</log4j.version>
+ <thrift.version>0.12.0</thrift.version>
+ <openjpa.version>2.4.3</openjpa.version>
+ <mysql.connector.version>5.1.34</mysql.connector.version>
+ <maven.assembly.plugin>3.3.0</maven.assembly.plugin>
+ <junit.version>4.8.1</junit.version>
+ <jmockit.version>1.8</jmockit.version>
+ <java.version>11</java.version>
+ <javax.annotation.version>1.3.2</javax.annotation.version>
+ <maven.compiler.plugin>3.8.1</maven.compiler.plugin>
+
+ <protobuf.maven.plugin>0.5.1</protobuf.maven.plugin>
+ <os.maven.plugin>1.5.0.Final</os.maven.plugin>
+
+ <!-- Spring dependencies -->
+ <spring.boot.version>2.4.2</spring.boot.version>
+ <spring.cloud.version>Greenwich.RELEASE</spring.cloud.version>
+ <grpc.spring.boot.version>2.4.4</grpc.spring.boot.version>
+
+ <spring.cloud.stream.version>2.0.0.RELEASE</spring.cloud.stream.version>
+ <spring.cloud.slueth.version>2.1.6.RELEASE</spring.cloud.slueth.version>
+ <spring.data.neo4j.version>6.0.3</spring.data.neo4j.version>
+
+ <io.grpc.version>1.25.0</io.grpc.version>
+ <google.common.protos>1.17.0</google.common.protos>
+ <io.micrometer.version>1.3.1</io.micrometer.version>
+ <brave.version>5.9.1</brave.version>
+
+ <docker.image.prefix>apachecustos</docker.image.prefix>
+ <docker.image.repo>custos</docker.image.repo>
+ <docker.plugin.version>1.4.13</docker.plugin.version>
+
+ <helm.maven.plugin.version>2.8.0</helm.maven.plugin.version>
+ <maven.assembly.plugin.version>3.2.0</maven.assembly.plugin.version>
+
+ <mysql.connector.java>8.0.18</mysql.connector.java>
+ <javax.persistance>1.0.2</javax.persistance>
+
+ <keycloak.admin.version>7.0.0</keycloak.admin.version>
+
+ <reasteasy.client.version>3.0.14.Final</reasteasy.client.version>
+
+ <com.google.protobuf.util>3.11.3</com.google.protobuf.util>
+
+ <springfox.swagger.version>2.9.2</springfox.swagger.version>
+ <org.wso2.charon>3.3.16</org.wso2.charon>
+ <jaxb.version>2.1</jaxb.version>
+
+ <kube.java.client.version>5.0.0</kube.java.client.version>
+
+ <testng.version>6.8</testng.version>
+ <org.json.version>20190722</org.json.version>
+
+ <apache.rat.plugin.version>0.13</apache.rat.plugin.version>
+
+ <maven.surefile.plugin.version>3.0.0-M4</maven.surefile.plugin.version>
+
+ <log.back.version>1.2.3</log.back.version>
+
+ <com.jcraft.version>0.1.55</com.jcraft.version>
+
+ <io.commons.version>2.7</io.commons.version>
+
+ <com.codahale.version>0.7.0</com.codahale.version>
+
+
+ </properties>
+
</project>