From f61e8a4b2581165ae6c0c4663bf52e841c5be39e Mon Sep 17 00:00:00 2001 From: Fiete Ostkamp Date: Wed, 26 Oct 2022 14:15:46 +0000 Subject: Run the formatter for the resources service - reduces the format violations from ~7000 to ~400 Issue-ID: AAI-3567 Signed-off-by: Fiete Ostkamp Change-Id: I570805692bfbd3f80a43c0813831adcdb98016d4 --- .../main/java/org/onap/aai/IncreaseNodesTool.java | 204 ++-- .../src/main/java/org/onap/aai/Profiles.java | 16 +- .../src/main/java/org/onap/aai/ResourcesApp.java | 280 ++--- .../onap/aai/TenantIsolation/DataImportTasks.java | 136 ++- .../java/org/onap/aai/config/ErrorHandler.java | 27 +- .../org/onap/aai/config/JettyPasswordDecoder.java | 1 + .../java/org/onap/aai/config/PasswordDecoder.java | 1 + .../aai/config/PropertyPasswordConfiguration.java | 13 +- .../main/java/org/onap/aai/dbgen/tags/Command.java | 3 +- .../onap/aai/interceptors/AAIContainerFilter.java | 31 +- .../onap/aai/interceptors/AAIHeaderProperties.java | 38 +- .../org/onap/aai/interceptors/package-info.java | 5 +- .../post/AAIResponseFilterPriority.java | 14 +- .../interceptors/post/InvalidResponseStatus.java | 50 +- .../post/ResponseHeaderManipulation.java | 40 +- .../post/ResponseTransactionLogging.java | 33 +- .../interceptors/pre/AAIRequestFilterPriority.java | 30 +- .../aai/interceptors/pre/HeaderValidation.java | 215 ++-- .../interceptors/pre/HttpHeaderInterceptor.java | 28 +- .../interceptors/pre/OneWaySslAuthorization.java | 36 +- .../pre/RequestHeaderManipulation.java | 27 +- .../aai/interceptors/pre/RequestModification.java | 55 +- .../pre/RequestTransactionLogging.java | 190 +-- .../aai/interceptors/pre/RetiredInterceptor.java | 68 +- .../aai/interceptors/pre/VersionInterceptor.java | 45 +- .../interceptors/pre/VersionLatestInterceptor.java | 16 +- .../java/org/onap/aai/rest/BulkAddConsumer.java | 36 +- .../main/java/org/onap/aai/rest/BulkConsumer.java | 1026 ++++++++-------- .../org/onap/aai/rest/BulkProcessConsumer.java | 37 +- .../java/org/onap/aai/rest/ExampleConsumer.java | 104 +- .../java/org/onap/aai/rest/ExceptionHandler.java | 144 ++- .../java/org/onap/aai/rest/LegacyMoxyConsumer.java | 1283 ++++++++++---------- .../org/onap/aai/rest/URLFromVertexIdConsumer.java | 133 +- .../java/org/onap/aai/rest/VertexIdConsumer.java | 167 +-- .../java/org/onap/aai/rest/bulk/BulkOperation.java | 131 +- .../onap/aai/rest/bulk/BulkOperationResponse.java | 116 +- .../rest/bulk/BulkSingleTransactionConsumer.java | 830 ++++++------- .../java/org/onap/aai/rest/bulk/BulkUriInfo.java | 204 ++-- .../org/onap/aai/rest/bulk/pojos/Operation.java | 1 + .../aai/rest/bulk/pojos/OperationResponse.java | 1 + .../org/onap/aai/rest/bulk/pojos/Transaction.java | 1 + .../aai/rest/bulk/pojos/TransactionResponse.java | 1 + .../rest/exceptions/AAIInvalidXMLNamespace.java | 23 +- .../onap/aai/rest/security/WebSecurityConfig.java | 15 +- .../java/org/onap/aai/rest/util/EchoResponse.java | 30 +- .../org/onap/aai/rest/util/LogFormatTools.java | 14 +- .../org/onap/aai/rest/util/ValidateEncoding.java | 256 ++-- .../org/onap/aai/service/AuthorizationService.java | 46 +- .../java/org/onap/aai/service/RetiredService.java | 28 +- .../java/org/onap/aai/tasks/AaiGraphChecker.java | 39 +- .../org/onap/aai/util/PositiveNumValidator.java | 17 +- .../java/org/onap/aai/web/JerseyConfiguration.java | 34 +- .../java/org/onap/aai/web/LocalHostAccessLog.java | 21 +- .../org/onap/aai/web/MicrometerConfiguration.java | 17 +- .../java/org/onap/aai/web/WebConfiguration.java | 31 +- .../src/test/java/org/onap/aai/AAISetup.java | 68 +- .../src/test/java/org/onap/aai/HttpTestUtil.java | 123 +- .../java/org/onap/aai/IncreaseNodesToolTest.java | 19 +- .../src/test/java/org/onap/aai/PayloadUtil.java | 25 +- .../org/onap/aai/ResourcesTestConfiguration.java | 45 +- .../it/multitenancy/KeycloakTestConfiguration.java | 23 +- .../it/multitenancy/KeycloakTestProperties.java | 1 + .../onap/aai/it/multitenancy/MultiTenancyIT.java | 32 +- .../org/onap/aai/it/multitenancy/RoleHandler.java | 19 +- .../org/onap/aai/rest/AbstractSpringRestTest.java | 27 +- .../org/onap/aai/rest/BulkAddConsumerTest.java | 51 +- .../org/onap/aai/rest/BulkProcessConsumerTest.java | 184 ++- .../aai/rest/BulkProcessorTestAbstraction.java | 51 +- .../java/org/onap/aai/rest/CloudRegionTest.java | 16 +- .../java/org/onap/aai/rest/ConfigurationTest.java | 106 +- .../onap/aai/rest/CustomerFilterSearchTest.java | 15 +- .../org/onap/aai/rest/ExampleConsumerTest.java | 38 +- .../org/onap/aai/rest/ExceptionHandlerTest.java | 48 +- .../java/org/onap/aai/rest/InvalidURITest.java | 11 +- .../org/onap/aai/rest/LegacyMoxyConsumerTest.java | 817 +++++-------- .../org/onap/aai/rest/PserverGenerateUrlTest.java | 19 +- .../java/org/onap/aai/rest/PserverMissingTest.java | 16 +- .../org/onap/aai/rest/PserverRelationshipTest.java | 24 +- .../test/java/org/onap/aai/rest/PserverTest.java | 16 +- .../org/onap/aai/rest/PserverWrongHeaderTest.java | 16 +- .../onap/aai/rest/URLFromVertexIdConsumerTest.java | 76 +- .../org/onap/aai/rest/VertexIdConsumerTest.java | 74 +- .../bulk/BulkSingleTransactionConsumerTest.java | 743 +++++------- .../rest/retired/RetiredConsumerSpringTest.java | 30 +- .../org/onap/aai/rest/util/LogFormatToolsTest.java | 7 +- .../onap/aai/rest/util/ValidateEncodingTest.java | 166 +-- 86 files changed, 4500 insertions(+), 4794 deletions(-) (limited to 'aai-resources/src') diff --git a/aai-resources/src/main/java/org/onap/aai/IncreaseNodesTool.java b/aai-resources/src/main/java/org/onap/aai/IncreaseNodesTool.java index 614d16f..a473c2a 100644 --- a/aai-resources/src/main/java/org/onap/aai/IncreaseNodesTool.java +++ b/aai-resources/src/main/java/org/onap/aai/IncreaseNodesTool.java @@ -17,17 +17,17 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai; +import com.beust.jcommander.JCommander; +import com.beust.jcommander.Parameter; + import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import org.onap.aai.restclient.PropertyPasswordConfiguration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.janusgraph.core.JanusGraph; @@ -41,76 +41,76 @@ import org.onap.aai.introspection.LoaderFactory; import org.onap.aai.introspection.ModelType; import org.onap.aai.introspection.exceptions.AAIUnknownObjectException; import org.onap.aai.logging.ErrorLogHelper; +import org.onap.aai.restclient.PropertyPasswordConfiguration; +import org.onap.aai.serialization.db.EdgeSerializer; +import org.onap.aai.serialization.engines.TransactionalGraphEngine; import org.onap.aai.setup.SchemaVersions; import org.onap.aai.util.AAISystemExitUtil; import org.onap.aai.util.PositiveNumValidator; -import org.onap.aai.serialization.engines.TransactionalGraphEngine; -import org.onap.aai.serialization.db.EdgeSerializer; -import com.beust.jcommander.JCommander; -import com.beust.jcommander.Parameter; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class IncreaseNodesTool { - public static long nodeCount = 0; - - @Autowired - protected static EdgeSerializer edgeSerializer; - - private LoaderFactory loaderFactory; - private SchemaVersions schemaVersions; - protected TransactionalGraphEngine engine; + public static long nodeCount = 0; + + @Autowired + protected static EdgeSerializer edgeSerializer; + + private LoaderFactory loaderFactory; + private SchemaVersions schemaVersions; + protected TransactionalGraphEngine engine; Vertex parentVtx; private static final Logger LOGGER = LoggerFactory.getLogger(IncreaseNodesTool.class); - public IncreaseNodesTool(LoaderFactory loaderFactory, SchemaVersions schemaVersions){ - this.loaderFactory = loaderFactory; - this.schemaVersions = schemaVersions; - } - - public static void main(String[] args) throws AAIUnknownObjectException, UnsupportedEncodingException, AAIException { - - AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); - PropertyPasswordConfiguration initializer = new PropertyPasswordConfiguration(); - initializer.initialize(context); - try { - context.scan( - "org.onap.aai.config", - "org.onap.aai.setup" - ); - context.refresh(); - } catch (Exception e) { - AAIException aai = null; - if(e.getCause() instanceof AAIException){ - aai = (AAIException)e.getCause(); - } else { - aai = ResourcesApp.schemaServiceExceptionTranslator(e); - } - LOGGER.error("Problems starting the Increase Nodes Tool due to {}", aai.getMessage()); - ErrorLogHelper.logException(aai); - throw aai; - } - - LoaderFactory loaderFactory = context.getBean(LoaderFactory.class); - SchemaVersions schemaVersions = (SchemaVersions) SpringContextAware.getBean("schemaVersions"); - - IncreaseNodesTool increaseNodesTool = new IncreaseNodesTool(loaderFactory, schemaVersions); - JanusGraph janusGraph = AAIGraph.getInstance().getGraph(); - - ApplicationContext ctx = (ApplicationContext) SpringContextAware.getApplicationContext(); - edgeSerializer = ctx.getBean(EdgeSerializer.class); - - increaseNodesTool.run(janusGraph,args); - AAISystemExitUtil.systemExitCloseAAIGraph(0); - - } - - - public void run(JanusGraph janusGraph, String[] args) throws AAIUnknownObjectException, UnsupportedEncodingException { + public IncreaseNodesTool(LoaderFactory loaderFactory, SchemaVersions schemaVersions) { + this.loaderFactory = loaderFactory; + this.schemaVersions = schemaVersions; + } + + public static void main(String[] args) + throws AAIUnknownObjectException, UnsupportedEncodingException, AAIException { + + AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); + PropertyPasswordConfiguration initializer = new PropertyPasswordConfiguration(); + initializer.initialize(context); + try { + context.scan("org.onap.aai.config", "org.onap.aai.setup"); + context.refresh(); + } catch (Exception e) { + AAIException aai = null; + if (e.getCause() instanceof AAIException) { + aai = (AAIException) e.getCause(); + } else { + aai = ResourcesApp.schemaServiceExceptionTranslator(e); + } + LOGGER.error("Problems starting the Increase Nodes Tool due to {}", aai.getMessage()); + ErrorLogHelper.logException(aai); + throw aai; + } + + LoaderFactory loaderFactory = context.getBean(LoaderFactory.class); + SchemaVersions schemaVersions = (SchemaVersions) SpringContextAware.getBean("schemaVersions"); + + IncreaseNodesTool increaseNodesTool = new IncreaseNodesTool(loaderFactory, schemaVersions); + JanusGraph janusGraph = AAIGraph.getInstance().getGraph(); + + ApplicationContext ctx = (ApplicationContext) SpringContextAware.getApplicationContext(); + edgeSerializer = ctx.getBean(EdgeSerializer.class); + + increaseNodesTool.run(janusGraph, args); + AAISystemExitUtil.systemExitCloseAAIGraph(0); + + } + + public void run(JanusGraph janusGraph, String[] args) + throws AAIUnknownObjectException, UnsupportedEncodingException { CommandLineArgs cArgs = new CommandLineArgs(); - JCommander jCommander = new JCommander(cArgs,args); + JCommander jCommander = new JCommander(cArgs, args); jCommander.setProgramName(IncreaseNodesTool.class.getSimpleName()); Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion()); @@ -119,20 +119,21 @@ public class IncreaseNodesTool { List propList = new ArrayList(); propList.addAll(obj.getRequiredProperties()); - nodeCount = Long.parseLong(cArgs.numberOfNodes); - addVertex(janusGraph, cArgs.nodeType,propList,cArgs); + addVertex(janusGraph, cArgs.nodeType, propList, cArgs); } + /*** * adds a vertex based on user inputs of node type number of nodes and the node uri * /cloud-infrastructure/pservers/pserver/ * /network/pnfs/pnf/ * /cloud-infrastructure/pservers/pserver/random-056fd6c4-7313-4fa0-b854-0d9983bdb0ab/p-interfaces/p-interface/ + * * @param * @param * @param cArgs */ - public void addVertex(JanusGraph janusGraph, String nodeType, List propList,CommandLineArgs cArgs){ + public void addVertex(JanusGraph janusGraph, String nodeType, List propList, CommandLineArgs cArgs) { long startTime = System.currentTimeMillis(); try (JanusGraphTransaction transaction = janusGraph.newTransaction()) { @@ -143,47 +144,44 @@ public class IncreaseNodesTool { for (long i = 1; i <= nodeCount; i++) { String randomId = UUID.randomUUID().toString(); Vertex v = g.addV(nodeType).next(); - + v.property("aai-node-type", nodeType); v.property("source-of-truth", "IncreaseNodesTool"); - v.property("aai-uri", cArgs.uri+"random-"+randomId); - + v.property("aai-uri", cArgs.uri + "random-" + randomId); - for(String propName : propList){ - if(propName.equals("in-maint")){ - v.property(propName,"false"); + for (String propName : propList) { + if (propName.equals("in-maint")) { + v.property(propName, "false"); continue; } v.property(propName, "random-" + randomId); - System.out.println("node " + i + " added " + propList.get(0)+": " + "random-"+randomId); + System.out.println("node " + i + " added " + propList.get(0) + ": " + "random-" + randomId); } - - if(cArgs.child.equals("true")){ - if(parentVtx == null){ + if (cArgs.child.equals("true")) { + + if (parentVtx == null) { String[] uriTokens = cArgs.uri.split("/"); - String ParentNodeType = uriTokens[uriTokens.length-4]; //parent node type - String keyVal = uriTokens[uriTokens.length-3]; // parent unique key - Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, schemaVersions.getDefaultVersion()); - if (loader != null) - { - Introspector objParent = loader.introspectorFromName(ParentNodeType); - if (objParent != null) - { - List parentPropList = new ArrayList(); - parentPropList.addAll(objParent.getRequiredProperties()); - if (parentPropList.size() > 0) - { - System.out.println("parent node (" + ParentNodeType + ") key (" + parentPropList.get(0)+" ) =" + keyVal); - parentVtx = g.V().has(parentPropList.get(0),keyVal).next(); - edgeSerializer.addTreeEdgeIfPossible(g,parentVtx,v); - } - } + String ParentNodeType = uriTokens[uriTokens.length - 4]; // parent node type + String keyVal = uriTokens[uriTokens.length - 3]; // parent unique key + Loader loader = loaderFactory.createLoaderForVersion(ModelType.MOXY, + schemaVersions.getDefaultVersion()); + if (loader != null) { + Introspector objParent = loader.introspectorFromName(ParentNodeType); + if (objParent != null) { + List parentPropList = new ArrayList(); + parentPropList.addAll(objParent.getRequiredProperties()); + if (parentPropList.size() > 0) { + System.out.println("parent node (" + ParentNodeType + ") key (" + + parentPropList.get(0) + " ) =" + keyVal); + parentVtx = g.V().has(parentPropList.get(0), keyVal).next(); + edgeSerializer.addTreeEdgeIfPossible(g, parentVtx, v); + } + } } - } - else{ - edgeSerializer.addTreeEdgeIfPossible(g,parentVtx,v); + } else { + edgeSerializer.addTreeEdgeIfPossible(g, parentVtx, v); } } @@ -195,7 +193,7 @@ public class IncreaseNodesTool { transaction.commit(); System.out.println("Transaction Committed"); long endTime = System.currentTimeMillis(); - System.out.println("Total Time: "+ ((endTime - startTime)/ 1000.0) + "seconds"); + System.out.println("Total Time: " + ((endTime - startTime) / 1000.0) + "seconds"); } else { transaction.rollback(); } @@ -203,23 +201,25 @@ public class IncreaseNodesTool { } } - } - +} class CommandLineArgs { - @Parameter(names = "-numberOfNodes", description = "how many nodes you would like to enter", required = true , validateWith = PositiveNumValidator.class) + @Parameter( + names = "-numberOfNodes", + description = "how many nodes you would like to enter", + required = true, + validateWith = PositiveNumValidator.class) public String numberOfNodes; @Parameter(names = "-nodeType", description = "The aai-node-type of the node being entered", required = true) public String nodeType; - @Parameter(names = "-uri", description = "uri to be passed for the node",required = true) + @Parameter(names = "-uri", description = "uri to be passed for the node", required = true) public String uri; - @Parameter(names = "-child", description = "is this a child node",required = true) + @Parameter(names = "-child", description = "is this a child node", required = true) public String child; } - diff --git a/aai-resources/src/main/java/org/onap/aai/Profiles.java b/aai-resources/src/main/java/org/onap/aai/Profiles.java index 25f51c3..9c7c05f 100644 --- a/aai-resources/src/main/java/org/onap/aai/Profiles.java +++ b/aai-resources/src/main/java/org/onap/aai/Profiles.java @@ -17,19 +17,21 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai; public final class Profiles { - public static final String DMAAP = "dmaap"; - public static final String DME2 = "dme2"; + public static final String DMAAP = "dmaap"; + public static final String DME2 = "dme2"; - public static final String ONE_WAY_SSL = "one-way-ssl"; + public static final String ONE_WAY_SSL = "one-way-ssl"; // AAF Basic Auth - public static final String AAF_AUTHENTICATION = "aaf-auth"; + public static final String AAF_AUTHENTICATION = "aaf-auth"; // AAF Auth with Client Certs - public static final String AAF_CERT_AUTHENTICATION = "aaf-cert-auth"; - public static final String TWO_WAY_SSL = "two-way-ssl"; + public static final String AAF_CERT_AUTHENTICATION = "aaf-cert-auth"; + public static final String TWO_WAY_SSL = "two-way-ssl"; - private Profiles(){} + private Profiles() { + } } diff --git a/aai-resources/src/main/java/org/onap/aai/ResourcesApp.java b/aai-resources/src/main/java/org/onap/aai/ResourcesApp.java index 419fee5..0538416 100644 --- a/aai-resources/src/main/java/org/onap/aai/ResourcesApp.java +++ b/aai-resources/src/main/java/org/onap/aai/ResourcesApp.java @@ -22,6 +22,7 @@ package org.onap.aai; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; + import org.apache.commons.lang3.exception.ExceptionUtils; import org.onap.aai.aailog.logs.AaiDebugLog; import org.onap.aai.config.SpringContextAware; @@ -43,159 +44,140 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.core.env.Environment; @SpringBootApplication( - exclude = { - DataSourceAutoConfiguration.class, - DataSourceTransactionManagerAutoConfiguration.class, - HibernateJpaAutoConfiguration.class - } -) + exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, + HibernateJpaAutoConfiguration.class}) // Component Scan provides a way to look for spring beans // It only searches beans in the following packages // Any method annotated with @Bean annotation or any class // with @Component, @Configuration, @Service will be picked up -@ComponentScan(basePackages = { - "org.onap.aai.config", - "org.onap.aai.web", - "org.onap.aai.setup", - "org.onap.aai.tasks", - "org.onap.aai.service", - "org.onap.aai.rest", - "org.onap.aai.aaf", - "org.onap.aai.TenantIsolation", - "org.onap.aai.aailog", - "org.onap.aai.prevalidation" -}) +@ComponentScan( + basePackages = {"org.onap.aai.config", "org.onap.aai.web", "org.onap.aai.setup", "org.onap.aai.tasks", + "org.onap.aai.service", "org.onap.aai.rest", "org.onap.aai.aaf", "org.onap.aai.TenantIsolation", + "org.onap.aai.aailog", "org.onap.aai.prevalidation"}) public class ResourcesApp { - private static final Logger logger = LoggerFactory.getLogger(ResourcesApp.class.getName()); - - private static final String APP_NAME = "aai-resources"; - private static AaiDebugLog debugLog = new AaiDebugLog(); - static { - debugLog.setupMDC(); - } - - @Autowired - private Environment env; - - @Autowired - private NodeIngestor nodeIngestor; - - @Autowired - private SpringContextAware context; - - @Autowired - private SpringContextAware loaderFactory; - - - @PostConstruct - private void init() throws AAIException { - System.setProperty("org.onap.aai.serverStarted", "false"); - setDefaultProps(); - logger.info("AAI Server initialization started..."); - - // Setting this property to allow for encoded slash (/) in the path parameter - // This is only needed for tomcat keeping this as temporary - System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true"); - - logger.info("Starting AAIGraph connections and the NodeInjestor"); - - if(env.acceptsProfiles(Profiles.TWO_WAY_SSL) && env.acceptsProfiles(Profiles.ONE_WAY_SSL)){ - logger.warn("You have seriously misconfigured your application"); - } - - } - - @PreDestroy - public void cleanup(){ - logger.info("Shutting down both realtime and cached connections"); - AAIGraph.getInstance().graphShutdown(); - } - - public static void main(String[] args) throws AAIException { - - setDefaultProps(); - - Environment env =null; - AAIConfig.init(); - try { - SpringApplication app = new SpringApplication(ResourcesApp.class); - app.setLogStartupInfo(false); - app.setRegisterShutdownHook(true); - app.addInitializers(new PropertyPasswordConfiguration()); - env = app.run(args).getEnvironment(); - } - catch(Exception ex){ - AAIException aai = null; - if(ex.getCause() instanceof AAIException){ - aai = (AAIException)ex.getCause(); - } else { - aai = schemaServiceExceptionTranslator(ex); - } - logger.error("Problems starting the ResourcesApp due to {}", aai.getMessage()); - ErrorLogHelper.logException(aai); - throw aai; - } - - logger.info( - "Application '{}' is running on {}!" , - env.getProperty("spring.application.name"), - env.getProperty("server.port") - ); - - // The main reason this was moved from the constructor is due - // to the SchemaGenerator needs the bean and during the constructor - // the Spring Context is not yet initialized - - AAIConfig.init(); - AAIGraph.getInstance(); - - logger.info("Resources MicroService Started"); - logger.debug("Resources MicroService Started"); - - System.out.println("Resources Microservice Started"); - - } - - public static void setDefaultProps(){ - - if (System.getProperty("file.separator") == null) { - System.setProperty("file.separator", "/"); - } - - String currentDirectory = System.getProperty("user.dir"); - System.setProperty("aai.service.name", ResourcesApp.class.getSimpleName()); - - if (System.getProperty("AJSC_HOME") == null) { - System.setProperty("AJSC_HOME", "."); - } - - if(currentDirectory.contains(APP_NAME)){ - if (System.getProperty("BUNDLECONFIG_DIR") == null) { - System.setProperty("BUNDLECONFIG_DIR", "src/main/resources"); - } - } else { - if (System.getProperty("BUNDLECONFIG_DIR") == null) { - System.setProperty("BUNDLECONFIG_DIR", "aai-resources/src/main/resources"); - } - } - } - public static AAIException schemaServiceExceptionTranslator(Exception ex) { - AAIException aai = null; - String message = ExceptionUtils.getRootCause(ex).getMessage(); - if(message.contains("NodeIngestor")){ - aai = new AAIException("AAI_3026","Error reading OXM from SchemaService - Investigate"); - } - else if(message.contains("EdgeIngestor")){ - aai = new AAIException("AAI_3027","Error reading EdgeRules from SchemaService - Investigate"); - } - else if(message.contains("Connection refused")){ - aai = new AAIException("AAI_3025","Error connecting to SchemaService - Investigate"); - } - else { - aai = new AAIException("AAI_3025","Unable to determine what the error is, please check external.log"); - } - - return aai; - } + private static final Logger logger = LoggerFactory.getLogger(ResourcesApp.class.getName()); + + private static final String APP_NAME = "aai-resources"; + private static AaiDebugLog debugLog = new AaiDebugLog(); + static { + debugLog.setupMDC(); + } + + @Autowired + private Environment env; + + @Autowired + private NodeIngestor nodeIngestor; + + @Autowired + private SpringContextAware context; + + @Autowired + private SpringContextAware loaderFactory; + + @PostConstruct + private void init() throws AAIException { + System.setProperty("org.onap.aai.serverStarted", "false"); + setDefaultProps(); + logger.info("AAI Server initialization started..."); + + // Setting this property to allow for encoded slash (/) in the path parameter + // This is only needed for tomcat keeping this as temporary + System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true"); + + logger.info("Starting AAIGraph connections and the NodeInjestor"); + + if (env.acceptsProfiles(Profiles.TWO_WAY_SSL) && env.acceptsProfiles(Profiles.ONE_WAY_SSL)) { + logger.warn("You have seriously misconfigured your application"); + } + + } + + @PreDestroy + public void cleanup() { + logger.info("Shutting down both realtime and cached connections"); + AAIGraph.getInstance().graphShutdown(); + } + + public static void main(String[] args) throws AAIException { + + setDefaultProps(); + + Environment env = null; + AAIConfig.init(); + try { + SpringApplication app = new SpringApplication(ResourcesApp.class); + app.setLogStartupInfo(false); + app.setRegisterShutdownHook(true); + app.addInitializers(new PropertyPasswordConfiguration()); + env = app.run(args).getEnvironment(); + } catch (Exception ex) { + AAIException aai = null; + if (ex.getCause() instanceof AAIException) { + aai = (AAIException) ex.getCause(); + } else { + aai = schemaServiceExceptionTranslator(ex); + } + logger.error("Problems starting the ResourcesApp due to {}", aai.getMessage()); + ErrorLogHelper.logException(aai); + throw aai; + } + + logger.info("Application '{}' is running on {}!", env.getProperty("spring.application.name"), + env.getProperty("server.port")); + + // The main reason this was moved from the constructor is due + // to the SchemaGenerator needs the bean and during the constructor + // the Spring Context is not yet initialized + + AAIConfig.init(); + AAIGraph.getInstance(); + + logger.info("Resources MicroService Started"); + logger.debug("Resources MicroService Started"); + + System.out.println("Resources Microservice Started"); + + } + + public static void setDefaultProps() { + + if (System.getProperty("file.separator") == null) { + System.setProperty("file.separator", "/"); + } + + String currentDirectory = System.getProperty("user.dir"); + System.setProperty("aai.service.name", ResourcesApp.class.getSimpleName()); + + if (System.getProperty("AJSC_HOME") == null) { + System.setProperty("AJSC_HOME", "."); + } + + if (currentDirectory.contains(APP_NAME)) { + if (System.getProperty("BUNDLECONFIG_DIR") == null) { + System.setProperty("BUNDLECONFIG_DIR", "src/main/resources"); + } + } else { + if (System.getProperty("BUNDLECONFIG_DIR") == null) { + System.setProperty("BUNDLECONFIG_DIR", "aai-resources/src/main/resources"); + } + } + } + + public static AAIException schemaServiceExceptionTranslator(Exception ex) { + AAIException aai = null; + String message = ExceptionUtils.getRootCause(ex).getMessage(); + if (message.contains("NodeIngestor")) { + aai = new AAIException("AAI_3026", "Error reading OXM from SchemaService - Investigate"); + } else if (message.contains("EdgeIngestor")) { + aai = new AAIException("AAI_3027", "Error reading EdgeRules from SchemaService - Investigate"); + } else if (message.contains("Connection refused")) { + aai = new AAIException("AAI_3025", "Error connecting to SchemaService - Investigate"); + } else { + aai = new AAIException("AAI_3025", "Unable to determine what the error is, please check external.log"); + } + + return aai; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/TenantIsolation/DataImportTasks.java b/aai-resources/src/main/java/org/onap/aai/TenantIsolation/DataImportTasks.java index c22251d..3aeac7e 100644 --- a/aai-resources/src/main/java/org/onap/aai/TenantIsolation/DataImportTasks.java +++ b/aai-resources/src/main/java/org/onap/aai/TenantIsolation/DataImportTasks.java @@ -17,8 +17,11 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.TenantIsolation; +import com.att.eelf.configuration.Configuration; + import java.io.BufferedReader; import java.io.File; import java.io.FileFilter; @@ -38,25 +41,21 @@ import java.util.UUID; import java.util.regex.Matcher; import java.util.regex.Pattern; - +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.comparator.LastModifiedFileComparator; +import org.apache.commons.io.filefilter.DirectoryFileFilter; +import org.apache.commons.io.filefilter.FileFileFilter; +import org.apache.commons.io.filefilter.RegexFileFilter; import org.onap.aai.exceptions.AAIException; import org.onap.aai.logging.ErrorLogHelper; import org.onap.aai.util.AAIConfig; import org.onap.aai.util.AAIConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.context.annotation.PropertySource; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; -import com.att.eelf.configuration.Configuration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.apache.commons.io.comparator.LastModifiedFileComparator; -import org.apache.commons.io.filefilter.DirectoryFileFilter; -import org.apache.commons.io.filefilter.FileFileFilter; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.filefilter.RegexFileFilter; - /** * DataImportTasks * @@ -76,24 +75,24 @@ public class DataImportTasks { props.setProperty(Configuration.PROPERTY_LOGGING_FILE_PATH, AAIConstants.AAI_HOME_BUNDLECONFIG); LOGGER = LoggerFactory.getLogger(DataImportTasks.class); } + /** * Scheduled task to invoke importTask */ - @Scheduled(cron = "${dataimporttask.cron}" ) + @Scheduled(cron = "${dataimporttask.cron}") public void import1() { try { importTask(); - } - catch (Exception e) { + } catch (Exception e) { } } + /** * The importTask method. * * @throws AAIException, Exception */ - public void importTask() throws AAIException, Exception { - + public void importTask() throws AAIException, Exception { if (AAIConfig.get("aai.dataimport.enable").equalsIgnoreCase("false")) { LOGGER.info("Data Import is not enabled"); @@ -107,12 +106,12 @@ public class DataImportTasks { LOGGER.info("Started importTask: " + dateFormat.format(new Date())); - String inputLocation = AAIConstants.AAI_HOME_BUNDLECONFIG + AAIConfig.get("aai.dataimport.input.location"); + String inputLocation = AAIConstants.AAI_HOME_BUNDLECONFIG + AAIConfig.get("aai.dataimport.input.location"); // Check that the input location exist File targetDirFile = new File(inputLocation); - if ( targetDirFile.exists() ) { - //Delete any existing payload file directories + if (targetDirFile.exists()) { + // Delete any existing payload file directories deletePayload(targetDirFile); } @@ -120,22 +119,25 @@ public class DataImportTasks { if (payloadFile == null) return; // already logged error in the findExportedPayload function - if ( unpackPayloadFile(payloadFile.getAbsolutePath())) { + if (unpackPayloadFile(payloadFile.getAbsolutePath())) { String[] command = new String[2]; - command[0] = AAIConstants.AAI_HOME + AAIConstants.AAI_FILESEP + "bin" + AAIConstants.AAI_FILESEP + "install" + AAIConstants.AAI_FILESEP + "addManualData.sh"; + command[0] = AAIConstants.AAI_HOME + AAIConstants.AAI_FILESEP + "bin" + AAIConstants.AAI_FILESEP + "install" + + AAIConstants.AAI_FILESEP + "addManualData.sh"; command[1] = "tenant_isolation"; runAddManualDataScript(command); } - //clean up + // clean up payloadFile.delete(); } + /** * The isDataImportRunning method, checks if the data import task was started separately via command line + * * @return true if another process is running, false if not */ - private static boolean isDataImportRunning(){ + private static boolean isDataImportRunning() { Process process = null; @@ -146,18 +148,19 @@ public class DataImportTasks { InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); - while (br.readLine() != null){ + while (br.readLine() != null) { count++; } int exitVal = process.waitFor(); LOGGER.info("Check if dataImport is running returned: " + exitVal); } catch (Exception e) { - ErrorLogHelper.logError("AAI_8002", "Exception while running the check to see if dataImport is running "+ e.getMessage()); - LOGGER.info("Exception while running the check to see if dataImport is running "+ e.getMessage()); + ErrorLogHelper.logError("AAI_8002", + "Exception while running the check to see if dataImport is running " + e.getMessage()); + LOGGER.info("Exception while running the check to see if dataImport is running " + e.getMessage()); } - if(count > 0){ + if (count > 0) { return true; } else { return false; @@ -168,57 +171,55 @@ public class DataImportTasks { * The findPayExportedPayload method tries to find the latest exported payload. * Also deletes the old files if any or any other file in this directory */ - private static File findExportedPayload() throws AAIException { + private static File findExportedPayload() throws AAIException { String targetDir = AAIConstants.AAI_HOME_BUNDLECONFIG + AAIConfig.get("aai.dataimport.input.location"); File targetDirFile = new File(targetDir); File payloadFile = null; File[] allFilesArr = targetDirFile.listFiles((FileFilter) FileFileFilter.FILE); - if ( allFilesArr == null || allFilesArr.length == 0 ) { + if (allFilesArr == null || allFilesArr.length == 0) { ErrorLogHelper.logError("AAI_8001", "Unable to find payload file at " + targetDir); - LOGGER.info ("Unable to find payload at " + targetDir); + LOGGER.info("Unable to find payload at " + targetDir); return null; } - if ( allFilesArr.length > 1 ) { + if (allFilesArr.length > 1) { Arrays.sort(allFilesArr, LastModifiedFileComparator.LASTMODIFIED_REVERSE); // get the latest payload file boolean foundTheLatestPayload = false; for (File f : allFilesArr) { - if (!foundTheLatestPayload && isTargzExtension(f.getAbsolutePath())) { - payloadFile = f; - foundTheLatestPayload = true; - } - else // delete all files except the latest payload file! - f.delete(); + if (!foundTheLatestPayload && isTargzExtension(f.getAbsolutePath())) { + payloadFile = f; + foundTheLatestPayload = true; + } else // delete all files except the latest payload file! + f.delete(); } - } - else { + } else { if (isTargzExtension(allFilesArr[0].getAbsolutePath())) payloadFile = allFilesArr[0]; } - return payloadFile; + return payloadFile; } /** * The deletePayload method deletes all the payload files that it finds at targetDirectory + * * @param targetDirFile the directory that contains payload files * @throws AAIException */ private static void deletePayload(File targetDirFile) throws AAIException { - File[] allFilesArr = targetDirFile.listFiles((FileFilter)DirectoryFileFilter.DIRECTORY); - if ( allFilesArr == null || allFilesArr.length == 0 ) { - LOGGER.info ("No payload files found at " + targetDirFile.getPath()); + File[] allFilesArr = targetDirFile.listFiles((FileFilter) DirectoryFileFilter.DIRECTORY); + if (allFilesArr == null || allFilesArr.length == 0) { + LOGGER.info("No payload files found at " + targetDirFile.getPath()); return; } - for ( File f : allFilesArr ) { + for (File f : allFilesArr) { try { FileUtils.deleteDirectory(f); - } - catch (IOException e) { + } catch (IOException e) { - LOGGER.info ("Unable to delete directory " + f.getAbsolutePath() + " " + e.getMessage()); + LOGGER.info("Unable to delete directory " + f.getAbsolutePath() + " " + e.getMessage()); } } @@ -227,35 +228,37 @@ public class DataImportTasks { /** * The isDataImportRunning method, checks if the data import task was started separately via command line + * * @return true if another process is running, false if not */ - private static boolean unpackPayloadFile(String payLoadFileName){ + private static boolean unpackPayloadFile(String payLoadFileName) { Process process = null; try { - process = new ProcessBuilder().command("bash", "-c", "gzip –d < " + payLoadFileName + " | tar xf -").start(); + process = + new ProcessBuilder().command("bash", "-c", "gzip –d < " + payLoadFileName + " | tar xf -").start(); int exitVal = process.waitFor(); LOGGER.info("gzip -d returned: " + exitVal); } catch (Exception e) { - ErrorLogHelper.logError("AAI_8002", "Exception while running the unzip "+ e.getMessage()); - LOGGER.info("Exception while running the unzip "+ e.getMessage()); + ErrorLogHelper.logError("AAI_8002", "Exception while running the unzip " + e.getMessage()); + LOGGER.info("Exception while running the unzip " + e.getMessage()); return false; } /* - if (payLoadFileName.indexOf(".") > 0) - payLoadFileName = payLoadFileName.substring(0, payLoadFileName.lastIndexOf(".")); - - try { - process = new ProcessBuilder().command("bash", "-c", "tar xf " + payLoadFileName).start(); - int exitVal = process.waitFor(); - LOGGER.info("tar xf returned: " + exitVal); - } catch (Exception e) { - ErrorLogHelper.logError("AAI_8002", "Exception while running the tar xf "+ e.getMessage()); - LOGGER.info("Exception while running the tar xf "+ e.getMessage()); - return false; - } - */ + * if (payLoadFileName.indexOf(".") > 0) + * payLoadFileName = payLoadFileName.substring(0, payLoadFileName.lastIndexOf(".")); + * + * try { + * process = new ProcessBuilder().command("bash", "-c", "tar xf " + payLoadFileName).start(); + * int exitVal = process.waitFor(); + * LOGGER.info("tar xf returned: " + exitVal); + * } catch (Exception e) { + * ErrorLogHelper.logError("AAI_8002", "Exception while running the tar xf "+ e.getMessage()); + * LOGGER.info("Exception while running the tar xf "+ e.getMessage()); + * return false; + * } + */ return true; } @@ -271,16 +274,17 @@ public class DataImportTasks { /** * The runAddManualDataScript method runs a shell script/command with a variable number of arguments + * * @param script The script/command arguments */ - private static void runAddManualDataScript(String ...script ) { + private static void runAddManualDataScript(String... script) { Process process = null; try { process = new ProcessBuilder().command(script).start(); int exitVal = process.waitFor(); LOGGER.info("addManualData.sh returned: " + exitVal); } catch (Exception e) { - ErrorLogHelper.logError("AAI_8002", "Exception while running addManualData.sh "+ e.getMessage()); + ErrorLogHelper.logError("AAI_8002", "Exception while running addManualData.sh " + e.getMessage()); LOGGER.info("Exception while running addManualData.sh" + e.getMessage()); } diff --git a/aai-resources/src/main/java/org/onap/aai/config/ErrorHandler.java b/aai-resources/src/main/java/org/onap/aai/config/ErrorHandler.java index 22e12a6..98fa14b 100644 --- a/aai-resources/src/main/java/org/onap/aai/config/ErrorHandler.java +++ b/aai-resources/src/main/java/org/onap/aai/config/ErrorHandler.java @@ -17,23 +17,25 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.config; -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.logging.ErrorLogHelper; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; -import org.springframework.web.filter.OncePerRequestFilter; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.ws.rs.core.MediaType; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; + +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.logging.ErrorLogHelper; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.springframework.web.filter.OncePerRequestFilter; /** * Responsible for dealing with uri that doesn't start with basePath @@ -46,15 +48,16 @@ public class ErrorHandler extends OncePerRequestFilter { private String basePath; - public ErrorHandler(@Value("${schema.uri.base.path}") String basePath){ + public ErrorHandler(@Value("${schema.uri.base.path}") String basePath) { this.basePath = basePath; - if(!basePath.endsWith("/")){ + if (!basePath.endsWith("/")) { this.basePath = basePath + "/"; } } @Override - protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException { + protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, + FilterChain filterChain) throws ServletException, IOException { String uri = httpServletRequest.getRequestURI(); diff --git a/aai-resources/src/main/java/org/onap/aai/config/JettyPasswordDecoder.java b/aai-resources/src/main/java/org/onap/aai/config/JettyPasswordDecoder.java index 944f951..833fd56 100644 --- a/aai-resources/src/main/java/org/onap/aai/config/JettyPasswordDecoder.java +++ b/aai-resources/src/main/java/org/onap/aai/config/JettyPasswordDecoder.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.config; import org.eclipse.jetty.util.security.Password; diff --git a/aai-resources/src/main/java/org/onap/aai/config/PasswordDecoder.java b/aai-resources/src/main/java/org/onap/aai/config/PasswordDecoder.java index 0dcb845..8ad75d9 100644 --- a/aai-resources/src/main/java/org/onap/aai/config/PasswordDecoder.java +++ b/aai-resources/src/main/java/org/onap/aai/config/PasswordDecoder.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.config; public interface PasswordDecoder { diff --git a/aai-resources/src/main/java/org/onap/aai/config/PropertyPasswordConfiguration.java b/aai-resources/src/main/java/org/onap/aai/config/PropertyPasswordConfiguration.java index ae77e5a..4c92eb2 100644 --- a/aai-resources/src/main/java/org/onap/aai/config/PropertyPasswordConfiguration.java +++ b/aai-resources/src/main/java/org/onap/aai/config/PropertyPasswordConfiguration.java @@ -17,8 +17,12 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.config; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; + import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -37,9 +41,6 @@ import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.MapPropertySource; import org.springframework.core.env.PropertySource; -import com.att.eelf.configuration.EELFLogger; -import com.att.eelf.configuration.EELFManager; - public class PropertyPasswordConfiguration implements ApplicationContextInitializer { private static final Pattern decodePasswordPattern = Pattern.compile("password\\((.*?)\\)"); @@ -116,7 +117,8 @@ public class PropertyPasswordConfiguration implements ApplicationContextInitiali Map propertyOverrides = new LinkedHashMap<>(); decodePasswords(propertySource, propertyOverrides); if (!propertyOverrides.isEmpty()) { - PropertySource decodedProperties = new MapPropertySource("decoded "+ propertySource.getName(), propertyOverrides); + PropertySource decodedProperties = + new MapPropertySource("decoded " + propertySource.getName(), propertyOverrides); environment.getPropertySources().addBefore(propertySource.getName(), decodedProperties); } @@ -142,7 +144,8 @@ public class PropertyPasswordConfiguration implements ApplicationContextInitiali } private String decodePasswordsInString(String input) { - if (input == null) return null; + if (input == null) + return null; StringBuffer output = new StringBuffer(); Matcher matcher = decodePasswordPattern.matcher(input); while (matcher.find()) { diff --git a/aai-resources/src/main/java/org/onap/aai/dbgen/tags/Command.java b/aai-resources/src/main/java/org/onap/aai/dbgen/tags/Command.java index bc18047..25f93d2 100644 --- a/aai-resources/src/main/java/org/onap/aai/dbgen/tags/Command.java +++ b/aai-resources/src/main/java/org/onap/aai/dbgen/tags/Command.java @@ -17,9 +17,10 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.dbgen.tags; @FunctionalInterface interface Command { - public abstract void execute() throws Exception; + public abstract void execute() throws Exception; } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/AAIContainerFilter.java b/aai-resources/src/main/java/org/onap/aai/interceptors/AAIContainerFilter.java index f70febf..0f9d1bf 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/AAIContainerFilter.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/AAIContainerFilter.java @@ -17,25 +17,26 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors; import java.util.UUID; import org.onap.aai.util.FormatDate; -public abstract class AAIContainerFilter { - - protected String genDate() { - FormatDate fd = new FormatDate("YYMMdd-HH:mm:ss:SSS"); - return fd.getDateTime(); - } - - protected boolean isValidUUID(String transId) { - try { - UUID.fromString(transId); - } catch (IllegalArgumentException e) { - return false; - } - return true; - } +public abstract class AAIContainerFilter { + + protected String genDate() { + FormatDate fd = new FormatDate("YYMMdd-HH:mm:ss:SSS"); + return fd.getDateTime(); + } + + protected boolean isValidUUID(String transId) { + try { + UUID.fromString(transId); + } catch (IllegalArgumentException e) { + return false; + } + return true; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/AAIHeaderProperties.java b/aai-resources/src/main/java/org/onap/aai/interceptors/AAIHeaderProperties.java index 8783ed2..461dae3 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/AAIHeaderProperties.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/AAIHeaderProperties.java @@ -17,25 +17,27 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors; public final class AAIHeaderProperties { - - private AAIHeaderProperties(){} - - public static final String REQUEST_CONTEXT = "aai-request-context"; - - public static final String HTTP_METHOD_OVERRIDE = "X-HTTP-Method-Override"; - - public static final String TRANSACTION_ID = "X-TransactionId"; - - public static final String FROM_APP_ID = "X-FromAppId"; - - public static final String SOURCE_OF_TRUTH = "X-SourceOfTruth"; - - public static final String AAI_TX_ID = "X-AAI-TXID"; - - public static final String AAI_REQUEST = "X-REQUEST"; - - public static final String AAI_REQUEST_TS = "X-REQUEST-TS"; + + private AAIHeaderProperties() { + } + + public static final String REQUEST_CONTEXT = "aai-request-context"; + + public static final String HTTP_METHOD_OVERRIDE = "X-HTTP-Method-Override"; + + public static final String TRANSACTION_ID = "X-TransactionId"; + + public static final String FROM_APP_ID = "X-FromAppId"; + + public static final String SOURCE_OF_TRUTH = "X-SourceOfTruth"; + + public static final String AAI_TX_ID = "X-AAI-TXID"; + + public static final String AAI_REQUEST = "X-REQUEST"; + + public static final String AAI_REQUEST_TS = "X-REQUEST-TS"; } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/package-info.java b/aai-resources/src/main/java/org/onap/aai/interceptors/package-info.java index ee9c334..7bad8f2 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/package-info.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/package-info.java @@ -26,11 +26,12 @@ * *
  *     
- *         @Priority(AAIRequestFilterPriority.YOUR_PRIORITY)
+ *         @Priority(AAIRequestFilterPriority.YOUR_PRIORITY)
  *         public class YourInterceptor extends AAIContainerFilter implements ContainerRequestFilter {
  *
  *         }
  *     
  * 
*/ -package org.onap.aai.interceptors; \ No newline at end of file + +package org.onap.aai.interceptors; diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/post/AAIResponseFilterPriority.java b/aai-resources/src/main/java/org/onap/aai/interceptors/post/AAIResponseFilterPriority.java index 146f847..feec781 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/post/AAIResponseFilterPriority.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/post/AAIResponseFilterPriority.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.post; /** @@ -26,15 +27,16 @@ package org.onap.aai.interceptors.post; * and INVALID_RESPONSE_STATUS */ public final class AAIResponseFilterPriority { - - private AAIResponseFilterPriority() {} - public static final int INVALID_RESPONSE_STATUS = 1000; + private AAIResponseFilterPriority() { + } + + public static final int INVALID_RESPONSE_STATUS = 1000; - public static final int RESET_LOGGING_CONTEXT = 2000; + public static final int RESET_LOGGING_CONTEXT = 2000; - public static final int RESPONSE_TRANS_LOGGING = 3000; + public static final int RESPONSE_TRANS_LOGGING = 3000; - public static final int HEADER_MANIPULATION = 4000; + public static final int HEADER_MANIPULATION = 4000; } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/post/InvalidResponseStatus.java b/aai-resources/src/main/java/org/onap/aai/interceptors/post/InvalidResponseStatus.java index 7fd0b9c..61ada79 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/post/InvalidResponseStatus.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/post/InvalidResponseStatus.java @@ -17,49 +17,51 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.post; -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.interceptors.AAIContainerFilter; -import org.onap.aai.logging.ErrorLogHelper; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; import javax.annotation.Priority; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; import javax.ws.rs.core.MediaType; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; + +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.interceptors.AAIContainerFilter; +import org.onap.aai.logging.ErrorLogHelper; @Priority(AAIResponseFilterPriority.INVALID_RESPONSE_STATUS) public class InvalidResponseStatus extends AAIContainerFilter implements ContainerResponseFilter { - @Override - public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) - throws IOException { + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) + throws IOException { - if(responseContext.getStatus() == 405){ + if (responseContext.getStatus() == 405) { - responseContext.setStatus(400); - AAIException e = new AAIException("AAI_3012"); - ArrayList templateVars = new ArrayList<>(); + responseContext.setStatus(400); + AAIException e = new AAIException("AAI_3012"); + ArrayList templateVars = new ArrayList<>(); - List mediaTypeList = new ArrayList<>(); + List mediaTypeList = new ArrayList<>(); - String contentType = responseContext.getHeaderString("Content-Type"); + String contentType = responseContext.getHeaderString("Content-Type"); - if (contentType == null) { - mediaTypeList.add(MediaType.APPLICATION_XML_TYPE); - } else { - mediaTypeList.add(MediaType.valueOf(contentType)); - } + if (contentType == null) { + mediaTypeList.add(MediaType.APPLICATION_XML_TYPE); + } else { + mediaTypeList.add(MediaType.valueOf(contentType)); + } - String message = ErrorLogHelper.getRESTAPIErrorResponse(mediaTypeList, e, templateVars); + String message = ErrorLogHelper.getRESTAPIErrorResponse(mediaTypeList, e, templateVars); - responseContext.setEntity(message); - } + responseContext.setEntity(message); + } - } + } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/post/ResponseHeaderManipulation.java b/aai-resources/src/main/java/org/onap/aai/interceptors/post/ResponseHeaderManipulation.java index 3809540..93e213e 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/post/ResponseHeaderManipulation.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/post/ResponseHeaderManipulation.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.post; import java.io.IOException; @@ -33,33 +34,34 @@ import org.onap.aai.interceptors.AAIHeaderProperties; @Priority(AAIResponseFilterPriority.HEADER_MANIPULATION) public class ResponseHeaderManipulation extends AAIContainerFilter implements ContainerResponseFilter { - private static final String DEFAULT_XML_TYPE = MediaType.APPLICATION_XML; + private static final String DEFAULT_XML_TYPE = MediaType.APPLICATION_XML; - @Override - public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) - throws IOException { + @Override + public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) + throws IOException { - updateResponseHeaders(requestContext, responseContext); + updateResponseHeaders(requestContext, responseContext); - } + } - private void updateResponseHeaders(ContainerRequestContext requestContext, - ContainerResponseContext responseContext) { + private void updateResponseHeaders(ContainerRequestContext requestContext, + ContainerResponseContext responseContext) { - responseContext.getHeaders().add(AAIHeaderProperties.AAI_TX_ID, requestContext.getProperty(AAIHeaderProperties.AAI_TX_ID)); + responseContext.getHeaders().add(AAIHeaderProperties.AAI_TX_ID, + requestContext.getProperty(AAIHeaderProperties.AAI_TX_ID)); - String responseContentType = responseContext.getHeaderString("Content-Type"); + String responseContentType = responseContext.getHeaderString("Content-Type"); - if(responseContentType == null){ - String acceptType = requestContext.getHeaderString("Accept"); + if (responseContentType == null) { + String acceptType = requestContext.getHeaderString("Accept"); - if(acceptType == null || "*/*".equals(acceptType)){ - responseContext.getHeaders().putSingle("Content-Type", DEFAULT_XML_TYPE); - } else { - responseContext.getHeaders().putSingle("Content-Type", acceptType); - } - } + if (acceptType == null || "*/*".equals(acceptType)) { + responseContext.getHeaders().putSingle("Content-Type", DEFAULT_XML_TYPE); + } else { + responseContext.getHeaders().putSingle("Content-Type", acceptType); + } + } - } + } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/post/ResponseTransactionLogging.java b/aai-resources/src/main/java/org/onap/aai/interceptors/post/ResponseTransactionLogging.java index 2a573b3..cb193af 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/post/ResponseTransactionLogging.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/post/ResponseTransactionLogging.java @@ -17,17 +17,14 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.post; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import com.google.gson.JsonObject; -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.interceptors.AAIContainerFilter; -import org.onap.aai.interceptors.AAIHeaderProperties; -import org.onap.aai.logging.ErrorLogHelper; -import org.onap.aai.util.AAIConfig; -import org.springframework.beans.factory.annotation.Autowired; + +import java.io.IOException; +import java.util.Objects; +import java.util.Optional; import javax.annotation.Priority; import javax.servlet.http.HttpServletResponse; @@ -35,9 +32,15 @@ import javax.ws.rs.HttpMethod; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerResponseContext; import javax.ws.rs.container.ContainerResponseFilter; -import java.io.IOException; -import java.util.Objects; -import java.util.Optional; + +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.interceptors.AAIContainerFilter; +import org.onap.aai.interceptors.AAIHeaderProperties; +import org.onap.aai.logging.ErrorLogHelper; +import org.onap.aai.util.AAIConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; @Priority(AAIResponseFilterPriority.RESPONSE_TRANS_LOGGING) public class ResponseTransactionLogging extends AAIContainerFilter implements ContainerResponseFilter { @@ -49,7 +52,7 @@ public class ResponseTransactionLogging extends AAIContainerFilter implements Co @Override public void filter(ContainerRequestContext requestContext, ContainerResponseContext responseContext) - throws IOException { + throws IOException { this.transLogging(requestContext, responseContext); @@ -69,14 +72,13 @@ public class ResponseTransactionLogging extends AAIContainerFilter implements Co String httpMethod = requestContext.getMethod(); - if(Boolean.parseBoolean(logValue)){ + if (Boolean.parseBoolean(logValue)) { String transId = requestContext.getHeaderString(AAIHeaderProperties.TRANSACTION_ID); String fromAppId = requestContext.getHeaderString(AAIHeaderProperties.FROM_APP_ID); String fullUri = requestContext.getUriInfo().getRequestUri().toString(); String requestTs = (String) requestContext.getProperty(AAIHeaderProperties.AAI_REQUEST_TS); - String status = Integer.toString(responseContext.getStatus()); String request = (String) requestContext.getProperty(AAIHeaderProperties.AAI_REQUEST); @@ -85,7 +87,6 @@ public class ResponseTransactionLogging extends AAIContainerFilter implements Co response = this.getResponseString(responseContext); } - JsonObject logEntry = new JsonObject(); logEntry.addProperty("transactionId", transId); logEntry.addProperty("status", status); @@ -95,7 +96,7 @@ public class ResponseTransactionLogging extends AAIContainerFilter implements Co logEntry.addProperty("resourceId", fullUri); logEntry.addProperty("resourceType", httpMethod); logEntry.addProperty("rqstBuf", Objects.toString(request, "")); - if (response != null ) { + if (response != null) { logEntry.addProperty("respBuf", Objects.toString(response)); } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/AAIRequestFilterPriority.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/AAIRequestFilterPriority.java index c3d9d3b..8dff548 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/AAIRequestFilterPriority.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/AAIRequestFilterPriority.java @@ -17,30 +17,32 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; public final class AAIRequestFilterPriority { - - private AAIRequestFilterPriority() {} - - public static final int REQUEST_TRANS_LOGGING = 1000; - - public static final int HEADER_VALIDATION = 2000; - public static final int SET_LOGGING_CONTEXT = 3000; + private AAIRequestFilterPriority() { + } + + public static final int REQUEST_TRANS_LOGGING = 1000; + + public static final int HEADER_VALIDATION = 2000; + + public static final int SET_LOGGING_CONTEXT = 3000; - public static final int HTTP_HEADER = 4000; + public static final int HTTP_HEADER = 4000; - public static final int LATEST = 4250; + public static final int LATEST = 4250; - public static final int AUTHORIZATION = 4500; + public static final int AUTHORIZATION = 4500; - public static final int RETIRED_SERVICE = 5000; + public static final int RETIRED_SERVICE = 5000; - public static final int VERSION = 5500; + public static final int VERSION = 5500; - public static final int HEADER_MANIPULATION = 6000; + public static final int HEADER_MANIPULATION = 6000; - public static final int REQUEST_MODIFICATION = 7000; + public static final int REQUEST_MODIFICATION = 7000; } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/HeaderValidation.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/HeaderValidation.java index 8113fa7..f0eaac9 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/HeaderValidation.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/HeaderValidation.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; import java.io.IOException; @@ -45,111 +46,111 @@ import org.onap.logging.ref.slf4j.ONAPLogConstants; @Priority(AAIRequestFilterPriority.HEADER_VALIDATION) public class HeaderValidation extends AAIContainerFilter implements ContainerRequestFilter { - @Override - public void filter(ContainerRequestContext requestContext) throws IOException { - - Optional oResp; - List acceptHeaderValues = requestContext.getAcceptableMediaTypes(); - - String fromAppId = getPartnerName(requestContext); - oResp = this.validateHeaderValuePresence(fromAppId, "AAI_4009", acceptHeaderValues); - if (oResp.isPresent()) { - requestContext.abortWith(oResp.get()); - return; - } - - String transId = getRequestId(requestContext); - oResp = this.validateHeaderValuePresence(transId, "AAI_4010", acceptHeaderValues); - if (oResp.isPresent()) { - requestContext.abortWith(oResp.get()); - return; - } - } - - private Optional validateHeaderValuePresence(String value, String errorCode, - List acceptHeaderValues) { - Response response = null; - AAIException aaie; - if (value == null || value.isEmpty()) { - aaie = new AAIException(errorCode); - return Optional.of(Response.status(aaie.getErrorObject().getHTTPResponseCode()) - .entity(ErrorLogHelper.getRESTAPIErrorResponse(acceptHeaderValues, aaie, new ArrayList<>())) - .build()); - } - - return Optional.ofNullable(response); - } - public String getRequestId(ContainerRequestContext requestContext) { - String requestId = requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID); - if (requestId == null || requestId.isEmpty()) { - requestId = requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID); - if (requestId == null || requestId.isEmpty()) { - requestId = requestContext.getHeaderString(Constants.HttpHeaders.TRANSACTION_ID); - if (requestId == null || requestId.isEmpty()) { - requestId = requestContext.getHeaderString(Constants.HttpHeaders.ECOMP_REQUEST_ID); - if (requestId == null || requestId.isEmpty()) { - return requestId; - } - } - } - } - if (requestContext.getHeaders().get(ONAPLogConstants.Headers.REQUEST_ID) != null) { - requestContext.getHeaders().get(ONAPLogConstants.Headers.REQUEST_ID).clear(); - } - if (requestContext.getHeaders().get(Constants.HttpHeaders.TRANSACTION_ID) != null) { - requestContext.getHeaders().get(Constants.HttpHeaders.TRANSACTION_ID).clear(); - } - if (requestContext.getHeaders().get(Constants.HttpHeaders.HEADER_REQUEST_ID) != null) { - requestContext.getHeaders().get(Constants.HttpHeaders.HEADER_REQUEST_ID).clear(); - } - if (requestContext.getHeaders().get(Constants.HttpHeaders.ECOMP_REQUEST_ID) != null) { - requestContext.getHeaders().get(Constants.HttpHeaders.ECOMP_REQUEST_ID).clear(); - } - requestContext.getHeaders().add(Constants.HttpHeaders.TRANSACTION_ID, requestId); - - return requestId; - } - - public String getPartnerName(ContainerRequestContext requestContext) { - - // CDM header overrides everything else for source of truth - String sourceOfTruth = requestContext.getHeaderString(AAIHeaderProperties.SOURCE_OF_TRUTH); - String partnerName = requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME); - if ( sourceOfTruth == null || sourceOfTruth.isEmpty()) { - - if (partnerName != null && !(partnerName.isEmpty())) { - String components[] = partnerName.split("\\."); - if (components.length > 1) { - if (!(ONAPComponents.AAI.toString().equalsIgnoreCase(components[0]))) { - sourceOfTruth = components[0]; - } else { - // request is coming internally from AAI, check X-FromAppId - partnerName = null; - } - } - } - if (sourceOfTruth == null || sourceOfTruth.isEmpty()) { - if (partnerName == null || (partnerName.isEmpty())) { - partnerName = requestContext.getHeaderString(AAIHeaderProperties.FROM_APP_ID); - if (partnerName == null || (partnerName.isEmpty())) { - return partnerName; - } - } - } - } - if (requestContext.getHeaders().get(ONAPLogConstants.Headers.PARTNER_NAME) != null) { - requestContext.getHeaders().get(ONAPLogConstants.Headers.PARTNER_NAME).clear(); - } - if (requestContext.getHeaders().get(AAIHeaderProperties.FROM_APP_ID) != null) { - requestContext.getHeaders().get(AAIHeaderProperties.FROM_APP_ID).clear(); - } - if ((sourceOfTruth != null) && !(sourceOfTruth.isEmpty())) { - requestContext.getHeaders().add(AAIHeaderProperties.FROM_APP_ID, sourceOfTruth); - partnerName = sourceOfTruth; - } - else { - requestContext.getHeaders().add(AAIHeaderProperties.FROM_APP_ID, partnerName); - } - return partnerName; - } + @Override + public void filter(ContainerRequestContext requestContext) throws IOException { + + Optional oResp; + List acceptHeaderValues = requestContext.getAcceptableMediaTypes(); + + String fromAppId = getPartnerName(requestContext); + oResp = this.validateHeaderValuePresence(fromAppId, "AAI_4009", acceptHeaderValues); + if (oResp.isPresent()) { + requestContext.abortWith(oResp.get()); + return; + } + + String transId = getRequestId(requestContext); + oResp = this.validateHeaderValuePresence(transId, "AAI_4010", acceptHeaderValues); + if (oResp.isPresent()) { + requestContext.abortWith(oResp.get()); + return; + } + } + + private Optional validateHeaderValuePresence(String value, String errorCode, + List acceptHeaderValues) { + Response response = null; + AAIException aaie; + if (value == null || value.isEmpty()) { + aaie = new AAIException(errorCode); + return Optional.of(Response.status(aaie.getErrorObject().getHTTPResponseCode()) + .entity(ErrorLogHelper.getRESTAPIErrorResponse(acceptHeaderValues, aaie, new ArrayList<>())) + .build()); + } + + return Optional.ofNullable(response); + } + + public String getRequestId(ContainerRequestContext requestContext) { + String requestId = requestContext.getHeaderString(ONAPLogConstants.Headers.REQUEST_ID); + if (requestId == null || requestId.isEmpty()) { + requestId = requestContext.getHeaderString(Constants.HttpHeaders.HEADER_REQUEST_ID); + if (requestId == null || requestId.isEmpty()) { + requestId = requestContext.getHeaderString(Constants.HttpHeaders.TRANSACTION_ID); + if (requestId == null || requestId.isEmpty()) { + requestId = requestContext.getHeaderString(Constants.HttpHeaders.ECOMP_REQUEST_ID); + if (requestId == null || requestId.isEmpty()) { + return requestId; + } + } + } + } + if (requestContext.getHeaders().get(ONAPLogConstants.Headers.REQUEST_ID) != null) { + requestContext.getHeaders().get(ONAPLogConstants.Headers.REQUEST_ID).clear(); + } + if (requestContext.getHeaders().get(Constants.HttpHeaders.TRANSACTION_ID) != null) { + requestContext.getHeaders().get(Constants.HttpHeaders.TRANSACTION_ID).clear(); + } + if (requestContext.getHeaders().get(Constants.HttpHeaders.HEADER_REQUEST_ID) != null) { + requestContext.getHeaders().get(Constants.HttpHeaders.HEADER_REQUEST_ID).clear(); + } + if (requestContext.getHeaders().get(Constants.HttpHeaders.ECOMP_REQUEST_ID) != null) { + requestContext.getHeaders().get(Constants.HttpHeaders.ECOMP_REQUEST_ID).clear(); + } + requestContext.getHeaders().add(Constants.HttpHeaders.TRANSACTION_ID, requestId); + + return requestId; + } + + public String getPartnerName(ContainerRequestContext requestContext) { + + // CDM header overrides everything else for source of truth + String sourceOfTruth = requestContext.getHeaderString(AAIHeaderProperties.SOURCE_OF_TRUTH); + String partnerName = requestContext.getHeaderString(ONAPLogConstants.Headers.PARTNER_NAME); + if (sourceOfTruth == null || sourceOfTruth.isEmpty()) { + + if (partnerName != null && !(partnerName.isEmpty())) { + String components[] = partnerName.split("\\."); + if (components.length > 1) { + if (!(ONAPComponents.AAI.toString().equalsIgnoreCase(components[0]))) { + sourceOfTruth = components[0]; + } else { + // request is coming internally from AAI, check X-FromAppId + partnerName = null; + } + } + } + if (sourceOfTruth == null || sourceOfTruth.isEmpty()) { + if (partnerName == null || (partnerName.isEmpty())) { + partnerName = requestContext.getHeaderString(AAIHeaderProperties.FROM_APP_ID); + if (partnerName == null || (partnerName.isEmpty())) { + return partnerName; + } + } + } + } + if (requestContext.getHeaders().get(ONAPLogConstants.Headers.PARTNER_NAME) != null) { + requestContext.getHeaders().get(ONAPLogConstants.Headers.PARTNER_NAME).clear(); + } + if (requestContext.getHeaders().get(AAIHeaderProperties.FROM_APP_ID) != null) { + requestContext.getHeaders().get(AAIHeaderProperties.FROM_APP_ID).clear(); + } + if ((sourceOfTruth != null) && !(sourceOfTruth.isEmpty())) { + requestContext.getHeaders().add(AAIHeaderProperties.FROM_APP_ID, sourceOfTruth); + partnerName = sourceOfTruth; + } else { + requestContext.getHeaders().add(AAIHeaderProperties.FROM_APP_ID, partnerName); + } + return partnerName; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/HttpHeaderInterceptor.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/HttpHeaderInterceptor.java index faca530..17cdeff 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/HttpHeaderInterceptor.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/HttpHeaderInterceptor.java @@ -17,17 +17,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; -import org.onap.aai.interceptors.AAIContainerFilter; -import org.onap.aai.interceptors.AAIHeaderProperties; + +import java.io.IOException; import javax.annotation.Priority; +import javax.ws.rs.HttpMethod; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.PreMatching; -import javax.ws.rs.HttpMethod; -import java.io.IOException; +import org.onap.aai.interceptors.AAIContainerFilter; +import org.onap.aai.interceptors.AAIHeaderProperties; /** * The Class HttpHeaderInterceptor @@ -35,16 +37,16 @@ import java.io.IOException; @PreMatching @Priority(AAIRequestFilterPriority.HTTP_HEADER) public class HttpHeaderInterceptor extends AAIContainerFilter implements ContainerRequestFilter { - public static final String patchMethod = "PATCH"; - + public static final String patchMethod = "PATCH"; + @Override public void filter(ContainerRequestContext containerRequestContext) throws IOException { - String overrideMethod = containerRequestContext.getHeaderString(AAIHeaderProperties.HTTP_METHOD_OVERRIDE); - String httpMethod = containerRequestContext.getMethod(); - - if (HttpMethod.POST.equalsIgnoreCase(httpMethod) && patchMethod.equalsIgnoreCase(overrideMethod)) { - containerRequestContext.setMethod(patchMethod); - } + String overrideMethod = containerRequestContext.getHeaderString(AAIHeaderProperties.HTTP_METHOD_OVERRIDE); + String httpMethod = containerRequestContext.getMethod(); + + if (HttpMethod.POST.equalsIgnoreCase(httpMethod) && patchMethod.equalsIgnoreCase(overrideMethod)) { + containerRequestContext.setMethod(patchMethod); + } } - + } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/OneWaySslAuthorization.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/OneWaySslAuthorization.java index a6c5ed9..bc7390e 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/OneWaySslAuthorization.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/OneWaySslAuthorization.java @@ -17,15 +17,13 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; -import org.onap.aai.Profiles; -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.interceptors.AAIContainerFilter; -import org.onap.aai.logging.ErrorLogHelper; -import org.onap.aai.service.AuthorizationService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Profile; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; import javax.annotation.Priority; import javax.ws.rs.container.ContainerRequestContext; @@ -33,10 +31,14 @@ import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.PreMatching; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; + +import org.onap.aai.Profiles; +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.interceptors.AAIContainerFilter; +import org.onap.aai.logging.ErrorLogHelper; +import org.onap.aai.service.AuthorizationService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; @Profile(Profiles.ONE_WAY_SSL) @PreMatching @@ -47,17 +49,16 @@ public class OneWaySslAuthorization extends AAIContainerFilter implements Contai private AuthorizationService authorizationService; @Override - public void filter(ContainerRequestContext containerRequestContext) throws IOException - { + public void filter(ContainerRequestContext containerRequestContext) throws IOException { - if(containerRequestContext.getUriInfo().getRequestUri().getPath().matches("^.*/util/echo$")){ + if (containerRequestContext.getUriInfo().getRequestUri().getPath().matches("^.*/util/echo$")) { return; } String basicAuth = containerRequestContext.getHeaderString("Authorization"); List acceptHeaderValues = containerRequestContext.getAcceptableMediaTypes(); - if(basicAuth == null || !basicAuth.startsWith("Basic ")){ + if (basicAuth == null || !basicAuth.startsWith("Basic ")) { Optional responseOptional = errorResponse("AAI_3300", acceptHeaderValues); containerRequestContext.abortWith(responseOptional.get()); return; @@ -65,7 +66,7 @@ public class OneWaySslAuthorization extends AAIContainerFilter implements Contai basicAuth = basicAuth.replaceAll("Basic ", ""); - if(!authorizationService.checkIfUserAuthorized(basicAuth)){ + if (!authorizationService.checkIfUserAuthorized(basicAuth)) { Optional responseOptional = errorResponse("AAI_3300", acceptHeaderValues); containerRequestContext.abortWith(responseOptional.get()); return; @@ -76,8 +77,7 @@ public class OneWaySslAuthorization extends AAIContainerFilter implements Contai private Optional errorResponse(String errorCode, List acceptHeaderValues) { AAIException aaie = new AAIException(errorCode); return Optional.of(Response.status(aaie.getErrorObject().getHTTPResponseCode()) - .entity(ErrorLogHelper.getRESTAPIErrorResponse(acceptHeaderValues, aaie, new ArrayList<>())) - .build()); + .entity(ErrorLogHelper.getRESTAPIErrorResponse(acceptHeaderValues, aaie, new ArrayList<>())).build()); } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestHeaderManipulation.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestHeaderManipulation.java index 97562d2..b70ff06 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestHeaderManipulation.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestHeaderManipulation.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; import java.io.IOException; @@ -39,27 +40,27 @@ import org.springframework.beans.factory.annotation.Autowired; @Priority(AAIRequestFilterPriority.HEADER_MANIPULATION) public class RequestHeaderManipulation extends AAIContainerFilter implements ContainerRequestFilter { - @Override - public void filter(ContainerRequestContext requestContext) { + @Override + public void filter(ContainerRequestContext requestContext) { + + String uri = requestContext.getUriInfo().getPath(); + this.addRequestContext(uri, requestContext.getHeaders()); - String uri = requestContext.getUriInfo().getPath(); - this.addRequestContext(uri, requestContext.getHeaders()); + } - } - - private void addRequestContext(String uri, MultivaluedMap requestHeaders) { + private void addRequestContext(String uri, MultivaluedMap requestHeaders) { - String rc = ""; + String rc = ""; Matcher match = VersionInterceptor.EXTRACT_VERSION_PATTERN.matcher(uri); if (match.find()) { rc = match.group(1); } - if (requestHeaders.containsKey(AAIHeaderProperties.REQUEST_CONTEXT)) { - requestHeaders.remove(AAIHeaderProperties.REQUEST_CONTEXT); - } - requestHeaders.put(AAIHeaderProperties.REQUEST_CONTEXT, Collections.singletonList(rc)); - } + if (requestHeaders.containsKey(AAIHeaderProperties.REQUEST_CONTEXT)) { + requestHeaders.remove(AAIHeaderProperties.REQUEST_CONTEXT); + } + requestHeaders.put(AAIHeaderProperties.REQUEST_CONTEXT, Collections.singletonList(rc)); + } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestModification.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestModification.java index 797f9c9..d40fdbb 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestModification.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestModification.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; import java.io.IOException; @@ -39,38 +40,38 @@ import org.onap.aai.interceptors.AAIContainerFilter; @Priority(AAIRequestFilterPriority.REQUEST_MODIFICATION) public class RequestModification extends AAIContainerFilter implements ContainerRequestFilter { - @Override - public void filter(ContainerRequestContext requestContext) throws IOException { + @Override + public void filter(ContainerRequestContext requestContext) throws IOException { + + this.cleanDME2QueryParams(requestContext); - this.cleanDME2QueryParams(requestContext); + } - } - - private void cleanDME2QueryParams(ContainerRequestContext request) { - UriBuilder builder = request.getUriInfo().getRequestUriBuilder(); - MultivaluedMap queries = request.getUriInfo().getQueryParameters(); + private void cleanDME2QueryParams(ContainerRequestContext request) { + UriBuilder builder = request.getUriInfo().getRequestUriBuilder(); + MultivaluedMap queries = request.getUriInfo().getQueryParameters(); - String[] blacklist = { "version", "envContext", "routeOffer" }; - Set blacklistSet = Arrays.stream(blacklist).collect(Collectors.toSet()); + String[] blacklist = {"version", "envContext", "routeOffer"}; + Set blacklistSet = Arrays.stream(blacklist).collect(Collectors.toSet()); - boolean remove = true; + boolean remove = true; - for (String param : blacklistSet) { - if (!queries.containsKey(param)) { - remove = false; - break; - } - } + for (String param : blacklistSet) { + if (!queries.containsKey(param)) { + remove = false; + break; + } + } - if (remove) { - for (Map.Entry> query : queries.entrySet()) { - String key = query.getKey(); - if (blacklistSet.contains(key)) { - builder.replaceQueryParam(key); - } - } - } - request.setRequestUri(builder.build()); - } + if (remove) { + for (Map.Entry> query : queries.entrySet()) { + String key = query.getKey(); + if (blacklistSet.contains(key)) { + builder.replaceQueryParam(key); + } + } + } + request.setRequestUri(builder.build()); + } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestTransactionLogging.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestTransactionLogging.java index 54f2695..14c1f01 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestTransactionLogging.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RequestTransactionLogging.java @@ -17,15 +17,18 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; +import com.google.gson.JsonObject; + import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import java.security.SecureRandom; import java.util.Random; import java.util.UUID; -import java.security.SecureRandom; import javax.annotation.Priority; import javax.servlet.http.HttpServletRequest; @@ -45,103 +48,104 @@ import org.onap.aai.util.AAIConfig; import org.onap.aai.util.AAIConstants; import org.onap.aai.util.HbaseSaltPrefixer; import org.springframework.beans.factory.annotation.Autowired; - -import com.google.gson.JsonObject; import org.springframework.util.StringUtils; @PreMatching @Priority(AAIRequestFilterPriority.REQUEST_TRANS_LOGGING) public class RequestTransactionLogging extends AAIContainerFilter implements ContainerRequestFilter { - @Autowired - private HttpServletRequest httpServletRequest; - - private static final String DEFAULT_CONTENT_TYPE = MediaType.APPLICATION_JSON; - private static final String DEFAULT_RESPONSE_TYPE = MediaType.APPLICATION_XML; - - private static final String CONTENT_TYPE = "Content-Type"; - private static final String ACCEPT = "Accept"; - private static final String TEXT_PLAIN = "text/plain"; - private static final String WILDCARD = "*/*"; - private static final String APPLICATION_JSON = "application/json"; - - @Override - public void filter(ContainerRequestContext requestContext) throws IOException { - - String currentTimeStamp = genDate(); - String fullId = this.getAAITxIdToHeader(currentTimeStamp); - this.addToRequestContext(requestContext, AAIHeaderProperties.AAI_TX_ID, fullId); - this.addToRequestContext(requestContext, AAIHeaderProperties.AAI_REQUEST, this.getRequest(requestContext, fullId)); - this.addToRequestContext(requestContext, AAIHeaderProperties.AAI_REQUEST_TS, currentTimeStamp); - this.addDefaultContentType(requestContext); - } - - private void addToRequestContext(ContainerRequestContext requestContext, String name, String aaiTxIdToHeader) { - requestContext.setProperty(name, aaiTxIdToHeader); - } - - private void addDefaultContentType(ContainerRequestContext requestContext) { - - String contentType = requestContext.getHeaderString(CONTENT_TYPE); - String acceptType = requestContext.getHeaderString(ACCEPT); - - if(contentType == null || contentType.contains(TEXT_PLAIN)){ - requestContext.getHeaders().putSingle(CONTENT_TYPE, DEFAULT_CONTENT_TYPE); - } - - if(WILDCARD.equals(acceptType) || StringUtils.isEmpty(acceptType) || acceptType.contains(TEXT_PLAIN)){ - UriInfo uriInfo = requestContext.getUriInfo(); - if(uriInfo != null){ - MultivaluedMap queryParameters = uriInfo.getQueryParameters(); - if(queryParameters != null && queryParameters.containsKey("format")){ - // Add application/json as the default header if request contains query parameter format - // Since clients are assuming the default response to be application json for when format is specified - requestContext.getHeaders().putSingle(ACCEPT, APPLICATION_JSON); - } else { - requestContext.getHeaders().putSingle(ACCEPT, DEFAULT_RESPONSE_TYPE); - } - } else { - requestContext.getHeaders().putSingle(ACCEPT, DEFAULT_RESPONSE_TYPE); - } - } - } - - private String getAAITxIdToHeader(String currentTimeStamp) { - String txId = UUID.randomUUID().toString(); - try { - Random rand = new SecureRandom(); - int number = rand.nextInt(99999); - txId = HbaseSaltPrefixer.getInstance().prependSalt(AAIConfig.get(AAIConstants.AAI_NODENAME) + "-" - + currentTimeStamp + "-" + number ); //new Random(System.currentTimeMillis()).nextInt(99999) - } catch (AAIException e) { - } - - return txId; - } - - private String getRequest(ContainerRequestContext requestContext, String fullId) { - - JsonObject request = new JsonObject(); - request.addProperty("ID", fullId); - request.addProperty("Http-Method", requestContext.getMethod()); - request.addProperty(CONTENT_TYPE, httpServletRequest.getContentType()); - request.addProperty("Headers", requestContext.getHeaders().toString()); - - ByteArrayOutputStream out = new ByteArrayOutputStream(); - InputStream in = requestContext.getEntityStream(); - - try { - if (in.available() > 0) { - ReaderWriter.writeTo(in, out); - byte[] requestEntity = out.toByteArray(); - request.addProperty("Payload", new String(requestEntity, "UTF-8")); - requestContext.setEntityStream(new ByteArrayInputStream(requestEntity)); - } - } catch (IOException ex) { - throw new ContainerException(ex); - } - - return request.toString(); - } + @Autowired + private HttpServletRequest httpServletRequest; + + private static final String DEFAULT_CONTENT_TYPE = MediaType.APPLICATION_JSON; + private static final String DEFAULT_RESPONSE_TYPE = MediaType.APPLICATION_XML; + + private static final String CONTENT_TYPE = "Content-Type"; + private static final String ACCEPT = "Accept"; + private static final String TEXT_PLAIN = "text/plain"; + private static final String WILDCARD = "*/*"; + private static final String APPLICATION_JSON = "application/json"; + + @Override + public void filter(ContainerRequestContext requestContext) throws IOException { + + String currentTimeStamp = genDate(); + String fullId = this.getAAITxIdToHeader(currentTimeStamp); + this.addToRequestContext(requestContext, AAIHeaderProperties.AAI_TX_ID, fullId); + this.addToRequestContext(requestContext, AAIHeaderProperties.AAI_REQUEST, + this.getRequest(requestContext, fullId)); + this.addToRequestContext(requestContext, AAIHeaderProperties.AAI_REQUEST_TS, currentTimeStamp); + this.addDefaultContentType(requestContext); + } + + private void addToRequestContext(ContainerRequestContext requestContext, String name, String aaiTxIdToHeader) { + requestContext.setProperty(name, aaiTxIdToHeader); + } + + private void addDefaultContentType(ContainerRequestContext requestContext) { + + String contentType = requestContext.getHeaderString(CONTENT_TYPE); + String acceptType = requestContext.getHeaderString(ACCEPT); + + if (contentType == null || contentType.contains(TEXT_PLAIN)) { + requestContext.getHeaders().putSingle(CONTENT_TYPE, DEFAULT_CONTENT_TYPE); + } + + if (WILDCARD.equals(acceptType) || StringUtils.isEmpty(acceptType) || acceptType.contains(TEXT_PLAIN)) { + UriInfo uriInfo = requestContext.getUriInfo(); + if (uriInfo != null) { + MultivaluedMap queryParameters = uriInfo.getQueryParameters(); + if (queryParameters != null && queryParameters.containsKey("format")) { + // Add application/json as the default header if request contains query parameter format + // Since clients are assuming the default response to be application json for when format is + // specified + requestContext.getHeaders().putSingle(ACCEPT, APPLICATION_JSON); + } else { + requestContext.getHeaders().putSingle(ACCEPT, DEFAULT_RESPONSE_TYPE); + } + } else { + requestContext.getHeaders().putSingle(ACCEPT, DEFAULT_RESPONSE_TYPE); + } + } + } + + private String getAAITxIdToHeader(String currentTimeStamp) { + String txId = UUID.randomUUID().toString(); + try { + Random rand = new SecureRandom(); + int number = rand.nextInt(99999); + txId = HbaseSaltPrefixer.getInstance() + .prependSalt(AAIConfig.get(AAIConstants.AAI_NODENAME) + "-" + currentTimeStamp + "-" + number); // new + // Random(System.currentTimeMillis()).nextInt(99999) + } catch (AAIException e) { + } + + return txId; + } + + private String getRequest(ContainerRequestContext requestContext, String fullId) { + + JsonObject request = new JsonObject(); + request.addProperty("ID", fullId); + request.addProperty("Http-Method", requestContext.getMethod()); + request.addProperty(CONTENT_TYPE, httpServletRequest.getContentType()); + request.addProperty("Headers", requestContext.getHeaders().toString()); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + InputStream in = requestContext.getEntityStream(); + + try { + if (in.available() > 0) { + ReaderWriter.writeTo(in, out); + byte[] requestEntity = out.toByteArray(); + request.addProperty("Payload", new String(requestEntity, "UTF-8")); + requestContext.setEntityStream(new ByteArrayInputStream(requestEntity)); + } + } catch (IOException ex) { + throw new ContainerException(ex); + } + + return request.toString(); + } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RetiredInterceptor.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RetiredInterceptor.java index 643793d..80741f8 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RetiredInterceptor.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/RetiredInterceptor.java @@ -17,8 +17,21 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.annotation.Priority; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.core.Response; + import org.onap.aai.exceptions.AAIException; import org.onap.aai.interceptors.AAIContainerFilter; import org.onap.aai.logging.ErrorLogHelper; @@ -27,17 +40,6 @@ import org.onap.aai.util.AAIConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import javax.annotation.Priority; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.container.PreMatching; -import javax.ws.rs.core.Response; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - // Can cache this so if the uri was already cached then it won't run the string // matching each time but only does it for the first time @@ -52,13 +54,14 @@ public class RetiredInterceptor extends AAIContainerFilter implements ContainerR private String basePath; @Autowired - public RetiredInterceptor(RetiredService retiredService, @Value("${schema.uri.base.path}") String basePath){ + public RetiredInterceptor(RetiredService retiredService, @Value("${schema.uri.base.path}") String basePath) { this.retiredService = retiredService; this.basePath = basePath; - if(!basePath.endsWith("/")){ + if (!basePath.endsWith("/")) { this.basePath = basePath + "/"; } } + @Override public void filter(ContainerRequestContext containerRequestContext) throws IOException { @@ -68,8 +71,7 @@ public class RetiredInterceptor extends AAIContainerFilter implements ContainerR List retiredAllVersionList = retiredService.getRetiredAllVersionList(); - - if(checkIfUriRetired(containerRequestContext, retiredAllVersionList, version, requestURI, "")){ + if (checkIfUriRetired(containerRequestContext, retiredAllVersionList, version, requestURI, "")) { return; } @@ -78,18 +80,14 @@ public class RetiredInterceptor extends AAIContainerFilter implements ContainerR checkIfUriRetired(containerRequestContext, retiredVersionList, version, requestURI); } - public boolean checkIfUriRetired(ContainerRequestContext containerRequestContext, - List retiredPatterns, - String version, - String requestURI, - String message){ - + public boolean checkIfUriRetired(ContainerRequestContext containerRequestContext, List retiredPatterns, + String version, String requestURI, String message) { - for(Pattern retiredPattern : retiredPatterns){ - if(retiredPattern.matcher(requestURI).matches()){ + for (Pattern retiredPattern : retiredPatterns) { + if (retiredPattern.matcher(requestURI).matches()) { AAIException e; - if(message == null){ + if (message == null) { e = new AAIException("AAI_3007"); } else { e = new AAIException("AAI_3015"); @@ -99,24 +97,18 @@ public class RetiredInterceptor extends AAIContainerFilter implements ContainerR if (templateVars.isEmpty()) { templateVars.add("PUT"); - if(requestURI != null){ + if (requestURI != null) { requestURI = requestURI.replaceAll(basePath, ""); } templateVars.add(requestURI); - if(message == null){ + if (message == null) { templateVars.add(version); templateVars.add(AAIConfig.get("aai.default.api.version", "")); } } - Response response = Response - .status(e.getErrorObject().getHTTPResponseCode()) - .entity( - ErrorLogHelper - .getRESTAPIErrorResponse( - containerRequestContext.getAcceptableMediaTypes(), e, templateVars - ) - ) + Response response = Response.status(e.getErrorObject().getHTTPResponseCode()).entity(ErrorLogHelper + .getRESTAPIErrorResponse(containerRequestContext.getAcceptableMediaTypes(), e, templateVars)) .build(); containerRequestContext.abortWith(response); @@ -128,10 +120,8 @@ public class RetiredInterceptor extends AAIContainerFilter implements ContainerR return false; } - public boolean checkIfUriRetired(ContainerRequestContext containerRequestContext, - List retiredPatterns, - String version, - String requestURI){ + public boolean checkIfUriRetired(ContainerRequestContext containerRequestContext, List retiredPatterns, + String version, String requestURI) { return checkIfUriRetired(containerRequestContext, retiredPatterns, version, requestURI, null); } @@ -139,7 +129,7 @@ public class RetiredInterceptor extends AAIContainerFilter implements ContainerR Matcher versionMatcher = VERSION_PATTERN.matcher(requestURI); String version = null; - if(versionMatcher.find()){ + if (versionMatcher.find()) { version = versionMatcher.group(0); } return version; diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/VersionInterceptor.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/VersionInterceptor.java index f3c5768..5d21141 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/VersionInterceptor.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/VersionInterceptor.java @@ -17,20 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.interceptors.pre; -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.interceptors.AAIContainerFilter; -import org.onap.aai.logging.ErrorLogHelper; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.springframework.beans.factory.annotation.Autowired; +package org.onap.aai.interceptors.pre; -import javax.annotation.Priority; -import javax.ws.rs.container.ContainerRequestContext; -import javax.ws.rs.container.ContainerRequestFilter; -import javax.ws.rs.container.PreMatching; -import javax.ws.rs.core.Response; import java.net.URI; import java.util.ArrayList; import java.util.Set; @@ -38,6 +27,19 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import javax.annotation.Priority; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerRequestFilter; +import javax.ws.rs.container.PreMatching; +import javax.ws.rs.core.Response; + +import org.onap.aai.exceptions.AAIException; +import org.onap.aai.interceptors.AAIContainerFilter; +import org.onap.aai.logging.ErrorLogHelper; +import org.onap.aai.setup.SchemaVersion; +import org.onap.aai.setup.SchemaVersions; +import org.springframework.beans.factory.annotation.Autowired; + @PreMatching @Priority(AAIRequestFilterPriority.VERSION) public class VersionInterceptor extends AAIContainerFilter implements ContainerRequestFilter { @@ -49,12 +51,10 @@ public class VersionInterceptor extends AAIContainerFilter implements ContainerR private final SchemaVersions schemaVersions; @Autowired - public VersionInterceptor(SchemaVersions schemaVersions){ + public VersionInterceptor(SchemaVersions schemaVersions) { this.schemaVersions = schemaVersions; - allowedVersions = schemaVersions.getVersions() - .stream() - .map(SchemaVersion::toString) - .collect(Collectors.toSet()); + allowedVersions = + schemaVersions.getVersions().stream().map(SchemaVersion::toString).collect(Collectors.toSet()); } @@ -65,19 +65,19 @@ public class VersionInterceptor extends AAIContainerFilter implements ContainerR if (uri.startsWith("search") || uri.startsWith("util/echo") || uri.startsWith("tools")) { return; - } + } Matcher matcher = EXTRACT_VERSION_PATTERN.matcher(uri); String version = null; - if(matcher.matches()){ + if (matcher.matches()) { version = matcher.group(1); } else { requestContext.abortWith(createInvalidVersionResponse("AAI_3017", requestContext, version)); return; } - if(!allowedVersions.contains(version)){ + if (!allowedVersions.contains(version)) { requestContext.abortWith(createInvalidVersionResponse("AAI_3016", requestContext, version)); } } @@ -94,9 +94,6 @@ public class VersionInterceptor extends AAIContainerFilter implements ContainerR String entity = ErrorLogHelper.getRESTAPIErrorResponse(context.getAcceptableMediaTypes(), e, templateVars); - return Response - .status(e.getErrorObject().getHTTPResponseCode()) - .entity(entity) - .build(); + return Response.status(e.getErrorObject().getHTTPResponseCode()).entity(entity).build(); } } diff --git a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/VersionLatestInterceptor.java b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/VersionLatestInterceptor.java index 61008b6..5d68c8a 100644 --- a/aai-resources/src/main/java/org/onap/aai/interceptors/pre/VersionLatestInterceptor.java +++ b/aai-resources/src/main/java/org/onap/aai/interceptors/pre/VersionLatestInterceptor.java @@ -17,17 +17,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.interceptors.pre; -import org.onap.aai.interceptors.AAIContainerFilter; -import org.onap.aai.setup.SchemaVersions; -import org.springframework.beans.factory.annotation.Autowired; +import java.net.URI; import javax.annotation.Priority; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.PreMatching; -import java.net.URI; + +import org.onap.aai.interceptors.AAIContainerFilter; +import org.onap.aai.setup.SchemaVersions; +import org.springframework.beans.factory.annotation.Autowired; @PreMatching @Priority(AAIRequestFilterPriority.LATEST) @@ -36,7 +38,7 @@ public class VersionLatestInterceptor extends AAIContainerFilter implements Cont private final SchemaVersions schemaVersions; @Autowired - public VersionLatestInterceptor(SchemaVersions schemaVersions){ + public VersionLatestInterceptor(SchemaVersions schemaVersions) { this.schemaVersions = schemaVersions; } @@ -45,8 +47,8 @@ public class VersionLatestInterceptor extends AAIContainerFilter implements Cont String uri = requestContext.getUriInfo().getPath(); - if(uri.startsWith("latest")){ - String absolutePath = requestContext.getUriInfo().getAbsolutePath().toString(); + if (uri.startsWith("latest")) { + String absolutePath = requestContext.getUriInfo().getAbsolutePath().toString(); String latest = absolutePath.replaceFirst("latest", schemaVersions.getDefaultVersion().toString()); requestContext.setRequestUri(URI.create(latest)); return; diff --git a/aai-resources/src/main/java/org/onap/aai/rest/BulkAddConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/BulkAddConsumer.java index e28cce9..3287dd1 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/BulkAddConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/BulkAddConsumer.java @@ -17,32 +17,34 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import io.micrometer.core.annotation.Timed; + import javax.ws.rs.Path; -import io.micrometer.core.annotation.Timed; import org.onap.aai.restcore.HttpMethod; @Path("{version: v[1-9][0-9]*|latest}/bulkadd") @Timed public class BulkAddConsumer extends BulkConsumer { - @Override - protected boolean functionAllowed(HttpMethod method) { - - return method.equals(HttpMethod.PUT); - - } - - @Override - protected String getModule(){ - return "bulk add"; - } - - @Override - protected boolean enableResourceVersion() { - return true; - } + @Override + protected boolean functionAllowed(HttpMethod method) { + + return method.equals(HttpMethod.PUT); + + } + + @Override + protected String getModule() { + return "bulk add"; + } + + @Override + protected boolean enableResourceVersion() { + return true; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/BulkConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/BulkConsumer.java index a2f83b0..9d90a46 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/BulkConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/BulkConsumer.java @@ -17,9 +17,25 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import com.google.gson.*; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.util.*; +import java.util.Map.Entry; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.Consumes; +import javax.ws.rs.PUT; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.*; +import javax.ws.rs.core.Response.Status; + import org.javatuples.Pair; import org.onap.aai.config.SpringContextAware; import org.onap.aai.exceptions.AAIException; @@ -44,19 +60,6 @@ import org.onap.aai.util.AAIConstants; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.Consumes; -import javax.ws.rs.PUT; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.*; -import javax.ws.rs.core.Response.Status; -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.util.*; -import java.util.Map.Entry; -import java.util.stream.Collectors; - /** * The Class BulkAddConsumer. */ @@ -65,504 +68,527 @@ import java.util.stream.Collectors; * multiple objects with one request. It may take * one or more transaction objects containing one or more * objects to add. - * The transactions are independent of each other - + * The transactions are independent of each other - * if one fails, its effects are rolled back, but the others' aren't. * Within a single transaction, if adding one object fails, all the others' * changes are rolled back. */ public abstract class BulkConsumer extends RESTAPI { - private static final String BULK_PATCH_METHOD = "patch"; - private static final String BULK_DELETE_METHOD = "delete"; - private static final String BULK_PUT_METHOD = "put"; - private static final String TARGET_ENTITY = "aai-resources"; - - /** The introspector factory type. */ - private ModelType introspectorFactoryType = ModelType.MOXY; - - /** The query style. */ - private QueryStyle queryStyle = QueryStyle.TRAVERSAL_URI; - - /** - * Bulk add. - * - * @param content the content - * @param versionParam the version param - * @param uri the uri - * @param headers the headers - * @param info the info - * @param req the req - * @return the response - */ - @PUT - @Consumes({ MediaType.APPLICATION_JSON}) - @Produces({ MediaType.APPLICATION_JSON}) - public Response bulkProcessor(String content, @PathParam("version")String versionParam, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req){ - - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String outputMediaType = getMediaType(headers.getAcceptableMediaTypes()); - SchemaVersion version = new SchemaVersion(versionParam); - Response response = null; - - try { - - /* A Response will be generated for each object in each transaction. + private static final String BULK_PATCH_METHOD = "patch"; + private static final String BULK_DELETE_METHOD = "delete"; + private static final String BULK_PUT_METHOD = "put"; + private static final String TARGET_ENTITY = "aai-resources"; + + /** The introspector factory type. */ + private ModelType introspectorFactoryType = ModelType.MOXY; + + /** The query style. */ + private QueryStyle queryStyle = QueryStyle.TRAVERSAL_URI; + + /** + * Bulk add. + * + * @param content the content + * @param versionParam the version param + * @param uri the uri + * @param headers the headers + * @param info the info + * @param req the req + * @return the response + */ + @PUT + @Consumes({MediaType.APPLICATION_JSON}) + @Produces({MediaType.APPLICATION_JSON}) + public Response bulkProcessor(String content, @PathParam("version") String versionParam, + @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { + + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String outputMediaType = getMediaType(headers.getAcceptableMediaTypes()); + SchemaVersion version = new SchemaVersion(versionParam); + Response response = null; + + try { + + /* + * A Response will be generated for each object in each transaction. * To keep track of what came from where to give organized feedback to the client, * we keep responses from a given transaction together in one list (hence all being a list of lists) * and BulkOperationResponse each response with its matching URI (which will be null if there wasn't one). */ List> allResponses = new ArrayList<>(); - JsonArray transactions = getTransactions(content, headers); - - for (int i = 0; i < transactions.size(); i++){ - HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - resourceHttpEntry.setHttpEntryProperties(version); - Loader loader = resourceHttpEntry.getLoader(); - TransactionalGraphEngine dbEngine = resourceHttpEntry.getDbEngine(); - URI thisUri = null; - List bulkOperations = new ArrayList<>(); - HttpMethod method = null; - JsonElement transObj = new JsonObject(); - try { - transObj = transactions.get(i); - if (!transObj.isJsonObject()) { - throw new AAIException("AAI_6111", "input payload does not follow bulk interface"); - } - - fillBulkOperationsObjectFromTransaction(bulkOperations, transObj.getAsJsonObject(), loader, dbEngine, outputMediaType); - if (bulkOperations.isEmpty()) { - //case where user sends a validly formatted transactions object but - //which has no actual things in it for A&AI to do anything with - //assuming we should count this as a user error - throw new AAIException("AAI_6118", "payload had no objects to operate on"); - } - - List requests = new ArrayList<>(); - for (BulkOperation bulkOperation : bulkOperations){ - thisUri = bulkOperation.getUri(); - method = bulkOperation.getHttpMethod(); - QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(thisUri); - DBRequest request = new DBRequest.Builder(method, thisUri, uriQuery, bulkOperation.getIntrospector(), headers, bulkOperation.getUriInfo(), transId).rawRequestContent(bulkOperation.getRawReq()).build(); - requests.add(request); - } - - Pair>> results = resourceHttpEntry.process(requests, sourceOfTruth, this.enableResourceVersion()); - List responses = BulkOperationResponse.processPairList(method, results.getValue1()); - allResponses.add(responses); - if (results.getValue0()) { //everything was processed without error - dbEngine.commit(); - } else { //something failed - dbEngine.rollback(); - } - } catch (Exception e) { - /* While httpEntry.process handles its exceptions, exceptions thrown in earlier helpers - * bubbles up to here. As we want to tie error messages to the URI of the object that caused - * them, we catch here, generate a Response, bundle it with that URI, and move on. - */ - if (!bulkOperations.isEmpty()) { //failed somewhere in the middle of bulkOperation-filling - BulkOperation lastBulkOperation = bulkOperations.get(bulkOperations.size()-1); //last one in there was the problem - if (lastBulkOperation.getIntrospector() == null){ - //failed out before thisUri could be set but after bulkOperations started being filled - thisUri = lastBulkOperation.getUri(); - method = lastBulkOperation.getHttpMethod(); - } - } //else failed out on empty payload so bulkOperations never filled (or failed out even earlier than bulkOperations-filling) - - if (method == null) { - List methods = transObj.getAsJsonObject().entrySet().stream().map(Entry::getKey).collect(Collectors.toCollection(ArrayList::new)); - - if (methods.contains(BULK_PUT_METHOD)) { - method = HttpMethod.PUT; - } else if (methods.contains(BULK_DELETE_METHOD)) { - method = HttpMethod.DELETE; - } else if (methods.contains(BULK_PATCH_METHOD)) { - method = HttpMethod.MERGE_PATCH; - } else { - method = HttpMethod.PUT; - } - } - - addExceptionCaseFailureResponse(allResponses, e, i, thisUri, headers, info, method); - dbEngine.rollback(); - continue; /* if an exception gets thrown within a transaction we want to keep going to - the next transaction, not break out of the whole request */ - } - } - - String returnPayload = generateResponsePayload(allResponses); - - //unless a top level error gets thrown, we want to 201 bc the client wanted a "fire and forget" kind of setup - response = Response - .status(Status.CREATED) - .entity(returnPayload) - .build(); - } catch (AAIException e) { //these catches needed for handling top level errors in payload parsing where the whole request must fail out - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, e); - } catch(JsonSyntaxException e) { - AAIException ex = new AAIException("AAI_6111"); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, ex); - } catch (Exception e ) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, ex); - } - - return response; - } - - - /** - * Gets the transactions. - * - * @param content - input JSON payload string - * @return JsonArray - the array of transactions - * @throws AAIException the AAI exception - * @throws JsonSyntaxException Parses and breaks the single payload into an array of individual transaction - * bodies to be processed. - */ - private JsonArray getTransactions(String content, HttpHeaders headers) throws AAIException, JsonSyntaxException { - JsonParser parser = new JsonParser(); - - JsonObject input = parser.parse(content).getAsJsonObject(); - String module = getModule(); - - if (!(input.has("transactions"))) { - throw new AAIException("AAI_6118", String.format("input payload does not follow %s interface - missing \"transactions\"", module)); - } - JsonElement transactionsObj = input.get("transactions"); - - if (!(transactionsObj.isJsonArray())){ - throw new AAIException("AAI_6111", String.format("input payload does not follow %s interface", module)); - } - JsonArray transactions = transactionsObj.getAsJsonArray(); - validateRequest(transactions, headers); - return transactions; - } - - /** - * Fill object bulkOperations from transaction. - * - * @param bulkOperations the bulkOperations - * @param transaction - JSON body containing the objects to be added - * each object must have a URI and an object body - * @param loader the loader - * @param dbEngine the db engine - * @param inputMediaType the input media type - * @return list of bulkOperations containing each introspector-wrapped object and its given URI - * @throws AAIException the AAI exception - * @throws JsonSyntaxException the json syntax exception - * @throws UnsupportedEncodingException Walks through the given transaction and unmarshals each object in it, then bundles each - * with its URI. - */ - private void fillBulkOperationsObjectFromTransaction(List bulkOperations, - JsonObject transaction, Loader loader, TransactionalGraphEngine dbEngine, String inputMediaType) - throws AAIException, JsonSyntaxException, UnsupportedEncodingException { - - - if (transaction.has(BULK_PUT_METHOD) && this.functionAllowed(HttpMethod.PUT)) { - populateBulkOperations(bulkOperations, transaction, loader, dbEngine, inputMediaType, HttpMethod.PUT); - } else if (transaction.has(BULK_DELETE_METHOD) && this.functionAllowed(HttpMethod.DELETE)) { - populateBulkOperations(bulkOperations, transaction, loader, dbEngine, inputMediaType, HttpMethod.DELETE); - } else if (transaction.has(BULK_PATCH_METHOD) && this.functionAllowed(HttpMethod.MERGE_PATCH)) { - populateBulkOperations(bulkOperations, transaction, loader, dbEngine, inputMediaType, HttpMethod.MERGE_PATCH); - } else { - String msg = "input payload does not follow bulk %s interface - missing %s"; - String type = "process"; - String operations = "put delete or patch"; - - if (this instanceof BulkAddConsumer) { - type = "add"; - operations = BULK_PUT_METHOD; - } - throw new AAIException("AAI_6118", String.format(msg, type, operations)); - } - - - - } - - - - private void populateBulkOperations(List bulkOperations, JsonObject item, Loader loader, TransactionalGraphEngine dbEngine, String inputMediaType, HttpMethod method) throws AAIException, JsonSyntaxException, UnsupportedEncodingException{ - String module = getModule(); - for (int i=0; i> allResponses){ - JsonObject ret = new JsonObject(); - JsonArray retArr = new JsonArray(); - - for(List responses : allResponses){ - JsonObject tResp = new JsonObject(); - JsonArray tArrResp = new JsonArray(); - HttpMethod method = HttpMethod.PUT; - - for (BulkOperationResponse r : responses) { - - JsonObject indPayload = new JsonObject(); - method = r.getHttpMethod(); - - URI origURI = r.getUri(); - if (origURI != null) { - indPayload.addProperty("uri", origURI.getPath()); - } else { - indPayload.addProperty("uri", (String)null); - } - - JsonObject body = new JsonObject(); - - int rStatus = r.getResponse().getStatus(); - String rContents = null; - - rContents = (String)r.getResponse().getEntity(); - - body.addProperty(Integer.toString(rStatus), rContents); - indPayload.add("body", body); - - tArrResp.add(indPayload); - } - - tResp.add(this.mapHttpMethodToBulkMethod(method), tArrResp); - retArr.add(tResp); - } - ret.add("transaction", retArr); - Gson gson = new GsonBuilder().serializeNulls().create(); - return gson.toJson(ret); - } - - private String mapHttpMethodToBulkMethod(HttpMethod method) { - if (HttpMethod.PUT.equals(method) || HttpMethod.PUT_EDGE.equals(method)) { - return BULK_PUT_METHOD; - } else if (HttpMethod.DELETE.equals(method) || HttpMethod.DELETE_EDGE.equals(method)) { - return BULK_DELETE_METHOD; - } else if (HttpMethod.MERGE_PATCH.equals(method)) { - return BULK_PATCH_METHOD; - } else { - return ""; - } - } - - - /** - * Adds the exception case failure response. - * - * @param allResponses the all responses - * @param e the e - * @param index - index of which transaction was being processed when the exception was thrown - * @param thisUri the this uri - * @param headers the headers - * @param info the info - * @param templateAction the template action - * @throws ErrorObjectNotFoundException - */ - private void addExceptionCaseFailureResponse(List> allResponses, Exception e, int index, URI thisUri, HttpHeaders headers, UriInfo info, HttpMethod templateAction) { - AAIException ex = null; - - if (!(e instanceof AAIException)){ - ex = new AAIException("AAI_4000", e); - } else { - ex = (AAIException)e; - } - - if (allResponses.size() != (index+1)) { - //index+1 bc if all transactions thus far have had a response list added - //the size will be one more than the current index (since those are offset by 1) - - //this transaction doesn't have a response list yet, so create one - Response failResp = consumerExceptionResponseGenerator(headers, info, templateAction, ex); - BulkOperationResponse uriResp = new BulkOperationResponse(templateAction, thisUri, failResp); - List transRespList = new ArrayList<>(); - transRespList.add(uriResp); - allResponses.add(transRespList); - } else { - //this transaction already has a response list, so add this failure response to it - Response failResp = consumerExceptionResponseGenerator(headers, info, templateAction, ex); - BulkOperationResponse uriResp = new BulkOperationResponse(templateAction, thisUri, failResp); - List tResps = allResponses.get(index); - tResps.add(uriResp); - } - } - - /** - * Pulls the config value for the limit of operations allowed in a bulk add/process request - * - * @throws AAIException - */ - private int getPayLoadLimit() throws AAIException{ - return Integer.parseInt(AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_LIMIT)); - } - - /** - * Validates the amount of operations in a request payload is allowed - * - * @param transactions - a JsonArray of all the transactions in the request payload - * @throws AAIException - */ - private void validateRequest(JsonArray transactions, HttpHeaders headers) throws AAIException{ - String overrideLimit = headers.getRequestHeaders().getFirst("X-OverrideLimit"); - boolean isOverride = overrideLimit != null && !AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_OVERRIDE_LIMIT).equals("false") - && overrideLimit.equals(AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_OVERRIDE_LIMIT)); - if (transactions.size() == 0) { - //case where user sends a validly formatted transactions object but - //which has no actual things in it for A&AI to do anything with - //assuming we should count this as a user error - throw new AAIException("AAI_6118", "payload had no objects to operate on"); - }else if(!isOverride && transactions.size() > getPayLoadLimit()) { - throw new AAIException("AAI_6147", String.format("Payload limit of %s reached, please reduce payload.", getPayLoadLimit())); - } - if(!isOverride) { - int operationCount = 0; - int payLoadLimit = getPayLoadLimit(); - for (int i = 0; i < transactions.size(); i++) { - Set> entrySet = transactions.get(i).getAsJsonObject().entrySet(); - Iterator> it = entrySet.iterator(); - while (it.hasNext()) { - Map.Entry element = it.next(); - if (element.getValue() instanceof JsonArray) { - operationCount += ((JsonArray) element.getValue()).size(); - } else { - operationCount++; - } - } - if (operationCount > payLoadLimit) { - throw new AAIException("AAI_6147", String.format("Payload limit of %s reached, please reduce payload.", payLoadLimit)); - } - } - } - } - - protected abstract String getModule(); - - protected abstract boolean functionAllowed(HttpMethod method); - - protected abstract boolean enableResourceVersion(); + JsonArray transactions = getTransactions(content, headers); + + for (int i = 0; i < transactions.size(); i++) { + HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + resourceHttpEntry.setHttpEntryProperties(version); + Loader loader = resourceHttpEntry.getLoader(); + TransactionalGraphEngine dbEngine = resourceHttpEntry.getDbEngine(); + URI thisUri = null; + List bulkOperations = new ArrayList<>(); + HttpMethod method = null; + JsonElement transObj = new JsonObject(); + try { + transObj = transactions.get(i); + if (!transObj.isJsonObject()) { + throw new AAIException("AAI_6111", "input payload does not follow bulk interface"); + } + + fillBulkOperationsObjectFromTransaction(bulkOperations, transObj.getAsJsonObject(), loader, + dbEngine, outputMediaType); + if (bulkOperations.isEmpty()) { + // case where user sends a validly formatted transactions object but + // which has no actual things in it for A&AI to do anything with + // assuming we should count this as a user error + throw new AAIException("AAI_6118", "payload had no objects to operate on"); + } + + List requests = new ArrayList<>(); + for (BulkOperation bulkOperation : bulkOperations) { + thisUri = bulkOperation.getUri(); + method = bulkOperation.getHttpMethod(); + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(thisUri); + DBRequest request = new DBRequest.Builder(method, thisUri, uriQuery, + bulkOperation.getIntrospector(), headers, bulkOperation.getUriInfo(), transId) + .rawRequestContent(bulkOperation.getRawReq()).build(); + requests.add(request); + } + + Pair>> results = + resourceHttpEntry.process(requests, sourceOfTruth, this.enableResourceVersion()); + List responses = + BulkOperationResponse.processPairList(method, results.getValue1()); + allResponses.add(responses); + if (results.getValue0()) { // everything was processed without error + dbEngine.commit(); + } else { // something failed + dbEngine.rollback(); + } + } catch (Exception e) { + /* + * While httpEntry.process handles its exceptions, exceptions thrown in earlier helpers + * bubbles up to here. As we want to tie error messages to the URI of the object that caused + * them, we catch here, generate a Response, bundle it with that URI, and move on. + */ + if (!bulkOperations.isEmpty()) { // failed somewhere in the middle of bulkOperation-filling + BulkOperation lastBulkOperation = bulkOperations.get(bulkOperations.size() - 1); // last one in + // there was + // the problem + if (lastBulkOperation.getIntrospector() == null) { + // failed out before thisUri could be set but after bulkOperations started being filled + thisUri = lastBulkOperation.getUri(); + method = lastBulkOperation.getHttpMethod(); + } + } // else failed out on empty payload so bulkOperations never filled (or failed out even earlier + // than bulkOperations-filling) + + if (method == null) { + List methods = transObj.getAsJsonObject().entrySet().stream().map(Entry::getKey) + .collect(Collectors.toCollection(ArrayList::new)); + + if (methods.contains(BULK_PUT_METHOD)) { + method = HttpMethod.PUT; + } else if (methods.contains(BULK_DELETE_METHOD)) { + method = HttpMethod.DELETE; + } else if (methods.contains(BULK_PATCH_METHOD)) { + method = HttpMethod.MERGE_PATCH; + } else { + method = HttpMethod.PUT; + } + } + + addExceptionCaseFailureResponse(allResponses, e, i, thisUri, headers, info, method); + dbEngine.rollback(); + continue; /* + * if an exception gets thrown within a transaction we want to keep going to + * the next transaction, not break out of the whole request + */ + } + } + + String returnPayload = generateResponsePayload(allResponses); + + // unless a top level error gets thrown, we want to 201 bc the client wanted a "fire and forget" kind of + // setup + response = Response.status(Status.CREATED).entity(returnPayload).build(); + } catch (AAIException e) { // these catches needed for handling top level errors in payload parsing where the + // whole request must fail out + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, e); + } catch (JsonSyntaxException e) { + AAIException ex = new AAIException("AAI_6111"); + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, ex); + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, ex); + } + + return response; + } + + /** + * Gets the transactions. + * + * @param content - input JSON payload string + * @return JsonArray - the array of transactions + * @throws AAIException the AAI exception + * @throws JsonSyntaxException Parses and breaks the single payload into an array of individual transaction + * bodies to be processed. + */ + private JsonArray getTransactions(String content, HttpHeaders headers) throws AAIException, JsonSyntaxException { + JsonParser parser = new JsonParser(); + + JsonObject input = parser.parse(content).getAsJsonObject(); + String module = getModule(); + + if (!(input.has("transactions"))) { + throw new AAIException("AAI_6118", + String.format("input payload does not follow %s interface - missing \"transactions\"", module)); + } + JsonElement transactionsObj = input.get("transactions"); + + if (!(transactionsObj.isJsonArray())) { + throw new AAIException("AAI_6111", String.format("input payload does not follow %s interface", module)); + } + JsonArray transactions = transactionsObj.getAsJsonArray(); + validateRequest(transactions, headers); + return transactions; + } + + /** + * Fill object bulkOperations from transaction. + * + * @param bulkOperations the bulkOperations + * @param transaction - JSON body containing the objects to be added + * each object must have a URI and an object body + * @param loader the loader + * @param dbEngine the db engine + * @param inputMediaType the input media type + * @return list of bulkOperations containing each introspector-wrapped object and its given URI + * @throws AAIException the AAI exception + * @throws JsonSyntaxException the json syntax exception + * @throws UnsupportedEncodingException Walks through the given transaction and unmarshals each object in it, then + * bundles each + * with its URI. + */ + private void fillBulkOperationsObjectFromTransaction(List bulkOperations, JsonObject transaction, + Loader loader, TransactionalGraphEngine dbEngine, String inputMediaType) + throws AAIException, JsonSyntaxException, UnsupportedEncodingException { + + if (transaction.has(BULK_PUT_METHOD) && this.functionAllowed(HttpMethod.PUT)) { + populateBulkOperations(bulkOperations, transaction, loader, dbEngine, inputMediaType, HttpMethod.PUT); + } else if (transaction.has(BULK_DELETE_METHOD) && this.functionAllowed(HttpMethod.DELETE)) { + populateBulkOperations(bulkOperations, transaction, loader, dbEngine, inputMediaType, HttpMethod.DELETE); + } else if (transaction.has(BULK_PATCH_METHOD) && this.functionAllowed(HttpMethod.MERGE_PATCH)) { + populateBulkOperations(bulkOperations, transaction, loader, dbEngine, inputMediaType, + HttpMethod.MERGE_PATCH); + } else { + String msg = "input payload does not follow bulk %s interface - missing %s"; + String type = "process"; + String operations = "put delete or patch"; + + if (this instanceof BulkAddConsumer) { + type = "add"; + operations = BULK_PUT_METHOD; + } + throw new AAIException("AAI_6118", String.format(msg, type, operations)); + } + + } + + private void populateBulkOperations(List bulkOperations, JsonObject item, Loader loader, + TransactionalGraphEngine dbEngine, String inputMediaType, HttpMethod method) + throws AAIException, JsonSyntaxException, UnsupportedEncodingException { + String module = getModule(); + for (int i = 0; i < item.size(); i++) { + BulkOperation bulkOperation = new BulkOperation(); + try { + + if (!(item.isJsonObject())) { + throw new AAIException("AAI_6111", + String.format("input payload does not follow %s interface", module)); + } + + JsonElement actionElement = null; + + if (item.has(BULK_PUT_METHOD)) { + actionElement = item.get(BULK_PUT_METHOD); + } else if (item.has(BULK_PATCH_METHOD)) { + actionElement = item.get(BULK_PATCH_METHOD); + } else if (item.has(BULK_DELETE_METHOD)) { + actionElement = item.get(BULK_DELETE_METHOD); + } + + if ((actionElement == null) || !actionElement.isJsonArray()) { + throw new AAIException("AAI_6111", + String.format("input payload does not follow %s interface", module)); + } + + JsonArray httpArray = actionElement.getAsJsonArray(); + for (int j = 0; j < httpArray.size(); ++j) { + + bulkOperation = new BulkOperation(); + bulkOperation.setHttpMethod(method); + + JsonObject it = httpArray.get(j).getAsJsonObject(); + JsonElement itemURIfield = it.get("uri"); + if (itemURIfield == null) { + throw new AAIException("AAI_6118", "must include object uri"); + } + + UriComponents uriComponents = + UriComponentsBuilder.fromUriString(itemURIfield.getAsString()).build(); + if (uriComponents.getPath() != null + && uriComponents.getPath().endsWith("/relationship-list/relationship")) { + if (method.equals(HttpMethod.PUT)) { + bulkOperation.setHttpMethod(HttpMethod.PUT_EDGE); + } else if (method.equals(HttpMethod.DELETE)) { + bulkOperation.setHttpMethod(HttpMethod.DELETE_EDGE); + } + } else { + bulkOperation.setHttpMethod(method); + } + + URI uri = UriBuilder.fromPath(uriComponents.getPath()).build(); + + /* + * adding the uri as soon as we have one (valid or not) lets us + * keep any errors with their corresponding uris for client feedback + */ + bulkOperation.setUri(uri); + + bulkOperation.addUriInfoQueryParams(uriComponents.getQueryParams()); + + if (!ValidateEncoding.getInstance().validate(uri)) { + throw new AAIException("AAI_3008", "uri=" + uri.getPath()); + } + + JsonElement bodyObj = new JsonObject(); + if (!bulkOperation.getHttpMethod().equals(HttpMethod.DELETE)) { + if (!(it.has("body"))) { + throw new AAIException("AAI_6118", String + .format("input payload does not follow %s interface - missing \"body\"", module)); + } + bodyObj = it.get("body"); + if (!(bodyObj.isJsonObject())) { + throw new AAIException("AAI_6111", + String.format("input payload does not follow %s interface", module)); + } + } + Gson gson = new GsonBuilder().serializeNulls().create(); + + String bodyStr = gson.toJson(bodyObj); + bulkOperation.setRawReq(bodyStr); + + if (bulkOperation.getHttpMethod().equals(HttpMethod.PUT_EDGE) + || bulkOperation.getHttpMethod().equals(HttpMethod.DELETE_EDGE)) { + Introspector obj; + try { + obj = loader.unmarshal("relationship", bodyStr, + org.onap.aai.restcore.MediaType.getEnum(inputMediaType)); + } catch (AAIUnmarshallingException e) { + throw new AAIException("AAI_3000", "object could not be unmarshalled:" + bodyStr); + + } + + bulkOperation.setIntrospector(obj); + + } else { + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uri); + String objName = uriQuery.getResultType(); + + Introspector obj; + + if (bulkOperation.getHttpMethod().equals(HttpMethod.DELETE)) { + obj = loader.introspectorFromName(objName); + } else { + try { + obj = loader.unmarshal(objName, bodyStr, + org.onap.aai.restcore.MediaType.getEnum(inputMediaType)); + } catch (AAIUnmarshallingException e) { + throw new AAIException("AAI_3000", "object could not be unmarshalled:" + bodyStr); + + } + this.validateIntrospector(obj, loader, uri, bulkOperation.getHttpMethod()); + + } + + bulkOperation.setIntrospector(obj); + } + bulkOperations.add(bulkOperation); + } + + } catch (AAIException e) { + // even if bulkOperation doesn't have a uri or body, this way we keep all information associated with + // this error together + // even if both are null, that indicates how the input was messed up, so still useful to carry around + // like this + bulkOperations.add(bulkOperation); + throw e; // rethrow so the right response is generated on the level above + } + } + } + + /** + * Generate response payload. + * + * @param allResponses - the list of the lists of responses from every action in every transaction requested + * @return A json string of similar format to the bulk add interface which for each response includes + * the original URI and a body with the status code of the response and the error message. + * + * Creates the payload for a single unified response from all responses generated + */ + private String generateResponsePayload(List> allResponses) { + JsonObject ret = new JsonObject(); + JsonArray retArr = new JsonArray(); + + for (List responses : allResponses) { + JsonObject tResp = new JsonObject(); + JsonArray tArrResp = new JsonArray(); + HttpMethod method = HttpMethod.PUT; + + for (BulkOperationResponse r : responses) { + + JsonObject indPayload = new JsonObject(); + method = r.getHttpMethod(); + + URI origURI = r.getUri(); + if (origURI != null) { + indPayload.addProperty("uri", origURI.getPath()); + } else { + indPayload.addProperty("uri", (String) null); + } + + JsonObject body = new JsonObject(); + + int rStatus = r.getResponse().getStatus(); + String rContents = null; + + rContents = (String) r.getResponse().getEntity(); + + body.addProperty(Integer.toString(rStatus), rContents); + indPayload.add("body", body); + + tArrResp.add(indPayload); + } + + tResp.add(this.mapHttpMethodToBulkMethod(method), tArrResp); + retArr.add(tResp); + } + ret.add("transaction", retArr); + Gson gson = new GsonBuilder().serializeNulls().create(); + return gson.toJson(ret); + } + + private String mapHttpMethodToBulkMethod(HttpMethod method) { + if (HttpMethod.PUT.equals(method) || HttpMethod.PUT_EDGE.equals(method)) { + return BULK_PUT_METHOD; + } else if (HttpMethod.DELETE.equals(method) || HttpMethod.DELETE_EDGE.equals(method)) { + return BULK_DELETE_METHOD; + } else if (HttpMethod.MERGE_PATCH.equals(method)) { + return BULK_PATCH_METHOD; + } else { + return ""; + } + } + + /** + * Adds the exception case failure response. + * + * @param allResponses the all responses + * @param e the e + * @param index - index of which transaction was being processed when the exception was thrown + * @param thisUri the this uri + * @param headers the headers + * @param info the info + * @param templateAction the template action + * @throws ErrorObjectNotFoundException + */ + private void addExceptionCaseFailureResponse(List> allResponses, Exception e, int index, + URI thisUri, HttpHeaders headers, UriInfo info, HttpMethod templateAction) { + AAIException ex = null; + + if (!(e instanceof AAIException)) { + ex = new AAIException("AAI_4000", e); + } else { + ex = (AAIException) e; + } + + if (allResponses.size() != (index + 1)) { + // index+1 bc if all transactions thus far have had a response list added + // the size will be one more than the current index (since those are offset by 1) + + // this transaction doesn't have a response list yet, so create one + Response failResp = consumerExceptionResponseGenerator(headers, info, templateAction, ex); + BulkOperationResponse uriResp = new BulkOperationResponse(templateAction, thisUri, failResp); + List transRespList = new ArrayList<>(); + transRespList.add(uriResp); + allResponses.add(transRespList); + } else { + // this transaction already has a response list, so add this failure response to it + Response failResp = consumerExceptionResponseGenerator(headers, info, templateAction, ex); + BulkOperationResponse uriResp = new BulkOperationResponse(templateAction, thisUri, failResp); + List tResps = allResponses.get(index); + tResps.add(uriResp); + } + } + + /** + * Pulls the config value for the limit of operations allowed in a bulk add/process request + * + * @throws AAIException + */ + private int getPayLoadLimit() throws AAIException { + return Integer.parseInt(AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_LIMIT)); + } + + /** + * Validates the amount of operations in a request payload is allowed + * + * @param transactions - a JsonArray of all the transactions in the request payload + * @throws AAIException + */ + private void validateRequest(JsonArray transactions, HttpHeaders headers) throws AAIException { + String overrideLimit = headers.getRequestHeaders().getFirst("X-OverrideLimit"); + boolean isOverride = + overrideLimit != null && !AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_OVERRIDE_LIMIT).equals("false") + && overrideLimit.equals(AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_OVERRIDE_LIMIT)); + if (transactions.size() == 0) { + // case where user sends a validly formatted transactions object but + // which has no actual things in it for A&AI to do anything with + // assuming we should count this as a user error + throw new AAIException("AAI_6118", "payload had no objects to operate on"); + } else if (!isOverride && transactions.size() > getPayLoadLimit()) { + throw new AAIException("AAI_6147", + String.format("Payload limit of %s reached, please reduce payload.", getPayLoadLimit())); + } + if (!isOverride) { + int operationCount = 0; + int payLoadLimit = getPayLoadLimit(); + for (int i = 0; i < transactions.size(); i++) { + Set> entrySet = transactions.get(i).getAsJsonObject().entrySet(); + Iterator> it = entrySet.iterator(); + while (it.hasNext()) { + Map.Entry element = it.next(); + if (element.getValue() instanceof JsonArray) { + operationCount += ((JsonArray) element.getValue()).size(); + } else { + operationCount++; + } + } + if (operationCount > payLoadLimit) { + throw new AAIException("AAI_6147", + String.format("Payload limit of %s reached, please reduce payload.", payLoadLimit)); + } + } + } + } + + protected abstract String getModule(); + + protected abstract boolean functionAllowed(HttpMethod method); + + protected abstract boolean enableResourceVersion(); } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/BulkProcessConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/BulkProcessConsumer.java index 1a03656..b281681 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/BulkProcessConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/BulkProcessConsumer.java @@ -17,32 +17,35 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import io.micrometer.core.annotation.Timed; + import javax.ws.rs.Path; -import io.micrometer.core.annotation.Timed; import org.onap.aai.restcore.HttpMethod; @Path("{version: v[1-9][0-9]*|latest}/bulkprocess") @Timed public class BulkProcessConsumer extends BulkConsumer { - @Override - protected boolean functionAllowed(HttpMethod method) { - - return method.equals(HttpMethod.PUT) || method.equals(HttpMethod.DELETE) || method.equals(HttpMethod.MERGE_PATCH); - } - - @Override - protected String getModule(){ - return "bulk process"; - } - - @Override - protected boolean enableResourceVersion() { - // TODO Auto-generated method stub - return true; - } + @Override + protected boolean functionAllowed(HttpMethod method) { + + return method.equals(HttpMethod.PUT) || method.equals(HttpMethod.DELETE) + || method.equals(HttpMethod.MERGE_PATCH); + } + + @Override + protected String getModule() { + return "bulk process"; + } + + @Override + protected boolean enableResourceVersion() { + // TODO Auto-generated method stub + return true; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/ExampleConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/ExampleConsumer.java index 8541844..b0d61af 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/ExampleConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/ExampleConsumer.java @@ -17,8 +17,11 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import io.micrometer.core.annotation.Timed; + import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -31,7 +34,6 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.UriInfo; -import io.micrometer.core.annotation.Timed; import org.onap.aai.config.SpringContextAware; import org.onap.aai.exceptions.AAIException; import org.onap.aai.introspection.Introspector; @@ -39,10 +41,10 @@ import org.onap.aai.introspection.Loader; import org.onap.aai.introspection.LoaderFactory; import org.onap.aai.introspection.MarshallerProperties; import org.onap.aai.introspection.ModelType; -import org.onap.aai.setup.SchemaVersion; import org.onap.aai.introspection.generator.CreateExample; import org.onap.aai.restcore.HttpMethod; import org.onap.aai.restcore.RESTAPI; +import org.onap.aai.setup.SchemaVersion; /** * The Class ExampleConsumer. @@ -51,56 +53,52 @@ import org.onap.aai.restcore.RESTAPI; @Timed public class ExampleConsumer extends RESTAPI { - - /** - * Gets the example. - * - * @param versionParam the version param - * @param type the type - * @param headers the headers - * @param info the info - * @param req the req - * @return the example - */ - @GET - @Path("/{objectType: [^\\/]+}") - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response getExample(@PathParam("version")String versionParam, @PathParam("objectType")String type, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { - - Status status = Status.INTERNAL_SERVER_ERROR; - Response response = null; + /** + * Gets the example. + * + * @param versionParam the version param + * @param type the type + * @param headers the headers + * @param info the info + * @param req the req + * @return the example + */ + @GET + @Path("/{objectType: [^\\/]+}") + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response getExample(@PathParam("version") String versionParam, @PathParam("objectType") String type, + @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { + + Status status = Status.INTERNAL_SERVER_ERROR; + Response response = null; + + try { + String mediaType = getMediaType(headers.getAcceptableMediaTypes()); + org.onap.aai.restcore.MediaType outputMediaType = org.onap.aai.restcore.MediaType.getEnum(mediaType); + + SchemaVersion version = new SchemaVersion(versionParam); + Loader loader = + SpringContextAware.getBean(LoaderFactory.class).createLoaderForVersion(ModelType.MOXY, version); + + CreateExample example = new CreateExample(loader, type); + + Introspector obj = example.getExampleObject(); + String result = ""; + if (obj != null) { + status = Status.OK; + MarshallerProperties properties = new MarshallerProperties.Builder(outputMediaType).build(); + result = obj.marshal(properties); + } else { - try { - String mediaType = getMediaType(headers.getAcceptableMediaTypes()); - org.onap.aai.restcore.MediaType outputMediaType = org.onap.aai.restcore.MediaType.getEnum(mediaType); - - SchemaVersion version = new SchemaVersion(versionParam); - Loader loader = SpringContextAware.getBean( LoaderFactory.class).createLoaderForVersion(ModelType.MOXY, version); - - CreateExample example = new CreateExample(loader, type); - - Introspector obj = example.getExampleObject(); - String result = ""; - if (obj != null) { - status = Status.OK; - MarshallerProperties properties = - new MarshallerProperties.Builder(outputMediaType).build(); - result = obj.marshal(properties); - } else { - - } - response = Response - .ok(obj) - .entity(result) - .status(status) - .type(outputMediaType.toString()).build(); - } catch (AAIException e) { - //TODO check that the details here are sensible - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, e); - } catch (Exception e) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, ex); - } - return response; - } + } + response = Response.ok(obj).entity(result).status(status).type(outputMediaType.toString()).build(); + } catch (AAIException e) { + // TODO check that the details here are sensible + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, e); + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, ex); + } + return response; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/ExceptionHandler.java b/aai-resources/src/main/java/org/onap/aai/rest/ExceptionHandler.java index 4b3515b..ed57a7a 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/ExceptionHandler.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/ExceptionHandler.java @@ -17,8 +17,13 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.sun.istack.SAXParseException2; + import java.util.ArrayList; import java.util.List; @@ -33,9 +38,6 @@ import javax.ws.rs.ext.Provider; import org.onap.aai.exceptions.AAIException; import org.onap.aai.logging.ErrorLogHelper; -import com.fasterxml.jackson.core.JsonParseException; -import com.fasterxml.jackson.databind.JsonMappingException; -import com.sun.istack.SAXParseException2; /** * The Class ExceptionHandler. @@ -45,84 +47,80 @@ public class ExceptionHandler implements ExceptionMapper { @Context private HttpServletRequest request; - + @Context private HttpHeaders headers; - + /** - * @{inheritDoc} - */ + * @{inheritDoc} + */ @Override public Response toResponse(Exception exception) { - Response response = null; - ArrayList templateVars = new ArrayList(); + Response response = null; + ArrayList templateVars = new ArrayList(); - //the general case is that cxf will give us a WebApplicationException - //with a linked exception - if (exception instanceof WebApplicationException) { - WebApplicationException e = (WebApplicationException) exception; - if (e.getCause() != null) { - if (e.getCause() instanceof SAXParseException2) { - templateVars.add("UnmarshalException"); - AAIException ex = new AAIException("AAI_4007", exception); - response = Response - .status(400) - .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) - .build(); - } - } - } else if (exception instanceof JsonParseException) { - //jackson does it differently so we get the direct JsonParseException - templateVars.add("JsonParseException"); - AAIException ex = new AAIException("AAI_4007", exception); - response = Response - .status(400) - .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) - .build(); + // the general case is that cxf will give us a WebApplicationException + // with a linked exception + if (exception instanceof WebApplicationException) { + WebApplicationException e = (WebApplicationException) exception; + if (e.getCause() != null) { + if (e.getCause() instanceof SAXParseException2) { + templateVars.add("UnmarshalException"); + AAIException ex = new AAIException("AAI_4007", exception); + response = Response + .status(400).entity(ErrorLogHelper + .getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) + .build(); + } + } + } else if (exception instanceof JsonParseException) { + // jackson does it differently so we get the direct JsonParseException + templateVars.add("JsonParseException"); + AAIException ex = new AAIException("AAI_4007", exception); + response = Response.status(400) + .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) + .build(); } else if (exception instanceof JsonMappingException) { - //jackson does it differently so we get the direct JsonParseException - templateVars.add("JsonMappingException"); - AAIException ex = new AAIException("AAI_4007", exception); - response = Response - .status(400) - .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) - .build(); - } - - // it didn't get set above, we wrap a general fault here - if (response == null) { - - Exception actual_e = exception; - if (exception instanceof WebApplicationException) { - WebApplicationException e = (WebApplicationException) exception; - response = e.getResponse(); - } else { - templateVars.add(request.getMethod()); - templateVars.add("unknown"); - AAIException ex = new AAIException("AAI_4000", actual_e); - List mediaTypes = headers.getAcceptableMediaTypes(); - int setError = 0; + // jackson does it differently so we get the direct JsonParseException + templateVars.add("JsonMappingException"); + AAIException ex = new AAIException("AAI_4007", exception); + response = Response.status(400) + .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) + .build(); + } + + // it didn't get set above, we wrap a general fault here + if (response == null) { + + Exception actual_e = exception; + if (exception instanceof WebApplicationException) { + WebApplicationException e = (WebApplicationException) exception; + response = e.getResponse(); + } else { + templateVars.add(request.getMethod()); + templateVars.add("unknown"); + AAIException ex = new AAIException("AAI_4000", actual_e); + List mediaTypes = headers.getAcceptableMediaTypes(); + int setError = 0; - for (MediaType mediaType : mediaTypes) { - if (MediaType.APPLICATION_XML_TYPE.isCompatible(mediaType)) { - response = Response - .status(400) - .type(MediaType.APPLICATION_XML_TYPE) - .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) - .build(); - setError = 1; - } - } - if (setError == 0) { - response = Response - .status(400) - .type(MediaType.APPLICATION_JSON_TYPE) - .entity(ErrorLogHelper.getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) - .build(); - } - } - } - return response; + for (MediaType mediaType : mediaTypes) { + if (MediaType.APPLICATION_XML_TYPE.isCompatible(mediaType)) { + response = Response + .status(400).type(MediaType.APPLICATION_XML_TYPE).entity(ErrorLogHelper + .getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) + .build(); + setError = 1; + } + } + if (setError == 0) { + response = Response + .status(400).type(MediaType.APPLICATION_JSON_TYPE).entity(ErrorLogHelper + .getRESTAPIErrorResponse(headers.getAcceptableMediaTypes(), ex, templateVars)) + .build(); + } + } + } + return response; } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/LegacyMoxyConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/LegacyMoxyConsumer.java index 3881b09..f429bf7 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/LegacyMoxyConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/LegacyMoxyConsumer.java @@ -17,10 +17,22 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import io.micrometer.core.annotation.Timed; import io.swagger.jaxrs.PATCH; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.security.Principal; +import java.util.*; +import java.util.stream.Collectors; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.*; +import javax.ws.rs.core.*; + import org.apache.commons.lang3.ObjectUtils; import org.javatuples.Pair; import org.keycloak.adapters.springsecurity.account.SimpleKeycloakAccount; @@ -45,15 +57,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.*; -import javax.ws.rs.core.*; -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.security.Principal; -import java.util.*; -import java.util.stream.Collectors; - /** * The Class LegacyMoxyConsumer. */ @@ -62,614 +65,643 @@ import java.util.stream.Collectors; @Timed public class LegacyMoxyConsumer extends RESTAPI { - private static final Logger logger = LoggerFactory.getLogger(LegacyMoxyConsumer.class.getName()); - - /** - * - * @param content - * @param versionParam - * @param uri - * @param headers - * @param info - * @param req - * @return - */ - @PUT - @Path("/{uri: .+}") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response update (String content, @PathParam("version")String versionParam, @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { - Set roles = getRoles(req.getUserPrincipal(), req.getMethod()); - MediaType mediaType = headers.getMediaType(); - return this.handleWrites(mediaType, HttpMethod.PUT, content, versionParam, uri, headers, info, roles); - } - - /** - * Update relationship. - * - * @param content the content - * @param versionParam the version param - * @param uri the uri - * @param headers the headers - * @param info the info - * @param req the req - * @return the response - */ - @PUT - @Path("/{uri: .+}/relationship-list/relationship") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response updateRelationship (String content, @PathParam("version")String versionParam, @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { - - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - MediaType inputMediaType = headers.getMediaType(); - Response response; - Loader loader; - TransactionalGraphEngine dbEngine = null; - boolean success = true; - - try { - validateRequest(info); - SchemaVersion version = new SchemaVersion(versionParam); - - HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - traversalUriHttpEntry.setHttpEntryProperties(version); - loader = traversalUriHttpEntry.getLoader(); - dbEngine = traversalUriHttpEntry.getDbEngine(); - - URI uriObject = UriBuilder.fromPath(uri).build(); - this.validateURI(uriObject); - - QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); - - Introspector wrappedEntity = loader.unmarshal("relationship", content, org.onap.aai.restcore.MediaType.getEnum(this.getInputMediaType(inputMediaType))); - - DBRequest request = new DBRequest.Builder(HttpMethod.PUT_EDGE, uriObject, uriQuery, wrappedEntity, headers, info, transId).build(); - List requests = new ArrayList<>(); - requests.add(request); - Pair>> responsesTuple = traversalUriHttpEntry.process(requests, sourceOfTruth); - - response = responsesTuple.getValue1().get(0).getValue1(); - success = responsesTuple.getValue0(); - - } catch (AAIException e) { - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, e); - success = false; - } catch (Exception e) { - AAIException aaiException = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, aaiException); - success = false; - } finally { - if (dbEngine != null) { - if (success) { - dbEngine.commit(); - } else { - dbEngine.rollback(); - } - } - - } - - return response; - } - - /** - * Patch. - * - * @param content the content - * @param versionParam the version param - * @param uri the uri - * @param headers the headers - * @param info the info - * @param req the req - * @return the response - */ - @PATCH - @Path("/{uri: .+}") - @Consumes({ "application/merge-patch+json" }) - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response patch (String content, @PathParam("version")String versionParam, @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { - Set roles = getRoles(req.getUserPrincipal(), req.getMethod()); - MediaType mediaType = MediaType.APPLICATION_JSON_TYPE; - return this.handleWrites(mediaType, HttpMethod.MERGE_PATCH, content, versionParam, uri, headers, info, roles); - - } - - /** - * Gets the legacy. - * - * @param content the content - * @param versionParam the version param - * @param uri the uri - * @param depthParam the depth param - * @param cleanUp the clean up - * @param headers the headers - * @param info the info - * @param req the req - * @return the legacy - */ - @GET - @Path("/{uri: .+}") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response getLegacy (String content, @DefaultValue("-1") @QueryParam("resultIndex") String resultIndex, @DefaultValue("-1") @QueryParam("resultSize") String resultSize, @PathParam("version")String versionParam, @PathParam("uri") @Encoded String uri, @DefaultValue("all") @QueryParam("depth") String depthParam, @DefaultValue("false") @QueryParam("cleanup") String cleanUp, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { - Set roles = getRoles(req.getUserPrincipal(), req.getMethod()); - - return runner(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED, - AAIConstants.AAI_CRUD_TIMEOUT_APP, - AAIConstants.AAI_CRUD_TIMEOUT_LIMIT, - headers, - info, - HttpMethod.GET, - new AaiCallable() { - @Override - public Response process() { - return getLegacy(content, versionParam, uri, depthParam, cleanUp, headers, info, req, new HashSet(), resultIndex, resultSize, roles); - } - } - ); - } + private static final Logger logger = LoggerFactory.getLogger(LegacyMoxyConsumer.class.getName()); /** - * This method exists as a workaround for filtering out undesired query params while routing between REST consumers - * - * @param content - * @param versionParam - * @param uri - * @param depthParam - * @param cleanUp - * @param headers - * @param info - * @param req - * @param removeQueryParams - * @return - */ - public Response getLegacy(String content, String versionParam, String uri, String depthParam, String cleanUp, HttpHeaders headers, UriInfo info, HttpServletRequest req, Set removeQueryParams, String resultIndex, String resultSize, Set roles) { - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - Response response; - TransactionalGraphEngine dbEngine = null; - Loader loader; - - try { - validateRequest(info); - SchemaVersion version = new SchemaVersion(versionParam); - - final HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - String serverBase = req.getRequestURL().toString().replaceAll("/(v[0-9]+|latest)/.*", "/"); - traversalUriHttpEntry.setHttpEntryProperties(version, serverBase); - dbEngine = traversalUriHttpEntry.getDbEngine(); - loader = traversalUriHttpEntry.getLoader(); - MultivaluedMap params = info.getQueryParameters(); - - params = removeNonFilterableParams(params); - - uri = uri.split("\\?")[0]; - - URI uriObject = UriBuilder.fromPath(uri).build(); - - QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject, params); - - String objType = ""; - if (!uriQuery.getContainerType().equals("")) { - objType = uriQuery.getContainerType(); - } else { - objType = uriQuery.getResultType(); - } - Introspector obj = loader.introspectorFromName(objType); - DBRequest request = - new DBRequest.Builder(HttpMethod.GET, uriObject, uriQuery, obj, headers, info, transId).build(); - List requests = new ArrayList<>(); - requests.add(request); - if (resultIndex != null && !"-1".equals(resultIndex) && resultSize != null && !"-1".equals(resultSize)) { - traversalUriHttpEntry.setPaginationIndex(Integer.parseInt(resultIndex)); - traversalUriHttpEntry.setPaginationBucket(Integer.parseInt(resultSize)); - } - Pair>> responsesTuple = traversalUriHttpEntry.process(requests, sourceOfTruth, roles); - - response = responsesTuple.getValue1().get(0).getValue1(); - - } catch (AAIException e) { - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, e); - } catch (Exception e ) { - AAIException ex = new AAIException("AAI_4000", e); - - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, ex); - } finally { - if (dbEngine != null) { - if (cleanUp.equals("true")) { - dbEngine.commit(); - } else { - dbEngine.rollback(); - } - } - } - - return response; - } - - private MultivaluedMap removeNonFilterableParams(MultivaluedMap params) { - - String[] toRemove = { "depth", "cleanup", "nodes-only", "format", "resultIndex", "resultSize", "skip-related-to"}; - Set toRemoveSet = Arrays.stream(toRemove).collect(Collectors.toSet()); - - MultivaluedMap cleanedParams = new MultivaluedHashMap<>(); - params.keySet().forEach(k -> { - if (!toRemoveSet.contains(k)) { - cleanedParams.addAll(k, params.get(k)); - } - }); - - return cleanedParams; - } - /** - * Delete. - * - * @param versionParam the version param - * @param uri the uri - * @param headers the headers - * @param info the info - * @param resourceVersion the resource version - * @param req the req - * @return the response - */ - @DELETE - @Path("/{uri: .+}") - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response delete (@PathParam("version")String versionParam, @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, @QueryParam("resource-version")String resourceVersion, @Context HttpServletRequest req) { - - Set roles = getRoles(req.getUserPrincipal(), req.getMethod()); - String outputMediaType = getMediaType(headers.getAcceptableMediaTypes()); - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - - TransactionalGraphEngine dbEngine = null; - Response response; - - boolean success = true; - - try { - - validateRequest(info); - SchemaVersion version = new SchemaVersion(versionParam); - - HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - traversalUriHttpEntry.setHttpEntryProperties(version); - dbEngine = traversalUriHttpEntry.getDbEngine(); - Loader loader = traversalUriHttpEntry.getLoader(); - - URI uriObject = UriBuilder.fromPath(uri).build(); - - QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); - String objType = uriQuery.getResultType(); - Introspector obj = loader.introspectorFromName(objType); - - DBRequest request = new DBRequest.Builder(HttpMethod.DELETE, uriObject, uriQuery, obj, headers, info, transId).build(); - List requests = new ArrayList<>(); - requests.add(request); - Pair>> responsesTuple = traversalUriHttpEntry.process(requests, sourceOfTruth, roles); - - response = responsesTuple.getValue1().get(0).getValue1(); - success = responsesTuple.getValue0(); - - } catch (AAIException e) { - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.DELETE, e); - success = false; - } catch (Exception e) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.DELETE, ex); - success = false; - } finally { - if (dbEngine != null) { - if (success) { - dbEngine.commit(); - } else { - dbEngine.rollback(); - } - } - } - - return response; - } - - /** - * This whole method does nothing because the body is being dropped while fielding the request. - * - * @param content the content - * @param versionParam the version param - * @param uri the uri - * @param headers the headers - * @param info the info - * @param req the req - * @return the response - */ - @DELETE - @Path("/{uri: .+}/relationship-list/relationship") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response deleteRelationship (String content, @PathParam("version")String versionParam, @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { - - MediaType inputMediaType = headers.getMediaType(); - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - Loader loader; - TransactionalGraphEngine dbEngine = null; - Response response; - - boolean success = true; - - try { - this.validateRequest(info); - SchemaVersion version = new SchemaVersion(versionParam); - - HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - traversalUriHttpEntry.setHttpEntryProperties(version); - loader = traversalUriHttpEntry.getLoader(); - dbEngine = traversalUriHttpEntry.getDbEngine(); - - if (content.equals("")) { - throw new AAIException("AAI_3102", "You must supply a relationship"); - } - URI uriObject = UriBuilder.fromPath(uri).build(); - this.validateURI(uriObject); - - QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); - - Introspector wrappedEntity = loader.unmarshal("relationship", content, org.onap.aai.restcore.MediaType.getEnum(this.getInputMediaType(inputMediaType))); - - DBRequest request = new DBRequest.Builder(HttpMethod.DELETE_EDGE, uriObject, uriQuery, wrappedEntity, headers, info, transId).build(); - List requests = new ArrayList<>(); - requests.add(request); - Pair>> responsesTuple = traversalUriHttpEntry.process(requests, sourceOfTruth); - - response = responsesTuple.getValue1().get(0).getValue1(); - success = responsesTuple.getValue0(); - } catch (AAIException e) { - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.DELETE, e); - success = false; - } catch (Exception e) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.DELETE, ex); - success = false; - } finally { - if (dbEngine != null) { - if (success) { - dbEngine.commit(); - } else { - dbEngine.rollback(); - } - } - } - - return response; - } - - @GET - @Path("/{uri: .+}/relationship-list") - @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response getRelationshipList (@DefaultValue("-1") @QueryParam("resultIndex") String resultIndex, @DefaultValue("-1") @QueryParam("resultSize") String resultSize, @PathParam("version")String versionParam, @PathParam("uri") @Encoded String uri, @DefaultValue("false") @QueryParam("cleanup") String cleanUp, @Context HttpHeaders headers, @Context HttpServletRequest req,@Context UriInfo info) { - return runner(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED, - AAIConstants.AAI_CRUD_TIMEOUT_APP, - AAIConstants.AAI_CRUD_TIMEOUT_LIMIT, - headers, - info, - HttpMethod.GET, - new AaiCallable() { - @Override - public Response process() { - return getRelationshipList(versionParam, req, uri, cleanUp, headers, info, resultIndex, resultSize); - } - } - ); - } - - /** - * - * @param versionParam - * @param uri - * @param cleanUp - * @param headers - * @param info - * @return - */ - public Response getRelationshipList(String versionParam, HttpServletRequest req, String uri, String cleanUp, HttpHeaders headers, UriInfo info, String resultIndex, String resultSize) { - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - Response response = null; - TransactionalGraphEngine dbEngine = null; - Loader loader = null; - - try { - validateRequest(info); - SchemaVersion version = new SchemaVersion(versionParam); - - final HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - String serverBase = req.getRequestURL().toString().replaceAll("/(v[0-9]+|latest)/.*", "/"); - traversalUriHttpEntry.setHttpEntryProperties(version, serverBase); - dbEngine = traversalUriHttpEntry.getDbEngine(); - loader = traversalUriHttpEntry.getLoader(); - MultivaluedMap params = info.getQueryParameters(); - - params = removeNonFilterableParams(params); - - uri = uri.split("\\?")[0]; - - URI uriObject = UriBuilder.fromPath(uri).build(); - - QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject, params); - - String objType = ""; - if (!uriQuery.getContainerType().equals("")) { - objType = uriQuery.getContainerType(); - } else { - objType = uriQuery.getResultType(); - } - Introspector obj = loader.introspectorFromName(objType); - DBRequest request = - new DBRequest.Builder(HttpMethod.GET_RELATIONSHIP, uriObject, uriQuery, obj, headers, info, transId).build(); - List requests = new ArrayList<>(); - requests.add(request); - if (resultIndex != null && !"-1".equals(resultIndex) && resultSize != null && !"-1".equals(resultSize)) { - traversalUriHttpEntry.setPaginationIndex(Integer.parseInt(resultIndex)); - traversalUriHttpEntry.setPaginationBucket(Integer.parseInt(resultSize)); - } - Pair>> responsesTuple = traversalUriHttpEntry.process(requests, sourceOfTruth); - - response = responsesTuple.getValue1().get(0).getValue1(); - } catch (AAIException e) { - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET_RELATIONSHIP, e); - } catch (Exception e ) { - AAIException ex = new AAIException("AAI_4000", e); - - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET_RELATIONSHIP, ex); - } finally { - if (dbEngine != null) { - if (cleanUp.equals("true")) { - dbEngine.commit(); - } else { - dbEngine.rollback(); - } - } - } - return response; - } - - /** - * Validate request. - * - * @param info the info - * @throws AAIException the AAI exception - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - private void validateRequest(UriInfo info) throws AAIException, UnsupportedEncodingException { - - if (!ValidateEncoding.getInstance().validate(info)) { - throw new AAIException("AAI_3008", "uri=" + getPath(info)); - } - } - - /** - * Gets the path. - * - * @param info the info - * @return the path - */ - private String getPath(UriInfo info) { - String path = info.getPath(false); - MultivaluedMap map = info.getQueryParameters(false); - String params = "?"; - List parmList = new ArrayList<>(); - for (String key : map.keySet()) { - for (String value : map.get(key)) { - parmList.add(key + "=" + value); - } - } - String queryParams = String.join("&", parmList); - if (!map.isEmpty()) { - path += params + queryParams; - } - - return path; - - } - - /** - * Handle writes. - * - * @param mediaType the media type - * @param method the method - * @param content the content - * @param versionParam the version param - * @param uri the uri - * @param headers the headers - * @param info the info - * @return the response - */ - private Response handleWrites(MediaType mediaType, HttpMethod method, String content, String versionParam, String uri, HttpHeaders headers, UriInfo info, Set roles) { - - Response response; - TransactionalGraphEngine dbEngine = null; - Loader loader; - SchemaVersion version; - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - boolean success = true; - - try { - validateRequest(info); - - version = new SchemaVersion(versionParam); - - HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - traversalUriHttpEntry.setHttpEntryProperties(version); - loader = traversalUriHttpEntry.getLoader(); - dbEngine = traversalUriHttpEntry.getDbEngine(); - URI uriObject = UriBuilder.fromPath(uri).build(); - this.validateURI(uriObject); - QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); - String objName = uriQuery.getResultType(); - if (content.length() == 0) { - if (mediaType.toString().contains(MediaType.APPLICATION_JSON)) { - content = "{}"; - } else { - content = ""; - } - } - Introspector obj = loader.unmarshal(objName, content, org.onap.aai.restcore.MediaType.getEnum(this.getInputMediaType(mediaType))); - if (obj == null) { - throw new AAIException("AAI_3000", "object could not be unmarshalled:" + content); - } - - if (mediaType.toString().contains(MediaType.APPLICATION_XML) && !content.equals("") && isEmptyObject(obj)) { - throw new AAIInvalidXMLNamespace(content); - } - - this.validateIntrospector(obj, loader, uriObject, method); - - DBRequest request = - new DBRequest.Builder(method, uriObject, uriQuery, obj, headers, info, transId) - .rawRequestContent(content).build(); - List requests = new ArrayList<>(); - requests.add(request); - Pair>> responsesTuple = traversalUriHttpEntry.process(requests, sourceOfTruth, roles); - - response = responsesTuple.getValue1().get(0).getValue1(); - success = responsesTuple.getValue0(); - } catch (AAIException e) { - response = consumerExceptionResponseGenerator(headers, info, method, e); - success = false; - } catch (Exception e ) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, method, ex); - success = false; - } finally { - if (dbEngine != null) { - if (success) { - dbEngine.commit(); - } else { - dbEngine.rollback(); - } - } - } - - return response; - } - - private void validateURI(URI uri) throws AAIException { - if (hasRelatedTo(uri)) { - throw new AAIException("AAI_3010"); - } - } - private boolean hasRelatedTo(URI uri) { - - return uri.toString().contains("/" + RestTokens.COUSIN + "/"); - } - - protected boolean isEmptyObject(Introspector obj) { - return "{}".equals(obj.marshal(false)); - } + * + * @param content + * @param versionParam + * @param uri + * @param headers + * @param info + * @param req + * @return + */ + @PUT + @Path("/{uri: .+}") + @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response update(String content, @PathParam("version") String versionParam, + @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, + @Context HttpServletRequest req) { + Set roles = getRoles(req.getUserPrincipal(), req.getMethod()); + MediaType mediaType = headers.getMediaType(); + return this.handleWrites(mediaType, HttpMethod.PUT, content, versionParam, uri, headers, info, roles); + } + + /** + * Update relationship. + * + * @param content the content + * @param versionParam the version param + * @param uri the uri + * @param headers the headers + * @param info the info + * @param req the req + * @return the response + */ + @PUT + @Path("/{uri: .+}/relationship-list/relationship") + @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response updateRelationship(String content, @PathParam("version") String versionParam, + @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, + @Context HttpServletRequest req) { + + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + MediaType inputMediaType = headers.getMediaType(); + Response response; + Loader loader; + TransactionalGraphEngine dbEngine = null; + boolean success = true; + + try { + validateRequest(info); + SchemaVersion version = new SchemaVersion(versionParam); + + HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + traversalUriHttpEntry.setHttpEntryProperties(version); + loader = traversalUriHttpEntry.getLoader(); + dbEngine = traversalUriHttpEntry.getDbEngine(); + + URI uriObject = UriBuilder.fromPath(uri).build(); + this.validateURI(uriObject); + + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); + + Introspector wrappedEntity = loader.unmarshal("relationship", content, + org.onap.aai.restcore.MediaType.getEnum(this.getInputMediaType(inputMediaType))); + + DBRequest request = new DBRequest.Builder(HttpMethod.PUT_EDGE, uriObject, uriQuery, wrappedEntity, headers, + info, transId).build(); + List requests = new ArrayList<>(); + requests.add(request); + Pair>> responsesTuple = + traversalUriHttpEntry.process(requests, sourceOfTruth); + + response = responsesTuple.getValue1().get(0).getValue1(); + success = responsesTuple.getValue0(); + + } catch (AAIException e) { + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, e); + success = false; + } catch (Exception e) { + AAIException aaiException = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.PUT, aaiException); + success = false; + } finally { + if (dbEngine != null) { + if (success) { + dbEngine.commit(); + } else { + dbEngine.rollback(); + } + } + + } + + return response; + } + + /** + * Patch. + * + * @param content the content + * @param versionParam the version param + * @param uri the uri + * @param headers the headers + * @param info the info + * @param req the req + * @return the response + */ + @PATCH + @Path("/{uri: .+}") + @Consumes({"application/merge-patch+json"}) + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response patch(String content, @PathParam("version") String versionParam, + @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, + @Context HttpServletRequest req) { + Set roles = getRoles(req.getUserPrincipal(), req.getMethod()); + MediaType mediaType = MediaType.APPLICATION_JSON_TYPE; + return this.handleWrites(mediaType, HttpMethod.MERGE_PATCH, content, versionParam, uri, headers, info, roles); + + } + + /** + * Gets the legacy. + * + * @param content the content + * @param versionParam the version param + * @param uri the uri + * @param depthParam the depth param + * @param cleanUp the clean up + * @param headers the headers + * @param info the info + * @param req the req + * @return the legacy + */ + @GET + @Path("/{uri: .+}") + @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response getLegacy(String content, @DefaultValue("-1") @QueryParam("resultIndex") String resultIndex, + @DefaultValue("-1") @QueryParam("resultSize") String resultSize, @PathParam("version") String versionParam, + @PathParam("uri") @Encoded String uri, @DefaultValue("all") @QueryParam("depth") String depthParam, + @DefaultValue("false") @QueryParam("cleanup") String cleanUp, @Context HttpHeaders headers, + @Context UriInfo info, @Context HttpServletRequest req) { + Set roles = getRoles(req.getUserPrincipal(), req.getMethod()); + + return runner(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED, AAIConstants.AAI_CRUD_TIMEOUT_APP, + AAIConstants.AAI_CRUD_TIMEOUT_LIMIT, headers, info, HttpMethod.GET, new AaiCallable() { + @Override + public Response process() { + return getLegacy(content, versionParam, uri, depthParam, cleanUp, headers, info, req, + new HashSet(), resultIndex, resultSize, roles); + } + }); + } + + /** + * This method exists as a workaround for filtering out undesired query params while routing between REST consumers + * + * @param content + * @param versionParam + * @param uri + * @param depthParam + * @param cleanUp + * @param headers + * @param info + * @param req + * @param removeQueryParams + * @return + */ + public Response getLegacy(String content, String versionParam, String uri, String depthParam, String cleanUp, + HttpHeaders headers, UriInfo info, HttpServletRequest req, Set removeQueryParams, + String resultIndex, String resultSize, Set roles) { + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + Response response; + TransactionalGraphEngine dbEngine = null; + Loader loader; + + try { + validateRequest(info); + SchemaVersion version = new SchemaVersion(versionParam); + + final HttpEntry traversalUriHttpEntry = + SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + String serverBase = req.getRequestURL().toString().replaceAll("/(v[0-9]+|latest)/.*", "/"); + traversalUriHttpEntry.setHttpEntryProperties(version, serverBase); + dbEngine = traversalUriHttpEntry.getDbEngine(); + loader = traversalUriHttpEntry.getLoader(); + MultivaluedMap params = info.getQueryParameters(); + + params = removeNonFilterableParams(params); + + uri = uri.split("\\?")[0]; + + URI uriObject = UriBuilder.fromPath(uri).build(); + + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject, params); + + String objType = ""; + if (!uriQuery.getContainerType().equals("")) { + objType = uriQuery.getContainerType(); + } else { + objType = uriQuery.getResultType(); + } + Introspector obj = loader.introspectorFromName(objType); + DBRequest request = + new DBRequest.Builder(HttpMethod.GET, uriObject, uriQuery, obj, headers, info, transId).build(); + List requests = new ArrayList<>(); + requests.add(request); + if (resultIndex != null && !"-1".equals(resultIndex) && resultSize != null && !"-1".equals(resultSize)) { + traversalUriHttpEntry.setPaginationIndex(Integer.parseInt(resultIndex)); + traversalUriHttpEntry.setPaginationBucket(Integer.parseInt(resultSize)); + } + Pair>> responsesTuple = + traversalUriHttpEntry.process(requests, sourceOfTruth, roles); + + response = responsesTuple.getValue1().get(0).getValue1(); + + } catch (AAIException e) { + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, e); + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, ex); + } finally { + if (dbEngine != null) { + if (cleanUp.equals("true")) { + dbEngine.commit(); + } else { + dbEngine.rollback(); + } + } + } + + return response; + } + + private MultivaluedMap removeNonFilterableParams(MultivaluedMap params) { + + String[] toRemove = + {"depth", "cleanup", "nodes-only", "format", "resultIndex", "resultSize", "skip-related-to"}; + Set toRemoveSet = Arrays.stream(toRemove).collect(Collectors.toSet()); + + MultivaluedMap cleanedParams = new MultivaluedHashMap<>(); + params.keySet().forEach(k -> { + if (!toRemoveSet.contains(k)) { + cleanedParams.addAll(k, params.get(k)); + } + }); + + return cleanedParams; + } + + /** + * Delete. + * + * @param versionParam the version param + * @param uri the uri + * @param headers the headers + * @param info the info + * @param resourceVersion the resource version + * @param req the req + * @return the response + */ + @DELETE + @Path("/{uri: .+}") + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response delete(@PathParam("version") String versionParam, @PathParam("uri") @Encoded String uri, + @Context HttpHeaders headers, @Context UriInfo info, @QueryParam("resource-version") String resourceVersion, + @Context HttpServletRequest req) { + + Set roles = getRoles(req.getUserPrincipal(), req.getMethod()); + String outputMediaType = getMediaType(headers.getAcceptableMediaTypes()); + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + + TransactionalGraphEngine dbEngine = null; + Response response; + + boolean success = true; + + try { + + validateRequest(info); + SchemaVersion version = new SchemaVersion(versionParam); + + HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + traversalUriHttpEntry.setHttpEntryProperties(version); + dbEngine = traversalUriHttpEntry.getDbEngine(); + Loader loader = traversalUriHttpEntry.getLoader(); + + URI uriObject = UriBuilder.fromPath(uri).build(); + + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); + String objType = uriQuery.getResultType(); + Introspector obj = loader.introspectorFromName(objType); + + DBRequest request = + new DBRequest.Builder(HttpMethod.DELETE, uriObject, uriQuery, obj, headers, info, transId).build(); + List requests = new ArrayList<>(); + requests.add(request); + Pair>> responsesTuple = + traversalUriHttpEntry.process(requests, sourceOfTruth, roles); + + response = responsesTuple.getValue1().get(0).getValue1(); + success = responsesTuple.getValue0(); + + } catch (AAIException e) { + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.DELETE, e); + success = false; + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.DELETE, ex); + success = false; + } finally { + if (dbEngine != null) { + if (success) { + dbEngine.commit(); + } else { + dbEngine.rollback(); + } + } + } + + return response; + } + + /** + * This whole method does nothing because the body is being dropped while fielding the request. + * + * @param content the content + * @param versionParam the version param + * @param uri the uri + * @param headers the headers + * @param info the info + * @param req the req + * @return the response + */ + @DELETE + @Path("/{uri: .+}/relationship-list/relationship") + @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response deleteRelationship(String content, @PathParam("version") String versionParam, + @PathParam("uri") @Encoded String uri, @Context HttpHeaders headers, @Context UriInfo info, + @Context HttpServletRequest req) { + + MediaType inputMediaType = headers.getMediaType(); + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + Loader loader; + TransactionalGraphEngine dbEngine = null; + Response response; + + boolean success = true; + + try { + this.validateRequest(info); + SchemaVersion version = new SchemaVersion(versionParam); + + HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + traversalUriHttpEntry.setHttpEntryProperties(version); + loader = traversalUriHttpEntry.getLoader(); + dbEngine = traversalUriHttpEntry.getDbEngine(); + + if (content.equals("")) { + throw new AAIException("AAI_3102", "You must supply a relationship"); + } + URI uriObject = UriBuilder.fromPath(uri).build(); + this.validateURI(uriObject); + + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); + + Introspector wrappedEntity = loader.unmarshal("relationship", content, + org.onap.aai.restcore.MediaType.getEnum(this.getInputMediaType(inputMediaType))); + + DBRequest request = new DBRequest.Builder(HttpMethod.DELETE_EDGE, uriObject, uriQuery, wrappedEntity, + headers, info, transId).build(); + List requests = new ArrayList<>(); + requests.add(request); + Pair>> responsesTuple = + traversalUriHttpEntry.process(requests, sourceOfTruth); + + response = responsesTuple.getValue1().get(0).getValue1(); + success = responsesTuple.getValue0(); + } catch (AAIException e) { + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.DELETE, e); + success = false; + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.DELETE, ex); + success = false; + } finally { + if (dbEngine != null) { + if (success) { + dbEngine.commit(); + } else { + dbEngine.rollback(); + } + } + } + + return response; + } + + @GET + @Path("/{uri: .+}/relationship-list") + @Consumes({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response getRelationshipList(@DefaultValue("-1") @QueryParam("resultIndex") String resultIndex, + @DefaultValue("-1") @QueryParam("resultSize") String resultSize, @PathParam("version") String versionParam, + @PathParam("uri") @Encoded String uri, @DefaultValue("false") @QueryParam("cleanup") String cleanUp, + @Context HttpHeaders headers, @Context HttpServletRequest req, @Context UriInfo info) { + return runner(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED, AAIConstants.AAI_CRUD_TIMEOUT_APP, + AAIConstants.AAI_CRUD_TIMEOUT_LIMIT, headers, info, HttpMethod.GET, new AaiCallable() { + @Override + public Response process() { + return getRelationshipList(versionParam, req, uri, cleanUp, headers, info, resultIndex, + resultSize); + } + }); + } + + /** + * + * @param versionParam + * @param uri + * @param cleanUp + * @param headers + * @param info + * @return + */ + public Response getRelationshipList(String versionParam, HttpServletRequest req, String uri, String cleanUp, + HttpHeaders headers, UriInfo info, String resultIndex, String resultSize) { + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + Response response = null; + TransactionalGraphEngine dbEngine = null; + Loader loader = null; + + try { + validateRequest(info); + SchemaVersion version = new SchemaVersion(versionParam); + + final HttpEntry traversalUriHttpEntry = + SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + String serverBase = req.getRequestURL().toString().replaceAll("/(v[0-9]+|latest)/.*", "/"); + traversalUriHttpEntry.setHttpEntryProperties(version, serverBase); + dbEngine = traversalUriHttpEntry.getDbEngine(); + loader = traversalUriHttpEntry.getLoader(); + MultivaluedMap params = info.getQueryParameters(); + + params = removeNonFilterableParams(params); + + uri = uri.split("\\?")[0]; + + URI uriObject = UriBuilder.fromPath(uri).build(); + + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject, params); + + String objType = ""; + if (!uriQuery.getContainerType().equals("")) { + objType = uriQuery.getContainerType(); + } else { + objType = uriQuery.getResultType(); + } + Introspector obj = loader.introspectorFromName(objType); + DBRequest request = + new DBRequest.Builder(HttpMethod.GET_RELATIONSHIP, uriObject, uriQuery, obj, headers, info, transId) + .build(); + List requests = new ArrayList<>(); + requests.add(request); + if (resultIndex != null && !"-1".equals(resultIndex) && resultSize != null && !"-1".equals(resultSize)) { + traversalUriHttpEntry.setPaginationIndex(Integer.parseInt(resultIndex)); + traversalUriHttpEntry.setPaginationBucket(Integer.parseInt(resultSize)); + } + Pair>> responsesTuple = + traversalUriHttpEntry.process(requests, sourceOfTruth); + + response = responsesTuple.getValue1().get(0).getValue1(); + } catch (AAIException e) { + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET_RELATIONSHIP, e); + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET_RELATIONSHIP, ex); + } finally { + if (dbEngine != null) { + if (cleanUp.equals("true")) { + dbEngine.commit(); + } else { + dbEngine.rollback(); + } + } + } + return response; + } + + /** + * Validate request. + * + * @param info the info + * @throws AAIException the AAI exception + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + private void validateRequest(UriInfo info) throws AAIException, UnsupportedEncodingException { + + if (!ValidateEncoding.getInstance().validate(info)) { + throw new AAIException("AAI_3008", "uri=" + getPath(info)); + } + } + + /** + * Gets the path. + * + * @param info the info + * @return the path + */ + private String getPath(UriInfo info) { + String path = info.getPath(false); + MultivaluedMap map = info.getQueryParameters(false); + String params = "?"; + List parmList = new ArrayList<>(); + for (String key : map.keySet()) { + for (String value : map.get(key)) { + parmList.add(key + "=" + value); + } + } + String queryParams = String.join("&", parmList); + if (!map.isEmpty()) { + path += params + queryParams; + } + + return path; + + } + + /** + * Handle writes. + * + * @param mediaType the media type + * @param method the method + * @param content the content + * @param versionParam the version param + * @param uri the uri + * @param headers the headers + * @param info the info + * @return the response + */ + private Response handleWrites(MediaType mediaType, HttpMethod method, String content, String versionParam, + String uri, HttpHeaders headers, UriInfo info, Set roles) { + + Response response; + TransactionalGraphEngine dbEngine = null; + Loader loader; + SchemaVersion version; + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + boolean success = true; + + try { + validateRequest(info); + + version = new SchemaVersion(versionParam); + + HttpEntry traversalUriHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + traversalUriHttpEntry.setHttpEntryProperties(version); + loader = traversalUriHttpEntry.getLoader(); + dbEngine = traversalUriHttpEntry.getDbEngine(); + URI uriObject = UriBuilder.fromPath(uri).build(); + this.validateURI(uriObject); + QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); + String objName = uriQuery.getResultType(); + if (content.length() == 0) { + if (mediaType.toString().contains(MediaType.APPLICATION_JSON)) { + content = "{}"; + } else { + content = ""; + } + } + Introspector obj = loader.unmarshal(objName, content, + org.onap.aai.restcore.MediaType.getEnum(this.getInputMediaType(mediaType))); + if (obj == null) { + throw new AAIException("AAI_3000", "object could not be unmarshalled:" + content); + } + + if (mediaType.toString().contains(MediaType.APPLICATION_XML) && !content.equals("") + && isEmptyObject(obj)) { + throw new AAIInvalidXMLNamespace(content); + } + + this.validateIntrospector(obj, loader, uriObject, method); + + DBRequest request = new DBRequest.Builder(method, uriObject, uriQuery, obj, headers, info, transId) + .rawRequestContent(content).build(); + List requests = new ArrayList<>(); + requests.add(request); + Pair>> responsesTuple = + traversalUriHttpEntry.process(requests, sourceOfTruth, roles); + + response = responsesTuple.getValue1().get(0).getValue1(); + success = responsesTuple.getValue0(); + } catch (AAIException e) { + response = consumerExceptionResponseGenerator(headers, info, method, e); + success = false; + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, method, ex); + success = false; + } finally { + if (dbEngine != null) { + if (success) { + dbEngine.commit(); + } else { + dbEngine.rollback(); + } + } + } + + return response; + } + + private void validateURI(URI uri) throws AAIException { + if (hasRelatedTo(uri)) { + throw new AAIException("AAI_3010"); + } + } + + private boolean hasRelatedTo(URI uri) { + + return uri.toString().contains("/" + RestTokens.COUSIN + "/"); + } + + protected boolean isEmptyObject(Introspector obj) { + return "{}".equals(obj.marshal(false)); + } private Set getRoles(Principal userPrincipal, String method) { KeycloakAuthenticationToken token = (KeycloakAuthenticationToken) userPrincipal; @@ -682,20 +714,17 @@ public class LegacyMoxyConsumer extends RESTAPI { } // When the request is not a GET, we need to exclude ReadOnly access roles if (isNotGetRequest(method)) { - return getExcludedReadOnlyAccessRoles(account); - } + return getExcludedReadOnlyAccessRoles(account); + } return account.getRoles(); } - private Set getExcludedReadOnlyAccessRoles(SimpleKeycloakAccount account) { - return account.getRoles() - .stream() - .filter(role -> !role.endsWith(OwnerCheck.READ_ONLY_SUFFIX)) - .collect(Collectors.toSet()); - } + private Set getExcludedReadOnlyAccessRoles(SimpleKeycloakAccount account) { + return account.getRoles().stream().filter(role -> !role.endsWith(OwnerCheck.READ_ONLY_SUFFIX)) + .collect(Collectors.toSet()); + } - private boolean isNotGetRequest(String method) { - return !Action.GET.name().equalsIgnoreCase(method); - } + private boolean isNotGetRequest(String method) { + return !Action.GET.name().equalsIgnoreCase(method); + } } - diff --git a/aai-resources/src/main/java/org/onap/aai/rest/URLFromVertexIdConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/URLFromVertexIdConsumer.java index acaec5e..b57181e 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/URLFromVertexIdConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/URLFromVertexIdConsumer.java @@ -17,9 +17,22 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import io.micrometer.core.annotation.Timed; + +import java.net.URI; +import java.util.Iterator; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.*; +import javax.ws.rs.core.Response.Status; + import org.apache.tinkerpop.gremlin.structure.Vertex; import org.onap.aai.config.SpringContextAware; import org.onap.aai.exceptions.AAIException; @@ -32,78 +45,70 @@ import org.onap.aai.serialization.engines.TransactionalGraphEngine; import org.onap.aai.setup.SchemaVersion; import org.onap.aai.util.AAIConfig; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.*; -import javax.ws.rs.core.Response.Status; -import java.net.URI; -import java.util.Iterator; - /** * The Class URLFromVertexIdConsumer. */ @Path("{version: v[1-9][0-9]*|latest}/generateurl") @Timed public class URLFromVertexIdConsumer extends RESTAPI { - private ModelType introspectorFactoryType = ModelType.MOXY; + private ModelType introspectorFactoryType = ModelType.MOXY; + + private final String ID_ENDPOINT = "/id/{vertexid: \\d+}"; + + /** + * Generate url from vertex id. + * + * @param content the content + * @param versionParam the version param + * @param vertexid the vertexid + * @param headers the headers + * @param info the info + * @param req the req + * @return the response + */ + @GET + @Path(ID_ENDPOINT) + @Produces({MediaType.WILDCARD}) + public Response generateUrlFromVertexId(String content, @PathParam("version") String versionParam, + @PathParam("vertexid") long vertexid, @Context HttpHeaders headers, @Context UriInfo info, + @Context HttpServletRequest req) { + + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + + SchemaVersion version = new SchemaVersion(versionParam); + StringBuilder result = new StringBuilder(); + Response response; + TransactionalGraphEngine dbEngine = null; + try { + HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + String serverBase = req.getRequestURL().toString().replaceAll("/(v[0-9]+|latest)/.*", "/"); + resourceHttpEntry.setHttpEntryProperties(version, serverBase); + dbEngine = resourceHttpEntry.getDbEngine(); - private final String ID_ENDPOINT = "/id/{vertexid: \\d+}"; - - /** - * Generate url from vertex id. - * - * @param content the content - * @param versionParam the version param - * @param vertexid the vertexid - * @param headers the headers - * @param info the info - * @param req the req - * @return the response - */ - @GET - @Path(ID_ENDPOINT) - @Produces({ MediaType.WILDCARD }) - public Response generateUrlFromVertexId(String content, @PathParam("version")String versionParam, @PathParam("vertexid")long vertexid, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { - - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + DBSerializer serializer = new DBSerializer(version, dbEngine, introspectorFactoryType, sourceOfTruth); - SchemaVersion version = new SchemaVersion(versionParam); - StringBuilder result = new StringBuilder(); - Response response; - TransactionalGraphEngine dbEngine = null; - try { - HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - String serverBase = req.getRequestURL().toString().replaceAll("/(v[0-9]+|latest)/.*", "/"); - resourceHttpEntry.setHttpEntryProperties(version, serverBase); - dbEngine = resourceHttpEntry.getDbEngine(); - - DBSerializer serializer = new DBSerializer(version, dbEngine, introspectorFactoryType, sourceOfTruth); + Iterator thisVertex = dbEngine.asAdmin().getTraversalSource().V(vertexid); - Iterator thisVertex = dbEngine.asAdmin().getTraversalSource().V(vertexid); - - if (!thisVertex.hasNext()) { - throw new AAIException("AAI_6114", "no node at that vertex id"); - } - URI uri = serializer.getURIForVertex(thisVertex.next()); + if (!thisVertex.hasNext()) { + throw new AAIException("AAI_6114", "no node at that vertex id"); + } + URI uri = serializer.getURIForVertex(thisVertex.next()); - result.append(uri.getRawPath()); - result.insert(0, version); - result.insert(0, serverBase); - response = Response.ok().entity(result.toString()).status(Status.OK).type(MediaType.TEXT_PLAIN).build(); - } catch (AAIException e) { - //TODO check that the details here are sensible - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, e); - } catch (Exception e) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, ex); - } finally { //to close the janusgraph transaction (I think) - if (dbEngine != null) { - dbEngine.rollback(); - } - } - return response; - } + result.append(uri.getRawPath()); + result.insert(0, version); + result.insert(0, serverBase); + response = Response.ok().entity(result.toString()).status(Status.OK).type(MediaType.TEXT_PLAIN).build(); + } catch (AAIException e) { + // TODO check that the details here are sensible + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, e); + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, ex); + } finally { // to close the janusgraph transaction (I think) + if (dbEngine != null) { + dbEngine.rollback(); + } + } + return response; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/VertexIdConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/VertexIdConsumer.java index 61853e3..a7b353e 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/VertexIdConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/VertexIdConsumer.java @@ -17,9 +17,20 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import io.micrometer.core.annotation.Timed; + +import java.net.URI; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.*; +import javax.ws.rs.core.*; + import org.apache.tinkerpop.gremlin.structure.Vertex; import org.javatuples.Pair; import org.onap.aai.config.SpringContextAware; @@ -37,14 +48,6 @@ import org.onap.aai.restcore.RESTAPI; import org.onap.aai.serialization.engines.TransactionalGraphEngine; import org.onap.aai.setup.SchemaVersion; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.*; -import javax.ws.rs.core.*; -import java.net.URI; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - /** * The Class VertexIdConsumer. */ @@ -52,76 +55,80 @@ import java.util.List; @Timed public class VertexIdConsumer extends RESTAPI { - private ModelType introspectorFactoryType = ModelType.MOXY; - - private final String ID_ENDPOINT = "/id/{vertexid: \\d+}"; - - private HttpEntry resourceHttpEntry; - - /** - * Gets the by vertex id. - * - * @param content the content - * @param versionParam the version param - * @param vertexid the vertexid - * @param depthParam the depth param - * @param headers the headers - * @param info the info - * @param req the req - * @return the by vertex id - */ - @GET - @Path(ID_ENDPOINT) - @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response getByVertexId(String content, @PathParam("version")String versionParam, @PathParam("vertexid")long vertexid, @DefaultValue("all") @QueryParam("depth") String depthParam, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { - - String outputMediaType = getMediaType(headers.getAcceptableMediaTypes()); - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - SchemaVersion version = new SchemaVersion(versionParam); - Response response = null; - TransactionalGraphEngine dbEngine = null; - try { - resourceHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - resourceHttpEntry.setHttpEntryProperties(version); - dbEngine = resourceHttpEntry.getDbEngine(); - Loader loader = resourceHttpEntry.getLoader(); - - - //get type of the object represented by the given id - Vertex thisVertex = null; - Iterator itr = dbEngine.asAdmin().getTraversalSource().V(vertexid); - - if (!itr.hasNext()) { - throw new AAIException("AAI_6114", "no node at that vertex id"); - } - thisVertex = itr.next(); - String objName = thisVertex.property(AAIProperties.NODE_TYPE).orElse(null); - - QueryParser query = dbEngine.getQueryBuilder(thisVertex).createQueryFromObjectName(objName); - - Introspector obj = loader.introspectorFromName(query.getResultType()); - - URI uriObject = UriBuilder.fromPath(info.getPath()).build(); - - DBRequest request = - new DBRequest.Builder(HttpMethod.GET, uriObject, query, obj, headers, info, transId) - .customMarshaller(new MarshallerProperties.Builder(org.onap.aai.restcore.MediaType.getEnum(outputMediaType)).includeRoot(true).build()).build(); - - List requests = new ArrayList<>(); - requests.add(request); - Pair>> responsesTuple = resourceHttpEntry.process(requests, sourceOfTruth); - response = responsesTuple.getValue1().get(0).getValue1(); - } catch (AAIException e){ - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, e); - } catch (Exception e) { - AAIException ex = new AAIException("AAI_4000", e); - response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, ex); - } finally { //to close the janusgraph transaction (I think) - if (dbEngine != null) { - dbEngine.rollback(); - } - } - return response; - } + private ModelType introspectorFactoryType = ModelType.MOXY; + + private final String ID_ENDPOINT = "/id/{vertexid: \\d+}"; + + private HttpEntry resourceHttpEntry; + + /** + * Gets the by vertex id. + * + * @param content the content + * @param versionParam the version param + * @param vertexid the vertexid + * @param depthParam the depth param + * @param headers the headers + * @param info the info + * @param req the req + * @return the by vertex id + */ + @GET + @Path(ID_ENDPOINT) + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + public Response getByVertexId(String content, @PathParam("version") String versionParam, + @PathParam("vertexid") long vertexid, @DefaultValue("all") @QueryParam("depth") String depthParam, + @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { + + String outputMediaType = getMediaType(headers.getAcceptableMediaTypes()); + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + SchemaVersion version = new SchemaVersion(versionParam); + Response response = null; + TransactionalGraphEngine dbEngine = null; + try { + resourceHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + resourceHttpEntry.setHttpEntryProperties(version); + dbEngine = resourceHttpEntry.getDbEngine(); + Loader loader = resourceHttpEntry.getLoader(); + + // get type of the object represented by the given id + Vertex thisVertex = null; + Iterator itr = dbEngine.asAdmin().getTraversalSource().V(vertexid); + + if (!itr.hasNext()) { + throw new AAIException("AAI_6114", "no node at that vertex id"); + } + thisVertex = itr.next(); + String objName = thisVertex.property(AAIProperties.NODE_TYPE).orElse(null); + + QueryParser query = dbEngine.getQueryBuilder(thisVertex).createQueryFromObjectName(objName); + + Introspector obj = loader.introspectorFromName(query.getResultType()); + + URI uriObject = UriBuilder.fromPath(info.getPath()).build(); + + DBRequest request = + new DBRequest.Builder(HttpMethod.GET, uriObject, query, obj, headers, info, transId) + .customMarshaller(new MarshallerProperties.Builder( + org.onap.aai.restcore.MediaType.getEnum(outputMediaType)).includeRoot(true).build()) + .build(); + + List requests = new ArrayList<>(); + requests.add(request); + Pair>> responsesTuple = + resourceHttpEntry.process(requests, sourceOfTruth); + response = responsesTuple.getValue1().get(0).getValue1(); + } catch (AAIException e) { + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, e); + } catch (Exception e) { + AAIException ex = new AAIException("AAI_4000", e); + response = consumerExceptionResponseGenerator(headers, info, HttpMethod.GET, ex); + } finally { // to close the janusgraph transaction (I think) + if (dbEngine != null) { + dbEngine.rollback(); + } + } + return response; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkOperation.java b/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkOperation.java index 82a706f..de31b5a 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkOperation.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkOperation.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk; import java.net.URI; @@ -32,70 +33,70 @@ import org.springframework.util.MultiValueMap; public class BulkOperation { - private URI uri = null; - private QueryParser uriQuery = null; - private Introspector introspector = null; - private HttpMethod httpMethod = null; - private String rawReq = ""; - private UriInfo uriInfo = new BulkUriInfo(); - - public UriInfo getUriInfo() { - return uriInfo; - } - - public String getRawReq() { - return rawReq; - } - - public void setRawReq(String rawReq) { - this.rawReq = rawReq; - } - - public URI getUri() { - return uri; - } - - public void setUri(URI uri) { - this.uri = uri; - } - - public QueryParser getUriQuery() { - return uriQuery; - } - - public void setUriQuery(QueryParser uriQuery) { - this.uriQuery = uriQuery; - } - - public Introspector getIntrospector() { - return introspector; - } - - public void setIntrospector(Introspector introspector) { - this.introspector = introspector; - } - - public HttpMethod getHttpMethod() { - return httpMethod; - } - - public void setHttpMethod(HttpMethod httpMethod) { - this.httpMethod = httpMethod; - } - - public void addUriInfoQueryParams(MultiValueMap queryParams) { - - BulkUriInfo bui = new BulkUriInfo(); - - for (Entry> entry : queryParams.entrySet()) { - bui.addParams(entry.getKey(), entry.getValue()); - } - - this.uriInfo = bui; - } - - public void addUriInfo(UriInfo uriInfo){ - this.uriInfo = uriInfo; - } + private URI uri = null; + private QueryParser uriQuery = null; + private Introspector introspector = null; + private HttpMethod httpMethod = null; + private String rawReq = ""; + private UriInfo uriInfo = new BulkUriInfo(); + + public UriInfo getUriInfo() { + return uriInfo; + } + + public String getRawReq() { + return rawReq; + } + + public void setRawReq(String rawReq) { + this.rawReq = rawReq; + } + + public URI getUri() { + return uri; + } + + public void setUri(URI uri) { + this.uri = uri; + } + + public QueryParser getUriQuery() { + return uriQuery; + } + + public void setUriQuery(QueryParser uriQuery) { + this.uriQuery = uriQuery; + } + + public Introspector getIntrospector() { + return introspector; + } + + public void setIntrospector(Introspector introspector) { + this.introspector = introspector; + } + + public HttpMethod getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(HttpMethod httpMethod) { + this.httpMethod = httpMethod; + } + + public void addUriInfoQueryParams(MultiValueMap queryParams) { + + BulkUriInfo bui = new BulkUriInfo(); + + for (Entry> entry : queryParams.entrySet()) { + bui.addParams(entry.getKey(), entry.getValue()); + } + + this.uriInfo = bui; + } + + public void addUriInfo(UriInfo uriInfo) { + this.uriInfo = uriInfo; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkOperationResponse.java b/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkOperationResponse.java index 130ab1c..b621d50 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkOperationResponse.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkOperationResponse.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk; import java.net.URI; @@ -29,61 +30,62 @@ import org.javatuples.Pair; import org.onap.aai.restcore.HttpMethod; public class BulkOperationResponse { - - private URI uri = null; - private Response response = null; - private HttpMethod httpMethod = null; - - private BulkOperationResponse() { - - } - - private BulkOperationResponse(HttpMethod httpMethod, Pair pair) { - this.httpMethod = httpMethod; - this.response = pair.getValue1(); - this.uri = pair.getValue0(); - } - - public BulkOperationResponse(HttpMethod httpMethod, URI uri, Response response) { - this.httpMethod = httpMethod; - this.response = response; - this.uri = uri; - } - - public URI getUri() { - return uri; - } - - public void setUri(URI uri) { - this.uri = uri; - } - - public Response getResponse() { - return response; - } - - public void setResponse(Response response) { - this.response = response; - } - - public HttpMethod getHttpMethod() { - return httpMethod; - } - - public void setHttpMethod(HttpMethod httpMethod) { - this.httpMethod = httpMethod; - } - - public static List processPairList(HttpMethod httpMethod, List> pairList) { - - List borList = new ArrayList<>(); - BulkOperationResponse bor; - - for (Pair pair: pairList) { - bor = new BulkOperationResponse(httpMethod, pair); - borList.add(bor); - } - - return borList; - } + + private URI uri = null; + private Response response = null; + private HttpMethod httpMethod = null; + + private BulkOperationResponse() { + + } + + private BulkOperationResponse(HttpMethod httpMethod, Pair pair) { + this.httpMethod = httpMethod; + this.response = pair.getValue1(); + this.uri = pair.getValue0(); + } + + public BulkOperationResponse(HttpMethod httpMethod, URI uri, Response response) { + this.httpMethod = httpMethod; + this.response = response; + this.uri = uri; + } + + public URI getUri() { + return uri; + } + + public void setUri(URI uri) { + this.uri = uri; + } + + public Response getResponse() { + return response; + } + + public void setResponse(Response response) { + this.response = response; + } + + public HttpMethod getHttpMethod() { + return httpMethod; + } + + public void setHttpMethod(HttpMethod httpMethod) { + this.httpMethod = httpMethod; + } + + public static List processPairList(HttpMethod httpMethod, + List> pairList) { + + List borList = new ArrayList<>(); + BulkOperationResponse bor; + + for (Pair pair : pairList) { + bor = new BulkOperationResponse(httpMethod, pair); + borList.add(bor); + } + + return borList; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkSingleTransactionConsumer.java b/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkSingleTransactionConsumer.java index a5e5d7c..cc1e912 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkSingleTransactionConsumer.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkSingleTransactionConsumer.java @@ -17,13 +17,24 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonArray; import com.google.gson.JsonParser; + import io.micrometer.core.annotation.Timed; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.util.*; + +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.*; +import javax.ws.rs.core.*; + import org.javatuples.Pair; import org.onap.aai.config.SpringContextAware; import org.onap.aai.exceptions.AAIException; @@ -48,422 +59,413 @@ import org.slf4j.LoggerFactory; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; -import javax.servlet.http.HttpServletRequest; -import javax.ws.rs.*; -import javax.ws.rs.core.*; -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.util.*; - @Path(value = "{version: v[1-9][0-9]*|latest}/bulk/single-transaction") @Timed public class BulkSingleTransactionConsumer extends RESTAPI { - private static final Set validOperations = Collections.unmodifiableSet(new HashSet<>(Arrays.asList("put", "patch", "delete"))); - private static final JsonParser parser = new JsonParser(); - private int allowedOperationCount = 30; - - private static final Logger LOGGER = LoggerFactory.getLogger(BulkSingleTransactionConsumer.class); - - private final String uriPrefix; - - public BulkSingleTransactionConsumer() { - uriPrefix = SpringContextAware.getApplicationContext().getEnvironment().getProperty("schema.uri.base.path", ""); - } - - public BulkSingleTransactionConsumer(String uriPrefix) { - this.uriPrefix = uriPrefix; - } - - @POST - @Consumes(value = javax.ws.rs.core.MediaType.APPLICATION_JSON) - @Produces(value = javax.ws.rs.core.MediaType.APPLICATION_JSON) - public Response process(String content, @PathParam(value = "version")String versionParam, @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req){ - - String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); - String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); - SchemaVersion version = new SchemaVersion(versionParam); - - boolean success = true; - - TransactionalGraphEngine dbEngine = null; - TransactionResponse transactionResponse; - Response response; - - try { - - // unmarshall the payload. - Gson gson = new Gson(); - Transaction transaction; - try { - transaction = gson.fromJson(content, Transaction.class); - } catch (Exception e) { - throw new AAIException("AAI_6111", "Input payload does not follow bulk/single-transaction interface"); - } - - //set the operation count limit - setOperationCount(headers); - //validate - validate(transaction); - - //generate bulkoperations - List bulkOperations = generateBulkOperations(transaction); - - //init http entry - HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); - resourceHttpEntry.setHttpEntryProperties(version); - Loader loader = resourceHttpEntry.getLoader(); - dbEngine = resourceHttpEntry.getDbEngine(); - - //populate uri query - populateUriQuery(bulkOperations, dbEngine); - - //populate introspector for operations - populateIntrospectors(bulkOperations, loader); - - //generate db process from bulk operation - List dbRequests = bulkOperationToDbRequests(headers, transId, bulkOperations); - - //process db requests - Pair>> results = resourceHttpEntry.process(dbRequests, sourceOfTruth, this.enableResourceVersion()); - - //commit/rollback based on results - success = results.getValue0(); - - if (success) { //process result of db requests if all are successful - transactionResponse = buildTransactionResponse(transaction, results.getValue1()); - response = Response - .status(Response.Status.CREATED) - .entity(new GsonBuilder().serializeNulls().create().toJson(transactionResponse)) - .build(); - } else { - response = getErrorResponseForFirstFailure(transaction, results.getValue1(), info, javax.ws.rs.HttpMethod.POST, headers); - - } - - } catch (AAIException e) { - response = consumerExceptionResponseGenerator(headers, info, javax.ws.rs.HttpMethod.POST, e); - success = false; - } finally { - if (dbEngine != null) { - if(success){ - dbEngine.commit(); - LOGGER.info("Successfully committed the transaction to the database"); - } else { - dbEngine.rollback(); - LOGGER.info("Rolled back the transaction due to failure"); - } - } - } - - return response; - } - - private Response getErrorResponseForFirstFailure(Transaction transaction, List> results, UriInfo info, String action, HttpHeaders headers) throws AAIException { - final String failureInResponse = "Operation %s with action (%s) on uri (%s) failed with status code (%s), error code (%s) and msg (%s)"; - for (int i = 0; i < transaction.getOperations().size(); i++) { - if (!Response.Status.Family.familyOf(results.get(i).getValue1().getStatus()).equals(Response.Status.Family.SUCCESSFUL)) { - final JsonArray vars = parser.parse(results.get(i).getValue1().getEntity().toString()).getAsJsonObject() - .getAsJsonObject("requestError") - .getAsJsonObject("serviceException") - .getAsJsonArray("variables"); - StringBuilder sb = new StringBuilder(); - for (int j = 2; j < vars.size() - 1; j++) { - if (j != 2) { - sb.append(": "); - } - sb.append(vars.get(j).getAsString()); - } - final AAIException e = new AAIException("AAI_3000", - String.format( - failureInResponse, - i, - vars.get(0).getAsString(), - vars.get(1).getAsString(), - results.get(i).getValue1().getStatus(), - vars.get(vars.size()-1).getAsString(), - sb.toString() - )); - ArrayList templateVars = new ArrayList<>(); - templateVars.add(action); //GET, PUT, etc - templateVars.add(info.getPath()); - return Response - .status(results.get(i).getValue1().getStatus()) - .entity(ErrorLogHelper.getRESTAPIErrorResponseWithLogging(headers.getAcceptableMediaTypes(), e, templateVars)) - .build(); - } - } - LOGGER.error("Transaction Process reported failure, none found."); - throw new AAIException("AAI_3000", "Transaction Process reported failure, none found."); - } - - - /** - * Builds the response - * @param transaction the input transactions - * @param results the response of all of he operations - * @return TansactionResponse obj representing the result of the transaction - * @throws AAIException thrown if there is a failure in the result. Msg contains the details of the first failure. - */ - private TransactionResponse buildTransactionResponse(Transaction transaction, List> results) throws AAIException { - TransactionResponse transactionResponse = new TransactionResponse(); - transactionResponse.setOperationResponses(new ArrayList<>(transaction.getOperations().size())); - final String failureInResponse = "Operation %s failed with status code (%s) and msg (%s)"; - for (int i = 0; i < transaction.getOperations().size(); i++) { - if (!Response.Status.Family.familyOf(results.get(i).getValue1().getStatus()) - .equals(Response.Status.Family.SUCCESSFUL)) { - throw new AAIException("AAI_3000", - String.format( - failureInResponse, - i, - results.get(i).getValue1().getStatus(), - results.get(i).getValue1().getEntity())); - } - OperationResponse operationResponse = new OperationResponse(); - operationResponse.setResponseStatusCode(results.get(i).getValue1().getStatus()); - operationResponse.setAction(transaction.getOperations().get(i).getAction()); - operationResponse.setUri(transaction.getOperations().get(i).getUri()); - operationResponse.setBody(results.get(i).getValue1().getEntity()); - transactionResponse.getOperationResponsess().add(i, operationResponse); - } - return transactionResponse; - } - - /** - * Generate one DBRequest per BulkOperation - * @param headers request headers - * @param transId transaction id - * @param bulkOperations operations to convert - * @return One DBRequest per BulkOperation - * @throws AAIException thrown if there are any issues with the transform - */ - private List bulkOperationToDbRequests(@Context HttpHeaders headers, String transId, List bulkOperations) throws AAIException { - List requests = new ArrayList<>(); - for (int i = 0; i < bulkOperations.size(); i++) { - try { - BulkOperation bulkOperation = bulkOperations.get(i); - DBRequest request = new DBRequest.Builder( - bulkOperation.getHttpMethod(), - bulkOperation.getUri(), - bulkOperation.getUriQuery(), - bulkOperation.getIntrospector(), - headers, - bulkOperation.getUriInfo(), - transId - ).rawRequestContent(bulkOperation.getRawReq()).build(); - requests.add(request); - } catch (Exception e) { - throw new AAIException("AAI_3000", "Error with operation " + i + ": " +e.getMessage()); - } - } - return requests; - } - - /** - * Sets the uriquery for each bulk operation - * @param bulkOperations operations to generate queries for - * @param dbEngine engine for query builder generation - * @throws AAIException thrown for issues with generating uri query - */ - private void populateUriQuery(List bulkOperations, TransactionalGraphEngine dbEngine) throws AAIException { - for (int i = 0; i < bulkOperations.size(); i++) { - try { - bulkOperations.get(i).setUriQuery(dbEngine.getQueryBuilder().createQueryFromURI(bulkOperations.get(i).getUri())); - } catch (AAIException e) { - throw new AAIException(e.getCode(), "Error with operation " + i + ": " +e.getMessage()); - } catch (UnsupportedEncodingException e) { - throw new AAIException("AAI_3000", "Error with operation " + i + ": " +e.getMessage()); - } - } - } - - /** - * Sets the introspector for each bulk operation. requires that uriquery is set per operation - * @param bulkOperations operations to generate introspector for - * @param loader Loader for generating introspector - * @throws AAIException thrown for issues with generating introspector - */ - private void populateIntrospectors(List bulkOperations, Loader loader) throws AAIException { - - final String objectUnMarshallMsg = "Body of operation %s could not be unmarshalled: %s"; - Introspector obj; - for (int i = 0; i < bulkOperations.size(); i++) { - BulkOperation bulkOperation = bulkOperations.get(i); - try { - if (bulkOperation.getHttpMethod().equals(HttpMethod.PUT_EDGE) - || bulkOperation.getHttpMethod().equals(HttpMethod.DELETE_EDGE)) { - obj = loader.unmarshal("relationship", bulkOperation.getRawReq(), MediaType.APPLICATION_JSON_TYPE); - bulkOperation.setIntrospector(obj); - } else { - String objName = bulkOperation.getUriQuery().getResultType(); - if (bulkOperation.getHttpMethod().equals(HttpMethod.DELETE)) { - obj = loader.introspectorFromName(objName); - } else { - obj = loader.unmarshal(objName, bulkOperation.getRawReq(), MediaType.APPLICATION_JSON_TYPE); - this.validateIntrospector(obj, loader, bulkOperation.getUri(), bulkOperation.getHttpMethod()); - } - bulkOperation.setIntrospector(obj); - } - } catch (UnsupportedEncodingException e) { - throw new AAIException("AAI_3000", String.format(objectUnMarshallMsg, i, bulkOperation.getRawReq())); - } - } - - } - - /** - * Sets the allowedOperationCount to one of the following - * - Integer.MAX_VALUE if override limit is configured - * - Property in aaiconfig - * - 30 by default - * @param headers request header - */ - private void setOperationCount(HttpHeaders headers) { - try { - String overrideLimit = headers.getRequestHeaders().getFirst("X-OverrideLimit"); - boolean isOverride = overrideLimit != null && !AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_OVERRIDE_LIMIT).equals("false") - && overrideLimit.equals(AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_OVERRIDE_LIMIT)); - if (isOverride) { - allowedOperationCount = Integer.MAX_VALUE; - } else { - allowedOperationCount = AAIConfig.getInt(AAIConstants.AAI_BULKCONSUMER_LIMIT); - } - } catch (AAIException e) { - allowedOperationCount = 30; - } - } - - /** - * Converts the request transaction into a list of bulk operations - * @param transaction transaction to extract bulk operations from - * @return list of bulk operations - */ - private List generateBulkOperations(Transaction transaction) { - List bulkOperations = new ArrayList<>(transaction.getOperations().size()); - - BulkOperation bulkOperation; - for (Operation operation : transaction.getOperations()) { - bulkOperation = new BulkOperation(); - UriComponents uriComponents = UriComponentsBuilder.fromUriString(getUri(operation)).build(); - bulkOperation.setUri(UriBuilder.fromPath(uriComponents.getPath()).build()); - bulkOperation.addUriInfoQueryParams(uriComponents.getQueryParams()); - bulkOperation.setHttpMethod(getHttpMethod(operation.getAction(), bulkOperation.getUri())); - bulkOperation.setRawReq(operation.getBody().toString()); - bulkOperations.add(bulkOperation); - } - - return bulkOperations; - } - - private String getUri(Operation operation) { - String uri = operation.getUri(); - if (uri == null || uri.isEmpty()) { - return uri; - } else if (uri.charAt(0) != '/') { - uri = '/' + uri; - } - return uri.replaceAll("^" + uriPrefix + "/v\\d+", ""); - } - - - /** - * Map action to httpmethod - * @param action action to be mapped - * @param uri uri of the action - * @return HttpMethod thats action/uri maps to - */ - private HttpMethod getHttpMethod(String action, URI uri) { - HttpMethod method = HttpMethod.GET; - switch (action) { - case "put": - method = HttpMethod.PUT; - break; - case "delete": - method = HttpMethod.DELETE; - break; - case "patch": - method = HttpMethod.MERGE_PATCH; - break; - } - if (uri.getPath().endsWith("/relationship-list/relationship")) { - if (method.equals(HttpMethod.PUT)) { - method = HttpMethod.PUT_EDGE; - } else if (method.equals(HttpMethod.DELETE)) { - method = HttpMethod.DELETE_EDGE; - } - } - - return method; - } - - - /** - * For each operation validates: - * - action is provided and correct. - * - uri exists - * - body exists - * @param transaction parsed payload - * @throws AAIException with the violations in the msg - */ - private void validate(Transaction transaction) throws AAIException { - if (transaction == null) { - throw new AAIException("AAI_6111", "input payload does not follow /bulk/single-transaction interface"); - } - - if (transaction.getOperations() == null - || transaction.getOperations().isEmpty()) { - throw new AAIException("AAI_6118", " Payload has no objects to operate on"); - } else if (transaction.getOperations().size() > allowedOperationCount){ - throw new AAIException("AAI_6147", " Allowed limit = " + allowedOperationCount); - } - - final String missingFieldMsgFormat = "Operation %s missing '%s'"; - final String invalidActionMsgFormat = "Operation %s has invalid action '%s'"; - List msgs = new ArrayList<>(); - for (int i = 0; i < transaction.getOperations().size(); i++) { - final Operation operation = transaction.getOperations().get(i); - if (operation.getAction() == null || operation.getAction().isEmpty()) { - msgs.add(String.format(missingFieldMsgFormat, i, "action")); - } else if (!validOperations.contains(operation.getAction())) { - msgs.add(String.format(invalidActionMsgFormat, i, operation.getAction())); - } - if (operation.getUri() == null || operation.getUri().isEmpty()) { - msgs.add(String.format(missingFieldMsgFormat, i, "uri")); - } - if (operation.getBody() == null) { - msgs.add(String.format(missingFieldMsgFormat, i, "body")); - } - } - if (!msgs.isEmpty()) { - throw new AAIException("AAI_6111", "input payload missing required properties. [" + String.join(", ", msgs) + "]"); - } - - } - - protected boolean enableResourceVersion() { - return true; - } - - - /** - * Consumer exception response generator. - * - * @param headers the headers - * @param info the info - * @param action type of request - * @param e the e - * @return the response - */ - protected Response consumerExceptionResponseGenerator(HttpHeaders headers, UriInfo info, String action, AAIException e) { - ArrayList templateVars = new ArrayList<>(); - templateVars.add(action); //GET, PUT, etc - templateVars.add(info.getPath()); - templateVars.addAll(e.getTemplateVars()); - - ErrorLogHelper.logException(e); - return Response - .status(e.getErrorObject().getHTTPResponseCode()) - .entity(ErrorLogHelper.getRESTAPIErrorResponseWithLogging(headers.getAcceptableMediaTypes(), e, templateVars)) - .build(); - } + private static final Set validOperations = + Collections.unmodifiableSet(new HashSet<>(Arrays.asList("put", "patch", "delete"))); + private static final JsonParser parser = new JsonParser(); + private int allowedOperationCount = 30; + + private static final Logger LOGGER = LoggerFactory.getLogger(BulkSingleTransactionConsumer.class); + + private final String uriPrefix; + + public BulkSingleTransactionConsumer() { + uriPrefix = SpringContextAware.getApplicationContext().getEnvironment().getProperty("schema.uri.base.path", ""); + } + + public BulkSingleTransactionConsumer(String uriPrefix) { + this.uriPrefix = uriPrefix; + } + + @POST + @Consumes(value = javax.ws.rs.core.MediaType.APPLICATION_JSON) + @Produces(value = javax.ws.rs.core.MediaType.APPLICATION_JSON) + public Response process(String content, @PathParam(value = "version") String versionParam, + @Context HttpHeaders headers, @Context UriInfo info, @Context HttpServletRequest req) { + + String transId = headers.getRequestHeaders().getFirst("X-TransactionId"); + String sourceOfTruth = headers.getRequestHeaders().getFirst("X-FromAppId"); + SchemaVersion version = new SchemaVersion(versionParam); + + boolean success = true; + + TransactionalGraphEngine dbEngine = null; + TransactionResponse transactionResponse; + Response response; + + try { + + // unmarshall the payload. + Gson gson = new Gson(); + Transaction transaction; + try { + transaction = gson.fromJson(content, Transaction.class); + } catch (Exception e) { + throw new AAIException("AAI_6111", "Input payload does not follow bulk/single-transaction interface"); + } + + // set the operation count limit + setOperationCount(headers); + // validate + validate(transaction); + + // generate bulkoperations + List bulkOperations = generateBulkOperations(transaction); + + // init http entry + HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalUriHttpEntry", HttpEntry.class); + resourceHttpEntry.setHttpEntryProperties(version); + Loader loader = resourceHttpEntry.getLoader(); + dbEngine = resourceHttpEntry.getDbEngine(); + + // populate uri query + populateUriQuery(bulkOperations, dbEngine); + + // populate introspector for operations + populateIntrospectors(bulkOperations, loader); + + // generate db process from bulk operation + List dbRequests = bulkOperationToDbRequests(headers, transId, bulkOperations); + + // process db requests + Pair>> results = + resourceHttpEntry.process(dbRequests, sourceOfTruth, this.enableResourceVersion()); + + // commit/rollback based on results + success = results.getValue0(); + + if (success) { // process result of db requests if all are successful + transactionResponse = buildTransactionResponse(transaction, results.getValue1()); + response = Response.status(Response.Status.CREATED) + .entity(new GsonBuilder().serializeNulls().create().toJson(transactionResponse)).build(); + } else { + response = getErrorResponseForFirstFailure(transaction, results.getValue1(), info, + javax.ws.rs.HttpMethod.POST, headers); + + } + + } catch (AAIException e) { + response = consumerExceptionResponseGenerator(headers, info, javax.ws.rs.HttpMethod.POST, e); + success = false; + } finally { + if (dbEngine != null) { + if (success) { + dbEngine.commit(); + LOGGER.info("Successfully committed the transaction to the database"); + } else { + dbEngine.rollback(); + LOGGER.info("Rolled back the transaction due to failure"); + } + } + } + + return response; + } + + private Response getErrorResponseForFirstFailure(Transaction transaction, List> results, + UriInfo info, String action, HttpHeaders headers) throws AAIException { + final String failureInResponse = + "Operation %s with action (%s) on uri (%s) failed with status code (%s), error code (%s) and msg (%s)"; + for (int i = 0; i < transaction.getOperations().size(); i++) { + if (!Response.Status.Family.familyOf(results.get(i).getValue1().getStatus()) + .equals(Response.Status.Family.SUCCESSFUL)) { + final JsonArray vars = parser.parse(results.get(i).getValue1().getEntity().toString()).getAsJsonObject() + .getAsJsonObject("requestError").getAsJsonObject("serviceException") + .getAsJsonArray("variables"); + StringBuilder sb = new StringBuilder(); + for (int j = 2; j < vars.size() - 1; j++) { + if (j != 2) { + sb.append(": "); + } + sb.append(vars.get(j).getAsString()); + } + final AAIException e = new AAIException("AAI_3000", + String.format(failureInResponse, i, vars.get(0).getAsString(), vars.get(1).getAsString(), + results.get(i).getValue1().getStatus(), vars.get(vars.size() - 1).getAsString(), + sb.toString())); + ArrayList templateVars = new ArrayList<>(); + templateVars.add(action); // GET, PUT, etc + templateVars.add(info.getPath()); + return Response + .status(results.get(i).getValue1().getStatus()).entity(ErrorLogHelper + .getRESTAPIErrorResponseWithLogging(headers.getAcceptableMediaTypes(), e, templateVars)) + .build(); + } + } + LOGGER.error("Transaction Process reported failure, none found."); + throw new AAIException("AAI_3000", "Transaction Process reported failure, none found."); + } + + /** + * Builds the response + * + * @param transaction the input transactions + * @param results the response of all of he operations + * @return TansactionResponse obj representing the result of the transaction + * @throws AAIException thrown if there is a failure in the result. Msg contains the details of the first failure. + */ + private TransactionResponse buildTransactionResponse(Transaction transaction, List> results) + throws AAIException { + TransactionResponse transactionResponse = new TransactionResponse(); + transactionResponse.setOperationResponses(new ArrayList<>(transaction.getOperations().size())); + final String failureInResponse = "Operation %s failed with status code (%s) and msg (%s)"; + for (int i = 0; i < transaction.getOperations().size(); i++) { + if (!Response.Status.Family.familyOf(results.get(i).getValue1().getStatus()) + .equals(Response.Status.Family.SUCCESSFUL)) { + throw new AAIException("AAI_3000", String.format(failureInResponse, i, + results.get(i).getValue1().getStatus(), results.get(i).getValue1().getEntity())); + } + OperationResponse operationResponse = new OperationResponse(); + operationResponse.setResponseStatusCode(results.get(i).getValue1().getStatus()); + operationResponse.setAction(transaction.getOperations().get(i).getAction()); + operationResponse.setUri(transaction.getOperations().get(i).getUri()); + operationResponse.setBody(results.get(i).getValue1().getEntity()); + transactionResponse.getOperationResponsess().add(i, operationResponse); + } + return transactionResponse; + } + + /** + * Generate one DBRequest per BulkOperation + * + * @param headers request headers + * @param transId transaction id + * @param bulkOperations operations to convert + * @return One DBRequest per BulkOperation + * @throws AAIException thrown if there are any issues with the transform + */ + private List bulkOperationToDbRequests(@Context HttpHeaders headers, String transId, + List bulkOperations) throws AAIException { + List requests = new ArrayList<>(); + for (int i = 0; i < bulkOperations.size(); i++) { + try { + BulkOperation bulkOperation = bulkOperations.get(i); + DBRequest request = new DBRequest.Builder(bulkOperation.getHttpMethod(), bulkOperation.getUri(), + bulkOperation.getUriQuery(), bulkOperation.getIntrospector(), headers, + bulkOperation.getUriInfo(), transId).rawRequestContent(bulkOperation.getRawReq()).build(); + requests.add(request); + } catch (Exception e) { + throw new AAIException("AAI_3000", "Error with operation " + i + ": " + e.getMessage()); + } + } + return requests; + } + + /** + * Sets the uriquery for each bulk operation + * + * @param bulkOperations operations to generate queries for + * @param dbEngine engine for query builder generation + * @throws AAIException thrown for issues with generating uri query + */ + private void populateUriQuery(List bulkOperations, TransactionalGraphEngine dbEngine) + throws AAIException { + for (int i = 0; i < bulkOperations.size(); i++) { + try { + bulkOperations.get(i) + .setUriQuery(dbEngine.getQueryBuilder().createQueryFromURI(bulkOperations.get(i).getUri())); + } catch (AAIException e) { + throw new AAIException(e.getCode(), "Error with operation " + i + ": " + e.getMessage()); + } catch (UnsupportedEncodingException e) { + throw new AAIException("AAI_3000", "Error with operation " + i + ": " + e.getMessage()); + } + } + } + + /** + * Sets the introspector for each bulk operation. requires that uriquery is set per operation + * + * @param bulkOperations operations to generate introspector for + * @param loader Loader for generating introspector + * @throws AAIException thrown for issues with generating introspector + */ + private void populateIntrospectors(List bulkOperations, Loader loader) throws AAIException { + + final String objectUnMarshallMsg = "Body of operation %s could not be unmarshalled: %s"; + Introspector obj; + for (int i = 0; i < bulkOperations.size(); i++) { + BulkOperation bulkOperation = bulkOperations.get(i); + try { + if (bulkOperation.getHttpMethod().equals(HttpMethod.PUT_EDGE) + || bulkOperation.getHttpMethod().equals(HttpMethod.DELETE_EDGE)) { + obj = loader.unmarshal("relationship", bulkOperation.getRawReq(), MediaType.APPLICATION_JSON_TYPE); + bulkOperation.setIntrospector(obj); + } else { + String objName = bulkOperation.getUriQuery().getResultType(); + if (bulkOperation.getHttpMethod().equals(HttpMethod.DELETE)) { + obj = loader.introspectorFromName(objName); + } else { + obj = loader.unmarshal(objName, bulkOperation.getRawReq(), MediaType.APPLICATION_JSON_TYPE); + this.validateIntrospector(obj, loader, bulkOperation.getUri(), bulkOperation.getHttpMethod()); + } + bulkOperation.setIntrospector(obj); + } + } catch (UnsupportedEncodingException e) { + throw new AAIException("AAI_3000", String.format(objectUnMarshallMsg, i, bulkOperation.getRawReq())); + } + } + + } + + /** + * Sets the allowedOperationCount to one of the following + * - Integer.MAX_VALUE if override limit is configured + * - Property in aaiconfig + * - 30 by default + * + * @param headers request header + */ + private void setOperationCount(HttpHeaders headers) { + try { + String overrideLimit = headers.getRequestHeaders().getFirst("X-OverrideLimit"); + boolean isOverride = overrideLimit != null + && !AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_OVERRIDE_LIMIT).equals("false") + && overrideLimit.equals(AAIConfig.get(AAIConstants.AAI_BULKCONSUMER_OVERRIDE_LIMIT)); + if (isOverride) { + allowedOperationCount = Integer.MAX_VALUE; + } else { + allowedOperationCount = AAIConfig.getInt(AAIConstants.AAI_BULKCONSUMER_LIMIT); + } + } catch (AAIException e) { + allowedOperationCount = 30; + } + } + + /** + * Converts the request transaction into a list of bulk operations + * + * @param transaction transaction to extract bulk operations from + * @return list of bulk operations + */ + private List generateBulkOperations(Transaction transaction) { + List bulkOperations = new ArrayList<>(transaction.getOperations().size()); + + BulkOperation bulkOperation; + for (Operation operation : transaction.getOperations()) { + bulkOperation = new BulkOperation(); + UriComponents uriComponents = UriComponentsBuilder.fromUriString(getUri(operation)).build(); + bulkOperation.setUri(UriBuilder.fromPath(uriComponents.getPath()).build()); + bulkOperation.addUriInfoQueryParams(uriComponents.getQueryParams()); + bulkOperation.setHttpMethod(getHttpMethod(operation.getAction(), bulkOperation.getUri())); + bulkOperation.setRawReq(operation.getBody().toString()); + bulkOperations.add(bulkOperation); + } + + return bulkOperations; + } + + private String getUri(Operation operation) { + String uri = operation.getUri(); + if (uri == null || uri.isEmpty()) { + return uri; + } else if (uri.charAt(0) != '/') { + uri = '/' + uri; + } + return uri.replaceAll("^" + uriPrefix + "/v\\d+", ""); + } + + /** + * Map action to httpmethod + * + * @param action action to be mapped + * @param uri uri of the action + * @return HttpMethod thats action/uri maps to + */ + private HttpMethod getHttpMethod(String action, URI uri) { + HttpMethod method = HttpMethod.GET; + switch (action) { + case "put": + method = HttpMethod.PUT; + break; + case "delete": + method = HttpMethod.DELETE; + break; + case "patch": + method = HttpMethod.MERGE_PATCH; + break; + } + if (uri.getPath().endsWith("/relationship-list/relationship")) { + if (method.equals(HttpMethod.PUT)) { + method = HttpMethod.PUT_EDGE; + } else if (method.equals(HttpMethod.DELETE)) { + method = HttpMethod.DELETE_EDGE; + } + } + + return method; + } + + /** + * For each operation validates: + * - action is provided and correct. + * - uri exists + * - body exists + * + * @param transaction parsed payload + * @throws AAIException with the violations in the msg + */ + private void validate(Transaction transaction) throws AAIException { + if (transaction == null) { + throw new AAIException("AAI_6111", "input payload does not follow /bulk/single-transaction interface"); + } + + if (transaction.getOperations() == null || transaction.getOperations().isEmpty()) { + throw new AAIException("AAI_6118", " Payload has no objects to operate on"); + } else if (transaction.getOperations().size() > allowedOperationCount) { + throw new AAIException("AAI_6147", " Allowed limit = " + allowedOperationCount); + } + + final String missingFieldMsgFormat = "Operation %s missing '%s'"; + final String invalidActionMsgFormat = "Operation %s has invalid action '%s'"; + List msgs = new ArrayList<>(); + for (int i = 0; i < transaction.getOperations().size(); i++) { + final Operation operation = transaction.getOperations().get(i); + if (operation.getAction() == null || operation.getAction().isEmpty()) { + msgs.add(String.format(missingFieldMsgFormat, i, "action")); + } else if (!validOperations.contains(operation.getAction())) { + msgs.add(String.format(invalidActionMsgFormat, i, operation.getAction())); + } + if (operation.getUri() == null || operation.getUri().isEmpty()) { + msgs.add(String.format(missingFieldMsgFormat, i, "uri")); + } + if (operation.getBody() == null) { + msgs.add(String.format(missingFieldMsgFormat, i, "body")); + } + } + if (!msgs.isEmpty()) { + throw new AAIException("AAI_6111", + "input payload missing required properties. [" + String.join(", ", msgs) + "]"); + } + + } + + protected boolean enableResourceVersion() { + return true; + } + + /** + * Consumer exception response generator. + * + * @param headers the headers + * @param info the info + * @param action type of request + * @param e the e + * @return the response + */ + protected Response consumerExceptionResponseGenerator(HttpHeaders headers, UriInfo info, String action, + AAIException e) { + ArrayList templateVars = new ArrayList<>(); + templateVars.add(action); // GET, PUT, etc + templateVars.add(info.getPath()); + templateVars.addAll(e.getTemplateVars()); + + ErrorLogHelper.logException(e); + return Response + .status(e.getErrorObject().getHTTPResponseCode()).entity(ErrorLogHelper + .getRESTAPIErrorResponseWithLogging(headers.getAcceptableMediaTypes(), e, templateVars)) + .build(); + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkUriInfo.java b/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkUriInfo.java index 50b218f..c1e33eb 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkUriInfo.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/bulk/BulkUriInfo.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk; import java.net.URI; @@ -24,107 +25,106 @@ import java.util.List; import javax.ws.rs.core.*; - public class BulkUriInfo implements UriInfo { - - private MultivaluedMap queryParams= new MultivaluedHashMap<>(); - - @Override - public String getPath() { - return null; - } - - @Override - public String getPath(boolean decode) { - return null; - } - - @Override - public List getPathSegments() { - return null; - } - - @Override - public List getPathSegments(boolean decode) { - return null; - } - - @Override - public URI getRequestUri() { - return null; - } - - @Override - public UriBuilder getRequestUriBuilder() { - return null; - } - - @Override - public URI getAbsolutePath() { - return null; - } - - @Override - public UriBuilder getAbsolutePathBuilder() { - return null; - } - - @Override - public URI getBaseUri() { - return null; - } - - @Override - public UriBuilder getBaseUriBuilder() { - return null; - } - - @Override - public MultivaluedMap getPathParameters() { - return null; - } - - @Override - public MultivaluedMap getPathParameters(boolean decode) { - return null; - } - - @Override - public MultivaluedMap getQueryParameters() { - return this.queryParams; - } - - @Override - public MultivaluedMap getQueryParameters(boolean decode) { - return this.queryParams; - } - - @Override - public List getMatchedURIs() { - return null; - } - - @Override - public List getMatchedURIs(boolean decode) { - return null; - } - - @Override - public List getMatchedResources() { - return null; - } - - @Override - public URI resolve(URI uri) { - return null; - } - - @Override - public URI relativize(URI uri) { - return null; - } - - public void addParams(String key, List list) { - this.queryParams.put(key, list); - } + + private MultivaluedMap queryParams = new MultivaluedHashMap<>(); + + @Override + public String getPath() { + return null; + } + + @Override + public String getPath(boolean decode) { + return null; + } + + @Override + public List getPathSegments() { + return null; + } + + @Override + public List getPathSegments(boolean decode) { + return null; + } + + @Override + public URI getRequestUri() { + return null; + } + + @Override + public UriBuilder getRequestUriBuilder() { + return null; + } + + @Override + public URI getAbsolutePath() { + return null; + } + + @Override + public UriBuilder getAbsolutePathBuilder() { + return null; + } + + @Override + public URI getBaseUri() { + return null; + } + + @Override + public UriBuilder getBaseUriBuilder() { + return null; + } + + @Override + public MultivaluedMap getPathParameters() { + return null; + } + + @Override + public MultivaluedMap getPathParameters(boolean decode) { + return null; + } + + @Override + public MultivaluedMap getQueryParameters() { + return this.queryParams; + } + + @Override + public MultivaluedMap getQueryParameters(boolean decode) { + return this.queryParams; + } + + @Override + public List getMatchedURIs() { + return null; + } + + @Override + public List getMatchedURIs(boolean decode) { + return null; + } + + @Override + public List getMatchedResources() { + return null; + } + + @Override + public URI resolve(URI uri) { + return null; + } + + @Override + public URI relativize(URI uri) { + return null; + } + + public void addParams(String key, List list) { + this.queryParams.put(key, list); + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/Operation.java b/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/Operation.java index 183f0ad..814cea0 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/Operation.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/Operation.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk.pojos; import com.google.gson.*; diff --git a/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/OperationResponse.java b/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/OperationResponse.java index 007e434..95a6f2b 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/OperationResponse.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/OperationResponse.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk.pojos; import com.google.gson.JsonObject; diff --git a/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/Transaction.java b/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/Transaction.java index 20329d7..6ce0dc8 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/Transaction.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/Transaction.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk.pojos; import com.google.gson.annotations.SerializedName; diff --git a/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/TransactionResponse.java b/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/TransactionResponse.java index ce5462c..035ab06 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/TransactionResponse.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/bulk/pojos/TransactionResponse.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk.pojos; import com.google.gson.annotations.SerializedName; diff --git a/aai-resources/src/main/java/org/onap/aai/rest/exceptions/AAIInvalidXMLNamespace.java b/aai-resources/src/main/java/org/onap/aai/rest/exceptions/AAIInvalidXMLNamespace.java index 5c4d9b0..e0bc148 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/exceptions/AAIInvalidXMLNamespace.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/exceptions/AAIInvalidXMLNamespace.java @@ -17,23 +17,24 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.exceptions; import org.onap.aai.exceptions.AAIException; public class AAIInvalidXMLNamespace extends AAIException { - - private static final long serialVersionUID = 7487333042291858169L; - public AAIInvalidXMLNamespace(String message) { - super("AAI_3011", message); - } + private static final long serialVersionUID = 7487333042291858169L; + + public AAIInvalidXMLNamespace(String message) { + super("AAI_3011", message); + } - public AAIInvalidXMLNamespace(Throwable cause) { - super("AAI_3011",cause); - } + public AAIInvalidXMLNamespace(Throwable cause) { + super("AAI_3011", cause); + } - public AAIInvalidXMLNamespace(String message, Throwable cause) { - super("AAI_3011", cause, message); - } + public AAIInvalidXMLNamespace(String message, Throwable cause) { + super("AAI_3011", cause, message); + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/security/WebSecurityConfig.java b/aai-resources/src/main/java/org/onap/aai/rest/security/WebSecurityConfig.java index 127a490..ca303b1 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/security/WebSecurityConfig.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/security/WebSecurityConfig.java @@ -21,6 +21,7 @@ * SPDX-License-Identifier: Apache-2.0 * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.security; import org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver; @@ -48,10 +49,8 @@ public class WebSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { @Autowired public void configureGlobal(AuthenticationManagerBuilder auth) { - KeycloakAuthenticationProvider keycloakAuthenticationProvider - = keycloakAuthenticationProvider(); - keycloakAuthenticationProvider.setGrantedAuthoritiesMapper( - new SimpleAuthorityMapper()); + KeycloakAuthenticationProvider keycloakAuthenticationProvider = keycloakAuthenticationProvider(); + keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper()); auth.authenticationProvider(keycloakAuthenticationProvider); } @@ -63,16 +62,13 @@ public class WebSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { @Bean @Override protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { - return new RegisterSessionAuthenticationStrategy( - new SessionRegistryImpl()); + return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } @Override protected void configure(HttpSecurity http) throws Exception { super.configure(http); - http.authorizeRequests() - .antMatchers("/**") - .permitAll().and().csrf().disable(); + http.authorizeRequests().antMatchers("/**").permitAll().and().csrf().disable(); } @Override @@ -80,5 +76,4 @@ public class WebSecurityConfig extends KeycloakWebSecurityConfigurerAdapter { web.ignoring().regexMatchers("^.*/util/echo$"); } - } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/util/EchoResponse.java b/aai-resources/src/main/java/org/onap/aai/rest/util/EchoResponse.java index 8b5eef6..8a66809 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/util/EchoResponse.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/util/EchoResponse.java @@ -22,6 +22,7 @@ package org.onap.aai.rest.util; import java.util.ArrayList; import java.util.HashMap; + import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -32,6 +33,7 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; + import org.apache.commons.lang3.BooleanUtils; import org.onap.aai.exceptions.AAIException; import org.onap.aai.logging.ErrorLogHelper; @@ -66,16 +68,16 @@ public class EchoResponse extends RESTAPI { * data store. * If there is no query string, no transacction logging is done to hbase. * - * @param headers the headers - * @param req the req + * @param headers the headers + * @param req the req * @param myAction if exists will cause transaction to be logged to hbase * @return the response */ @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) @Path("/echo") - public Response echoResult( - @Context HttpHeaders headers, @Context HttpServletRequest req, @QueryParam("action") String myAction) { + public Response echoResult(@Context HttpHeaders headers, @Context HttpServletRequest req, + @QueryParam("action") String myAction) { String fromAppId; String transId; @@ -95,8 +97,8 @@ public class EchoResponse extends RESTAPI { templateVars.add(transId); try { - if (CHECK_DB_STATUS_ACTION.equalsIgnoreCase(myAction) || - CHECK_DB_STATUS_NOW_ACTION.equalsIgnoreCase(myAction)) { + if (CHECK_DB_STATUS_ACTION.equalsIgnoreCase(myAction) + || CHECK_DB_STATUS_NOW_ACTION.equalsIgnoreCase(myAction)) { validateDBStatus(myAction); } return generateSuccessResponse(headers, templateVars); @@ -114,7 +116,7 @@ public class EchoResponse extends RESTAPI { /** * Validates if Janus Graph can process request using AAIGraphChecker. * - * @param action expected input values 'checkDB' 'checkDBNow' + * @param action expected input values 'checkDB' 'checkDBNow' * @throws AAIException exception thrown if DB is not available */ private void validateDBStatus(String action) throws AAIException { @@ -138,17 +140,15 @@ public class EchoResponse extends RESTAPI { HashMap> exceptionList = new HashMap<>(); exceptionList.put(new AAIException("AAI_0002", "OK"), templateVariables); return Response.status(Status.OK) - .entity( - ErrorLogHelper.getRESTAPIInfoResponse(headers.getAcceptableMediaTypes(), exceptionList)).build(); + .entity(ErrorLogHelper.getRESTAPIInfoResponse(headers.getAcceptableMediaTypes(), exceptionList)) + .build(); } private Response generateFailureResponse(HttpHeaders headers, ArrayList templateVariables, - AAIException aaiException) { - return Response.status(aaiException.getErrorObject().getHTTPResponseCode()) - .entity( - ErrorLogHelper.getRESTAPIErrorResponseWithLogging( - headers.getAcceptableMediaTypes(), aaiException, templateVariables)) - .build(); + AAIException aaiException) { + return Response.status(aaiException.getErrorObject().getHTTPResponseCode()).entity(ErrorLogHelper + .getRESTAPIErrorResponseWithLogging(headers.getAcceptableMediaTypes(), aaiException, templateVariables)) + .build(); } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/util/LogFormatTools.java b/aai-resources/src/main/java/org/onap/aai/rest/util/LogFormatTools.java index 931ab0b..0ce54a8 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/util/LogFormatTools.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/util/LogFormatTools.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.util; import java.time.ZoneOffset; @@ -25,11 +26,10 @@ import java.time.format.DateTimeFormatter; public class LogFormatTools { - private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; - private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern(DATE_FORMAT) - .withZone(ZoneOffset.UTC); - - public static String getCurrentDateTime() { - return DTF.format(ZonedDateTime.now()); - } + private static final String DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss.SSSZ"; + private static final DateTimeFormatter DTF = DateTimeFormatter.ofPattern(DATE_FORMAT).withZone(ZoneOffset.UTC); + + public static String getCurrentDateTime() { + return DTF.format(ZonedDateTime.now()); + } } diff --git a/aai-resources/src/main/java/org/onap/aai/rest/util/ValidateEncoding.java b/aai-resources/src/main/java/org/onap/aai/rest/util/ValidateEncoding.java index 7d04bf7..520bff0 100644 --- a/aai-resources/src/main/java/org/onap/aai/rest/util/ValidateEncoding.java +++ b/aai-resources/src/main/java/org/onap/aai/rest/util/ValidateEncoding.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.util; import java.io.UnsupportedEncodingException; @@ -32,131 +33,132 @@ import org.springframework.web.util.UriUtils; */ public class ValidateEncoding { - private final String encoding = "UTF-8"; - - /** - * Instantiates a new validate encoding. - */ - private ValidateEncoding() { - - } - - /** - * The Class Helper. - */ - private static class Helper { - - /** The Constant INSTANCE. */ - private static final ValidateEncoding INSTANCE = new ValidateEncoding(); - } - - /** - * Gets the single instance of ValidateEncoding. - * - * @return single instance of ValidateEncoding - */ - public static ValidateEncoding getInstance() { - return Helper.INSTANCE; - } - - /** - * Validate. - * - * @param uri the uri - * @return true, if successful - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - public boolean validate(URI uri) throws UnsupportedEncodingException { - boolean result = true; - if (!validatePath(uri.getRawPath())) { - result = false; - } - /*if (!validateQueryParams(uri.getRawQuery())) { - result = false; - } //TODO - */ - - return result; - } - - /** - * Validate. - * - * @param info the info - * @return true, if successful - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - public boolean validate(UriInfo info) throws UnsupportedEncodingException { - boolean result = true; - if (!validatePath(info.getPath(false))) { - result = false; - } - if (!validateQueryParams(info.getQueryParameters(false))) { - result = false; - } - - return result; - } - - /** - * Validate path. - * - * @param path the path - * @return true, if successful - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - private boolean validatePath(String path) throws UnsupportedEncodingException { - String[] segments = path.split("/"); - boolean valid = true; - for (String segment : segments) { - if (!this.checkEncoding(segment)) { - valid = false; - } - } - - return valid; - - } - - /** - * Validate query params. - * - * @param params the params - * @return true, if successful - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - private boolean validateQueryParams(MultivaluedMap params) throws UnsupportedEncodingException { - boolean valid = true; - - for (String key : params.keySet()) { - if (!this.checkEncoding(key)) { - valid = false; - } - for (String item : params.get(key)) { - if(item.contains("+")){ - item = item.replaceAll("\\+", "%20"); - } - if (!this.checkEncoding(item)) { - valid = false; - } - } - } - return valid; - } - - /** - * Check encoding. - * - * @param segment the segment - * @return true, if successful - * @throws UnsupportedEncodingException the unsupported encoding exception - */ - private boolean checkEncoding(String segment) throws UnsupportedEncodingException { - boolean result = false; - String decode = UriUtils.decode(segment, encoding); - String encode = UriUtils.encode(decode, encoding); - result = segment.equals(encode); - - return result; - } + private final String encoding = "UTF-8"; + + /** + * Instantiates a new validate encoding. + */ + private ValidateEncoding() { + + } + + /** + * The Class Helper. + */ + private static class Helper { + + /** The Constant INSTANCE. */ + private static final ValidateEncoding INSTANCE = new ValidateEncoding(); + } + + /** + * Gets the single instance of ValidateEncoding. + * + * @return single instance of ValidateEncoding + */ + public static ValidateEncoding getInstance() { + return Helper.INSTANCE; + } + + /** + * Validate. + * + * @param uri the uri + * @return true, if successful + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + public boolean validate(URI uri) throws UnsupportedEncodingException { + boolean result = true; + if (!validatePath(uri.getRawPath())) { + result = false; + } + /* + * if (!validateQueryParams(uri.getRawQuery())) { + * result = false; + * } //TODO + */ + + return result; + } + + /** + * Validate. + * + * @param info the info + * @return true, if successful + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + public boolean validate(UriInfo info) throws UnsupportedEncodingException { + boolean result = true; + if (!validatePath(info.getPath(false))) { + result = false; + } + if (!validateQueryParams(info.getQueryParameters(false))) { + result = false; + } + + return result; + } + + /** + * Validate path. + * + * @param path the path + * @return true, if successful + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + private boolean validatePath(String path) throws UnsupportedEncodingException { + String[] segments = path.split("/"); + boolean valid = true; + for (String segment : segments) { + if (!this.checkEncoding(segment)) { + valid = false; + } + } + + return valid; + + } + + /** + * Validate query params. + * + * @param params the params + * @return true, if successful + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + private boolean validateQueryParams(MultivaluedMap params) throws UnsupportedEncodingException { + boolean valid = true; + + for (String key : params.keySet()) { + if (!this.checkEncoding(key)) { + valid = false; + } + for (String item : params.get(key)) { + if (item.contains("+")) { + item = item.replaceAll("\\+", "%20"); + } + if (!this.checkEncoding(item)) { + valid = false; + } + } + } + return valid; + } + + /** + * Check encoding. + * + * @param segment the segment + * @return true, if successful + * @throws UnsupportedEncodingException the unsupported encoding exception + */ + private boolean checkEncoding(String segment) throws UnsupportedEncodingException { + boolean result = false; + String decode = UriUtils.decode(segment, encoding); + String encode = UriUtils.encode(decode, encoding); + result = segment.equals(encode); + + return result; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/service/AuthorizationService.java b/aai-resources/src/main/java/org/onap/aai/service/AuthorizationService.java index 9b5a614..a5eca4e 100644 --- a/aai-resources/src/main/java/org/onap/aai/service/AuthorizationService.java +++ b/aai-resources/src/main/java/org/onap/aai/service/AuthorizationService.java @@ -17,17 +17,9 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.service; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.eclipse.jetty.util.security.Password; -import org.onap.aai.Profiles; -import org.onap.aai.util.AAIConstants; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Service; +package org.onap.aai.service; -import javax.annotation.PostConstruct; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.nio.file.Files; @@ -37,6 +29,16 @@ import java.util.HashMap; import java.util.Map; import java.util.stream.Stream; +import javax.annotation.PostConstruct; + +import org.eclipse.jetty.util.security.Password; +import org.onap.aai.Profiles; +import org.onap.aai.util.AAIConstants; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Service; + @Profile(Profiles.ONE_WAY_SSL) @Service public class AuthorizationService { @@ -48,37 +50,38 @@ public class AuthorizationService { private static final Base64.Encoder ENCODER = Base64.getEncoder(); @PostConstruct - public void init(){ + public void init() { String basicAuthFile = getBasicAuthFilePath(); - try(Stream stream = Files.lines(Paths.get(basicAuthFile))){ + try (Stream stream = Files.lines(Paths.get(basicAuthFile))) { stream.filter(line -> !line.startsWith("#")).forEach(str -> { - byte [] bytes = null; + byte[] bytes = null; String usernamePassword = null; String accessType = null; try { - String [] userAccessType = str.split(","); + String[] userAccessType = str.split(","); - if(userAccessType == null || userAccessType.length != 2){ - throw new RuntimeException("Please check the realm.properties file as it is not conforming to the basic auth"); + if (userAccessType == null || userAccessType.length != 2) { + throw new RuntimeException( + "Please check the realm.properties file as it is not conforming to the basic auth"); } usernamePassword = userAccessType[0]; - accessType = userAccessType[1]; + accessType = userAccessType[1]; String[] usernamePasswordArray = usernamePassword.split(":"); - if(usernamePasswordArray == null || usernamePasswordArray.length != 3){ + if (usernamePasswordArray == null || usernamePasswordArray.length != 3) { throw new RuntimeException("This username / pwd is not a valid entry in realm.properties"); } String username = usernamePasswordArray[0]; String password = null; - if(str.contains("OBF:")){ + if (str.contains("OBF:")) { password = usernamePasswordArray[1] + ":" + usernamePasswordArray[2]; password = Password.deobfuscate(password); } @@ -87,8 +90,7 @@ public class AuthorizationService { authorizedUsers.put(new String(bytes), accessType); - } catch (UnsupportedEncodingException e) - { + } catch (UnsupportedEncodingException e) { logger.error("Unable to support the encoding of the file" + basicAuthFile); } @@ -99,11 +101,11 @@ public class AuthorizationService { } } - public boolean checkIfUserAuthorized(String authorization){ + public boolean checkIfUserAuthorized(String authorization) { return authorizedUsers.containsKey(authorization) && "admin".equals(authorizedUsers.get(authorization)); } - public String getBasicAuthFilePath(){ + public String getBasicAuthFilePath() { return AAIConstants.AAI_HOME_ETC_AUTH + AAIConstants.AAI_FILESEP + "realm.properties"; } } diff --git a/aai-resources/src/main/java/org/onap/aai/service/RetiredService.java b/aai-resources/src/main/java/org/onap/aai/service/RetiredService.java index 5989e31..506a097 100644 --- a/aai-resources/src/main/java/org/onap/aai/service/RetiredService.java +++ b/aai-resources/src/main/java/org/onap/aai/service/RetiredService.java @@ -17,18 +17,20 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.service; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.PropertySource; -import org.springframework.stereotype.Service; +package org.onap.aai.service; -import javax.annotation.PostConstruct; import java.util.Arrays; import java.util.List; import java.util.regex.Pattern; import java.util.stream.Collectors; +import javax.annotation.PostConstruct; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.PropertySource; +import org.springframework.stereotype.Service; + @Service @PropertySource("classpath:retired.properties") @PropertySource(value = "file:${server.local.startpath}/retired.properties") @@ -42,26 +44,28 @@ public class RetiredService { private List retiredAllVersionList; @PostConstruct - public void initialize(){ - this.retiredPatternsList = Arrays.stream(retiredPatterns.split(",")).map(Pattern::compile).collect(Collectors.toList()); - this.retiredAllVersionList = Arrays.stream(retiredAllVersions.split(",")).map(Pattern::compile).collect(Collectors.toList()); + public void initialize() { + this.retiredPatternsList = + Arrays.stream(retiredPatterns.split(",")).map(Pattern::compile).collect(Collectors.toList()); + this.retiredAllVersionList = + Arrays.stream(retiredAllVersions.split(",")).map(Pattern::compile).collect(Collectors.toList()); } @Value("${retired.api.pattern.list}") - public void setRetiredPatterns(String retiredPatterns){ + public void setRetiredPatterns(String retiredPatterns) { this.retiredPatterns = retiredPatterns; } - public List getRetiredPatterns(){ + public List getRetiredPatterns() { return retiredPatternsList; } @Value("${retired.api.all.versions}") - public void setRetiredAllVersions(String retiredPatterns){ + public void setRetiredAllVersions(String retiredPatterns) { this.retiredAllVersions = retiredPatterns; } - public List getRetiredAllVersionList(){ + public List getRetiredAllVersionList() { return retiredAllVersionList; } } diff --git a/aai-resources/src/main/java/org/onap/aai/tasks/AaiGraphChecker.java b/aai-resources/src/main/java/org/onap/aai/tasks/AaiGraphChecker.java index d1ea478..3c07a52 100644 --- a/aai-resources/src/main/java/org/onap/aai/tasks/AaiGraphChecker.java +++ b/aai-resources/src/main/java/org/onap/aai/tasks/AaiGraphChecker.java @@ -19,11 +19,14 @@ package org.onap.aai.tasks; import com.google.common.collect.Iterators; + import java.util.Iterator; import java.util.Timer; import java.util.TimerTask; + import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; + import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.Validate; import org.janusgraph.core.JanusGraphException; @@ -65,8 +68,7 @@ public class AaiGraphChecker extends TimerTask { * Enumeration of check type that can be made. */ public enum CheckerType { - ACTUAL, - CACHED + ACTUAL, CACHED } private AaiGraphChecker() { @@ -75,20 +77,13 @@ public class AaiGraphChecker extends TimerTask { @PostConstruct private void setupTimer() { - boolean scheduleEnabled = - Boolean.parseBoolean( - getConfigurationValueOrDefault( - "aai.graph.checker.task.enabled", DEFAULT_SCHEDULE_ENABLED_VALUE)); - long scheduleDelay = - Long.parseLong( - getConfigurationValueOrDefault( - "aai.graph.checker.task.delay", DEFAULT_SCHEDULE_DELAY_VALUE)); - long schedulePeriod = - Long.parseLong( - getConfigurationValueOrDefault( - "aai.graph.checker.task.period", DEFAULT_SCHEDULE_PERIOD_VALUE)); - LOGGER.debug( - "Setting up AaiGraphChecker with scheduleEnabled={}, scheduleDelay={}, schedulePeriod={} ", + boolean scheduleEnabled = Boolean.parseBoolean( + getConfigurationValueOrDefault("aai.graph.checker.task.enabled", DEFAULT_SCHEDULE_ENABLED_VALUE)); + long scheduleDelay = Long.parseLong( + getConfigurationValueOrDefault("aai.graph.checker.task.delay", DEFAULT_SCHEDULE_DELAY_VALUE)); + long schedulePeriod = Long.parseLong( + getConfigurationValueOrDefault("aai.graph.checker.task.period", DEFAULT_SCHEDULE_PERIOD_VALUE)); + LOGGER.debug("Setting up AaiGraphChecker with scheduleEnabled={}, scheduleDelay={}, schedulePeriod={} ", scheduleEnabled, scheduleDelay, schedulePeriod); if (scheduleEnabled) { @@ -120,11 +115,12 @@ public class AaiGraphChecker extends TimerTask { /** * Indicate if AAI Graph database is available either from actual db connection or from cached property state. + * * @param checkerType the type of check to be made (actual or cached). Null is not supported. * @return - *
  • true, if database is available
  • - *
  • false, if database is NOT available
  • - *
  • null, if database availability can not be determined
  • + *
  • true, if database is available
  • + *
  • false, if database is NOT available
  • + *
  • null, if database availability can not be determined
  • */ public Boolean isAaiGraphDbAvailable(CheckerType checkerType) { Validate.notNull(checkerType); @@ -169,7 +165,7 @@ public class AaiGraphChecker extends TimerTask { dbAvailable = null; } finally { if (transaction != null && !transaction.isClosed()) { - //check if transaction is open then close instead of flag + // check if transaction is open then close instead of flag try { transaction.rollback(); } catch (Exception e) { @@ -197,8 +193,7 @@ public class AaiGraphChecker extends TimerTask { try { result = AAIConfig.get(property); } catch (AAIException e) { - LOGGER.error( - "Unable to get defined configuration value for '{}' property, then default '{}' value is used", + LOGGER.error("Unable to get defined configuration value for '{}' property, then default '{}' value is used", property, defaultValue); result = defaultValue; } diff --git a/aai-resources/src/main/java/org/onap/aai/util/PositiveNumValidator.java b/aai-resources/src/main/java/org/onap/aai/util/PositiveNumValidator.java index ee58f55..609d84b 100644 --- a/aai-resources/src/main/java/org/onap/aai/util/PositiveNumValidator.java +++ b/aai-resources/src/main/java/org/onap/aai/util/PositiveNumValidator.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.util; import com.beust.jcommander.IParameterValidator; @@ -24,12 +25,12 @@ import com.beust.jcommander.ParameterException; public class PositiveNumValidator implements IParameterValidator { - @Override - public void validate(String name, String value) throws ParameterException { - int num = Integer.parseInt(value); + @Override + public void validate(String name, String value) throws ParameterException { + int num = Integer.parseInt(value); - if(num < 0) { - throw new ParameterException("Parameter " + name + " should be >= 0"); - } - } -} \ No newline at end of file + if (num < 0) { + throw new ParameterException("Parameter " + name + " should be >= 0"); + } + } +} diff --git a/aai-resources/src/main/java/org/onap/aai/web/JerseyConfiguration.java b/aai-resources/src/main/java/org/onap/aai/web/JerseyConfiguration.java index 80b542b..c1dc10e 100644 --- a/aai-resources/src/main/java/org/onap/aai/web/JerseyConfiguration.java +++ b/aai-resources/src/main/java/org/onap/aai/web/JerseyConfiguration.java @@ -17,21 +17,25 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.web; import static java.lang.Boolean.parseBoolean; import static java.util.Comparator.comparingInt; import com.google.common.collect.Sets; +import com.sun.jersey.api.client.filter.LoggingFilter; + import java.lang.reflect.AnnotatedElement; import java.util.Collection; import java.util.Comparator; import java.util.Set; import java.util.logging.Logger; + import javax.annotation.Priority; import javax.ws.rs.container.ContainerRequestFilter; import javax.ws.rs.container.ContainerResponseFilter; -import com.sun.jersey.api.client.filter.LoggingFilter; + import org.glassfish.jersey.server.ResourceConfig; import org.onap.aai.rest.BulkAddConsumer; import org.onap.aai.rest.BulkProcessConsumer; @@ -72,18 +76,12 @@ public class JerseyConfiguration { public ResourceConfig resourceConfig() { ResourceConfig resourceConfig = new ResourceConfig(); - Set> classes = Sets.newHashSet( - EchoResponse.class, - VertexIdConsumer.class, - ExampleConsumer.class, - BulkAddConsumer.class, - BulkProcessConsumer.class, - BulkSingleTransactionConsumer.class, - LegacyMoxyConsumer.class, - URLFromVertexIdConsumer.class - ); + Set> classes = Sets.newHashSet(EchoResponse.class, VertexIdConsumer.class, ExampleConsumer.class, + BulkAddConsumer.class, BulkProcessConsumer.class, BulkSingleTransactionConsumer.class, + LegacyMoxyConsumer.class, URLFromVertexIdConsumer.class); resourceConfig.registerClasses(classes); - registerFiltersForClasses(resourceConfig, ContainerRequestFilter.class, ContainerResponseFilter.class, AuditLogContainerFilter.class); + registerFiltersForClasses(resourceConfig, ContainerRequestFilter.class, ContainerResponseFilter.class, + AuditLogContainerFilter.class); if (isLoggingEnabled()) { logRequests(resourceConfig); @@ -103,10 +101,8 @@ public class JerseyConfiguration { filters.addAll(reflections.getSubTypesOf(clazz)); throwIfPriorityAnnotationAbsent(filters); - filters.stream() - .filter(this::isEnabledByActiveProfiles) - .sorted(priorityComparator()) - .forEach(resourceConfig::register); + filters.stream().filter(this::isEnabledByActiveProfiles).sorted(priorityComparator()) + .forEach(resourceConfig::register); } private void throwIfPriorityAnnotationAbsent(Collection> classes) { @@ -130,8 +126,8 @@ public class JerseyConfiguration { } private boolean isEnabledByActiveProfiles(AnnotatedElement annotatedElement) { - return !annotatedElement.isAnnotationPresent(Profile.class) || - environment.acceptsProfiles(annotatedElement.getAnnotation(Profile.class).value()); + return !annotatedElement.isAnnotationPresent(Profile.class) + || environment.acceptsProfiles(annotatedElement.getAnnotation(Profile.class).value()); } private class MissingFilterPriorityException extends RuntimeException { @@ -139,4 +135,4 @@ public class JerseyConfiguration { super("Container filter " + clazz.getName() + " does not have @Priority annotation"); } } -} \ No newline at end of file +} diff --git a/aai-resources/src/main/java/org/onap/aai/web/LocalHostAccessLog.java b/aai-resources/src/main/java/org/onap/aai/web/LocalHostAccessLog.java index 8faf828..8d63137 100644 --- a/aai-resources/src/main/java/org/onap/aai/web/LocalHostAccessLog.java +++ b/aai-resources/src/main/java/org/onap/aai/web/LocalHostAccessLog.java @@ -17,9 +17,13 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.web; import ch.qos.logback.access.jetty.RequestLogImpl; + +import java.util.Arrays; + import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.server.handler.RequestLogHandler; import org.eclipse.jetty.util.thread.QueuedThreadPool; @@ -30,19 +34,16 @@ import org.springframework.boot.web.servlet.server.AbstractServletWebServerFacto import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import java.util.Arrays; - @Configuration public class LocalHostAccessLog { - @Bean - public AbstractServletWebServerFactory jettyConfigBean( + @Bean + public AbstractServletWebServerFactory jettyConfigBean( @Value("${jetty.threadPool.maxThreads:200}") final String maxThreads, - @Value("${jetty.threadPool.minThreads:8}") final String minThreads - ){ + @Value("${jetty.threadPool.minThreads:8}") final String minThreads) { - JettyServletWebServerFactory jef = new JettyServletWebServerFactory(); - jef.addServerCustomizers((JettyServerCustomizer) server -> { + JettyServletWebServerFactory jef = new JettyServletWebServerFactory(); + jef.addServerCustomizers((JettyServerCustomizer) server -> { HandlerCollection handlers = new HandlerCollection(); @@ -63,6 +64,6 @@ public class LocalHostAccessLog { threadPool.setMaxThreads(Integer.valueOf(maxThreads)); threadPool.setMinThreads(Integer.valueOf(minThreads)); }); - return jef; - } + return jef; + } } diff --git a/aai-resources/src/main/java/org/onap/aai/web/MicrometerConfiguration.java b/aai-resources/src/main/java/org/onap/aai/web/MicrometerConfiguration.java index bbe94fc..e41e6d0 100644 --- a/aai-resources/src/main/java/org/onap/aai/web/MicrometerConfiguration.java +++ b/aai-resources/src/main/java/org/onap/aai/web/MicrometerConfiguration.java @@ -17,14 +17,17 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.web; + import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Tags; import io.micrometer.jersey2.server.JerseyTags; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import io.micrometer.jersey2.server.JerseyTagsProvider; + import org.glassfish.jersey.server.ContainerResponse; import org.glassfish.jersey.server.monitoring.RequestEvent; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -32,9 +35,7 @@ import org.springframework.context.annotation.Configuration; * Configuration Class to add customized tags to http metrics scraped in /actuator/prometheus endpoint */ @Configuration -@ConditionalOnProperty( - value="scrape.uri.metrics", - havingValue = "true") +@ConditionalOnProperty(value = "scrape.uri.metrics", havingValue = "true") public class MicrometerConfiguration { private static final String TAG_AAI_URI = "aai_uri"; private static final String NOT_AVAILABLE = "NOT AVAILABLE"; @@ -45,9 +46,10 @@ public class MicrometerConfiguration { @Override public Iterable httpRequestTags(RequestEvent event) { ContainerResponse response = event.getContainerResponse(); - return Tags.of(JerseyTags.method(event.getContainerRequest()), - JerseyTags.exception(event), JerseyTags.status(response), JerseyTags.outcome(response), getAaiUriTag(event)); + return Tags.of(JerseyTags.method(event.getContainerRequest()), JerseyTags.exception(event), + JerseyTags.status(response), JerseyTags.outcome(response), getAaiUriTag(event)); } + private Tag getAaiUriTag(RequestEvent event) { String aai_uri = event.getUriInfo().getRequestUri().toString(); if (aai_uri == null) { @@ -55,10 +57,11 @@ public class MicrometerConfiguration { } return Tag.of(TAG_AAI_URI, aai_uri); } + @Override public Iterable httpLongRequestTags(RequestEvent event) { return Tags.of(JerseyTags.method(event.getContainerRequest()), JerseyTags.uri(event)); } }; } -} \ No newline at end of file +} diff --git a/aai-resources/src/main/java/org/onap/aai/web/WebConfiguration.java b/aai-resources/src/main/java/org/onap/aai/web/WebConfiguration.java index a716b33..35b3569 100644 --- a/aai-resources/src/main/java/org/onap/aai/web/WebConfiguration.java +++ b/aai-resources/src/main/java/org/onap/aai/web/WebConfiguration.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.web; import org.springframework.context.annotation.Bean; @@ -27,20 +28,16 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfiguration { - @Bean - public WebMvcConfigurer forwardToIndex() { - return new WebMvcConfigurer() { - @Override - public void addViewControllers(ViewControllerRegistry registry) { - registry.addViewController("/swagger").setViewName( - "redirect:/swagger/index.html"); - registry.addViewController("/swagger/").setViewName( - "redirect:/swagger/index.html"); - registry.addViewController("/docs").setViewName( - "redirect:/docs/html/index.html"); - registry.addViewController("/docs/").setViewName( - "redirect:/docs/html/index.html"); - } - }; - } -} \ No newline at end of file + @Bean + public WebMvcConfigurer forwardToIndex() { + return new WebMvcConfigurer() { + @Override + public void addViewControllers(ViewControllerRegistry registry) { + registry.addViewController("/swagger").setViewName("redirect:/swagger/index.html"); + registry.addViewController("/swagger/").setViewName("redirect:/swagger/index.html"); + registry.addViewController("/docs").setViewName("redirect:/docs/html/index.html"); + registry.addViewController("/docs/").setViewName("redirect:/docs/html/index.html"); + } + }; + } +} diff --git a/aai-resources/src/test/java/org/onap/aai/AAISetup.java b/aai-resources/src/test/java/org/onap/aai/AAISetup.java index dac7b60..8227d37 100644 --- a/aai-resources/src/test/java/org/onap/aai/AAISetup.java +++ b/aai-resources/src/test/java/org/onap/aai/AAISetup.java @@ -20,6 +20,12 @@ package org.onap.aai; +import static org.junit.Assert.assertNotNull; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + import org.apache.commons.io.IOUtils; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -40,46 +46,32 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.rules.SpringClassRule; import org.springframework.test.context.junit4.rules.SpringMethodRule; -import java.io.IOException; -import java.io.InputStream; -import java.util.Map; +@ContextConfiguration( + classes = {ConfigConfiguration.class, AAIConfigTranslator.class, NodeIngestor.class, EdgeIngestor.class, + EdgeSerializer.class, SpringContextAware.class, IntrospectionConfig.class, + XmlFormatTransformerConfiguration.class, RestBeanConfig.class}) +@TestPropertySource( + properties = {"schema.uri.base.path = /aai", + "schema.ingest.file = src/test/resources/application-test.properties"}) +public abstract class AAISetup { -import static org.junit.Assert.assertNotNull; + @Autowired + protected NodeIngestor nodeIngestor; -@ContextConfiguration(classes = { - ConfigConfiguration.class, - AAIConfigTranslator.class, - NodeIngestor.class, - EdgeIngestor.class, - EdgeSerializer.class, - SpringContextAware.class, - IntrospectionConfig.class, - XmlFormatTransformerConfiguration.class, - RestBeanConfig.class -}) -@TestPropertySource(properties = { - "schema.uri.base.path = /aai" , - "schema.ingest.file = src/test/resources/application-test.properties" -}) -public abstract class AAISetup { + @Autowired + protected LoaderFactory loaderFactory; + + @Autowired + protected Map moxyLoaderInstance; - @Autowired - protected NodeIngestor nodeIngestor; + @Autowired + protected HttpEntry traversalHttpEntry; - @Autowired - protected LoaderFactory loaderFactory; - - @Autowired - protected Map moxyLoaderInstance; - - @Autowired - protected HttpEntry traversalHttpEntry; - - @Autowired - protected HttpEntry traversalUriHttpEntry; + @Autowired + protected HttpEntry traversalUriHttpEntry; - @Autowired - protected SchemaVersions schemaVersions; + @Autowired + protected SchemaVersions schemaVersions; @ClassRule public static final SpringClassRule springClassRule = new SpringClassRule(); @@ -92,12 +84,10 @@ public abstract class AAISetup { System.setProperty("AJSC_HOME", "./"); System.setProperty("BUNDLECONFIG_DIR", "src/main/resources/"); } - + public String getPayload(String filename) throws IOException { - InputStream inputStream = getClass() - .getClassLoader() - .getResourceAsStream(filename); + InputStream inputStream = getClass().getClassLoader().getResourceAsStream(filename); String message = String.format("Unable to find the %s in src/test/resources", filename); assertNotNull(message, inputStream); diff --git a/aai-resources/src/test/java/org/onap/aai/HttpTestUtil.java b/aai-resources/src/test/java/org/onap/aai/HttpTestUtil.java index cc021bc..9235109 100644 --- a/aai-resources/src/test/java/org/onap/aai/HttpTestUtil.java +++ b/aai-resources/src/test/java/org/onap/aai/HttpTestUtil.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai; import static org.mockito.ArgumentMatchers.anyObject; @@ -73,13 +74,13 @@ public class HttpTestUtil extends RESTAPI { protected List outputMediaTypes; protected SchemaVersions schemaVersions; - public void init(){ + public void init() { - httpHeaders = Mockito.mock(HttpHeaders.class); - uriInfo = Mockito.mock(UriInfo.class); + httpHeaders = Mockito.mock(HttpHeaders.class); + uriInfo = Mockito.mock(UriInfo.class); - headersMultiMap = new MultivaluedHashMap<>(); - queryParameters = Mockito.spy(new MultivaluedHashMap<>()); + headersMultiMap = new MultivaluedHashMap<>(); + queryParameters = Mockito.spy(new MultivaluedHashMap<>()); headersMultiMap.add("X-FromAppId", "JUNIT"); headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); @@ -118,26 +119,26 @@ public class HttpTestUtil extends RESTAPI { uri = uri.replaceAll("/aai/", ""); logger.info("Starting the put request for the uri {} with payload {}", uri, payload); - String [] arr = uri.split("/"); + String[] arr = uri.split("/"); SchemaVersion version = null; - if(arr.length > 1){ - if(arr[0].matches("^v\\d+")){ + if (arr.length > 1) { + if (arr[0].matches("^v\\d+")) { version = new SchemaVersion(arr[0]); uri = uri.replaceAll("^v\\d+", ""); } } - if(version == null){ + if (version == null) { version = schemaVersions.getDefaultVersion(); } Mockito.when(uriInfo.getPath()).thenReturn(uri); HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalHttpEntry", HttpEntry.class); resourceHttpEntry.setHttpEntryProperties(version); - Loader loader = resourceHttpEntry.getLoader(); - dbEngine = resourceHttpEntry.getDbEngine(); + Loader loader = resourceHttpEntry.getLoader(); + dbEngine = resourceHttpEntry.getDbEngine(); URI uriObject = UriBuilder.fromPath(uri).build(); URIToObject uriToObject = new URIToObject(loader, uriObject); @@ -145,13 +146,13 @@ public class HttpTestUtil extends RESTAPI { String objType = uriToObject.getEntityName(); QueryParser uriQuery = dbEngine.getQueryBuilder().createQueryFromURI(uriObject); - logger.info("Unmarshalling the payload to this {}", objType); Introspector obj; HttpMethod httpMethod; - if(uri.contains("/relationship-list/relationship")){ - obj = loader.unmarshal("relationship", payload, org.onap.aai.restcore.MediaType.getEnum("application/json")); + if (uri.contains("/relationship-list/relationship")) { + obj = loader.unmarshal("relationship", payload, + org.onap.aai.restcore.MediaType.getEnum("application/json")); httpMethod = HttpMethod.PUT_EDGE; } else { obj = loader.unmarshal(objType, payload, org.onap.aai.restcore.MediaType.getEnum("application/json")); @@ -159,36 +160,35 @@ public class HttpTestUtil extends RESTAPI { this.validateIntrospector(obj, loader, uriObject, httpMethod); } - - DBRequest dbRequest = - new DBRequest.Builder(httpMethod, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION") - .rawRequestContent(payload).build(); + DBRequest dbRequest = new DBRequest.Builder(httpMethod, uriObject, uriQuery, obj, httpHeaders, uriInfo, + "JUNIT-TRANSACTION").rawRequestContent(payload).build(); List dbRequestList = new ArrayList<>(); dbRequestList.add(dbRequest); - Pair>> responsesTuple = resourceHttpEntry.process(dbRequestList, "JUNIT"); + Pair>> responsesTuple = resourceHttpEntry.process(dbRequestList, "JUNIT"); response = responsesTuple.getValue1().get(0).getValue1(); } catch (AAIException e) { - response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e); - success = false; - } catch(Exception e){ + response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e); + success = false; + } catch (Exception e) { AAIException ex = new AAIException("AAI_4000", e); response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex); success = false; } finally { - if(success){ - if(response != null){ - if((response.getStatus() / 100) == 2){ - logger.info("Successfully completed the PUT request with status {} and committing it to DB", response.getStatus()); + if (success) { + if (response != null) { + if ((response.getStatus() / 100) == 2) { + logger.info("Successfully completed the PUT request with status {} and committing it to DB", + response.getStatus()); } else { logFailure(HttpMethod.PUT, response); } } dbEngine.commit(); } else { - if(response != null) { + if (response != null) { logFailure(HttpMethod.PUT, response); } dbEngine.rollback(); @@ -210,25 +210,25 @@ public class HttpTestUtil extends RESTAPI { uri = uri.replaceAll("/aai/", ""); logger.info("Starting the GET request for the uri {} with depth {}", uri, "all"); - String [] arr = uri.split("/"); + String[] arr = uri.split("/"); SchemaVersion version = null; - if(arr.length > 1){ - if(arr[0].matches("^v\\d+")){ + if (arr.length > 1) { + if (arr[0].matches("^v\\d+")) { version = new SchemaVersion(arr[0]); uri = uri.replaceAll("^v\\d+", ""); } } - if(version == null){ + if (version == null) { version = schemaVersions.getDefaultVersion(); } HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalHttpEntry", HttpEntry.class); resourceHttpEntry.setHttpEntryProperties(version); - Loader loader = resourceHttpEntry.getLoader(); - dbEngine = resourceHttpEntry.getDbEngine(); + Loader loader = resourceHttpEntry.getLoader(); + dbEngine = resourceHttpEntry.getDbEngine(); URI uriObject = UriBuilder.fromPath(uri).build(); URIToObject uriToObject = new URIToObject(loader, uriObject); @@ -243,28 +243,28 @@ public class HttpTestUtil extends RESTAPI { Introspector obj = loader.introspectorFromName(objType); - DBRequest dbRequest = - new DBRequest.Builder(HttpMethod.GET, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION") - .build(); + DBRequest dbRequest = new DBRequest.Builder(HttpMethod.GET, uriObject, uriQuery, obj, httpHeaders, uriInfo, + "JUNIT-TRANSACTION").build(); List dbRequestList = new ArrayList<>(); dbRequestList.add(dbRequest); - Pair>> responsesTuple = resourceHttpEntry.process(dbRequestList, "JUNIT"); + Pair>> responsesTuple = resourceHttpEntry.process(dbRequestList, "JUNIT"); response = responsesTuple.getValue1().get(0).getValue1(); } catch (AAIException e) { response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e); success = false; - } catch(Exception e){ + } catch (Exception e) { AAIException ex = new AAIException("AAI_4000", e); response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex); success = false; } finally { - if(success){ - if(response != null){ - if((response.getStatus() / 100) == 2){ - logger.info("Successfully completed the GET request with status {} and committing it to DB", response.getStatus()); + if (success) { + if (response != null) { + if ((response.getStatus() / 100) == 2) { + logger.info("Successfully completed the GET request with status {} and committing it to DB", + response.getStatus()); } else { logFailure(HttpMethod.GET, response); } @@ -291,28 +291,28 @@ public class HttpTestUtil extends RESTAPI { uri = uri.replaceAll("/aai/", ""); logger.info("Starting the delete request for the uri {} with resource version {}", uri, resourceVersion); - String [] arr = uri.split("/"); + String[] arr = uri.split("/"); SchemaVersion version = null; - if(arr.length > 1){ - if(arr[0].matches("^v\\d+")){ + if (arr.length > 1) { + if (arr[0].matches("^v\\d+")) { version = new SchemaVersion(arr[0]); - if(!uri.contains("relationship-list/relationship")){ + if (!uri.contains("relationship-list/relationship")) { uri = uri.replaceAll("^v\\d+", ""); } } } - if(version == null){ + if (version == null) { version = schemaVersions.getDefaultVersion(); } Mockito.when(uriInfo.getPath()).thenReturn(uri); HttpEntry resourceHttpEntry = SpringContextAware.getBean("traversalHttpEntry", HttpEntry.class); resourceHttpEntry.setHttpEntryProperties(version); - Loader loader = resourceHttpEntry.getLoader(); - dbEngine = resourceHttpEntry.getDbEngine(); + Loader loader = resourceHttpEntry.getLoader(); + dbEngine = resourceHttpEntry.getDbEngine(); URI uriObject = UriBuilder.fromPath(uri).build(); URIToObject uriToObject = new URIToObject(loader, uriObject); @@ -325,7 +325,7 @@ public class HttpTestUtil extends RESTAPI { Introspector obj; HttpMethod httpMethod; - if(uri.contains("/relationship-list/relationship")){ + if (uri.contains("/relationship-list/relationship")) { obj = loader.introspectorFromName("relationship"); httpMethod = HttpMethod.DELETE_EDGE; } else { @@ -333,28 +333,28 @@ public class HttpTestUtil extends RESTAPI { httpMethod = HttpMethod.DELETE; } - DBRequest dbRequest = - new DBRequest.Builder(httpMethod, uriObject, uriQuery, obj, httpHeaders, uriInfo, "JUNIT-TRANSACTION") - .build(); + DBRequest dbRequest = new DBRequest.Builder(httpMethod, uriObject, uriQuery, obj, httpHeaders, uriInfo, + "JUNIT-TRANSACTION").build(); List dbRequestList = new ArrayList<>(); dbRequestList.add(dbRequest); - Pair>> responsesTuple = resourceHttpEntry.process(dbRequestList, "JUNIT"); + Pair>> responsesTuple = resourceHttpEntry.process(dbRequestList, "JUNIT"); response = responsesTuple.getValue1().get(0).getValue1(); } catch (AAIException e) { response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, e); success = false; - } catch(Exception e){ + } catch (Exception e) { AAIException ex = new AAIException("AAI_4000", e); response = this.consumerExceptionResponseGenerator(httpHeaders, uriInfo, HttpMethod.PUT, ex); success = false; } finally { - if(success){ - if(response != null){ - if((response.getStatus() / 100) == 2){ - logger.info("Successfully completed the DELETE request with status {} and committing it to DB", response.getStatus()); + if (success) { + if (response != null) { + if ((response.getStatus() / 100) == 2) { + logger.info("Successfully completed the DELETE request with status {} and committing it to DB", + response.getStatus()); } else { logFailure(HttpMethod.DELETE, response); } @@ -369,8 +369,9 @@ public class HttpTestUtil extends RESTAPI { return response; } - public static void logFailure(HttpMethod httpMethod, Response response){ - logger.info("Unable to complete the {} request with status {} and rolling back", httpMethod.toString(), response.getStatus()); + public static void logFailure(HttpMethod httpMethod, Response response) { + logger.info("Unable to complete the {} request with status {} and rolling back", httpMethod.toString(), + response.getStatus()); logger.info("Response body of failed request {}", response.getEntity()); } diff --git a/aai-resources/src/test/java/org/onap/aai/IncreaseNodesToolTest.java b/aai-resources/src/test/java/org/onap/aai/IncreaseNodesToolTest.java index 47dfdbe..328e611 100644 --- a/aai-resources/src/test/java/org/onap/aai/IncreaseNodesToolTest.java +++ b/aai-resources/src/test/java/org/onap/aai/IncreaseNodesToolTest.java @@ -17,8 +17,12 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.when; + import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -31,9 +35,6 @@ import org.mockito.Captor; import org.mockito.Mock; import org.mockito.Mockito; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.when; - public class IncreaseNodesToolTest extends AAISetup { @Mock @@ -54,10 +55,11 @@ public class IncreaseNodesToolTest extends AAISetup { @Mock GraphTraversal graphTraversalVertex; private IncreaseNodesTool increaseNodesTool; - String [] args = {"-numberOfNodes", "5" ,"-nodeType", "pserver", "-uri", "/cloud-infrastructure/pservers/pserver/", "-child", "false"}; + String[] args = {"-numberOfNodes", "5", "-nodeType", "pserver", "-uri", "/cloud-infrastructure/pservers/pserver/", + "-child", "false"}; @Before - public void setup(){ + public void setup() { increaseNodesTool = new IncreaseNodesTool(loaderFactory, schemaVersions); } @@ -68,11 +70,11 @@ public class IncreaseNodesToolTest extends AAISetup { when(janusGraphtransaction.traversal()).thenReturn(graphTraversalSource); when(graphTraversalSource.addV(nodeTypeCapture.capture())).thenReturn(graphTraversalVertex); when(graphTraversalVertex.next()).thenReturn(mockVertex); - increaseNodesTool.run(janusGraph,args); + increaseNodesTool.run(janusGraph, args); Mockito.verify(janusGraph).newTransaction(); - Mockito.verify(graphTraversalSource,times(5)).addV(nodeTypeCapture.capture()); + Mockito.verify(graphTraversalSource, times(5)).addV(nodeTypeCapture.capture()); } @Test @@ -81,10 +83,9 @@ public class IncreaseNodesToolTest extends AAISetup { when(janusGraph.newTransaction()).thenReturn(janusGraphtransaction); when(janusGraphtransaction.traversal()).thenThrow(new RuntimeException()); - increaseNodesTool.run(janusGraph,args); + increaseNodesTool.run(janusGraph, args); Mockito.verify(janusGraphtransaction).rollback(); } } - diff --git a/aai-resources/src/test/java/org/onap/aai/PayloadUtil.java b/aai-resources/src/test/java/org/onap/aai/PayloadUtil.java index 9c99163..3197c69 100644 --- a/aai-resources/src/test/java/org/onap/aai/PayloadUtil.java +++ b/aai-resources/src/test/java/org/onap/aai/PayloadUtil.java @@ -17,9 +17,10 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai; -import org.apache.commons.io.IOUtils; +import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.io.InputStream; @@ -28,7 +29,7 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static org.junit.Assert.assertNotNull; +import org.apache.commons.io.IOUtils; public class PayloadUtil { @@ -37,7 +38,8 @@ public class PayloadUtil { public static String getResourcePayload(String fileName) throws IOException { - InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/resource/" + fileName); + InputStream inputStream = + PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/resource/" + fileName); String message = String.format("Unable to find the %s in src/test/resources", fileName); assertNotNull(message, inputStream); @@ -50,14 +52,15 @@ public class PayloadUtil { public static String getTemplatePayload(String fileName, Map templateValueMap) throws Exception { - InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/templates/" + fileName); + InputStream inputStream = + PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/templates/" + fileName); String message = String.format("Unable to find the %s in src/test/resources", fileName); assertNotNull(message, inputStream); String resource; - if(cache.containsKey(fileName)){ + if (cache.containsKey(fileName)) { resource = cache.get(fileName); } else { resource = IOUtils.toString(inputStream); @@ -68,21 +71,23 @@ public class PayloadUtil { String resourceWithTemplateValues = resource; - while(matcher.find()){ + while (matcher.find()) { int start = matcher.start() + 2; int end = matcher.end() - 1; String key = resource.substring(start, end); - if(templateValueMap.containsKey(key)){ - resourceWithTemplateValues = resourceWithTemplateValues.replaceAll("\\$\\{" + key +"\\}", templateValueMap.get(key)); + if (templateValueMap.containsKey(key)) { + resourceWithTemplateValues = + resourceWithTemplateValues.replaceAll("\\$\\{" + key + "\\}", templateValueMap.get(key)); } else { - throw new RuntimeException("Unable to find the key value pair in map for the template processing for key " + key); + throw new RuntimeException( + "Unable to find the key value pair in map for the template processing for key " + key); } } inputStream.close(); return resourceWithTemplateValues; } - + public static String getPayload(String fileName) throws IOException { InputStream inputStream = PayloadUtil.class.getClassLoader().getResourceAsStream("payloads/" + fileName); diff --git a/aai-resources/src/test/java/org/onap/aai/ResourcesTestConfiguration.java b/aai-resources/src/test/java/org/onap/aai/ResourcesTestConfiguration.java index 7a9ae2d..7e91341 100644 --- a/aai-resources/src/test/java/org/onap/aai/ResourcesTestConfiguration.java +++ b/aai-resources/src/test/java/org/onap/aai/ResourcesTestConfiguration.java @@ -17,13 +17,22 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.security.KeyStore; + +import javax.net.ssl.SSLContext; + import org.apache.http.client.HttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContextBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.TestConfiguration; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -36,13 +45,6 @@ import org.springframework.util.ResourceUtils; import org.springframework.web.client.ResponseErrorHandler; import org.springframework.web.client.RestTemplate; -import javax.net.ssl.SSLContext; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.security.KeyStore; - @TestConfiguration public class ResourcesTestConfiguration { @@ -58,9 +60,8 @@ public class ResourcesTestConfiguration { @Bean RestTemplate restTemplate(RestTemplateBuilder builder) throws Exception { - RestTemplate restTemplate = null; - if(env.acceptsProfiles("one-way-ssl", "two-way-ssl")) { + if (env.acceptsProfiles("one-way-ssl", "two-way-ssl")) { char[] trustStorePassword = env.getProperty("server.ssl.trust-store-password").toCharArray(); char[] keyStorePassword = env.getProperty("server.ssl.key-store-password").toCharArray(); @@ -69,22 +70,18 @@ public class ResourcesTestConfiguration { SSLContextBuilder sslContextBuilder = SSLContextBuilder.create(); if (env.acceptsProfiles("two-way-ssl")) { - sslContextBuilder = sslContextBuilder.loadKeyMaterial(loadPfx(keyStore, keyStorePassword), keyStorePassword); + sslContextBuilder = + sslContextBuilder.loadKeyMaterial(loadPfx(keyStore, keyStorePassword), keyStorePassword); } - SSLContext sslContext = sslContextBuilder - .loadTrustMaterial(ResourceUtils.getFile(trustStore), trustStorePassword) - .build(); + SSLContext sslContext = + sslContextBuilder.loadTrustMaterial(ResourceUtils.getFile(trustStore), trustStorePassword).build(); - HttpClient client = HttpClients.custom() - .setSSLContext(sslContext) - .setSSLHostnameVerifier((s, sslSession) -> true) - .build(); + HttpClient client = HttpClients.custom().setSSLContext(sslContext) + .setSSLHostnameVerifier((s, sslSession) -> true).build(); - restTemplate = builder - .requestFactory(() -> new HttpComponentsClientHttpRequestFactory(client)) - .build(); - }else { + restTemplate = builder.requestFactory(() -> new HttpComponentsClientHttpRequestFactory(client)).build(); + } else { restTemplate = builder.build(); } restTemplate.setErrorHandler(new ResponseErrorHandler() { @@ -99,7 +96,7 @@ public class ResourcesTestConfiguration { return true; } - if(clientHttpResponse.getRawStatusCode() % 100 == 5){ + if (clientHttpResponse.getRawStatusCode() % 100 == 5) { logger.debug("Call returned a error " + clientHttpResponse.getStatusText()); return true; } diff --git a/aai-resources/src/test/java/org/onap/aai/it/multitenancy/KeycloakTestConfiguration.java b/aai-resources/src/test/java/org/onap/aai/it/multitenancy/KeycloakTestConfiguration.java index c7755b0..1e47c42 100644 --- a/aai-resources/src/test/java/org/onap/aai/it/multitenancy/KeycloakTestConfiguration.java +++ b/aai-resources/src/test/java/org/onap/aai/it/multitenancy/KeycloakTestConfiguration.java @@ -17,13 +17,16 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.it.multitenancy; import com.github.dockerjava.api.model.ExposedPort; import com.github.dockerjava.api.model.HostConfig; import com.github.dockerjava.api.model.PortBinding; import com.github.dockerjava.api.model.Ports; + import dasniko.testcontainers.keycloak.KeycloakContainer; + import org.keycloak.adapters.springboot.KeycloakSpringBootProperties; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.KeycloakBuilder; @@ -41,24 +44,20 @@ class KeycloakTestConfiguration { @Bean KeycloakContainer keycloakContainer(KeycloakTestProperties properties) { - KeycloakContainer keycloak = new KeycloakContainer("jboss/keycloak:12.0.4") - .withRealmImportFile(properties.realmJson) - .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig( - new HostConfig().withPortBindings(new PortBinding(Ports.Binding.bindPort(Integer.parseInt(properties.port)), new ExposedPort(8080))) - )); + KeycloakContainer keycloak = + new KeycloakContainer("jboss/keycloak:12.0.4").withRealmImportFile(properties.realmJson) + .withCreateContainerCmdModifier(cmd -> cmd.withHostConfig(new HostConfig().withPortBindings( + new PortBinding(Ports.Binding.bindPort(Integer.parseInt(properties.port)), + new ExposedPort(8080))))); keycloak.start(); return keycloak; } @Bean Keycloak keycloakAdminClient(KeycloakContainer keycloak, KeycloakTestProperties properties) { - return KeycloakBuilder.builder() - .serverUrl(keycloak.getAuthServerUrl()) - .realm(properties.realm) - .clientId(properties.adminCli) - .username(keycloak.getAdminUsername()) - .password(keycloak.getAdminPassword()) - .build(); + return KeycloakBuilder.builder().serverUrl(keycloak.getAuthServerUrl()).realm(properties.realm) + .clientId(properties.adminCli).username(keycloak.getAdminUsername()) + .password(keycloak.getAdminPassword()).build(); } @Bean diff --git a/aai-resources/src/test/java/org/onap/aai/it/multitenancy/KeycloakTestProperties.java b/aai-resources/src/test/java/org/onap/aai/it/multitenancy/KeycloakTestProperties.java index df9db84..7f1e34c 100644 --- a/aai-resources/src/test/java/org/onap/aai/it/multitenancy/KeycloakTestProperties.java +++ b/aai-resources/src/test/java/org/onap/aai/it/multitenancy/KeycloakTestProperties.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.it.multitenancy; import org.springframework.beans.factory.annotation.Value; diff --git a/aai-resources/src/test/java/org/onap/aai/it/multitenancy/MultiTenancyIT.java b/aai-resources/src/test/java/org/onap/aai/it/multitenancy/MultiTenancyIT.java index 9726cc9..300730a 100644 --- a/aai-resources/src/test/java/org/onap/aai/it/multitenancy/MultiTenancyIT.java +++ b/aai-resources/src/test/java/org/onap/aai/it/multitenancy/MultiTenancyIT.java @@ -17,9 +17,16 @@ * limitations under the License. * ============LICENSE_END==================================================== */ + package org.onap.aai.it.multitenancy; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + import dasniko.testcontainers.keycloak.KeycloakContainer; + +import java.util.Collections; + import org.junit.Test; import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.KeycloakBuilder; @@ -31,11 +38,6 @@ import org.springframework.context.annotation.Import; import org.springframework.http.*; import org.springframework.test.context.TestPropertySource; -import java.util.Collections; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - @Import(KeycloakTestConfiguration.class) @TestPropertySource(locations = "classpath:it/application-keycloak-test.properties") public class MultiTenancyIT extends AbstractSpringRestTest { @@ -61,14 +63,16 @@ public class MultiTenancyIT extends AbstractSpringRestTest { assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); // get pnf with bob (operator_readOnly) - username = "bob"; password = "bob"; + username = "bob"; + password = "bob"; headers = this.getHeaders(username, password); httpEntity = new HttpEntity("", headers); responseEntity = restTemplate.exchange(endpoint, HttpMethod.GET, httpEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); // get pnf with ted (selector) - username = "ted"; password = "ted"; + username = "ted"; + password = "ted"; headers = this.getHeaders(username, password); httpEntity = new HttpEntity("", headers); responseEntity = restTemplate.exchange(endpoint, HttpMethod.GET, httpEntity, String.class); @@ -82,7 +86,8 @@ public class MultiTenancyIT extends AbstractSpringRestTest { assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); // get pnf with ran - username = "ran"; password = "ran"; + username = "ran"; + password = "ran"; headers = this.getHeaders(username, password); httpEntity = new HttpEntity("", headers); responseEntity = restTemplate.exchange(endpoint, HttpMethod.GET, httpEntity, String.class); @@ -103,14 +108,9 @@ public class MultiTenancyIT extends AbstractSpringRestTest { } private String getStringToken(String username, String password) { - Keycloak keycloakClient = KeycloakBuilder.builder() - .serverUrl(keycloakContainer.getAuthServerUrl()) - .realm(properties.realm) - .clientId(properties.clientId) - .clientSecret(properties.clientSecret) - .username(username) - .password(password) - .build(); + Keycloak keycloakClient = KeycloakBuilder.builder().serverUrl(keycloakContainer.getAuthServerUrl()) + .realm(properties.realm).clientId(properties.clientId).clientSecret(properties.clientSecret) + .username(username).password(password).build(); AccessTokenResponse tokenResponse = keycloakClient.tokenManager().getAccessToken(); assertNotNull(tokenResponse); diff --git a/aai-resources/src/test/java/org/onap/aai/it/multitenancy/RoleHandler.java b/aai-resources/src/test/java/org/onap/aai/it/multitenancy/RoleHandler.java index 414c6b9..c9c1fd2 100644 --- a/aai-resources/src/test/java/org/onap/aai/it/multitenancy/RoleHandler.java +++ b/aai-resources/src/test/java/org/onap/aai/it/multitenancy/RoleHandler.java @@ -17,18 +17,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.it.multitenancy; +import java.util.Collections; + import org.keycloak.admin.client.Keycloak; import org.keycloak.admin.client.resource.RealmResource; -import java.util.Collections; - class RoleHandler { - /** - Following roles should be the same as given roles in multi-tenancy-realm json file - */ + /** + * Following roles should be the same as given roles in multi-tenancy-realm json file + */ final static String OPERATOR = "operator"; final static String OPERATOR_READ_ONLY = "operator_readOnly"; private final Keycloak adminClient; @@ -41,17 +42,13 @@ class RoleHandler { void addToUser(String role, String username) { RealmResource realm = adminClient.realm(properties.realm); - realm.users().get(username) - .roles() - .realmLevel() + realm.users().get(username).roles().realmLevel() .add(Collections.singletonList(realm.roles().get(role).toRepresentation())); } void removeFromUser(String role, String username) { RealmResource realm = adminClient.realm(properties.realm); - realm.users().get(username) - .roles() - .realmLevel() + realm.users().get(username).roles().realmLevel() .remove(Collections.singletonList(realm.roles().get(role).toRepresentation())); } } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/AbstractSpringRestTest.java b/aai-resources/src/test/java/org/onap/aai/rest/AbstractSpringRestTest.java index e4684fb..b47485e 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/AbstractSpringRestTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/AbstractSpringRestTest.java @@ -17,8 +17,13 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import java.io.UnsupportedEncodingException; +import java.util.Base64; +import java.util.Collections; + import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.janusgraph.core.JanusGraph; @@ -26,14 +31,14 @@ import org.janusgraph.core.JanusGraphTransaction; import org.junit.*; import org.onap.aai.ResourcesApp; import org.onap.aai.ResourcesTestConfiguration; -import org.onap.aai.restclient.PropertyPasswordConfiguration; import org.onap.aai.dbmap.AAIGraph; import org.onap.aai.exceptions.AAIException; import org.onap.aai.nodes.NodeIngestor; +import org.onap.aai.restclient.PropertyPasswordConfiguration; import org.onap.aai.util.AAIConfig; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.web.server.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.context.annotation.Import; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -44,10 +49,6 @@ import org.springframework.test.context.junit4.rules.SpringClassRule; import org.springframework.test.context.junit4.rules.SpringMethodRule; import org.springframework.web.client.RestTemplate; -import java.io.UnsupportedEncodingException; -import java.util.Base64; -import java.util.Collections; - @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = ResourcesApp.class) @TestPropertySource(locations = "classpath:application-test.properties") @ContextConfiguration(initializers = PropertyPasswordConfiguration.class) @@ -65,14 +66,14 @@ public abstract class AbstractSpringRestTest { @Autowired protected NodeIngestor nodeIngestor; - + @LocalServerPort protected int randomPort; protected HttpEntity httpEntity; protected String baseUrl; - protected HttpHeaders headers ; + protected HttpHeaders headers; @BeforeClass public static void setupConfig() throws AAIException { @@ -102,7 +103,7 @@ public abstract class AbstractSpringRestTest { } @After - public void tearDown(){ + public void tearDown() { JanusGraph janusGraph = AAIGraph.getInstance().getGraph(); JanusGraphTransaction transaction = janusGraph.newTransaction(); @@ -111,14 +112,12 @@ public abstract class AbstractSpringRestTest { try { GraphTraversalSource g = transaction.traversal(); - g.V().has("source-of-truth", P.within("JUNIT", "AAI-EXTENSIONS")) - .toList() - .stream() + g.V().has("source-of-truth", P.within("JUNIT", "AAI-EXTENSIONS")).toList().stream() .forEach(v -> v.remove()); - } catch(Exception ex){ + } catch (Exception ex) { success = false; } finally { - if(success){ + if (success) { transaction.commit(); } else { transaction.rollback(); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/BulkAddConsumerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/BulkAddConsumerTest.java index 5366802..de72d5c 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/BulkAddConsumerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/BulkAddConsumerTest.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import static org.junit.Assert.assertEquals; @@ -28,15 +29,14 @@ import javax.ws.rs.core.Response; import org.apache.commons.lang3.StringUtils; import org.junit.Test; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; + public class BulkAddConsumerTest extends BulkProcessorTestAbstraction { private static final Logger logger = LoggerFactory.getLogger(BulkAddConsumerTest.class.getName()); - - @Test + @Test public void validBulkAddTest() throws IOException { when(uriInfo.getPath()).thenReturn(uri); @@ -46,10 +46,11 @@ public class BulkAddConsumerTest extends BulkProcessorTestAbstraction { Response response = executeRequest(payload); assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 3 {\"201\":null}", 3, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 3 {\"201\":null}", 3, + StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); } - - @Test + + @Test public void bulkProcessPayloadInBulkAddTest() throws IOException { when(uriInfo.getPath()).thenReturn(uri); @@ -59,12 +60,15 @@ public class BulkAddConsumerTest extends BulkProcessorTestAbstraction { Response response = executeRequest(payload); assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 1 {\"201\":null}", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); - assertEquals("Contains 1 {\"400\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"400\":\"{")); - assertEquals("Contains 1 ERR.5.4.6118", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6118")); + assertEquals("Contains 1 {\"201\":null}", 1, + StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 1 {\"400\":\"{", 1, + StringUtils.countMatches(response.getEntity().toString(), "{\"400\":\"{")); + assertEquals("Contains 1 ERR.5.4.6118", 1, + StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6118")); } - - @Test + + @Test public void bulkAddInvalidMethodTest() throws IOException { when(uriInfo.getPath()).thenReturn(uri); @@ -74,12 +78,14 @@ public class BulkAddConsumerTest extends BulkProcessorTestAbstraction { Response response = executeRequest(payload); assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 1 {\"400\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"400\":\"{")); - assertEquals("Contains 1 ERR.5.4.6118", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6118")); + assertEquals("Contains 1 {\"400\":\"{", 1, + StringUtils.countMatches(response.getEntity().toString(), "{\"400\":\"{")); + assertEquals("Contains 1 ERR.5.4.6118", 1, + StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6118")); } @Test - public void bulkAddThrowExceptionWhenPayloadContainsNoTransactionsTest(){ + public void bulkAddThrowExceptionWhenPayloadContainsNoTransactionsTest() { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); @@ -105,7 +111,7 @@ public class BulkAddConsumerTest extends BulkProcessorTestAbstraction { } @Test - public void bulkAddCheckMeetsLimit() throws IOException{ + public void bulkAddCheckMeetsLimit() throws IOException { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); @@ -113,11 +119,12 @@ public class BulkAddConsumerTest extends BulkProcessorTestAbstraction { Response response = executeRequest(payload); assertEquals("Created", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 30 {\"201\":null}", 30, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 30 {\"201\":null}", 30, + StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); } @Test - public void bulkAddCheckExceedsLimit() throws IOException{ + public void bulkAddCheckExceedsLimit() throws IOException { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); @@ -127,14 +134,14 @@ public class BulkAddConsumerTest extends BulkProcessorTestAbstraction { assertEquals("Bad Request", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); assertEquals("Contains error code", true, response.getEntity().toString().contains("ERR.5.4.6147")); } - + @Override - protected BulkConsumer getConsumer(){ + protected BulkConsumer getConsumer() { return new BulkAddConsumer(); } - + @Override protected String getUri() { - return "/aai/" + schemaVersions.getDefaultVersion().toString() + "/bulkadd"; - } + return "/aai/" + schemaVersions.getDefaultVersion().toString() + "/bulkadd"; + } } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessConsumerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessConsumerTest.java index d2dff7d..a435f45 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessConsumerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessConsumerTest.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import static org.junit.Assert.assertEquals; @@ -32,7 +33,6 @@ import org.json.JSONException; import org.junit.Test; import org.onap.aai.dbmap.AAIGraph; import org.skyscreamer.jsonassert.JSONAssert; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.mock.web.MockHttpServletRequest; @@ -42,7 +42,7 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { private static final Logger logger = LoggerFactory.getLogger(BulkProcessConsumerTest.class.getName()); private LegacyMoxyConsumer legacyMoxyConsumer; - @Test + @Test public void bulkAddPayloadInBulkProcessTest() throws IOException { when(uriInfo.getPath()).thenReturn(uri); @@ -52,10 +52,11 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { Response response = executeRequest(payload); assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 3 {\"201\":null}", 3, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 3 {\"201\":null}", 3, + StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); } - - @Test + + @Test public void bulkProcessPayloadTest() throws IOException { when(uriInfo.getPath()).thenReturn(uri); @@ -65,9 +66,12 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { Response response = executeRequest(payload); assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 1 {\"201\":null}", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); - assertEquals("Contains 1 {\"404\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"404\":\"{")); - assertEquals("Contains 1 ERR.5.4.6114", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6114")); + assertEquals("Contains 1 {\"201\":null}", 1, + StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 1 {\"404\":\"{", 1, + StringUtils.countMatches(response.getEntity().toString(), "{\"404\":\"{")); + assertEquals("Contains 1 ERR.5.4.6114", 1, + StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6114")); } @Test @@ -79,11 +83,12 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { String payload = getBulkPayload("pserver-bulk-process-transactions-with-patch"); Response response = executeRequest(payload); System.out.println(response.getEntity()); - System.out.println(AAIGraph.getInstance().getGraph().newTransaction().traversal().V().has("fqdn", "NEW").count().next()); + System.out.println( + AAIGraph.getInstance().getGraph().newTransaction().traversal().V().has("fqdn", "NEW").count().next()); assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); } - - @Test + + @Test public void bulkProcessComplexDeletePayloadTest() throws IOException { when(uriInfo.getPath()).thenReturn(uri); @@ -94,21 +99,24 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { System.out.println(response.getEntity().toString()); assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 0 {\"201\":null}", 0, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); - assertEquals("Contains 1 {\"404\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"404\":\"{")); - assertEquals("Contains 1 ERR.5.4.6114", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6114")); + assertEquals("Contains 0 {\"201\":null}", 0, + StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 1 {\"404\":\"{", 1, + StringUtils.countMatches(response.getEntity().toString(), "{\"404\":\"{")); + assertEquals("Contains 1 ERR.5.4.6114", 1, + StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6114")); } - - @Test + + @Test public void testBulkDeletePserverAndComplexRelationship() throws IOException, JSONException { - - legacyMoxyConsumer = new LegacyMoxyConsumer(); + + legacyMoxyConsumer = new LegacyMoxyConsumer(); String pserverData = getPayload("payloads/relationship/pserver-bugfix.json"); String complexData = getPayload("payloads/relationship/complex-bugfix.json"); String hostname = "pserver-9876543210-77-jenkins"; - String physicalLocationId ="complex-987654321-77-jenkins"; + String physicalLocationId = "complex-987654321-77-jenkins"; String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); String complexUri = String.format("cloud-infrastructure/complexes/complex/%s", physicalLocationId); @@ -116,114 +124,84 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { doSetupResource(pserverUri, pserverData); doSetupResource(complexUri, complexData); - String complexToPserverRelationshipData = getPayload("payloads/relationship/pserver-complex-relationship-for-bulk.json"); - String complexToPserverRelationshipUri = String.format( - "cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); + String complexToPserverRelationshipData = + getPayload("payloads/relationship/pserver-complex-relationship-for-bulk.json"); + String complexToPserverRelationshipUri = + String.format("cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); - Response response = legacyMoxyConsumer.updateRelationship( - complexToPserverRelationshipData, - schemaVersions.getDefaultVersion().toString(), - complexToPserverRelationshipUri, - httpHeaders, - uriInfo, - new MockHttpServletRequest("DELETE", "http://www.test.com") - ); + Response response = legacyMoxyConsumer.updateRelationship(complexToPserverRelationshipData, + schemaVersions.getDefaultVersion().toString(), complexToPserverRelationshipUri, httpHeaders, uriInfo, + new MockHttpServletRequest("DELETE", "http://www.test.com")); assertNotNull("Response from the legacy moxy consumer returned null", response); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); } - assertEquals("Expected to return status created from the response", - Response.Status.OK.getStatusCode(), response.getStatus()); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + assertEquals("Expected to return status created from the response", Response.Status.OK.getStatusCode(), + response.getStatus()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); // TODO - Need to actually verify the relationship between pserver and cloud-region - + String payload = getBulkPayload("complex-bulk-process-delete-transactions"); Response responseBulkDelete = executeRequest(payload); System.out.println(responseBulkDelete.getEntity().toString()); - + code = responseBulkDelete.getStatus(); - - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - System.out.println("Response Code: " + code + "\tEntity: " + responseBulkDelete.getEntity()); - System.out.println("Response Code: " + code + "\tEntity: " + responseBulkDelete.getEntity()); - } - assertEquals("Expected to return status created from the response", - Response.Status.CREATED.getStatusCode(), responseBulkDelete.getStatus()); - assertEquals("Contains 0 {\"204\":null}", 1, StringUtils.countMatches(responseBulkDelete.getEntity().toString(), "{\"204\":null}")); - + + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + System.out.println("Response Code: " + code + "\tEntity: " + responseBulkDelete.getEntity()); + System.out.println("Response Code: " + code + "\tEntity: " + responseBulkDelete.getEntity()); + } + assertEquals("Expected to return status created from the response", Response.Status.CREATED.getStatusCode(), + responseBulkDelete.getStatus()); + assertEquals("Contains 0 {\"204\":null}", 1, + StringUtils.countMatches(responseBulkDelete.getEntity().toString(), "{\"204\":null}")); + } - + protected void doSetupResource(String uri, String payload) throws JSONException { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); - Response response = legacyMoxyConsumer.getLegacy( - "", - "-1", - "-1", - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - new MockHttpServletRequest("GET", "http://www.test.com") - ); + Response response = legacyMoxyConsumer.getLegacy("", "-1", "-1", schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, new MockHttpServletRequest("GET", "http://www.test.com")); assertNotNull("Response from the legacy moxy consumer returned null", response); - assertEquals("Expected to not have the data already in memory", - Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); - - response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - new MockHttpServletRequest("PUT", "http://www.test.com") - ); + assertEquals("Expected to not have the data already in memory", Response.Status.NOT_FOUND.getStatusCode(), + response.getStatus()); + + response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, + uriInfo, new MockHttpServletRequest("PUT", "http://www.test.com")); assertNotNull("Response from the legacy moxy consumer returned null", response); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); } - assertEquals("Expected to return status created from the response", - Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("Expected to return status created from the response", Response.Status.CREATED.getStatusCode(), + response.getStatus()); queryParameters.add("depth", "10000"); - response = legacyMoxyConsumer.getLegacy( - "", - "-1", - "-1", - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - new MockHttpServletRequest("GET", "http://www.test.com") - ); + response = legacyMoxyConsumer.getLegacy("", "-1", "-1", schemaVersions.getDefaultVersion().toString(), uri, + "all", "false", httpHeaders, uriInfo, new MockHttpServletRequest("GET", "http://www.test.com")); assertNotNull("Response from the legacy moxy consumer returned null", response); assertEquals("Expected to return the pserver data that was just put in memory", Response.Status.OK.getStatusCode(), response.getStatus()); - if("".equalsIgnoreCase(payload)){ + if ("".equalsIgnoreCase(payload)) { payload = "{}"; } JSONAssert.assertEquals(payload, response.getEntity().toString(), false); } - - - @Test + + @Test public void bulkAddInvalidMethodTest() throws IOException { when(uriInfo.getPath()).thenReturn(uri); @@ -233,12 +211,14 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { Response response = executeRequest(payload); assertEquals("Valid Response Code", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 1 {\"400\":\"{", 1, StringUtils.countMatches(response.getEntity().toString(), "{\"400\":\"{")); - assertEquals("Contains 1 ERR.5.4.6118", 1, StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6118")); + assertEquals("Contains 1 {\"400\":\"{", 1, + StringUtils.countMatches(response.getEntity().toString(), "{\"400\":\"{")); + assertEquals("Contains 1 ERR.5.4.6118", 1, + StringUtils.countMatches(response.getEntity().toString(), "ERR.5.4.6118")); } @Test - public void bulkAddThrowExceptionWhenPayloadContainsNoTransactionsTest(){ + public void bulkAddThrowExceptionWhenPayloadContainsNoTransactionsTest() { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); @@ -262,8 +242,9 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { assertEquals("Bad Request", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); assertEquals("Contains error code", true, response.getEntity().toString().contains("ERR.5.4.6111")); } + @Test - public void bulkProcessCheckMeetsLimit() throws IOException{ + public void bulkProcessCheckMeetsLimit() throws IOException { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); @@ -271,11 +252,12 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { Response response = executeRequest(payload); assertEquals("Created", Response.Status.CREATED.getStatusCode(), response.getStatus()); - assertEquals("Contains 30 {\"201\":null}", 30, StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); + assertEquals("Contains 30 {\"201\":null}", 30, + StringUtils.countMatches(response.getEntity().toString(), "{\"201\":null}")); } @Test - public void bulkProcessCheckExceedsLimit() throws IOException{ + public void bulkProcessCheckExceedsLimit() throws IOException { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); @@ -285,14 +267,14 @@ public class BulkProcessConsumerTest extends BulkProcessorTestAbstraction { assertEquals("Bad Request", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); assertEquals("Contains error code", true, response.getEntity().toString().contains("ERR.5.4.6147")); } - + @Override - protected BulkConsumer getConsumer(){ + protected BulkConsumer getConsumer() { return new BulkProcessConsumer(); } - + @Override protected String getUri() { - return "/aai/" + schemaVersions.getDefaultVersion().toString() + "/bulkprocess"; - } + return "/aai/" + schemaVersions.getDefaultVersion().toString() + "/bulkprocess"; + } } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessorTestAbstraction.java b/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessorTestAbstraction.java index 4fd789f..56ab500 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessorTestAbstraction.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/BulkProcessorTestAbstraction.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import static org.mockito.ArgumentMatchers.anyObject; @@ -69,33 +70,33 @@ public abstract class BulkProcessorTestAbstraction extends AAISetup { protected List aaiRequestContextList; protected List outputMediaTypes; - + protected String uri; private boolean initialized = false; private static final Logger logger = LoggerFactory.getLogger(BulkProcessorTestAbstraction.class.getName()); @BeforeClass - public static void setupRest(){ - // AAIGraph.getInstance(); - + public static void setupRest() { + // AAIGraph.getInstance(); + } @Before - public void setup(){ - if(!initialized){ - initialized = true; - AAIGraph.getInstance(); - } + public void setup() { + if (!initialized) { + initialized = true; + AAIGraph.getInstance(); + } logger.info("Starting the setup for the integration tests of Rest Endpoints"); - bulkConsumer = getConsumer(); + bulkConsumer = getConsumer(); uri = getUri(); - httpHeaders = Mockito.mock(HttpHeaders.class); - uriInfo = Mockito.mock(UriInfo.class); + httpHeaders = Mockito.mock(HttpHeaders.class); + uriInfo = Mockito.mock(UriInfo.class); - headersMultiMap = new MultivaluedHashMap<>(); - queryParameters = Mockito.spy(new MultivaluedHashMap<>()); + headersMultiMap = new MultivaluedHashMap<>(); + queryParameters = Mockito.spy(new MultivaluedHashMap<>()); headersMultiMap.add("X-FromAppId", "JUNIT"); headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); @@ -114,7 +115,6 @@ public abstract class BulkProcessorTestAbstraction extends AAISetup { when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList); - when(uriInfo.getQueryParameters()).thenReturn(queryParameters); when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters); @@ -123,24 +123,19 @@ public abstract class BulkProcessorTestAbstraction extends AAISetup { when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON); } - + protected Response executeRequest(String payload) { - MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", "http://www.test.com"); - - return bulkConsumer.bulkProcessor( - payload.replaceAll("", UUID.randomUUID().toString()), - schemaVersions.getDefaultVersion().toString(), - httpHeaders, - uriInfo, - mockReq - ); - } + MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", "http://www.test.com"); + + return bulkConsumer.bulkProcessor(payload.replaceAll("", UUID.randomUUID().toString()), + schemaVersions.getDefaultVersion().toString(), httpHeaders, uriInfo, mockReq); + } protected String getBulkPayload(String bulkPayloadName) throws IOException { return getPayload("payloads/bulk/" + bulkPayloadName + ".json"); } - + protected abstract BulkConsumer getConsumer(); - + protected abstract String getUri(); } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/CloudRegionTest.java b/aai-resources/src/test/java/org/onap/aai/rest/CloudRegionTest.java index a4f9629..0f4a20e 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/CloudRegionTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/CloudRegionTest.java @@ -17,8 +17,15 @@ * limitations under the License. * ============LICENSE_END==================================================== */ + package org.onap.aai.rest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.StringContains.containsString; +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + import org.junit.Test; import org.onap.aai.PayloadUtil; import org.springframework.http.HttpEntity; @@ -26,12 +33,6 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import java.io.IOException; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.StringContains.containsString; -import static org.junit.Assert.assertEquals; - public class CloudRegionTest extends AbstractSpringRestTest { @Test @@ -49,7 +50,8 @@ public class CloudRegionTest extends AbstractSpringRestTest { responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.PUT, httpEntity, String.class); assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); - responseEntity = restTemplate.exchange(baseUrl + endpoint + "/tenants", HttpMethod.GET, httpEntity, String.class); + responseEntity = + restTemplate.exchange(baseUrl + endpoint + "/tenants", HttpMethod.GET, httpEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertThat(responseEntity.getBody().toString(), containsString("tenant-id")); } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/ConfigurationTest.java b/aai-resources/src/test/java/org/onap/aai/rest/ConfigurationTest.java index caaf91a..d8e02b2 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/ConfigurationTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/ConfigurationTest.java @@ -17,34 +17,36 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import com.jayway.jsonpath.JsonPath; + +import java.io.UnsupportedEncodingException; +import java.util.Arrays; +import java.util.Base64; +import java.util.Collections; +import java.util.UUID; + import org.junit.Before; import org.junit.Test; import org.onap.aai.ResourcesApp; import org.onap.aai.ResourcesTestConfiguration; -import org.onap.aai.restclient.PropertyPasswordConfiguration; import org.onap.aai.config.SpringContextAware; +import org.onap.aai.restclient.PropertyPasswordConfiguration; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.web.server.LocalServerPort; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.context.annotation.Import; import org.springframework.http.*; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; import org.springframework.web.client.RestTemplate; -import java.io.UnsupportedEncodingException; -import java.util.Arrays; -import java.util.Base64; -import java.util.Collections; -import java.util.UUID; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - /** * Test REST requests against configuration resource */ @@ -52,7 +54,9 @@ import static org.junit.Assert.assertTrue; @TestPropertySource(locations = "classpath:application-test.properties") @ContextConfiguration(initializers = PropertyPasswordConfiguration.class, classes = {SpringContextAware.class}) @Import(ResourcesTestConfiguration.class) -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = {SpringContextAware.class, ResourcesApp.class}) +@SpringBootTest( + webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, + classes = {SpringContextAware.class, ResourcesApp.class}) public class ConfigurationTest extends AbstractSpringRestTest { @Autowired RestTemplate restTemplate; @@ -69,6 +73,7 @@ public class ConfigurationTest extends AbstractSpringRestTest { private String baseUrl; private String actuatorurl; private HttpHeaders headers; + @Before public void setup() throws UnsupportedEncodingException { @@ -90,7 +95,7 @@ public class ConfigurationTest extends AbstractSpringRestTest { @Test public void testGetPutPatchConfiguration() { - String cid = "configtest" + UUID.randomUUID().toString(); + String cid = "configtest" + UUID.randomUUID().toString(); String endpoint = "/aai/v12/network/configurations/configuration/" + cid; ResponseEntity responseEntity = null; @@ -98,96 +103,87 @@ public class ConfigurationTest extends AbstractSpringRestTest { responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.GET, httpEntity, String.class); assertEquals(HttpStatus.NOT_FOUND, responseEntity.getStatusCode()); - //String putBody = " configuration-id, configuration-type configuration-sub-type"; - String putBody = "{" + - "\"configuration-id\": \"" + cid + "\"," + - "\"configuration-type\": \"type1\"," + - "\"configuration-sub-type\": \"subtype1\", " + - "\"operational-status\": \"example1\", " + - "\"orchestration-status\": \"example1\", " + - "\"configuration-selflink\": \"example1\", " + - "\"model-customization-id\": \"example1\" " + - "}"; + // String putBody = " configuration-id, configuration-type configuration-sub-type"; + String putBody = "{" + "\"configuration-id\": \"" + cid + "\"," + "\"configuration-type\": \"type1\"," + + "\"configuration-sub-type\": \"subtype1\", " + "\"operational-status\": \"example1\", " + + "\"orchestration-status\": \"example1\", " + "\"configuration-selflink\": \"example1\", " + + "\"model-customization-id\": \"example1\" " + "}"; httpEntityPut = new HttpEntity(putBody, headers); responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.PUT, httpEntityPut, String.class); assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); String vertexId = responseEntity.getHeaders().getFirst("vertex-id"); - responseEntity = restTemplate.exchange(baseUrl + "/aai/v12/resources/id/" + vertexId, HttpMethod.GET, httpEntity, String.class); + responseEntity = restTemplate.exchange(baseUrl + "/aai/v12/resources/id/" + vertexId, HttpMethod.GET, + httpEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.GET, httpEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - - String patchBody = "{" + - "\"configuration-id\": \"" + cid + "\"," + - "\"configuration-type\": \"type2\"," + - "\"configuration-sub-type\": \"subtype2\", " + - "\"operational-status\": \"example1\", " + - "\"orchestration-status\": \"example1\", " + - "\"configuration-selflink\": \"example1\", " + - "\"model-customization-id\": \"example1\" " + - "}"; + + String patchBody = "{" + "\"configuration-id\": \"" + cid + "\"," + "\"configuration-type\": \"type2\"," + + "\"configuration-sub-type\": \"subtype2\", " + "\"operational-status\": \"example1\", " + + "\"orchestration-status\": \"example1\", " + "\"configuration-selflink\": \"example1\", " + + "\"model-customization-id\": \"example1\" " + "}"; headers.put("Content-Type", Arrays.asList("application/merge-patch+json")); headers.add("X-HTTP-Method-Override", "PATCH"); - + httpEntityPatch = new HttpEntity(patchBody, headers); - + responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.POST, httpEntityPatch, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - + responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.GET, httpEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - + String body = responseEntity.getBody().toString(); String configurationType = JsonPath.read(body, "$.configuration-type"); assertEquals("type2", configurationType); - - patchBody = "{" + - "\"configuration-id\": \"" + cid + "\"," + - "\"configuration-type\": \"type3\"," + - "\"configuration-sub-type\": \"subtype3\" " + - "}"; - + + patchBody = "{" + "\"configuration-id\": \"" + cid + "\"," + "\"configuration-type\": \"type3\"," + + "\"configuration-sub-type\": \"subtype3\" " + "}"; + httpEntityPatch = new HttpEntity(patchBody, headers); responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.PATCH, httpEntityPatch, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - + responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.GET, httpEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - + body = responseEntity.getBody().toString(); configurationType = JsonPath.read(body, "$.configuration-type"); assertEquals("type3", configurationType); - + } - @Test public void TestManagementEndpointConfiguration() { ResponseEntity responseEntity = null; String responseBody = null; - //set Accept as text/plain in order to get access of endpoint "/actuator/prometheus" + // set Accept as text/plain in order to get access of endpoint "/actuator/prometheus" headers.set("Accept", "text/plain"); httpEntity = new HttpEntity(headers); - responseEntity = restTemplate.exchange(actuatorurl + "/actuator/prometheus", HttpMethod.GET, httpEntity, String.class); + responseEntity = + restTemplate.exchange(actuatorurl + "/actuator/prometheus", HttpMethod.GET, httpEntity, String.class); responseBody = (String) responseEntity.getBody(); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertTrue(responseBody.contains("group_id")); assertTrue(responseBody.contains("aai_uri")); - - //Set Accept as MediaType.APPLICATION_JSON in order to get access of endpoint "/actuator/info" and "/actuator/health" + + // Set Accept as MediaType.APPLICATION_JSON in order to get access of endpoint "/actuator/info" and + // "/actuator/health" headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); httpEntity = new HttpEntity(headers); - responseEntity = restTemplate.exchange(actuatorurl + "/actuator/info", HttpMethod.GET, httpEntity, String.class); + responseEntity = + restTemplate.exchange(actuatorurl + "/actuator/info", HttpMethod.GET, httpEntity, String.class); responseBody = (String) responseEntity.getBody(); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertTrue(responseBody.contains("aai-resources")); - responseEntity = restTemplate.exchange(actuatorurl + "/actuator/health", HttpMethod.GET, httpEntity, String.class); + responseEntity = + restTemplate.exchange(actuatorurl + "/actuator/health", HttpMethod.GET, httpEntity, String.class); responseBody = (String) responseEntity.getBody(); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertTrue(responseBody.contains("UP")); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/CustomerFilterSearchTest.java b/aai-resources/src/test/java/org/onap/aai/rest/CustomerFilterSearchTest.java index a52d774..cc35e21 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/CustomerFilterSearchTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/CustomerFilterSearchTest.java @@ -17,18 +17,19 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; -import org.junit.Test; -import org.onap.aai.PayloadUtil; -import org.springframework.http.*; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; import java.util.Base64; import java.util.Collections; -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; +import org.junit.Test; +import org.onap.aai.PayloadUtil; +import org.springframework.http.*; public class CustomerFilterSearchTest extends AbstractSpringRestTest { @@ -36,7 +37,7 @@ public class CustomerFilterSearchTest extends AbstractSpringRestTest { public void testWhenContentTypeMissingItWillFunctionalAndCreateObjectWithPayloadInJson() throws Exception { String id = "customer-987654321-91"; - String endpoint = "/aai/v11/business/customers/customer/"+ id; + String endpoint = "/aai/v11/business/customers/customer/" + id; HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/ExampleConsumerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/ExampleConsumerTest.java index c9941dc..1b2e98d 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/ExampleConsumerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/ExampleConsumerTest.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import static org.junit.Assert.assertEquals; @@ -74,21 +75,21 @@ public class ExampleConsumerTest extends AAISetup { private static final Logger logger = LoggerFactory.getLogger(LegacyMoxyConsumerTest.class.getName()); @BeforeClass - public static void setupRest(){ + public static void setupRest() { AAIGraph.getInstance(); - + } @Before - public void setup(){ + public void setup() { logger.info("Starting the setup for the integration tests of Rest Endpoints"); - exampleConsumer = new ExampleConsumer(); - httpHeaders = Mockito.mock(HttpHeaders.class); - uriInfo = Mockito.mock(UriInfo.class); + exampleConsumer = new ExampleConsumer(); + httpHeaders = Mockito.mock(HttpHeaders.class); + uriInfo = Mockito.mock(UriInfo.class); - headersMultiMap = new MultivaluedHashMap<>(); - queryParameters = Mockito.spy(new MultivaluedHashMap<>()); + headersMultiMap = new MultivaluedHashMap<>(); + queryParameters = Mockito.spy(new MultivaluedHashMap<>()); headersMultiMap.add("X-FromAppId", "JUNIT"); headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); @@ -107,7 +108,6 @@ public class ExampleConsumerTest extends AAISetup { when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList); - when(uriInfo.getQueryParameters()).thenReturn(queryParameters); when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters); @@ -118,14 +118,10 @@ public class ExampleConsumerTest extends AAISetup { } @Test - public void testGetExampleRespondsWithOkStatusForValidObject(){ + public void testGetExampleRespondsWithOkStatusForValidObject() { - Response response = exampleConsumer.getExample( - schemaVersions.getDefaultVersion().toString(), - "pserver", - httpHeaders, - uriInfo, - null); + Response response = exampleConsumer.getExample(schemaVersions.getDefaultVersion().toString(), "pserver", + httpHeaders, uriInfo, null); assertNotNull("Response from the example consumer returned null", response); @@ -135,17 +131,13 @@ public class ExampleConsumerTest extends AAISetup { } @Test - public void testGetExampleFailureForInvalidObject(){ + public void testGetExampleFailureForInvalidObject() { when(uriInfo.getPath()).thenReturn("examples/fakeObject"); when(uriInfo.getPath(false)).thenReturn("examples/fakeObject"); - Response response = exampleConsumer.getExample( - schemaVersions.getDefaultVersion().toString(), - "testRandomCrazyObject", - httpHeaders, - uriInfo, - null); + Response response = exampleConsumer.getExample(schemaVersions.getDefaultVersion().toString(), + "testRandomCrazyObject", httpHeaders, uriInfo, null); assertNotNull("Response from the example consumer returned null", response); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/ExceptionHandlerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/ExceptionHandlerTest.java index 8eb4722..8a6f469 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/ExceptionHandlerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/ExceptionHandlerTest.java @@ -17,18 +17,23 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + import com.fasterxml.jackson.core.JsonLocation; import com.fasterxml.jackson.core.JsonParseException; import com.fasterxml.jackson.databind.JsonMappingException; import com.sun.istack.SAXParseException2; -import org.junit.Before; -import org.junit.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.onap.aai.AAISetup; + +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.WebApplicationException; @@ -36,15 +41,13 @@ import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.Response; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; +import org.junit.Before; +import org.junit.Test; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.onap.aai.AAISetup; public class ExceptionHandlerTest extends AAISetup { @@ -60,10 +63,10 @@ public class ExceptionHandlerTest extends AAISetup { private ExceptionHandler handler = new ExceptionHandler(); @Before - public void setup(){ + public void setup() { MockitoAnnotations.initMocks(this); - MultivaluedHashMap headersMultiMap = new MultivaluedHashMap<>(); + MultivaluedHashMap headersMultiMap = new MultivaluedHashMap<>(); headersMultiMap.add("X-FromAppId", "JUNIT"); headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); @@ -85,7 +88,7 @@ public class ExceptionHandlerTest extends AAISetup { assertNotNull(response); assertNull(response.getEntity()); - assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatus()); + assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), response.getStatus()); } @Test @@ -97,7 +100,7 @@ public class ExceptionHandlerTest extends AAISetup { assertNotNull(response); assertNotNull(response.getEntity()); - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); } @Test @@ -109,7 +112,7 @@ public class ExceptionHandlerTest extends AAISetup { assertNotNull(response); assertNotNull(response.getEntity()); - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); } @Test @@ -121,7 +124,7 @@ public class ExceptionHandlerTest extends AAISetup { assertNotNull(response); assertNotNull(response.getEntity()); - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); } @Test @@ -134,8 +137,7 @@ public class ExceptionHandlerTest extends AAISetup { assertNotNull(response); assertNotNull(response.getEntity()); - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); - + assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); } @@ -152,6 +154,6 @@ public class ExceptionHandlerTest extends AAISetup { assertNotNull(response); assertNotNull(response.getEntity()); - assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); } } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/InvalidURITest.java b/aai-resources/src/test/java/org/onap/aai/rest/InvalidURITest.java index ea41872..128a190 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/InvalidURITest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/InvalidURITest.java @@ -17,21 +17,22 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertEquals; + import org.junit.Test; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertEquals; - public class InvalidURITest extends AbstractSpringRestTest { @Test - public void testWhenUriNotStartsWithAAIItReturnsProperNotFound(){ + public void testWhenUriNotStartsWithAAIItReturnsProperNotFound() { String endpoint = "/aai1/v11/cloud-infrastructure/pservers/pserver/test"; diff --git a/aai-resources/src/test/java/org/onap/aai/rest/LegacyMoxyConsumerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/LegacyMoxyConsumerTest.java index 863b084..4285af8 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/LegacyMoxyConsumerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/LegacyMoxyConsumerTest.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import static org.junit.Assert.assertEquals; @@ -86,29 +87,28 @@ public class LegacyMoxyConsumerTest extends AAISetup { private List outputMediaTypes; private boolean initialized = false; - private static final Logger logger = LoggerFactory.getLogger(LegacyMoxyConsumerTest.class.getName()); @BeforeClass - public static void setupRest(){ - // AAIGraph.getInstance(); + public static void setupRest() { + // AAIGraph.getInstance(); } @Before - public void setup(){ - if(!initialized){ - initialized = true; - AAIGraph.getInstance(); - } + public void setup() { + if (!initialized) { + initialized = true; + AAIGraph.getInstance(); + } logger.info("Starting the setup for the integration tests of Rest Endpoints"); - legacyMoxyConsumer = new LegacyMoxyConsumer(); - httpHeaders = Mockito.mock(HttpHeaders.class); - uriInfo = Mockito.mock(UriInfo.class); + legacyMoxyConsumer = new LegacyMoxyConsumer(); + httpHeaders = Mockito.mock(HttpHeaders.class); + uriInfo = Mockito.mock(UriInfo.class); - headersMultiMap = new MultivaluedHashMap<>(); - queryParameters = Mockito.spy(new MultivaluedHashMap<>()); + headersMultiMap = new MultivaluedHashMap<>(); + queryParameters = Mockito.spy(new MultivaluedHashMap<>()); headersMultiMap.add("X-FromAppId", "JUNIT"); headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); @@ -127,7 +127,6 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList); - when(uriInfo.getQueryParameters()).thenReturn(queryParameters); when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters); @@ -136,7 +135,6 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(httpHeaders.getMediaType()).thenReturn(APPLICATION_JSON); - } @Test @@ -148,7 +146,7 @@ public class LegacyMoxyConsumerTest extends AAISetup { assertNotNull("Introspector returned invalid string when marshalling the object", payload); assertNotNull("Introspector failed to return a valid uri", uri); - if(uri.length() != 0 && uri.charAt(0) == '/'){ + if (uri.length() != 0 && uri.charAt(0) == '/') { uri = uri.substring(1); } @@ -156,59 +154,33 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(uriInfo.getPath(false)).thenReturn(uri); MockHttpServletRequest mockReqGet = new MockHttpServletRequest("GET", uri); - Response response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReqGet - ); + Response response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, mockReqGet); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", uri); - response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, + uriInfo, mockReq); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus()); queryParameters.add("depth", "10000"); - response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "10000", - "false", - httpHeaders, - uriInfo, - mockReqGet - ); + response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), uri, + "10000", "false", httpHeaders, uriInfo, mockReqGet); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } - String pserverEntity = response.getEntity().toString(); + String pserverEntity = response.getEntity().toString(); JSONObject pserverJsonbject = new JSONObject(pserverEntity); assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); @@ -220,34 +192,18 @@ public class LegacyMoxyConsumerTest extends AAISetup { queryParameters.add("resource-version", resourceVersion); mockReq = new MockHttpServletRequest("DELETE", uri); - response = legacyMoxyConsumer.delete( - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - "", - mockReq - ); + response = legacyMoxyConsumer.delete(schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, uriInfo, + "", mockReq); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); - response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReqGet - ); + response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), uri, + "all", "false", httpHeaders, uriInfo, mockReqGet); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); } @@ -257,7 +213,7 @@ public class LegacyMoxyConsumerTest extends AAISetup { String uri = getGetAllPserversURI(); - if(uri.length() != 0 && uri.charAt(0) == '/'){ + if (uri.length() != 0 && uri.charAt(0) == '/') { uri = uri.substring(1); } @@ -265,18 +221,8 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(uriInfo.getPath(false)).thenReturn(uri); MockHttpServletRequest mockReqGet = new MockHttpServletRequest("GET", uri); - Response response = legacyMoxyConsumer.getLegacy( - "", - "1", - "10", - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReqGet - ); + Response response = legacyMoxyConsumer.getLegacy("", "1", "10", schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, mockReqGet); assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); } @@ -287,7 +233,7 @@ public class LegacyMoxyConsumerTest extends AAISetup { String complexData = getRelationshipPayload("complex"); String hostname = "590a8943-1200-43b3-825b-75dde6b8f44a"; - String physicalLocationId ="e13d4587-19ad-4bf5-80f5-c021efb5b61c"; + String physicalLocationId = "e13d4587-19ad-4bf5-80f5-c021efb5b61c"; String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); String cloudRegionUri = String.format("cloud-infrastructure/complexes/complex/%s", physicalLocationId); @@ -296,42 +242,32 @@ public class LegacyMoxyConsumerTest extends AAISetup { doSetupResource(cloudRegionUri, complexData); String cloudToPserverRelationshipData = getRelationshipPayload("pserver-complex-relationship"); - String cloudToPserverRelationshipUri = String.format( - "cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); + String cloudToPserverRelationshipUri = + String.format("cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", cloudToPserverRelationshipUri); - Response response = legacyMoxyConsumer.updateRelationship( - cloudToPserverRelationshipData, - schemaVersions.getDefaultVersion().toString(), - cloudToPserverRelationshipUri, - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.updateRelationship(cloudToPserverRelationshipData, + schemaVersions.getDefaultVersion().toString(), cloudToPserverRelationshipUri, httpHeaders, uriInfo, + mockReq); assertNotNull("Response from the legacy moxy consumer returned null", response); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } - assertEquals("Expected to return status created from the response", - Response.Status.OK.getStatusCode(), response.getStatus()); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + assertEquals("Expected to return status created from the response", Response.Status.OK.getStatusCode(), + response.getStatus()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); // TODO - Need to actually verify the relationship between pserver and cloud-region mockReq = new MockHttpServletRequest("DELETE", cloudToPserverRelationshipUri); - response = legacyMoxyConsumer.deleteRelationship( - cloudToPserverRelationshipData, - schemaVersions.getDefaultVersion().toString(), - cloudToPserverRelationshipUri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.deleteRelationship(cloudToPserverRelationshipData, + schemaVersions.getDefaultVersion().toString(), cloudToPserverRelationshipUri, httpHeaders, uriInfo, + mockReq); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); @@ -359,17 +295,11 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", uri); - Response response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, + httpHeaders, uriInfo, mockReq); int code = response.getStatus(); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), code); } @@ -382,70 +312,36 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenThrow(new IllegalArgumentException()); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", uri); - Response response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, + httpHeaders, uriInfo, mockReq); int code = response.getStatus(); assertNotNull("Response from the legacy moxy consumer returned null", response); assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), code); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); - response = legacyMoxyConsumer.updateRelationship( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.updateRelationship(payload, schemaVersions.getDefaultVersion().toString(), uri, + httpHeaders, uriInfo, mockReq); code = response.getStatus(); assertNotNull("Response from the legacy moxy consumer returned null", response); assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), code); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); mockReq = new MockHttpServletRequest("GET", uri); - response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), uri, + "all", "false", httpHeaders, uriInfo, mockReq); assertNotNull("Response from the legacy moxy consumer returned null", response); assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), code); mockReq = new MockHttpServletRequest("DELETE", uri); - response = legacyMoxyConsumer.delete( - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - "", - mockReq - ); + response = legacyMoxyConsumer.delete(schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, uriInfo, + "", mockReq); code = response.getStatus(); assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), code); - response = legacyMoxyConsumer.deleteRelationship( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.deleteRelationship(payload, schemaVersions.getDefaultVersion().toString(), uri, + httpHeaders, uriInfo, mockReq); code = response.getStatus(); assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), code); } @@ -459,72 +355,38 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", uri); - Response response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, + httpHeaders, uriInfo, mockReq); int code = response.getStatus(); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), code); - response = legacyMoxyConsumer.updateRelationship( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.updateRelationship(payload, schemaVersions.getDefaultVersion().toString(), uri, + httpHeaders, uriInfo, mockReq); code = response.getStatus(); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), code); mockReq = new MockHttpServletRequest("GET", uri); - response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), uri, + "all", "false", httpHeaders, uriInfo, mockReq); assertNotNull("Response from the legacy moxy consumer returned null", response); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), code); mockReq = new MockHttpServletRequest("DELETE", uri); queryParameters.add("resource-version", "3434394839483"); - response = legacyMoxyConsumer.delete( - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - "", - mockReq - ); + response = legacyMoxyConsumer.delete(schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, uriInfo, + "", mockReq); code = response.getStatus(); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), code); - response = legacyMoxyConsumer.deleteRelationship( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.deleteRelationship(payload, schemaVersions.getDefaultVersion().toString(), uri, + httpHeaders, uriInfo, mockReq); code = response.getStatus(); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), code); } @@ -534,9 +396,9 @@ public class LegacyMoxyConsumerTest extends AAISetup { public void testPatchWithValidData() throws IOException { String payload = getResourcePayload("pserver-patch-test"); - String uri = getUri("pserver-patch-test"); + String uri = getUri("pserver-patch-test"); - if(uri.length() != 0 && uri.charAt(0) == '/'){ + if (uri.length() != 0 && uri.charAt(0) == '/') { uri = uri.substring(1); } @@ -544,33 +406,17 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(uriInfo.getPath(false)).thenReturn(uri); MockHttpServletRequest mockReq = new MockHttpServletRequest("GET", uri); - Response response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, mockReq); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); mockReq = new MockHttpServletRequest("PUT", uri); - response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, + uriInfo, mockReq); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus()); @@ -583,18 +429,12 @@ public class LegacyMoxyConsumerTest extends AAISetup { outputMediaTypes.add(MediaType.valueOf("application/merge-patch+json")); mockReq = new MockHttpServletRequest("PATCH", uri); - response = legacyMoxyConsumer.patch( - patchData, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.patch(patchData, schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, + uriInfo, mockReq); code = response.getStatus(); assertNotNull("Response from the patch returned null", response); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); assertEquals(Response.Status.OK.getStatusCode(), code); } @@ -607,59 +447,33 @@ public class LegacyMoxyConsumerTest extends AAISetup { HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class); when(mockRequest.getRequestURL()).thenReturn(new StringBuffer("https://localhost:8447/aai/v15/" + uri)); - Response response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockRequest - ); + Response response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, mockRequest); assertNotNull("Response from the legacy moxy consumer returned null", response); - assertEquals("Expected to not have the data already in memory", - Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); - - response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockRequest - ); + assertEquals("Expected to not have the data already in memory", Response.Status.NOT_FOUND.getStatusCode(), + response.getStatus()); + + response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, + uriInfo, mockRequest); assertNotNull("Response from the legacy moxy consumer returned null", response); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } - assertEquals("Expected to return status created from the response", - Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("Expected to return status created from the response", Response.Status.CREATED.getStatusCode(), + response.getStatus()); queryParameters.add("depth", "10000"); - response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockRequest - ); + response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), uri, + "all", "false", httpHeaders, uriInfo, mockRequest); assertNotNull("Response from the legacy moxy consumer returned null", response); assertEquals("Expected to return the pserver data that was just put in memory", Response.Status.OK.getStatusCode(), response.getStatus()); - if("".equalsIgnoreCase(payload)){ + if ("".equalsIgnoreCase(payload)) { payload = "{}"; } @@ -667,7 +481,7 @@ public class LegacyMoxyConsumerTest extends AAISetup { } @Test - public void testDeleteRelationshipThrowsException(){ + public void testDeleteRelationshipThrowsException() { String payload = ""; String hostname = "testData"; @@ -677,22 +491,16 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(uriInfo.getPath(false)).thenReturn(uri); MockHttpServletRequest mockReq = new MockHttpServletRequest("DELETE", uri); - Response response = legacyMoxyConsumer.deleteRelationship( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.deleteRelationship(payload, + schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, uriInfo, mockReq); int code = response.getStatus(); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), code); } // TODO - Change this to be abstract and inheritable - public String getObjectName(){ + public String getObjectName() { return "pserver"; } @@ -704,55 +512,65 @@ public class LegacyMoxyConsumerTest extends AAISetup { return getPayload("payloads/relationship/" + relationshipName + ".json"); } - public String getUri(String hostname){ + public String getUri(String hostname) { return String.format("cloud-infrastructure/pservers/pserver/%s", hostname); } - public String getGetAllPserversURI(){ + + public String getGetAllPserversURI() { return "cloud-infrastructure/pservers"; } - - public String getUri(){ + public String getUri() { return getUri("pserver-hostname-test"); } @Test - public void legacyMoxyCheckTimeoutEnabled() throws Exception{ - boolean isTimeoutEnabled = legacyMoxyConsumer.isTimeoutEnabled("JUNITTESTAPP1", AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); + public void legacyMoxyCheckTimeoutEnabled() throws Exception { + boolean isTimeoutEnabled = legacyMoxyConsumer.isTimeoutEnabled("JUNITTESTAPP1", + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); assertEquals(true, isTimeoutEnabled); } @Test - public void legacyMoxyCheckTimeoutEnabledOverride() throws Exception{ - boolean isTimeoutEnabled = legacyMoxyConsumer.isTimeoutEnabled("JUNITTESTAPP2", AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); + public void legacyMoxyCheckTimeoutEnabledOverride() throws Exception { + boolean isTimeoutEnabled = legacyMoxyConsumer.isTimeoutEnabled("JUNITTESTAPP2", + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); assertEquals(false, isTimeoutEnabled); } @Test - public void legacyMoxyCheckTimeoutEnabledDefaultLimit() throws Exception{ - boolean isTimeoutEnabled = legacyMoxyConsumer.isTimeoutEnabled("JUNITTESTAPP3", AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); + public void legacyMoxyCheckTimeoutEnabledDefaultLimit() throws Exception { + boolean isTimeoutEnabled = legacyMoxyConsumer.isTimeoutEnabled("JUNITTESTAPP3", + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_ENABLED), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); assertEquals(true, isTimeoutEnabled); - int timeout = legacyMoxyConsumer.getTimeoutLimit("JUNITTESTAPP3", AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); + int timeout = legacyMoxyConsumer.getTimeoutLimit("JUNITTESTAPP3", + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); assertEquals(100000, timeout); } @Test - public void legacyMoxyGetTimeout() throws Exception{ - int timeout = legacyMoxyConsumer.getTimeoutLimit("JUNITTESTAPP1", AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); + public void legacyMoxyGetTimeout() throws Exception { + int timeout = legacyMoxyConsumer.getTimeoutLimit("JUNITTESTAPP1", + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); assertEquals(1, timeout); } @Test - public void legacyMoxyGetTimeoutOverride() throws Exception{ - int timeout = legacyMoxyConsumer.getTimeoutLimit("JUNITTESTAPP2", AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); + public void legacyMoxyGetTimeoutOverride() throws Exception { + int timeout = legacyMoxyConsumer.getTimeoutLimit("JUNITTESTAPP2", + AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_APP), AAIConfig.get(AAIConstants.AAI_CRUD_TIMEOUT_LIMIT)); assertEquals(-1, timeout); } + @Ignore("Time sensitive test only times out if the response takes longer than 1 second") @Test - public void testTimeoutGetCall() throws Exception{ + public void testTimeoutGetCall() throws Exception { String uri = getUri(); - if(uri.length() != 0 && uri.charAt(0) == '/'){ + if (uri.length() != 0 && uri.charAt(0) == '/') { uri = uri.substring(1); } @@ -762,26 +580,17 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap); MockHttpServletRequest mockReqGet = new MockHttpServletRequest("GET", uri); - Response response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReqGet - ); + Response response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, mockReqGet); assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); } + @Test - public void testBypassTimeoutGetCall() throws Exception{ + public void testBypassTimeoutGetCall() throws Exception { String uri = getUri(); - if(uri.length() != 0 && uri.charAt(0) == '/'){ + if (uri.length() != 0 && uri.charAt(0) == '/') { uri = uri.substring(1); } @@ -791,18 +600,8 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(httpHeaders.getRequestHeaders()).thenReturn(headersMultiMap); MockHttpServletRequest mockReqGet = new MockHttpServletRequest("GET", uri); - Response response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReqGet - ); + Response response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, mockReqGet); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); } @@ -814,7 +613,7 @@ public class LegacyMoxyConsumerTest extends AAISetup { String complexData = getRelationshipPayload("complex2"); String hostname = "590a8943-1200-43b3-825b-75dde6b8f44b"; - String physicalLocationId ="e13d4587-19ad-4bf5-80f5-c021efb5b61d"; + String physicalLocationId = "e13d4587-19ad-4bf5-80f5-c021efb5b61d"; String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); String cloudRegionUri = String.format("cloud-infrastructure/complexes/complex/%s", physicalLocationId); @@ -823,50 +622,37 @@ public class LegacyMoxyConsumerTest extends AAISetup { doSetupResource(cloudRegionUri, complexData); String cloudToPserverRelationshipData = getRelationshipPayload("pserver-complex-relationship2"); - String cloudToPserverRelationshipUri = String.format( - "cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); + String cloudToPserverRelationshipUri = + String.format("cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", cloudToPserverRelationshipUri); - Response response = legacyMoxyConsumer.updateRelationship( - cloudToPserverRelationshipData, - schemaVersions.getDefaultVersion().toString(), - cloudToPserverRelationshipUri, - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.updateRelationship(cloudToPserverRelationshipData, + schemaVersions.getDefaultVersion().toString(), cloudToPserverRelationshipUri, httpHeaders, uriInfo, + mockReq); assertNotNull("Response from the legacy moxy consumer returned null", response); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } - assertEquals("Expected to return status created from the response", - Response.Status.OK.getStatusCode(), response.getStatus()); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + assertEquals("Expected to return status created from the response", Response.Status.OK.getStatusCode(), + response.getStatus()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); - String getRelationshipMockRequestUri = String.format( - "cloud-infrastructure/pservers/pserver/%s/relationship-list", hostname); - String getRelationshipUri = String.format( - "cloud-infrastructure/pservers/pserver/%s", hostname); + String getRelationshipMockRequestUri = + String.format("cloud-infrastructure/pservers/pserver/%s/relationship-list", hostname); + String getRelationshipUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class); - when(mockRequest.getRequestURL()).thenReturn(new StringBuffer("https://localhost:8447/aai/v15/" + getRelationshipUri)); - response = legacyMoxyConsumer.getRelationshipList( - "1", - "1", - schemaVersions.getDefaultVersion().toString(), - getRelationshipUri, - "false", - httpHeaders, - mockRequest, - uriInfo - ); + when(mockRequest.getRequestURL()) + .thenReturn(new StringBuffer("https://localhost:8447/aai/v15/" + getRelationshipUri)); + response = legacyMoxyConsumer.getRelationshipList("1", "1", schemaVersions.getDefaultVersion().toString(), + getRelationshipUri, "false", httpHeaders, mockRequest, uriInfo); String s = response.getEntity().toString(); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); @@ -880,7 +666,7 @@ public class LegacyMoxyConsumerTest extends AAISetup { String complexData = getRelationshipPayload("complex3"); String hostname = "590a8943-1200-43b3-825b-75dde6b8f44c"; - String physicalLocationId ="e13d4587-19ad-4bf5-80f5-c021efb5b61e"; + String physicalLocationId = "e13d4587-19ad-4bf5-80f5-c021efb5b61e"; String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); String cloudRegionUri = String.format("cloud-infrastructure/complexes/complex/%s", physicalLocationId); @@ -889,50 +675,37 @@ public class LegacyMoxyConsumerTest extends AAISetup { doSetupResource(cloudRegionUri, complexData); String cloudToPserverRelationshipData = getRelationshipPayload("pserver-complex-relationship3"); - String cloudToPserverRelationshipUri = String.format( - "cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); + String cloudToPserverRelationshipUri = + String.format("cloud-infrastructure/pservers/pserver/%s/relationship-list/relationship", hostname); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", cloudToPserverRelationshipUri); - Response response = legacyMoxyConsumer.updateRelationship( - cloudToPserverRelationshipData, - schemaVersions.getDefaultVersion().toString(), - cloudToPserverRelationshipUri, - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.updateRelationship(cloudToPserverRelationshipData, + schemaVersions.getDefaultVersion().toString(), cloudToPserverRelationshipUri, httpHeaders, uriInfo, + mockReq); assertNotNull("Response from the legacy moxy consumer returned null", response); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } - assertEquals("Expected to return status created from the response", - Response.Status.OK.getStatusCode(), response.getStatus()); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + assertEquals("Expected to return status created from the response", Response.Status.OK.getStatusCode(), + response.getStatus()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); - String getRelationshipMockRequestUri = String.format( - "cloud-infrastructure/pservers/pserver/%s/relationship-list", hostname); - String getRelationshipUri = String.format( - "cloud-infrastructure/pservers/pserver/%s", hostname); + String getRelationshipMockRequestUri = + String.format("cloud-infrastructure/pservers/pserver/%s/relationship-list", hostname); + String getRelationshipUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); queryParameters.add("format", "resource"); HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class); - when(mockRequest.getRequestURL()).thenReturn(new StringBuffer("https://localhost:8447/aai/v15/" + getRelationshipUri)); - response = legacyMoxyConsumer.getRelationshipList( - "1", - "1", - schemaVersions.getDefaultVersion().toString(), - getRelationshipUri, - "false", - httpHeaders, - mockRequest, - uriInfo - ); + when(mockRequest.getRequestURL()) + .thenReturn(new StringBuffer("https://localhost:8447/aai/v15/" + getRelationshipUri)); + response = legacyMoxyConsumer.getRelationshipList("1", "1", schemaVersions.getDefaultVersion().toString(), + getRelationshipUri, "false", httpHeaders, mockRequest, uriInfo); queryParameters.remove("format"); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); @@ -975,7 +748,7 @@ public class LegacyMoxyConsumerTest extends AAISetup { String complexData = getRelationshipPayload("complex4"); String hostname = "590a8943-1200-43b3-825b-75dde6b8f44d"; - String physicalLocationId ="e13d4587-19ad-4bf5-80f5-c021efb5b61f"; + String physicalLocationId = "e13d4587-19ad-4bf5-80f5-c021efb5b61f"; String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); String cloudRegionUri = String.format("cloud-infrastructure/complexes/complex/%s", physicalLocationId); @@ -983,27 +756,20 @@ public class LegacyMoxyConsumerTest extends AAISetup { doSetupResource(pserverUri, pserverData); doSetupResource(cloudRegionUri, complexData); - String getRelationshipMockRequestUri = String.format( - "cloud-infrastructure/pservers/pserver/%s/relationship-list", hostname); - String getRelationshipUri = String.format( - "cloud-infrastructure/pservers/pserver/%s", hostname); + String getRelationshipMockRequestUri = + String.format("cloud-infrastructure/pservers/pserver/%s/relationship-list", hostname); + String getRelationshipUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); MockHttpServletRequest mockReq = new MockHttpServletRequest("GET_RELATIONSHIP", getRelationshipMockRequestUri); HttpServletRequest mockRequest = Mockito.mock(HttpServletRequest.class); - when(mockRequest.getRequestURL()).thenReturn(new StringBuffer("https://localhost:8447/aai/v15/" + getRelationshipUri)); - Response response = legacyMoxyConsumer.getRelationshipList( - "1", - "1", - schemaVersions.getDefaultVersion().toString(), - getRelationshipUri, - "false", - httpHeaders, - mockRequest, - uriInfo - ); + when(mockRequest.getRequestURL()) + .thenReturn(new StringBuffer("https://localhost:8447/aai/v15/" + getRelationshipUri)); + Response response = + legacyMoxyConsumer.getRelationshipList("1", "1", schemaVersions.getDefaultVersion().toString(), + getRelationshipUri, "false", httpHeaders, mockRequest, uriInfo); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); @@ -1015,19 +781,22 @@ public class LegacyMoxyConsumerTest extends AAISetup { String vserverData = getResourcePayload("vserver1"); String hostname = "pserver-hostname-test01"; - String cloudRegionId ="testAIC01"; - String tenant ="tenant01"; - String vserver ="vserver01"; + String cloudRegionId = "testAIC01"; + String tenant = "tenant01"; + String vserver = "vserver01"; String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true", hostname); - String vserverUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s?skip-related-to=true", cloudRegionId); + String vserverUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s?skip-related-to=true", cloudRegionId); // PUT the resources putResourceWithQueryParam(pserverUri, pserverData); putResourceWithQueryParam(vserverUri, vserverData); - String pserverMockRequestUri = String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true", hostname); - String vserverMockRequestUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s?skip-related-to=true", + String pserverMockRequestUri = + String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true", hostname); + String vserverMockRequestUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s?skip-related-to=true", cloudRegionId, tenant, vserver); // === GET - related-to-property should not exist === @@ -1042,12 +811,13 @@ public class LegacyMoxyConsumerTest extends AAISetup { // === Clean up (DELETE) === // vserver - String deleteUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String deleteUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); Response response = deleteServerObject(vserverMockRequestUri, deleteUri, "vserver"); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); @@ -1055,8 +825,8 @@ public class LegacyMoxyConsumerTest extends AAISetup { deleteUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); response = deleteServerObject(pserverMockRequestUri, deleteUri, "pserver"); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); } @@ -1067,9 +837,9 @@ public class LegacyMoxyConsumerTest extends AAISetup { String vserverData = getResourcePayload("vserver2"); String hostname = "pserver-hostname-test02"; - String cloudRegionId ="testAIC02"; - String tenant ="tenant02"; - String vserver ="vserver02"; + String cloudRegionId = "testAIC02"; + String tenant = "tenant02"; + String vserver = "vserver02"; String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); String vserverUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s", cloudRegionId); @@ -1079,7 +849,8 @@ public class LegacyMoxyConsumerTest extends AAISetup { doSetupResource(vserverUri, vserverData); String pserverMockRequestUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); - String vserverMockRequestUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String vserverMockRequestUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); // === GET - related-to-property should not exist === @@ -1094,12 +865,13 @@ public class LegacyMoxyConsumerTest extends AAISetup { // === Clean up (DELETE) === // vserver - String deleteUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String deleteUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); Response response = deleteServerObject(vserverMockRequestUri, deleteUri, "vserver"); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); @@ -1107,8 +879,8 @@ public class LegacyMoxyConsumerTest extends AAISetup { deleteUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); response = deleteServerObject(pserverMockRequestUri, deleteUri, "pserver"); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); } @@ -1119,19 +891,24 @@ public class LegacyMoxyConsumerTest extends AAISetup { String vserverData = getResourcePayload("vserver3"); String hostname = "pserver-hostname-test03"; - String cloudRegionId ="testAIC03"; - String tenant ="tenant03"; - String vserver ="vserver03"; + String cloudRegionId = "testAIC03"; + String tenant = "tenant03"; + String vserver = "vserver03"; - String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true&format=resource", hostname); - String vserverUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s?skip-related-to=true&format=resource", cloudRegionId); + String pserverUri = String + .format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true&format=resource", hostname); + String vserverUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s?skip-related-to=true&format=resource", + cloudRegionId); // PUT the resources putResourceWithQueryParam(pserverUri, pserverData); putResourceWithQueryParam(vserverUri, vserverData); - String pserverMockRequestUri = String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true&format=resource", hostname); - String vserverMockRequestUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s?skip-related-to=true&format=resource", + String pserverMockRequestUri = String + .format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true&format=resource", hostname); + String vserverMockRequestUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s?skip-related-to=true&format=resource", cloudRegionId, tenant, vserver); // === GET - related-to-property should not exist === @@ -1146,14 +923,16 @@ public class LegacyMoxyConsumerTest extends AAISetup { // === Clean up (DELETE) === // vserver - String deleteUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String deleteUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); - String vserverMockRequestUriNoFormat = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String vserverMockRequestUriNoFormat = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); Response response = deleteServerObject(vserverMockRequestUriNoFormat, deleteUri, "vserver"); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); @@ -1161,8 +940,8 @@ public class LegacyMoxyConsumerTest extends AAISetup { deleteUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); response = deleteServerObject(pserverMockRequestUri, deleteUri, "pserver"); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); @@ -1174,19 +953,24 @@ public class LegacyMoxyConsumerTest extends AAISetup { String vserverData = getResourcePayload("vserver4"); String hostname = "pserver-hostname-test04"; - String cloudRegionId ="testAIC04"; - String tenant ="tenant04"; - String vserver ="vserver04"; + String cloudRegionId = "testAIC04"; + String tenant = "tenant04"; + String vserver = "vserver04"; - String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true&format=resource_and_url", hostname); - String vserverUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s?skip-related-to=true&format=resource_and_url", cloudRegionId); + String pserverUri = String.format( + "cloud-infrastructure/pservers/pserver/%s?skip-related-to=true&format=resource_and_url", hostname); + String vserverUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s?skip-related-to=true&format=resource_and_url", + cloudRegionId); // PUT the resources putResourceWithQueryParam(pserverUri, pserverData); putResourceWithQueryParam(vserverUri, vserverData); - String pserverMockRequestUri = String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true&format=resource_and_url", hostname); - String vserverMockRequestUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s?skip-related-to=true&format=resource_and_url", + String pserverMockRequestUri = String.format( + "cloud-infrastructure/pservers/pserver/%s?skip-related-to=true&format=resource_and_url", hostname); + String vserverMockRequestUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s?skip-related-to=true&format=resource_and_url", cloudRegionId, tenant, vserver); // === GET - related-to-property should not exist === @@ -1201,14 +985,16 @@ public class LegacyMoxyConsumerTest extends AAISetup { // === Clean up (DELETE) === // vserver - String deleteUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String deleteUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); - String vserverMockRequestUriNoFormat = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String vserverMockRequestUriNoFormat = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); Response response = deleteServerObject(vserverMockRequestUriNoFormat, deleteUri, "vserver"); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); @@ -1216,8 +1002,8 @@ public class LegacyMoxyConsumerTest extends AAISetup { deleteUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); response = deleteServerObject(pserverMockRequestUri, deleteUri, "pserver"); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); } @@ -1228,19 +1014,22 @@ public class LegacyMoxyConsumerTest extends AAISetup { String vserverData = getResourcePayload("vserver5"); String hostname = "pserver-hostname-test05"; - String cloudRegionId ="testAIC05"; - String tenant ="tenant05"; - String vserver ="vserver05"; + String cloudRegionId = "testAIC05"; + String tenant = "tenant05"; + String vserver = "vserver05"; String pserverUri = String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true", hostname); - String vserverUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s?skip-related-to=true", cloudRegionId); + String vserverUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s?skip-related-to=true", cloudRegionId); // PUT the resources putResourceWithQueryParam(pserverUri, pserverData); putResourceWithQueryParam(vserverUri, vserverData); - String pserverMockRequestUri = String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true", hostname); - String vserverMockRequestUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers?vserver-selflink=somelink05&skip-related-to=true", + String pserverMockRequestUri = + String.format("cloud-infrastructure/pservers/pserver/%s?skip-related-to=true", hostname); + String vserverMockRequestUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers?vserver-selflink=somelink05&skip-related-to=true", cloudRegionId, tenant, vserver); // === GET - related-to-property should not exist === @@ -1255,14 +1044,16 @@ public class LegacyMoxyConsumerTest extends AAISetup { // === Clean up (DELETE) === // vserver - String deleteUri = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String deleteUri = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); - String vserverMockRequestUriNoFormat = String.format("cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", + String vserverMockRequestUriNoFormat = String.format( + "cloud-infrastructure/cloud-regions/cloud-region/test-aic/%s/tenants/tenant/%s/vservers/vserver/%s", cloudRegionId, tenant, vserver); Response response = deleteServerObject(vserverMockRequestUriNoFormat, deleteUri, "vserver"); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); @@ -1270,13 +1061,14 @@ public class LegacyMoxyConsumerTest extends AAISetup { deleteUri = String.format("cloud-infrastructure/pservers/pserver/%s", hostname); response = deleteServerObject(pserverMockRequestUri, deleteUri, "pserver"); code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.NO_CONTENT.getStatusCode(), response.getStatus()); } - private Response deleteServerObject(String mockUri, String deleteUri, String nodeType) throws IOException, JSONException { + private Response deleteServerObject(String mockUri, String deleteUri, String nodeType) + throws IOException, JSONException { Response response = getMockResponse(mockUri); String serverEntity = response.getEntity().toString(); JSONObject serverJsonObject = new JSONObject(serverEntity); @@ -1298,14 +1090,8 @@ public class LegacyMoxyConsumerTest extends AAISetup { queryParameters.add("resource-version", resourceVersion); MockHttpServletRequest mockReq = new MockHttpServletRequest("DELETE", deleteUri); - Response deleteResponse = legacyMoxyConsumer.delete( - schemaVersions.getDefaultVersion().toString(), - deleteUri, - httpHeaders, - uriInfo, - resourceVersion, - mockReq - ); + Response deleteResponse = legacyMoxyConsumer.delete(schemaVersions.getDefaultVersion().toString(), deleteUri, + httpHeaders, uriInfo, resourceVersion, mockReq); return deleteResponse; } @@ -1316,7 +1102,7 @@ public class LegacyMoxyConsumerTest extends AAISetup { String[] params; if (!uriSplit[1].contains("&")) { String param = uriSplit[1]; - params = new String[]{param}; + params = new String[] {param}; } else { params = uriSplit[1].split("&"); } @@ -1333,49 +1119,34 @@ public class LegacyMoxyConsumerTest extends AAISetup { when(uriInfo.getPath(false)).thenReturn(uri); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", uri); - Response response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, + httpHeaders, uriInfo, mockReq); assertNotNull("Response from the legacy moxy consumer returned null", response); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } - assertEquals("Expected to return status created from the response", - Response.Status.CREATED.getStatusCode(), response.getStatus()); - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + assertEquals("Expected to return status created from the response", Response.Status.CREATED.getStatusCode(), + response.getStatus()); + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } private Response getMockResponse(String mockUri) throws IOException, JSONException { MockHttpServletRequest mockReq = new MockHttpServletRequest("GET", mockUri); - Response response = legacyMoxyConsumer.getLegacy( - "", - null, - null, - schemaVersions.getDefaultVersion().toString(), - mockUri, - "10000", - "false", - httpHeaders, - uriInfo, - mockReq - ); + Response response = legacyMoxyConsumer.getLegacy("", null, null, schemaVersions.getDefaultVersion().toString(), + mockUri, "10000", "false", httpHeaders, uriInfo, mockReq); String responseEntity = response.getEntity().toString(); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + logger.info("Response Code: " + code + "\tEntity: " + response.getEntity()); } return response; } - private boolean isRelatedToPropertiesFieldNullInResponse(Response response, String nodeType) throws IOException, JSONException { + private boolean isRelatedToPropertiesFieldNullInResponse(Response response, String nodeType) + throws IOException, JSONException { String responseEntity = response.getEntity().toString(); boolean noResultsArray = false; JSONObject responseJsonObj = new JSONObject(responseEntity); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/PserverGenerateUrlTest.java b/aai-resources/src/test/java/org/onap/aai/rest/PserverGenerateUrlTest.java index 7c27477..a4277fb 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/PserverGenerateUrlTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/PserverGenerateUrlTest.java @@ -17,20 +17,23 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertEquals; + import com.jayway.jsonpath.JsonPath; -import org.junit.Test; -import org.springframework.http.*; import java.io.UnsupportedEncodingException; import java.util.Base64; import java.util.Collections; import java.util.UUID; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.springframework.http.*; + public class PserverGenerateUrlTest extends AbstractSpringRestTest { @Test @@ -47,7 +50,8 @@ public class PserverGenerateUrlTest extends AbstractSpringRestTest { assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); String vertexId = responseEntity.getHeaders().getFirst("vertex-id"); - responseEntity = restTemplate.exchange(baseUrl + "/aai/v11/generateurl/id/" + vertexId, HttpMethod.GET, plainHttpEntity(), String.class); + responseEntity = restTemplate.exchange(baseUrl + "/aai/v11/generateurl/id/" + vertexId, HttpMethod.GET, + plainHttpEntity(), String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); assertThat(responseEntity.getBody().toString(), containsString(endpoint)); @@ -57,7 +61,8 @@ public class PserverGenerateUrlTest extends AbstractSpringRestTest { String body = responseEntity.getBody().toString(); String resourceVersion = JsonPath.read(body, "$.resource-version"); - responseEntity = restTemplate.exchange(baseUrl + endpoint+ "?resource-version=" + resourceVersion, HttpMethod.DELETE, httpEntity, String.class); + responseEntity = restTemplate.exchange(baseUrl + endpoint + "?resource-version=" + resourceVersion, + HttpMethod.DELETE, httpEntity, String.class); assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode()); } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/PserverMissingTest.java b/aai-resources/src/test/java/org/onap/aai/rest/PserverMissingTest.java index 511cf84..e59b772 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/PserverMissingTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/PserverMissingTest.java @@ -17,24 +17,26 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.StringContains.containsString; +import static org.junit.Assert.assertEquals; + +import java.util.*; + import org.junit.Test; import org.onap.aai.PayloadUtil; import org.springframework.http.*; -import java.util.*; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.core.StringContains.containsString; -import static org.junit.Assert.assertEquals; public class PserverMissingTest extends AbstractSpringRestTest { @Test public void testWhenContentTypeMissingItWillFunctionalAndCreateObjectWithPayloadInJson() throws Exception { String id = "test-" + UUID.randomUUID().toString(); - String endpoint = "/aai/v11/cloud-infrastructure/pservers/pserver/"+ id; + String endpoint = "/aai/v11/cloud-infrastructure/pservers/pserver/" + id; HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); @@ -62,7 +64,7 @@ public class PserverMissingTest extends AbstractSpringRestTest { public void testWhenAcceptMissingItWillReturnThePayloadInXml() throws Exception { String id = "test-" + UUID.randomUUID().toString(); - String endpoint = "/aai/v11/cloud-infrastructure/pservers/pserver/"+ id; + String endpoint = "/aai/v11/cloud-infrastructure/pservers/pserver/" + id; HttpHeaders headers = new HttpHeaders(); headers.add("Real-Time", "true"); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/PserverRelationshipTest.java b/aai-resources/src/test/java/org/onap/aai/rest/PserverRelationshipTest.java index 017844e..005ad16 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/PserverRelationshipTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/PserverRelationshipTest.java @@ -17,8 +17,20 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.containsString; +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + import org.junit.Test; import org.onap.aai.PayloadUtil; import org.onap.aai.util.MapperUtil; @@ -27,17 +39,6 @@ import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import static org.hamcrest.CoreMatchers.not; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.containsInAnyOrder; -import static org.hamcrest.Matchers.containsString; -import static org.junit.Assert.assertEquals; - public class PserverRelationshipTest extends AbstractSpringRestTest { @Test @@ -56,7 +57,6 @@ public class PserverRelationshipTest extends AbstractSpringRestTest { httpMethodSet.add(HttpMethod.DELETE); httpMethodSet.add(HttpMethod.OPTIONS); - assertEquals(HttpStatus.BAD_REQUEST, responseEntity.getStatusCode()); assertThat(body, containsString("Unrecognized AAI function")); assertThat(responseEntity.getHeaders().getAllow(), containsInAnyOrder(httpMethodSet.toArray())); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/PserverTest.java b/aai-resources/src/test/java/org/onap/aai/rest/PserverTest.java index 7f48ff8..b7dc836 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/PserverTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/PserverTest.java @@ -17,18 +17,20 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; +import static org.junit.Assert.assertEquals; + import com.jayway.jsonpath.JsonPath; + +import java.util.UUID; + import org.junit.Test; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import java.util.UUID; - -import static org.junit.Assert.assertEquals; - /** * A sample junit test using spring boot that provides the ability to spin * up the application from the junit layer and run rest requests against @@ -56,7 +58,8 @@ public class PserverTest extends AbstractSpringRestTest { assertEquals(HttpStatus.CREATED, responseEntity.getStatusCode()); String vertexId = responseEntity.getHeaders().getFirst("vertex-id"); - responseEntity = restTemplate.exchange(baseUrl + "/aai/v11/resources/id/" + vertexId, HttpMethod.GET, httpEntity, String.class); + responseEntity = restTemplate.exchange(baseUrl + "/aai/v11/resources/id/" + vertexId, HttpMethod.GET, + httpEntity, String.class); assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); responseEntity = restTemplate.exchange(baseUrl + endpoint, HttpMethod.GET, httpEntity, String.class); @@ -65,7 +68,8 @@ public class PserverTest extends AbstractSpringRestTest { String body = responseEntity.getBody().toString(); String resourceVersion = JsonPath.read(body, "$.resource-version"); - responseEntity = restTemplate.exchange(baseUrl + endpoint+ "?resource-version=" + resourceVersion, HttpMethod.DELETE, httpEntity, String.class); + responseEntity = restTemplate.exchange(baseUrl + endpoint + "?resource-version=" + resourceVersion, + HttpMethod.DELETE, httpEntity, String.class); assertEquals(HttpStatus.NO_CONTENT, responseEntity.getStatusCode()); } } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/PserverWrongHeaderTest.java b/aai-resources/src/test/java/org/onap/aai/rest/PserverWrongHeaderTest.java index 4d75a2e..a1b8cec 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/PserverWrongHeaderTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/PserverWrongHeaderTest.java @@ -17,20 +17,22 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.rest; - -import org.junit.Test; -import org.springframework.http.*; -import java.util.UUID; +package org.onap.aai.rest; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; -public class PserverWrongHeaderTest extends AbstractSpringRestTest{ + +import java.util.UUID; + +import org.junit.Test; +import org.springframework.http.*; + +public class PserverWrongHeaderTest extends AbstractSpringRestTest { @Test - public void testWhenNoHeadersItFailsWithBadRequestAndReturnsXml(){ + public void testWhenNoHeadersItFailsWithBadRequestAndReturnsXml() { HttpHeaders httpHeaders = new HttpHeaders(); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/URLFromVertexIdConsumerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/URLFromVertexIdConsumerTest.java index f726e2c..5abe263 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/URLFromVertexIdConsumerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/URLFromVertexIdConsumerTest.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import static org.junit.Assert.assertEquals; @@ -79,27 +80,28 @@ public class URLFromVertexIdConsumerTest extends AAISetup { private static final Logger logger = LoggerFactory.getLogger(LegacyMoxyConsumerTest.class.getName()); private boolean initialized = false; + @BeforeClass - public static void setupRest(){ - // AAIGraph.getInstance(); + public static void setupRest() { + // AAIGraph.getInstance(); } @Before - public void setup(){ - if(!initialized){ - initialized = true; - AAIGraph.getInstance(); - } + public void setup() { + if (!initialized) { + initialized = true; + AAIGraph.getInstance(); + } logger.info("Starting the setup for the integration tests of Rest Endpoints"); urlFromVertexIdConsumer = new URLFromVertexIdConsumer(); - legacyMoxyConsumer = new LegacyMoxyConsumer(); + legacyMoxyConsumer = new LegacyMoxyConsumer(); - httpHeaders = Mockito.mock(HttpHeaders.class); - uriInfo = Mockito.mock(UriInfo.class); + httpHeaders = Mockito.mock(HttpHeaders.class); + uriInfo = Mockito.mock(UriInfo.class); - headersMultiMap = new MultivaluedHashMap<>(); - queryParameters = Mockito.spy(new MultivaluedHashMap<>()); + headersMultiMap = new MultivaluedHashMap<>(); + queryParameters = Mockito.spy(new MultivaluedHashMap<>()); headersMultiMap.add("X-FromAppId", "JUNIT"); headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); @@ -118,7 +120,6 @@ public class URLFromVertexIdConsumerTest extends AAISetup { when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList); - when(uriInfo.getQueryParameters()).thenReturn(queryParameters); when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters); @@ -138,33 +139,17 @@ public class URLFromVertexIdConsumerTest extends AAISetup { when(uriInfo.getPath(false)).thenReturn(uri); MockHttpServletRequest mockReqGet = new MockHttpServletRequest("GET", uri); - Response response = legacyMoxyConsumer.getLegacy( - "", - "-1", - "-1", - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReqGet - ); + Response response = legacyMoxyConsumer.getLegacy("", "-1", "-1", schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, mockReqGet); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", uri); - response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, + uriInfo, mockReq); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus()); @@ -175,14 +160,8 @@ public class URLFromVertexIdConsumerTest extends AAISetup { assertTrue("Response doesn't contain the key vertexId", responseHeaders.containsKey("vertex-id")); String vertexId = responseHeaders.get("vertex-id").get(0).toString(); - response = urlFromVertexIdConsumer.generateUrlFromVertexId( - "", - schemaVersions.getDefaultVersion().toString(), - Long.valueOf(vertexId).longValue(), - httpHeaders, - uriInfo, - mockReqGet - ); + response = urlFromVertexIdConsumer.generateUrlFromVertexId("", schemaVersions.getDefaultVersion().toString(), + Long.valueOf(vertexId).longValue(), httpHeaders, uriInfo, mockReqGet); assertNotNull(response); assertEquals(Response.Status.OK.getStatusCode(), response.getStatus()); @@ -198,14 +177,9 @@ public class URLFromVertexIdConsumerTest extends AAISetup { String vertexId = "384584"; MockHttpServletRequest mockReqGet = new MockHttpServletRequest("GET", uri); - Response response = urlFromVertexIdConsumer.generateUrlFromVertexId( - "", - schemaVersions.getDefaultVersion().toString(), - Long.valueOf(vertexId).longValue(), - httpHeaders, - uriInfo, - mockReqGet - ); + Response response = + urlFromVertexIdConsumer.generateUrlFromVertexId("", schemaVersions.getDefaultVersion().toString(), + Long.valueOf(vertexId).longValue(), httpHeaders, uriInfo, mockReqGet); assertNotNull("Check if the response is not null", response); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/VertexIdConsumerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/VertexIdConsumerTest.java index daa87d4..52a5701 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/VertexIdConsumerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/VertexIdConsumerTest.java @@ -17,6 +17,7 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest; import static org.junit.Assert.assertEquals; @@ -50,6 +51,7 @@ import org.onap.aai.exceptions.AAIException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.mock.web.MockHttpServletRequest; + public class VertexIdConsumerTest extends AAISetup { protected static final MediaType APPLICATION_JSON = MediaType.valueOf("application/json"); @@ -78,28 +80,28 @@ public class VertexIdConsumerTest extends AAISetup { private static final Logger logger = LoggerFactory.getLogger(LegacyMoxyConsumerTest.class.getName()); private boolean initialized = false; - + @BeforeClass - public static void setupRest(){ - //AAIGraph.getInstance(); + public static void setupRest() { + // AAIGraph.getInstance(); } @Before - public void setup(){ - if(!initialized){ - initialized = true; - AAIGraph.getInstance(); - } + public void setup() { + if (!initialized) { + initialized = true; + AAIGraph.getInstance(); + } logger.info("Starting the setup for the integration tests of Rest Endpoints"); - vertexIdConsumer = new VertexIdConsumer(); - legacyMoxyConsumer = new LegacyMoxyConsumer(); + vertexIdConsumer = new VertexIdConsumer(); + legacyMoxyConsumer = new LegacyMoxyConsumer(); - httpHeaders = Mockito.mock(HttpHeaders.class); - uriInfo = Mockito.mock(UriInfo.class); + httpHeaders = Mockito.mock(HttpHeaders.class); + uriInfo = Mockito.mock(UriInfo.class); - headersMultiMap = new MultivaluedHashMap<>(); - queryParameters = Mockito.spy(new MultivaluedHashMap<>()); + headersMultiMap = new MultivaluedHashMap<>(); + queryParameters = Mockito.spy(new MultivaluedHashMap<>()); headersMultiMap.add("X-FromAppId", "JUNIT"); headersMultiMap.add("X-TransactionId", UUID.randomUUID().toString()); @@ -118,7 +120,6 @@ public class VertexIdConsumerTest extends AAISetup { when(httpHeaders.getRequestHeader("aai-request-context")).thenReturn(aaiRequestContextList); - when(uriInfo.getQueryParameters()).thenReturn(queryParameters); when(uriInfo.getQueryParameters(false)).thenReturn(queryParameters); @@ -136,36 +137,20 @@ public class VertexIdConsumerTest extends AAISetup { when(uriInfo.getPath()).thenReturn(uri); when(uriInfo.getPath(false)).thenReturn(uri); - + MockHttpServletRequest mockReqGet = new MockHttpServletRequest("GET", uri); - Response response = legacyMoxyConsumer.getLegacy( - "", - "-1", - "-1", - schemaVersions.getDefaultVersion().toString(), - uri, - "all", - "false", - httpHeaders, - uriInfo, - mockReqGet - ); + Response response = legacyMoxyConsumer.getLegacy("", "-1", "-1", schemaVersions.getDefaultVersion().toString(), + uri, "all", "false", httpHeaders, uriInfo, mockReqGet); assertEquals(Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); MockHttpServletRequest mockReq = new MockHttpServletRequest("PUT", uri); - - response = legacyMoxyConsumer.update( - payload, - schemaVersions.getDefaultVersion().toString(), - uri, - httpHeaders, - uriInfo, - mockReq - ); + + response = legacyMoxyConsumer.update(payload, schemaVersions.getDefaultVersion().toString(), uri, httpHeaders, + uriInfo, mockReq); int code = response.getStatus(); - if(!VALID_HTTP_STATUS_CODES.contains(code)){ - System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); + if (!VALID_HTTP_STATUS_CODES.contains(code)) { + System.out.println("Response Code: " + code + "\tEntity: " + response.getEntity()); } assertEquals(Response.Status.CREATED.getStatusCode(), response.getStatus()); @@ -177,15 +162,8 @@ public class VertexIdConsumerTest extends AAISetup { String vertexId = responseHeaders.get("vertex-id").get(0).toString(); - response = vertexIdConsumer.getByVertexId( - "", - schemaVersions.getDefaultVersion().toString(), - Long.valueOf(vertexId).longValue(), - "10000", - httpHeaders, - uriInfo, - mockReqGet - ); + response = vertexIdConsumer.getByVertexId("", schemaVersions.getDefaultVersion().toString(), + Long.valueOf(vertexId).longValue(), "10000", httpHeaders, uriInfo, mockReqGet); assertNotNull(response); String pserverObject = response.getEntity().toString(); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/bulk/BulkSingleTransactionConsumerTest.java b/aai-resources/src/test/java/org/onap/aai/rest/bulk/BulkSingleTransactionConsumerTest.java index 8c24fb4..eaa71a9 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/bulk/BulkSingleTransactionConsumerTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/bulk/BulkSingleTransactionConsumerTest.java @@ -17,10 +17,23 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.bulk; +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.when; + import com.google.gson.JsonArray; import com.google.gson.JsonParser; + +import java.io.IOException; +import java.util.Iterator; + +import javax.ws.rs.HttpMethod; +import javax.ws.rs.core.Response; + import org.apache.tinkerpop.gremlin.structure.Property; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; @@ -37,421 +50,321 @@ import org.onap.aai.rest.BulkProcessorTestAbstraction; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.test.context.TestPropertySource; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.core.Response; -import java.io.IOException; -import java.util.Iterator; +@TestPropertySource(properties = {"delta.events.enabled=true",}) +public class BulkSingleTransactionConsumerTest extends BulkProcessorTestAbstraction { -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertThat; -import static org.mockito.Mockito.when; + private BulkSingleTransactionConsumer bulkSingleTransactionConsumer = new BulkSingleTransactionConsumer("/aai"); + + @Rule + public TestName name = new TestName(); + + private String sot = "Junit"; + + @Before + public void before() { + sot = "JUNIT-" + name.getMethodName(); + when(uriInfo.getPath()).thenReturn(uri); + when(uriInfo.getPath(false)).thenReturn(uri); + headersMultiMap.addFirst("X-FromAppId", sot); + + } + + @Test + public void addPserverPatchSamePserverTest() throws IOException { + + String payload = getBulkPayload("single-transaction/put-patch-same-pserver").replaceAll("", + name.getMethodName()); + Response response = executeRequest(payload); + + assertEquals("Request success", Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("1 vertex from this test in graph", Long.valueOf(1L), AAIGraph.getInstance().getGraph() + .newTransaction().traversal().V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); + assertEquals("1 vertex from this test with fqdn = patched-fqdn", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has("fqdn", "patched-fqdn").count().next()); + + } + + @Test + public void putPserverComplexRelBetween() throws IOException { + + String payload = getBulkPayload("single-transaction/put-pserver-complex-rel-between").replaceAll("", + name.getMethodName()); + Response response = executeRequest(payload); + + assertEquals("Request success", Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("2 vertex from this test in graph", Long.valueOf(2L), AAIGraph.getInstance().getGraph() + .newTransaction().traversal().V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); + assertEquals("1 complex vertex", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "complex").count() + .next()); + assertEquals("1 pserver vertex", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "pserver").count() + .next()); + assertEquals("pserver has edge to complex", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "pserver").bothE() + .otherV().has(AAIProperties.NODE_TYPE, "complex").has(AAIProperties.SOURCE_OF_TRUTH, sot) + .count().next()); + + } + + @Test + public void putPatchSamePserverPutAnotherPserver() throws IOException { + String payload = getBulkPayload("single-transaction/put-patch-same-pserver-put-another-pserver") + .replaceAll("", name.getMethodName()); + Response response = executeRequest(payload); + + assertEquals("Request success", Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("2 vertex from this test in graph", Long.valueOf(2L), AAIGraph.getInstance().getGraph() + .newTransaction().traversal().V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); + assertEquals("pserver 1 has hostname pserver-1-" + name.getMethodName() + " fqdn = patched-fqdn", + Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has("hostname", "pserver-1-" + name.getMethodName()) + .has("fqdn", "patched-fqdn").count().next()); + assertEquals("pserver 2 has hostname pserver-2-" + name.getMethodName(), Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has("hostname", "pserver-2-" + name.getMethodName()) + .count().next()); + } + + protected String asString(Vertex v) { + final JSONObject result = new JSONObject(); + Iterator> properties = v.properties(); + Property pk = null; + try { + while (properties.hasNext()) { + pk = properties.next(); + result.put(pk.key(), pk.value()); + } + } catch (JSONException e) { + e.printStackTrace(); + } + + return result.toString(); + } + + @Test + public void putPserverComplexRelBetweenDelExistingGvnf() throws IOException { + + AAIGraph.getInstance().getGraph().traversal().addV().property(AAIProperties.NODE_TYPE, "generic-vnf") + .property(AAIProperties.SOURCE_OF_TRUTH, sot) + .property(AAIProperties.AAI_URI, + "/network/generic-vnfs/generic-vnf/gvnf-putPserverComplexRelBetweenDelExistingGvnf") + .property(AAIProperties.RESOURCE_VERSION, "0").property("vnf-id", "gvnf-" + name.getMethodName()) + .next(); + AAIGraph.getInstance().getGraph().tx().commit(); + + assertEquals("1 generic-vnf vertex exists before payload", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "generic-vnf").count() + .next()); + + String payload = getBulkPayload("single-transaction/put-pserver-complex-rel-between-del-existing-gvnf") + .replaceAll("", name.getMethodName()); + Response response = executeRequest(payload); + + assertEquals("Request success", Response.Status.CREATED.getStatusCode(), response.getStatus()); + assertEquals("2 vertex from this test in graph", Long.valueOf(2L), AAIGraph.getInstance().getGraph() + .newTransaction().traversal().V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); + assertEquals("1 complex vertex", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "complex").count() + .next()); + assertEquals("1 pserver vertex", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "pserver").count() + .next()); + assertEquals("pserver has edge to complex", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "pserver").bothE() + .otherV().has(AAIProperties.NODE_TYPE, "complex").has(AAIProperties.SOURCE_OF_TRUTH, sot) + .count().next()); + assertEquals("0 generic-vnf vertex exists after payload", Long.valueOf(0L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "generic-vnf").count() + .next()); + + assertThat("Response contains 204 status.", response.getEntity().toString(), + containsString("\"response-status-code\":204")); + + } + + @Test + public void putPserverComplexRelBetweenDelExistingGvnfFail() throws IOException { + + AAIGraph.getInstance().getGraph().traversal().addV().property(AAIProperties.NODE_TYPE, "generic-vnf") + .property(AAIProperties.SOURCE_OF_TRUTH, sot) + .property(AAIProperties.AAI_URI, + "/network/generic-vnfs/generic-vnf/gvnf-putPserverComplexRelBetweenDelExistingGvnfFail") + .property(AAIProperties.RESOURCE_VERSION, "0").property("vnf-id", "gvnf-" + name.getMethodName()) + .next(); + AAIGraph.getInstance().getGraph().tx().commit(); + + assertEquals("1 generic-vnf vertex exists before payload", Long.valueOf(1L), + AAIGraph.getInstance().getGraph().newTransaction().traversal().V() + .has(AAIProperties.SOURCE_OF_TRUTH, sot).has(AAIProperties.NODE_TYPE, "generic-vnf").count() + .next()); + + String payload = getBulkPayload("single-transaction/put-pserver-complex-rel-between-del-existing-gvnf-fail") + .replaceAll("", name.getMethodName()); + Response response = executeRequest(payload); + + System.out.println(response.getEntity().toString()); + + assertEquals("Request failed", Response.Status.PRECONDITION_FAILED.getStatusCode(), response.getStatus()); + + assertEquals("1 vertex exists after payload due to failure", Long.valueOf(1L), AAIGraph.getInstance().getGraph() + .newTransaction().traversal().V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); + + assertThat("Response contains resource version msg for failed transaction.", response.getEntity().toString(), + containsString("Precondition Failed:resource-version MISMATCH for delete of generic-vnf")); + + assertThat("Response contains correct index of failed operation.", response.getEntity().toString(), + containsString("Operation 3")); + + assertThat("Response contains correct status code.", response.getEntity().toString(), + containsString("failed with status code (412")); + + } + + @Test + public void checkExceedsLimit() throws IOException { + + String payload = getBulkPayload("single-transaction/pserver-bulk-limit-exceed"); + Response response = executeRequest(payload); + + assertEquals("Request fails with 400", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertThat("Response contains payload limit msg.", response.getEntity().toString(), + containsString("Payload Limit Reached, reduce payload: Allowed limit = ")); + } + + @Test + public void invalidJson() { + + String payload = "{]}";// malformed json + Response response = executeRequest(payload); + + assertEquals("Request fails with 400", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertThat("Response contains invalid payload msg.", response.getEntity().toString(), containsString( + "JSON processing error:Input payload does not follow bulk/single-transaction interface")); + } + + @Test + public void noOperations() { + + String payload = "{'operations':[]}"; + Response response = executeRequest(payload); + + assertEquals("Request fails with 400", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertThat("Response contains invalid payload msg.", response.getEntity().toString(), + containsString("Required Field not passed.: Payload has no objects to operate on")); + } + + @Test + public void invalidAction() throws IOException { + + String payload = getBulkPayload("single-transaction/invalid-action"); + Response response = executeRequest(payload); + + assertEquals("Request fails with 400", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertThat("Response contains invalid payload msg.", response.getEntity().toString(), + containsString("JSON processing error:input payload missing required properties")); + assertThat("Response contains invalid payload details.", response.getEntity().toString(), + containsString("[Operation 0 has invalid action 'create', Operation 1 has invalid action 'destroy']")); + + } + + @Test + public void missingFields() throws IOException { + + String payload = getBulkPayload("single-transaction/missing-fields"); + Response response = executeRequest(payload); -@TestPropertySource(properties = { - "delta.events.enabled=true", -}) -public class BulkSingleTransactionConsumerTest extends BulkProcessorTestAbstraction { + assertEquals("Request fails with 400", Response.Status.BAD_REQUEST.getStatusCode(), response.getStatus()); + assertThat("Response contains invalid payload msg.", response.getEntity().toString(), + containsString("JSON processing error:input payload missing required properties")); + assertThat("Response contains invalid payload details.", response.getEntity().toString(), containsString( + "[Operation 0 missing 'body', Operation 1 missing 'action', Operation 2 missing 'uri']")); + + } + + @Test + public void putComplexWithRelToNonExistentPserverBetween() throws IOException { + + String payload = getBulkPayload("single-transaction/put-complex-with-rel-to-non-existent") + .replaceAll("", name.getMethodName()); + Response response = executeRequest(payload); + + assertEquals("Request success", Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); + assertEquals("0 vertex from this test in graph", Long.valueOf(0L), AAIGraph.getInstance().getGraph() + .newTransaction().traversal().V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); + assertEquals("Request fails with 404", Response.Status.NOT_FOUND.getStatusCode(), response.getStatus()); + + assertThat("Response contains correct index of failed operation.", response.getEntity().toString(), + containsString("Operation 0")); + + assertThat("Response contains correct status code.", response.getEntity().toString(), + containsString("failed with status code (404")); + + assertThat("Response contains correct msg.", response.getEntity().toString(), + containsString("target node:Node of type pserver. Could not find")); + + assertThat("Response contains correct Error Code.", response.getEntity().toString(), + containsString("ERR.5.4.6129")); + + } - private BulkSingleTransactionConsumer bulkSingleTransactionConsumer = new BulkSingleTransactionConsumer("/aai"); - - @Rule - public TestName name = new TestName(); - - private String sot = "Junit"; - - @Before - public void before() { - sot = "JUNIT-" + name.getMethodName(); - when(uriInfo.getPath()).thenReturn(uri); - when(uriInfo.getPath(false)).thenReturn(uri); - headersMultiMap.addFirst("X-FromAppId", sot); - - } - - @Test - public void addPserverPatchSamePserverTest() throws IOException { - - String payload = getBulkPayload("single-transaction/put-patch-same-pserver").replaceAll("", name.getMethodName()); - Response response = executeRequest(payload); - - assertEquals("Request success", - Response.Status.CREATED.getStatusCode(), - response.getStatus()); - assertEquals("1 vertex from this test in graph", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); - assertEquals("1 vertex from this test with fqdn = patched-fqdn", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has("fqdn", "patched-fqdn").count().next()); - - - } - - @Test - public void putPserverComplexRelBetween() throws IOException { - - String payload = getBulkPayload("single-transaction/put-pserver-complex-rel-between").replaceAll("", name.getMethodName()); - Response response = executeRequest(payload); - - assertEquals("Request success", - Response.Status.CREATED.getStatusCode(), - response.getStatus()); - assertEquals("2 vertex from this test in graph", - Long.valueOf(2L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); - assertEquals("1 complex vertex", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "complex").count().next()); - assertEquals("1 pserver vertex", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "pserver").count().next()); - assertEquals("pserver has edge to complex", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "pserver") - .bothE() - .otherV() - .has(AAIProperties.NODE_TYPE, "complex") - .has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); - - - } - - @Test - public void putPatchSamePserverPutAnotherPserver() throws IOException { - String payload = getBulkPayload("single-transaction/put-patch-same-pserver-put-another-pserver") - .replaceAll("", name.getMethodName()); - Response response = executeRequest(payload); - - assertEquals("Request success", - Response.Status.CREATED.getStatusCode(), - response.getStatus()); - assertEquals("2 vertex from this test in graph", - Long.valueOf(2L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); - assertEquals("pserver 1 has hostname pserver-1-" + name.getMethodName() + " fqdn = patched-fqdn", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has("hostname", "pserver-1-" + name.getMethodName()) - .has("fqdn", "patched-fqdn").count().next()); - assertEquals("pserver 2 has hostname pserver-2-" + name.getMethodName(), - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has("hostname", "pserver-2-" + name.getMethodName()).count().next()); - } - - - protected String asString(Vertex v) { - final JSONObject result = new JSONObject(); - Iterator> properties = v.properties(); - Property pk = null; - try { - while (properties.hasNext()) { - pk = properties.next(); - result.put(pk.key(), pk.value()); - } - } catch (JSONException e) { - e.printStackTrace(); - } - - return result.toString(); - } - - @Test - public void putPserverComplexRelBetweenDelExistingGvnf() throws IOException { - - AAIGraph.getInstance().getGraph().traversal().addV() - .property(AAIProperties.NODE_TYPE, "generic-vnf") - .property(AAIProperties.SOURCE_OF_TRUTH, sot) - .property(AAIProperties.AAI_URI, "/network/generic-vnfs/generic-vnf/gvnf-putPserverComplexRelBetweenDelExistingGvnf") - .property(AAIProperties.RESOURCE_VERSION, "0") - .property("vnf-id", "gvnf-" + name.getMethodName()) - .next(); - AAIGraph.getInstance().getGraph().tx().commit(); - - assertEquals("1 generic-vnf vertex exists before payload", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "generic-vnf").count().next()); - - String payload = getBulkPayload("single-transaction/put-pserver-complex-rel-between-del-existing-gvnf") - .replaceAll("", name.getMethodName()); - Response response = executeRequest(payload); - - assertEquals("Request success", - Response.Status.CREATED.getStatusCode(), - response.getStatus()); - assertEquals("2 vertex from this test in graph", - Long.valueOf(2L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); - assertEquals("1 complex vertex", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "complex").count().next()); - assertEquals("1 pserver vertex", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "pserver").count().next()); - assertEquals("pserver has edge to complex", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "pserver") - .bothE() - .otherV() - .has(AAIProperties.NODE_TYPE, "complex") - .has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); - assertEquals("0 generic-vnf vertex exists after payload", - Long.valueOf(0L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "generic-vnf").count().next()); - - assertThat("Response contains 204 status.", - response.getEntity().toString(), - containsString("\"response-status-code\":204")); - - - } - - @Test - public void putPserverComplexRelBetweenDelExistingGvnfFail() throws IOException { - - AAIGraph.getInstance().getGraph().traversal().addV() - .property(AAIProperties.NODE_TYPE, "generic-vnf") - .property(AAIProperties.SOURCE_OF_TRUTH, sot) - .property(AAIProperties.AAI_URI, "/network/generic-vnfs/generic-vnf/gvnf-putPserverComplexRelBetweenDelExistingGvnfFail") - .property(AAIProperties.RESOURCE_VERSION, "0") - .property("vnf-id", "gvnf-" + name.getMethodName()) - .next(); - AAIGraph.getInstance().getGraph().tx().commit(); - - assertEquals("1 generic-vnf vertex exists before payload", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot) - .has(AAIProperties.NODE_TYPE, "generic-vnf").count().next()); - - String payload = getBulkPayload("single-transaction/put-pserver-complex-rel-between-del-existing-gvnf-fail") - .replaceAll("", name.getMethodName()); - Response response = executeRequest(payload); - - System.out.println(response.getEntity().toString()); - - assertEquals("Request failed", - Response.Status.PRECONDITION_FAILED.getStatusCode(), - response.getStatus()); - - assertEquals("1 vertex exists after payload due to failure", - Long.valueOf(1L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); - - assertThat("Response contains resource version msg for failed transaction.", - response.getEntity().toString(), - containsString("Precondition Failed:resource-version MISMATCH for delete of generic-vnf")); - - assertThat("Response contains correct index of failed operation.", - response.getEntity().toString(), - containsString("Operation 3")); - - assertThat("Response contains correct status code.", - response.getEntity().toString(), - containsString("failed with status code (412")); - - } - - @Test - public void checkExceedsLimit() throws IOException{ - - String payload = getBulkPayload("single-transaction/pserver-bulk-limit-exceed"); - Response response = executeRequest(payload); - - assertEquals("Request fails with 400", - Response.Status.BAD_REQUEST.getStatusCode(), - response.getStatus()); - assertThat("Response contains payload limit msg.", - response.getEntity().toString(), - containsString("Payload Limit Reached, reduce payload: Allowed limit = ")); - } - - @Test - public void invalidJson() { - - String payload = "{]}";//malformed json - Response response = executeRequest(payload); - - assertEquals("Request fails with 400", - Response.Status.BAD_REQUEST.getStatusCode(), - response.getStatus()); - assertThat("Response contains invalid payload msg.", - response.getEntity().toString(), - containsString("JSON processing error:Input payload does not follow bulk/single-transaction interface")); - } - - - @Test - public void noOperations() { - - String payload = "{'operations':[]}"; - Response response = executeRequest(payload); - - assertEquals("Request fails with 400", - Response.Status.BAD_REQUEST.getStatusCode(), - response.getStatus()); - assertThat("Response contains invalid payload msg.", - response.getEntity().toString(), - containsString("Required Field not passed.: Payload has no objects to operate on")); - } - - @Test - public void invalidAction() throws IOException { - - String payload = getBulkPayload("single-transaction/invalid-action"); - Response response = executeRequest(payload); - - assertEquals("Request fails with 400", - Response.Status.BAD_REQUEST.getStatusCode(), - response.getStatus()); - assertThat("Response contains invalid payload msg.", - response.getEntity().toString(), - containsString("JSON processing error:input payload missing required properties")); - assertThat("Response contains invalid payload details.", - response.getEntity().toString(), - containsString("[Operation 0 has invalid action 'create', Operation 1 has invalid action 'destroy']")); - - } - - @Test - public void missingFields() throws IOException { - - String payload = getBulkPayload("single-transaction/missing-fields"); - Response response = executeRequest(payload); - - assertEquals("Request fails with 400", - Response.Status.BAD_REQUEST.getStatusCode(), - response.getStatus()); - assertThat("Response contains invalid payload msg.", - response.getEntity().toString(), - containsString("JSON processing error:input payload missing required properties")); - assertThat("Response contains invalid payload details.", - response.getEntity().toString(), - containsString("[Operation 0 missing 'body', Operation 1 missing 'action', Operation 2 missing 'uri']")); - - } - - @Test - public void putComplexWithRelToNonExistentPserverBetween() throws IOException { - - String payload = getBulkPayload("single-transaction/put-complex-with-rel-to-non-existent").replaceAll("", name.getMethodName()); - Response response = executeRequest(payload); - - assertEquals("Request success", - Response.Status.NOT_FOUND.getStatusCode(), - response.getStatus()); - assertEquals("0 vertex from this test in graph", - Long.valueOf(0L), - AAIGraph.getInstance().getGraph().newTransaction().traversal(). - V().has(AAIProperties.SOURCE_OF_TRUTH, sot).count().next()); - assertEquals("Request fails with 404", - Response.Status.NOT_FOUND.getStatusCode(), - response.getStatus()); - - assertThat("Response contains correct index of failed operation.", - response.getEntity().toString(), - containsString("Operation 0")); - - assertThat("Response contains correct status code.", - response.getEntity().toString(), - containsString("failed with status code (404")); - - assertThat("Response contains correct msg.", - response.getEntity().toString(), - containsString("target node:Node of type pserver. Could not find")); - - assertThat("Response contains correct Error Code.", - response.getEntity().toString(), - containsString("ERR.5.4.6129")); - - } - - - @Test - public void deleteChildRecreateChildTest() throws IOException { - JsonArray requests = new JsonParser().parse( - getBulkPayload("single-transaction/delete-child-recreate-child").replaceAll("", name.getMethodName())) - .getAsJsonObject().getAsJsonArray("array"); - String payload = requests.get(0).toString(); - Response response = executeRequest(payload); - System.out.println(response.getEntity().toString()); - assertEquals("Request success", - Response.Status.CREATED.getStatusCode(), - response.getStatus()); - - payload = requests.get(1).toString(); - response = executeRequest(payload); - System.out.println(response.getEntity().toString()); - assertEquals("Request success", - Response.Status.CREATED.getStatusCode(), - response.getStatus()); - } - - @Test - public void deleteNodeRecreateNodeTest() throws IOException { - JsonArray requests = new JsonParser().parse( - getBulkPayload("single-transaction/delete-node-recreate-node").replaceAll("", name.getMethodName())) - .getAsJsonObject().getAsJsonArray("array"); - String payload = requests.get(0).toString(); - Response response = executeRequest(payload); - System.out.println(response.getEntity().toString()); - assertEquals("Request success", - Response.Status.CREATED.getStatusCode(), - response.getStatus()); - - payload = requests.get(1).toString(); - response = executeRequest(payload); - System.out.println(response.getEntity().toString()); - assertEquals("Request success", - Response.Status.CREATED.getStatusCode(), - response.getStatus()); - } - - - protected Response executeRequest(String finalPayload) { - MockHttpServletRequest mockReq = new MockHttpServletRequest(HttpMethod.POST, "http://www.test.com"); - - return bulkSingleTransactionConsumer.process( - finalPayload, - schemaVersions.getDefaultVersion().toString(), - httpHeaders, - uriInfo, - mockReq - ); - } - - @Override - protected BulkConsumer getConsumer() { - return null; - } - - @Override - protected String getUri() { - return "/aai/" + schemaVersions.getDefaultVersion().toString() + "/bulk/single-transaction"; - } -} \ No newline at end of file + @Test + public void deleteChildRecreateChildTest() throws IOException { + JsonArray requests = + new JsonParser() + .parse(getBulkPayload("single-transaction/delete-child-recreate-child") + .replaceAll("", name.getMethodName())) + .getAsJsonObject().getAsJsonArray("array"); + String payload = requests.get(0).toString(); + Response response = executeRequest(payload); + System.out.println(response.getEntity().toString()); + assertEquals("Request success", Response.Status.CREATED.getStatusCode(), response.getStatus()); + + payload = requests.get(1).toString(); + response = executeRequest(payload); + System.out.println(response.getEntity().toString()); + assertEquals("Request success", Response.Status.CREATED.getStatusCode(), response.getStatus()); + } + + @Test + public void deleteNodeRecreateNodeTest() throws IOException { + JsonArray requests = new JsonParser().parse(getBulkPayload("single-transaction/delete-node-recreate-node") + .replaceAll("", name.getMethodName())).getAsJsonObject().getAsJsonArray("array"); + String payload = requests.get(0).toString(); + Response response = executeRequest(payload); + System.out.println(response.getEntity().toString()); + assertEquals("Request success", Response.Status.CREATED.getStatusCode(), response.getStatus()); + + payload = requests.get(1).toString(); + response = executeRequest(payload); + System.out.println(response.getEntity().toString()); + assertEquals("Request success", Response.Status.CREATED.getStatusCode(), response.getStatus()); + } + + protected Response executeRequest(String finalPayload) { + MockHttpServletRequest mockReq = new MockHttpServletRequest(HttpMethod.POST, "http://www.test.com"); + + return bulkSingleTransactionConsumer.process(finalPayload, schemaVersions.getDefaultVersion().toString(), + httpHeaders, uriInfo, mockReq); + } + + @Override + protected BulkConsumer getConsumer() { + return null; + } + + @Override + protected String getUri() { + return "/aai/" + schemaVersions.getDefaultVersion().toString() + "/bulk/single-transaction"; + } +} diff --git a/aai-resources/src/test/java/org/onap/aai/rest/retired/RetiredConsumerSpringTest.java b/aai-resources/src/test/java/org/onap/aai/rest/retired/RetiredConsumerSpringTest.java index cdd3a51..ed7f274 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/retired/RetiredConsumerSpringTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/retired/RetiredConsumerSpringTest.java @@ -17,20 +17,22 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.retired; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; + import org.junit.Test; import org.onap.aai.rest.AbstractSpringRestTest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import java.util.HashMap; -import java.util.Map; - -import static org.junit.Assert.assertEquals; public class RetiredConsumerSpringTest extends AbstractSpringRestTest { private static final Logger LOGGER = LoggerFactory.getLogger(RetiredConsumerSpringTest.class); @@ -38,31 +40,31 @@ public class RetiredConsumerSpringTest extends AbstractSpringRestTest { private Map httpStatusMap; @Test - public void testOldVersionsEndpointReturnRetired(){ + public void testOldVersionsEndpointReturnRetired() { setupOldVersions(); executeRestCalls(); } @Test - public void testOldModelsRetired(){ + public void testOldModelsRetired() { setupModelsRetired(); executeRestCalls(); } @Test - public void testOldNamedQueriesRetired(){ + public void testOldNamedQueriesRetired() { setupNamedQueriesRetired(); executeRestCalls(); } @Test - public void testEdgeTagQueryRetired(){ + public void testEdgeTagQueryRetired() { setupEdgeTagQueriesRetired(); executeRestCalls(); } @Test - public void testSDNZoneQueryRetired(){ + public void testSDNZoneQueryRetired() { setupSDNZoneQueryRetired(); executeRestCalls(); } @@ -110,14 +112,16 @@ public class RetiredConsumerSpringTest extends AbstractSpringRestTest { httpStatusMap.put("/aai/v13/cloud-infrastructure/pservers/pserver/samomaisdjfajsfoas", HttpStatus.NOT_FOUND); - httpStatusMap.put("/aai/v8/service-design-and-creation/named-queries/named-query/samomaisdjfajsfoas", HttpStatus.GONE); + httpStatusMap.put("/aai/v8/service-design-and-creation/named-queries/named-query/samomaisdjfajsfoas", + HttpStatus.GONE); } protected void executeRestCalls() { httpStatusMap.forEach((url, status) -> { ResponseEntity responseEntity; responseEntity = restTemplate.exchange(baseUrl + url, HttpMethod.GET, httpEntity, String.class); - LOGGER.debug("For url {} expected status {} actual status {} and body {}", url, status, responseEntity.getStatusCodeValue(), responseEntity.getBody()); + LOGGER.debug("For url {} expected status {} actual status {} and body {}", url, status, + responseEntity.getStatusCodeValue(), responseEntity.getBody()); assertEquals(status, responseEntity.getStatusCode()); }); } diff --git a/aai-resources/src/test/java/org/onap/aai/rest/util/LogFormatToolsTest.java b/aai-resources/src/test/java/org/onap/aai/rest/util/LogFormatToolsTest.java index f17257b..ad3f9c2 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/util/LogFormatToolsTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/util/LogFormatToolsTest.java @@ -17,16 +17,17 @@ * limitations under the License. * ============LICENSE_END========================================================= */ -package org.onap.aai.rest.util; -import org.junit.Test; +package org.onap.aai.rest.util; import static org.junit.Assert.assertNotNull; +import org.junit.Test; + public class LogFormatToolsTest { @Test - public void testLogFormatTools(){ + public void testLogFormatTools() { String dateTime = new LogFormatTools().getCurrentDateTime(); assertNotNull(dateTime); diff --git a/aai-resources/src/test/java/org/onap/aai/rest/util/ValidateEncodingTest.java b/aai-resources/src/test/java/org/onap/aai/rest/util/ValidateEncodingTest.java index 136b64e..442c0fc 100644 --- a/aai-resources/src/test/java/org/onap/aai/rest/util/ValidateEncodingTest.java +++ b/aai-resources/src/test/java/org/onap/aai/rest/util/ValidateEncodingTest.java @@ -17,96 +17,98 @@ * limitations under the License. * ============LICENSE_END========================================================= */ + package org.onap.aai.rest.util; -import org.junit.Test; -import org.mockito.Mockito; +import static org.junit.Assert.assertEquals; + +import java.io.UnsupportedEncodingException; import javax.ws.rs.core.MultivaluedHashMap; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.UriInfo; -import java.io.UnsupportedEncodingException; -import static org.junit.Assert.assertEquals; +import org.junit.Test; +import org.mockito.Mockito; public class ValidateEncodingTest { - - @Test - public void badPath() throws UnsupportedEncodingException { - String badPath = "/aai/v6/network/vces/vce/blahh::blach/others/other/jklfea{}"; - UriInfo mockUriInfo = getMockUriInfo(badPath, new MultivaluedHashMap()); - ValidateEncoding validator = ValidateEncoding.getInstance(); - - assertEquals(false, validator.validate(mockUriInfo)); - } - - @Test - public void goodPath() throws UnsupportedEncodingException { - String goodPath = "/aai/v6/network/vces/vce/blahh%3A%3Ablach/others/other/jklfea%7B%7D"; - UriInfo mockUriInfo = getMockUriInfo(goodPath, new MultivaluedHashMap()); - ValidateEncoding validator = ValidateEncoding.getInstance(); - - assertEquals(true, validator.validate(mockUriInfo)); - } - - @Test - public void badQueryParamsKey() throws UnsupportedEncodingException { - MultivaluedHashMap map = new MultivaluedHashMap(); - map.putSingle("blahblah", "test"); - map.putSingle("blahblah", "test2"); - map.putSingle("bad::bad", "test3"); - UriInfo mockUriInfo = getMockUriInfo("", map); - - ValidateEncoding validator = ValidateEncoding.getInstance(); - - assertEquals(false, validator.validate(mockUriInfo)); - - } - @Test - public void badQueryParamsValue() throws UnsupportedEncodingException { - MultivaluedHashMap map = new MultivaluedHashMap(); - map.putSingle("blahblah", "test"); - map.putSingle("blahblah", "test//:2"); - map.putSingle("badbad", "test3"); - UriInfo mockUriInfo = getMockUriInfo("", map); - - ValidateEncoding validator = ValidateEncoding.getInstance(); - - assertEquals(false, validator.validate(mockUriInfo)); - } - - @Test - public void goodQueryParams() throws UnsupportedEncodingException { - MultivaluedHashMap map = new MultivaluedHashMap(); - map.putSingle("blahblah", "test"); - map.putSingle("blahblah", "test2"); - map.putSingle("badbad", "~test%2F%2F%3A3"); - UriInfo mockUriInfo = getMockUriInfo("", map); - - ValidateEncoding validator = ValidateEncoding.getInstance(); - - assertEquals(true, validator.validate(mockUriInfo)); - } - - @Test - public void testWhenQueryParameterHasPlusSignItShouldPass() throws UnsupportedEncodingException { - - MultivaluedHashMap map = new MultivaluedHashMap(); - map.putSingle("some-key", "test+one+two+three"); - UriInfo mockUriInfo = getMockUriInfo("", map); - - ValidateEncoding validator = ValidateEncoding.getInstance(); - - assertEquals(true, validator.validate(mockUriInfo)); - } - - private UriInfo getMockUriInfo(String path, MultivaluedMap map) { - UriInfo mockUriInfo = Mockito.mock(UriInfo.class); - Mockito.when(mockUriInfo.getPath(false)).thenReturn(path); - Mockito.when(mockUriInfo.getQueryParameters(false)).thenReturn(map); - - return mockUriInfo; - } - + @Test + public void badPath() throws UnsupportedEncodingException { + String badPath = "/aai/v6/network/vces/vce/blahh::blach/others/other/jklfea{}"; + UriInfo mockUriInfo = getMockUriInfo(badPath, new MultivaluedHashMap()); + ValidateEncoding validator = ValidateEncoding.getInstance(); + + assertEquals(false, validator.validate(mockUriInfo)); + } + + @Test + public void goodPath() throws UnsupportedEncodingException { + String goodPath = "/aai/v6/network/vces/vce/blahh%3A%3Ablach/others/other/jklfea%7B%7D"; + UriInfo mockUriInfo = getMockUriInfo(goodPath, new MultivaluedHashMap()); + ValidateEncoding validator = ValidateEncoding.getInstance(); + + assertEquals(true, validator.validate(mockUriInfo)); + } + + @Test + public void badQueryParamsKey() throws UnsupportedEncodingException { + MultivaluedHashMap map = new MultivaluedHashMap(); + map.putSingle("blahblah", "test"); + map.putSingle("blahblah", "test2"); + map.putSingle("bad::bad", "test3"); + UriInfo mockUriInfo = getMockUriInfo("", map); + + ValidateEncoding validator = ValidateEncoding.getInstance(); + + assertEquals(false, validator.validate(mockUriInfo)); + + } + + @Test + public void badQueryParamsValue() throws UnsupportedEncodingException { + MultivaluedHashMap map = new MultivaluedHashMap(); + map.putSingle("blahblah", "test"); + map.putSingle("blahblah", "test//:2"); + map.putSingle("badbad", "test3"); + UriInfo mockUriInfo = getMockUriInfo("", map); + + ValidateEncoding validator = ValidateEncoding.getInstance(); + + assertEquals(false, validator.validate(mockUriInfo)); + } + + @Test + public void goodQueryParams() throws UnsupportedEncodingException { + MultivaluedHashMap map = new MultivaluedHashMap(); + map.putSingle("blahblah", "test"); + map.putSingle("blahblah", "test2"); + map.putSingle("badbad", "~test%2F%2F%3A3"); + UriInfo mockUriInfo = getMockUriInfo("", map); + + ValidateEncoding validator = ValidateEncoding.getInstance(); + + assertEquals(true, validator.validate(mockUriInfo)); + } + + @Test + public void testWhenQueryParameterHasPlusSignItShouldPass() throws UnsupportedEncodingException { + + MultivaluedHashMap map = new MultivaluedHashMap(); + map.putSingle("some-key", "test+one+two+three"); + UriInfo mockUriInfo = getMockUriInfo("", map); + + ValidateEncoding validator = ValidateEncoding.getInstance(); + + assertEquals(true, validator.validate(mockUriInfo)); + } + + private UriInfo getMockUriInfo(String path, MultivaluedMap map) { + UriInfo mockUriInfo = Mockito.mock(UriInfo.class); + Mockito.when(mockUriInfo.getPath(false)).thenReturn(path); + Mockito.when(mockUriInfo.getQueryParameters(false)).thenReturn(map); + + return mockUriInfo; + } + } -- cgit 1.2.3-korg