diff --git a/pom.xml b/pom.xml index 89abbc7..94371a8 100644 --- a/pom.xml +++ b/pom.xml @@ -90,6 +90,11 @@ ST4 4.3.4 + + com.google.code.gson + gson + 2.8.8 + diff --git a/src/main/java/com/olympus/hermione/controllers/TestController.java b/src/main/java/com/olympus/hermione/controllers/TestController.java index 23768b9..d534ef1 100644 --- a/src/main/java/com/olympus/hermione/controllers/TestController.java +++ b/src/main/java/com/olympus/hermione/controllers/TestController.java @@ -1,9 +1,11 @@ package com.olympus.hermione.controllers; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Ne; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; +import com.olympus.hermione.services.Neo4JUitilityService; import com.olympus.hermione.services.ScenarioExecutionService; @RestController @@ -12,10 +14,20 @@ public class TestController { @Autowired ScenarioExecutionService scenarioExecutionService; + @Autowired + Neo4JUitilityService neo4JUitilityService; + @GetMapping("/test/scenario_execution") public String testScenarioExecution(){ String result = scenarioExecutionService.executeScenario("66aa162debe80dfcd17f0ef4","How i can change the path where uploaded documents are stored ?"); return result; } + + @GetMapping("/test/generate_schema_description") + public String testGenerateSchemaDescription(){ + return neo4JUitilityService.generateSchemaDescription().toString(); + } + + } diff --git a/src/main/java/com/olympus/hermione/security/config/SecurityConfig.java b/src/main/java/com/olympus/hermione/security/config/SecurityConfig.java index fdd1910..9e5ed8f 100644 --- a/src/main/java/com/olympus/hermione/security/config/SecurityConfig.java +++ b/src/main/java/com/olympus/hermione/security/config/SecurityConfig.java @@ -72,7 +72,8 @@ public class SecurityConfig { http.csrf(csrf -> csrf.disable()) .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .authorizeHttpRequests(auth -> auth.requestMatchers("/api/auth/**").permitAll().requestMatchers("/api/test/**") - .permitAll().anyRequest().authenticated()); + .permitAll().requestMatchers("/test/**") + .permitAll().anyRequest().authenticated()); http.authenticationProvider(authenticationProvider()); diff --git a/src/main/java/com/olympus/hermione/services/Neo4JUitilityService.java b/src/main/java/com/olympus/hermione/services/Neo4JUitilityService.java new file mode 100644 index 0000000..0efdc70 --- /dev/null +++ b/src/main/java/com/olympus/hermione/services/Neo4JUitilityService.java @@ -0,0 +1,94 @@ +package com.olympus.hermione.services; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.neo4j.driver.Driver; +import org.neo4j.driver.Session; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.neo4j.driver.Record; +import org.neo4j.driver.Value; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.google.gson.JsonPrimitive; + + +@Service +public class Neo4JUitilityService { + + @Autowired + Driver graphDriver; + + + public JsonObject generateSchemaDescription() { + try (Session session = graphDriver.session()) { + JsonArray nodesDescription = describeNodes(session); + JsonArray relationshipsDescription = describeRelationships(session); + + JsonObject schemaDescription = new JsonObject(); + schemaDescription.add("nodes", nodesDescription); + schemaDescription.add("relationships", relationshipsDescription); + + return schemaDescription; + } + } + + private JsonArray describeNodes(Session session) { + String query = "CALL db.schema.nodeTypeProperties()"; + List records = session.run(query).list(); + + Map nodesMap = new HashMap<>(); + + for (Record record : records) { + String nodeType = record.get("nodeType").asString(); + String propertyName = record.get("propertyName").asString(); + + nodesMap.putIfAbsent(nodeType, new JsonObject()); + JsonObject nodeObject = nodesMap.get(nodeType); + + JsonArray labels = nodeObject.has("labels") ? nodeObject.get("labels").getAsJsonArray() : new JsonArray(); + if (labels.size() == 0) { + labels.add(new JsonPrimitive(nodeType)); + nodeObject.add("labels", labels); + } + + JsonArray properties = nodeObject.has("properties") ? nodeObject.get("properties").getAsJsonArray() : new JsonArray(); + properties.add(new JsonPrimitive(propertyName)); + nodeObject.add("properties", properties); + } + + JsonArray nodesArray = new JsonArray(); + nodesMap.values().forEach(nodesArray::add); + + return nodesArray; + } + + private JsonArray describeRelationships(Session session) { + String query = "CALL db.schema.relTypeProperties()"; + List records = session.run(query).list(); + + Map relationshipsMap = new HashMap<>(); + + for (Record record : records) { + String relType = record.get("relType").asString(); + String propertyName = record.get("propertyName").asString(); + + relationshipsMap.putIfAbsent(relType, new JsonObject()); + JsonObject relationshipObject = relationshipsMap.get(relType); + + relationshipObject.addProperty("type", relType); + + JsonArray properties = relationshipObject.has("properties") ? relationshipObject.get("properties").getAsJsonArray() : new JsonArray(); + properties.add(new JsonPrimitive(propertyName)); + relationshipObject.add("properties", properties); + } + + JsonArray relationshipsArray = new JsonArray(); + relationshipsMap.values().forEach(relationshipsArray::add); + + return relationshipsArray; + } + +} diff --git a/src/test/java/com/olympus/hermione/Neo4jSchemaDescriptionTest.java b/src/test/java/com/olympus/hermione/Neo4jSchemaDescriptionTest.java new file mode 100644 index 0000000..f1e0ef4 --- /dev/null +++ b/src/test/java/com/olympus/hermione/Neo4jSchemaDescriptionTest.java @@ -0,0 +1,58 @@ +package com.olympus.hermione; + +import static org.junit.jupiter.api.Assertions.assertTrue; +import org.junit.jupiter.api.*; +import static org.junit.jupiter.api.Assertions.*; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import com.olympus.hermione.services.Neo4JUitilityService; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + + +public class Neo4jSchemaDescriptionTest { + + @Autowired + private Neo4JUitilityService neo4JUitilityService; + + @BeforeEach + void setUp() { + + } + + + + @Test + void testGenerateSchemaDescription() { + // Esegui il metodo da testare + JsonObject schema = neo4JUitilityService.generateSchemaDescription(); + + // Verifica che il JSON contenga le chiavi "nodes" e "relationships" + assertTrue(schema.has("nodes"), "Il JSON dovrebbe contenere la chiave 'nodes'"); + assertTrue(schema.has("relationships"), "Il JSON dovrebbe contenere la chiave 'relationships'"); + + // Verifica che "nodes" e "relationships" siano degli array + assertTrue(schema.get("nodes").isJsonArray(), "'nodes' dovrebbe essere un array"); + assertTrue(schema.get("relationships").isJsonArray(), "'relationships' dovrebbe essere un array"); + + // Verifica che ogni nodo abbia le chiavi "labels" e "properties" + JsonArray nodes = schema.get("nodes").getAsJsonArray(); + for (int i = 0; i < nodes.size(); i++) { + JsonObject node = nodes.get(i).getAsJsonObject(); + assertTrue(node.has("labels"), "Ogni nodo dovrebbe avere la chiave 'labels'"); + assertTrue(node.has("properties"), "Ogni nodo dovrebbe avere la chiave 'properties'"); + } + + // Verifica che ogni relazione abbia le chiavi "type" e "properties" + JsonArray relationships = schema.get("relationships").getAsJsonArray(); + for (int i = 0; i < relationships.size(); i++) { + JsonObject relationship = relationships.get(i).getAsJsonObject(); + assertTrue(relationship.has("type"), "Ogni relazione dovrebbe avere la chiave 'type'"); + assertTrue(relationship.has("properties"), "Ogni relazione dovrebbe avere la chiave 'properties'"); + } + } +}