diff options
Diffstat (limited to 'aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java')
-rw-r--r-- | aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java | 257 |
1 files changed, 118 insertions, 139 deletions
diff --git a/aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java b/aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java index bbb1aea..d814b48 100644 --- a/aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java +++ b/aai-traversal/src/main/java/org/onap/aai/rest/DslConsumer.java @@ -3,6 +3,7 @@ * org.onap.aai * ================================================================================ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. + * Modifications Copyright (C) 2023 Deutsche Telekom SA. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,6 +20,7 @@ */ package org.onap.aai.rest; +import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -78,33 +80,28 @@ import com.google.gson.JsonParser; import io.micrometer.core.annotation.Timed; -@Path("{version: v[1-9][0-9]*|latest}/dsl") @Timed +@Path("{version: v[1-9][0-9]*|latest}/dsl") public class DslConsumer extends TraversalConsumer { - private HttpEntry traversalUriHttpEntry; - - private QueryProcessorType processorType = QueryProcessorType.LOCAL_GROOVY; - private static final Logger LOGGER = LoggerFactory.getLogger(DslConsumer.class); + private static final QueryProcessorType processorType = QueryProcessorType.LOCAL_GROOVY; + private static final QueryVersion DEFAULT_VERSION = QueryVersion.V1; - private DslQueryProcessor dslQueryProcessor; - - private SchemaVersions schemaVersions; - - private String basePath; + private final HttpEntry traversalUriHttpEntry; + private final DslQueryProcessor dslQueryProcessor; + private final SchemaVersions schemaVersions; + private final String basePath; + private final GremlinServerSingleton gremlinServerSingleton; + private final XmlFormatTransformer xmlFormatTransformer; - private GremlinServerSingleton gremlinServerSingleton; - private final QueryVersion DEFAULT_VERSION = QueryVersion.V1; private QueryVersion dslApiVersion = DEFAULT_VERSION; - private XmlFormatTransformer xmlFormatTransformer; - @Autowired public DslConsumer(HttpEntry traversalUriHttpEntry, DslQueryProcessor dslQueryProcessor, - SchemaVersions schemaVersions, GremlinServerSingleton gremlinServerSingleton, - XmlFormatTransformer xmlFormatTransformer, - @Value("${schema.uri.base.path}") String basePath) { + SchemaVersions schemaVersions, GremlinServerSingleton gremlinServerSingleton, + XmlFormatTransformer xmlFormatTransformer, + @Value("${schema.uri.base.path}") String basePath) { this.traversalUriHttpEntry = traversalUriHttpEntry; this.dslQueryProcessor = dslQueryProcessor; this.schemaVersions = schemaVersions; @@ -116,33 +113,28 @@ public class DslConsumer extends TraversalConsumer { @PUT @Consumes({MediaType.APPLICATION_JSON}) @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - public Response executeQuery(String content, @PathParam("version") String versionParam, - @DefaultValue("graphson") @QueryParam("format") String queryFormat, - @DefaultValue("no_op") @QueryParam("subgraph") String subgraph, - @DefaultValue("all") @QueryParam("validate") String validate, @Context HttpHeaders headers, - @Context HttpServletRequest req, @Context UriInfo info, - @DefaultValue("-1") @QueryParam("resultIndex") String resultIndex, - @DefaultValue("-1") @QueryParam("resultSize") String resultSize) { + public Response executeQuery(String dslQuery, @PathParam("version") String versionParam, + @DefaultValue("graphson") @QueryParam("format") String queryFormat, + @DefaultValue("no_op") @QueryParam("subgraph") String subgraph, + @DefaultValue("all") @QueryParam("validate") String validate, + @DefaultValue("-1") @QueryParam("resultIndex") String resultIndex, + @DefaultValue("-1") @QueryParam("resultSize") String resultSize, + @Context HttpHeaders headers, + @Context HttpServletRequest req, + @Context UriInfo info) throws FileNotFoundException, AAIException { Set<String> roles = this.getRoles(req.getUserPrincipal()); - return runner(TraversalConstants.AAI_TRAVERSAL_DSL_TIMEOUT_ENABLED, - TraversalConstants.AAI_TRAVERSAL_DSL_TIMEOUT_APP, - TraversalConstants.AAI_TRAVERSAL_DSL_TIMEOUT_LIMIT, headers, info, HttpMethod.PUT, - new AaiCallable() { - @Override - public Response process() throws Exception { - return (processExecuteQuery(content, req, versionParam, queryFormat, subgraph, - validate, headers, info, resultIndex, resultSize, roles)); - } - }); + return processExecuteQuery(dslQuery, req, versionParam, queryFormat, subgraph, + validate, headers, info, resultIndex, resultSize, roles); } - public Response processExecuteQuery(String content, HttpServletRequest req, String versionParam, - String queryFormat, String subgraph, String validate, HttpHeaders headers, UriInfo info, - String resultIndex, String resultSize, Set<String> roles) { + public Response processExecuteQuery(String dslQuery, HttpServletRequest request, String versionParam, + String queryFormat, String subgraph, String validate, HttpHeaders headers, UriInfo info, + String resultIndex, String resultSize, Set<String> roles) throws FileNotFoundException, AAIException { - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String dslOverride = headers.getRequestHeaders().getFirst("X-DslOverride"); + final SchemaVersion version = new SchemaVersion(versionParam); + final String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + final String dslOverride = headers.getRequestHeaders().getFirst("X-DslOverride"); Optional<String> dslApiVersionHeader = Optional.ofNullable(headers.getRequestHeaders().getFirst("X-DslApiVersion")); @@ -154,123 +146,110 @@ public class DslConsumer extends TraversalConsumer { } } - Response response; - SchemaVersion version = new SchemaVersion(versionParam); - - TransactionalGraphEngine dbEngine = null; - try { - String serverBase = - req.getRequestURL().toString().replaceAll("/(v[0-9]+|latest)/.*", "/"); - traversalUriHttpEntry.setHttpEntryProperties(version, serverBase); - traversalUriHttpEntry.setPaginationParameters(resultIndex, resultSize); - dbEngine = traversalUriHttpEntry.getDbEngine(); - JsonObject input = JsonParser.parseString(content).getAsJsonObject(); - JsonElement dslElement = input.get("dsl"); - String dsl = ""; - if (dslElement != null) { - dsl = dslElement.getAsString(); - } - - boolean isDslOverride = dslOverride != null - && !AAIConfig.get(TraversalConstants.DSL_OVERRIDE).equals("false") - && dslOverride.equals(AAIConfig.get(TraversalConstants.DSL_OVERRIDE)); + String result = executeQuery(dslQuery, request, queryFormat, subgraph, validate, info.getQueryParameters(), resultIndex, resultSize, + roles, version, sourceOfTruth, dslOverride); - if (isDslOverride) { - dslQueryProcessor.setStartNodeValidationFlag(false); - } - - dslQueryProcessor.setValidationRules(validate); + String acceptType = headers.getHeaderString("Accept"); + if (acceptType == null) { + acceptType = MediaType.APPLICATION_JSON; + } - Format format = Format.getFormat(queryFormat); + if (MediaType.APPLICATION_XML_TYPE.isCompatible(MediaType.valueOf(acceptType))) { + result = xmlFormatTransformer.transform(result); + } - if (isAggregate(format)) { - dslQueryProcessor.setAggregate(true); - } + if (traversalUriHttpEntry.isPaginated()) { + return Response.status(Status.OK).type(acceptType) + .header("total-results", traversalUriHttpEntry.getTotalVertices()) + .header("total-pages", traversalUriHttpEntry.getTotalPaginationBuckets()) + .entity(result).build(); + } else { + return Response.status(Status.OK).type(acceptType).entity(result).build(); + } + } - if (isHistory(format)) { - validateHistoryParams(format, info.getQueryParameters()); - } + private String executeQuery(String content, HttpServletRequest req, String queryFormat, String subgraph, + String validate, MultivaluedMap<String, String> queryParameters, String resultIndex, String resultSize, Set<String> roles, + final SchemaVersion version, final String sourceOfTruth, final String dslOverride) + throws AAIException, FileNotFoundException { + final String serverBase = + req.getRequestURL().toString().replaceAll("/(v[0-9]+|latest)/.*", "/"); + traversalUriHttpEntry.setHttpEntryProperties(version, serverBase); + traversalUriHttpEntry.setPaginationParameters(resultIndex, resultSize); + final TransactionalGraphEngine dbEngine = traversalUriHttpEntry.getDbEngine(); + + JsonObject input = JsonParser.parseString(content).getAsJsonObject(); + JsonElement dslElement = input.get("dsl"); + String dsl = ""; + if (dslElement != null) { + dsl = dslElement.getAsString(); + } - GraphTraversalSource traversalSource = - getTraversalSource(dbEngine, format, info, roles); + boolean isDslOverride = dslOverride != null + && !AAIConfig.get(TraversalConstants.DSL_OVERRIDE).equals("false") + && dslOverride.equals(AAIConfig.get(TraversalConstants.DSL_OVERRIDE)); - GenericQueryProcessor processor = - new GenericQueryProcessor.Builder(dbEngine, gremlinServerSingleton) - .queryFrom(dsl, "dsl").queryProcessor(dslQueryProcessor).version(dslApiVersion) - .processWith(processorType).format(format).uriParams(info.getQueryParameters()) - .traversalSource(isHistory(format), traversalSource).create(); + if (isDslOverride) { + dslQueryProcessor.setStartNodeValidationFlag(false); + } - SubGraphStyle subGraphStyle = SubGraphStyle.valueOf(subgraph); - List<Object> vertTemp = processor.execute(subGraphStyle); + dslQueryProcessor.setValidationRules(validate); - // Dedup if duplicate objects are returned in each array in the aggregate format - // scenario. - List<Object> vertTempDedupedObjectList = dedupObjectInAggregateFormatResult(vertTemp); + Format format = Format.getFormat(queryFormat); - List<Object> vertices; - if (isAggregate(format)) { - vertices = traversalUriHttpEntry - .getPaginatedVertexListForAggregateFormat(vertTempDedupedObjectList); - } else { - vertices = traversalUriHttpEntry.getPaginatedVertexList(vertTemp); - } + if (isAggregate(format)) { + dslQueryProcessor.setAggregate(true); + } - DBSerializer serializer = - new DBSerializer(version, dbEngine, ModelType.MOXY, sourceOfTruth); - FormatFactory ff = new FormatFactory(traversalUriHttpEntry.getLoader(), serializer, - schemaVersions, this.basePath, serverBase); + if (isHistory(format)) { + validateHistoryParams(format, queryParameters); + } - MultivaluedMap<String, String> mvm = new MultivaluedHashMap<>(); - mvm.putAll(info.getQueryParameters()); - if (isHistory(format)) { - mvm.putSingle("startTs", Long.toString(getStartTime(format, mvm))); - mvm.putSingle("endTs", Long.toString(getEndTime(mvm))); - } - Formatter formatter = ff.get(format, mvm); - - final Map<String, List<String>> propertiesMap = processor.getPropertiesMap(); - String result = ""; - if (propertiesMap != null && !propertiesMap.isEmpty()) { - result = formatter.output(vertices, propertiesMap).toString(); - } else { - result = formatter.output(vertices).toString(); - } + GraphTraversalSource traversalSource = + getTraversalSource(dbEngine, format, queryParameters, roles); - String acceptType = headers.getHeaderString("Accept"); + GenericQueryProcessor processor = + new GenericQueryProcessor.Builder(dbEngine, gremlinServerSingleton) + .queryFrom(dsl, "dsl").queryProcessor(dslQueryProcessor).version(dslApiVersion) + .processWith(processorType).format(format).uriParams(queryParameters) + .traversalSource(isHistory(format), traversalSource).create(); - if (acceptType == null) { - acceptType = MediaType.APPLICATION_JSON; - } + SubGraphStyle subGraphStyle = SubGraphStyle.valueOf(subgraph); + List<Object> vertTemp = processor.execute(subGraphStyle); - if (MediaType.APPLICATION_XML_TYPE.isCompatible(MediaType.valueOf(acceptType))) { - result = xmlFormatTransformer.transform(result); - } + // Dedup if duplicate objects are returned in each array in the aggregate format + // scenario. + List<Object> vertTempDedupedObjectList = dedupObjectInAggregateFormatResult(vertTemp); - if (traversalUriHttpEntry.isPaginated()) { - response = Response.status(Status.OK).type(acceptType) - .header("total-results", traversalUriHttpEntry.getTotalVertices()) - .header("total-pages", traversalUriHttpEntry.getTotalPaginationBuckets()) - .entity(result).build(); - } else { - response = Response.status(Status.OK).type(acceptType).entity(result).build(); - } + List<Object> vertices; + if (isAggregate(format)) { + vertices = traversalUriHttpEntry + .getPaginatedVertexListForAggregateFormat(vertTempDedupedObjectList); + } else { + vertices = traversalUriHttpEntry.getPaginatedVertexList(vertTemp); + } - } catch (AAIException e) { - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, e); - } catch (SchemaViolationException sve) { - AAIException ex = new AAIException("AAI_4020", sve); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, ex); - } catch (Exception e) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, ex); - } finally { - if (dbEngine != null) { - dbEngine.rollback(); - } + DBSerializer serializer = + new DBSerializer(version, dbEngine, ModelType.MOXY, sourceOfTruth); + FormatFactory ff = new FormatFactory(traversalUriHttpEntry.getLoader(), serializer, + schemaVersions, this.basePath, serverBase); + MultivaluedMap<String, String> mvm = new MultivaluedHashMap<>(); + mvm.putAll(queryParameters); + if (isHistory(format)) { + mvm.putSingle("startTs", Long.toString(getStartTime(format, mvm))); + mvm.putSingle("endTs", Long.toString(getEndTime(mvm))); } - - return response; + Formatter formatter = ff.get(format, mvm); + + final Map<String, List<String>> propertiesMap = processor.getPropertiesMap(); + String result = ""; + if (propertiesMap != null && !propertiesMap.isEmpty()) { + result = formatter.output(vertices, propertiesMap).toString(); + } else { + result = formatter.output(vertices).toString(); + } + return result; } private List<Object> dedupObjectInAggregateFormatResult(List<Object> vertTemp) { @@ -280,7 +259,7 @@ public class DslConsumer extends TraversalConsumer { Object o = itr.next(); if (o instanceof ArrayList) { vertTempDedupedObjectList - .add(((ArrayList) o).stream().distinct().collect(Collectors.toList())); + .add(((ArrayList) o).stream().distinct().collect(Collectors.toList())); } } return vertTempDedupedObjectList; |